NtSystemDebugControl

NTSTATUS __stdcall NtSystemDebugControl(
        _SYSDBG_COMMAND Command,
        VOID *InputBuffer,
        UINT64 InputBufferLength,
        VOID *OutputBuffer,
        UINT64 OutputBufferLength,
        UINT64 *ReturnLength){
  __int64 v7; 
  char PreviousMode; 
  int v12; 
  __int64 v13; 
  NTSTATUS v14; 
  __int32 v15; 
  __int32 v16; 
  __int32 v17; 
  __int32 v18; 
  __int32 v19; 
  __int32 v20; 
  __int32 v21; 
  unsigned __int64 v22; 
  unsigned int v23; 
  unsigned int v24; 
  size_t v25; 
  VOID **PoolWithTag; 
  __int32 v27; 
  __int32 v28; 
  __int32 v29; 
  char v30; 
  size_t BufferUsed[2]; 
  VOID **Size_4; 
  VOID *LockedBuffer; 
  VOID *LockVariable; 
  _SYSDBG_TRIAGE_DUMP TriageDumpRequest[4]; 
  __int128 v36; 
  __int128 v37; 
  VOID *Buffer; 
  _SYSDBG_LIVEDUMP_CONTROL SysLivedumpControl[30]; 

  v7 = (unsigned int)InputBufferLength;
  LODWORD(Size_4) = OutputBufferLength;
  BufferUsed[0] = 0;
  *(_OWORD *)TriageDumpRequest = 0i64;
  v36 = 0i64;
  v37 = 0i64;
  Buffer = 0i64;
  memset(SysLivedumpControl, 0i64, 0x40u);
  LockedBuffer = 0i64;
  LockVariable = 0i64;
  if( KdPitchDebugger && !KdLocalDebugEnabled && ((Command - 29) & 0xFFFFFFF7) != 0 )
    return -1073740972;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  v30 = PreviousMode;
  if( Command != (SysDbgClearUmAttachPid|SysDbgSetTracepoint)
    && !SeSinglePrivilegeCheck(*(_QWORD *)&SeDebugPrivilege, PreviousMode) )
  {
    return -1073741790;
  }
  v12 = 0;
  if( PreviousMode )
  {
    if( (_DWORD)v7 )
    {
      if( ((unsigned __int8)InputBuffer & 3) != 0 )
        ExRaiseDatatypeMisalignment();
      v13 = 0x7FFFFFFF0000i64;
      if( (unsigned __int64)InputBuffer + v7 > 0x7FFFFFFF0000i64 || (char *)InputBuffer + v7 < InputBuffer )
        MEMORY[0x7FFFFFFF0000] = 0;
    }
    else
    {
      v13 = 0x7FFFFFFF0000i64;
    }
    if( (_DWORD)OutputBufferLength )
      ProbeForWrite((UINT64)OutputBuffer, (unsigned int)OutputBufferLength, 4i64);
    if( ReturnLength )
    {
      if( (unsigned __int64)ReturnLength < 0x7FFFFFFF0000i64 )
        v13 = (__int64)ReturnLength;
      *(_DWORD *)v13 = *(_DWORD *)v13;
    }
    PreviousMode = v30;
  }
  if( Command > SysDbgSetKdUmExceptionEnable )
  {
    if( Command <= SysDbgClearUmBreakPid )
    {
      if( Command == SysDbgClearUmBreakPid )
        goto LABEL_64;
      v18 = Command - 29;
      if( !v18 )
      {
        if( (_DWORD)v7 == 56 && (unsigned int)OutputBufferLength >= 0x40000 )
        {
          *(_OWORD *)TriageDumpRequest = *(_OWORD *)InputBuffer;
          v36 = *((_OWORD *)InputBuffer + 1);
          v37 = *((_OWORD *)InputBuffer + 2);
          Buffer = (VOID *)*((_QWORD *)InputBuffer + 6);
          if( DWORD2(v37) || !HIDWORD(v37) || (TriageDumpRequest[0] & 0xFFFFFFFE) != 0 )
            return -1073741811;
          v22 = 8i64 * HIDWORD(v37);
          v23 = -1;
          if( v22 <= 0xFFFFFFFF )
            v23 = 8 * HIDWORD(v37);
          if( v22 > 0xFFFFFFFF )
            return -1073741811;
          v24 = 0x100000;
          if( (unsigned int)OutputBufferLength <= 0x100000 )
            v24 = (unsigned int)Size_4;
          v25 = v24;
          PoolWithTag = ExAllocatePoolWithTag(0x200ui64, v24, 1884181323i64);
          Size_4 = PoolWithTag;
          if( PoolWithTag )
          {
            v12 = ExLockUserBuffer(Buffer, v23, PreviousMode, IoReadAccess, &LockedBuffer, &LockVariable);
            if( v12 >= 0 )
            {
              memset(PoolWithTag, 0i64, v25);
              Buffer = LockedBuffer;
              v12 = DbgkCaptureLiveDump(TriageDumpRequest, PoolWithTag, v25, BufferUsed);
              if( v12 >= 0 )
              {
                if( BufferUsed[0] <= (unsigned int)OutputBufferLength )
                  memmove(OutputBuffer, PoolWithTag, BufferUsed[0]);
                else
                  v12 = -1073741823;
              }
              ExFreePoolWithTag(PoolWithTag, 0);
              ExUnlockUserBuffer(LockVariable);
            }
            else
            {
              ExFreePoolWithTag(PoolWithTag, 0);
            }
          }
          else
          {
            v12 = -1073741801;
          }
          goto LABEL_107;
        }
        return -1073741820;
      }
      v19 = v18 - 1;
      if( !v19 )
      {
        if( (_DWORD)OutputBufferLength == 1 )
        {
          *(_BYTE *)OutputBuffer = KdBlockEnable;
          goto LABEL_107;
        }
        return -1073741820;
      }
      v20 = v19 - 1;
      if( !v20 )
      {
        if( (_DWORD)v7 == 1 )
        {
          KdBlockEnable = *(_BYTE *)InputBuffer;
          goto LABEL_107;
        }
        return -1073741820;
      }
      v21 = v20 - 1;
      if( !v21 )
      {
        KdUmBreakMarker = -618808389;
        goto LABEL_106;
      }
      if( v21 != 1 )
        goto LABEL_97;
      if( (_DWORD)OutputBufferLength != 4 )
        return -1073741820;
      *(_DWORD *)OutputBuffer = KdUmBreakPid;
      if( KdResetUmBreakPid )
LABEL_64:
        KdUmBreakPid = 0;
LABEL_106:
      v12 = 0;
      goto LABEL_107;
    }
    v27 = Command - 35;
    if( v27 )
    {
      v28 = v27 - 1;
      if( v28 )
      {
        v29 = v28 - 1;
        if( v29 )
        {
          if( v29 != 1 )
            goto LABEL_97;
          if( (_DWORD)v7 != 16 || (_DWORD)OutputBufferLength )
            return -1073741820;
          v14 = ExpKdPullRemoteFileForUser(InputBuffer);
        }
        else
        {
          if( (_DWORD)v7 != 64 || (_DWORD)OutputBufferLength )
            return -1073741820;
          *(_OWORD *)SysLivedumpControl = *(_OWORD *)InputBuffer;
          *(_OWORD *)&SysLivedumpControl[4] = *((_OWORD *)InputBuffer + 1);
          *(_OWORD *)&SysLivedumpControl[8] = *((_OWORD *)InputBuffer + 2);
          *(_OWORD *)&SysLivedumpControl[12] = *((_OWORD *)InputBuffer + 3);
          v14 = DbgkCaptureLiveKernelDump(SysLivedumpControl);
        }
        goto LABEL_34;
      }
    }
    else
    {
      if( (_DWORD)OutputBufferLength != 4 )
        return -1073741820;
      *(_DWORD *)OutputBuffer = KdUmAttachPid;
      if( !KdResetUmAttachPid )
        goto LABEL_106;
    }
    KdUmAttachPid = 0;
    goto LABEL_106;
  }
  if( Command == SysDbgSetKdUmExceptionEnable )
  {
    if( (_DWORD)v7 == 1 )
    {
      KdIgnoreUmExceptions = *(_BYTE *)InputBuffer == 0;
      goto LABEL_107;
    }
    return -1073741820;
  }
  if( Command > SysDbgGetAutoKdEnable )
  {
    v15 = Command - 24;
    if( !v15 )
    {
      if( (_DWORD)v7 == 1 )
      {
        KdAutoEnableOnEvent = *(_BYTE *)InputBuffer != 0;
        goto LABEL_107;
      }
      return -1073741820;
    }
    v16 = v15 - 1;
    if( !v16 )
    {
      if( (_DWORD)OutputBufferLength == 4 )
      {
        *(_DWORD *)OutputBuffer = KdPrintBufferSize;
        goto LABEL_107;
      }
      return -1073741820;
    }
    v17 = v16 - 1;
    if( v17 )
    {
      if( v17 != 1 )
        goto LABEL_97;
      if( (_DWORD)OutputBufferLength == 1 )
      {
        *(_BYTE *)OutputBuffer = KdIgnoreUmExceptions == 0;
        goto LABEL_107;
      }
      return -1073741820;
    }
    if( (_DWORD)v7 != 4 )
      return -1073741820;
    BufferUsed[1] = 0;
    v14 = KdSetDbgPrintBufferSize(*(unsigned int *)InputBuffer);
LABEL_34:
    v12 = v14;
    goto LABEL_107;
  }
  if( Command == SysDbgGetAutoKdEnable )
  {
    if( (_DWORD)OutputBufferLength == 1 )
    {
      *(_BYTE *)OutputBuffer = KdAutoEnableOnEvent;
      goto LABEL_107;
    }
    return -1073741820;
  }
  if( Command < SysDbgQueryModuleInformation )
  {
LABEL_97:
    v12 = -1073741821;
    goto LABEL_107;
  }
  if( Command <= SysDbgQuerySpecialCalls )
    return -1073741822;
  if( Command != SysDbgBreakPoint )
  {
    if( Command > SysDbgCheckLowMemory )
    {
      if( Command == SysDbgEnableKernelDebugger )
        v14 = KdEnableDebugger();
      else
        v14 = KdDisableDebugger();
      goto LABEL_34;
    }
    return -1073741822;
  }
  if( (_BYTE)KdDebuggerEnabled == 1 )
    DbgBreakPointWithStatus(6u);
  else
    v12 = -1073741823;
LABEL_107:
  if( ReturnLength )
    *(_DWORD *)ReturnLength = BufferUsed[0];
  return v12;
}

Referenced by:

No references.