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 不完全退出,驱动就还在。明白这一点,再来看,它的读肯定是要有完成例程的,完全例程的返回是不确定的,所以要等到所有完全例程执行完之后,才能去卸载掉驱动,不然会产生崩溃。