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.