首页
社区
课程
招聘
[求助]驱动卸载的问题,请指点:
发表于: 2011-4-28 11:28 6369

[求助]驱动卸载的问题,请指点:

2011-4-28 11:28
6369
在一个驱动中,我明明设置了:
DriverObject->DriverUnload=Ctrl2capUnload;

可是运行后,在DriverMonitor点stop卸载,却提示:
Error 1052:The driver is not in a state to accept this command

为何没有对应派遣函数?我明明设置了啊。。

这个驱动一直卸载不了,还请各位指点一下。谢谢

摘录一段代码:
VOID Ctrl2capUnload(  IN PDRIVER_OBJECT Driver );

NTSTATUS DriverEntry(
    IN PDRIVER_OBJECT  DriverObject,
    IN PUNICODE_STRING RegistryPath
    )
{
....
DriverObject->DriverUnload=Ctrl2capUnload;
....
}

VOID Ctrl2capUnload(IN PDRIVER_OBJECT pdoGlobalDrvObj)
{
        KTIMER              kTimer;   
    LARGE_INTEGER       timeout;
    PDEVICE_OBJECT pDevObj;
        PDEVICE_EXTENSION   pdx;
        UNICODE_STRING ntUnicodString;
    UNICODE_STRING pLinkName;
        PRKTHREAD CurrentThread;  

        DbgPrint(("Drive Unload!\n"));   //根本没有执行到这,为什么派遣函数对应不起来?
         
    pDevObj = pdoGlobalDrvObj->DeviceObject;   
    pdx = (PDEVICE_EXTENSION) pDevObj->DeviceExtension;   

    //当前线程设置为低实时模式  
        CurrentThread = KeGetCurrentThread();  
    KeSetPriorityThread(CurrentThread,LOW_REALTIME_PRIORITY);  
    UNREFERENCED_PARAMETER(pdoGlobalDrvObj);  

        pLinkName =pdx->ustrSymLinkName;
        IoDeleteSymbolicLink(&pLinkName);  //获取并删除符号链接

      
   
   IoDetachDevice ( pdx->TopOfStack);  //TopOfStack存放下层设备,解除绑定
     
   

        timeout = RtlConvertLongToLargeInteger(-10*1000);

        while(num)                                                         
        {
            KeDelayExecutionThread(KernelMode, FALSE, &timeout);         //让当前工作线程睡眠直到超时
            KeWaitForSingleObject(aThread, Executive, KernelMode, FALSE, NULL); //等待线程结束
        }

    Ter = TRUE;                                                          //线程结束标记
    KeReleaseSemaphore(&sem, 0, 1, FALSE);                              //释放信号灯  

  
    //
// 如果还有 IRP 未完成,且当前 IRP 有效则尝试取消这个 IRP
//
if (pdx->IrpsInProgress > 0 && pDevObj->CurrentIrp != NULL )
{
   if ( CancelKeyboardIrp( pDevObj->CurrentIrp ) )
   {
     //
     // 成功则直接退出删除键盘过滤设备
     //
     DbgPrint(( "CancelKeyboardIrp() is ok\n" ));
     goto __End;
   }
}

//
// 如果取消失败,则一直等待按键
//
while ( pdx->IrpsInProgress > 0 )
{
   DbgPrint(( "Irp Count:%d\n", pdx->IrpsInProgress ));
}
   
         __End:
   IoDeleteDevice( pDevObj);

   ZwClose(hfile);
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 40
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
提示是这意思?
2011-5-6 09:51
0
雪    币: 227
活跃值: (86)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
请大虾们指点下?卸载就是不成功.就是不会显示卸载成功..是哪里出错吗
2011-7-10 19:04
0
雪    币: 40
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
是不是有些操作还没有完成?你这个是键盘驱动吧? 要不按个键试试?
2011-7-13 17:06
0
游客
登录 | 注册 方可回帖
返回
//