|
阅读:2273回复:4
求教:plx9054驱动一卸载后板卡就死掉。
我是一个驱动新手,写了一个9054驱动,但是现在一卸载驱动板子就会死掉。就是卸载掉我写的驱动后,用WinDriver读bar0和bar2的寄存器都是0xffffffff。
通过dbgview查看,卸载的时候有三个irp:IRP_MN_QUERY_DEVICE_RELATIONS、IRP_MN_QUERY_REMOVE_DEVICE和IRP_MN_REMOVE_DEVICE。前两个我都是默认处理,主要的卸载操作都是在第三个irp中做的。 目前我的驱动里没加dma功能,只是读写寄存器,和中断事件。 不知道有人遇到过如此问题吗?请不啬赐教。能提供点思路也不胜感激。 代码如下: VOID StopDevice(IN PDEVICE_EXTENSION pdx)
{
//DEVICE_EXTENSION *pdx;
//pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
//if(!pdx->GotResource)
// return
pdx->bStopping = TRUE;
KeResetEvent(&pdx->StoppingEvent);
UnlockDevice(pdx); //have to double unlock device
UnlockDevice(pdx);
KeWaitForSingleObject(&pdx->StoppingEvent, Executive, KernelMode, FALSE, NULL);
KdPrint(("all pending I/O completed\n"));
pdx->bStopping = FALSE;
//pdx->GotResource = FALSE;
KdPrint(("device is being stopped...\n"));
//free all interrupt resource after all IRP have been released
if(pdx->pInterruptObject != NULL)
{
KeSynchronizeExecution(pdx->pInterruptObject, (PKSYNCHRONIZE_ROUTINE)DisablePciInterrupt, (PVOID)pdx);
IoDisconnectInterrupt(pdx->pInterruptObject);
pdx->pInterruptObject = NULL;
KdPrint(("disconnected interrupt resource\n"));
}
// Free all the mem map
if(pdx->MemBar0)
{
MmUnmapIoSpace(pdx->MemBar0, pdx->nMem0);
pdx->MemBar0 = NULL;
pdx->nMem0 = 0;
KdPrint(("Free bar0\n"));
}
if(pdx->MemBar2)
{
MmUnmapIoSpace(pdx->MemBar2, pdx->nMem2);
pdx->MemBar2 = NULL;
pdx->nMem2 = 0;
KdPrint(("Free bar2\n"));
}
//Free DMA Common Buffer here
//Bump usage count back up again
LockDevice(pdx);
LockDevice(pdx);
KdPrint(("device have been stopped.\n"));
}
#pragma PAGEDCODE
NTSTATUS PnpRemoveDeviceHandler(PDEVICE_EXTENSION pdx, PIRP Irp)
{
PAGED_CODE();
KdPrint(("Enter PnpRemoveDeviceHandler\n"));
StopDevice(pdx);
Irp->IoStatus.Status = STATUS_SUCCESS;
// let lower-level drivers handle this request & ignore the result
NTSTATUS status = PnpDefaultHandler(pdx, Irp);
IoSetDeviceInterfaceState(&pdx->interfaceName, FALSE);
RtlFreeUnicodeString(&pdx->interfaceName);
// detach device from the device object stack
if (pdx->pNextStackDevice)
IoDetachDevice(pdx->pNextStackDevice);
//delete the functional device object
IoDeleteDevice(pdx->fdo);
//delete interrupt resource
/*if(pdx->pInterruptObject != NULL)
{
IoDisconnectInterrupt(pdx->pInterruptObject);
}*/
KdPrint(("Leave PnpRemoveDeviceHandler\n"));
return status;
} |
|
|
沙发#
发布于:2010-09-29 16:04
自己顶一下。
|
|
|
板凳#
发布于:2010-12-01 14:53
自己再顶。
|
|
|
地板#
发布于:2010-12-03 15:57
你死机的意思是蓝屏,还是系统hang住?
------------------------------------------------------------------ 张帆的驱动开发论坛 http://bbs.kerneldev.com/ 张帆的驱动开发QQ群1# 49944346(满) 张帆的驱动开发QQ群2# 64778681(目前开放中...) |
|
|
|
地下室#
发布于:2010-12-09 18:05
是屏幕卡死了,并没有蓝屏的情况吗?
|
|