CmpVEExecuteOpenLogic

INT64 __fastcall CmpVEExecuteOpenLogic(UINT64 a1, INT64 a2, WCHAR a3, INT64 a4, CHAR a5){
  char v8; 
  NTSTATUS v9; 
  CHAR PathByName; 
  WCHAR v12; 
  void *v13; 
  __int64 v14; 
  __int64 v15; 
  UINT64 v16; 
  __int64 v17; 
  _CMHIVE *TerminalHive; 
  INT64 v19; 
  PVOID P[2]; 
  LODWORD(v16) = 0;
  v8 = a3;
  v19 = 0i64;
  TerminalHive = 0i64;
  *(_OWORD *)P = 0i64;
  RtlInitUnicodeString((PUNICODE_STRING)P, 0i64, a3);
  v17 = 0xFFFFFFFFi64;
  if( CmpVEEnabled )
  {
    if( (*(_DWORD *)(a2 + 24) & 0x10) != 0 )
    {
      v9 = -1073741199;
    }
    else if( *(_WORD *)(a1 + 66) )
    {
      v9 = -1073741199;
    }
    else if( (*(_DWORD *)(a1 + 184) & 0x2000000) != 0 )
    {
      if( (*(_DWORD *)(a1 + 8) & 0x7FE00000u) > 0xA00000 )
      {
        if( CmpIsSystemEntity((UINT64 *)(unsigned __int8)a5) )
        {
          v9 = -1073741199;
        }
        else if( CmpVEEnabled && (*(_DWORD *)(a1 + 184) & 0x1000000) != 0 )
        {
          v9 = -1073741199;
        }
        else
        {
          if( (*(_DWORD *)(a2 + 160) & 1) == 0 )
          {
            CmpAttachToRegistryProcess((KAPC_STATE *)(a2 + 168));
            *(_DWORD *)(a2 + 160) |= 1u;
          }
          v9 = CmVirtualKCBToRealPath((_CM_KEY_CONTROL_BLOCK *)a1, (_UNICODE_STRING *)P);
          if( v9 >= 0 )
          {
            v9 = CmpBlockHiveWrites(0i64, 0x10ui64, &TerminalHive);
            if( v9 < 0 )
            {
              if( TerminalHive )
                CmpUnblockHiveWrites(0i64, 16, (volatile signed __int32 *)TerminalHive);
            }
            else
            {
              PathByName = CmpFindPathByName(0i64, (__m128i *)P, 0i64, &v16, &v19);
              CmpUnblockHiveWrites(0i64, 16, (volatile signed __int32 *)TerminalHive);
              if( PathByName )
              {
                v13 = *(void **)(a4 + 8);
                if( v13 )
                  ExFreePoolWithTag(v13, 0);
                *(_OWORD *)a4 = *(_OWORD *)P;
                RtlInitUnicodeString((PUNICODE_STRING)P, 0i64, v12);
                *(_DWORD *)a2 |= 8u;
                v9 = 260;
              }
              else if( v8 || (CmpUnlockKcb(a1), CmpLockKcbExclusive(a1), !CmpIsKeyDeleted(a1, 0i64)) )
              {
                ExAcquirePushLockSharedEx(*(_QWORD *)(a1 + 32) + 72i64, 0i64);
                v14 = *(_QWORD *)(a1 + 32);
                v15 = (*(__int64(__fastcall **)(__int64, _QWORD, __int64 *))(v14 + 8))(
                        v14,
                        *(unsigned int *)(a1 + 40),
                        &v17);
                if( v15 )
                {
                  if( HvpMarkCellDirty(*(_QWORD *)(a1 + 32), *(unsigned int *)(a1 + 40), 1) )
                  {
                    *(_WORD *)(v15 + 2) |= 0x100u;
                    *(_WORD *)(a1 + 186) |= 0x100u;
                    *(_DWORD *)a2 |= 8u;
                    v9 = 260;
                  }
                  else
                  {
                    v9 = -1073741443;
                  }
                  (*(void(__fastcall **)(_QWORD, __int64 *))(*(_QWORD *)(a1 + 32) + 16i64))(*(_QWORD *)(a1 + 32), &v17);
                }
                else
                {
                  v9 = -1073741670;
                }
                if( v14 )
                {
                  if( _InterlockedCompareExchange64((volatile signed __int64 *)(v14 + 72), 0i64, 17i64) != 17 )
                    ExfReleasePushLockShared((INT64 *)(v14 + 72));
                  KeAbPostRelease((PVOID)(v14 + 72));
                }
              }
              else
              {
                v9 = -1073741772;
              }
            }
          }
        }
      }
      else
      {
        v9 = -1073741199;
      }
    }
    else
    {
      v9 = -1073741199;
    }
  }
  else
  {
    v9 = -1073741199;
  }
  if( P[1] )
    ExFreePoolWithTag(P[1], 0);
  return(unsigned int)v9;
}

Referenced by:

CmpDoParseKey