PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);
switch (irpStack->MinorFunction) {
case IRP_MN_REMOVE_DEVICE:
case IRP_MN_START_DEVICE:
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
if (irpStack->MinorFunction == IRP_MN_START_DEVICE) {
DbgPrint("XXX");
}
...
}
試問, 當 MinorFunction 為 IRP_MN_REMOVE_DEVICE 時, 在 DbgView 中會看到 "XXX" 嗎?
答案為"否"....那就錯了. 這段 code 看起來很簡單, 但是你不會知道的是, IoCompleteRequest 之後,原本 Irp->MinorFunc 被清成 0 了, 恰好 IRP_MN_START_DEVICE 的值也是 0, "XXX" 所在的那段 code 也就在 IRP_MN_REMOVE_DEVICE 被執行了.
沒有留言:
張貼留言