ExpWnfPopulateStateData

NTSTATUS __stdcall ExpWnfPopulateStateData(_WNF_NAME_INSTANCE *NameInstance){
  unsigned __int64 bf_0; 
  unsigned int MaxStateSize; 
  UINT64 v5; 
  VOID **PoolWithTag; 
  __int64 v7; 
  NTSTATUS v8; 
  NTSTATUS v9; 
  unsigned int v10; 
  unsigned int v11; 
  _EX_RUNDOWN_REF *v12; 
  __int64(__fastcall **ExtensionTable)(__int64 *, NTSTATUS(__stdcall *)(INT64, INT64, INT64, INT64, VOID *, size_t), _WNF_NAME_INSTANCE *); 
  NTSTATUS v14; 
  UINT64 Length; 
  UINT64 ResultLength; 
  _UNICODE_STRING ValueName; 
  unsigned __int64 v18; 
  char v19; 

  bf_0 = NameInstance->StateName._bf_0;
  if( ((bf_0 >> 6) & 0xF) == 5 )
  {
    v12 = (_EX_RUNDOWN_REF *)*(&WheapDeferredInternalLogsEventLock + 53);
    v18 = bf_0 ^ 0x41C64E6DA3BC0074i64;
    ExtensionTable = (__int64(__fastcall **)(__int64 *, NTSTATUS(__stdcall *)(INT64, INT64, INT64, INT64, VOID *, size_t), _WNF_NAME_INSTANCE *))ExGetExtensionTable(*(&WheapDeferredInternalLogsEventLock + 53));
    if( ExtensionTable )
    {
      v14 = ExtensionTable[15]((__int64 *)&v18, ExpWnfPopulateStateDataRemoteCallback, NameInstance);
      ExReleaseExtensionTable(v12);
      if( v14 != -1073741822 )
      {
        if( v14 < 0 )
          return v14;
        return 0;
      }
    }
  }
  if( NameInstance->StateData || !NameInstance->PermanentDataStore )
    return 0;
  MaxStateSize = NameInstance->StateNameInfo.MaxStateSize;
  v5 = MaxStateSize + 16;
  while( 1 )
  {
    PoolWithTag = ExAllocatePoolWithTag(1ui64, v5, 543583831i64);
    if( !PoolWithTag )
      return -1073741670;
    v7 = NameInstance->StateName._bf_0;
    *(_QWORD *)&ValueName.Length = 2228224i64;
    ValueName.Buffer = (wchar_t *)&v19;
    ExpWnfComposeValueName((_WNF_STATE_NAME_STRUCT)v7, &ValueName);
    LODWORD(ResultLength) = MaxStateSize + 16;
    LODWORD(Length) = MaxStateSize + 16;
    v8 = ZwQueryValueKey(
           NameInstance->PermanentDataStore,
           &ValueName,
           KeyValuePartialInformation,
           PoolWithTag,
           Length,
           &ResultLength);
    v9 = v8;
    if( v8 == -1073741772 )
    {
      PoolWithTag[1] = 0i64;
LABEL_9:
      *(_DWORD *)PoolWithTag = 1050884;
      v10 = *((_DWORD *)PoolWithTag + 3);
      *((_DWORD *)PoolWithTag + 1) = MaxStateSize;
      NameInstance->CurrentChangeStamp = v10;
      NameInstance->StateData = (_WNF_STATE_DATA *)PoolWithTag;
      return 0;
    }
    if( v8 != -1073741789 )
      break;
    ExFreePoolWithTag(PoolWithTag, 0x20666E57u);
    v5 = (unsigned int)ResultLength;
    MaxStateSize = ResultLength - 16;
  }
  if( v8 >= 0 )
  {
    if( *((_DWORD *)PoolWithTag + 1) == 3 )
    {
      v11 = *((_DWORD *)PoolWithTag + 2);
      if( v11 >= 4 )
      {
        *((_DWORD *)PoolWithTag + 2) = v11 - 4;
        goto LABEL_9;
      }
    }
    v9 = -1073741823;
  }
  ExFreePoolWithTag(PoolWithTag, 0x20666E57u);
  return v9;
}

Referenced by:

ExpWnfCreateNameInstance