FsRtlCopyWrite
BOOLEAN __stdcall FsRtlCopyWrite(
PFILE_OBJECT FileObject,
PLARGE_INTEGER FileOffset,
ULONG Length,
BOOLEAN Wait,
ULONG LockKey,
PVOID Buffer,
PIO_STATUS_BLOCK IoStatus,
PDEVICE_OBJECT DeviceObject){
unsigned __int64 v9;
BOOLEAN v12;
int v13;
char *FsContext;
char v15;
__int64 v16;
__int64 v17;
_ETHREAD *CurrentThread;
int v19;
UINT64 v20;
_MMSUPPORT_INSTANCE *v22;
union _LARGE_INTEGER v23;
char *v24;
char v25;
signed __int64 v26;
__int64 v27;
PLARGE_INTEGER v28;
ERESOURCE *v29;
_MMSUPPORT_INSTANCE *v30;
UINT64 v31;
VOID *v32;
BOOLEAN v33;
ERESOURCE *v34;
ERESOURCE *v35;
PVOID v36;
PVOID v37;
UINT64 v38;
UINT64 v39;
__int128 *v40;
UINT64 *v41;
BOOLEAN v42;
char v43;
char v44;
char *v45;
union _LARGE_INTEGER EndOffset;
_MMSUPPORT_INSTANCE *Vm;
__int64 v48;
__int64 v49;
char *v50;
__int128 v51[5];
v9 = Length;
v12 = 0;
v42 = 1;
v44 = 0;
if( FileOffset->LowPart != -1 || (v43 = 1, FileOffset->HighPart != -1) )
v43 = 0;
if( IoGetTopLevelIrp() )
return 0;
FsContext = (char *)FileObject->FsContext;
v50 = FsContext;
LOBYTE(v13) = Wait;
if( !CcCanIWrite(FileObject, v9, v13, 0) )
return 0;
if( (FileObject->Flags & 0x10) != 0 )
return 0;
CcCopyWriteWontFlush(FileObject, FileOffset, (unsigned int)v9);
if( !v15 )
return 0;
IoStatus->Status = 0;
Vm = (_MMSUPPORT_INSTANCE *)v9;
IoStatus->Information = v9;
if( !(_DWORD)v9 )
return 1;
v16 = 0i64;
v48 = 0i64;
v17 = 0i64;
v49 = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v19 = -1;
--*((_WORD *)CurrentThread + 242);
if( v43 || (signed __int64)(FileOffset->QuadPart + v9) > *((_QWORD *)FsContext + 5) )
{
if( !ExAcquireResourceExclusiveLite(*((ERESOURCE **)FsContext + 1), Wait) )
goto LABEL_12;
LOBYTE(v20) = 0;
}
else
{
LOBYTE(v19) = Wait;
if( !ExAcquireResourceSharedLite(*((PERESOURCE *)FsContext + 1), v19) )
{
LABEL_12:
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
return 0;
}
LOBYTE(v20) = 1;
}
v22 = Vm;
if( v43 )
v23 = *(union _LARGE_INTEGER *)(FsContext + 32);
else
v23 = *FileOffset;
v24 = (char *)Vm + v23.QuadPart;
v45 = (char *)Vm + v23.QuadPart;
EndOffset = v23;
if( !FileObject->PrivateCacheMap )
goto LABEL_33;
v25 = FsContext[5];
if( !v25 )
goto LABEL_33;
v26 = *((_QWORD *)FsContext + 5);
if( v23.QuadPart >= v26 + 0x2000
|| 0x7FFFFFFFFFFFFFFFi64 - v23.QuadPart < (__int64)Vm
|| (__int64)v24 > *((_QWORD *)FsContext + 3) )
{
goto LABEL_33;
}
if( (_BYTE)v20 && (__int64)v24 > v26 )
{
ExReleaseResourceLite(*((PERESOURCE *)FsContext + 1));
if( !ExAcquireResourceExclusiveLite(*((ERESOURCE **)FsContext + 1), Wait) )
goto LABEL_12;
if( v43 )
{
v23 = *(union _LARGE_INTEGER *)(FsContext + 32);
EndOffset = v23;
v24 = (char *)Vm + v23.QuadPart;
v45 = (char *)Vm + v23.QuadPart;
}
if( !FileObject->PrivateCacheMap || (v25 = FsContext[5]) == 0 || (__int64)v24 > *((_QWORD *)FsContext + 3) )
{
LABEL_33:
ExReleaseResourceLite(*((PERESOURCE *)FsContext + 1));
goto LABEL_12;
}
}
if( v25 != 2 )
goto LABEL_39;
v27 = *(_QWORD *)(*((_QWORD *)DeviceObject + 1) + 80i64);
v51[0] = 0i64;
v28 = FileOffset;
if( FileOffset->QuadPart == -1 )
v28 = (PLARGE_INTEGER)(FsContext + 32);
v40 = v51;
LOBYTE(v38) = 0;
LODWORD(v36) = LockKey;
LOBYTE(v20) = Wait;
if( (*(unsigned __int8(__fastcall **)(PFILE_OBJECT, PLARGE_INTEGER, _QWORD, UINT64))(v27 + 8))(
FileObject,
v28,
Length,
v20) )
{
LABEL_39:
if( (__int64)v24 > *((_QWORD *)FsContext + 4) )
{
v44 = 1;
v16 = *((_QWORD *)FsContext + 4);
v48 = v16;
v17 = *((_QWORD *)FsContext + 5);
v49 = v17;
if( *((_DWORD *)FsContext + 9) == HIDWORD(v45) || (v29 = (ERESOURCE *)*((_QWORD *)FsContext + 2)) == 0i64 )
{
*((_QWORD *)FsContext + 4) = v24;
}
else
{
ExAcquireResourceExclusiveLite(v29, 1u);
*((_QWORD *)FsContext + 4) = v24;
ExReleaseResourceLite(*((PERESOURCE *)FsContext + 2));
}
}
IoSetTopLevelIrp((_MI_PARTITION *)4, v22, v26, v20, (UINT64)v36, v38, (UINT64 *)v40);
if( v23.QuadPart > *((_QWORD *)FsContext + 5) )
v42 = CcZeroData(FileObject, (PLARGE_INTEGER)FsContext + 5, &EndOffset, Wait);
if( v42 )
{
LOBYTE(v32) = Wait;
CcCopyWrite(FileObject, &EndOffset, Length, v32, Buffer);
v42 = v33;
}
IoSetTopLevelIrp(0i64, v30, v31, (UINT64)v32, (UINT64)v37, v39, v41);
if( v42 )
{
if( (__int64)v24 > *((_QWORD *)FsContext + 5) )
{
if( *((_DWORD *)FsContext + 11) == HIDWORD(v45) || (v34 = (ERESOURCE *)*((_QWORD *)FsContext + 2)) == 0i64 )
{
*((_QWORD *)FsContext + 5) = v24;
}
else
{
ExAcquireResourceExclusiveLite(v34, 1u);
*((_QWORD *)FsContext + 5) = v24;
ExReleaseResourceLite(*((PERESOURCE *)FsContext + 2));
}
}
FileObject->Flags |= 0x1000u;
if( v44 )
{
*((_QWORD *)FileObject->SectionObjectPointer->SharedCacheMap + 1) = v24;
FileObject->Flags |= 0x2000u;
}
FileObject->CurrentByteOffset.QuadPart = v23.QuadPart + Length;
}
else if( v44 )
{
v35 = (ERESOURCE *)*((_QWORD *)FsContext + 2);
if( v35 )
{
ExAcquireResourceExclusiveLite(v35, 1u);
*((_QWORD *)FsContext + 4) = v16;
*((_QWORD *)FsContext + 5) = v17;
ExReleaseResourceLite(*((PERESOURCE *)FsContext + 2));
}
else
{
*((_QWORD *)FsContext + 4) = v16;
*((_QWORD *)FsContext + 5) = v17;
}
}
ExReleaseResourceLite(*((PERESOURCE *)FsContext + 1));
v12 = v42;
}
else
{
ExReleaseResourceLite(*((PERESOURCE *)FsContext + 1));
}
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
return v12;
}Referenced by:
No references.