HdlspDispatch
NTSTATUS __stdcall HdlspDispatch(
_HEADLESS_CMD Command,
PVOID InputBuffer,
UINT64 InputBufferSize,
PVOID OutputBuffer,
UINT64 *OutputBufferSize){
NTSTATUS v5;
int v10;
char v11;
unsigned __int8 v12;
UINT64 *v13;
int v14;
INT8 *v16;
int v17;
__int64 v18;
INT8 *v19;
int v20;
int v21;
NTSTATUS v22;
UINT8 Line;
__int64 v24;
unsigned int v25;
int v26;
__int64 v27;
INT8 Dst[80];
v5 = 0;
v10 = 1228800;
v11 = 1;
if( (unsigned int)Command <= HeadlessCmdSendBlueScreenData && _bittest(&v10, Command) )
goto LABEL_13;
if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 2) != 0 )
v12 = -1;
else
v12 = KeAcquireSpinLockRaiseToDpc(*(&stru_140CF2E80 + 920));
v13 = (UINT64 *)*(&stru_140CF2E80 + 920);
v14 = *(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64);
if( (v14 & 0x40) == 0 )
{
*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) = v14 | 0x40;
if( v12 != 0xFF )
{
KxReleaseSpinLock(v13);
__writecr8(v12);
}
v10 = 1228800;
LABEL_13:
if( Command <= HeadlessCmdQueryInformation )
{
if( Command == HeadlessCmdQueryInformation )
{
if( OutputBuffer && OutputBufferSize && *OutputBufferSize >= 0x20 )
{
v24 = *(&stru_140CF2E80 + 920);
*(_DWORD *)OutputBuffer = 1;
*((_BYTE *)OutputBuffer + 8) = 1;
*((_BYTE *)OutputBuffer + 9) = (*(_DWORD *)(v24 + 48) & 8) != 0;
*((_DWORD *)OutputBuffer + 6) = *(_DWORD *)(v24 + 52);
v25 = *(_DWORD *)(v24 + 48);
v26 = (v25 >> 9) & 7;
if( v26 || (v25 & 8) != 0 )
{
*((_DWORD *)OutputBuffer + 3) = v26;
*((_QWORD *)OutputBuffer + 2) = *(_QWORD *)(v24 + 64);
}
else
{
*((_DWORD *)OutputBuffer + 3) = 0;
*((_QWORD *)OutputBuffer + 2) = 0i64;
}
*((_BYTE *)OutputBuffer + 28) = *(_BYTE *)(v24 + 84);
goto LABEL_131;
}
goto LABEL_33;
}
if( Command > HeadlessCmdTerminalPoll )
{
if( Command == HeadlessCmdGetByte )
{
if( OutputBuffer && OutputBufferSize && *OutputBufferSize == 1 )
{
if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 1) != 0
&& InbvPortPollOnly(*(unsigned int *)(*(&stru_140CF2E80 + 920) + 56i64)) )
{
InbvPortGetByte(*(unsigned int *)(*(&stru_140CF2E80 + 920) + 56i64), (UINT8 *)OutputBuffer);
goto LABEL_131;
}
goto LABEL_56;
}
LABEL_33:
v5 = -1073741811;
LABEL_131:
*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) &= ~0x40u;
return v5;
}
if( Command != HeadlessCmdGetLine )
{
if( Command == HeadlessCmdStartBugCheck )
{
*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) = *(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 0xFFFFFFBD | 2;
}
else if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 1) != 0 )
{
HdlspBugCheckProcessing();
}
return v5;
}
if( !OutputBuffer || !OutputBufferSize || *OutputBufferSize < 2 )
goto LABEL_33;
if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 1) != 0 )
{
Line = HdlspGetLine((char *)OutputBuffer + 1, *OutputBufferSize - 1);
goto LABEL_67;
}
}
else
{
if( Command != HeadlessCmdTerminalPoll )
{
if( Command != HeadlessCmdEnableTerminal )
{
if( Command != HeadlessCmdCheckForReboot )
{
if( Command == HeadlessCmdPutString )
{
if( InputBuffer )
{
if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 1) != 0 )
HdlspPutString((UINT8 *)InputBuffer);
goto LABEL_131;
}
}
else
{
if( (unsigned int)(Command - 4) > 6 )
{
LABEL_29:
v5 = -1073741811;
goto LABEL_129;
}
if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 1) == 0 )
{
LABEL_129:
if( (unsigned int)Command <= HeadlessCmdSendBlueScreenData && _bittest(&v10, Command) )
return v5;
goto LABEL_131;
}
switch( Command )
{
case HeadlessCmdClearDisplay:
v19 = (INT8 *)"\x1B[2J";
goto LABEL_43;
case HeadlessCmdClearToEndOfDisplay:
v19 = "\x1B[0J";
goto LABEL_43;
case HeadlessCmdClearToEndOfLine:
v19 = "\x1B[0K";
goto LABEL_43;
case HeadlessCmdDisplayAttributesOff:
v19 = "\x1B[0m";
goto LABEL_43;
case HeadlessCmdDisplayInverseVideo:
v19 = "\x1B[7m";
goto LABEL_43;
case HeadlessCmdSetColor:
if( InputBuffer && InputBufferSize == 8 )
{
v17 = *(_DWORD *)InputBuffer;
v16 = (INT8 *)"\x1B[%d;%dm";
v18 = *((unsigned int *)InputBuffer + 1);
goto LABEL_37;
}
break;
case HeadlessCmdPositionCursor:
if( InputBuffer && InputBufferSize == 8 )
{
v16 = "\x1B[%d;%dH";
v17 = *(_DWORD *)InputBuffer + 1;
v18 = (unsigned int)(*((_DWORD *)InputBuffer + 1) + 1);
LABEL_37:
sprintf_s(Dst, 0x50ui64, v16, v18, v17);
v19 = Dst;
LABEL_43:
HdlspSendStringAtBaud((UINT8 *)v19);
goto LABEL_129;
}
break;
default:
goto LABEL_29;
}
}
goto LABEL_33;
}
if( OutputBuffer && OutputBufferSize && *OutputBufferSize == 1 )
{
if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 1) != 0 )
{
if( HdlspGetLine(Dst, 0x50u) )
{
strcmp((UINT8 *)Dst, (UINT8 *)"reboot");
if( v20 )
{
strcmp((UINT8 *)Dst, (UINT8 *)"shutdown");
if( v21 )
v11 = 0;
}
*(_BYTE *)OutputBuffer = v11;
}
goto LABEL_131;
}
LABEL_56:
*(_BYTE *)OutputBuffer = 0;
goto LABEL_131;
}
goto LABEL_33;
}
if( !InputBuffer || InputBufferSize != 1 )
goto LABEL_33;
v22 = HdlspEnableTerminal(*(_BYTE *)InputBuffer);
LABEL_60:
v5 = v22;
goto LABEL_131;
}
if( !OutputBuffer || !OutputBufferSize || *OutputBufferSize != 1 )
goto LABEL_33;
if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 1) != 0 )
{
Line = InbvPortPollOnly(*(unsigned int *)(*(&stru_140CF2E80 + 920) + 56i64));
LABEL_67:
*(_BYTE *)OutputBuffer = Line;
goto LABEL_131;
}
}
Line = 0;
goto LABEL_67;
}
switch( Command )
{
case HeadlessCmdAddLogEntry:
if( InputBuffer )
{
HdlspAddLogEntry((WCHAR *)InputBuffer);
goto LABEL_129;
}
return -1073741811;
case HeadlessCmdDisplayLog:
if( InputBuffer && InputBufferSize == 1 )
{
HdlspProcessDumpCommand(*(_BYTE *)InputBuffer);
goto LABEL_131;
}
goto LABEL_33;
case HeadlessCmdSetBlueScreenData:
if( InputBuffer )
{
v22 = HdlspSetBlueScreenInformation((unsigned int *)InputBuffer, InputBufferSize);
goto LABEL_60;
}
return -1073741811;
case HeadlessCmdSendBlueScreenData:
if( (*(_BYTE *)(*(&stru_140CF2E80 + 920) + 48i64) & 3) == 3 )
{
if( InputBuffer && InputBufferSize == 4 )
{
HdlspSendBlueScreenInfo(*(unsigned int *)InputBuffer);
HdlspSendStringAtBaud((UINT8 *)"\n\r!SAC>");
return v5;
}
return -1073741811;
}
break;
default:
switch( Command )
{
case HeadlessCmdQueryGUID:
if( OutputBuffer && OutputBufferSize && *OutputBufferSize >= 0x10 )
{
*(_OWORD *)OutputBuffer = *(_OWORD *)(*(&stru_140CF2E80 + 920) + 100i64);
goto LABEL_131;
}
break;
case HeadlessCmdPutData:
if( InputBuffer && InputBufferSize )
{
if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 1) != 0 )
HdlspPutData((UINT8 *)InputBuffer, InputBufferSize);
goto LABEL_131;
}
break;
case HeadlessCmdPutWideString:
if( InputBuffer )
{
if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 1) != 0 )
HdlspPutWideString((WCHAR *)InputBuffer);
goto LABEL_131;
}
break;
case HeadlessCmdQueryPciInformation:
if( OutputBuffer && OutputBufferSize && *OutputBufferSize >= 0xC )
{
v27 = *(&stru_140CF2E80 + 920);
*(_QWORD *)OutputBuffer = *(_QWORD *)(*(&stru_140CF2E80 + 920) + 118i64);
*((_DWORD *)OutputBuffer + 2) = *(_DWORD *)(v27 + 126);
goto LABEL_131;
}
break;
default:
goto LABEL_29;
}
goto LABEL_33;
}
return v5;
}
if( v12 != 0xFF )
{
KxReleaseSpinLock(*(&stru_140CF2E80 + 920));
__writecr8(v12);
}
return -1073741823;
}Referenced by:
HdlspKernelAddLogEntry
HeadlessDispatch