jukebox
驱动牛犊
驱动牛犊
  • 注册日期2001-08-25
  • 最后登录2002-03-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1855回复:6

核心态与用户态通讯时的问题......  

楼主#
更多 发布于:2001-12-29 10:33
我在passthru上修改了一些,用irp使应用程序与之通讯.
写了
   DriverObject->DriverUnload = DriverUnload;
   MajorFunction[IRP_MJ_CREATE] = testCreate;
   MajorFunction[IRP_MJ_READ] =  testRead;
   MajorFunction[IRP_MJ_WRITE] = testWrite;
   MajorFunction[IRP_MJ_CLOSE] = testClose;
应用程序与之通讯正常.但我修改了驱动代码后,重编译,安装,发现应用程序返回的结果还是旧版本驱动的结果.
甚至不安装驱动,应用程序也能访问成功,只有重启系统后,访问的结果才正常.
我想是不是我哪里没有清除干净,是不是DriverUnload没有被调用?  怎么调用?
谢谢!

最新喜欢:

flyfoxflyfox
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2001-12-29 14:47
我在passthru上修改了一些,用irp使应用程序与之通讯.
写了
   DriverObject->DriverUnload = DriverUnload;
   MajorFunction[IRP_MJ_CREATE] = testCreate;
   MajorFunction[IRP_MJ_READ] =  testRead;
   MajorFunction[IRP_MJ_WRITE] = testWrite;
   MajorFunction[IRP_MJ_CLOSE] = testClose;
应用程序与之通讯正常.但我修改了驱动代码后,重编译,安装,发现应用程序返回的结果还是旧版本驱动的结果.
甚至不安装驱动,应用程序也能访问成功,只有重启系统后,访问的结果才正常.
我想是不是我哪里没有清除干净,是不是DriverUnload没有被调用?  怎么调用?
谢谢!  


是的,的确没有被调用,但是其实应该是protocol_unload,
不过现在已经没有关系了,这是w2k的bug,这两个unload
都不会被调用的。
不再回忆从前,我已经生活在幸福当中。
jukebox
驱动牛犊
驱动牛犊
  • 注册日期2001-08-25
  • 最后登录2002-03-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-12-29 16:53
怎么清除创建的device呢?

我把unload的代码放到close里,到IoDeleteDevice(pDriverObject->DeviceObject)这一步时会出错

有什么解决方案么?
jukebox
驱动牛犊
驱动牛犊
  • 注册日期2001-08-25
  • 最后登录2002-03-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-12-30 17:06
pNextObj = pDriverObject->DeviceObject;
if (pNextObj != NULL)
{
   pDevExt = (PDEVICE_EXTENSION) pNextObj->DeviceExtension;
   if (pDevExt->deviceBuffer != NULL)
   {
      ExFreePool(pDevExt->deviceBuffer);
      pDevExt->deviceBuffer = NULL;
      pDevExt->deviceBufferSize = 0;
   }
   pLinkName =pDevExt->ustrSymLinkName;
   IoDeleteSymbolicLink(&pLinkName);
   pLinkName = pDevExt->ustrDeviceName;
   IoDeleteSymbolicLink(&pLinkName);
   if (pDriverObject->DeviceObject != NULL)
   {
      if (DBG)
          DbgPrint(\"pDriverObject->DeviceObject !=NULL \\n\");

      IoDeleteDevice(pDriverObject->DeviceObject);
      pDriverObject->DeviceObject = NULL;
   }
   else
       if (DBG)
           DbgPrint(\"pDriverObject->DeviceObject == NULL \\n\");

}

我改了一下,结果cloes访问没问题了,发现DeviceObject == NULL,怎么已经被卸掉了?
卸载驱动时,在unbindAdapter时兰屏了......


还有,可以把链表从应用程序传到驱动么?
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
地下室#
发布于:2002-01-01 15:30
pNextObj = pDriverObject->DeviceObject;
if (pNextObj != NULL)
{
   pDevExt = (PDEVICE_EXTENSION) pNextObj->DeviceExtension;
   if (pDevExt->deviceBuffer != NULL)
   {
      ExFreePool(pDevExt->deviceBuffer);
      pDevExt->deviceBuffer = NULL;
      pDevExt->deviceBufferSize = 0;
   }
   pLinkName =pDevExt->ustrSymLinkName;
   IoDeleteSymbolicLink(&pLinkName);
   pLinkName = pDevExt->ustrDeviceName;
   IoDeleteSymbolicLink(&pLinkName);
   if (pDriverObject->DeviceObject != NULL)
   {
      if (DBG)
          DbgPrint(\"pDriverObject->DeviceObject !=NULL \\n\");

      IoDeleteDevice(pDriverObject->DeviceObject);
      pDriverObject->DeviceObject = NULL;
   }
   else
       if (DBG)
           DbgPrint(\"pDriverObject->DeviceObject == NULL \\n\");

}

我改了一下,结果cloes访问没问题了,发现DeviceObject == NULL,怎么已经被卸掉了?
卸载驱动时,在unbindAdapter时兰屏了......


还有,可以把链表从应用程序传到驱动么?  


close?那是closehandle的时候驱动程序调用的,你不应该
在这里删除deviceobject.

从应用层要传一个内存指针给核心层?
一般不行。除非你直接通过nativeapi操作
物理内存。
不再回忆从前,我已经生活在幸福当中。
jukebox
驱动牛犊
驱动牛犊
  • 注册日期2001-08-25
  • 最后登录2002-03-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-01-02 17:49

close?那是closehandle的时候驱动程序调用的,你不应该
在这里删除deviceobject.

从应用层要传一个内存指针给核心层?
一般不行。除非你直接通过nativeapi操作
物理内存。


那么应该在哪里删除deviceobject呢? unload不行,close也不行.

我想从应用层的一个链表结构中读取数据,在核心层要用的这些数据,应该怎么做啊?

谢谢!

[编辑 -  1/2/02 作者: jukebox]
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2002-01-03 11:55
[quote]
close?那是closehandle的时候驱动程序调用的,你不应该
在这里删除deviceobject.

从应用层要传一个内存指针给核心层?
一般不行。除非你直接通过nativeapi操作
物理内存。


那么应该在哪里删除deviceobject呢? unload不行,close也不行.

我想从应用层的一个链表结构中读取数据,在核心层要用的这些数据,应该怎么做啊?

谢谢!

[编辑 -  1/2/02 作者: jukebox] [/quote]

我不知道什么才是最好的删除时机,你自己看着办吧:-)。

你要把应用层的链表传给核心层,你必须把链表所指向的
内存的实际值拷贝到一块缓冲区然后devioctl。或者多次
devioctl,每次传一个链表块。
也许有更好的方法,但是因为我很长时间不看驱动程序的
书了,记不得如果用mdl方式系统是否会把内存交换到
驱动程序也能访问的地方这样的细节了。你自己可以查
查看,做个实验。
最近我不太关心驱动程序的某些实现细节,我被那些协议
细节搞晕了头。
不再回忆从前,我已经生活在幸福当中。
游客

返回顶部