KdSystemDebugControl

NTSTATUS __stdcall KdSystemDebugControl(
        _SYSDBG_COMMAND Command,
        VOID *InputBuffer,
        UINT64 InputBufferLength,
        VOID *OutputBuffer,
        UINT64 OutputBufferLength,
        UINT64 *ReturnLength,
        CHAR PreviousMode){
  __int32 v8; 
  __int32 v9; 
  __int32 v10; 
  __int32 v11; 
  int v12; 
  int v13; 
  unsigned int v14; 
  int v15; 
  NTSTATUS BusData; 
  unsigned int v17; 
  unsigned int v18; 
  unsigned int v19; 
  unsigned int v20; 
  unsigned int v21; 
  unsigned int v22; 
  __int32 v23; 
  __int32 v24; 
  __int32 v25; 
  __int32 v26; 
  int v27; 
  unsigned int v28; 
  unsigned int v29; 
  unsigned int v30; 
  VOID **LockedBuffer; 
  VOID **LockedBuffera; 
  VOID **LockedBufferb; 
  VOID **LockedBufferc; 
  VOID **LockVariable; 
  VOID **LockVariablea; 
  VOID **LockVariableb; 
  VOID **LockVariablec; 
  char Actual[12]; 
  VOID *v40; 
  VOID *Buffer[2]; 
  UINT64 Length; 
  UINT64 Address[2]; 
  UINT64 Processor; 
  UINT64 v45[2]; 
  _INTERFACE_TYPE InterfaceType[4]; 
  UINT64 v47[2]; 
  _BUS_DATA_TYPE BusDataType[4]; 
  UINT64 v49[2]; 
  _BUS_DATA_TYPE v50[4]; 
  UINT64 v51[2]; 
  _INTERFACE_TYPE v52[4]; 
  UINT64 v53[2]; 
  UINT64 TotalSize; 
  VOID *v55[2]; 
  UINT64 v56; 
  VOID *v57[2]; 
  UINT64 v58; 
  VOID *v59[2]; 
  UINT64 v60; 

  memset(Actual, 0, sizeof(Actual));
  v40 = 0i64;
  if( (KdpBootedNodebug || KdPitchDebugger || !(_BYTE)KdDebuggerEnabled) && !KdLocalDebugEnabled )
    return -1073741790;
  if( Command > SysDbgReadIoSpace )
  {
    v23 = Command - 15;
    if( !v23 )
    {
      if( (_DWORD)InputBufferLength != 32 )
        return -1073741820;
      *(_OWORD *)v51 = *(_OWORD *)InputBuffer;
      *(_OWORD *)v52 = *((_OWORD *)InputBuffer + 1);
      v30 = _mm_cvtsi128_si32(*(__m128i *)v52);
      if( v30 )
      {
        v15 = ExLockUserBuffer((VOID *)v51[1], v30, PreviousMode, IoReadAccess, (VOID **)&Actual[4], &v40);
        if( v15 >= 0 )
        {
          LODWORD(LockVariablec) = v30;
          BusData = KdpSysWriteIoSpace(
                      v52[1],
                      (unsigned int)v52[2],
                      (unsigned int)v52[3],
                      v51[0],
                      *(PVOID *)&Actual[4],
                      (UINT64)LockVariablec,
                      (UINT64 *)Actual);
          goto LABEL_83;
        }
        goto LABEL_84;
      }
      goto LABEL_43;
    }
    v24 = v23 - 1;
    if( !v24 )
    {
      if( (_DWORD)InputBufferLength != 16 )
        return -1073741820;
      KdpSysReadMsr(*(unsigned int *)InputBuffer, (UINT64 *)InputBuffer + 1);
      goto LABEL_83;
    }
    v25 = v24 - 1;
    if( !v25 )
    {
      if( (_DWORD)InputBufferLength != 16 )
        return -1073741820;
      BusData = KdpSysWriteMsr(*(unsigned int *)InputBuffer, (UINT64 *)InputBuffer + 1);
      goto LABEL_83;
    }
    v26 = v25 - 1;
    if( !v26 )
    {
      if( (_DWORD)InputBufferLength != 32 )
        return -1073741820;
      *(_OWORD *)v49 = *(_OWORD *)InputBuffer;
      *(_OWORD *)v50 = *((_OWORD *)InputBuffer + 1);
      v29 = _mm_cvtsi128_si32(*(__m128i *)v50);
      if( v29 )
      {
        v15 = ExLockUserBuffer((VOID *)v49[1], v29, PreviousMode, IoWriteAccess, (VOID **)&Actual[4], &v40);
        if( v15 >= 0 )
        {
          LODWORD(LockVariableb) = v29;
          BusData = KdpSysReadBusData(
                      v50[1],
                      (unsigned int)v50[2],
                      (unsigned int)v50[3],
                      LODWORD(v49[0]),
                      *(PVOID *)&Actual[4],
                      (UINT64)LockVariableb,
                      (UINT64 *)Actual);
          goto LABEL_83;
        }
        goto LABEL_84;
      }
      goto LABEL_43;
    }
    v27 = v26 - 1;
    if( !v27 )
    {
      if( (_DWORD)InputBufferLength != 32 )
        return -1073741820;
      *(_OWORD *)v47 = *(_OWORD *)InputBuffer;
      *(_OWORD *)BusDataType = *((_OWORD *)InputBuffer + 1);
      v28 = _mm_cvtsi128_si32(*(__m128i *)BusDataType);
      if( v28 )
      {
        v15 = ExLockUserBuffer((VOID *)v47[1], v28, PreviousMode, IoReadAccess, (VOID **)&Actual[4], &v40);
        if( v15 >= 0 )
        {
          LODWORD(LockVariablea) = v28;
          BusData = KdpSysWriteBusData(
                      BusDataType[1],
                      (unsigned int)BusDataType[2],
                      (unsigned int)BusDataType[3],
                      LODWORD(v47[0]),
                      *(PVOID *)&Actual[4],
                      (UINT64)LockVariablea,
                      (UINT64 *)Actual);
          goto LABEL_83;
        }
        goto LABEL_84;
      }
      goto LABEL_43;
    }
    if( v27 == 1 )
    {
      BusData = KdpSysCheckLowMemory(0i64);
      goto LABEL_83;
    }
    goto LABEL_60;
  }
  if( Command == SysDbgReadIoSpace )
  {
    if( (_DWORD)InputBufferLength != 32 )
      return -1073741820;
    *(_OWORD *)v45 = *(_OWORD *)InputBuffer;
    *(_OWORD *)InterfaceType = *((_OWORD *)InputBuffer + 1);
    v22 = _mm_cvtsi128_si32(*(__m128i *)InterfaceType);
    if( v22 )
    {
      v15 = ExLockUserBuffer((VOID *)v45[1], v22, PreviousMode, IoWriteAccess, (VOID **)&Actual[4], &v40);
      if( v15 >= 0 )
      {
        LODWORD(LockVariable) = v22;
        BusData = KdpSysReadIoSpace(
                    InterfaceType[1],
                    (unsigned int)InterfaceType[2],
                    (unsigned int)InterfaceType[3],
                    v45[0],
                    *(PVOID *)&Actual[4],
                    (UINT64)LockVariable,
                    (UINT64 *)Actual);
        goto LABEL_83;
      }
      goto LABEL_84;
    }
    goto LABEL_43;
  }
  v8 = Command - 7;
  if( !v8 )
  {
    if( (_DWORD)OutputBufferLength != 40 )
      return -1073741820;
    KdpSysGetVersion((_DBGKD_GET_VERSION64 *)OutputBuffer);
    v15 = 0;
    goto LABEL_84;
  }
  v9 = v8 - 1;
  if( !v9 )
  {
    if( (_DWORD)InputBufferLength != 24 )
      return -1073741820;
    *(_OWORD *)v59 = *(_OWORD *)InputBuffer;
    v60 = *((_QWORD *)InputBuffer + 2);
    v21 = v60;
    if( (_DWORD)v60 )
    {
      v15 = ExLockUserBuffer(v59[1], (unsigned int)v60, PreviousMode, IoWriteAccess, (VOID **)&Actual[4], &v40);
      if( v15 >= 0 )
      {
        LODWORD(LockedBufferc) = 0;
        BusData = KdpCopyMemoryChunks(
                    (UINT64)v59[0],
                    *(PVOID *)&Actual[4],
                    v21,
                    0i64,
                    (UINT64)LockedBufferc,
                    (UINT64 *)Actual);
        goto LABEL_83;
      }
      goto LABEL_84;
    }
    goto LABEL_43;
  }
  v10 = v9 - 1;
  if( !v10 )
  {
    if( (_DWORD)InputBufferLength != 24 )
      return -1073741820;
    *(_OWORD *)v57 = *(_OWORD *)InputBuffer;
    v58 = *((_QWORD *)InputBuffer + 2);
    v20 = v58;
    if( (_DWORD)v58 )
    {
      v15 = ExLockUserBuffer(v57[1], (unsigned int)v58, PreviousMode, IoReadAccess, (VOID **)&Actual[4], &v40);
      if( v15 >= 0 )
      {
        LODWORD(LockedBufferb) = 1;
        BusData = KdpCopyMemoryChunks(
                    (UINT64)v57[0],
                    *(PVOID *)&Actual[4],
                    v20,
                    0i64,
                    (UINT64)LockedBufferb,
                    (UINT64 *)Actual);
        goto LABEL_83;
      }
      goto LABEL_84;
    }
    goto LABEL_43;
  }
  v11 = v10 - 1;
  if( !v11 )
  {
    if( (_DWORD)InputBufferLength != 24 )
      return -1073741820;
    *(_OWORD *)v55 = *(_OWORD *)InputBuffer;
    v56 = *((_QWORD *)InputBuffer + 2);
    v19 = v56;
    if( (_DWORD)v56 )
    {
      v15 = ExLockUserBuffer(v55[1], (unsigned int)v56, PreviousMode, IoWriteAccess, (VOID **)&Actual[4], &v40);
      if( v15 >= 0 )
      {
        LODWORD(LockedBuffera) = 2;
        BusData = KdpCopyMemoryChunks(
                    (UINT64)v55[0],
                    *(PVOID *)&Actual[4],
                    v19,
                    0i64,
                    (UINT64)LockedBuffera,
                    (UINT64 *)Actual);
        goto LABEL_83;
      }
      goto LABEL_84;
    }
    goto LABEL_43;
  }
  v12 = v11 - 1;
  if( !v12 )
  {
    if( (_DWORD)InputBufferLength != 24 )
      return -1073741820;
    *(_OWORD *)v53 = *(_OWORD *)InputBuffer;
    TotalSize = *((_QWORD *)InputBuffer + 2);
    v18 = TotalSize;
    if( (_DWORD)TotalSize )
    {
      v15 = ExLockUserBuffer(
              (VOID *)v53[1],
              (unsigned int)TotalSize,
              PreviousMode,
              IoReadAccess,
              (VOID **)&Actual[4],
              &v40);
      if( v15 >= 0 )
      {
        LODWORD(LockedBuffer) = 3;
        BusData = KdpCopyMemoryChunks(v53[0], *(PVOID *)&Actual[4], v18, 0i64, (UINT64)LockedBuffer, (UINT64 *)Actual);
        goto LABEL_83;
      }
      goto LABEL_84;
    }
    goto LABEL_43;
  }
  v13 = v12 - 1;
  if( v13 )
  {
    if( v13 == 1 )
    {
      if( (_DWORD)InputBufferLength != 24 )
        return -1073741820;
      *(_OWORD *)Buffer = *(_OWORD *)InputBuffer;
      Length = *((_QWORD *)InputBuffer + 2);
      v14 = Length;
      if( (_DWORD)Length )
      {
        v15 = ExLockUserBuffer(Buffer[1], (unsigned int)Length, PreviousMode, IoReadAccess, (VOID **)&Actual[4], &v40);
        if( v15 >= 0 )
        {
          BusData = KdpSysWriteControlSpace(
                      HIDWORD(Length),
                      (UINT64)Buffer[0],
                      *(VOID **)&Actual[4],
                      v14,
                      (UINT64 *)Actual);
LABEL_83:
          v15 = BusData;
          goto LABEL_84;
        }
        goto LABEL_84;
      }
LABEL_43:
      v15 = -1073741819;
      goto LABEL_84;
    }
LABEL_60:
    v15 = -1073741821;
    goto LABEL_84;
  }
  if( (_DWORD)InputBufferLength != 24 )
    return -1073741820;
  *(_OWORD *)Address = *(_OWORD *)InputBuffer;
  Processor = *((_QWORD *)InputBuffer + 2);
  v17 = Processor;
  if( !(_DWORD)Processor )
    goto LABEL_43;
  v15 = ExLockUserBuffer(
          (VOID *)Address[1],
          (unsigned int)Processor,
          PreviousMode,
          IoWriteAccess,
          (VOID **)&Actual[4],
          &v40);
  if( v15 >= 0 )
  {
    BusData = KdpSysReadControlSpace(HIDWORD(Processor), Address[0], *(PVOID *)&Actual[4], v17, (UINT64 *)Actual);
    goto LABEL_83;
  }
LABEL_84:
  if( ReturnLength )
    *(_DWORD *)ReturnLength = *(_DWORD *)Actual;
  if( *(_QWORD *)&Actual[4] )
    ExUnlockUserBuffer(v40);
  return v15;
}

Referenced by:

No references.