要具体问题具体分析.
1.先看你的驱动是不是是独占的,主要看
IoCreateDevice
- NTSTATUS
- IoCreateDevice(
- IN PDRIVER_OBJECT DriverObject,
- IN ULONG DeviceExtensionSize,
- IN PUNICODE_STRING DeviceName OPTIONAL,
- IN DEVICE_TYPE DeviceType,
- IN ULONG DeviceCharacteristics,
- IN BOOLEAN Exclusive,
- OUT PDEVICE_OBJECT *DeviceObject
- );
其中参数Exclusive为真,代表设备只能独占,也就是设备只能被一个进程打开,其他进程create这个设备的时候,返回句柄都是NULL
2.看你应用程序是怎么打开设备的。主要看
CreateFile
- HANDLE CreateFile(
- LPCTSTR lpFileName, // file name
- DWORD dwDesiredAccess, // access mode
- DWORD dwShareMode, // share mode
- LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD
- DWORD dwCreationDisposition, // how to create
- DWORD dwFlagsAndAttributes, // file attributes
- HANDLE hTemplateFile // handle to template file
- );
dwShareMode是否FILE_SHARE_READ
3.看你的驱动对请求的irp如何支持的
如果是串行操作,也就是用startio,或者自己将irp做队列处理。如果一个线程正在处理一个irp,那么另一个线程,会请求一个新的irp,很有可能会pending在那里
4.看你的操作是否支持overlap
overlap模式可以很好的运行异步操作,overlap里会指定一个event,当操作成功后event被set