MS文档补充:IoGetDeviceObjectPointer
作者:陆麟
转载请征得作者同意.
2001.5.28
IoGetDeviceObjectPointer(
IN PUNICODE_STRING ObjectName,
IN ACCESS_MASK DesiredAccess,
OUT PFILE_OBJECT *FileObject,
OUT PDEVICE_OBJECT *DeviceObject
);
在NT4和WIN2000下返回值不同. 编程时千万注意.
本人在编程中发现居然IoGetDeviceObjectPointer的返回值:DeviceObject,在NT4下和在WIN2000下不同.
奇怪啊奇怪. 微软在文档里说得比较模糊.
该返回值是一个指向一个具名的逻辑的,虚拟的或者无论设备DEVICE OBJECT指针.
从实际返回值看. 在NT4下,DeviceObject是一个顶层的设备对象指针.
如果对象被FILE SYSTEM挂接过, 返回值是FILE SYSTEM的设备指针. 如果没有被挂接过,
那就是一个物理设备指针.
在WIN2000下, DeviceObject返回的也是一个顶层的设备对象指针, 无论是否被FILE
SYSTEM挂接过,返回值永远是顶层物理设备的指针.
这点很重要. FILE SYSTEM挂接是IO管理器负责识别的逻辑挂接, 不同于过滤器挂接.
过滤器将目标对象所有IRP都处理掉. 而逻辑挂接本身并不是过滤器挂接, 不是所有的IRP都被逻辑挂接的设备处理,
而且, 逻辑挂接的设备所处理的IRP有时根本和物理设备处理的IRP不同. 这一切,
都由IO管理器掌控. IO管理器会识别各种类型的设备应该处理什么样的IRP.
现在, 那些依赖于IoGetDeviceObjectPointer的代码应该要慎重检查了, 如果有必要的话,
要重新写过.
今天就到此为止.