CmRemoveDeviceFromContainerWorker

NTSTATUS __stdcall CmRemoveDeviceFromContainerWorker(
        HPNPCTX *hPnpCtx,
        WCHAR *ContainerId,
        WCHAR *BaseContainerId,
        WCHAR *DeviceInstanceId,
        WCHAR *ContainerDeleted,
        WCHAR *DeviceInstanceIda,
        WCHAR *_D0,
        UINT8 *a8,
        INT64 a9,
        UINT8 a10){
  NTSTATUS CachedContextBaseKey; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  __int64 v18; 
  _OBJECT_TYPE *v19; 
  __int64 v20; 
  __int64 v21; 
  VOID *v22; 
  WCHAR *v23; 
  UINT64 v24; 
  INT64 a5; 
  UINT8 a6; 
  INT64 a7; 
  INT64 v29; 
  UINT64 *v30; 
  VOID *KeyHandle; 
  VOID *Handle; 
  UINT64 v33; 
  INT64 v34[2]; 

  v34[0] = 0i64;
  v33 = 0i64;
  Handle = 0i64;
  KeyHandle = 0i64;
  LODWORD(v30) = 0;
  *(_BYTE *)ContainerDeleted = 0;
  CachedContextBaseKey = PnpCtxGetCachedContextBaseKey(
                           hPnpCtx,
                           PNPCTX_BASE_KEY_TYPE_CRITICALDEVICEDATABASE,
                           (VOID **)v34);
  if( CachedContextBaseKey >= 0 )
  {
    v15 = 0i64;
    if( hPnpCtx )
      v15 = *((_QWORD *)hPnpCtx + 28);
    CachedContextBaseKey = SysCtxRegOpenKey(v15, (VOID *)v34[0], ContainerId, 0, 1u, (VOID **)&v33);
    if( CachedContextBaseKey >= 0 )
    {
      v16 = 0i64;
      if( hPnpCtx )
        v16 = *((_QWORD *)hPnpCtx + 28);
      CachedContextBaseKey = SysCtxRegOpenKey(v16, (VOID *)v33, L"BaseContainers", 0, 1u, &Handle);
      if( CachedContextBaseKey >= 0 )
      {
        v17 = 0i64;
        if( hPnpCtx )
          v17 = *((_QWORD *)hPnpCtx + 28);
        CachedContextBaseKey = SysCtxRegOpenKey(v17, Handle, BaseContainerId, 0, 3u, &KeyHandle);
        if( CachedContextBaseKey >= 0 )
        {
          *(_OWORD *)v34 = 0i64;
          if( RtlInitUnicodeStringEx((_UNICODE_STRING *)v34, DeviceInstanceId) >= 0 )
            ZwDeleteValueKey(KeyHandle, (_UNICODE_STRING *)v34, v19);
          CachedContextBaseKey = PnpCtxRegQueryInfoKey(v18, KeyHandle, 0i64, 0i64, &v30, 0i64, 0i64);
          if( CachedContextBaseKey >= 0 )
          {
            if( !(_DWORD)v30 )
            {
              if( hPnpCtx && (v21 = *((_QWORD *)hPnpCtx + 28)) != 0 )
                v22 = *(VOID **)(v21 + 8);
              else
                v22 = 0i64;
              RegRtlDeleteTreeInternal(KeyHandle, 0i64, v22, 0);
            }
            CachedContextBaseKey = PnpCtxRegQueryInfoKey(v20, Handle, &v30, 0i64, 0i64, 0i64, 0i64);
            if( CachedContextBaseKey >= 0 )
            {
              if( !(_DWORD)v30 )
              {
                CachedContextBaseKey = CmDeleteDeviceContainer(hPnpCtx, ContainerId, v23, v24, a5, a6, a7, v29, v30);
                if( CachedContextBaseKey >= 0 )
                  *(_BYTE *)ContainerDeleted = 1;
              }
              PnpObjectRaisePropertyChangeEvent(
                (__int64)hPnpCtx,
                (INT64)DeviceInstanceId,
                1i64,
                0i64,
                0i64,
                (__int64)&DEVPKEY_Device_ContainerId);
            }
          }
        }
      }
    }
  }
  if( CachedContextBaseKey == -1073741772 || CachedContextBaseKey == -1073741444 )
    CachedContextBaseKey = 0;
  if( KeyHandle )
    ZwClose((_HANDLE)KeyHandle);
  if( Handle )
    ZwClose((_HANDLE)Handle);
  if( v33 )
    ZwClose(v33);
  return CachedContextBaseKey;
}

Referenced by:

CmRemoveDeviceFromContainer