2010-08-24 9 views
0

Nous développons un protocole NDIS et un pilote de miniport. Lorsque le conducteur est en cours d'utilisation et le système hiberne nous obtenons un chèque de bug (écran bleu) avec l'erreur suivante:Ce qui pourrait causer "Le MDL est inséré deux fois sur la même liste de processus"?

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. 

La trace de la pile n'est pas particulièrement utile que notre chauffeur ne figure pas dans la liste:

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 

Quels types de problèmes pourraient provenir de cette erreur MDL?

+0

Vous avez probablement corrompu le pool de mémoire du noyau. –

Répondre

1

Il se trouve le problème était lié à ce code dans notre gestionnaire 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; 
} 

Cela signifie que nous ne terminons complètement le PRI et NDIS faisait probablement quelque chose de drôle en conséquence. L'ajout d'un appel à IoCompleteRequest a résolu le problème.

/* 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; 
} 
Questions connexes