VOID NTAPI InbvAcquireLock(VOID) { KIRQL OldIrql; /* Check if we're at dispatch level or lower */ OldIrql = KeGetCurrentIrql(); if (OldIrql <= DISPATCH_LEVEL) { /* Loop until the lock is free */ while (!KeTestSpinLock(&BootDriverLock)); /* Raise IRQL to dispatch level */ KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); } /* Acquire the lock */ KiAcquireSpinLock(&BootDriverLock); InbvOldIrql = OldIrql; }
VOID KdLogDbgPrint( IN PSTRING String ) { KIRQL OldIrql; ULONG Length; ULONG LengthCopied; for (; ;) { if (KeTestSpinLock (&KdpPrintSpinLock)) { KeRaiseIrql (HIGH_LEVEL, &OldIrql); if (KiTryToAcquireSpinLock(&KdpPrintSpinLock)) { break; // got the lock } KeLowerIrql(OldIrql); } } if (KdPrintCircularBuffer) { Length = String->Length; // // truncate ridiculous strings // if (Length > KDPRINTBUFFERSIZE) { Length = KDPRINTBUFFERSIZE; } if (KdPrintWritePointer + Length <= KdPrintCircularBuffer+KDPRINTBUFFERSIZE) { LengthCopied = KdpMoveMemory(KdPrintWritePointer, String->Buffer, Length); KdPrintWritePointer += LengthCopied; if (KdPrintWritePointer >= KdPrintCircularBuffer+KDPRINTBUFFERSIZE) { KdPrintWritePointer = KdPrintCircularBuffer; KdPrintRolloverCount++; } } else { ULONG First = (ULONG)(KdPrintCircularBuffer + KDPRINTBUFFERSIZE - KdPrintWritePointer); LengthCopied = KdpMoveMemory(KdPrintWritePointer, String->Buffer, First); if (LengthCopied == First) { LengthCopied += KdpMoveMemory(KdPrintCircularBuffer, String->Buffer + First, Length - First); } if (LengthCopied > First) { KdPrintWritePointer = KdPrintCircularBuffer + LengthCopied - First; KdPrintRolloverCount++; } else { KdPrintWritePointer += LengthCopied; if (KdPrintWritePointer >= KdPrintCircularBuffer+KDPRINTBUFFERSIZE) { KdPrintWritePointer = KdPrintCircularBuffer; KdPrintRolloverCount++; } } } } KiReleaseSpinLock(&KdpPrintSpinLock); KeLowerIrql(OldIrql); }