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 被執行了.
沒有留言:
張貼留言