SmcStoreResize
NTSTATUS __stdcall SmcStoreResize(_SMC_CACHE_MANAGER *CacheMgr, _SMC_STORE_RESIZE_REQUEST *Request){
UINT64 CacheId;
_PRIVILEGE_SET *v4;
_SMC_CACHE *v5;
_SMC_CACHE *v6;
int v7;
__int64 v8;
unsigned int *p_RegionCount;
unsigned __int64 v10;
unsigned int *v11;
bool v12;
_ETHREAD *CurrentThread;
_EX_PUSH_LOCK *v14;
_SMC_STORE_ENTRY *v15;
_EX_RUNDOWN_REF *v16;
_PRIVILEGE_SET *v17;
unsigned __int64 v18;
unsigned __int64 v19;
_DWORD *Count;
_ETHREAD *v21;
_DWORD *v22;
unsigned __int64 v23;
_PRIVILEGE_SET *v24;
unsigned __int64 v25;
UINT64 AddRegions;
INT64 v28;
_RTL_BITMAP BitMapHeader;
_SMC_STORE_ENTRY TransitionEntry[4];
__int64 v31;
int v33;
_EX_RUNDOWN_REF *v34;
CacheId = Request->CacheId;
v31 = 0i64;
v4 = 0i64;
v33 = 0;
*(_OWORD *)TransitionEntry = 0i64;
BitMapHeader = 0i64;
v5 = SmcCacheReference(CacheMgr, CacheId);
v6 = v5;
if( !v5 )
return -1073741672;
v8 = (unsigned int)v5[2];
p_RegionCount = &Request->RegionCount;
if( Request->RegionCount > (unsigned int)v8 )
{
v7 = -1073741811;
goto LABEL_35;
}
v10 = (unsigned __int64)(v8 + 31) >> 5;
LODWORD(v11) = SSHSupportAllocateNonPaged(4 * v10, 0x72436D73u);
v4 = (_PRIVILEGE_SET *)v11;
if( v11 )
{
v12 = (Request->_bf_0 & 0x100) == 0;
BitMapHeader.SizeOfBitMap = v6[2];
BitMapHeader.Buffer = v11;
if( v12 )
{
RtlClearAllBits(&BitMapHeader);
}
else
{
RtlSetAllBits(&BitMapHeader);
TransitionEntry[1] |= 4u;
v31 = 0i64;
*(_QWORD *)&TransitionEntry[2] = v4;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
v14 = (_EX_PUSH_LOCK *)(v6 + 40);
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)v6 + 20, 0i64);
v15 = SmcStoreEntryFind(v6, Request->StoreId, Request->StoreManagerType);
v34 = (_EX_RUNDOWN_REF *)v15;
if( v15 )
{
v33 = ExAcquireRundownProtection((_EX_RUNDOWN_REF *)v15 + 2);
if( (Request->_bf_0 & 0x100) != 0 )
{
v7 = SmcStorePlacementGet(v6, *p_RegionCount, TransitionEntry);
if( v7 < 0 )
goto LABEL_30;
v16 = v34;
v17 = v4;
v18 = (unsigned int)v10;
v19 = 0i64;
Count = (_DWORD *)v34[1].Count;
if( v4 > (_PRIVILEGE_SET *)((char *)v4 + 4 * (unsigned int)v10) )
v18 = 0i64;
if( v18 )
{
do
{
++v19;
*Count |= v17->PrivilegeCount;
v17 = (_PRIVILEGE_SET *)((char *)v17 + 4);
++Count;
}
while( v19 < v18 );
}
}
else
{
v16 = v34;
}
if( (_InterlockedExchangeAdd64(&v14->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v14);
KeAbPostRelease(v14);
KeLeaveCriticalRegion();
LODWORD(AddRegions) = ((unsigned __int32)Request->_bf_0 >> 8) & 1;
SmStoreResize(
Request->StoreManagerType,
Request->StoreId,
&BitMapHeader,
(UINT64 *)&Request->RegionCount,
AddRegions,
v28,
*(INT64 *)&BitMapHeader.SizeOfBitMap,
(INT64)BitMapHeader.Buffer);
if( (Request->_bf_0 & 0x100) != 0 || !*p_RegionCount )
{
v7 = 0;
LABEL_33:
if( v33 )
ExReleaseRundownProtection(v34 + 2);
goto LABEL_35;
}
v21 = (_ETHREAD *)KeGetCurrentThread();
--v21->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(v14, 0i64);
v22 = (_DWORD *)v16[1].Count;
v23 = (unsigned int)v10;
v24 = v4;
v25 = 0i64;
if( v4 > (_PRIVILEGE_SET *)((char *)v4 + 4 * (unsigned int)v10) )
v23 = 0i64;
if( v23 )
{
do
{
++v25;
*v22 ^= v24->PrivilegeCount;
v24 = (_PRIVILEGE_SET *)((char *)v24 + 4);
++v22;
}
while( v25 < v23 );
}
v7 = 0;
}
else
{
v7 = -1073741672;
}
LABEL_30:
if( (_InterlockedExchangeAdd64(&v14->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v14);
KeAbPostRelease(v14);
KeLeaveCriticalRegion();
goto LABEL_33;
}
v7 = -1073741670;
LABEL_35:
ExReleaseRundownProtection((_EX_RUNDOWN_REF *)&CacheMgr[8 * (Request->CacheId & 0xF) + 2]);
if( v4 )
CmSiFreeMemory(v4);
return v7;
}Referenced by:
SmcProcessResizeRequest