HdlspGetLine
UINT8 __stdcall HdlspGetLine(VOID *InputBuffer, size_t InputBufferLength){
unsigned __int64 v3;
unsigned __int8 v4;
UINT64 *v5;
int v6;
UINT8 v8;
__int64 v9;
_QWORD *v10;
INT8 *v11;
__int64 v12;
__int64 v13;
__int64 v14;
__int64 v15;
__int64 v16;
char v17;
__int64 v18;
__int64 v19;
char *v20;
char v21;
__int64 v22;
unsigned __int64 v23;
const VOID *v24;
_DWORD *v25;
__int64 v26;
UINT8 Input;
Input = 0;
v3 = *(_QWORD *)&InputBufferLength;
if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 2) != 0 )
v4 = -1;
else
v4 = KeAcquireSpinLockRaiseToDpc(*(&stru_140CF2E80 + 920));
v5 = (UINT64 *)*(&stru_140CF2E80 + 920);
v6 = *(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64);
if( (v6 & 0x10) != 0 )
{
if( v4 != 0xFF )
{
KxReleaseSpinLock(*(&stru_140CF2E80 + 920));
__writecr8(v4);
}
return 0;
}
else
{
*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) = v6 | 0x10;
if( v4 != 0xFF )
{
KxReleaseSpinLock(v5);
__writecr8(v4);
}
if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 0x20) == 0 )
{
while( 1 )
{
while( 1 )
{
if( InbvPortPollOnly(*(unsigned int *)(*(&stru_140CF2E80 + 920) + 56i64))
&& InbvPortGetByte(*(unsigned int *)(*(&stru_140CF2E80 + 920) + 56i64), &Input) )
{
v8 = Input;
}
else
{
v8 = 0;
Input = 0;
}
v9 = *(&stru_140CF2E80 + 920);
if( !v8 )
goto LABEL_32;
*(_BYTE *)(*(_QWORD *)(*(&stru_140CF2E80 + 920) + 88i64) + *(_QWORD *)(*(&stru_140CF2E80 + 920) + 32i64)) = v8;
v10 = (_QWORD *)*(&stru_140CF2E80 + 920);
if( !*(_BYTE *)(*(&stru_140CF2E80 + 920) + 117i64) || Input != 10 )
break;
*(_BYTE *)(*(&stru_140CF2E80 + 920) + 117i64) = 0;
}
*(_BYTE *)(*(&stru_140CF2E80 + 920) + 117i64) = Input == 13;
if( Input == 10 || Input == 13 )
break;
switch( Input )
{
case 8u:
case 0x7Fu:
if( v10[11] )
{
HdlspSendStringAtBaud((UINT8 *)"\b \b");
--*(_QWORD *)(*(&stru_140CF2E80 + 920) + 88i64);
}
break;
case 3u:
v12 = ++v10[11];
v13 = v10[4];
goto LABEL_35;
case 9u:
case 0x1Bu:
HdlspSendStringAtBaud((UINT8 *)"\a");
v9 = *(&stru_140CF2E80 + 920);
LABEL_32:
*(_DWORD *)(v9 + 48) &= ~0x10u;
return 0;
default:
v11 = (INT8 *)v10[3];
if( v10[11] == 78i64 )
{
sprintf_s(v11, 0x50ui64, (INT8 *)"\b%c", Input);
HdlspSendStringAtBaud(*(UINT8 **)(*(&stru_140CF2E80 + 920) + 24i64));
}
else
{
sprintf_s(v11, 0x50ui64, (INT8 *)"%c", Input);
HdlspSendStringAtBaud(*(UINT8 **)(*(&stru_140CF2E80 + 920) + 24i64));
++*(_QWORD *)(*(&stru_140CF2E80 + 920) + 88i64);
}
break;
}
}
HdlspSendStringAtBaud((UINT8 *)"\r\n");
v12 = *(_QWORD *)(*(&stru_140CF2E80 + 920) + 88i64);
v13 = *(_QWORD *)(*(&stru_140CF2E80 + 920) + 32i64);
LABEL_35:
*(_BYTE *)(v12 + v13) = 0;
v14 = *(&stru_140CF2E80 + 920);
++*(_QWORD *)(*(&stru_140CF2E80 + 920) + 88i64);
v15 = *(_QWORD *)(v14 + 88) - 1i64;
if( *(_QWORD *)(v14 + 88) != 1i64 )
{
v16 = *(_QWORD *)(v14 + 32);
do
{
v17 = *(_BYTE *)(v16 + v15);
if( v17 && v17 != 32 && v17 != 9 )
break;
--v15;
}
while( v15 );
}
v18 = *(_QWORD *)(*(&stru_140CF2E80 + 920) + 32i64);
if( *(_BYTE *)(v18 + v15) )
*(_BYTE *)(v18 + v15 + 1) = 0;
v19 = 0i64;
v20 = *(char **)(*(&stru_140CF2E80 + 920) + 32i64);
if( *v20 )
{
do
{
v21 = v20[v19];
if( v21 != 9 && v21 != 32 )
break;
++v19;
}
while( v20[v19] );
if( v19 )
strcpy_s(v20, 0x50ui64, &v20[v19]);
}
}
v22 = *(&stru_140CF2E80 + 920);
v23 = *(_QWORD *)(*(&stru_140CF2E80 + 920) + 88i64);
v24 = *(const VOID **)(*(&stru_140CF2E80 + 920) + 32i64);
if( v3 < v23 )
{
memmove(InputBuffer, v24, v3);
memmove(*(VOID **)(v22 + 32), (const VOID *)(*(_QWORD *)(v22 + 32) + v3), *(_QWORD *)(v22 + 88) - v3);
v26 = *(&stru_140CF2E80 + 920);
v25 = (_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64);
*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) |= 0x20u;
*(_QWORD *)(v26 + 88) -= v3;
}
else
{
memmove(InputBuffer, v24, v23);
*(_QWORD *)(v22 + 88) = 0i64;
v25 = (_DWORD *)(v22 + 48);
*(_DWORD *)(v22 + 48) &= ~0x20u;
}
*v25 &= ~0x10u;
return 1;
}
}Referenced by:
HdlspBugCheckProcessing
HdlspDispatch
HdlspPutMore