SmKmStoreAdd
NTSTATUS __stdcall SmKmStoreAdd(
_SMKM_STORE_LIST *StoreMgr,
VOID *Store,
_SMKM_STORE_ADD_PARAMS *AddParams,
UINT64 *StoreIdOut){
unsigned int v4;
__int64 v5;
unsigned __int64 v7;
unsigned __int64 v8;
_EX_PUSH_LOCK *v9;
_ETHREAD *v10;
_ETHREAD *v11;
volatile signed __int64 *v12;
__int16 v13;
int v14;
REGHANDLE *v15;
unsigned __int64 v18;
_PRIVILEGE_SET *v19;
unsigned __int64 v20;
unsigned __int64 v21;
_ETHREAD *CurrentThread;
_DWORD *v23;
v4 = 0;
v23 = *(_DWORD **)AddParams;
v5 = 0i64;
do
{
if( !*(_QWORD *)&StoreMgr[2 * v5] )
{
LODWORD(v18) = SSHSupportAllocateNonPaged(1280, 0x61536D73u);
v19 = (_PRIVILEGE_SET *)v18;
if( !v18 )
return -1073741670;
v20 = v18 + 1280;
if( v18 < v18 + 1280 )
{
v21 = v18 + 8;
do
{
*(_OWORD *)(v21 - 8) = 0i64;
*(_OWORD *)(v21 + 8) = 0i64;
*(_QWORD *)(v21 + 24) = 0i64;
ExInitializePushLock((PULONG_PTR)v21);
ExWaitForRundownProtectionRelease((_EX_RUNDOWN_REF *)v21);
*(_QWORD *)(v21 + 8) = 0i64;
v21 += 40i64;
}
while( v21 - 8 < v20 );
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)StoreMgr + 52, 0i64);
if( !*(_QWORD *)&StoreMgr[2 * v5] )
{
*(_QWORD *)&StoreMgr[2 * v5] = v19;
v19 = 0i64;
}
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)StoreMgr + 52, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)StoreMgr + 52);
KeAbPostRelease(StoreMgr + 104);
KeLeaveCriticalRegion();
if( v19 )
CmSiFreeMemory(v19);
}
v7 = *(_QWORD *)&StoreMgr[2 * v5];
v8 = v7 + 1280;
if( v7 >= v7 + 1280 )
goto LABEL_35;
v9 = (_EX_PUSH_LOCK *)(v7 + 16);
while( *(_QWORD *)v7 )
{
LABEL_6:
v7 += 40i64;
v9 += 5;
++v4;
if( v7 >= v8 )
goto LABEL_9;
}
v10 = (_ETHREAD *)KeGetCurrentThread();
--v10->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(v9, 0i64);
if( *(_QWORD *)v7 )
{
if( (_InterlockedExchangeAdd64(&v9->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v9);
KeAbPostRelease(v9);
KeLeaveCriticalRegion();
goto LABEL_6;
}
LABEL_9:
if( v7 < v8 )
break;
LABEL_35:
v5 = (unsigned int)(v5 + 1);
}
while( (unsigned int)v5 < 0x20 );
if( v4 >= 0x400 )
return -1073741671;
v11 = (_ETHREAD *)KeGetCurrentThread();
--v11->Tcb.KernelApcDisable;
v12 = (volatile signed __int64 *)(StoreMgr + 104);
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)StoreMgr + 52, 0i64);
if( (*v23 & 0x100) == 0 )
goto LABEL_12;
if( StoreMgr[108] == -1 )
{
StoreMgr[108] = v4;
LABEL_12:
*(_BYTE *)(v7 + 34) &= ~1u;
*(_BYTE *)(v7 + 34) &= ~2u;
*(_WORD *)(v7 + 32) ^= (*(_WORD *)(v7 + 32) ^ (*v23 >> 18 << 7)) & 0x80;
*(_QWORD *)(v7 + 24) = *((_QWORD *)AddParams + 2);
++StoreMgr[106];
if( (_InterlockedExchangeAdd64(v12, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)StoreMgr + 52);
KeAbPostRelease(StoreMgr + 104);
KeLeaveCriticalRegion();
*(_QWORD *)v7 = Store;
do
{
v13 = *(_WORD *)(v7 + 32) ^ (*(_WORD *)(v7 + 32) ^ (*(_WORD *)(v7 + 32) + 1)) & 0x3F;
*(_WORD *)(v7 + 32) = v13;
v14 = v4 | ((v13 & 0x3F) << 10);
*(_DWORD *)StoreIdOut = v14;
}
while( v14 == 66559 );
v15 = (REGHANDLE *)SmEtwEnabled(SmEtwKeywordStoreOps);
if( v15 )
SmKmEtwLogStoreChange(v15, *(_QWORD *)v7, SmEventStoreCreate);
_InterlockedExchange64((volatile __int64 *)(v7 + 8), 0i64);
ExAcquireRundownProtection((_EX_RUNDOWN_REF *)(v7 + 8));
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v7 + 16), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)(v7 + 16));
KeAbPostRelease((VOID *)(v7 + 16));
KeLeaveCriticalRegion();
return 0;
}
else
{
if( (_InterlockedExchangeAdd64(v12, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)StoreMgr + 52);
KeAbPostRelease(StoreMgr + 104);
KeLeaveCriticalRegion();
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v7 + 16), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)(v7 + 16));
KeAbPostRelease((VOID *)(v7 + 16));
KeLeaveCriticalRegion();
return -1073740757;
}
}Referenced by:
SmProcessCreateRequest