SmcStoreResize
__int64 __fastcall SmcStoreResize(__int64 a1, _DWORD *a2){
UINT64 v3;
struct _PRIVILEGE_SET *NonPaged;
struct EX_RUNDOWN_REF v5;
unsigned __int64 Count;
int v7;
__int64 v8;
ULONG *v9;
unsigned __int64 v10;
bool v11;
_ETHREAD *CurrentThread;
volatile INT64 *v13;
struct _EX_RUNDOWN_REF *v14;
struct _EX_RUNDOWN_REF *v15;
struct _PRIVILEGE_SET *v16;
unsigned __int64 v17;
unsigned __int64 v18;
_DWORD *v19;
_ETHREAD *v20;
_DWORD *v21;
unsigned __int64 v22;
struct _PRIVILEGE_SET *v23;
unsigned __int64 v24;
struct _RTL_BITMAP BitMapHeader;
__int128 v27;
__int64 v28;
BOOL v30;
struct _EX_RUNDOWN_REF *v31;
v3 = (unsigned int)a2[1];
v28 = 0i64;
NonPaged = 0i64;
v30 = 0;
v27 = 0i64;
BitMapHeader = 0i64;
v5.Count = SmcCacheReference(a1, v3).Count;
Count = v5.Count;
if( !v5.Count )
return(unsigned int)-1073741672;
v8 = *(unsigned int *)(v5.Count + 8);
v9 = a2 + 4;
if( a2[4] > (unsigned int)v8 )
{
v7 = -1073741811;
goto LABEL_35;
}
v10 = (unsigned __int64)(v8 + 31) >> 5;
NonPaged = (struct _PRIVILEGE_SET *)SSHSupportAllocateNonPaged((unsigned int)(4 * v10), 0x72436D73u);
if( NonPaged )
{
v11 = (*a2 & 0x100) == 0;
BitMapHeader.SizeOfBitMap = *(_DWORD *)(Count + 8);
BitMapHeader.Buffer = &NonPaged->PrivilegeCount;
if( v11 )
{
RtlClearAllBits(&BitMapHeader);
}
else
{
RtlSetAllBits(&BitMapHeader);
DWORD1(v27) |= 4u;
v28 = 0i64;
*((_QWORD *)&v27 + 1) = NonPaged;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v13 = (volatile INT64 *)(Count + 160);
ExAcquirePushLockExclusiveEx(Count + 160, 0i64);
v14 = (struct _EX_RUNDOWN_REF *)SmcStoreEntryFind(Count, (unsigned int)a2[2], (unsigned int)a2[3]);
v31 = v14;
if( v14 )
{
v30 = ExAcquireRundownProtection(v14 + 2);
if( (*a2 & 0x100) != 0 )
{
v7 = SmcStorePlacementGet(Count, *v9, (__int64)&v27);
if( v7 < 0 )
goto LABEL_30;
v15 = v31;
v16 = NonPaged;
v17 = (unsigned int)v10;
v18 = 0i64;
v19 = (_DWORD *)v31[1].Count;
if( NonPaged > (struct _PRIVILEGE_SET *)((char *)NonPaged + 4 * (unsigned int)v10) )
v17 = 0i64;
if( v17 )
{
do
{
++v18;
*v19 |= v16->PrivilegeCount;
v16 = (struct _PRIVILEGE_SET *)((char *)v16 + 4);
++v19;
}
while( v18 < v17 );
}
}
else
{
v15 = v31;
}
if( (_InterlockedExchangeAdd64(v13, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v13);
KeAbPostRelease((PVOID)v13);
KeLeaveCriticalRegion();
SmStoreResize(a2[3], a2[2], (__int64)&BitMapHeader, a2 + 4, (*a2 >> 8) & 1);
if( (*a2 & 0x100) != 0 || !*v9 )
{
v7 = 0;
LABEL_33:
if( v30 )
ExReleaseRundownProtection(v31 + 2);
goto LABEL_35;
}
v20 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v20 + 242);
ExAcquirePushLockExclusiveEx((UINT64)v13, 0i64);
v21 = (_DWORD *)v15[1].Count;
v22 = (unsigned int)v10;
v23 = NonPaged;
v24 = 0i64;
if( NonPaged > (struct _PRIVILEGE_SET *)((char *)NonPaged + 4 * (unsigned int)v10) )
v22 = 0i64;
if( v22 )
{
do
{
++v24;
*v21 ^= v23->PrivilegeCount;
v23 = (struct _PRIVILEGE_SET *)((char *)v23 + 4);
++v21;
}
while( v24 < v22 );
}
v7 = 0;
}
else
{
v7 = -1073741672;
}
LABEL_30:
if( (_InterlockedExchangeAdd64(v13, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v13);
KeAbPostRelease((PVOID)v13);
KeLeaveCriticalRegion();
goto LABEL_33;
}
v7 = -1073741670;
LABEL_35:
ExReleaseRundownProtection((PEX_RUNDOWN_REF)(32i64 * (a2[1] & 0xF) + a1 + 8));
if( NonPaged )
CmSiFreeMemory(NonPaged);
return(unsigned int)v7;
}Referenced by:
SmcProcessResizeRequest