FsRtlPrepareMdlWriteDev
BOOLEAN __stdcall FsRtlPrepareMdlWriteDev(
PFILE_OBJECT FileObject,
PLARGE_INTEGER FileOffset,
ULONG Length,
ULONG LockKey,
PMDL *MdlChain,
PIO_STATUS_BLOCK IoStatus,
PDEVICE_OBJECT DeviceObject){
__int64 v9;
__int64 v10;
char v11;
BOOL v12;
BOOL v13;
char *FsContext;
_ETHREAD *CurrentThread;
_MMSUPPORT_INSTANCE *v17;
UINT64 v18;
union _LARGE_INTEGER v19;
LONGLONG v20;
char v21;
UINT64 v22;
ERESOURCE *v23;
UINT64 v24;
UINT64 v25;
union _LARGE_INTEGER *v26;
ERESOURCE *v27;
ERESOURCE *v28;
PIO_STATUS_BLOCK v29;
PIO_STATUS_BLOCK v30;
UINT64 Alignment;
UINT64 Alignmenta;
UINT64 *NumberOfPages;
UINT64 *NumberOfPagesa;
BOOLEAN v35;
char v36;
char v37;
int v38;
union _LARGE_INTEGER EndOffset;
__int64 v40;
__int64 v41;
char *v42;
v9 = 0i64;
v40 = 0i64;
v10 = 0i64;
v41 = 0i64;
v35 = 1;
v36 = 0;
if( FileOffset->LowPart != -1 || (v11 = 1, FileOffset->HighPart != -1) )
v11 = 0;
v37 = v11;
if( IoGetTopLevelIrp() )
return 0;
LOBYTE(v12) = 1;
if( !CcCanIWrite(FileObject, Length, v12, 0) || (FileObject->Flags & 0x10) != 0 )
return 0;
IoStatus->Status = 0;
if( !Length )
return 1;
FsContext = (char *)FileObject->FsContext;
v42 = FsContext;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
if( v11 || Length + FileOffset->QuadPart > *((_QWORD *)FsContext + 5) )
{
ExAcquireResourceExclusiveLite(*((ERESOURCE **)FsContext + 1), 1u);
LOBYTE(v18) = 0;
}
else
{
LOBYTE(v13) = 1;
ExAcquireResourceSharedLite(*((PERESOURCE *)FsContext + 1), v13);
LOBYTE(v18) = 1;
}
if( v11 )
v19 = *(union _LARGE_INTEGER *)(FsContext + 32);
else
v19 = *FileOffset;
v20 = v19.QuadPart + Length;
v38 = HIDWORD(v20);
EndOffset = v19;
if( !FileObject->PrivateCacheMap )
goto LABEL_52;
v21 = FsContext[5];
if( !v21 )
goto LABEL_52;
v22 = Length;
if( 0x7FFFFFFFFFFFFFFFi64 - v19.QuadPart < Length || v20 > *((_QWORD *)FsContext + 3) )
goto LABEL_52;
if( (_BYTE)v18 && v20 > *((_QWORD *)FsContext + 5) )
{
ExReleaseResourceLite(*((PERESOURCE *)FsContext + 1));
ExAcquireResourceExclusiveLite(*((ERESOURCE **)FsContext + 1), 1u);
if( v37 )
{
v19 = *(union _LARGE_INTEGER *)(FsContext + 32);
EndOffset = v19;
v22 = Length;
v20 = v19.QuadPart + Length;
v38 = HIDWORD(v20);
}
else
{
v22 = Length;
}
if( !FileObject->PrivateCacheMap )
goto LABEL_52;
v21 = FsContext[5];
if( !v21 || v20 > *((_QWORD *)FsContext + 3) )
goto LABEL_52;
}
if( v21 == 2 )
{
NumberOfPages = (UINT64 *)IoStatus;
LOBYTE(Alignment) = 0;
LODWORD(v29) = LockKey;
LOBYTE(v18) = 1;
if( !(*(unsigned __int8(__fastcall **)(PFILE_OBJECT, PLARGE_INTEGER, UINT64, UINT64))(*(_QWORD *)(*((_QWORD *)DeviceObject + 1) + 80i64)
+ 8i64))(
FileObject,
FileOffset,
v22,
v18) )
{
LABEL_52:
ExReleaseResourceLite(*((PERESOURCE *)FsContext + 1));
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
return 0;
}
}
if( v20 > *((_QWORD *)FsContext + 4) )
{
v36 = 1;
v9 = *((_QWORD *)FsContext + 4);
v40 = v9;
v10 = *((_QWORD *)FsContext + 5);
v41 = v10;
if( *((_DWORD *)FsContext + 9) == v38 || (v23 = (ERESOURCE *)*((_QWORD *)FsContext + 2)) == 0i64 )
{
*((_QWORD *)FsContext + 4) = v20;
}
else
{
ExAcquireResourceExclusiveLite(v23, 1u);
*((_QWORD *)FsContext + 4) = v20;
ExReleaseResourceLite(*((PERESOURCE *)FsContext + 2));
}
}
IoSetTopLevelIrp((_MI_PARTITION *)4, v17, v22, v18, (UINT64)v29, Alignment, NumberOfPages);
v26 = (union _LARGE_INTEGER *)(FsContext + 40);
if( v19.QuadPart > *((_QWORD *)FsContext + 5) )
v35 = CcZeroData(FileObject, v26, &EndOffset, 1u);
if( v35 )
CcPrepareMdlWrite(FileObject, &EndOffset, Length, MdlChain, IoStatus);
IoSetTopLevelIrp(0i64, (_MMSUPPORT_INSTANCE *)v26, v24, v25, (UINT64)v30, Alignmenta, NumberOfPagesa);
if( v35 )
{
if( v20 > *((_QWORD *)FsContext + 5) )
{
if( *((_DWORD *)FsContext + 11) == v38 || (v27 = (ERESOURCE *)*((_QWORD *)FsContext + 2)) == 0i64 )
{
*((_QWORD *)FsContext + 5) = v20;
}
else
{
ExAcquireResourceExclusiveLite(v27, 1u);
*((_QWORD *)FsContext + 5) = v20;
ExReleaseResourceLite(*((PERESOURCE *)FsContext + 2));
}
}
FileObject->Flags |= 0x1000u;
if( v36 )
{
*((_QWORD *)FileObject->SectionObjectPointer->SharedCacheMap + 1) = v20;
FileObject->Flags |= 0x2000u;
}
}
else if( v36 )
{
v28 = (ERESOURCE *)*((_QWORD *)FsContext + 2);
if( v28 )
{
ExAcquireResourceExclusiveLite(v28, 1u);
*((_QWORD *)FsContext + 4) = v9;
*((_QWORD *)FsContext + 5) = v10;
ExReleaseResourceLite(*((PERESOURCE *)FsContext + 2));
}
else
{
*((_QWORD *)FsContext + 4) = v9;
*((_QWORD *)FsContext + 5) = v10;
}
}
ExReleaseResourceLite(*((PERESOURCE *)FsContext + 1));
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
return v35;
}Referenced by:
No references.