CmpVEExecuteVirtualStoreParseLogic

VOID __fastcall CmpVEExecuteVirtualStoreParseLogic(_CM_KEY_CONTROL_BLOCK *FoundKcb, _UNICODE_STRING *RemainingName){
  _DWORD *v2; 
  UNICODE_STRING *v3; 
  _CMHIVE *v6; 
  UNICODE_STRING *v7; 
  _DWORD *v8; 
  WCHAR v9; 
  unsigned int v10; 
  WCHAR v11; 
  CHAR PathByName; 
  WCHAR v13; 
  wchar_t *Buffer; 
  wchar_t *v15; 
  UINT64 v16; 
  _CMHIVE *TerminalHive; 
  INT64 v18; 
  UNICODE_STRING v19; 
  struct _UNICODE_STRING DestinationString; 
  UINT8 ParentReplicated; 
  v18 = 0i64;
  LODWORD(v16) = 0;
  ParentReplicated = 0;
  v6 = 0i64;
  DestinationString = 0i64;
  TerminalHive = 0i64;
  v7 = v3;
  v19 = 0i64;
  v8 = v2;
  RtlInitUnicodeString(&DestinationString, 0i64, (WCHAR)v2);
  RtlInitUnicodeString(&v19, 0i64, v9);
  *v8 |= 8u;
  if( !(unsigned __int8)CmpVirtualBranchIsReplicated(FoundKcb, RemainingName, &ParentReplicated)
    && CmVirtualKCBToRealPath(FoundKcb, &DestinationString) >= 0 )
  {
    v10 = RemainingName->Length + DestinationString.Length + 2;
    if( v10 <= 0xFFFF )
    {
      v19.MaximumLength = RemainingName->Length + DestinationString.Length + 2;
      v19.Buffer = (wchar_t *)ExAllocatePoolWithTag(PagedPool, (unsigned __int16)v10, 0x624E4D43ui64);
      if( !v19.Buffer )
        goto LABEL_22;
      RtlUnicodeStringCopy(&v19, &DestinationString);
      CmpUnicodeStringAppendCharacter(&v19.Length);
      RtlUnicodeStringCat(&v19, RemainingName);
      if( (*v8 & 1) != 0 && ParentReplicated )
      {
        if( CmpBlockHiveWrites(0i64, 0x10ui64, &TerminalHive) >= 0 )
        {
          PathByName = CmpFindPathByName(0i64, (__m128i *)&v19, 0i64, &v16, &v18);
          CmpUnblockHiveWrites(0i64, 16, (volatile signed __int32 *)TerminalHive);
          if( PathByName )
          {
            Buffer = v7->Buffer;
            if( Buffer )
              ExFreePoolWithTag(Buffer, 0);
            *v7 = v19;
            RtlInitUnicodeString(&v19, 0i64, v13);
          }
          goto LABEL_20;
        }
        v6 = TerminalHive;
LABEL_18:
        if( v6 )
          CmpUnblockHiveWrites(0i64, 16, (volatile signed __int32 *)v6);
        goto LABEL_20;
      }
      if( (*((_DWORD *)FoundKcb + 2) & 0x7FE00000u) > 0x800000 )
      {
        v15 = v7->Buffer;
        if( v15 )
          ExFreePoolWithTag(v15, 0);
        *v7 = v19;
        RtlInitUnicodeString(&v19, 0i64, v11);
        goto LABEL_18;
      }
    }
  }
LABEL_20:
  if( v19.Buffer )
    ExFreePoolWithTag(v19.Buffer, 0);
LABEL_22:
  if( DestinationString.Buffer )
    ExFreePoolWithTag(DestinationString.Buffer, 0);
}

Referenced by:

CmpVEExecuteParseLogic