MiCopyHeaderIfResident
UINT64 __stdcall MiCopyHeaderIfResident(FILE_OBJECT *File, UINT64 ImagePageFrameNumber){
unsigned __int64 v4;
_SECTION_OBJECT_POINTERS *SectionObjectPointer;
INT64 *DataSectionObject;
INT64 v8;
INT64 v9;
_MMPFN *v10;
char v11;
UINT64 v12;
int v13;
__int64 v14;
volatile signed __int32 *v15;
UINT64 v16;
UINT64 v17;
_MMPFN *a4;
UINT64 v19;
_MMPFN *a3;
a4 = 0i64;
a3 = 0i64;
v19 = 0i64;
while( 1 )
{
v4 = ExAcquireSpinLockExclusive(&dword_140C4C6C0);
SectionObjectPointer = File->SectionObjectPointer;
if( !SectionObjectPointer || (DataSectionObject = (INT64 *)SectionObjectPointer->DataSectionObject) == 0i64 )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&dword_140C4C6C0);
LABEL_5:
__writecr8(v4);
return 0i64;
}
if( (unsigned int)ExTryAcquireSpinLockExclusiveAtDpcLevel(DataSectionObject + 9) )
break;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&dword_140C4C6C0);
__writecr8(v4);
}
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&dword_140C4C6C0);
if( (DataSectionObject[7] & 3) != 0
|| (v9 = DataSectionObject[17]) == 0
|| (int)MiTryLockProtoPoolPageAtDpc((INT64 *)DataSectionObject[17], v8, &a3, &a4) < 0 )
{
ExReleaseSpinLockExclusiveFromDpcLevel(DataSectionObject + 9);
goto LABEL_5;
}
v10 = a4;
v11 = *((_BYTE *)a4 + 34);
if( (v11 & 0x20) != 0 || (v11 & 0xC0) != 64 || (*((_BYTE *)a4 + 35) & 0x40) != 0 || MiIsPageOnBadList((INT64)a4) )
{
ExReleaseSpinLockExclusiveFromDpcLevel(DataSectionObject + 9);
__writecr8(2ui64);
v17 = 0x7FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
goto LABEL_30;
}
v19 = MI_READ_PTE_LOCK_FREE(v9);
v12 = v19;
if( (v19 & 1) != 0 )
{
MiPteInShadowRange((UINT64)&v19);
v13 = 0;
}
else
{
if( qword_140C4DC80 )
{
if( (v19 & 0x10) != 0 )
v12 = v19 & 0xFFFFFFFFFFFFFFEFui64;
else
v12 = ~qword_140C4DC80 & v19;
}
v13 = 1;
}
v14 = (v12 >> 12) & 0xFFFFFFFFFi64;
v15 = (volatile signed __int32 *)((char *)MmGetPfnDb() + 48 * ImagePageFrameNumber);
if( _interlockedbittestandset64(v15 + 6, 0x3Fui64) )
{
ExReleaseSpinLockExclusiveFromDpcLevel(DataSectionObject + 9);
__writecr8(2ui64);
v17 = 0x7FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)a4 + 3, 0x7FFFFFFFFFFFFFFFui64);
LABEL_30:
LOBYTE(v17) = v4;
MiUnlockProtoPoolPage(a3, v17);
return 0i64;
}
MiCopyPage(ImagePageFrameNumber, v14, 0i64, 4);
ExReleaseSpinLockExclusiveFromDpcLevel(DataSectionObject + 9);
__writecr8(2ui64);
if( v13 == 1 )
MiUpdatePageAttributeStamp(a4);
v16 = 0x7FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)v15 + 3, 0x7FFFFFFFFFFFFFFFui64);
_InterlockedAnd64((volatile signed __int64 *)a4 + 3, 0x7FFFFFFFFFFFFFFFui64);
LOBYTE(v16) = v4;
MiUnlockProtoPoolPage(a3, v16);
return 1i64;
}Referenced by:
MiCreateImageFileMap