这两天写驱动程序时遇到设备对象打不开的问题,在检查代码无误、WinObj可以找到设备的情况下无法打开设备,最后发现是AddDevice写的有问题。
调用 IoCreateDevice 创建设备对象时,I/O 管理器在 DEVICE_OBJECT 结构的 Flags 字段中设置 DO_DEVICE_INITIALIZING,防止其它组件在驱动程序完成初始化设备对象之前向设备发送 I/O。
除DriverEntry 之外的任何例程中创建的设备对象,需要自行清除 DO_DEVICE_INITIALIZING。
只要在创建完设备对象之后清除掉DO_DEVICE_INITIALIZING标记,应用层就可以顺利打开该设备对象。
deviceObject->Flags &= ~DO_DEVICE_INITIALIZING;