PopBootStatSet

INT64 __fastcall PopBootStatSet(INT64 a1, INT64 rdx0){
  UINT8 *PoolWithTag; 
  CHAR v4; 
  _ETHREAD *CurrentThread; 
  INT16 v6; 
  int SetBootStatusData; 
  __int64 j; 
  char v9; 
  __int64 v11; 
  UINT8 *v12; 
  UINT64 v13; 
  UINT64 v14; 
  __int64 i; 
  RTL_BSD_ITEM_TYPE *v16; 
  __int64 v17; 
  unsigned __int64 v18; 
  unsigned __int64 v19; 
  UINT64 BufferSize; 
  unsigned int Size; 
  int Size_4; 
  unsigned int a2; 
  ULONG v24; 
  void *FileHandle; 
  UINT8 *v26; 
  ULONGLONG pullResult; 
  RTL_BSD_ITEM_TYPE *v28; 
  char v30; 
  pullResult = 0i64;
  v24 = 0;
  a2 = 0;
  Size = 0;
  PoolWithTag = 0i64;
  FileHandle = 0i64;
  v30 = 0;
  v4 = *((_BYTE *)KeGetCurrentThread() + 562);
  if( v4 )
  {
    SetBootStatusData = RtlULongLongMult(*(unsigned int *)(a1 + 8), 0x18ui64, &pullResult);
    if( SetBootStatusData < 0 )
      goto LABEL_7;
    v13 = pullResult;
    PoolWithTag = (UINT8 *)ExAllocatePoolWithTag(PagedPool, pullResult, 0x206D654Dui64);
    v26 = PoolWithTag;
    if( !PoolWithTag )
    {
      SetBootStatusData = -1073741670;
      goto LABEL_7;
    }
    if( v13 )
    {
      v14 = *(_QWORD *)(a1 + 16);
      if( (v14 & 7) != 0 )
        ExRaiseDatatypeMisalignment();
      if( v14 + v13 > 0x7FFFFFFF0000i64 || v14 + v13 < v14 )
        MEMORY[0x7FFFFFFF0000] = 0;
    }
    memmove(PoolWithTag, *(UINT8 **)(a1 + 16), v13);
    for( i = 0i64; ; i = (unsigned int)(i + 1) )
    {
      Size_4 = i;
      if( (unsigned int)i >= *(_DWORD *)(a1 + 8) )
        break;
      v16 = (RTL_BSD_ITEM_TYPE *)&PoolWithTag[24 * i];
      v28 = v16;
      v17 = *((unsigned int *)v16 + 4);
      if( (_DWORD)v17 )
      {
        v18 = *((_QWORD *)v16 + 1);
        v19 = v18 + v17;
        if( v19 > 0x7FFFFFFF0000i64 || v19 < v18 )
          MEMORY[0x7FFFFFFF0000] = 0;
      }
    }
  }
  else
  {
    PoolWithTag = *(UINT8 **)(a1 + 16);
    v26 = PoolWithTag;
  }
  v30 = 1;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockExclusiveEx((UINT64)&PopBootStatLock, 0i64);
  SetBootStatusData = RtlLockBootStatusData(&FileHandle);
  if( SetBootStatusData >= 0 )
  {
    if( !v4 || (SetBootStatusData = PopBootStatAccessCheck(FileHandle, v4, 2ui64), SetBootStatusData >= 0) )
    {
      for( j = 0i64; ; j = (unsigned int)(j + 1) )
      {
        Size_4 = j;
        if( (unsigned int)j >= *(_DWORD *)(a1 + 8) )
          break;
        v28 = (RTL_BSD_ITEM_TYPE *)&PoolWithTag[24 * j];
        SetBootStatusData = RtlBootStatusItemInfo(*(unsigned int *)v28, &a2, &Size);
        if( SetBootStatusData < 0 )
          break;
        if( *(_DWORD *)(v11 + 16) < Size )
        {
          SetBootStatusData = -1073741811;
          break;
        }
        v12 = (UINT8 *)PopBootStat + a2;
        memmove(v12, *(UINT8 **)(v11 + 8), Size);
        LODWORD(BufferSize) = Size;
        SetBootStatusData = RtlGetSetBootStatusData(FileHandle, 0, *v28, v12, BufferSize, (UINT64 *)&v24);
        v6 = rdx0;
        if( rdx0 )
          *(_DWORD *)(rdx0 + 4 * j) = v24;
      }
    }
  }
LABEL_7:
  if( FileHandle )
    RtlUnlockBootStatusData(FileHandle, v6);
  if( v30 )
  {
    v9 = _InterlockedExchangeAdd64((volatile signed __int64 *)&PopBootStatLock, 0xFFFFFFFFFFFFFFFFui64);
    if( (v9 & 2) != 0 && (v9 & 4) == 0 )
      ExfTryToWakePushLock((volatile INT64 *)&PopBootStatLock);
    KeAbPostRelease(&PopBootStatLock);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  }
  if( v4 && PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0);
  return(unsigned int)SetBootStatusData;
}

Referenced by:

PopPowerInformationInternal