MiLockControlAreaSectionExtend
NTSTATUS __stdcall MiLockControlAreaSectionExtend(PVOID BugCheckParameter2){
__int64 v1;
_ETHREAD *CurrentThread;
__int64 v3;
INT64 *v5;
VOID *v6;
unsigned __int8 v7;
__int64 **v8;
unsigned __int64 v9;
_BYTE *v10;
NTSTATUS result;
VOID *v12;
CHAR v13;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = v1;
if( *(_DWORD *)(v1 + 8) == 16 )
--CurrentThread->Tcb.SpecialApcDisable;
else
--CurrentThread->Tcb.KernelApcDisable;
v5 = (INT64 *)((char *)BugCheckParameter2 + 72);
while( 1 )
{
v6 = 0i64;
v7 = ExAcquireSpinLockExclusive(v5);
v8 = (__int64 **)*((_QWORD *)BugCheckParameter2 + 10);
v9 = v7;
if( v8 )
{
do
{
if( (*(_DWORD *)(v3 + 8) & (_DWORD)v8[1]) != 0 )
break;
v8 = (__int64 **)*v8;
}
while( v8 );
if( v8 )
{
v12 = KeAbPreAcquire(BugCheckParameter2, 0i64, 0i64);
v6 = v12;
if( v12 )
KeAbPreWait(v12);
}
}
*(_DWORD *)(v3 + 20) = 0;
*(_QWORD *)(v3 + 32) = v3 + 24;
*(_QWORD *)(v3 + 24) = v3 + 24;
*(_WORD *)(v3 + 16) = 263;
*(_BYTE *)(v3 + 18) = 6;
*(_QWORD *)v3 = *((_QWORD *)BugCheckParameter2 + 10);
*((_QWORD *)BugCheckParameter2 + 10) = v3;
if( !v8 )
break;
ExReleaseSpinLockExclusiveFromDpcLevel(v5);
__writecr8(v9);
KeWaitForGate((_KGATE *)(v3 + 16), WrVirtualMemory, v13);
if( v6 )
{
KeAbPreAcquire(BugCheckParameter2, v6, 0i64);
KeAbPostReleaseEx(BugCheckParameter2, v6);
}
}
v10 = KeAbPreAcquire(BugCheckParameter2, 0i64, 0i64);
if( v10 )
v10[26] |= 1u;
ExReleaseSpinLockExclusiveFromDpcLevel(v5);
result = KiIrqlFlags;
__writecr8(v9);
return result;
}Referenced by:
MmExtendSection