-
-
[旧帖] 过滤驱动为什么要单独处理Pnp和Power请求? 0.00雪花
-
发表于: 2008-8-12 10:13 2911
-
摘自Walter Oney《Programming the Microsoft Windows Diver Model》第一版第9章
NTSTATUS DispatchPnp(PDEVICE_OBJECT fido, PIRP Irp)
{
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fido->DeviceExtension;
NTSTATUS status = IoAcquireRemoveLock(&pdx->RemoveLock, Irp);
if (!NT_SUCCESS(status))
return CompleteRequest(Irp, status, 0);
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
ULONG fcn = stack->MinorFunction;
IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(pdx->LowerDeviceObject, Irp);
if (fcn == IRP_MN_REMOVE_DEVICE)
{
IoReleaseRemoveLockAndWait(&pdx->RemoveLock, Irp);
IoDetachDevice(pdx->LowerDeviceObject);
IoDeleteDevice(fido); }
else
IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
return status;
}
//上个例程中蓝色部分是关键所在吧,但下面这个例程我就不知道它的必要性了,
它不就是向下传递了IRP吗?
NTSTATUS DispatchPower(PDEVICE_OBJECT fido, PIRP Irp)
{
PoStartNextPowerIrp(Irp);
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fido->DeviceExtension;
NTSTATUS status = IoAcquireRemoveLock(&pdx->RemoveLock, Irp);
if (!NT_SUCCESS(status))
return CompleteRequest(Irp, status, 0);
IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(pdx->LowerDeviceObject, Irp);
IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
return status;
}
是不是为了防止在设备消失后而继续有IRP到来导致系统崩溃呢?不过微软的技术文章上写了:
http://www.microsoft.com/china/whdc/Driver/tips/remlock.mspx
......
如果驱动程序在其删除设备处理完成之后,但是 I/O 管理器删除设备对象之前接收到另一个 I/O 请求,那么就会发生问题。当驱动程序处理请求时,它可能试图从设备扩展取消对一个无效指针的引用,这会导致系统崩溃。
要防止这种问题,驱动程序应该为所有类型的 I/O 请求获取删除锁,而不仅仅是即插即用和电源请求。
.......
看来Walter Oney 做的也不是十分完善啊
NTSTATUS DispatchPnp(PDEVICE_OBJECT fido, PIRP Irp)
{
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fido->DeviceExtension;
NTSTATUS status = IoAcquireRemoveLock(&pdx->RemoveLock, Irp);
if (!NT_SUCCESS(status))
return CompleteRequest(Irp, status, 0);
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
ULONG fcn = stack->MinorFunction;
IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(pdx->LowerDeviceObject, Irp);
if (fcn == IRP_MN_REMOVE_DEVICE)
{
IoReleaseRemoveLockAndWait(&pdx->RemoveLock, Irp);
IoDetachDevice(pdx->LowerDeviceObject);
IoDeleteDevice(fido); }
else
IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
return status;
}
//上个例程中蓝色部分是关键所在吧,但下面这个例程我就不知道它的必要性了,
它不就是向下传递了IRP吗?
NTSTATUS DispatchPower(PDEVICE_OBJECT fido, PIRP Irp)
{
PoStartNextPowerIrp(Irp);
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fido->DeviceExtension;
NTSTATUS status = IoAcquireRemoveLock(&pdx->RemoveLock, Irp);
if (!NT_SUCCESS(status))
return CompleteRequest(Irp, status, 0);
IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(pdx->LowerDeviceObject, Irp);
IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
return status;
}
是不是为了防止在设备消失后而继续有IRP到来导致系统崩溃呢?不过微软的技术文章上写了:
http://www.microsoft.com/china/whdc/Driver/tips/remlock.mspx
......
如果驱动程序在其删除设备处理完成之后,但是 I/O 管理器删除设备对象之前接收到另一个 I/O 请求,那么就会发生问题。当驱动程序处理请求时,它可能试图从设备扩展取消对一个无效指针的引用,这会导致系统崩溃。
要防止这种问题,驱动程序应该为所有类型的 I/O 请求获取删除锁,而不仅仅是即插即用和电源请求。
.......
看来Walter Oney 做的也不是十分完善啊
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
- [求助]杀毒软件影响程序启动速度如何克服? 4832
- [求助]获得SSDT中函数的地址 4591
- [求助]导出SSDT的问题 3372
- [求助]菜鸟问破解 3576
看原图
赞赏
雪币:
留言: