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.