「MDLが同じプロセスリストに2回挿入されている」原因は何ですか?

StackOverflow https://stackoverflow.com/questions/3558650

質問

NDISプロトコルとMiniportドライバーを開発しています。ドライバーが使用され、システムが冬眠している場合、次のエラーでバグチェック(ブルースクリーン)が表示されます。

LOCKED_PAGES_TRACKER_CORRUPTION (d9)
Arguments:
Arg1: 00000001, The MDL is being inserted twice on the same process list.
Arg2: 875da420, Address of internal lock tracking structure.
Arg3: 87785728, Address of memory descriptor list.
Arg4: 00000013, Number of pages locked for the current process.

スタックトレースは、ドライバーがリストに表示されないため、特に役に立ちません。

nt!RtlpBreakWithStatusInstruction
nt!KiBugCheckDebugBreak+0x19
nt!KeBugCheck2+0x574
nt!KeBugCheckEx+0x1b
nt!MiAddMdlTracker+0xd8
nt!MmProbeAndLockPages+0x629
nt!NtWriteFile+0x55c
nt!KiFastCallEntry+0xfc
ntdll!KiFastSystemCallRet
ntdll!ZwWriteFile+0xc
kernel32!WriteFile+0xa9

このMDLエラーを引き起こす可能性のある問題の種類は何ですか?

役に立ちましたか?

解決

問題は、IRP_MJ_WRITEハンドラーのこのコードに関連していたことがわかりました。

/* If not in D0 state, don't attempt transmits */
if (ndisProtocolOpenContext && 
    ndisProtocolOpenContext->powerState > NetDeviceStateD0)
{
   DEBUG_PRINT(("NPD: system in sleep mode, so no TX\n"));
   return STATUS_UNSUCCESSFUL;
}

これは、IRPを完全に完了していなかったことを意味し、NDISは結果として面白いことをしている可能性が高いことを意味しました。 IOCompleTereQuestへの呼び出しの追加により、問題が修正されました。

/* If not in D0 state, don't attempt transmits */
if (ndisProtocolOpenContext && 
    ndisProtocolOpenContext->powerState > NetDeviceStateD0)
{
   DEBUG_PRINT(("NPD: system in sleep mode, so no TX\n"));
   pIrp->IoStatus.Status = STATUS_UNSUCCESSFUL;
   IoCompleteRequest(pIrp, IO_NO_INCREMENT);
   return STATUS_UNSUCCESSFUL;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top