FsRtlCopyRead
UINT8 __stdcall FsRtlCopyRead(
FILE_OBJECT *FileObject,
LARGE_INTEGER *FileOffset,
UINT64 Length,
UINT8 Wait,
UINT64 LockKey,
VOID *Buffer,
IO_STATUS_BLOCK *IoStatus,
DEVICE_OBJECT *DeviceObject){
__int64 v9;
BOOL v12;
LONGLONG v14;
void *FsContext;
_ETHREAD *CurrentThread;
UINT8 v17;
_MMSUPPORT_INSTANCE *v18;
UINT64 v19;
UINT64 v20;
char v21;
LONGLONG v22;
_MMSUPPORT_INSTANCE *v23;
UINT64 v24;
UINT64 v25;
UINT8 v26;
UINT64 InputGetPageFlags;
UINT64 InputGetPageFlagsa;
UINT64 Alignment;
UINT64 Alignmenta;
UINT64 *NumberOfPages;
UINT64 *NumberOfPagesa;
v9 = (unsigned int)Length;
if( IoGetTopLevelIrp() )
return 0;
if( (_DWORD)v9 )
{
if( 0x7FFFFFFFFFFFFFFFi64 - FileOffset->QuadPart < v9 )
{
IoStatus->Status = -1073741811;
IoStatus->Information = 0i64;
return 0;
}
v14 = v9 + FileOffset->QuadPart;
FsContext = FileObject->FsContext;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
if( Wait )
{
__incgsdword(0x2EC8u);
v17 = 1;
LOBYTE(v12) = 1;
ExAcquireResourceSharedLite(*((PERESOURCE *)FsContext + 1), v12);
}
else
{
__incgsdword(0x2EC4u);
if( !ExAcquireResourceSharedLite(*((PERESOURCE *)FsContext + 1), 0) )
{
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
__incgsdword(0x8140u);
return 0;
}
v17 = 1;
}
if( !FileObject->PrivateCacheMap
|| (v21 = *((_BYTE *)FsContext + 5)) == 0
|| v21 == 2
&& (NumberOfPages = (UINT64 *)IoStatus,
LOBYTE(Alignment) = 1,
LODWORD(InputGetPageFlags) = LockKey,
LOBYTE(v20) = Wait,
!(*(unsigned __int8(__fastcall **)(FILE_OBJECT *, LARGE_INTEGER *, _QWORD, UINT64))(*(_QWORD *)(*((_QWORD *)DeviceObject + 1) + 80i64)
+ 8i64))(
FileObject,
FileOffset,
(unsigned int)v9,
v20)) )
{
ExReleaseResourceLite(*((PERESOURCE *)FsContext + 1));
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
__incgsdword(0x2ECCu);
return 0;
}
v22 = *((_QWORD *)FsContext + 4);
if( v14 > v22 )
{
if( FileOffset->QuadPart >= v22 )
{
IoStatus->Status = -1073741807;
IoStatus->Information = 0i64;
LABEL_22:
ExReleaseResourceLite(*((PERESOURCE *)FsContext + 1));
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
return v17;
}
LODWORD(v9) = v22 - FileOffset->LowPart;
}
IoSetTopLevelIrp((_MI_PARTITION *)4, v18, v19, v20, InputGetPageFlags, Alignment, NumberOfPages);
CcCopyReadEx(FileObject, FileOffset, (unsigned int)v9, Wait, Buffer, IoStatus, 0i64);
v17 = v26;
FileObject->Flags |= 0x80000u;
if( v26 )
FileObject->CurrentByteOffset.QuadPart = FileOffset->QuadPart + IoStatus->Information;
IoSetTopLevelIrp(0i64, v23, v24, v25, InputGetPageFlagsa, Alignmenta, NumberOfPagesa);
goto LABEL_22;
}
IoStatus->Status = 0;
IoStatus->Information = 0i64;
return 1;
}Referenced by:
No references.