MmManagePartitionNodeInformation
NTSTATUS __stdcall MmManagePartitionNodeInformation(INT64 a1, UINT64 *a2, CHAR a3){
void *v5;
NTSTATUS v6;
__int64 v7;
__int64 v8;
VOID *Pool;
__int64 *v10;
_EX_PUSH_LOCK *v11;
__int64 *v12;
unsigned int v13;
_EX_PUSH_LOCK *v14;
_ETHREAD *CurrentThread;
__int64 v17;
void *v19;
v5 = 0i64;
v19 = 0i64;
if( *((_DWORD *)a2 + 1) || (v7 = *(unsigned int *)a2, (_DWORD)v7 != (unsigned __int16)KeNumberNodes) )
{
v6 = -1073741811;
goto LABEL_20;
}
v8 = 72 * v7;
v17 = 72 * v7;
if( a3 )
{
Pool = MiAllocatePool(64i64, 72 * v7, 0x694E694Dui64);
v5 = Pool;
v19 = Pool;
if( !Pool )
{
v6 = -1073741670;
goto LABEL_20;
}
v10 = (__int64 *)Pool;
LODWORD(v7) = *(_DWORD *)a2;
}
else
{
v10 = (__int64 *)a2[1];
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v11 = *(_EX_PUSH_LOCK **)(*(_QWORD *)a1 + 16i64);
if( (_DWORD)v7 )
{
v12 = v10 + 7;
v13 = 0;
do
{
memset(v12 - 7, 0i64, 0x48u);
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockSharedEx(v11 + 537, 0i64);
*(v12 - 7) = v11[522]._bf_0;
*(v12 - 5) = v11[516]._bf_0;
*(v12 - 6) = v11[517]._bf_0;
*(v12 - 3) = v11[268]._bf_0;
*(v12 - 4) = v11[269]._bf_0;
*(v12 - 1) = v11[134]._bf_0;
*(v12 - 2) = v11[135]._bf_0;
v12[1] = v11->_bf_0;
*v12 = v11[1]._bf_0;
v14 = v11 + 537;
if( _InterlockedCompareExchange64(&v11[537]._bf_0, 0i64, 17i64) != 17 )
{
ExfReleasePushLockShared(v14);
v14 = v11 + 537;
}
KeAbPostRelease(v14);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
if( *(v12 - 5)
+ ((*v12 + v12[1]) << 18)
+ *(v12 - 6)
+ 16 * (*(v12 - 3) + *(v12 - 4) + 32 * (*(v12 - 1) + *(v12 - 2))) <= (unsigned __int64)*(v12 - 7) )
{
++v13;
v11 += 568;
v12 += 9;
}
}
while( v13 < *(_DWORD *)a2 );
v5 = v19;
v8 = v17;
}
if( a3 )
{
ProbeForWrite(a2[1], v8, 8i64);
memmove((VOID *)a2[1], v10, v8);
}
v6 = 0;
LABEL_20:
if( v5 )
ExFreePoolWithTag(v5, 0);
return v6;
}Referenced by:
NtManagePartition