MiChangingSubsectionProtos
NTSTATUS __stdcall MiChangingSubsectionProtos(ULONG_PTR BugCheckParameter2){
char v1;
__int64 v2;
__int64 v3;
int v4;
NTSTATUS v5;
__int64 v6;
_SUBSECTION *v7;
INT64 *v8;
unsigned __int64 v9;
bool v10;
int v11;
_RTL_BALANCED_NODE *v12;
CHAR v13;
_BYTE *v14;
__int64 v16;
VOID *LockHandle;
char v18;
int v19;
v18 = v1;
v3 = **(_QWORD **)&BugCheckParameter2;
v4 = v1 & 0x10;
v16 = **(_QWORD **)&BugCheckParameter2;
v5 = 0;
v19 = v4;
v6 = v2;
v7 = *(_SUBSECTION **)&BugCheckParameter2;
v8 = (INT64 *)(**(_QWORD **)&BugCheckParameter2 + 72i64);
while( 1 )
{
v9 = (unsigned __int8)ExAcquireSpinLockExclusive(v8);
if( v4 )
{
MiUnlinkSubsectionWaitBlock(v7, (_MI_CONTROL_AREA_WAIT_BLOCK *)v6, 1ui64);
v10 = *(_DWORD *)(v6 + 12) == 2;
*(_DWORD *)(v6 + 8) = 0;
if( v10 )
{
ExReleaseSpinLockExclusiveFromDpcLevel(v8);
v5 = -1073740748;
goto LABEL_33;
}
}
v11 = v18 & 8;
*(_DWORD *)(v6 + 8) = v11 != 0 ? 0x40 : 0;
if( (v18 & 0x20) != 0 )
*(_DWORD *)(v6 + 8) |= 0x100u;
if( v4 )
*(_DWORD *)(v6 + 8) |= 0x80u;
if( v7->SubsectionBase && (v18 & 1) != 0 )
{
ExReleaseSpinLockExclusiveFromDpcLevel(v8);
v5 = -1073741302;
goto LABEL_33;
}
LockHandle = 0i64;
v12 = 0i64;
if( (v18 & 8) == 0 )
{
v12 = (*(_DWORD *)(v3 + 56) & 0x20) != 0 ? *(_RTL_BALANCED_NODE **)(v3 + 80) : v7->GlobalPerSessionHead.Root;
if( v12 )
{
do
{
if( ((__int64)v12->Right & 0x40) == 0 )
break;
v12 = v12->Children[0];
}
while( v12 );
if( v12 )
{
LockHandle = KeAbPreAcquire(v7, 0i64, 0i64);
if( LockHandle )
KeAbPreWait(LockHandle);
v11 = v18 & 8;
}
}
}
*(_DWORD *)(v6 + 12) = 0;
*(_WORD *)(v6 + 16) = 263;
*(_BYTE *)(v6 + 18) = 6;
*(_DWORD *)(v6 + 20) = 0;
*(_QWORD *)(v6 + 32) = v6 + 24;
*(_QWORD *)(v6 + 24) = v6 + 24;
if( (*(_DWORD *)(v16 + 56) & 0x20) != 0 )
{
*(_QWORD *)v6 = *(_QWORD *)(v16 + 80);
*(_QWORD *)(v16 + 80) = v6;
}
else
{
*(_QWORD *)v6 = v7->GlobalPerSessionHead.Root;
v7->GlobalPerSessionHead.Root = (_RTL_BALANCED_NODE *)v6;
}
if( v11 )
break;
if( !v12 )
{
v14 = KeAbPreAcquire(v7, 0i64, 0i64);
if( v14 )
v14[26] |= 1u;
break;
}
ExReleaseSpinLockExclusiveFromDpcLevel(v8);
__writecr8(v9);
KeWaitForGate((_KGATE *)(v6 + 16), WrVirtualMemory, v13);
v3 = v16;
v4 = v19;
if( LockHandle )
{
KeAbPreAcquire(v7, LockHandle, 0i64);
KeAbPostReleaseEx(v7, LockHandle);
}
}
ExReleaseSpinLockExclusiveFromDpcLevel(v8);
LABEL_33:
__writecr8(v9);
return v5;
}Referenced by:
MiAllocateFileExtents
MiPurgeFileOnlyPfn
MmPurgeSection