SMKM_STORE_MGR::SmIoCtxQueueWork
__int64 __fastcall SMKM_STORE_MGR::SmIoCtxQueueWork(
__int64 *a1,
__int64 a2,
__int64 a3,
unsigned __int64 a4){
int v4;
__int16 v6;
int v9;
int v10;
__int64 *v11;
__int64 *v12;
__int64 v13;
VOID *v14;
void(__fastcall *v16)(__int64, __int64 *, __int64);
_ETHREAD *v17;
_ETHREAD *v18;
__int64 v19;
__int64 *v20;
unsigned int v21;
__int64 *v22;
__int64 v23;
int v24;
__int16 v25;
__int16 v26;
__int64 *v27;
__int64 *v28;
__int128 v29;
v4 = *(_DWORD *)a4;
v28 = (__int64 *)&v27;
v6 = a3;
v27 = 0i64;
v29 = 0i64;
v9 = v4 & 7;
v10 = SMKM_STORE_MGR::SmIoCtxPrepareToQueue(a1, a2, a3, a4, (__int64)&v27);
if( v10 < 0 )
{
v14 = (VOID *)v29;
}
else
{
if( v9 != 2 )
goto LABEL_3;
v16 = *(void(__fastcall **)(__int64, __int64 *, __int64))(a2 + 1848);
if( v16 )
{
v23 = *a1;
v24 = *(_DWORD *)(a4 + 24);
v26 = 0;
v25 = v6;
v16(a2, &v23, 5i64);
}
if( (*(_BYTE *)(*(_QWORD *)SmKmStoreRefFromStoreIndex(a2, v6 & 0x3FF) + 6021i64) & 4) != 0
&& (*(_DWORD *)(a4 + 8) & 0x4000000) != 0
&& PsGetIoPriorityThread(v17) >= IoPriorityNormal )
{
if( v28 != (__int64 *)&v27 )
{
v20 = v27;
v27 = (__int64 *)(*v27 & 0xFFFFFFFFFFFFFFF8ui64);
if( v20 == v28 )
{
v27 = 0i64;
v28 = (__int64 *)&v27;
}
else
{
*v28 = *v28 & 7 | (8 * ((unsigned __int64)*v28 >> 3) - 8);
}
}
*(_OWORD *)(a4 + 40) = 0i64;
*(_OWORD *)(a4 + 56) = 0i64;
*(_OWORD *)(a4 + 72) = 0i64;
*(_QWORD *)(a4 + 72) = v19;
*(_QWORD *)(a4 + 80) = a2 + 464;
KeQueryPriorityThread(v18);
SMKM_STORE_MGR::SmAsyncReadQueueInsert(a2 + 464, a4 + 40, v21);
}
else
{
LABEL_3:
if( v28 != (__int64 *)&v27 )
{
v11 = v27;
v27 = (__int64 *)(*v27 & 0xFFFFFFFFFFFFFFF8ui64);
if( v11 == v28 )
{
v27 = 0i64;
v28 = (__int64 *)&v27;
}
else
{
*v28 = *v28 & 7 | (8 * ((unsigned __int64)*v28 >> 3) - 8);
}
}
v12 = (__int64 *)SmKmStoreRefFromStoreIndex(a2, v6 & 0x3FF);
SMKM_STORE::SmStWorkItemQueue(*v12, v13, 0);
}
v14 = 0i64;
*(_QWORD *)&v29 = 0i64;
v10 = 0;
}
if( v14 )
SmFpFree((_SM_FORWARD_PROGRESS_CTX *)(a2 + 1536), SmFpResourceMapping, (VOID *)0xFFFFFFFFFFFFFFFFi64, v14);
while( v28 != (__int64 *)&v27 )
{
v22 = v27;
v27 = (__int64 *)(*v27 & 0xFFFFFFFFFFFFFFF8ui64);
if( v22 == v28 )
{
v27 = 0i64;
v28 = (__int64 *)&v27;
}
else
{
*v28 = *v28 & 7 | (8 * ((unsigned __int64)*v28 >> 3) - 8);
}
SMKM_STORE_MGR::SmWorkItemFreeResource(a2, v22, (VOID *)0xFFFFFFFFFFFFFFFFi64);
}
return(unsigned int)v10;
}
Referenced by:
No references.