CmRemovePanelDeviceWorker

NTSTATUS __stdcall CmRemovePanelDeviceWorker(HPNPCTX *hPnpCtx, WCHAR *SubKey, WCHAR *ObjectName, _BYTE *a4){
  NTSTATUS CachedContextBaseKey; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  _OBJECT_TYPE *v12; 
  VOID *v13; 
  __int64 v14; 
  VOID *v15; 
  VOID *KeyHandle; 
  VOID *Handle; 
  INT64 v19[2]; 
  int v20; 

  v19[0] = 0i64;
  Handle = 0i64;
  KeyHandle = 0i64;
  v20 = 0;
  *a4 = 0;
  CachedContextBaseKey = PnpCtxGetCachedContextBaseKey(hPnpCtx, PNPCTX_BASE_KEY_TYPE_CODEVICEINSTALLERS, (VOID **)v19);
  if( CachedContextBaseKey >= 0 )
  {
    v9 = hPnpCtx ? *((_QWORD *)hPnpCtx + 28) : 0i64;
    CachedContextBaseKey = SysCtxRegOpenKey(v9, (VOID *)v19[0], SubKey, 0, 1u, &Handle);
    if( CachedContextBaseKey >= 0 )
    {
      v10 = hPnpCtx ? *((_QWORD *)hPnpCtx + 28) : 0i64;
      CachedContextBaseKey = SysCtxRegOpenKey(v10, Handle, L"Devices", 0, 3u, &KeyHandle);
      if( CachedContextBaseKey >= 0 )
      {
        *(_OWORD *)v19 = 0i64;
        CachedContextBaseKey = RtlInitUnicodeStringEx((_UNICODE_STRING *)v19, ObjectName);
        if( CachedContextBaseKey >= 0 )
          CachedContextBaseKey = ZwDeleteValueKey(KeyHandle, (_UNICODE_STRING *)v19, v12);
        if( CachedContextBaseKey == -1073741772 || CachedContextBaseKey == -1073741444 || CachedContextBaseKey >= 0 )
        {
          v13 = KeyHandle;
          *a4 = 1;
          CachedContextBaseKey = PnpCtxRegQueryInfoKey(v11, v13, 0i64, 0i64, &v20, 0i64, 0i64);
          if( CachedContextBaseKey >= 0 )
          {
            if( !v20 )
            {
              if( hPnpCtx && (v14 = *((_QWORD *)hPnpCtx + 28)) != 0 )
                v15 = *(VOID **)(v14 + 8);
              else
                v15 = 0i64;
              RegRtlDeleteTreeInternal(KeyHandle, 0i64, v15, 0);
            }
            PnpObjectRaisePropertyChangeEvent(
              (__int64)hPnpCtx,
              (INT64)ObjectName,
              1i64,
              0i64,
              0i64,
              (__int64)&DEVPKEY_Device_PanelId);
          }
        }
      }
    }
  }
  if( CachedContextBaseKey == -1073741772 || CachedContextBaseKey == -1073741444 )
    CachedContextBaseKey = 0;
  if( KeyHandle )
    ZwClose((_HANDLE)KeyHandle);
  if( Handle )
    ZwClose((_HANDLE)Handle);
  return CachedContextBaseKey;
}

Referenced by:

CmRemovePanelDevice