CmOpenDevicePanelRegKeyWorker

NTSTATUS __fastcall CmOpenDevicePanelRegKeyWorker(
        HPNPCTX *hPnpCtx,
        INT64 a2,
        INT64 a3,
        INT64 a4,
        UINT64 a5,
        INT8 a6,
        VOID **a7,
        UINT64 *pRegDisposition){
  wchar_t *PoolWithTag; 
  unsigned int v9; 
  unsigned __int64 v12; 
  UINT64 i; 
  int v14; 
  int inited; 
  INT64 v16; 
  unsigned __int16 Length; 
  unsigned __int8 v18; 
  VOID *v19; 
  WCHAR *v20; 
  HSYSCTX *v21; 
  NTSTATUS Tree; 
  __int64 v23; 
  INT64 v25; 
  INT64 pszDest; 
  INT64 cchDest; 
  INT64 v28; 
  VOID *Handle; 
  INT64 v30; 
  _UNICODE_STRING DestinationString; 
  INT64 v32; 

  PoolWithTag = 0i64;
  LODWORD(v32) = 0;
  v9 = a3;
  v30 = 0i64;
  Handle = 0i64;
  DestinationString = 0i64;
  if( !(_DWORD)a3 || (a3 & 0xFFFFFE9F) != 0 )
    goto LABEL_36;
  LODWORD(v12) = 317;
  for( i = 317i64; ; i = (unsigned int)v12 )
  {
    PoolWithTag = (wchar_t *)ExAllocatePoolWithTag(1ui64, i, 1380994640i64);
    if( !PoolWithTag )
      break;
    CmGetDevicePanelRegKeyPath(
      (unsigned int)v12 >> 1,
      (const WCHAR *)a2,
      v9,
      v16,
      v25,
      (_NTSTRSAFE_PWSTR)PoolWithTag,
      (unsigned int)v12 >> 1,
      (INT64)&v32);
    inited = v14;
    if( v14 != -1073741789 )
      goto LABEL_9;
    ExFreePoolWithTag(PoolWithTag, 0);
    PoolWithTag = 0i64;
    v12 = 2i64 * (unsigned int)v32;
    if( v12 > 0xFFFFFFFF )
    {
      inited = -1073741675;
      goto LABEL_37;
    }
  }
  inited = -1073741801;
LABEL_9:
  if( inited < 0 )
    goto LABEL_37;
  if( (v9 & 0x100) == 0 )
  {
    inited = RtlInitUnicodeStringEx(&DestinationString, PoolWithTag);
    if( inited < 0 )
      goto LABEL_37;
    Length = DestinationString.Length;
    if( DestinationString.Length < (unsigned int)v12
      && DestinationString.Length > 0x32u
      && (unsigned __int8)RtlPrefixUnicodeString(
                            &`_CmOpenDevicePanelRegKeyWorker'::`2'::ObjectPathRootPrefix,
                            &DestinationString,
                            1u) )
    {
      DestinationString.MaximumLength -= 50;
      DestinationString.Buffer = PoolWithTag + 25;
      DestinationString.Length = Length - 50;
      v18 = (unsigned __int8)RtlPrefixUnicodeString(
                               &`_CmDeleteDevicePanelRegKeyWorker'::`2'::DevicePanelsKeyPrefix,
                               &DestinationString,
                               1u);
      inited = PnpCtxGetCachedContextBaseKey(
                 hPnpCtx,
                 (PNPCTX_BASE_KEY_TYPE)(v18 != 0 ? PNPCTX_BASE_KEY_TYPE_CODEVICEINSTALLERS : PNPCTX_BASE_KEY_TYPE_CONTROLSET),
                 (VOID **)&v30);
      if( inited < 0 )
        goto LABEL_37;
      v19 = (VOID *)v30;
      v20 = PoolWithTag + 46;
      if( !v18 )
        v20 = PoolWithTag + 25;
      goto LABEL_25;
    }
LABEL_36:
    inited = -1073741811;
    goto LABEL_37;
  }
  v20 = PoolWithTag;
  if( hPnpCtx )
    v21 = (HSYSCTX *)*((_QWORD *)hPnpCtx + 28);
  else
    v21 = 0i64;
  inited = SysCtxRegOpenCurrentUserKey(v21, 0, 0x2000000, &Handle, v25, pszDest, cchDest, v28);
  if( inited < 0 )
    goto LABEL_37;
  v19 = Handle;
LABEL_25:
  if( a6 )
  {
    LODWORD(v25) = a5;
    Tree = PnpCtxRegCreateTree(hPnpCtx, v19, v20, 0i64, v25, 0i64, a7, pRegDisposition);
  }
  else
  {
    if( hPnpCtx )
      v23 = *((_QWORD *)hPnpCtx + 28);
    else
      v23 = 0i64;
    Tree = SysCtxRegOpenKey(v23, v19, v20, 0, a5, a7);
    if( Tree >= 0 )
      *(_DWORD *)pRegDisposition = 2;
  }
  if( Tree == -1073741444 )
  {
    inited = -1073741595;
  }
  else if( Tree < 0 )
  {
    inited = Tree;
  }
LABEL_37:
  if( Handle )
    ZwClose((_HANDLE)Handle);
  if( PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0);
  return inited;
}

Referenced by:

CmOpenDevicePanelRegKey