MiReferenceControlArea
__int64 __fastcall MiReferenceControlArea(__int64 a1, __int64 a2, __int64 *a3){
bool v3;
__int64 v6;
INT64 *v7;
KIRQL v8;
INT64 v9;
unsigned __int64 v10;
int v11;
_MI_CONTROL_AREA_WAIT_BLOCK *v12;
__int64 v14;
void *v15;
void *v16;
__int128 v17;
__int128 PcValue;
__int64 v19;
_FILE_OBJECT *FileObject;
v3 = (*(_DWORD *)(a1 + 16) & 0x1000000) == 0;
v19 = 0i64;
v6 = *(_QWORD *)(a1 + 56);
v17 = 0i64;
FileObject = (_FILE_OBJECT *)v6;
PcValue = 0i64;
v7 = *(INT64 **)(v6 + 40);
if( !v3 )
v7 += 2;
while( 1 )
{
v8 = ExAcquireSpinLockExclusive(&dword_140C4C6C0);
v9 = *v7;
v10 = v8;
if( !*v7 )
{
*v7 = a2;
LODWORD(v14) = KeAbPreAcquire(v7, 0i64, 0i64);
if( v14 )
*(_BYTE *)(v14 + 26) |= 1u;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&dword_140C4C6C0);
__writecr8(v10);
*a3 = a2;
return 0i64;
}
if( (unsigned int)ExTryAcquireSpinLockExclusiveAtDpcLevel((INT64 *)(v9 + 72)) )
break;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&dword_140C4C6C0);
__writecr8(v10);
}
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&dword_140C4C6C0);
v11 = MiValidateControlAreaPartition(a1, v9);
if( v11 < 0 )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v9 + 72));
LABEL_25:
__writecr8(v10);
if( (*(_DWORD *)a1 & 1) == 0 )
{
*((_QWORD *)KeGetCurrentThread() + 152) = *(_QWORD *)(a1 + 184);
FsRtlReleaseFile(FileObject);
*(_DWORD *)a1 &= ~2u;
}
return(unsigned int)v11;
}
else
{
if( !(*(_DWORD *)(v9 + 56) & 1 | ((*(_DWORD *)(v9 + 56) & 2) != 0)) )
{
if( (*(_DWORD *)(a1 + 16) & 0x1000000) != 0
&& (*(_DWORD *)(a1 + 20) & 0x100000) != 0
&& !(unsigned int)MiControlAreaRequiresCharge(v9) )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v9 + 72));
v11 = -1073740277;
goto LABEL_25;
}
v12 = MiReferenceActiveControlArea((_DWORD *)a1, v9);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v9 + 72));
__writecr8(v10);
MiReleaseControlAreaWaiters(v12);
*a3 = v9;
return 0i64;
}
LODWORD(v15) = KeAbPreAcquire(v7, 0i64, 0i64);
v16 = v15;
if( v15 )
KeAbPreWait(v15);
DWORD1(PcValue) = 0;
v19 = (__int64)&PcValue + 8;
LOWORD(PcValue) = 263;
*((_QWORD *)&PcValue + 1) = (char *)&PcValue + 8;
BYTE2(PcValue) = 6;
DWORD2(v17) = 1;
*(_QWORD *)&v17 = *(_QWORD *)(v9 + 80);
*(_QWORD *)(v9 + 80) = &v17;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v9 + 72));
__writecr8(v10);
if( (*(_DWORD *)a1 & 1) == 0 )
{
*((_QWORD *)KeGetCurrentThread() + 152) = *(_QWORD *)(a1 + 184);
FsRtlReleaseFile(FileObject);
*(_DWORD *)a1 &= ~2u;
}
KeWaitForGate(&PcValue, 18);
if( v16 )
{
KeAbPreAcquire(v7, v16, 0i64);
KeAbPostReleaseEx(v7, v16);
}
*a3 = 0i64;
return 3221226029i64;
}
}Referenced by:
MiCreateImageOrDataSection