作者:陆麟
转载请征得作者同意.
1999.11.14
NT下,所有的可访问的设备都以DOS设备名的方式存在.当需要访问时,我们以打开文件的方式打开一个设备.例如C:,D:...他们的名字有对象管理器管理.所有的DOS设备名在对象管理器管理的名字空间\??\下.当然,对象管理器所管理的对象并不仅仅受限于该目录.但是对于WIN32,WIN16,DOS的RING3应用程序可访问的所有设备名都集中到了该目录.
我们通常最最常用的DOS设备莫过于C:,D:,LPT1...但是,通常情况下我们还有更多的可访问设备.但是我们有时并不意识到它的存在.NT提供了一个很重要的API,提供了查询DOS设备名的便利.就是QueryDosDevice()函数.该函数的原型我们可以从MSDN查到
DWORD QueryDosDevice(
LPCTSTR lpDeviceName, // pointer to MS-DOS device name string
LPTSTR lpTargetPath, // pointer to buffer for storing
query results
DWORD ucchMax
// maximum storage capacity of buffer
);
当第一参数为NULL时,它返回所有的DOS设备名.第二参数为接收设备名的缓冲区.第三参数则是缓冲区大小.当第一参数为一DOS设备名时,他在第二参数中返回对象管理器中仅对EXCUTIVE层有用的WIN32设备名.这样我们就能了解到,一个DOS设备到底是由哪个WIN32设备管理,或者说,该DOS设备名是哪个WIN32设备的符号联接.
今天,我写了个小工具.用来显示所有的这些信息. NTDEVLST.EXE
,有兴趣的朋友请点击下载.该工具没有检测当前运行环境.在9X下使用会出错.