CcCompleteAsyncRead

INT64 __fastcall CcCompleteAsyncRead(INT64 a1){
  INT64 v2; 
  LARGE_INTEGER v3; 
  __int64 v4; 
  __int64 v5; 
  VOID *DiskIoAttribution; 
  __int64 v7; 
  unsigned int v8; 
  void *Buffer; 
  __int64 v10; 
  INT64 result; 
  UINT64 PagePriority; 
  int PagePriorityThread; 
  int v14; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  VOID *v16; 
  __int64 v17; 
  _ETHREAD *CurrentThread; 
  INT64 v19; 
  PMDL MemoryDescriptorList; 
  void *v21; 
  FILE_OBJECT *FileObject; 
  __int64 v23; 
  __int64 v24; 
  _ETHREAD *v25; 
  UINT64 FaultedData; 
  UINT64 Length; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  PagePriorityThread = PsGetPagePriorityThread((__int64)CurrentThread);
  LODWORD(FaultedData) = 0;
  memset(&LockHandle, 0, sizeof(LockHandle));
  v2 = *(_QWORD *)(a1 + 16);
  v19 = v2;
  FileObject = *(FILE_OBJECT **)(a1 + 32);
  v3 = *(LARGE_INTEGER *)(a1 + 24);
  LODWORD(Length) = *(_DWORD *)(a1 + 40);
  v14 = *(_DWORD *)(a1 + 56);
  MemoryDescriptorList = *(PMDL *)(a1 + 64);
  v23 = *(_QWORD *)(a1 + 72);
  v4 = v23;
  v5 = *(_QWORD *)(a1 + 80);
  v17 = v5;
  DiskIoAttribution = *(VOID **)(a1 + 104);
  v16 = DiskIoAttribution;
  PsSetPagePriorityThread(v7, v14);
  v25 = (_ETHREAD *)KeGetCurrentThread();
  *((_QWORD *)v25 + 152) = 7i64;
  if( *(int *)v4 >= 0 )
  {
    *(_DWORD *)v4 = 0;
    v8 = Length;
    *(_QWORD *)(v4 + 8) = (unsigned int)Length;
    if( (MemoryDescriptorList->MdlFlags & 5) != 0 )
    {
      Buffer = MemoryDescriptorList->MappedSystemVa;
    }
    else
    {
      Buffer = MmMapLockedPagesSpecifyCache(MemoryDescriptorList, 0, MmCached, 0i64, 0, 0x40000020u);
      v8 = Length;
    }
    v21 = Buffer;
    if( Buffer )
    {
      LODWORD(PagePriority) = v14;
      CcMapAndCopyFromCache(FileObject, v3, v8, 1u, Buffer, &FaultedData, PagePriority, DiskIoAttribution);
    }
    else
    {
      *(_DWORD *)v4 = -1073741670;
    }
  }
  if( DiskIoAttribution )
    IoDiskIoAttributionDereference(DiskIoAttribution);
  if( (_DWORD)FaultedData )
    ++CcNumberAsyncReadRefaulted;
  if( v5 && *(_QWORD *)v5 )
    (*(void(__fastcall **)(_QWORD))v5)(*(_QWORD *)(v5 + 8));
  *((_QWORD *)KeGetCurrentThread() + 152) = 0i64;
  PsSetPagePriorityThread((__int64)CurrentThread, PagePriorityThread);
  _InterlockedAdd((volatile signed __int32 *)(v2 + 520), 0xFFFFFFFF);
  v10 = *(_QWORD *)(a1 + 128);
  v24 = v10;
  if( v10 != *(_QWORD *)(v2 + 528) )
    KeBugCheckEx(0x34u, 0x643ui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
  KeAcquireInStackQueuedSpinLock((UINT64 *)(v10 + 128), &LockHandle);
  CcDecrementOpenCount(v2);
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  result = LockHandle.OldIrql;
  __writecr8(LockHandle.OldIrql);
  return result;
}

Referenced by:

CcAsyncReadWorker
CcCompleteAsyncReadWorker
CcPostWorkQueueAsyncRead