wil_details_StagingConfig_Load
NTSTATUS __stdcall wil_details_StagingConfig_Load(INT64 a1, INT64 a2, INT64 a3, CHAR *a4){
int v4;
int v7;
__int64 v8;
VOID **PoolWithTag;
_WNF_STATE_NAME v10;
UINT64 v11;
unsigned __int64 v12;
NTSTATUS v13;
NTSTATUS v14;
unsigned __int64 v15;
UINT64 v16;
NTSTATUS result;
unsigned __int64 v18;
__int64 v19;
__int64 v20;
int v21;
_WNF_STATE_NAME v22;
int v23;
int v24;
int v25;
UINT64 ChangeStamp;
UINT64 BufferSize;
_WNF_STATE_NAME v28;
_WNF_STATE_NAME StateName;
v4 = a2;
v28.Data[0] = a2;
BufferSize = (UINT64)a4;
memset((VOID *)(a1 + 8), 0i64, 0x50u);
v7 = 0;
*(_DWORD *)a1 = v4;
*(_DWORD *)(a1 + 4) = 0;
v8 = 200i64;
PoolWithTag = 0i64;
v10 = (_WNF_STATE_NAME)_WIL_WNF_WIL_USER_FEATURE_STORE;
v11 = 0i64;
v12 = -(__int64)(a4 != 0i64) & 0xC8;
if( !v28.Data[0] )
v10 = (_WNF_STATE_NAME)_WIL_WNF_WIL_MACHINE_FEATURE_STORE;
StateName = v10;
LODWORD(ChangeStamp) = a4 != 0i64 ? 0xC8 : 0;
v13 = ZwQueryWnfStateData(&StateName, 0i64, 0i64, (UINT64 *)(a1 + 8), a4, &ChangeStamp);
v14 = v13;
if( !v13 )
{
v11 = BufferSize;
if( !BufferSize )
goto LABEL_15;
}
while( v13 == -1073741789 )
{
LABEL_15:
if( v12 < 0xC8 )
v12 = 200i64;
v18 = v12;
v12 = (unsigned int)ChangeStamp;
if( v18 >= (unsigned int)ChangeStamp )
v12 = v18;
if( v12 < 0x10 )
v12 = 16i64;
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0x4C4957u);
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, v12, 4999511i64);
if( !PoolWithTag )
return -1073741670;
LODWORD(ChangeStamp) = v12;
v13 = ZwQueryWnfStateData(&StateName, 0i64, 0i64, (UINT64 *)(a1 + 8), PoolWithTag, &ChangeStamp);
v14 = v13;
v11 = (UINT64)PoolWithTag;
}
if( v14 || !v11 )
{
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0x4C4957u);
return v14;
}
else
{
v15 = (unsigned int)ChangeStamp;
if( (unsigned int)ChangeStamp > 4 )
*(_BYTE *)(a1 + 12) = *(_BYTE *)v11;
if( (unsigned int)v15 >= 0x10
&& *(_BYTE *)(a1 + 12) == 2
&& (v19 = *(unsigned __int16 *)(v11 + 2), (unsigned __int16)v19 >= 0x10u)
&& (v20 = *(unsigned __int16 *)(v11 + 4),
v15 >= v19 + 16 * (unsigned __int64)*(unsigned __int16 *)(v11 + 6) + 12 * v20) )
{
HIDWORD(ChangeStamp) = 0;
v21 = 0;
if( (_WORD)v20 )
{
v22 = (_WNF_STATE_NAME)_WIL_WNF_WIL_USER_FEATURE_STORE_MODIFIED;
if( !v28.Data[0] )
v22 = (_WNF_STATE_NAME)_WIL_WNF_WIL_MACHINE_FEATURE_STORE_MODIFIED;
v28 = v22;
LODWORD(BufferSize) = 0;
ZwQueryWnfStateData(&v28, 0i64, 0i64, (UINT64 *)((char *)&ChangeStamp + 4), 0i64, &BufferSize);
LODWORD(v15) = ChangeStamp;
v21 = HIDWORD(ChangeStamp);
}
*(_QWORD *)(a1 + 24) = v11;
*(_QWORD *)(a1 + 32) = v11 + 16;
*(_QWORD *)(a1 + 40) = v11 + 16 + 12i64 * *(unsigned __int16 *)(v11 + 4);
*(_DWORD *)(a1 + 48) = v21 != 0;
if( *(_BYTE *)v11 == 2 && *(_BYTE *)(v11 + 1) < 2u )
{
v23 = 16 * *(unsigned __int16 *)(v11 + 6);
v24 = 3 * *(unsigned __int16 *)(v11 + 4);
v25 = *(unsigned __int16 *)(v11 + 2);
*(_DWORD *)(a1 + 16) = 1;
LODWORD(v15) = v25 + v23 + 4 * v24;
}
}
else
{
LODWORD(ChangeStamp) = 16;
*(_OWORD *)v11 = 0i64;
*(_DWORD *)v11 = 1049090;
LODWORD(v15) = ChangeStamp;
*(_QWORD *)(a1 + 24) = v11;
v16 = v11 + *(unsigned __int16 *)(v11 + 2);
*(_QWORD *)(a1 + 32) = v16;
*(_QWORD *)(a1 + 40) = v16 + 12i64 * *(unsigned __int16 *)(v11 + 4);
}
*(_QWORD *)(a1 + 64) = (unsigned int)v15;
if( PoolWithTag )
v8 = v12;
*(_QWORD *)(a1 + 56) = v11;
*(_QWORD *)(a1 + 72) = v8;
LOBYTE(v7) = v11 == (_QWORD)PoolWithTag;
result = 0;
*(_DWORD *)(a1 + 80) = v7;
}
return result;
}Referenced by:
wil_StagingConfig_QueryFeatureState