SMKM_STORE::SmStCleanup
void __fastcall SMKM_STORE::SmStCleanup(__int64 a1){
VOID *v2;
char v3;
void *v4;
_ETHREAD *CurrentThread;
_ETHREAD *v6;
unsigned int SessionId;
unsigned __int8 v8;
int v9;
bool v10;
__int64 v11;
_KLOCK_ENTRY *v12;
__int64 v13;
char v14;
char v15;
void *v16;
void *v17;
void **v18;
char a3[52];
*(_BYTE *)(a1 + 6021) |= 1u;
v2 = *(VOID **)(a1 + 6200);
memset(&a3[4], 0, 48);
if( v2 )
{
KeSetEvent((PRKEVENT)(a1 + 6152), 0, 1u);
KeWaitForSingleObject(*(_QWORD *)(a1 + 6200), 0, 0, 0, 0i64);
v2 = *(VOID **)(a1 + 6200);
}
if( v2 )
ObfDereferenceObjectWithTag(v2, 0x746C6644ui64);
SmKmStoreHelperCheckWaitCommand((_SMKM_STORE_HELPER *)(a1 + 6232), 1ui64);
v3 = *(_BYTE *)(a1 + 6021);
if( (v3 & 4) != 0 )
{
if( *(_QWORD *)(a1 + 6488) )
{
KeSetEvent((PRKEVENT)(a1 + 6496), 0, 0);
KeWaitForSingleObject(*(_QWORD *)(a1 + 6488), 0, 0, 0, 0i64);
ObfDereferenceObjectWithTag(*(VOID **)(a1 + 6488), 0x746C6644ui64);
v3 = *(_BYTE *)(a1 + 6021);
}
if( (v3 & 4) != 0 )
{
v4 = *(void **)(a1 + 6584);
if( v4 )
{
KiStackAttachProcess(v4, 0i64, (_KAPC_STATE *)&a3[4]);
v3 = *(_BYTE *)(a1 + 6021);
}
if( (v3 & 4) != 0 && *(_QWORD *)(a1 + 6568) )
{
v18 = *(void ***)(a1 + 6568);
if( *v18 )
SC_ENV::Free(*v18);
ExFreePoolWithTag(v18, 0);
}
}
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
SMKM_STORE::SmStAcquireStoreLockExclusive(a1);
ST_STORE::StCleanup(a1);
if( (*(_BYTE *)(a1 + 6021) & 4) != 0 )
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 6024), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)(a1 + 6024));
*(_DWORD *)a3 = 0;
v6 = (_ETHREAD *)KeGetCurrentThread();
if( MiGetSystemRegionType(a1 + 6024) == 1 )
SessionId = MmGetSessionIdEx(v6->Tcb.ApcState.Process);
else
SessionId = -1;
--v6->Tcb.SpecialApcDisable;
v8 = ++v6->Tcb.AbAllocationRegionCount;
v9 = ((char)v6->Tcb.AbEntrySummary | (char)v6->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
while( 1 )
{
v10 = !_BitScanReverse((unsigned int *)&v11, v9);
if( v10 )
break;
v12 = &v6->Tcb.LockEntries[v11];
v9 &= ~(1 << v11);
if( (v12->AcquiredByte & 1) != 0
&& (v12->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
&& (v12->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == ((a1 + 6024) & 0x7FFFFFFFFFFFFFFCi64)
&& v12->LockState.SessionId == SessionId )
{
v12->AcquiredByte &= ~1u;
if( v12->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
{
if( v12 )
{
v12->CrossThreadReleasableAndBusyByte |= 2u;
if( v12->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
KiAbEntryRemoveFromTree(v12);
*(_DWORD *)a3 = v12->BoostBitmap.AllFields & 0x1FFFF;
v12->BoostBitmap.AllFields &= 0xFFFE0000;
v12->ThreadLocalFlags &= ~1u;
v12->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
v13 = v12 - v6->Tcb.LockEntries;
if( v8 == 1 )
v6->Tcb.AbEntrySummary |= 1 << v13;
else
_InterlockedOr8((volatile signed __int8 *)&v6->Tcb.AbOrphanedEntrySummary, 1 << v13);
goto LABEL_30;
}
break;
}
}
}
if( (*(&v6->Tcb.MiscFlags + 1) & 0x10000) == 0 )
KeBugCheckEx(0x162u, v6, (PVOID)(a1 + 6024), (PVOID)SessionId, 0i64);
LABEL_30:
--v6->Tcb.AbAllocationRegionCount;
KiAbThreadRemoveBoosts(&v6->Tcb, (VOID *)(a1 + 6024), (UINT64 *)a3);
v10 = v6->Tcb.SpecialApcDisable++ == -1;
if( v10 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v6->Tcb.ApcState.ApcListHead[0].Flink != &v6->Tcb.152 )
KiCheckForKernelApcDelivery();
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
KeLeaveCriticalRegionThread(KeGetCurrentThread());
v14 = *(_BYTE *)(a1 + 6021);
if( (v14 & 4) != 0 && *(_QWORD *)(a1 + 6584) )
{
KiUnstackDetachProcess((_KAPC_STATE *)&a3[4], 0i64);
v14 = *(_BYTE *)(a1 + 6021);
}
v15 = *(_BYTE *)(a1 + 6020);
if( v15 )
{
if( v15 == 1 )
SmKmFileInfoCleanup((_SMKM_FILE_INFO *)(a1 + 6216));
}
else
{
v16 = *(void **)(a1 + 6216);
if( (v14 & 4) != 0 )
{
v17 = *(void **)(a1 + 6224);
if( v17 )
ExFreePoolWithTag(v17, 0);
SmKmStoreHelperCleanup((_SMKM_STORE_HELPER *)(a1 + 6232));
SmKmStoreHelperCleanup((_SMKM_STORE_HELPER *)(a1 + 6360));
}
if( v16 )
ExFreePoolWithTag(v16, 0);
}
SmFpCleanup((_SM_FORWARD_PROGRESS_CTX *)(a1 + 6608));
if( (*(_BYTE *)(a1 + 6021) & 0x10) != 0 )
SmAcquireReleaseCharges(*(unsigned int *)(a1 + 6208), 1ui64, 1ui64);
}
Referenced by:
No references.