MiReferenceExistingControlArea
NTSTATUS __stdcall MiReferenceExistingControlArea(INT64 a1){
__int64 v1;
_CONTROL_AREA *v3;
INT64 *p_ControlAreaLock;
int v5;
_CONTROL_AREA *v6;
_MI_CONTROL_AREA_WAIT_BLOCK *v7;
UINT8 OldIrql;
v1 = *(_QWORD *)(a1 + 48);
OldIrql = 0;
v3 = MiLockSectionControlArea(*(_MI_SECTION_OBJECT_POINTERS **)(v1 + 40), (*(_BYTE *)(a1 + 19) & 1) == 0, &OldIrql);
if( !v3 )
return -1073741823;
p_ControlAreaLock = (INT64 *)&v3->ControlAreaLock;
if( (v3->u.LongFlags & 3) != 0 )
{
ExReleaseSpinLockExclusiveFromDpcLevel(p_ControlAreaLock);
__writecr8(OldIrql);
return -1073741823;
}
v5 = MiValidateControlAreaPartition(a1, (INT64)v3);
if( v5 < 0 )
{
ExReleaseSpinLockExclusiveFromDpcLevel(p_ControlAreaLock);
__writecr8(OldIrql);
return v5;
}
else
{
v7 = MiReferenceActiveControlArea((_DWORD *)a1, v6);
ExReleaseSpinLockExclusiveFromDpcLevel(p_ControlAreaLock);
__writecr8(OldIrql);
MiReleaseControlAreaWaiters(v7);
return 0;
}
}Referenced by:
MiCreateImageOrDataSection