CmOpenDevicePanelRegKeyWorker

__int64 __fastcall CmOpenDevicePanelRegKeyWorker(
        __int64 a1,
        const wchar_t *a2,
        int a3,
        __int64 a4,
        ACCESS_MASK a5,
        char a6,
        void **a7,
        _DWORD *a8){
  wchar_t *pszDest; 
  unsigned __int64 v12; 
  UINT64 i; 
  int v14; 
  int inited; 
  __int64 v16; 
  unsigned __int16 Length; 
  char v18; 
  HANDLE v19; 
  const wchar_t *v20; 
  _QWORD *v21; 
  int Tree; 
  __int64 v23; 
  int v25; 
  size_t cchDest; 
  HANDLE Handle; 
  void *v28; 
  struct _UNICODE_STRING DestinationString; 
  __int64 v30; 
  pszDest = 0i64;
  LODWORD(v30) = 0;
  v28 = 0i64;
  Handle = 0i64;
  DestinationString = 0i64;
  if( !a3 || (a3 & 0xFFFFFE9F) != 0 )
    goto LABEL_36;
  LODWORD(v12) = 317;
  for( i = 317i64; ; i = (unsigned int)v12 )
  {
    pszDest = (wchar_t *)ExAllocatePoolWithTag(PagedPool, i, 0x52504E50ui64);
    if( !pszDest )
      break;
    LODWORD(cchDest) = (unsigned int)v12 >> 1;
    CmGetDevicePanelRegKeyPath((unsigned int)v12 >> 1, a2, a3, v16, v25, pszDest, cchDest, (__int64)&v30);
    inited = v14;
    if( v14 != -1073741789 )
      goto LABEL_9;
    ExFreePoolWithTag(pszDest, 0);
    pszDest = 0i64;
    v12 = 2i64 * (unsigned int)v30;
    if( v12 > 0xFFFFFFFF )
    {
      inited = -1073741675;
      goto LABEL_37;
    }
  }
  inited = -1073741801;
LABEL_9:
  if( inited < 0 )
    goto LABEL_37;
  if( (a3 & 0x100) == 0 )
  {
    inited = RtlInitUnicodeStringEx(&DestinationString, pszDest);
    if( inited < 0 )
      goto LABEL_37;
    Length = DestinationString.Length;
    if( DestinationString.Length < (unsigned int)v12
      && DestinationString.Length > 0x32u
      && (unsigned __int8)RtlPrefixUnicodeString(
                            (PVOID)&`_CmOpenDevicePanelRegKeyWorker'::`2'::ObjectPathRootPrefix,
                            (INT64 *)&DestinationString) )
    {
      DestinationString.MaximumLength -= 50;
      DestinationString.Buffer = pszDest + 25;
      DestinationString.Length = Length - 50;
      v18 = RtlPrefixUnicodeString(
              (PVOID)&`_CmDeleteDevicePanelRegKeyWorker'::`2'::DevicePanelsKeyPrefix,
              (INT64 *)&DestinationString);
      inited = PnpCtxGetCachedContextBaseKey(a1, v18 != 0 ? 11 : 4, (__int64 *)&v28);
      if( inited < 0 )
        goto LABEL_37;
      v19 = v28;
      v20 = pszDest + 46;
      if( !v18 )
        v20 = pszDest + 25;
      goto LABEL_25;
    }
LABEL_36:
    inited = -1073741811;
    goto LABEL_37;
  }
  v20 = pszDest;
  if( a1 )
    v21 = *(_QWORD **)(a1 + 224);
  else
    v21 = 0i64;
  inited = SysCtxRegOpenCurrentUserKey(v21, 0, 0x2000000u, &Handle);
  if( inited < 0 )
    goto LABEL_37;
  v19 = Handle;
LABEL_25:
  if( a6 )
  {
    Tree = PnpCtxRegCreateTree(a1, v19, v20, 0, a5, 0i64, (__int64)a7, (__int64)a8);
  }
  else
  {
    if( a1 )
      v23 = *(_QWORD *)(a1 + 224);
    else
      v23 = 0i64;
    Tree = SysCtxRegOpenKey(v23, (char *)v19, v20, 0, a5, a7);
    if( Tree >= 0 )
      *a8 = 2;
  }
  if( Tree == -1073741444 )
  {
    inited = -1073741595;
  }
  else if( Tree < 0 )
  {
    inited = Tree;
  }
LABEL_37:
  if( Handle )
    ZwClose(Handle);
  if( pszDest )
    ExFreePoolWithTag(pszDest, 0);
  return(unsigned int)inited;
}

Referenced by:

CmOpenDevicePanelRegKey