jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2176回复:18

关于WRITE IRP的问题

楼主#
更多 发布于:2002-04-06 08:44
我写了一个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上。
-----------------------------------------------------------
请教大侠可能的原因是什么?有什么办法可以解决? :(

最新喜欢:

flyfoxflyfox
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-04-06 09:19
用户被禁言,该主题自动屏蔽!
jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-06 09:29
大侠谢谢你的回答,但是我的问题并不是出现在这个长度的问题上:

1)驱动中已经收到WRITE IRP并以STATUS_SUCCESS的结果返回到I/O Manager,但是并没有返回到我的程序,结束WriteFile而继续执行我的下一条代码。
2)你说的对,这个只是字符的个数,并不包\'\\0\'。但是这个长度问题应该和我写入的操作没有什么影响,我在驱动里边是把内容丢掉的。

---------------------------------------------------------
请大侠再给小弟看看,问题到底是什么?谢了:)
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-04-06 10:00
用户被禁言,该主题自动屏蔽!
jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-06 10:07
好的 ~ 我先试试 ~~ 先谢谢了~
jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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函数上停住,没有继续执行下一条指令。  
  
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-04-06 10:46
你在CreateFile中有没有带FILE_FLAG_OVERLAPPED标志?如果带了,一定要设置WriteFile的OVERLAPPED参数。
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2002-04-06 10:47
用户被禁言,该主题自动屏蔽!
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2002-04-06 10:51
用户被禁言,该主题自动屏蔽!
jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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函数上停住,不继续执行下一条指令,效果一样。
jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-04-06 12:00
修正:
用OVERLAPPED结构的时候的CreateFile应该为:
if (hDev = CreateFile(\"\\\\\\\\.\\\\MyDrv1\",GERNERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL))
.....
jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-04-06 12:15
是的,这个问题很怪,好象是给IO Manager卡住,没有返回给应用程序是的,但是一般我的IRP用STATUS_SUCCESS并且用IoCompleteRequesst完成时,都能返回到调用相应API的地方,继续执行下一条指令,我也写过很多驱动,然而这个问题,我还是第一次遇到,我想应该还有可能是上层过滤安装的完成例程没有把IRP返回给IO Manager。
-----------------------------------------------------------
头痛的问题。:(
jansen
驱动小牛
驱动小牛
  • 注册日期2001-10-21
  • 最后登录2007-10-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-04-06 13:05
如果是有多层驱动的要调用IoCallDriver,还有其他的IRP stack 相关的堆栈处理函数!
rich
jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-04-06 13:08
我的读写是由我处理的,并不需要向下传,你的意思能说清楚一点吗?
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-04-06 15:14
你把驱动程序的初始化函数贴出来看看吧!
再有就是要杀杀毒
jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-04-06 16:07
为什么说初始化函数有问题?在win2k上试过正常,难道初始函数在2000和98上有什么重要区别?
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-04-06 16:16
我写了一个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上。
-----------------------------------------------------------
请教大侠可能的原因是什么?有什么办法可以解决? :(


    你的应用程序应该没有问题,但你的驱动程序有一处有错误。
在你的WRITE DISPATCH里,既然你已经把IRP标记为完成,则IO管理器认为它可以释放IRP了,而且它确实是这么去做,所以你返回Irp.IoStatus.Status当然会出错了。
    改为如下试试:
    return   STATUS_SUCCESS;
   return Irp.IoStatus.Status 是错的,因为这时IRP已经被释放了。
Tom_lyd
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-04-07 00:45
这位大侠说对了!
小弟实在愚昧,没怎么见过这么写的:
return Irp.IoStatus.Status;

[编辑 -  4/7/02 作者: TonyHuyan]
写驱动不如买足彩!!
jame.z
驱动牛犊
驱动牛犊
  • 注册日期2001-08-07
  • 最后登录2004-05-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-04-08 08:26
很可惜,改成:return STATUS_SUCCESS;还是老样子~~
游客

返回顶部