20楼#
发布于:2002-06-17 12:38
哦,明白,我重开一贴,你来领分吧。
|
|
21楼#
发布于:2005-08-03 15:32
老兄.
如何在驱动程序的入口中增加该函数 VOID CancelIrpRoutine( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); 比如DriverObject->MajorFunction[IRP_MJ_WRITE] = BulkUsb_DispatchReadWrite;之类的东西.我的驱动是用XP DDK里的BULK_USB改的,应用程序调用CancelIo()时,驱动程序没有任何反应,当然ReadFile()就一直阻塞了,线程无法终止.相信是没有在驱动程序中增加相应的CancelIo()入口吧. |
|
22楼#
发布于:2005-08-03 16:03
我查WDM.H的所有入口
// // Define the major function codes for IRPs. // #define IRP_MJ_CREATE 0x00 #define IRP_MJ_CREATE_NAMED_PIPE 0x01 #define IRP_MJ_CLOSE 0x02 #define IRP_MJ_READ 0x03 #define IRP_MJ_WRITE 0x04 #define IRP_MJ_QUERY_INFORMATION 0x05 #define IRP_MJ_SET_INFORMATION 0x06 #define IRP_MJ_QUERY_EA 0x07 #define IRP_MJ_SET_EA 0x08 #define IRP_MJ_FLUSH_BUFFERS 0x09 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b #define IRP_MJ_DIRECTORY_CONTROL 0x0c #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d #define IRP_MJ_DEVICE_CONTROL 0x0e #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f #define IRP_MJ_SHUTDOWN 0x10 #define IRP_MJ_LOCK_CONTROL 0x11 #define IRP_MJ_CLEANUP 0x12 #define IRP_MJ_CREATE_MAILSLOT 0x13 #define IRP_MJ_QUERY_SECURITY 0x14 #define IRP_MJ_SET_SECURITY 0x15 #define IRP_MJ_POWER 0x16 #define IRP_MJ_SYSTEM_CONTROL 0x17 #define IRP_MJ_DEVICE_CHANGE 0x18 #define IRP_MJ_QUERY_QUOTA 0x19 #define IRP_MJ_SET_QUOTA 0x1a #define IRP_MJ_PNP 0x1b #define IRP_MJ_PNP_POWER IRP_MJ_PNP // Obsolete.... #define IRP_MJ_MAXIMUM_FUNCTION 0x1b 以及PDRIVER_EXTENSION 和 PDRIVER_OBJECT都没有发现该入口可加入. |
|
23楼#
发布于:2005-08-03 16:25
不知道何原因?按照15楼的方法就是可以正常退出,驱动程序不改变.
|
|
24楼#
发布于:2005-08-04 09:54
下面是引用tianrongcai于2005-08-03 16:25发表的: 可能是你的irp已经交给下层处理,下层返回pending的,你取消irp的时候,取消irp也由下层处理, 所以你的驱动程序就不用改变了阿 |
|
25楼#
发布于:2005-08-04 10:43
谢谢.
不错,ReadFile()传给下层IoCallDriver()后.是返回STATUS_PENDING. 另外.我想取消pending的IRP可以用DeviceIoControl(),在驱动程序中.增加相应的代码.取消所有暂停的IRP.是否可行自己打了个问寒问号?因为DeviceIoControl()是对控制端点操作的.(我自己试的是这样,不知道别人的如何?) |
|
26楼#
发布于:2005-08-05 15:55
调用if(!ReadFile(m_hEP1Read,buf,*len,&mByte,&m_OvRead1)) status = GetLastError();的确是返回了.但是status = 998,MSDN解释是ERROR_NOACCESS 998 Invalid access to memory location. 访问的内存位置无效.使用if(!ReadFile(m_hEP1Read,buf,*len,&mByteNULL)) status = GetLastError();时,XP DDK SP1的bulkusb无论是异步还是同步,嵌入式系统都无反应,而且桌面的图标也被自动隐藏.但NT DDK的bulkusb在同步时是用反应的,并且桌面的图标也不会自动隐藏,异步时同XP.版主能不能解释为何.
|
|
上一页
下一页