sinking
驱动牛犊
驱动牛犊
  • 注册日期2003-08-18
  • 最后登录2006-02-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1158回复:6

奇怪的问题,求助!

楼主#
更多 发布于:2004-04-21 17:30
我的驱动,以前直接用IoGetDeviceObjectPointer()取得底层设备的pDeviceObject使用,没有问题。
现在根据需要,我在另一驱动中用IoGetDeviceObjectPointer()取得底层设备的pDeviceObject指针,然后创建IRP_MJ_DEVICE_CONTROL的IRP, 将其放在UserBuffer中,传给我的驱动处理。
在我的驱动中处理IRP_MJ_DEVICE_CONTROL的代码段中,我得到了正确的pDeviceObject,并且使用正常。于是,我将这个指针储存在DeviceExtension中。可是,在后面使用这个指针时,只要一调用就死机。问题可能出在哪里啊,请大侠指教。

下面是我驱动的简单流程:

驱动1:

//取得底层设备的DeviceObject指针
status = IoGetDeviceObjectPointer(
                  dicn->SymbolicLinkName,
       FILE_ALL_ACCESS,
       &pFile,
       &(pDeviceExtension->Key));
if(!NT_SUCCESS(status))
{
        return status;
}
ObDereferenceObject(pFile);

//创建IRP
KeInitializeEvent(&kevent, SynchronizationEvent, false);
pIrp = IoBuildDeviceIoControlRequest(
                   IOCTL_CARD_INSERT,
                   pDeviceExtension->CardReader,
                   NULL, 0, NULL, 0, false,
                   &kevent, &IoStatus);
if(pIrp == NULL)
{
      return STATUS_INSUFFICIENT_RESOURCES;
}

//将底层设备的DeviceObject指针放入UserBuffer,传给另一驱动
pIrp->UserBuffer = pDeviceExtension->Key;
status = IoCallDriver(
               pDeviceExtension->CardReader, pIrp);

if (status == STATUS_PENDING)
{
        KeWaitForSingleObject(
                       &kevent, Executive,
                       KernelMode, FALSE, NULL );
        status = IoStatus.Status;
}


驱动2:

NTSTATUS VdDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp)
{

       case IOCTL_CARD_INSERT:
        {
            //将底层设备的DeviceObject指针保存
              到DeviceExtension中
            pDeviceExtension->NextStackDevice
                    =(PDEVICE_OBJECT)(pIrp->UserBuffer);
           此处我检查了用pDeviceExtension->NextStackDevice
           创建IRP,发给底层设备,返回正常
        }
}

//驱动另一函数,需要用IRP与底层通信
NTSTATUS
WD_SendtoLower(IN PDEVICE_OBJECT DeviceObject, IN OUT BYTE *rwbuf, IN OUT BYTE *outbuf, IN OUT PULONG len, IN OUT PULONG lenr)
{
       此中只要一出现pDeviceExtension->NextStackDevice,
       便会死机
}

tanky
驱动牛犊
驱动牛犊
  • 注册日期2002-03-04
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-10 17:51
IoGetDeviceObjectPointer得到的是设备栈顶端的设备,意思就是你用IoCallDriver发出的IRP是从设备栈顶进去的,你在另一个驱动用这个指针的时候,哪个驱动是不是也位于同一个设备栈中,如果是这样,那么就是相当于自己给自己发IRP,可能会死机.
答对了记得给分呀。
sinking
驱动牛犊
驱动牛犊
  • 注册日期2003-08-18
  • 最后登录2006-02-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-10 15:44
没办法,没人帮我啊! :cool:
dregs
驱动小牛
驱动小牛
  • 注册日期2004-02-19
  • 最后登录2006-05-10
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-09 10:46
sinking 好强 ,自言自语,自己解决问题。^_^
还是我
sinking
驱动牛犊
驱动牛犊
  • 注册日期2003-08-18
  • 最后登录2006-02-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-04-22 17:49
太奇怪了,把这个指针存放到ReaderExtension中就可以用了!
sinking
驱动牛犊
驱动牛犊
  • 注册日期2003-08-18
  • 最后登录2006-02-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-04-22 15:47
自己顶一下,哪位大侠指点一下。
sinking
驱动牛犊
驱动牛犊
  • 注册日期2003-08-18
  • 最后登录2006-02-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-04-21 17:32
我在VdDeviceControl()中用ObReferenceObjectByPointer()增加了对pDeviceExtension->NextStackDevice的引用,仍然死机。
请大侠指教,急!
游客

返回顶部