PopBootStatSet

NTSTATUS __stdcall PopBootStatSet(INT64 a1, INT64 a2){
  VOID **PoolWithTag; 
  char PreviousMode; 
  _ETHREAD *CurrentThread; 
  void *v6; 
  NTSTATUS SetBootStatusData; 
  UINT64 v8; 
  __int64 j; 
  char v10; 
  __int64 v12; 
  char *v13; 
  UINT64 v14; 
  UINT64 v15; 
  __int64 i; 
  int *v17; 
  __int64 v18; 
  unsigned __int64 v19; 
  unsigned __int64 v20; 
  UINT64 DataBufferLength; 
  UINT64 *BytesReturned; 
  size_t Size; 
  int v24; 
  unsigned int v25; 
  char v26[12]; 
  VOID **v27; 
  UINT64 pullResult; 
  int *v29; 
  char v31; 

  pullResult = 0i64;
  memset(v26, 0, sizeof(v26));
  v25 = 0;
  Size = 0;
  PoolWithTag = 0i64;
  v31 = 0;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  if( PreviousMode )
  {
    SetBootStatusData = RtlULongLongMult(*(unsigned int *)(a1 + 8), 0x18ui64, &pullResult);
    if( SetBootStatusData < 0 )
      goto LABEL_7;
    v14 = pullResult;
    PoolWithTag = ExAllocatePoolWithTag(1ui64, pullResult, 544040269i64);
    v27 = PoolWithTag;
    if( !PoolWithTag )
    {
      SetBootStatusData = -1073741670;
      goto LABEL_7;
    }
    if( v14 )
    {
      v15 = *(_QWORD *)(a1 + 16);
      if( (v15 & 7) != 0 )
        ExRaiseDatatypeMisalignment();
      if( v15 + v14 > 0x7FFFFFFF0000i64 || v15 + v14 < v15 )
        MEMORY[0x7FFFFFFF0000] = 0;
    }
    memmove(PoolWithTag, *(const VOID **)(a1 + 16), v14);
    for( i = 0i64; ; i = (unsigned int)(i + 1) )
    {
      v24 = i;
      if( (unsigned int)i >= *(_DWORD *)(a1 + 8) )
        break;
      v17 = (int *)&PoolWithTag[3 * i];
      v29 = v17;
      v18 = (unsigned int)v17[4];
      if( (_DWORD)v18 )
      {
        v19 = *((_QWORD *)v17 + 1);
        v20 = v19 + v18;
        if( v20 > 0x7FFFFFFF0000i64 || v20 < v19 )
          MEMORY[0x7FFFFFFF0000] = 0;
      }
    }
  }
  else
  {
    PoolWithTag = *(VOID ***)(a1 + 16);
    v27 = PoolWithTag;
  }
  v31 = 1;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx(&PopBootStatLock, 0i64);
  SetBootStatusData = RtlLockBootStatusData((VOID **)&v26[4]);
  if( SetBootStatusData >= 0 )
  {
    if( !PreviousMode
      || (LOBYTE(v6) = PreviousMode,
          SetBootStatusData = PopBootStatAccessCheck(
                                *(_DEVICE_NODE **)&v26[4],
                                v6,
                                (PWCHAR)2,
                                v8,
                                DataBufferLength,
                                (UINT8 *)BytesReturned),
          SetBootStatusData >= 0) )
    {
      for( j = 0i64; ; j = (unsigned int)(j + 1) )
      {
        v24 = j;
        if( (unsigned int)j >= *(_DWORD *)(a1 + 8) )
          break;
        v29 = (int *)&PoolWithTag[3 * j];
        SetBootStatusData = RtlBootStatusItemInfo(*v29, &v25, &Size);
        if( SetBootStatusData < 0 )
          break;
        if( *(_DWORD *)(v12 + 16) < Size )
        {
          SetBootStatusData = -1073741811;
          break;
        }
        v13 = (char *)&unk_140CED2E0 + v25;
        memmove(v13, *(const VOID **)(v12 + 8), Size);
        LODWORD(DataBufferLength) = Size;
        SetBootStatusData = RtlGetSetBootStatusData(*(VOID **)&v26[4], 0, *v29, v13, DataBufferLength, (UINT64 *)v26);
        if( a2 )
          *(_DWORD *)(a2 + 4 * j) = *(_DWORD *)v26;
      }
    }
  }
LABEL_7:
  if( *(_QWORD *)&v26[4] )
    RtlUnlockBootStatusData(*(VOID **)&v26[4]);
  if( v31 )
  {
    v10 = _InterlockedExchangeAdd64(&PopBootStatLock._bf_0, 0xFFFFFFFFFFFFFFFFui64);
    if( (v10 & 2) != 0 && (v10 & 4) == 0 )
      ExfTryToWakePushLock(&PopBootStatLock);
    KeAbPostRelease(&PopBootStatLock);
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
  }
  if( PreviousMode && PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0);
  return SetBootStatusData;
}

Referenced by:

PopPowerInformationInternal