ExpWnfPopulateStateData
INT64 __fastcall ExpWnfPopulateStateData(_WNF_NAME_INSTANCE *NameInstance){
_WNF_STATE_NAME_STRUCT StateName;
unsigned int MaxStateSize;
UINT64 v5;
_WNF_STATE_DATA *PoolWithTag;
_WNF_STATE_NAME_STRUCT v7;
NTSTATUS v8;
unsigned int v9;
unsigned int ChangeStamp;
unsigned int DataSize;
EX_RUNDOWN_REF *v12;
UINT64 ExtensionTable;
int v14;
ULONG ResultLength;
struct _UNICODE_STRING ValueName;
__int64 v17;
char v18;
StateName = NameInstance->StateName;
if( ((*(unsigned __int64 *)&StateName >> 6) & 0xF) == 5 )
{
v12 = ExpCrossVmIntExtensionHostGuest;
v17 = *(_QWORD *)&StateName ^ 0x41C64E6DA3BC0074i64;
ExtensionTable = ExGetExtensionTable(ExpCrossVmIntExtensionHostGuest);
if( ExtensionTable )
{
v14 = (*(__int64(__fastcall **)(__int64 *, INT64(__fastcall *)(INT64, INT64, INT64, INT64, VOID *, size_t), _WNF_NAME_INSTANCE *))(ExtensionTable + 120))(
&v17,
ExpWnfPopulateStateDataRemoteCallback,
NameInstance);
ExReleaseExtensionTable(v12);
if( v14 != -1073741822 )
{
if( v14 < 0 )
return(unsigned int)v14;
return 0i64;
}
}
}
if( NameInstance->StateData || !NameInstance->PermanentDataStore )
return 0i64;
MaxStateSize = NameInstance->StateNameInfo.MaxStateSize;
v5 = MaxStateSize + 16;
while( 1 )
{
PoolWithTag = (_WNF_STATE_DATA *)ExAllocatePoolWithTag(PagedPool, v5, 0x20666E57ui64);
if( !PoolWithTag )
return 3221225626i64;
v7 = NameInstance->StateName;
*(_QWORD *)&ValueName.Length = 2228224i64;
ValueName.Buffer = (wchar_t *)&v18;
ExpWnfComposeValueName(v7, &ValueName);
ResultLength = MaxStateSize + 16;
v8 = ZwQueryValueKey(
NameInstance->PermanentDataStore,
&ValueName,
KeyValuePartialInformation,
PoolWithTag,
MaxStateSize + 16,
&ResultLength);
v9 = v8;
if( v8 == -1073741772 )
{
*(_QWORD *)&PoolWithTag->DataSize = 0i64;
LABEL_9:
PoolWithTag->Header = (_WNF_NODE_HEADER)1050884;
ChangeStamp = PoolWithTag->ChangeStamp;
PoolWithTag->AllocatedSize = MaxStateSize;
NameInstance->CurrentChangeStamp = ChangeStamp;
NameInstance->StateData = PoolWithTag;
return 0i64;
}
if( v8 != -1073741789 )
break;
ExFreePoolWithTag(PoolWithTag, 0x20666E57u);
v5 = ResultLength;
MaxStateSize = ResultLength - 16;
}
if( v8 >= 0 )
{
if( PoolWithTag->AllocatedSize == 3 )
{
DataSize = PoolWithTag->DataSize;
if( DataSize >= 4 )
{
PoolWithTag->DataSize = DataSize - 4;
goto LABEL_9;
}
}
v9 = -1073741823;
}
ExFreePoolWithTag(PoolWithTag, 0x20666E57u);
return v9;
}Referenced by:
ExpWnfCreateNameInstance