当前位置: 代码迷 >> 驱动开发 >> 键盘过滤驱动卸载时,系统蓝屏解决方法
  详细解决方案

键盘过滤驱动卸载时,系统蓝屏解决方法

热度:77   发布时间:2016-04-28 10:14:54.0
键盘过滤驱动卸载时,系统蓝屏
本帖最后由 leftbackfielder 于 2013-10-21 11:04:06 编辑
由于不可重现,所以,暂时还没有拿到DUMP文件.
下面是卸载的代码,麻烦大神帮着看一下.
我找了好久,也没有发现哪块有问题.
PS: 卸载的时候,都会调用哪些个函数?IRP_MJ_POWER这个例程只是关机的时候,才会被调用吗/


VOID ClearPendingIrp(IN PDRIVER_OBJECT pDrvObj,IN BOOLEAN cancel)
{
PDEVICE_OBJECT pDevObj = pDrvObj->DeviceObject;
PDEVICE_EXTENSION pDevExt = NULL;
while (pDevObj)
{
pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;

if (pDevExt->et == et_normal)
{
if (cancel && pDevExt->pIrp)
{
BOOLEAN bCancel = IoCancelIrp(pDevExt->pIrp);
#ifdef DBG
KdPrint(("IoCancelIrp Result:%d\n",bCancel));
#endif
}
pDevExt->pIrp = NULL;
}

pDevObj = pDevObj->NextDevice;
}
}

VOID DetachDevices(IN PDEVICE_OBJECT pDevObj)
{
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
__try
{
__try
{
if (pDevExt->et == et_filter)
{
PFILTER_DEVICE_EXTENSION pFilterExt = (PFILTER_DEVICE_EXTENSION)pDevExt;
IoDetachDevice(pFilterExt->pTargetDeviceObject);
if (pFilterExt->pIrp)
{
IoCancelIrp(pFilterExt->pIrp);
}
}
else if (pDevExt->et == et_normal)
{
if (pDevExt->pData)
{
ReleaseRecorder(pDevExt->pData);
}
}
else if (pDevExt->et == et_none)
{
PFILTER_DEVICE_EXTENSION pFilterExt = (PFILTER_DEVICE_EXTENSION)pDevExt;
IoDetachDevice(pFilterExt->pTargetDeviceObject);
}

IoDeleteDevice(pDevObj);
}
__except(EXCEPTION_EXECUTE_HANDLER){}
}
__finally{}
}

VOID DriverUnload(IN PDRIVER_OBJECT pDrvObj)
{
PDEVICE_OBJECT pDevObj = NULL;
PDEVICE_OBJECT pNextDevObj = NULL;
UNICODE_STRING ustrSymName = {0};

RtlInitUnicodeString(&ustrSymName,DOS_DEVICE_NAME_W);
IoDeleteSymbolicLink(&ustrSymName);

UNREFERENCED_PARAMETER(pDrvObj);
KdPrint(("Driver Unloading...\n"));

ClearPendingIrp(pDrvObj,TRUE);

KdPrint(("DriverUnload: ClearPendingIrp.\n"));

pDevObj = pDrvObj->DeviceObject;

KdPrint(("DriverUnload: Begin DetachDevices.\n"));

while (pDevObj)
{
pNextDevObj = pDevObj->NextDevice;
DetachDevices(pDevObj);
pDevObj = pNextDevObj;
}


KdPrint(("DriverUnload: End DetachDevices.\n"));

ASSERT(!pDrvObj->DeviceObject);

KdPrint(("Driver Unloaded.\n"));
}

...........


------解决方案--------------------
多加一个计数器来判断最后是否还有未结束的IRP请求
  相关解决方案