在内存中查看时,我经常遇到类似于\??\C:\Windows的路径。我一直无法理解为什么将双'?'附加到某些路径。我的google-fu使我无法找到双'?'的原因。我们将不胜感激。

#1 楼

从Windows Internals,第1部分(第6版)开始-


与名称空间管理相关的所有对象管理器功能都知道实例目录并
参与提供幻觉
,所有会话都使用相同的名称空间。 Windows子系统DLL
由Windows应用程序传递的前缀名称,这些名称引用了\ DosDevices中带有\ ?? (例如,C:\ Windows变为\ ?? \ C:\ Windows)。
当对象管理器看到特殊的\ ??时。前缀,它执行的步骤取决于Windows的版本,但始终依赖于执行过程对象(EPROCESS,在第5章中进一步介绍)中名为DeviceMap的
字段。指向同一会话中其他进程共享的数据结构。

DeviceMap结构的DosDevicesDirectory字段指向表示该进程本地的
对象管理器目录。
\ DosDevices。当对象管理器看到对\ ??的引用时,它会使用DeviceMap的
DosDevicesDirectory字段来定位进程的本地\ DosDevices。如果对象管理器
在该目录中找不到该对象,它将检查目录对象的DeviceMap
字段。如果有效,它将在DeviceMap结构的GlobalDosDevicesDirectory字段指向的目录中查找对象


评论


-1这不能回答问题,也不应该被接受。 OP询问的是\ ??`,而不是\\?`

– Alec Wenzowski
18年1月13日在1:03

你是绝对正确的。我无法删除答案,因为它已被标记为接受,但我对其进行了编辑以反映正确的答案。

–詹森·格夫纳(Jason Geffner)
18年1月13日在19:02

#2 楼

我一直在寻找这个问题的答案,并且我知道这个问题已经存在多年了,但是如果有人碰到这个问题,我会在这里留下我的答复。

上面的答案是指非规范化的设备路径,当您询问\??\而不是\?\时,问题可能只有很小的不同,但答案却完全不同。

\??是“假”前缀,指的是按用户的Dos设备,因此,此图可以帮助您了解该过程是什么:了解:


\ Device-内核驱动程序设备对象的默认位置
\ GLOBAL ?? -到包含驱动器号的设备的符号链接的系统位置
\ BaseNamedObjects-命名资源的系统位置
\ Sessions \ X-登录会话的目录X
\ Session \ 0 \ DosDevices-
每个登录用户的“ Dos设备”目录。


评论


这应该被接受为正确答案

–杰姆·塔克(Jem Tucker)
17年9月14日在8:26