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