PopBootStatGet

NTSTATUS __stdcall PopBootStatGet(INT64 a1, INT64 a2){
  VOID **PoolWithTag; 
  char PreviousMode; 
  NTSTATUS SetBootStatusData; 
  UINT64 v6; 
  UINT64 v7; 
  __int64 i; 
  _ETHREAD *CurrentThread; 
  void *v10; 
  UINT64 v11; 
  __int64 j; 
  __int64 v13; 
  UINT64 DataBufferLength; 
  UINT64 *BytesReturned; 
  UINT64 v17; 
  unsigned int v18; 
  VOID *BootStatusDataHandle; 
  int v20; 
  _RTL_BSD_ITEM_TYPE DataItem; 
  PVOID P; 
  UINT64 pullResult; 
  VOID **v24; 
  VOID *Src; 
  char v28; 

  pullResult = 0i64;
  LODWORD(v17) = 0;
  v18 = 0;
  v20 = 0;
  PoolWithTag = 0i64;
  BootStatusDataHandle = 0i64;
  v28 = 0;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  if( PreviousMode )
  {
    SetBootStatusData = RtlULongLongMult(*(unsigned int *)(a1 + 8), 0x18ui64, &pullResult);
    if( SetBootStatusData < 0 )
      goto LABEL_25;
    v6 = pullResult;
    PoolWithTag = ExAllocatePoolWithTag(1ui64, pullResult, 544040269i64);
    P = PoolWithTag;
    if( !PoolWithTag )
    {
      SetBootStatusData = -1073741670;
      goto LABEL_25;
    }
    if( v6 )
    {
      v7 = *(_QWORD *)(a1 + 16);
      if( (v7 & 7) != 0 )
        ExRaiseDatatypeMisalignment();
      if( v7 + v6 > 0x7FFFFFFF0000i64 || v7 + v6 < v7 )
        MEMORY[0x7FFFFFFF0000] = 0;
    }
    memmove(PoolWithTag, *(const VOID **)(a1 + 16), v6);
    for( i = 0i64; ; i = (unsigned int)(i + 1) )
    {
      HIDWORD(v17) = i;
      if( (unsigned int)i >= *(_DWORD *)(a1 + 8) )
        break;
      v24 = &PoolWithTag[3 * i];
      ProbeForWrite((UINT64)v24[1], *((unsigned int *)v24 + 4), 1i64);
    }
  }
  else
  {
    PoolWithTag = *(VOID ***)(a1 + 16);
    P = PoolWithTag;
  }
  v28 = 1;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx(&PopBootStatLock, 0i64);
  SetBootStatusData = RtlLockBootStatusData(&BootStatusDataHandle);
  if( SetBootStatusData >= 0 )
  {
    if( !PreviousMode
      || (LOBYTE(v10) = PreviousMode,
          SetBootStatusData = PopBootStatAccessCheck(
                                (_DEVICE_NODE *)BootStatusDataHandle,
                                v10,
                                (PWCHAR)1,
                                v11,
                                DataBufferLength,
                                (UINT8 *)BytesReturned),
          SetBootStatusData >= 0) )
    {
      for( j = 0i64; ; j = (unsigned int)(j + 1) )
      {
        HIDWORD(v17) = j;
        if( (unsigned int)j >= *(_DWORD *)(a1 + 8) )
          break;
        v24 = &PoolWithTag[3 * j];
        DataItem = *(_DWORD *)v24;
        SetBootStatusData = RtlBootStatusItemInfo(DataItem, &v18, &v20);
        if( SetBootStatusData < 0 )
          break;
        Src = (char *)&unk_140CED2E0 + v18;
        LODWORD(DataBufferLength) = *(_DWORD *)(v13 + 16);
        SetBootStatusData = RtlGetSetBootStatusData(BootStatusDataHandle, 1u, DataItem, Src, DataBufferLength, &v17);
        if( SetBootStatusData >= 0 && (_DWORD)v17 )
          memmove(v24[1], Src, v17);
        if( a2 )
          *(_DWORD *)(a2 + 4 * j) = v17;
      }
    }
  }
LABEL_25:
  if( BootStatusDataHandle )
    RtlUnlockBootStatusData(BootStatusDataHandle);
  if( v28 )
  {
    if( (_InterlockedExchangeAdd64(&PopBootStatLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(&PopBootStatLock);
    KeAbPostRelease(&PopBootStatLock);
    KeLeaveCriticalRegion();
  }
  if( PreviousMode && PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0);
  return SetBootStatusData;
}

Referenced by:

PopPowerInformationInternal