阅读:2176回复:18
关于WRITE IRP的问题
我写了一个WDM驱动:
但是WRITE IRP到达我驱动并处理后以STATUS_SUCCESS返回,但是不能返回到我应用程序继续执行。 其中我的WRITE IRP只做了简单处理: pSL = IoGetCurrentIrpStackLocation(Irp); Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = pSL->Parameters.Write.Length; IoCompleteRequest(Irp,IO_NO_INCREMENT); return Irp->IoStatus.Status; 驱动执行完了以后,却不能返回到我的应用程序继续执行,应用程序的主要代码为(同步写操作): char szBuffer[]=\"Jame.z Write It\"; if (WriteFile(hDevs,szBuffer,strlen(szBuffer),dwRet,NULL)) { //Next Do. - I already set break point in next line. } //Next Do. - I already set break point in next line. 而且我用过单步跟踪,的确确认程序没有继续运行,停在WriteFile上。 ----------------------------------------------------------- 请教大侠可能的原因是什么?有什么办法可以解决? :( |
|
最新喜欢:![]() |
沙发#
发布于:2002-04-06 09:19
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2002-04-06 09:29
大侠谢谢你的回答,但是我的问题并不是出现在这个长度的问题上:
1)驱动中已经收到WRITE IRP并以STATUS_SUCCESS的结果返回到I/O Manager,但是并没有返回到我的程序,结束WriteFile而继续执行我的下一条代码。 2)你说的对,这个只是字符的个数,并不包\'\\0\'。但是这个长度问题应该和我写入的操作没有什么影响,我在驱动里边是把内容丢掉的。 --------------------------------------------------------- 请大侠再给小弟看看,问题到底是什么?谢了:) |
|
地板#
发布于:2002-04-06 10:00
用户被禁言,该主题自动屏蔽! |
|
地下室#
发布于:2002-04-06 10:07
好的 ~ 我先试试 ~~ 先谢谢了~
|
|
5楼#
发布于:2002-04-06 10:27
我试过了问题依然:
1)驱动没有进行修改,和第一贴一样。 2)应用程序代码修改为: char ch = \'J\'; if (WriteFile(hDevs,&ch,1,&dwRet,NULL)) { //Do Next - Set Break Point At Next Line. } //Do Next - Set Break Point At Next Line. -------------------------------------------------- 程序依然在WriteFile函数上停住,没有继续执行下一条指令。 |
|
6楼#
发布于:2002-04-06 10:46
你在CreateFile中有没有带FILE_FLAG_OVERLAPPED标志?如果带了,一定要设置WriteFile的OVERLAPPED参数。
|
|
|
7楼#
发布于:2002-04-06 10:47
用户被禁言,该主题自动屏蔽! |
|
8楼#
发布于:2002-04-06 10:51
用户被禁言,该主题自动屏蔽! |
|
9楼#
发布于:2002-04-06 11:56
很可惜,我没有带FILE_FLAG_OVERLAPPED标志,代码为:
HANDLE hDev = CreateFile(\"\\\\\\\\.\\\\MyDrv1\",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL); if (hDev = INVALID_HANDLE_VALUE) { //Print Error Message And Exit; return 1; } 我前两天也试过用OVERLAPPED结构的,代码为: HANDLE hDev = CreateFile (\"\\\\\\\\.\\\\MyDrv1\",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL); if (hDev = INVALID_HANDLE_VALUE) { printf(\"E - Create Device Fail.\\n\"); getch(); return 1; } OVERLAPPED OL; memset(&OL,0,sizeof(OVERLAPPED)); OL.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); char szBuf[MAX_PATH]; sprintf(szBuf,\"Jame Write It\"); if (WriteFile(hDev,szBuf,strlen(szBuf),&dwRet,&OL)) { printf(\"*Write Success(%d).\\n\",dwRet); } else { if (GetLastError() == ERROR_IO_PENDING) { if (GetOverlappedResult(hDev,&OL,&dwRet,TRUE) { printf(\"Write Success(%d).\\n\",dwRet); } else { printf(\"Write Fail.\\n\"); } } else { printf(\"*Write Fail.\\n\"); } } ..... 结果在GetOverlappedResult函数上停住,不继续执行下一条指令,效果一样。 |
|
10楼#
发布于:2002-04-06 12:00
修正:
用OVERLAPPED结构的时候的CreateFile应该为: if (hDev = CreateFile(\"\\\\\\\\.\\\\MyDrv1\",GERNERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL)) ..... |
|
11楼#
发布于:2002-04-06 12:15
是的,这个问题很怪,好象是给IO Manager卡住,没有返回给应用程序是的,但是一般我的IRP用STATUS_SUCCESS并且用IoCompleteRequesst完成时,都能返回到调用相应API的地方,继续执行下一条指令,我也写过很多驱动,然而这个问题,我还是第一次遇到,我想应该还有可能是上层过滤安装的完成例程没有把IRP返回给IO Manager。
----------------------------------------------------------- 头痛的问题。:( |
|
12楼#
发布于:2002-04-06 13:05
如果是有多层驱动的要调用IoCallDriver,还有其他的IRP stack 相关的堆栈处理函数!
|
|
|
13楼#
发布于:2002-04-06 13:08
我的读写是由我处理的,并不需要向下传,你的意思能说清楚一点吗?
|
|
14楼#
发布于:2002-04-06 15:14
你把驱动程序的初始化函数贴出来看看吧!
再有就是要杀杀毒 |
|
15楼#
发布于:2002-04-06 16:07
为什么说初始化函数有问题?在win2k上试过正常,难道初始函数在2000和98上有什么重要区别?
|
|
16楼#
发布于:2002-04-06 16:16
我写了一个WDM驱动: 你的应用程序应该没有问题,但你的驱动程序有一处有错误。 在你的WRITE DISPATCH里,既然你已经把IRP标记为完成,则IO管理器认为它可以释放IRP了,而且它确实是这么去做,所以你返回Irp.IoStatus.Status当然会出错了。 改为如下试试: return STATUS_SUCCESS; return Irp.IoStatus.Status 是错的,因为这时IRP已经被释放了。 |
|
|
17楼#
发布于:2002-04-07 00:45
这位大侠说对了!
小弟实在愚昧,没怎么见过这么写的: return Irp.IoStatus.Status; [编辑 - 4/7/02 作者: TonyHuyan] |
|
|
18楼#
发布于:2002-04-08 08:26
很可惜,改成:return STATUS_SUCCESS;还是老样子~~
|
|