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