MmChangeSectionBackingFile
VOID __fastcall MmChangeSectionBackingFile(_FILE_OBJECT *CurrentFileObject, _FILE_OBJECT *NewFileObject, UINT64 Flags){
int v5;
unsigned __int8 v6;
_SECTION_OBJECT_POINTERS *SectionObjectPointer;
unsigned __int64 v8;
_EX_FAST_REF *DataSectionObject;
UINT64 v10;
_EX_FAST_REF *v11;
unsigned __int64 v12;
_FILE_OBJECT *v13;
int Object;
INT64 *v15;
if( (Flags & 0xFFFFFFFC) != 0
|| (_DWORD)Flags == 3
|| CurrentFileObject && CurrentFileObject->SectionObjectPointer != NewFileObject->SectionObjectPointer )
{
return;
}
v5 = Flags & 1;
while( 1 )
{
v6 = ExAcquireSpinLockExclusive(&SpinLock);
SectionObjectPointer = NewFileObject->SectionObjectPointer;
v8 = v6;
if( v5 )
DataSectionObject = (_EX_FAST_REF *)SectionObjectPointer->DataSectionObject;
else
DataSectionObject = (_EX_FAST_REF *)SectionObjectPointer->ImageSectionObject;
if( !DataSectionObject )
{
v15 = &SpinLock;
goto LABEL_18;
}
if( (unsigned int)ExTryAcquireSpinLockExclusiveAtDpcLevel((INT64 *)&DataSectionObject[9]) )
break;
ExReleaseSpinLockExclusiveFromDpcLevel(&SpinLock);
__writecr8(v8);
}
ExReleaseSpinLockExclusiveFromDpcLevel(&SpinLock);
if( ((__int64)DataSectionObject[7].Object & 1) == 0 )
{
v11 = DataSectionObject + 8;
if( !CurrentFileObject )
{
v12 = v11->Value & 0xFFFFFFFFFFFFFFF0ui64;
if( !v12 )
goto LABEL_14;
ObFastReplaceObject(v11, NewFileObject, v10);
ObfReferenceObjectWithTag(NewFileObject, 0x746C6644ui64);
v13 = (_FILE_OBJECT *)v12;
goto LABEL_13;
}
if( (_FILE_OBJECT *)(v11->Value & 0xFFFFFFFFFFFFFFF0ui64) == CurrentFileObject )
{
ObFastReplaceObject(v11, NewFileObject, v10);
ObfReferenceObjectWithTag(NewFileObject, 0x746C6644ui64);
v13 = CurrentFileObject;
LABEL_13:
ObDereferenceObjectDeferDeleteWithTag((UINT64)v13, 1953261124i64);
}
}
LABEL_14:
Object = (int)DataSectionObject[7].Object;
if( (Object & 0x200) != 0 && ((__int64)KeGetCurrentThread()[1].Queue & 0x40) == 0 )
LODWORD(DataSectionObject[7].Object) = Object & 0xFFFFFDFF;
v15 = (INT64 *)&DataSectionObject[9];
LABEL_18:
ExReleaseSpinLockExclusiveFromDpcLevel(v15);
__writecr8(v8);
}Referenced by:
FsRtlChangeBackingFileObject
MiShareExistingControlArea