FsRtlAcquireFileForModWriteEx
NTSTATUS __stdcall FsRtlAcquireFileForModWriteEx(
FILE_OBJECT *FileObject,
LARGE_INTEGER *EndingOffset,
ERESOURCE **ResourceToRelease){
unsigned int v4;
char v5;
_DEVICE_OBJECT *RelatedDeviceObject;
UINT64 v7;
__int64 v8;
_DEVICE_OBJECT *BaseFileSystemDeviceObject;
__int64 v10;
__int64 v11;
__int64 v12;
NTSTATUS v13;
LONGLONG *v14;
ERESOURCE **v15;
int v16;
char v17;
__int64(__fastcall *v18)(FILE_OBJECT *, LARGE_INTEGER *, ERESOURCE **, _DEVICE_OBJECT *);
__int64 v19;
void *FsContext;
char v21;
LONGLONG v22;
struct _ERESOURCE *v23;
char v24;
UINT8 v25;
UINT64 v26;
char v27;
_HHIVE *v28;
char v29;
int a4;
LARGE_INTEGER *v31;
ERESOURCE **v32;
INT64 *v33;
INT64 result[8];
char v35;
v32 = ResourceToRelease;
v31 = EndingOffset;
memset((INT64)result, 0i64);
v4 = 0;
a4 = 0;
v33 = result;
v5 = 0;
RelatedDeviceObject = IoGetRelatedDeviceObject(FileObject);
BaseFileSystemDeviceObject = IoGetBaseFileSystemDeviceObject(FileObject);
v10 = *((_QWORD *)BaseFileSystemDeviceObject + 1);
v11 = *(_QWORD *)(v10 + 80);
v12 = *(_QWORD *)(*(_QWORD *)(v10 + 48) + 48i64);
if( v12 && (*(_DWORD *)v12 >= 0x50u && *(_QWORD *)(v12 + 72) || *(_DWORD *)v12 >= 0x58u && *(_QWORD *)(v12 + 80)) )
v5 = 1;
if( RelatedDeviceObject == BaseFileSystemDeviceObject && !v5 )
{
v15 = v32;
v33 = 0i64;
v17 = 0;
LABEL_12:
if( !v12
|| (*(_DWORD *)v12 < 0x50u || !*(_QWORD *)(v12 + 72)) && (*(_DWORD *)v12 < 0x58u || !*(_QWORD *)(v12 + 80)) )
{
if( v11
&& *(_DWORD *)v11 >= 0x80u
&& (v18 = *(__int64(__fastcall **)(FILE_OBJECT *, LARGE_INTEGER *, ERESOURCE **, _DEVICE_OBJECT *))(v11 + 120)) != 0i64 )
{
v4 = v18(FileObject, v31, v15, BaseFileSystemDeviceObject);
}
else
{
v4 = -1073741808;
}
a4 |= 1u;
}
if( v17 )
ObfDereferenceObjectWithTag(BaseFileSystemDeviceObject, 0x746C6644ui64);
v14 = (LONGLONG *)v31;
goto LABEL_25;
}
v13 = FsFilterCtrlInit((__int64)result, 253, (__int64)RelatedDeviceObject, v8, (__int64)FileObject, 1);
if( v13 < 0 )
return v13;
v14 = (LONGLONG *)v31;
v15 = v32;
result[3] = (INT64)v31;
result[4] = (INT64)v32;
v16 = FsFilterPerformCallbacks((INT64)result, 1, 1, &a4);
v4 = v16;
if( v16 >= 0 )
{
if( v16 )
{
v4 = 0;
if( v16 != 294 )
v4 = v16;
goto LABEL_25;
}
FileObject = (FILE_OBJECT *)result[2];
if( (v35 & 4) != 0 )
{
BaseFileSystemDeviceObject = IoGetDeviceAttachmentBaseRefWithTag((DEVICE_OBJECT *)result[1], 0x746C6644ui64);
v17 = 1;
v19 = *((_QWORD *)BaseFileSystemDeviceObject + 1);
v11 = *(_QWORD *)(v19 + 80);
v12 = *(_QWORD *)(*(_QWORD *)(v19 + 48) + 48i64);
}
else
{
v17 = 0;
}
goto LABEL_12;
}
LABEL_25:
if( v4 == -1073741808 && (a4 & 1) != 0 )
{
FsContext = FileObject->FsContext;
if( *((_QWORD *)FsContext + 1) )
{
v21 = *((_BYTE *)FsContext + 4);
if( (v21 & 8) != 0 || (v22 = *((_QWORD *)FsContext + 5), *v14 > v22) && v22 != *((_QWORD *)FsContext + 4) )
{
v24 = 1;
}
else
{
if( (v21 & 0x10) == 0 )
{
v23 = (struct _ERESOURCE *)*((_QWORD *)FsContext + 2);
if( v23 )
{
v24 = 0;
goto LABEL_56;
}
}
v24 = 0;
}
v23 = (struct _ERESOURCE *)*((_QWORD *)FsContext + 1);
while( 1 )
{
LABEL_56:
if( v24 )
v25 = ExAcquireResourceExclusiveLite(v23, 0);
else
ExAcquireSharedWaitForExclusive((_HHIVE *)v23, 0i64, v7);
if( !v25 )
goto LABEL_73;
v27 = *((_BYTE *)FsContext + 4);
if( (v27 & 8) != 0 || *v14 > *((_QWORD *)FsContext + 5) )
{
if( v24 )
goto LABEL_45;
}
else
{
if( (v27 & 0x10) == 0 )
{
v28 = (_HHIVE *)*((_QWORD *)FsContext + 2);
if( !v28 || v23 == (struct _ERESOURCE *)v28 )
{
if( v24 )
LABEL_44:
ExConvertExclusiveToSharedLite(v23);
}
else
{
v23 = 0i64;
ExAcquireSharedWaitForExclusive(v28, 0i64, v26);
if( v29 )
v23 = (struct _ERESOURCE *)*((_QWORD *)FsContext + 2);
ExReleaseResourceLite(*((PERESOURCE *)FsContext + 1));
if( !v23 )
{
LABEL_73:
v4 = -1073741608;
goto LABEL_26;
}
}
LABEL_45:
*v15 = v23;
goto LABEL_46;
}
if( v24 )
goto LABEL_44;
if( v23 == *((struct _ERESOURCE **)FsContext + 1) )
goto LABEL_45;
}
ExReleaseResourceLite(v23);
v23 = (struct _ERESOURCE *)*((_QWORD *)FsContext + 1);
v24 = 1;
}
}
*v15 = 0i64;
LABEL_46:
v4 = 0;
}
LABEL_26:
if( v33 )
{
if( *((_WORD *)v33 + 37) )
FsFilterPerformCompletionCallbacks((__int64)result, v4);
if( (v35 & 1) != 0 )
FsFilterFreeCompletionStack((INT64)result);
}
return v4;
}Referenced by:
MiGatherMappedPages