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