MiInsertPageFileInList
VOID __stdcall MiInsertPageFileInList(PUNICODE_STRING FileName){
UINT64 v1;
unsigned int v3;
__int64 v4;
wchar_t *StartContext;
_ETHREAD *CurrentThread;
unsigned int v7;
volatile signed __int64 *v8;
__int64 v9;
int v10;
unsigned int v11;
__int16 v12;
__int64 *v13;
__int64 v14;
__int64 v15;
__int16 v16;
int v17;
__int16 v18;
char v19;
BOOL v20;
PVOID ThreadHandle;
UINT64 MaximumIncrement;
v1 = *(_QWORD *)&FileName->Length;
ThreadHandle = 0i64;
v3 = 0;
MaximumIncrement = (UINT64)FileName->Buffer;
BYTE6(FileName[12].Buffer) |= 1u;
if( LODWORD(FileName[4].Buffer) )
{
do
{
v4 = v3++;
**(_QWORD **)(*(_QWORD *)&FileName[4].Length + 8 * v4) = 2575857425i64;
}
while( v3 < LODWORD(FileName[4].Buffer) );
}
StartContext = FileName[15].Buffer;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v7 = 16;
if( StartContext != (wchar_t *)&MiSystemPartition )
v7 = 1;
--*((_WORD *)CurrentThread + 243);
v8 = (volatile signed __int64 *)(StartContext + 520);
ExAcquirePushLockExclusiveEx((UINT64)(StartContext + 520), 0i64);
if( dword_140C4E404 )
{
if( (_InterlockedExchangeAdd64(v8, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)StartContext + 130);
goto LABEL_47;
}
if( !*((_QWORD *)StartContext + 20) )
{
if( !MiMakePartitionActive((_MI_PARTITION *)StartContext) )
{
if( (_InterlockedExchangeAdd64(v8, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)StartContext + 130);
goto LABEL_47;
}
if( PsCreateSystemThreadEx(
&ThreadHandle,
0x1FFFFFui64,
0i64,
*(PVOID *)(*((_QWORD *)StartContext + 22) + 112i64),
0i64,
MiModifiedPageWriter,
StartContext,
0i64,
0i64) < 0 )
{
if( (_InterlockedExchangeAdd64(v8, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)StartContext + 130);
goto LABEL_47;
}
*((_QWORD *)StartContext + 20) = ThreadHandle;
}
v9 = *((unsigned int *)StartContext + 1734);
if( (unsigned int)v9 >= v7 )
goto LABEL_45;
v10 = 0;
WORD2(FileName[12].Buffer) ^= ((unsigned __int8)v9 ^ (unsigned __int8)WORD2(FileName[12].Buffer)) & 0xF;
v11 = *((_DWORD *)StartContext + 1734);
v12 = WORD2(FileName[12].Buffer);
if( v11 )
{
v13 = (__int64 *)(StartContext + 3472);
v14 = v11;
do
{
v15 = *v13++;
v16 = *(_WORD *)(v15 + 204);
v17 = v10 + 1;
if( (v16 & 0x800) == 0 )
v17 = v10;
v10 = v17;
--v14;
}
while( v14 );
if( v17 )
{
if( (v12 & 0x810) != 0 )
{
if( (_InterlockedExchangeAdd64(v8, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)StartContext + 130);
goto LABEL_47;
}
WORD2(FileName[12].Buffer) = v12 | 0x20;
}
}
v18 = WORD2(FileName[12].Buffer);
if( (v18 & 0x50) == 0 )
{
if( (unsigned int)MiIncreaseCommitLimits((_MI_PARTITION *)StartContext, v1, MaximumIncrement, 0i64, FileName) )
{
if( (BYTE4(FileName[12].Buffer) & 0x20) == 0 && !*((_DWORD *)StartContext + 259) )
*((_DWORD *)StartContext + 259) = 1;
goto LABEL_21;
}
if( (_InterlockedExchangeAdd64(v8, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)StartContext + 130);
LABEL_47:
KeAbPostRelease(StartContext + 520);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
return;
}
if( (v18 & 0x10) != 0 && (unsigned int)MiNumberWsSwapPagefiles((_MI_PARTITION *)StartContext) )
{
LABEL_45:
if( (_InterlockedExchangeAdd64(v8, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)StartContext + 130);
goto LABEL_47;
}
MiUpdatePageFileList((__int64)FileName, 1);
*(_QWORD *)&StartContext[4 * v9 + 3472] = FileName;
*((_DWORD *)StartContext + 1734) = v9 + 1;
LABEL_21:
v19 = _InterlockedExchangeAdd64(v8, 0xFFFFFFFFFFFFFFFFui64);
if( (v19 & 2) != 0 && (v19 & 4) == 0 )
ExfTryToWakePushLock((volatile INT64 *)StartContext + 130);
KeAbPostRelease(StartContext + 520);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
MiUpdateReserveClusterInfo((INT64)StartContext, 0i64, 0);
KeSetEvent((PRKEVENT)(StartContext + 440), v20);
}Referenced by:
MiCreatePagingFile
MmStoreRegister