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