KdLogDbgPrint
VOID __stdcall KdLogDbgPrint(_STRING *String){
unsigned __int8 CurrentIrql;
unsigned int v3;
unsigned int Length;
bool v5;
__int64 v6;
signed __int64 v7;
unsigned __int64 v8;
char *v9;
char *Buffer;
size_t v11;
char *v12;
unsigned int v13;
UINT64 Flags;
UINT64 Flagsa;
UINT64 ActualSize;
LODWORD(ActualSize) = 0;
if( (struct _KPRCB *)qword_140CF9C88 == KeGetCurrentPrcb() )
{
_InterlockedIncrement(&KdPrintSkippedCount);
return;
}
_InterlockedIncrement((_DWORD *)&KdpPrintSpinLock + 1);
while( (_DWORD)KdpPrintSpinLock )
_mm_pause();
CurrentIrql = KeGetCurrentIrql();
__writecr8((unsigned int)(KdpPrintSpinLock + 15));
if( KdPrintCircularBuffer )
{
v3 = (unsigned int)KdPrintBufferSize >> 3;
if( (unsigned int)KdPrintBufferSize >> 3 > 0x200 )
v3 = 512;
Length = String->Length;
v5 = Length <= v3;
if( Length > v3 )
{
_InterlockedIncrement((_DWORD *)&KiSwapEvent + 1154);
v5 = Length <= v3;
}
if( v5 )
v3 = Length;
v6 = v3;
v7 = _InterlockedCompareExchange64((volatile signed __int64 *)&KdPrintWritePointer, 0i64, 0i64);
do
{
v8 = v6 + v7 - (unsigned int)KdPrintBufferSize;
v9 = (char *)v7;
if( v6 + v7 < (unsigned __int64)KdPrintCircularBuffer + (unsigned int)KdPrintBufferSize )
v8 = v6 + v7;
v7 = _InterlockedCompareExchange64((volatile signed __int64 *)&KdPrintWritePointer, v8, v7);
}
while( (char *)v7 != v9 );
if( v8 < (unsigned __int64)v9 )
_InterlockedIncrement((_DWORD *)&KiSwapEvent + 1152);
Buffer = String->Buffer;
LODWORD(Flags) = 4;
if( &v9[v6] > (char *)KdPrintCircularBuffer + (unsigned int)KdPrintBufferSize )
{
v13 = KdPrintBufferSize + (_DWORD)KdPrintCircularBuffer - (_DWORD)v9;
KdpCopyMemoryChunks((UINT64)Buffer, v9, v13, 0i64, Flags, &ActualSize);
if( (unsigned int)ActualSize < v13 )
memset(&v9[(unsigned int)ActualSize], 0i64, v13 - ActualSize);
v11 = v6 - v13;
if( (_DWORD)ActualSize != v13 )
{
v12 = (char *)KdPrintCircularBuffer;
goto LABEL_28;
}
LODWORD(Flagsa) = 4;
KdpCopyMemoryChunks((UINT64)&String->Buffer[v13], KdPrintCircularBuffer, v11, 0i64, Flagsa, &ActualSize);
if( (unsigned int)ActualSize < v11 )
{
v11 -= ActualSize;
v12 = (char *)KdPrintCircularBuffer + (unsigned int)ActualSize;
goto LABEL_28;
}
}
else
{
KdpCopyMemoryChunks((UINT64)Buffer, v9, (unsigned int)v6, 0i64, Flags, &ActualSize);
if( (unsigned int)ActualSize < (unsigned int)v6 )
{
v11 = v6 - ActualSize;
v12 = &v9[(unsigned int)ActualSize];
LABEL_28:
memset(v12, 0i64, v11);
}
}
}
_InterlockedAdd((_DWORD *)&KdpPrintSpinLock + 1, 0xFFFFFFFF);
__writecr8(CurrentIrql);
}Referenced by:
KdpPrint
KdpPrompt