SMKM_STORE_MGR::SmFeAddInitiate
__int64 __fastcall SMKM_STORE_MGR::SmFeAddInitiate(
__int64 a1,
unsigned int *a2,
int a3,
unsigned int a4,
__int64 a5,
_ETHREAD *a6,
char a7){
__int16 v9;
unsigned int v10;
int v11;
__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;
__int64 v24;
_ETHREAD *v25;
ULONG_PTR SessionId;
char v27;
int v28;
bool v29;
__int64 v30;
unsigned __int64 v31;
__int64 v32;
__int64 v33;
_ETHREAD *v34;
_ETHREAD *v35;
unsigned int v36;
char v37;
int v38;
__int64 v39;
unsigned __int64 v40;
__int64 v41;
NTSTATUS v42;
_ETHREAD *v43;
NTSTATUS v44;
UINT64 v45;
unsigned int v46;
unsigned int v47;
unsigned int v48[2];
int v49;
int v50;
int v51;
__int64 v52;
int v53;
unsigned int v54;
union _LARGE_INTEGER Timeout;
__int128 v56;
__int16 Object;
char v58;
int v59;
__int64 v60[2];
unsigned int *v61;
_ETHREAD *v62;
__int64 v63;
__int64 v64[3];
int v65;
int v66;
__int64 v67;
INT64 result[17];
v63 = a5;
v49 = a3;
v9 = a4;
v61 = a2;
v62 = a6;
v54 = a4;
memset((INT64)result, 0i64);
v10 = *a2;
v52 = 0x1000000000000i64;
v11 = a7 & 2;
WORD2(v52) = v9;
v47 = 0;
v12 = a1 + 440;
Timeout.QuadPart = 0i64;
v13 = 0;
v64[1] = 0i64;
v64[2] = 0i64;
v67 = 0i64;
v64[0] = (__int64)result;
v65 = 0;
v66 = 8;
v53 = v11;
if( (a7 & 2) != 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockSharedEx(a1 + 440, 0i64);
v47 = 2;
}
else if( (a7 & 4) != 0 )
{
if( !(unsigned int)StLockTryAcquireExclusive((struct VLOCK *)(a1 + 440), &v47) )
return 3221225557i64;
}
else
{
v34 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v34 + 243);
ExAcquirePushLockExclusiveEx(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)v64);
v56 = 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)&v56,
(__int64)v64);
if( !(_QWORD)v56 )
break;
v20 = *((_QWORD *)&v56 + 1) + 8i64;
v21 = (unsigned __int16)*(_DWORD *)v56 + 2i64;
*((_QWORD *)&v56 + 1) = v20;
if( v20 >= (__int64)v56 + 8 * v21 )
{
v33 = *(_QWORD *)(v56 + 8);
if( v33 )
{
*(_QWORD *)&v56 = *(_QWORD *)(v56 + 8);
*((_QWORD *)&v56 + 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;
v60[1] = (__int64)v60;
v60[0] = (__int64)v60;
*(_QWORD *)(a1 + 1656) = &Object;
v58 = 6;
v59 = 0;
*(_DWORD *)(a1 + 1648) = v10;
if( v11 )
{
if( _InterlockedCompareExchange64((volatile signed __int64 *)v12, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(a1 + 440));
KeAbPostRelease((PVOID)(a1 + 440));
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
else
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v12, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(a1 + 440));
v48[0] = 0;
v35 = (_ETHREAD *)KeGetCurrentThread();
v36 = (unsigned int)MiGetSystemRegionType(a1 + 440) == 1 ? MmGetSessionIdEx(*((_QWORD *)v35 + 23)) : -1;
--*((_WORD *)v35 + 243);
v37 = ++*((_BYTE *)v35 + 794);
v38 = (*((char *)v35 + 792) | *((char *)v35 + 870)) ^ 0x3F;
while( 1 )
{
v29 = !_BitScanReverse((unsigned int *)&v39, v38);
v48[1] = v39;
if( v29 )
goto LABEL_66;
v40 = *((_QWORD *)v35 + 100) + 96 * v39;
v38 &= ~(1 << v39);
if( (*(_BYTE *)(v40 + 26) & 1) != 0
&& (*(_DWORD *)(v40 + 32) & 1) == 0
&& (*(_QWORD *)(v40 + 32) & 0x7FFFFFFFFFFFFFFCi64) == (v12 & 0x7FFFFFFFFFFFFFFCi64)
&& *(_DWORD *)(v40 + 40) == v36 )
{
*(_BYTE *)(v40 + 26) &= ~1u;
if( *(_QWORD *)(v40 + 32) )
break;
}
}
if( !v40 )
{
LABEL_66:
if( (*((_DWORD *)v35 + 30) & 0x10000) == 0 )
KeBugCheckEx(0x162u, (ULONG_PTR)v35, a1 + 440, v36, 0i64);
goto LABEL_78;
}
*(_BYTE *)(v40 + 32) |= 2u;
if( *(__int64 *)(v40 + 32) < 0 )
KiAbEntryRemoveFromTree(v40);
v48[0] = 0;
v48[0] = *(_DWORD *)(v40 + 88) & 0x1FFFF;
*(_DWORD *)(v40 + 88) &= 0xFFFE0000;
*(_BYTE *)(v40 + 25) &= ~1u;
*(_QWORD *)(v40 + 32) = 0i64;
v41 = (__int64)(v40 - *((_QWORD *)v35 + 100)) / 96;
if( v37 == 1 )
*((_BYTE *)v35 + 792) |= 1 << v41;
else
_InterlockedOr8((volatile signed __int8 *)v35 + 870, 1 << v41);
LABEL_78:
--*((_BYTE *)v35 + 794);
KiAbThreadRemoveBoosts((ULONG_PTR)v35, a1 + 440, v48);
v29 = (*((_WORD *)v35 + 243))++ == 0xFFFF;
if( v29 && *((_ETHREAD **)v35 + 19) != (_ETHREAD *)((char *)v35 + 152) )
KiCheckForKernelApcDelivery();
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
v11 = v53;
}
Timeout.QuadPart = -2500000i64;
v42 = KeWaitForSingleObject(&Object, WrKernel, 0, 0, &Timeout);
v43 = (_ETHREAD *)KeGetCurrentThread();
v44 = v42;
--*((_WORD *)v43 + 243);
v45 = 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 )
{
LODWORD(v52) = 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)v64);
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),
(__int64)v64,
&v52);
}
else if( v23 >= 0 )
{
v16 = -1073741484;
}
if( v16 < 0 )
break;
if( ++v22 == v49 )
{
SMKM_STORE_MGR::SmIoCtxQueueWork(v62, a1, v54, v63);
v16 = 0;
goto LABEL_17;
}
++v10;
}
if( v22 )
SMKM_STORE_MGR::SmFeAddComplete(a1, v61, v22, v24, 2);
}
LABEL_38:
if( v11 )
{
if( _InterlockedCompareExchange64((volatile signed __int64 *)v12, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)(a1 + 440));
KeAbPostRelease((PVOID)(a1 + 440));
}
else
{
LABEL_17:
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v12, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(a1 + 440));
v51 = 0;
v25 = (_ETHREAD *)KeGetCurrentThread();
if( (unsigned int)MiGetSystemRegionType(a1 + 440) == 1 )
SessionId = (unsigned int)MmGetSessionIdEx(*((_QWORD *)v25 + 23));
else
SessionId = 0xFFFFFFFFi64;
--*((_WORD *)v25 + 243);
v27 = ++*((_BYTE *)v25 + 794);
v28 = (*((char *)v25 + 792) | *((char *)v25 + 870)) ^ 0x3F;
while( 1 )
{
v29 = !_BitScanReverse((unsigned int *)&v30, v28);
v50 = v30;
if( v29 )
break;
v31 = *((_QWORD *)v25 + 100) + 96 * v30;
v28 &= ~(1 << v30);
if( (*(_BYTE *)(v31 + 26) & 1) != 0
&& (*(_DWORD *)(v31 + 32) & 1) == 0
&& (*(_QWORD *)(v31 + 32) & 0x7FFFFFFFFFFFFFFCi64) == (v12 & 0x7FFFFFFFFFFFFFFCi64)
&& *(_DWORD *)(v31 + 40) == (_DWORD)SessionId )
{
*(_BYTE *)(v31 + 26) &= ~1u;
if( *(_QWORD *)(v31 + 32) )
{
if( v31 )
{
*(_BYTE *)(v31 + 32) |= 2u;
if( *(__int64 *)(v31 + 32) < 0 )
KiAbEntryRemoveFromTree(v31);
v51 = *(_DWORD *)(v31 + 88) & 0x1FFFF;
*(_DWORD *)(v31 + 88) &= 0xFFFE0000;
*(_BYTE *)(v31 + 25) &= ~1u;
*(_QWORD *)(v31 + 32) = 0i64;
v32 = (__int64)(v31 - *((_QWORD *)v25 + 100)) / 96;
if( v27 == 1 )
*((_BYTE *)v25 + 792) |= 1 << v32;
else
_InterlockedOr8((volatile signed __int8 *)v25 + 870, 1 << v32);
goto LABEL_33;
}
break;
}
}
}
if( (*((_DWORD *)v25 + 30) & 0x10000) == 0 )
KeBugCheckEx(0x162u, (ULONG_PTR)v25, v12, SessionId, 0i64);
LABEL_33:
--*((_BYTE *)v25 + 794);
KiAbThreadRemoveBoosts((ULONG_PTR)v25, v12, (unsigned int *)&v51);
v29 = (*((_WORD *)v25 + 243))++ == 0xFFFF;
if( v29 && *((_ETHREAD **)v25 + 19) != (_ETHREAD *)((char *)v25 + 152) )
KiCheckForKernelApcDelivery();
}
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
return(unsigned int)v16;
}
Referenced by:
No references.