CcAsyncCopyRead

UINT8 __fastcall CcAsyncCopyRead(
        _FILE_OBJECT *FileObject,
        _LARGE_INTEGER *FileOffset,
        UINT64 Length,
        UINT8 Wait,
        VOID *Buffer,
        _IO_STATUS_BLOCK *IoStatus,
        _ETHREAD *IoIssuerThread,
        _CC_ASYNC_READ_CONTEXT *AsyncReadContext){
  _DWORD *PrivateCacheMap; 
  ULONG v9; 
  _SECTION_OBJECT_POINTERS *SectionObjectPointer; 
  _QWORD *SharedCacheMap; 
  INT64 Partition; 
  _ETHREAD *CurrentThread; 
  _QWORD *PoolWithTag; 
  void *v17; 
  NTSTATUS v18; 
  volatile signed __int64 *v19; 
  _LARGE_INTEGER *v20; 
  _CC_ASYNC_READ_CONTEXT *v21; 
  int PagePriorityThread; 
  __int64 v23; 
  PSLIST_ENTRY v24; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  PSLIST_ENTRY ListEntry; 
  PrivateCacheMap = FileObject->PrivateCacheMap;
  v9 = Length;
  memset(&LockHandle, 0, sizeof(LockHandle));
  SectionObjectPointer = FileObject->SectionObjectPointer;
  ListEntry = 0i64;
  SharedCacheMap = SectionObjectPointer->SharedCacheMap;
  Partition = CcGetPartition(SharedCacheMap);
  if( FileOffset->QuadPart + v9 > SharedCacheMap[1] )
    KeBugCheckEx(0x34u, 0x393ui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
  if( !Buffer )
    RtlRaiseStatus(-1073741592);
  CurrentThread = IoIssuerThread;
  if( CcEnableReadAheadInAsyncRead && (*PrivateCacheMap & 0x20000) != 0 )
    CcScheduleReadAheadEx(FileObject, FileOffset, v9, IoIssuerThread);
  PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 8ui64, 0x73416343ui64);
  v17 = PoolWithTag;
  if( !PoolWithTag )
    RtlRaiseStatus(-1073741670);
  *PoolWithTag = 0i64;
  v18 = CcAllocateWorkQueueEntry(Partition, &ListEntry);
  if( v18 < 0 )
  {
    ExFreePoolWithTag(v17, 0x73416343u);
    RtlRaiseStatus(v18);
  }
  if( !CurrentThread )
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v19 = *(volatile signed __int64 **)(*((_QWORD *)CurrentThread + 68) + 2232i64);
  if( v19 )
  {
    if( ((v9 + 4095) & 0xFFFFF000) != 0 )
      _InterlockedExchangeAdd64(v19, (v9 + 4095) & 0xFFFFF000);
    _InterlockedExchangeAdd64(v19 + 2, 1ui64);
  }
  KeAcquireInStackQueuedSpinLock((UINT64 *)(Partition + 128), &LockHandle);
  ++*((_DWORD *)SharedCacheMap + 1);
  ++*((_DWORD *)SharedCacheMap + 134);
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  _InterlockedIncrement((volatile signed __int32 *)SharedCacheMap + 130);
  v20 = (_LARGE_INTEGER *)ListEntry;
  *((_BYTE *)&ListEntry[7].Next + 8) = 5;
  v20[2].QuadPart = (LONGLONG)SharedCacheMap;
  v21 = AsyncReadContext;
  v20[4].QuadPart = (LONGLONG)FileObject;
  v20[3] = *FileOffset;
  v20[5].LowPart = v9;
  v20[6].QuadPart = (LONGLONG)v17;
  v20[8] = (_LARGE_INTEGER)v21->Mdl;
  v20[9].QuadPart = (LONGLONG)IoStatus;
  v20[10].QuadPart = (LONGLONG)v21;
  PagePriorityThread = PsGetPagePriorityThread((__int64)CurrentThread);
  *(_DWORD *)(v23 + 56) = PagePriorityThread;
  v24 = ListEntry;
  *((_QWORD *)&ListEntry[5].Next + 1) = *((_QWORD *)KeGetCurrentThread() + 23);
  v24[6].Next = (_SLIST_ENTRY *)CurrentThread;
  LOBYTE(v24[7].Next) = v21->RequestorMode;
  HIDWORD(v24[7].Next) = v21->NestingLevel;
  *((_QWORD *)&v24[6].Next + 1) = 0i64;
  IoReferenceIoAttributionFromThread(CurrentThread, (PVOID *)&v24[6].Next + 1);
  if( v21->NestingLevel > CcMaxNestingLevel )
    KeBugCheckEx(0x34u, 0x42Aui64, 0xFFFFFFFFC0000420ui64, 0i64, 0i64);
  CcPostWorkQueueAsyncRead(v24);
  return 1;
}

Referenced by:

No references.