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