SMKM_STORE::SmStReadThread
void __fastcall SMKM_STORE::SmStReadThread(__int64 a1){
__int64 v1;
__int64 v3;
PSLIST_ENTRY Context;
NTSTATUS v5;
unsigned __int64 *v6;
unsigned __int8 v7;
__int64 *v8;
unsigned __int64 v9;
__int64 *v10;
VOID *v11;
int Issue;
UINT64 WaitMode;
VOID *Object[2];
v1 = *(_QWORD *)a1;
v3 = *(_QWORD *)a1 + 6488i64;
KeSetActualBasePriorityThread(KeGetCurrentThread(), 12i64);
Context = ST_STORE::StAcquireReadContext(v1);
*(_DWORD *)(a1 + 32) = Context == 0i64 ? 0xC000009A : 0;
KeSetEvent((PRKEVENT)(a1 + 8), 0, 0);
if( Context )
{
Object[0] = (VOID *)(v1 + 6520);
Object[1] = (VOID *)(v1 + 6496);
do
{
while( 1 )
{
v5 = KeWaitForMultipleObjects(2ui64, Object, WaitAny, Executive, 0, 0, 0i64, 0i64);
if( v5 )
break;
KeResetEvent((_KEVENT *)Object[0]);
v6 = (unsigned __int64 *)(v1 + 6544);
while( 1 )
{
v7 = KeAcquireSpinLockRaiseToDpc((UINT64 *)(v1 + 6560));
v8 = *(__int64 **)(v3 + 64);
v9 = v7;
if( v8 == (__int64 *)v6 )
{
v10 = 0i64;
}
else
{
v10 = (__int64 *)*v6;
*v6 = *(_QWORD *)*v6 & 0xFFFFFFFFFFFFFFF8ui64;
if( v10 == v8 )
{
*v6 = 0i64;
*(_QWORD *)(v3 + 64) = v3 + 56;
}
else
{
*v8 = *v8 & 7 | (8 * (((unsigned __int64)*v8 >> 3) - 1));
}
}
KxReleaseSpinLock((UINT64 *)(v1 + 6560));
__writecr8(v9);
if( !v10 )
break;
LODWORD(WaitMode) = 1;
v11 = SmFpAllocate(
(_SM_FORWARD_PROGRESS_CTX *)FpContext,
SmFpResourceCommit,
(VOID *)(v1 + 6488),
0i64,
WaitMode);
Issue = SMKM_STORE::SmStDirectReadIssue(v1, (__int64)v10, (__int64)Context);
SMKM_STORE::SmStDirectReadComplete((_DWORD *)v1, (__int64)v10, Issue);
SmFpFree((_SM_FORWARD_PROGRESS_CTX *)FpContext, SmFpResourceCommit, (VOID *)(v1 + 6488), v11);
}
}
}
while( v5 != 1 );
}
if( Context )
ST_STORE::StReleaseReadContext((_SLIST_HEADER *)v1, (__int64)Context);
}
Referenced by:
No references.