PopBootStatGet

INT64 __fastcall PopBootStatGet(INT64 a1, INT64 rdx0){
  void *PoolWithTag; 
  CHAR v4; 
  INT16 v5; 
  int SetBootStatusData; 
  UINT64 v7; 
  UINT64 v8; 
  __int64 i; 
  _ETHREAD *CurrentThread; 
  __int64 j; 
  __int64 v12; 
  UINT64 BufferSize; 
  UINT64 v15; 
  unsigned int a2; 
  void *FileHandle; 
  int a3; 
  RTL_BSD_ITEM_TYPE DataClass; 
  PVOID P; 
  ULONGLONG pullResult; 
  __int64 v22; 
  void *Src; 
  char v26; 
  pullResult = 0i64;
  LODWORD(v15) = 0;
  a2 = 0;
  a3 = 0;
  PoolWithTag = 0i64;
  FileHandle = 0i64;
  v26 = 0;
  v4 = *((_BYTE *)KeGetCurrentThread() + 562);
  if( v4 )
  {
    SetBootStatusData = RtlULongLongMult(*(unsigned int *)(a1 + 8), 0x18ui64, &pullResult);
    if( SetBootStatusData < 0 )
      goto LABEL_25;
    v7 = pullResult;
    PoolWithTag = ExAllocatePoolWithTag(PagedPool, pullResult, 0x206D654Dui64);
    P = PoolWithTag;
    if( !PoolWithTag )
    {
      SetBootStatusData = -1073741670;
      goto LABEL_25;
    }
    if( v7 )
    {
      v8 = *(_QWORD *)(a1 + 16);
      if( (v8 & 7) != 0 )
        ExRaiseDatatypeMisalignment();
      if( v8 + v7 > 0x7FFFFFFF0000i64 || v8 + v7 < v8 )
        MEMORY[0x7FFFFFFF0000] = 0;
    }
    memmove((UINT8 *)PoolWithTag, *(UINT8 **)(a1 + 16), v7);
    for( i = 0i64; ; i = (unsigned int)(i + 1) )
    {
      HIDWORD(v15) = i;
      if( (unsigned int)i >= *(_DWORD *)(a1 + 8) )
        break;
      v22 = (__int64)PoolWithTag + 24 * i;
      ProbeForWrite(*(VOID **)(v22 + 8), *(unsigned int *)(v22 + 16), 1ui64);
    }
  }
  else
  {
    PoolWithTag = *(void **)(a1 + 16);
    P = PoolWithTag;
  }
  v26 = 1;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockExclusiveEx((UINT64)&PopBootStatLock, 0i64);
  SetBootStatusData = RtlLockBootStatusData(&FileHandle);
  if( SetBootStatusData >= 0 )
  {
    if( !v4 || (SetBootStatusData = PopBootStatAccessCheck(FileHandle, v4, 1ui64), SetBootStatusData >= 0) )
    {
      for( j = 0i64; ; j = (unsigned int)(j + 1) )
      {
        HIDWORD(v15) = j;
        if( (unsigned int)j >= *(_DWORD *)(a1 + 8) )
          break;
        v22 = (__int64)PoolWithTag + 24 * j;
        DataClass = *(_DWORD *)v22;
        SetBootStatusData = RtlBootStatusItemInfo((unsigned int)DataClass, &a2, &a3);
        if( SetBootStatusData < 0 )
          break;
        Src = (char *)PopBootStat + a2;
        LODWORD(BufferSize) = *(_DWORD *)(v12 + 16);
        SetBootStatusData = RtlGetSetBootStatusData(FileHandle, 1u, DataClass, Src, BufferSize, &v15);
        if( SetBootStatusData >= 0 && (_DWORD)v15 )
          memmove(*(UINT8 **)(v22 + 8), (UINT8 *)Src, (unsigned int)v15);
        v5 = rdx0;
        if( rdx0 )
          *(_DWORD *)(rdx0 + 4 * j) = v15;
      }
    }
  }
LABEL_25:
  if( FileHandle )
    RtlUnlockBootStatusData(FileHandle, v5);
  if( v26 )
  {
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&PopBootStatLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)&PopBootStatLock);
    KeAbPostRelease(&PopBootStatLock);
    KeLeaveCriticalRegion();
  }
  if( v4 && PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0);
  return(unsigned int)SetBootStatusData;
}

Referenced by:

PopPowerInformationInternal