SMKM_STORE_MGR::SmFeAddInitiate
__int64 __fastcall SMKM_STORE_MGR::SmFeAddInitiate(
__int64 a1,
_DWORD *a2,
int er8_0,
unsigned int a4,
unsigned __int64 a5,
__int64 *a6,
char a7){
__int16 v9;
unsigned int v10;
int v11;
volatile signed __int64 *v12;
int v13;
_ETHREAD *CurrentThread;
int v16;
__int64 v17;
unsigned int v18;
unsigned int v19;
unsigned __int64 v20;
__int64 v21;
int v22;
int v23;
int v24;
_ETHREAD *v25;
__int64 SessionId;
unsigned __int8 v27;
int v28;
bool v29;
__int64 v30;
_KLOCK_ENTRY *v31;
__int64 v32;
__int64 v33;
_ETHREAD *v34;
_ETHREAD *v35;
unsigned int v36;
unsigned __int8 v37;
int v38;
__int64 v39;
_KLOCK_ENTRY *v40;
__int64 v41;
NTSTATUS v42;
_ETHREAD *v43;
NTSTATUS v44;
_EX_PUSH_LOCK *v45;
unsigned int v46;
unsigned int v47;
UINT64 v48;
int v49;
int v50;
char a3[12];
int v52;
unsigned int v53;
_LARGE_INTEGER v54;
__int128 v55;
__int16 Object;
char v57;
int v58;
__int64 v59[2];
_DWORD *v60;
__int64 *v61;
unsigned __int64 v62;
__int64 v63[3];
int v64;
int v65;
__int64 v66;
char v67[136];
v62 = a5;
v49 = er8_0;
v9 = a4;
v60 = a2;
v61 = a6;
v53 = a4;
memset(v67, 0i64, 0x80u);
v10 = *a2;
*(_QWORD *)&a3[4] = 0x1000000000000i64;
v11 = a7 & 2;
*(_WORD *)&a3[8] = v9;
v47 = 0;
v12 = (volatile signed __int64 *)(a1 + 440);
v54.QuadPart = 0i64;
v13 = 0;
v63[1] = 0i64;
v63[2] = 0i64;
v66 = 0i64;
v63[0] = (__int64)v67;
v64 = 0;
v65 = 8;
v52 = v11;
if( (a7 & 2) != 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)(a1 + 440), 0i64);
v47 = 2;
}
else if( (a7 & 4) != 0 )
{
if( !(unsigned int)StLockTryAcquireExclusive((VOID *)(a1 + 440), &v47) )
return 3221225557i64;
}
else
{
v34 = (_ETHREAD *)KeGetCurrentThread();
--v34->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)(a1 + 440), 0i64);
v47 = 1;
}
v16 = -1073740682;
while( 1 )
{
B_TREE<_SM_PAGE_KEY,SMKM_STORE_MGR::SMKM_FRONTEND_ENTRY,4096,B_TREE_DUMMY_NODE_POOL,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeSearchKey(
a1 + 448,
v10,
(__int64)v63);
v55 = 0i64;
B_TREE<_SM_PAGE_KEY,SMKM_STORE_MGR::SMKM_FRONTEND_ENTRY,4096,B_TREE_DUMMY_NODE_POOL,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeIteratorFromSearchResult(
v17,
(__int64)&v55,
(__int64)v63);
if( !(_QWORD)v55 )
break;
v20 = *((_QWORD *)&v55 + 1) + 8i64;
v21 = (unsigned __int16)*(_DWORD *)v55 + 2i64;
*((_QWORD *)&v55 + 1) = v20;
if( v20 >= (__int64)v55 + 8 * v21 )
{
v33 = *(_QWORD *)(v55 + 8);
if( v33 )
{
*(_QWORD *)&v55 = *(_QWORD *)(v55 + 8);
*((_QWORD *)&v55 + 1) = v33 + 16;
}
v20 = (v33 + 16) & -(__int64)(v33 != 0);
}
if( !v20 || v18 < *(_DWORD *)v20 && v19 < *(_DWORD *)v20 )
break;
if( (*(_BYTE *)(v20 + 7) & 1) != 0 )
{
v16 = -1073740747;
goto LABEL_38;
}
if( v13 || (a7 & 1) == 0 )
goto LABEL_38;
Object = 0;
v59[1] = (__int64)v59;
v59[0] = (__int64)v59;
*(_QWORD *)(a1 + 1656) = &Object;
v57 = 6;
v58 = 0;
*(_DWORD *)(a1 + 1648) = v10;
if( v11 )
{
if( _InterlockedCompareExchange64(v12, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((_EX_PUSH_LOCK *)(a1 + 440));
KeAbPostRelease((VOID *)(a1 + 440));
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
else
{
if( (_InterlockedExchangeAdd64(v12, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)(a1 + 440));
LODWORD(v48) = 0;
v35 = (_ETHREAD *)KeGetCurrentThread();
v36 = MiGetSystemRegionType(a1 + 440) == 1 ? MmGetSessionIdEx(v35->Tcb.ApcState.Process) : -1;
--v35->Tcb.SpecialApcDisable;
v37 = ++v35->Tcb.AbAllocationRegionCount;
v38 = ((char)v35->Tcb.AbEntrySummary | (char)v35->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
while( 1 )
{
v29 = !_BitScanReverse((unsigned int *)&v39, v38);
HIDWORD(v48) = v39;
if( v29 )
goto LABEL_66;
v40 = &v35->Tcb.LockEntries[v39];
v38 &= ~(1 << v39);
if( (v40->AcquiredByte & 1) != 0
&& (v40->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
&& (v40->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == ((unsigned __int64)v12 & 0x7FFFFFFFFFFFFFFCi64)
&& v40->LockState.SessionId == v36 )
{
v40->AcquiredByte &= ~1u;
if( v40->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
break;
}
}
if( !v40 )
{
LABEL_66:
if( (*(&v35->Tcb.MiscFlags + 1) & 0x10000) == 0 )
KeBugCheckEx(0x162u, v35, (PVOID)(a1 + 440), (PVOID)v36, 0i64);
goto LABEL_78;
}
v40->CrossThreadReleasableAndBusyByte |= 2u;
if( v40->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
KiAbEntryRemoveFromTree(v40);
LODWORD(v48) = 0;
LODWORD(v48) = v40->BoostBitmap.AllFields & 0x1FFFF;
v40->BoostBitmap.AllFields &= 0xFFFE0000;
v40->ThreadLocalFlags &= ~1u;
v40->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
v41 = v40 - v35->Tcb.LockEntries;
if( v37 == 1 )
v35->Tcb.AbEntrySummary |= 1 << v41;
else
_InterlockedOr8((volatile signed __int8 *)&v35->Tcb.AbOrphanedEntrySummary, 1 << v41);
LABEL_78:
--v35->Tcb.AbAllocationRegionCount;
KiAbThreadRemoveBoosts(&v35->Tcb, (VOID *)(a1 + 440), &v48);
v29 = v35->Tcb.SpecialApcDisable++ == -1;
if( v29 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v35->Tcb.ApcState.ApcListHead[0].Flink != &v35->Tcb.152 )
KiCheckForKernelApcDelivery();
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
v11 = v52;
}
v54.QuadPart = -2500000i64;
v42 = KeWaitForSingleObject((UINT64)&Object, 26, 0, 0, (INT64)&v54);
v43 = (_ETHREAD *)KeGetCurrentThread();
v44 = v42;
--v43->Tcb.SpecialApcDisable;
v45 = (_EX_PUSH_LOCK *)(a1 + 440);
if( v11 )
{
ExAcquirePushLockSharedEx(v45, 0i64);
v46 = 2;
}
else
{
ExAcquirePushLockExclusiveEx(v45, 0i64);
v46 = 1;
}
v47 = v46;
*(_QWORD *)(a1 + 1656) = 0i64;
if( v44 )
goto LABEL_38;
v13 = 1;
}
if( v11 )
{
v16 = 0;
}
else
{
v22 = 0;
while( 1 )
{
*(_DWORD *)&a3[4] = v10;
v23 = B_TREE<_SM_PAGE_KEY,SMKM_STORE_MGR::SMKM_FRONTEND_ENTRY,4096,B_TREE_DUMMY_NODE_POOL,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeSearchKey(
a1 + 448,
v10,
(__int64)v63);
v16 = v23;
if( v23 == -1073741275 )
{
v16 = B_TREE<_SM_PAGE_KEY,SMKM_STORE_MGR::SMKM_FRONTEND_ENTRY,4096,B_TREE_DUMMY_NODE_POOL,B_TREE_KEY_COMPARATOR<_SM_PAGE_KEY>>::BTreeInsertEx(
(int **)(a1 + 448),
(UINT64)v63,
&a3[4]);
}
else if( v23 >= 0 )
{
v16 = -1073741484;
}
if( v16 < 0 )
break;
if( ++v22 == v49 )
{
SMKM_STORE_MGR::SmIoCtxQueueWork(v61, a1, v53, v62);
v16 = 0;
goto LABEL_17;
}
++v10;
}
if( v22 )
SMKM_STORE_MGR::SmFeAddComplete(a1, (_DWORD)v60, v22, v24, 2);
}
LABEL_38:
if( v11 )
{
if( _InterlockedCompareExchange64(v12, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((_EX_PUSH_LOCK *)(a1 + 440));
KeAbPostRelease((VOID *)(a1 + 440));
}
else
{
LABEL_17:
if( (_InterlockedExchangeAdd64(v12, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)(a1 + 440));
*(_DWORD *)a3 = 0;
v25 = (_ETHREAD *)KeGetCurrentThread();
if( MiGetSystemRegionType(a1 + 440) == 1 )
SessionId = (unsigned int)MmGetSessionIdEx(v25->Tcb.ApcState.Process);
else
SessionId = 0xFFFFFFFFi64;
--v25->Tcb.SpecialApcDisable;
v27 = ++v25->Tcb.AbAllocationRegionCount;
v28 = ((char)v25->Tcb.AbEntrySummary | (char)v25->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
while( 1 )
{
v29 = !_BitScanReverse((unsigned int *)&v30, v28);
v50 = v30;
if( v29 )
break;
v31 = &v25->Tcb.LockEntries[v30];
v28 &= ~(1 << v30);
if( (v31->AcquiredByte & 1) != 0
&& (v31->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
&& (v31->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == ((unsigned __int64)v12 & 0x7FFFFFFFFFFFFFFCi64)
&& v31->LockState.SessionId == (_DWORD)SessionId )
{
v31->AcquiredByte &= ~1u;
if( v31->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
{
if( v31 )
{
v31->CrossThreadReleasableAndBusyByte |= 2u;
if( v31->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
KiAbEntryRemoveFromTree(v31);
*(_DWORD *)a3 = v31->BoostBitmap.AllFields & 0x1FFFF;
v31->BoostBitmap.AllFields &= 0xFFFE0000;
v31->ThreadLocalFlags &= ~1u;
v31->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
v32 = v31 - v25->Tcb.LockEntries;
if( v27 == 1 )
v25->Tcb.AbEntrySummary |= 1 << v32;
else
_InterlockedOr8((volatile signed __int8 *)&v25->Tcb.AbOrphanedEntrySummary, 1 << v32);
goto LABEL_33;
}
break;
}
}
}
if( (*(&v25->Tcb.MiscFlags + 1) & 0x10000) == 0 )
KeBugCheckEx(0x162u, v25, (PVOID)v12, (PVOID)SessionId, 0i64);
LABEL_33:
--v25->Tcb.AbAllocationRegionCount;
KiAbThreadRemoveBoosts(&v25->Tcb, (VOID *)v12, (UINT64 *)a3);
v29 = v25->Tcb.SpecialApcDisable++ == -1;
if( v29 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v25->Tcb.ApcState.ApcListHead[0].Flink != &v25->Tcb.152 )
KiCheckForKernelApcDelivery();
}
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
return(unsigned int)v16;
}
Referenced by:
No references.