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.