CcMdlRead
NTSTATUS __fastcall CcMdlRead(UINT64 a1, INT64 *a2, UINT64 a3, INT64 **a4, INT64 IoStatus){
unsigned int v5;
__int64 v8;
_DWORD *v9;
_LARGE_INTEGER v10;
unsigned int v11;
VOID *VirtualAddress;
unsigned int v13;
_MDL *Mdl;
INT64 *v15;
INT64 *v16;
NTSTATUS result;
UINT64 RequestHighPriorityMapping;
UINT64 PerformingReadAhead;
UINT64 PagePriority;
unsigned int v21;
UINT64 ReceivedLength;
int v23;
_VACB *Vacb;
INT64 *v25;
_LARGE_INTEGER v26;
_LARGE_INTEGER FileOffset;
__int64 v28;
VOID *v29;
INT64 *i;
_DWORD *v31;
_DWORD *v32;
unsigned int TotalLength;
TotalLength = a3;
v5 = a3;
v25 = 0i64;
v23 = a3;
v21 = 0;
Vacb = 0i64;
HIDWORD(ReceivedLength) = 0;
v8 = *(_QWORD *)(*(_QWORD *)(a1 + 40) + 8i64);
v28 = v8;
v9 = *(_DWORD **)(a1 + 48);
v31 = v9;
v32 = v9;
if( (*v9 & 0x20000) != 0 )
CcScheduleReadAheadEx((VOID *)a1, (_LARGE_INTEGER *)a2, a3, 0i64);
__incgsdword(0x8124u);
KeGetCurrentThread()[1].Timer.DueTime.HighPart = 0;
FileOffset.QuadPart = *a2;
v10 = FileOffset;
v26 = FileOffset;
v11 = TotalLength;
while( v11 )
{
LODWORD(ReceivedLength) = 0;
LODWORD(PerformingReadAhead) = 0;
LODWORD(RequestHighPriorityMapping) = 0;
VirtualAddress = CcGetVirtualAddress(
(_SHARED_CACHE_MAP *)v8,
v10,
&Vacb,
&ReceivedLength,
RequestHighPriorityMapping,
PerformingReadAhead);
v29 = VirtualAddress;
if( (*(_DWORD *)(v8 + 152) & 8) == 0 )
{
LODWORD(PagePriority) = (*v9 >> 18) & 7;
CcFetchDataForRead(
(_FILE_OBJECT *)a1,
&FileOffset,
v11,
1u,
(UINT64 *)((char *)&ReceivedLength + 4),
Vacb,
PagePriority,
0i64);
VirtualAddress = v29;
}
v13 = ReceivedLength;
if( (unsigned int)ReceivedLength > v11 )
v13 = v11;
LODWORD(ReceivedLength) = v13;
v10.QuadPart = v26.QuadPart + v13;
v26 = v10;
Mdl = IoAllocateMdl(VirtualAddress, v13, 0, 0, 0i64);
v25 = (INT64 *)Mdl;
if( !Mdl )
RtlRaiseStatus(-1073741670);
MmProbeAndLockPages(Mdl, 0, IoReadAccess);
CcFreeVirtualAddress(Vacb);
Vacb = 0i64;
v15 = *a4;
if( *a4 )
{
for( i = *a4; ; i = v16 )
{
v16 = (INT64 *)*v15;
if( !*v15 )
break;
v15 = (INT64 *)*v15;
}
*v15 = (INT64)v25;
}
else
{
*a4 = v25;
}
v25 = 0i64;
FileOffset = v10;
v21 += v13;
v11 -= v13;
v9 = v31;
}
__addgsdword(0x8160u, KeGetCurrentThread()[1].Timer.DueTime.HighPart);
if( (*v9 & 0x20000) == 0 && HIDWORD(ReceivedLength) )
CcScheduleReadAheadEx((VOID *)a1, (_LARGE_INTEGER *)a2, v5, 0i64);
CcUpdateReadHistory((_FILE_OBJECT *)a1, (_LARGE_INTEGER *)a2, v5);
if( (*(_DWORD *)(v8 + 152) & 8) != 0 )
CcUpdateSharedCacheMapFlag((_SHARED_CACHE_MAP *)v8, 8ui64, 0);
*(_DWORD *)IoStatus = 0;
result = v21;
*(_QWORD *)(IoStatus + 8) = v21;
return result;
}Referenced by:
FsRtlMdlReadDev