WbValidateEncryptionSegmentArguments
NTSTATUS __stdcall WbValidateEncryptionSegmentArguments(INT64 a1, UINT64 a2, _OWORD *a3, INT64 a4){
struct wil_details_FeatureReportingCache *v7;
int v8;
__int64 v9;
__int64 v10;
_OWORD *v11;
_OWORD *v12;
int v13;
_OWORD *v15;
_OWORD *v16;
__int128 P;
int v18;
P = 0i64;
if( (unsigned int)a2 < 0x10 )
goto LABEL_16;
v8 = WbAlloc(244);
if( v8 < 0 )
goto LABEL_11;
v11 = *(_OWORD **)(a1 + 8);
if( (unsigned __int64)v11 + 244 > 0x7FFFFFFF0000i64 || (_OWORD *)((char *)v11 + 244) < v11 )
{
MEMORY[0x7FFFFFFF0000] = 0;
v11 = *(_OWORD **)(a1 + 8);
}
MEMORY[0] = *v11;
MEMORY[0x10] = v11[1];
MEMORY[0x20] = v11[2];
MEMORY[0x30] = v11[3];
MEMORY[0x40] = v11[4];
MEMORY[0x50] = v11[5];
MEMORY[0x60] = v11[6];
MEMORY[0x70] = v11[7];
v12 = v11 + 8;
MEMORY[0x80] = *v12;
MEMORY[0x90] = v12[1];
MEMORY[0xA0] = v12[2];
MEMORY[0xB0] = v12[3];
MEMORY[0xC0] = v12[4];
MEMORY[0xD0] = v12[5];
MEMORY[0xE0] = v12[6];
MEMORY[0xF0] = *((_DWORD *)v12 + 28);
v13 = MEMORY[0x24] & 0xF;
LODWORD(P) = v13;
DWORD1(P) = MEMORY[0x24] >> 4;
if( v13 != 1 )
{
v18 = 3;
if( (unsigned int)wil_details_FeatureReporting_ReportUsageToServiceDirect(
0i64,
v7,
v9,
v10,
wil_details_ServiceReportingKind_PotentialDeviceUsage)
&& g_wil_details_pfnFeatureLoggingHook )
{
g_wil_details_pfnFeatureLoggingHook(
0xE67B5Au,
&Feature_PdttSupport_logged_traits,
0i64,
0,
(const enum wil_ReportingKind *)&v18,
0i64,
0,
1ui64);
}
if( !v13 )
goto LABEL_9;
LABEL_16:
v8 = -1073741811;
goto LABEL_11;
}
ExFreePoolWithTag(0i64, 0x42524157u);
*((_QWORD *)&P + 1) = 0i64;
v8 = WbAlloc(248);
if( v8 < 0 )
goto LABEL_11;
v15 = *(_OWORD **)(a1 + 8);
if( (unsigned __int64)v15 + 248 > 0x7FFFFFFF0000i64 || (_OWORD *)((char *)v15 + 248) < v15 )
{
MEMORY[0x7FFFFFFF0000] = 0;
v15 = *(_OWORD **)(a1 + 8);
}
MEMORY[0] = *v15;
MEMORY[0x10] = v15[1];
MEMORY[0x20] = v15[2];
MEMORY[0x30] = v15[3];
MEMORY[0x40] = v15[4];
MEMORY[0x50] = v15[5];
MEMORY[0x60] = v15[6];
MEMORY[0x70] = v15[7];
v16 = v15 + 8;
MEMORY[0x80] = *v16;
MEMORY[0x90] = v16[1];
MEMORY[0xA0] = v16[2];
MEMORY[0xB0] = v16[3];
MEMORY[0xC0] = v16[4];
MEMORY[0xD0] = v16[5];
MEMORY[0xE0] = v16[6];
MEMORY[0xF0] = *((_QWORD *)v16 + 14);
LABEL_9:
*(_DWORD *)(a4 + 8) = *(_DWORD *)(*((_QWORD *)&P + 1) + 64i64);
*(_QWORD *)a4 = *(_QWORD *)(a1 + 8) - (*(_DWORD *)(*((_QWORD *)&P + 1) + 40i64) & 0xFFFFFFF);
if( a3 )
{
*a3 = P;
*((_QWORD *)&P + 1) = 0i64;
}
LABEL_11:
if( *((_QWORD *)&P + 1) )
ExFreePoolWithTag(*((PVOID *)&P + 1), 0x42524157u);
return v8;
}Referenced by:
WbGetInitializedEncryptionSegment