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