HdlspDispatch
__int64 __fastcall HdlspDispatch(signed int a1, __int64 a2, __int64 a3, __int64 a4, _QWORD *a5){
unsigned int v5;
int v10;
char v11;
unsigned __int8 v12;
unsigned __int8 v13;
UINT64 *v14;
int v15;
INT8 *v17;
char *v18;
unsigned int v19;
UINT8 Line;
PKSPIN_LOCK v21;
unsigned int v22;
int v23;
PKSPIN_LOCK v24;
char DstBuf[80];
v5 = 0;
v10 = 1228800;
v11 = 1;
if( (unsigned int)a1 <= 0x14 && _bittest(&v10, a1) )
goto LABEL_13;
if( (HeadlessGlobals[6] & 2) != 0 )
{
v13 = -1;
}
else
{
KeAcquireSpinLockRaiseToDpc(HeadlessGlobals, a2);
v13 = v12;
}
v14 = HeadlessGlobals;
v15 = *((_DWORD *)HeadlessGlobals + 12);
if( (v15 & 0x40) == 0 )
{
*((_DWORD *)HeadlessGlobals + 12) = v15 | 0x40;
if( v13 != 0xFF )
{
KxReleaseSpinLock(v14);
__writecr8(v13);
}
v10 = 1228800;
LABEL_13:
if( a1 <= 16 )
{
if( a1 == 16 )
{
if( a4 && a5 && *a5 >= 0x20ui64 )
{
v21 = HeadlessGlobals;
*(_DWORD *)a4 = 1;
*(_BYTE *)(a4 + 8) = 1;
*(_BYTE *)(a4 + 9) = (v21[6] & 8) != 0;
*(_DWORD *)(a4 + 24) = *((_DWORD *)v21 + 13);
v22 = *((_DWORD *)v21 + 12);
v23 = (v22 >> 9) & 7;
if( v23 || (v22 & 8) != 0 )
{
*(_DWORD *)(a4 + 12) = v23;
*(_QWORD *)(a4 + 16) = v21[8];
}
else
{
*(_DWORD *)(a4 + 12) = 0;
*(_QWORD *)(a4 + 16) = 0i64;
}
*(_BYTE *)(a4 + 28) = *((_BYTE *)v21 + 84);
goto LABEL_131;
}
goto LABEL_33;
}
if( a1 > 11 )
{
if( a1 == 12 )
{
if( a4 && a5 && *a5 == 1i64 )
{
if( (HeadlessGlobals[6] & 1) != 0 && InbvPortPollOnly(*((unsigned int *)HeadlessGlobals + 14)) )
{
InbvPortGetByte(*((unsigned int *)HeadlessGlobals + 14), (UINT8 *)a4);
goto LABEL_131;
}
goto LABEL_56;
}
LABEL_33:
v5 = -1073741811;
LABEL_131:
*((_DWORD *)HeadlessGlobals + 12) &= ~0x40u;
return v5;
}
if( a1 != 13 )
{
if( a1 == 14 )
{
*((_DWORD *)HeadlessGlobals + 12) = HeadlessGlobals[6] & 0xFFFFFFBD | 2;
}
else if( (HeadlessGlobals[6] & 1) != 0 )
{
HdlspBugCheckProcessing();
}
return v5;
}
if( !a4 || !a5 || *a5 < 2ui64 )
goto LABEL_33;
if( (HeadlessGlobals[6] & 1) != 0 )
{
Line = HdlspGetLine((UINT8 *)(a4 + 1), *a5 - 1i64);
goto LABEL_67;
}
}
else
{
if( a1 != 11 )
{
if( a1 != 1 )
{
if( a1 != 2 )
{
if( a1 == 3 )
{
if( a2 )
{
if( (HeadlessGlobals[6] & 1) != 0 )
HdlspPutString((UINT8 *)a2);
goto LABEL_131;
}
}
else
{
if( (unsigned int)(a1 - 4) > 6 )
{
LABEL_29:
v5 = -1073741811;
goto LABEL_129;
}
if( (HeadlessGlobals[6] & 1) == 0 )
{
LABEL_129:
if( (unsigned int)a1 <= 0x14 && _bittest(&v10, a1) )
return v5;
goto LABEL_131;
}
switch( a1 )
{
case 4:
v18 = "\x1B[2J";
goto LABEL_43;
case 5:
v18 = "\x1B[0J";
goto LABEL_43;
case 6:
v18 = "\x1B[0K";
goto LABEL_43;
case 7:
v18 = "\x1B[0m";
goto LABEL_43;
case 8:
v18 = "\x1B[7m";
goto LABEL_43;
case 9:
if( a2 && a3 == 8 )
{
v17 = (INT8 *)"\x1B[%d;%dm";
goto LABEL_37;
}
break;
case 10:
if( a2 && a3 == 8 )
{
v17 = "\x1B[%d;%dH";
LABEL_37:
sprintf_s(DstBuf, 0x50ui64, v17);
v18 = DstBuf;
LABEL_43:
HdlspSendStringAtBaud((UINT8 *)v18);
goto LABEL_129;
}
break;
default:
goto LABEL_29;
}
}
goto LABEL_33;
}
if( a4 && a5 && *a5 == 1i64 )
{
if( (HeadlessGlobals[6] & 1) != 0 )
{
if( HdlspGetLine((UINT8 *)DstBuf, 0x50ui64) )
{
if( (unsigned int)strcmp(DstBuf, "reboot") && (unsigned int)strcmp(DstBuf, "shutdown") )
v11 = 0;
*(_BYTE *)a4 = v11;
}
goto LABEL_131;
}
LABEL_56:
*(_BYTE *)a4 = 0;
goto LABEL_131;
}
goto LABEL_33;
}
if( !a2 || a3 != 1 )
goto LABEL_33;
v19 = HdlspEnableTerminal(*(_BYTE *)a2);
LABEL_60:
v5 = v19;
goto LABEL_131;
}
if( !a4 || !a5 || *a5 != 1i64 )
goto LABEL_33;
if( (HeadlessGlobals[6] & 1) != 0 )
{
Line = InbvPortPollOnly(*((unsigned int *)HeadlessGlobals + 14));
LABEL_67:
*(_BYTE *)a4 = Line;
goto LABEL_131;
}
}
Line = 0;
goto LABEL_67;
}
switch( a1 )
{
case 17:
if( a2 )
{
HdlspAddLogEntry((WCHAR *)a2);
goto LABEL_129;
}
return(unsigned int)-1073741811;
case 18:
if( a2 && a3 == 1 )
{
HdlspProcessDumpCommand(*(_BYTE *)a2);
goto LABEL_131;
}
goto LABEL_33;
case 19:
if( a2 )
{
v19 = HdlspSetBlueScreenInformation((UINT64 *)a2, a3);
goto LABEL_60;
}
return 3221225485i64;
case 20:
if( (HeadlessGlobals[6] & 3) == 3 )
{
if( a2 && a3 == 4 )
{
HdlspSendBlueScreenInfo(*(unsigned int *)a2);
HdlspSendStringAtBaud((UINT8 *)"\n\r!SAC>");
return v5;
}
return 3221225485i64;
}
break;
default:
switch( a1 )
{
case 21:
if( a4 && a5 && *a5 >= 0x10ui64 )
{
*(_OWORD *)a4 = *(_OWORD *)((char *)HeadlessGlobals + 100);
goto LABEL_131;
}
break;
case 22:
if( a2 && a3 )
{
if( (HeadlessGlobals[6] & 1) != 0 )
HdlspPutData((UINT8 *)a2, a3);
goto LABEL_131;
}
break;
case 23:
if( a2 )
{
if( (HeadlessGlobals[6] & 1) != 0 )
HdlspPutWideString((WCHAR *)a2);
goto LABEL_131;
}
break;
case 24:
if( a4 && a5 && *a5 >= 0xCui64 )
{
v24 = HeadlessGlobals;
*(_QWORD *)a4 = *(PKSPIN_LOCK)((char *)HeadlessGlobals + 118);
*(_DWORD *)(a4 + 8) = *(_DWORD *)((char *)v24 + 126);
goto LABEL_131;
}
break;
default:
goto LABEL_29;
}
goto LABEL_33;
}
return v5;
}
if( v13 != 0xFF )
{
KxReleaseSpinLock(HeadlessGlobals);
__writecr8(v13);
}
return 3221225473i64;
}Referenced by:
HdlspKernelAddLogEntry
HeadlessDispatch