CmRemoveDeviceFromContainerWorker
__int64 __fastcall CmRemoveDeviceFromContainerWorker(
__int64 a1,
const WCHAR *a2,
const WCHAR *a3,
const WCHAR *a4,
_BYTE *a5){
int CachedContextBaseKey;
__int64 v10;
__int64 v11;
__int64 v12;
__int64 v13;
__int64 v14;
__int64 v15;
__int64 v16;
int v18;
HANDLE KeyHandle;
HANDLE Handle;
HANDLE v21;
struct _UNICODE_STRING DestinationString;
*(_QWORD *)&DestinationString.Length = 0i64;
v21 = 0i64;
Handle = 0i64;
KeyHandle = 0i64;
v18 = 0;
*a5 = 0;
CachedContextBaseKey = PnpCtxGetCachedContextBaseKey(a1, 10, (__int64 *)&DestinationString);
if( CachedContextBaseKey >= 0 )
{
v10 = 0i64;
if( a1 )
v10 = *(_QWORD *)(a1 + 224);
CachedContextBaseKey = SysCtxRegOpenKey(v10, *(char **)&DestinationString.Length, a2, 0, 1u, &v21);
if( CachedContextBaseKey >= 0 )
{
v11 = 0i64;
if( a1 )
v11 = *(_QWORD *)(a1 + 224);
CachedContextBaseKey = SysCtxRegOpenKey(v11, (char *)v21, L"BaseContainers", 0, 1u, &Handle);
if( CachedContextBaseKey >= 0 )
{
v12 = 0i64;
if( a1 )
v12 = *(_QWORD *)(a1 + 224);
CachedContextBaseKey = SysCtxRegOpenKey(v12, (char *)Handle, a3, 0, 3u, &KeyHandle);
if( CachedContextBaseKey >= 0 )
{
DestinationString = 0i64;
if( (int)RtlInitUnicodeStringEx(&DestinationString, (WCHAR *)a4) >= 0 )
ZwDeleteValueKey(KeyHandle, &DestinationString);
CachedContextBaseKey = PnpCtxRegQueryInfoKey(v13, KeyHandle, 0i64, 0i64, &v18, 0i64, 0i64);
if( CachedContextBaseKey >= 0 )
{
if( !v18 )
{
if( a1 && (v15 = *(_QWORD *)(a1 + 224)) != 0 )
v16 = *(_QWORD *)(v15 + 8);
else
v16 = 0i64;
RegRtlDeleteTreeInternal((char *)KeyHandle, 0i64, v16, 0);
}
CachedContextBaseKey = PnpCtxRegQueryInfoKey(v14, Handle, &v18, 0i64, 0i64, 0i64, 0i64);
if( CachedContextBaseKey >= 0 )
{
if( !v18 )
{
CachedContextBaseKey = CmDeleteDeviceContainer(a1, a2);
if( CachedContextBaseKey >= 0 )
*a5 = 1;
}
PnpObjectRaisePropertyChangeEvent(a1, (__int64)a4, 1i64, 0i64, 0i64, (__int64)&DEVPKEY_Device_ContainerId);
}
}
}
}
}
}
if( CachedContextBaseKey == -1073741772 || CachedContextBaseKey == -1073741444 )
CachedContextBaseKey = 0;
if( KeyHandle )
ZwClose(KeyHandle);
if( Handle )
ZwClose(Handle);
if( v21 )
ZwClose(v21);
return(unsigned int)CachedContextBaseKey;
}Referenced by:
CmRemoveDeviceFromContainer