WbInitializeEncryptionSegment
NTSTATUS __stdcall WbInitializeEncryptionSegment(INT64 *a1, wil_details_FeatureReportingCache *a2, INT64 a3, INT64 a4){
int v6;
unsigned __int64 v7;
unsigned int v8;
NTSTATUS v9;
unsigned int v10;
size_t v11;
int v12;
__int64 v13;
VOID **v14;
wil_details_FeatureReportingCache *v15;
unsigned __int64 v16;
unsigned __int64 v17;
struct wil_details_FeatureReportingCache *v18;
struct wil_details_FeatureReportingCache *v19;
__int64 v20;
__int64 v21;
struct wil_details_FeatureReportingCache *v22;
__int64 v23;
__int64 v24;
struct wil_details_FeatureReportingCache *v25;
unsigned int v26;
int v27;
unsigned int v28;
_DWORD *v29;
const VOID *v30;
VOID *v31;
unsigned int v32;
unsigned __int64 v33;
unsigned __int64 v35;
unsigned int v36;
unsigned int v37;
int v38;
int v39[4];
VOID *Source1;
unsigned int v41;
const VOID *v42;
int v43;
wil_details_FeatureReportingCache *v44;
INT64 v45;
unsigned int v46;
v45 = a3;
v44 = a2;
v6 = *(_DWORD *)a1;
if( *(_DWORD *)a1 == 1 )
{
Source1 = (VOID *)a1[1];
v35 = 16i64 * *((unsigned int *)Source1 + 60);
v36 = -1;
if( v35 <= 0xFFFFFFFF )
v36 = 16 * *((_DWORD *)Source1 + 60);
v46 = v36;
v9 = v35 > 0xFFFFFFFF ? 0xC0000095 : 0;
if( v35 > 0xFFFFFFFF )
goto LABEL_46;
v37 = v36 + 248;
v11 = -1;
if( v36 + 248 >= v36 )
v11 = v36 + 248;
v9 = v37 < v36 ? 0xC0000095 : 0;
if( v37 < v36 )
goto LABEL_46;
v12 = 1;
v13 = 248i64;
}
else
{
v43 = 3;
if( (unsigned int)wil_details_FeatureReporting_ReportUsageToServiceDirect(
(struct wil_details_FeatureReportingCache *)a1,
a2,
a3,
a4,
wil_details_ServiceReportingKind_PotentialDeviceUsage)
&& g_wil_details_pfnFeatureLoggingHook )
{
g_wil_details_pfnFeatureLoggingHook(
0xE67B5Au,
&Feature_PdttSupport_logged_traits,
0i64,
0,
(const enum wil_ReportingKind *)&v43,
0i64,
0,
1ui64);
}
if( v6 )
{
v9 = -1073741811;
goto LABEL_46;
}
Source1 = (VOID *)a1[1];
v7 = 12i64 * *((unsigned int *)Source1 + 60);
v8 = -1;
if( v7 <= 0xFFFFFFFF )
v8 = 12 * *((_DWORD *)Source1 + 60);
v46 = v8;
v9 = v7 > 0xFFFFFFFF ? 0xC0000095 : 0;
if( v7 > 0xFFFFFFFF )
goto LABEL_46;
v10 = v8 + 244;
v11 = -1;
if( v8 + 244 >= v8 )
v11 = v8 + 244;
v9 = v10 < v8 ? 0xC0000095 : 0;
if( v10 < v8 )
goto LABEL_46;
v12 = 0;
v13 = 244i64;
}
*(_DWORD *)(a3 + 48) = v12;
*(_DWORD *)(a3 + 52) = *((_DWORD *)a1 + 1);
v14 = (VOID **)(a3 + 56);
v9 = WbAlloc(v11);
if( v9 >= 0 )
{
v15 = v44;
if( v11 )
{
v16 = (unsigned __int64)v44[1];
v17 = v16 + v11;
if( v17 > 0x7FFFFFFF0000i64 || v17 < v16 )
MEMORY[0x7FFFFFFF0000] = 0;
}
memmove(*v14, *(const VOID **)&v44[1], v11);
v9 = sub_14065E218(*(PVOID *)&v15[1], v11, 1);
if( v9 >= 0 )
{
v9 = sub_14065D5DC(*v14, v11);
if( v9 >= 0 )
{
if( RtlCompareMemory(Source1, *v14, v13) != (_SIZE_T *)v13 )
{
v9 = -1073741811;
goto LABEL_46;
}
if( *(_DWORD *)(a3 + 48) == 1 )
{
v29 = *v14;
*(_QWORD *)(a3 + 32) = *(_QWORD *)&v44[1] - (*((_DWORD *)*v14 + 10) & 0xFFFFFFF);
v26 = v29[12];
v27 = v29[11];
}
else
{
v38 = 3;
if( (unsigned int)wil_details_FeatureReporting_ReportUsageToServiceDirect(
v19,
v18,
v20,
v21,
wil_details_ServiceReportingKind_PotentialDeviceUsage)
&& g_wil_details_pfnFeatureLoggingHook )
{
g_wil_details_pfnFeatureLoggingHook(
0xE67B5Au,
&Feature_PdttSupport_logged_traits,
0i64,
0,
(const enum wil_ReportingKind *)&v38,
0i64,
0,
1ui64);
}
if( *(_DWORD *)(a3 + 48) )
{
v9 = -1073741811;
goto LABEL_46;
}
v25 = (struct wil_details_FeatureReportingCache *)(*((_DWORD *)*v14 + 10) & 0xFFFFFFF);
*(_QWORD *)(a3 + 32) = *(_QWORD *)&v44[1] - (_QWORD)v25;
v39[0] = 3;
if( (unsigned int)wil_details_FeatureReporting_ReportUsageToServiceDirect(
v25,
v22,
v23,
v24,
wil_details_ServiceReportingKind_PotentialDeviceUsage)
&& g_wil_details_pfnFeatureLoggingHook )
{
g_wil_details_pfnFeatureLoggingHook(
0xE67B5Au,
&Feature_PdttSupport_logged_traits,
0i64,
0,
(const enum wil_ReportingKind *)v39,
0i64,
0,
1ui64);
}
if( *(_DWORD *)(a3 + 48) )
{
v9 = -1073741811;
goto LABEL_46;
}
v26 = *((_DWORD *)*v14 + 12);
v27 = *((_DWORD *)*v14 + 11);
}
v39[2] = v26;
v28 = v27 & 0xFFFFFFF;
if( !v26 )
goto LABEL_25;
v30 = (const VOID *)(*(_QWORD *)(a3 + 32) + v28);
v42 = v30;
v31 = (VOID *)(4i64 * v26);
Source1 = v31;
v32 = -1;
if( (unsigned __int64)v31 <= 0xFFFFFFFF )
v32 = 4 * v26;
v41 = v32;
v9 = (unsigned __int64)v31 > 0xFFFFFFFF ? 0xC0000095 : 0;
if( (unsigned __int64)v31 <= 0xFFFFFFFF )
{
if( v32 )
{
v33 = (unsigned __int64)v30 + v32;
if( v33 > 0x7FFFFFFF0000i64 || v33 < (unsigned __int64)v30 )
MEMORY[0x7FFFFFFF0000] = 0;
}
v9 = WbAlloc(v32);
if( v9 >= 0 )
{
memmove(*(VOID **)(a3 + 40), v30, v32);
LABEL_25:
*(_DWORD *)(a3 + 16) = 1;
}
}
}
}
}
LABEL_46:
*(_DWORD *)(a3 + 20) = v9;
return v9;
}Referenced by:
WbGetInitializedEncryptionSegment