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