PopBootStatCheckIntegrity
NTSTATUS __stdcall PopBootStatCheckIntegrity(INT64 a1){
VOID **PoolWithTag;
char PreviousMode;
int v4;
UINT64 v5;
UINT64 v6;
__int64 i;
_ETHREAD *CurrentThread;
void *v9;
UINT64 v10;
UINT8 v12;
VOID *BootStatusDataHandle;
VOID **v14;
UINT64 pullResult;
VOID **v16;
char v17;
pullResult = 0i64;
PoolWithTag = 0i64;
BootStatusDataHandle = 0i64;
v17 = 0;
PreviousMode = KeGetCurrentThread()->PreviousMode;
if( PreviousMode )
{
v4 = RtlULongLongMult(*(unsigned int *)(a1 + 8), 0x18ui64, &pullResult);
if( v4 < 0 )
goto LABEL_23;
v5 = pullResult;
PoolWithTag = ExAllocatePoolWithTag(1ui64, pullResult, 544040269i64);
v14 = PoolWithTag;
if( !PoolWithTag )
{
v4 = -1073741670;
goto LABEL_23;
}
if( v5 )
{
v6 = *(_QWORD *)(a1 + 16);
if( (v6 & 7) != 0 )
ExRaiseDatatypeMisalignment();
if( v6 + v5 > 0x7FFFFFFF0000i64 || v6 + v5 < v6 )
MEMORY[0x7FFFFFFF0000] = 0;
}
memmove(PoolWithTag, *(const VOID **)(a1 + 16), v5);
for( i = 0i64; ; i = (unsigned int)(i + 1) )
{
v12 = i;
if( (unsigned int)i >= *(_DWORD *)(a1 + 8) )
break;
v16 = &PoolWithTag[3 * i];
ProbeForWrite((UINT64)v16[1], *((unsigned int *)v16 + 4), 1i64);
}
}
else
{
PoolWithTag = *(VOID ***)(a1 + 16);
v14 = PoolWithTag;
}
v17 = 1;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&PopBootStatLock, 0i64);
v4 = RtlLockBootStatusData(&BootStatusDataHandle);
if( v4 >= 0 )
{
if( !PreviousMode
|| (LOBYTE(v9) = PreviousMode,
v4 = PopBootStatAccessCheck(
(_DEVICE_NODE *)BootStatusDataHandle,
v9,
(PWCHAR)1,
v10,
v12,
(UINT8 *)BootStatusDataHandle),
v4 >= 0) )
{
v4 = RtlCheckBootStatusIntegrity((_HANDLE)BootStatusDataHandle);
if( v4 >= 0 )
{
if( *((_DWORD *)PoolWithTag + 4) )
*(_BYTE *)PoolWithTag[1] = 0;
else
v4 = -1073741811;
}
}
}
LABEL_23:
if( BootStatusDataHandle )
RtlUnlockBootStatusData(BootStatusDataHandle);
if( v17 )
{
if( (_InterlockedExchangeAdd64(&PopBootStatLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&PopBootStatLock);
KeAbPostRelease(&PopBootStatLock);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}
if( PreviousMode && PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0);
return v4;
}Referenced by:
PopPowerInformationInternal