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