首页
论坛
专栏
课程

[系统底层] [求助]寒江独钓第四章键盘驱动卸载后蓝屏

2017-2-3 15:50 1672

[系统底层] [求助]寒江独钓第四章键盘驱动卸载后蓝屏

2017-2-3 15:50
1672
寒江独钓这本书第4章讲的是键盘的过滤,我跟着书上面写得代码, 然后跟踪调试, 发现在驱动卸载函数return了之后, 马上就蓝屏了。

这个驱动的功能是绑定kbdclass驱动的所有设备, 然后为所有的IRP_MJ_READ请求设置一个完成函数并使gC2pKeyCount变量++, 然后交给下层驱动处理, 处理完毕之后, 把从键盘扫描到的字符打印出来, 然后gC2pKeyCount --。

驱动卸载函数如下:

void DriverUnload(PDRIVER_OBJECT pDriverObject){
       
        __debugbreak();
       
        PDEVICE_OBJECT pDeviceObject;
        PDEVICE_OBJECT oldDeviceObject;
        PC2P_DEV_EXT pC2pDevExt;
       
        LARGE_INTEGER lDelay;
        PRKTHREAD CurrentThread;
        lDelay = RtlConvertLongToLargeInteger(100 * DELAY_ONE_MILLISECOND);
       
        CurrentThread = KeGetCurrentThread();
        KeSetPriorityThread(CurrentThread, LOW_REALTIME_PRIORITY);

        UNREFERENCED_PARAMETER(pDriverObject);
        KdPrint(("Driver is unlaoding......"));

        pDeviceObject = pDriverObject->DeviceObject;
        while (pDeviceObject)
        {
                //c2pDetach(pDeviceObject);
                pC2pDevExt = (PC2P_DEV_EXT)pDeviceObject->DeviceExtension;
                IoDetachDevice(pC2pDevExt->pTargetDeviceObject);
                IoDeleteDevice(pDeviceObject);
                pC2pDevExt->pFilterDeviceObject = NULL;
                pC2pDevExt->pTargetDeviceObject = NULL;
                pDeviceObject = pDeviceObject->NextDevice;
        }

        ASSERT(NULL == pDriverObject->DeviceObject);
        while (gC2pKeyCount/*全局变量, 用来记录有多少个请求到来。每到来一个请求就++, 每结束一个请求就--*/)
        {
                KeDelayExecutionThread(KernelMode, FALSE, &lDelay);
        }
        KdPrint(("Driver unload OK!"));
        return;
//在return了之后, 很快就蓝屏了
}

[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最新回复 (0)
游客
登录 | 注册 方可回帖
返回