WbValidateHeapExecuteCallArguments

NTSTATUS __stdcall WbValidateHeapExecuteCallArguments(INT64 a1, UINT64 a2, INT64 a3){
  unsigned int v4; 
  NTSTATUS v6; 
  _EWOW64PROCESS *WoW64Process; 
  _OWORD *v8; 
  struct wil_details_FeatureReportingCache *v9; 
  _OWORD *v10; 
  int v11; 
  struct wil_details_FeatureReportingCache *v12; 
  int v13; 
  __int64 v14; 
  int v15; 
  int v16; 
  unsigned int v17; 
  int v18; 
  __int64 v19; 
  int v20; 
  unsigned __int16 Machine; 
  _EWOW64PROCESS *v23; 
  _OWORD *v24; 
  _OWORD *v25; 
  int v26; 
  int v27; 

  v4 = a2;
  v6 = 0;
  memset((VOID *)a3, 0i64, 0x150u);
  if( v4 < 0x18 || *(_DWORD *)a1 != 3 )
    return -1073741811;
  WoW64Process = KeGetCurrentThread()->ApcState.Process->WoW64Process;
  if( WoW64Process )
  {
    Machine = WoW64Process->Machine;
    if( Machine == 332 || Machine == 452 )
    {
      v23 = KeGetCurrentThread()->ApcState.Process->WoW64Process;
      if( v23 )
      {
        if( v23->Machine == 452 )
          *(_QWORD *)(a1 + 8) &= ~1ui64;
      }
    }
  }
  v8 = *(_OWORD **)(a1 + 8);
  if( (unsigned __int64)(v8 + 15) > 0x7FFFFFFF0000i64 || v8 + 15 < v8 )
  {
    MEMORY[0x7FFFFFFF0000] = 0;
    v8 = *(_OWORD **)(a1 + 8);
  }
  v9 = (struct wil_details_FeatureReportingCache *)(a3 + 16);
  *(_OWORD *)(a3 + 16) = *v8;
  *(_OWORD *)(a3 + 32) = v8[1];
  *(_OWORD *)(a3 + 48) = v8[2];
  *(_OWORD *)(a3 + 64) = v8[3];
  *(_OWORD *)(a3 + 80) = v8[4];
  *(_OWORD *)(a3 + 96) = v8[5];
  *(_OWORD *)(a3 + 112) = v8[6];
  *(_OWORD *)(a3 + 128) = v8[7];
  v10 = v8 + 8;
  *(_OWORD *)(a3 + 144) = *v10;
  *(_OWORD *)(a3 + 160) = v10[1];
  *(_OWORD *)(a3 + 176) = v10[2];
  *(_OWORD *)(a3 + 192) = v10[3];
  *(_OWORD *)(a3 + 208) = v10[4];
  *(_OWORD *)(a3 + 224) = v10[5];
  *(_OWORD *)(a3 + 240) = v10[6];
  *(_QWORD *)(a3 + 328) = *(_QWORD *)(a1 + 8);
  v11 = *(_DWORD *)(a3 + 52);
  v12 = (struct wil_details_FeatureReportingCache *)(v11 & 0xF);
  *(_DWORD *)(a3 + 8) = (_DWORD)v12;
  *(_DWORD *)(a3 + 12) = (unsigned __int8)v11 >> 4;
  if( (_DWORD)v12 == 1 )
  {
    v24 = *(_OWORD **)(a1 + 8);
    if( (unsigned __int64)v24 + 248 > 0x7FFFFFFF0000i64 || (_OWORD *)((char *)v24 + 248) < v24 )
    {
      MEMORY[0x7FFFFFFF0000] = 0;
      v24 = *(_OWORD **)(a1 + 8);
    }
    *(_OWORD *)&v9->reported.exchange = *v24;
    *(_OWORD *)(a3 + 32) = v24[1];
    *(_OWORD *)(a3 + 48) = v24[2];
    *(_OWORD *)(a3 + 64) = v24[3];
    *(_OWORD *)(a3 + 80) = v24[4];
    *(_OWORD *)(a3 + 96) = v24[5];
    *(_OWORD *)(a3 + 112) = v24[6];
    *(_OWORD *)(a3 + 128) = v24[7];
    v25 = v24 + 8;
    *(_OWORD *)(a3 + 144) = *v25;
    *(_OWORD *)(a3 + 160) = v25[1];
    *(_OWORD *)(a3 + 176) = v25[2];
    *(_OWORD *)(a3 + 192) = v25[3];
    *(_OWORD *)(a3 + 208) = v25[4];
    *(_OWORD *)(a3 + 224) = v25[5];
    *(_OWORD *)(a3 + 240) = v25[6];
    *(_QWORD *)(a3 + 256) = *((_QWORD *)v25 + 14);
  }
  else
  {
    v27 = 3;
    if( (unsigned int)wil_details_FeatureReporting_ReportUsageToServiceDirect(
                         v12,
                         v9,
                         0x7FFFFFFF0000i64,
                         128i64,
                         wil_details_ServiceReportingKind_PotentialDeviceUsage)
      && g_wil_details_pfnFeatureLoggingHook )
    {
      g_wil_details_pfnFeatureLoggingHook(
        0xE67B5Au,
        &Feature_PdttSupport_logged_traits,
        0i64,
        0,
        (const enum wil_ReportingKind *)&v27,
        0i64,
        0,
        1ui64);
    }
    if( *(_DWORD *)(a3 + 8) )
      return -1073741811;
  }
  v13 = *(_DWORD *)(a3 + 72) & 0xFFFFFFF;
  if( !v13 )
    return -1073741811;
  v14 = *(_QWORD *)(a3 + 328) - (*(_DWORD *)(*(_QWORD *)(a1 + 8) + 40i64) & 0xFFFFFFF);
  *(_QWORD *)a3 = v14;
  v15 = 4096;
  if( *(_DWORD *)(a3 + 60) > 0x1000u )
    v15 = *(_DWORD *)(a3 + 60);
  *(_DWORD *)(a3 + 324) = v15;
  v16 = *(_DWORD *)(a3 + 76);
  v17 = *(_DWORD *)(a3 + 68) & 0xFFFFFFF;
  v18 = v16 & 0xFFFFFFF;
  if( (v16 & 0xFFFFFFF) != 0 )
  {
    v20 = *(_DWORD *)(a3 + 80) & 0xFFFFFFF;
    *(_DWORD *)(a3 + 312) = v20 + 16;
    *(_DWORD *)(a3 + 308) = v13;
    *(_DWORD *)(a3 + 304) = v17;
    *(_QWORD *)(a3 + 296) = v14 + v17;
    v19 = v16 & 0xFFFFFFF;
  }
  else
  {
    v19 = *(_DWORD *)(a3 + 68) & 0xFFFFFFF;
    v18 = *(_DWORD *)(a3 + 68) & 0xFFFFFFF;
    v20 = v13;
  }
  *(_DWORD *)(a3 + 288) = 16;
  *(_DWORD *)(a3 + 284) = v20;
  *(_DWORD *)(a3 + 280) = v18;
  *(_QWORD *)(a3 + 272) = v14 + v19;
  if( *(_DWORD *)(a3 + 8) == 1 )
  {
    v26 = *(_DWORD *)(a3 + 256);
    if( (*(_DWORD *)(a3 + 76) & 0xFFFFFFF) != 0 )
    {
      *(_DWORD *)(a3 + 292) = *(_DWORD *)(a3 + 260);
      *(_DWORD *)(a3 + 316) = v26;
    }
    else
    {
      *(_DWORD *)(a3 + 292) = v26;
    }
  }
  *(_DWORD *)(a3 + 320) = *(_DWORD *)(a3 + 284) + *(_DWORD *)(a3 + 308) + 16;
  return v6;
}

Referenced by:

WbHeapExecuteCall