TtmDispatchApi
INT64 __fastcall TtmDispatchApi(INT64 a1, INT64 a2, UINT64 a3, INT64 a4, UINT64 a5, CHAR **a6, UINT64 *a7, BYTE *a8){
unsigned int v9;
int v11;
HANDLE *PoolWithTag;
unsigned int v13;
INT64 v14;
unsigned int v15;
unsigned int v16;
unsigned int Terminal;
v9 = a3;
v11 = a1;
TtmiLogDispatchApiStart(a1);
PoolWithTag = 0i64;
*a6 = 0i64;
*(_DWORD *)a7 = 0;
*a8 = 0;
if( TtmpEnabled != 1 )
{
v13 = -1073741637;
v14 = 1062i64;
LABEL_3:
TtmiLogError((PSTR)"TtmDispatchApi", v14, 0xFFFFFFFFi64, v13);
goto LABEL_59;
}
if( v11 > 4101 )
{
if( v11 != 4102 && v11 != 4103 && v11 != 4104 && v11 != 4105 && v11 != 4106 )
goto LABEL_22;
goto LABEL_23;
}
switch( v11 )
{
case 4101:
LABEL_23:
v15 = 24;
goto LABEL_24;
case 4096:
v15 = 12;
LABEL_13:
v16 = 8;
goto LABEL_25;
case 4097:
v15 = 24;
v16 = 16;
goto LABEL_25;
}
if( v11 != 4098 )
{
if( v11 != 4099 )
{
if( v11 == 4100 )
{
v15 = 16;
v16 = 544;
goto LABEL_25;
}
LABEL_22:
v13 = -1073741811;
v14 = 1128i64;
goto LABEL_3;
}
v15 = 16;
goto LABEL_13;
}
v15 = 16;
LABEL_24:
v16 = 0;
LABEL_25:
if( v9 < v15 || !a4 && v16 || (unsigned int)a5 < v16 )
{
v13 = -1073741789;
TtmiLogError((PSTR)"TtmDispatchApi", 1139i64, 0xFFFFFFFFi64, 3221225507i64);
}
else
{
if( v16 )
{
PoolWithTag = (HANDLE *)ExAllocatePoolWithTag(PagedPool, v16, 0x206D654Dui64);
if( !PoolWithTag )
{
v13 = -1073741801;
v14 = 1154i64;
goto LABEL_3;
}
}
if( v11 > 4101 )
{
switch( v11 )
{
case 4102:
Terminal = TtmpDispatchAssignDevice(a2);
break;
case 4103:
Terminal = TtmpDispatchSetDisplayState(a2);
break;
case 4104:
Terminal = TtmpDispatchSetDisplayTimeouts(a2);
break;
case 4105:
Terminal = TtmpDispatchSetDisplayPowerRequest(a2);
break;
default:
Terminal = TtmpDispatchSetInputWakeCapability(a2);
break;
}
}
else
{
switch( v11 )
{
case 4101:
Terminal = TtmpDispatchSetDefaultDeviceAssignment(a2);
break;
case 4096:
Terminal = TtmpDispatchOpenTerminal(a2, PoolWithTag);
break;
case 4097:
Terminal = TtmpDispatchCreateTerminal(a2, PoolWithTag);
break;
case 4098:
Terminal = TtmpDispatchEvacuateDevices(a2);
break;
case 4099:
Terminal = TtmpDispatchCreateEventQueue(a2, PoolWithTag);
break;
default:
Terminal = TtmpDispatchGetTerminalEvent(a2, (INT64)PoolWithTag, (const UNICODE_STRING **)0x1005);
break;
}
}
v13 = Terminal;
}
if( PoolWithTag )
{
if( (v13 & 0x80000000) != 0 )
{
ExFreePoolWithTag(PoolWithTag, 0x206D654Du);
}
else
{
*a6 = (CHAR *)PoolWithTag;
*(_DWORD *)a7 = v16;
*a8 = 1;
}
}
LABEL_59:
TtmiLogDispatchApiStop((unsigned int)v11, v13);
return v13;
}Referenced by:
NtPowerInformation