当前位置: 代码迷 >> 驱动开发 >> 这是寒江独钓的一个键盘过滤驱动的动态卸载函数,有些不明白,请懂的人指教
  详细解决方案

这是寒江独钓的一个键盘过滤驱动的动态卸载函数,有些不明白,请懂的人指教

热度:182   发布时间:2016-04-28 10:05:10.0
这是寒江独钓的一个键盘过滤驱动的动态卸载函数,有点不明白,请懂的人指教!
VOID 
c2pUnload(IN PDRIVER_OBJECT DriverObject) 

    PDEVICE_OBJECT DeviceObject; 
    PDEVICE_OBJECT OldDeviceObject; 
    PC2P_DEV_EXT devExt; 

    LARGE_INTEGER lDelay;
    PRKTHREAD CurrentThread;
    //delay some time 
    lDelay = RtlConvertLongToLargeInteger(100 * DELAY_ONE_MILLISECOND);
    CurrentThread = KeGetCurrentThread();
    // 把当前线程设置为低实时模式,以便让它的运行尽量少影响其他程序。
    KeSetPriorityThread(CurrentThread, LOW_REALTIME_PRIORITY);

    UNREFERENCED_PARAMETER(DriverObject); 
    KdPrint(("DriverEntry unLoading...\n")); 

    // 遍历所有设备并一律解除绑定
    DeviceObject = DriverObject->DeviceObject;
    while (DeviceObject)
    {
        // 解除绑定并删除所有的设备
        c2pDetach(DeviceObject);
        DeviceObject = DeviceObject->NextDevice;
    } 
    ASSERT(NULL == DriverObject->DeviceObject);

    while (gC2pKeyCount)
    {
        KeDelayExecutionThread(KernelMode, FALSE, &lDelay);
    }
    KdPrint(("DriverEntry unLoad OK!\n")); 
    return; 





    while (DeviceObject)
    {
        // 解除绑定并删除所有的设备
        c2pDetach(DeviceObject);
        DeviceObject = DeviceObject->NextDevice;
    } 
这段代码他直接解除绑定并删除相应设备   如果有IRP正在处理  这样不会蓝屏??  

    while (gC2pKeyCount)
    {
        KeDelayExecutionThread(KernelMode, FALSE, &lDelay);
    }

而他卸载之后又在这里等待???不知道是什么意思???既然都卸载了还要等待什么东西??有毛病??





求懂的人解释!
------解决思路----------------------
第一个问题,如果有 IRP 正在运行,如果有代码要访问这个设备对象,肯定是会蓝屏的,但访问设备对象的操作都是自己代码里控制的,这两个时机都在掌握之中,所以一般情况下都不会有问题。
第二个问题,这里是卸载例程,但驱动程序还没从内存中卸载掉,只要 unload 不完全退出,驱动就还在。明白这一点,再来看,它的读肯定是要有完成例程的,完全例程的返回是不确定的,所以要等到所有完全例程执行完之后,才能去卸载掉驱动,不然会产生崩溃。
  相关解决方案