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