TtmDispatchApi

VOID __stdcall TtmDispatchApi(INT64 *InternalLevel, VOID *InputBuffer, UINT64 InputBufferLength, VOID *OutputBuffer){
  unsigned int v5; 
  int v7; 
  VOID **PoolWithTag; 
  int v9; 
  UINT64 v10; 
  unsigned int v11; 
  unsigned int v12; 
  int Terminal; 
  unsigned int v14; 
  VOID ***v15; 
  unsigned int *v16; 
  _BYTE *v17; 

  v5 = InputBufferLength;
  v7 = (int)InternalLevel;
  TtmiLogDispatchApiStart((POWER_INFORMATION_LEVEL_INTERNAL)InternalLevel);
  PoolWithTag = 0i64;
  *v15 = 0i64;
  *v16 = 0;
  *v17 = 0;
  if( TtmpEnabled != 1 )
  {
    v9 = -1073741637;
    v10 = 1062i64;
LABEL_3:
    TtmiLogError((INT8 *)"TtmDispatchApi", v10, 0xFFFFFFFFi64, (unsigned int)v9);
    goto LABEL_59;
  }
  if( v7 > 4101 )
  {
    if( v7 != 4102 && v7 != 4103 && v7 != 4104 && v7 != 4105 && v7 != 4106 )
      goto LABEL_22;
    goto LABEL_23;
  }
  switch( v7 )
  {
    case 4101:
LABEL_23:
      v11 = 24;
      goto LABEL_24;
    case 4096:
      v11 = 12;
LABEL_13:
      v12 = 8;
      goto LABEL_25;
    case 4097:
      v11 = 24;
      v12 = 16;
      goto LABEL_25;
  }
  if( v7 != 4098 )
  {
    if( v7 != 4099 )
    {
      if( v7 == 4100 )
      {
        v11 = 16;
        v12 = 544;
        goto LABEL_25;
      }
LABEL_22:
      v9 = -1073741811;
      v10 = 1128i64;
      goto LABEL_3;
    }
    v11 = 16;
    goto LABEL_13;
  }
  v11 = 16;
LABEL_24:
  v12 = 0;
LABEL_25:
  if( v5 < v11 || !OutputBuffer && v12 || v14 < v12 )
  {
    v9 = -1073741789;
    TtmiLogError((INT8 *)"TtmDispatchApi", 0x473ui64, 0xFFFFFFFFi64, 3221225507i64);
  }
  else
  {
    if( v12 )
    {
      PoolWithTag = ExAllocatePoolWithTag(1ui64, v12, 544040269i64);
      if( !PoolWithTag )
      {
        v9 = -1073741801;
        v10 = 1154i64;
        goto LABEL_3;
      }
    }
    if( v7 > 4101 )
    {
      switch( v7 )
      {
        case 4102:
          Terminal = TtmpDispatchAssignDevice((_TTM_API_ASSIGN_DEVICE_INPUT *)InputBuffer);
          break;
        case 4103:
          Terminal = TtmpDispatchSetDisplayState((_TTM_API_SET_DISPLAY_STATE_INPUT *)InputBuffer);
          break;
        case 4104:
          Terminal = TtmpDispatchSetDisplayTimeouts((_TTM_API_SET_DISPLAY_TIMEOUTS_INPUT *)InputBuffer);
          break;
        case 4105:
          Terminal = TtmpDispatchSetDisplayPowerRequest((INT64)InputBuffer);
          break;
        default:
          Terminal = TtmpDispatchSetInputWakeCapability((INT64)InputBuffer);
          break;
      }
    }
    else
    {
      switch( v7 )
      {
        case 4101:
          Terminal = TtmpDispatchSetDefaultDeviceAssignment((__int64)InputBuffer);
          break;
        case 4096:
          Terminal = TtmpDispatchOpenTerminal((__int64)InputBuffer, PoolWithTag);
          break;
        case 4097:
          Terminal = TtmpDispatchCreateTerminal((_TTM_API_CREATE_TERMINAL_INPUT *)InputBuffer, PoolWithTag);
          break;
        case 4098:
          Terminal = TtmpDispatchEvacuateDevices((_TTM_API_EVACUATE_DEVICES_INPUT *)InputBuffer);
          break;
        case 4099:
          Terminal = TtmpDispatchCreateEventQueue((__int64)InputBuffer, PoolWithTag);
          break;
        default:
          TtmpDispatchGetTerminalEvent(
            (_PNP_DEPENDENCY_NODE *)InputBuffer,
            (_PNP_DEPENDENCY_NODE *)PoolWithTag,
            (_PNP_BINDING_REQUEST *)0x1005);
          break;
      }
    }
    v9 = Terminal;
  }
  if( PoolWithTag )
  {
    if( v9 < 0 )
    {
      ExFreePoolWithTag(PoolWithTag, 0x206D654Du);
    }
    else
    {
      *v15 = PoolWithTag;
      *v16 = v12;
      *v17 = 1;
    }
  }
LABEL_59:
  TtmiLogDispatchApiStop((POWER_INFORMATION_LEVEL_INTERNAL)v7, (unsigned int)v9);
}

Referenced by:

NtPowerInformation