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