2011年7月1日 星期五

MinorFunction Changed After IoCompleteRequest()

最近在寫 driver 時, 遇到一個未曾注意過的問題. 我們先來看看以下的 code.

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  被執行了.

沒有留言:

張貼留言