Juan Lang : setupapi: Devices created by SetupDiCreateDeviceInfo are " phantoms", and are deleted from the registry when the set that contains them is closed .
Alexandre Julliard
julliard at winehq.org
Fri Sep 21 07:23:06 CDT 2007
Module: wine
Branch: master
Commit: 80be1fe74007ff207480036ee8596809eb3dae5d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=80be1fe74007ff207480036ee8596809eb3dae5d
Author: Juan Lang <juan.lang at gmail.com>
Date: Thu Sep 20 09:14:53 2007 -0700
setupapi: Devices created by SetupDiCreateDeviceInfo are "phantoms", and are deleted from the registry when the set that contains them is closed.
---
dlls/setupapi/devinst.c | 30 ++++++++++++++++++++++++++----
1 files changed, 26 insertions(+), 4 deletions(-)
diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c
index 3c8715c..9476ee2 100644
--- a/dlls/setupapi/devinst.c
+++ b/dlls/setupapi/devinst.c
@@ -83,6 +83,7 @@ static const WCHAR Capabilities[] = {'C','a','p','a','b','i','l','i','t','i','e'
static const WCHAR UINumber[] = {'U','I','N','u','m','b','e','r',0};
static const WCHAR UpperFilters[] = {'U','p','p','e','r','F','i','l','t','e','r','s',0};
static const WCHAR LowerFilters[] = {'L','o','w','e','r','F','i','l','t','e','r','s',0};
+static const WCHAR Phantom[] = {'P','h','a','n','t','o','m',0};
/* is used to identify if a DeviceInfoSet pointer is
valid or not */
@@ -101,10 +102,12 @@ struct DeviceInfoSet
struct DeviceInfo
{
HKEY key;
+ BOOL phantom;
LPWSTR instanceId;
};
-static struct DeviceInfo *SETUPDI_AllocateDeviceInfo(LPCWSTR instanceId)
+static struct DeviceInfo *SETUPDI_AllocateDeviceInfo(LPCWSTR instanceId,
+ BOOL phantom)
{
struct DeviceInfo *devInfo = HeapAlloc(GetProcessHeap(), 0,
sizeof(struct DeviceInfo));
@@ -119,6 +122,7 @@ static struct DeviceInfo *SETUPDI_AllocateDeviceInfo(LPCWSTR instanceId)
LONG l;
devInfo->key = INVALID_HANDLE_VALUE;
+ devInfo->phantom = phantom;
lstrcpyW(devInfo->instanceId, instanceId);
struprW(devInfo->instanceId);
l = RegCreateKeyExW(HKEY_LOCAL_MACHINE, Enum, 0, NULL, 0,
@@ -127,6 +131,9 @@ static struct DeviceInfo *SETUPDI_AllocateDeviceInfo(LPCWSTR instanceId)
{
RegCreateKeyExW(enumKey, devInfo->instanceId, 0, NULL, 0,
KEY_ALL_ACCESS, NULL, &devInfo->key, NULL);
+ if (phantom)
+ RegSetValueExW(devInfo->key, Phantom, 0, REG_DWORD,
+ (LPBYTE)&phantom, sizeof(phantom));
RegCloseKey(enumKey);
}
}
@@ -143,6 +150,19 @@ static void SETUPDI_FreeDeviceInfo(struct DeviceInfo *devInfo)
{
if (devInfo->key != INVALID_HANDLE_VALUE)
RegCloseKey(devInfo->key);
+ if (devInfo->phantom)
+ {
+ HKEY enumKey;
+ LONG l;
+
+ l = RegCreateKeyExW(HKEY_LOCAL_MACHINE, Enum, 0, NULL, 0,
+ KEY_ALL_ACCESS, NULL, &enumKey, NULL);
+ if (!l)
+ {
+ RegDeleteTreeW(enumKey, devInfo->instanceId);
+ RegCloseKey(enumKey);
+ }
+ }
HeapFree(GetProcessHeap(), 0, devInfo->instanceId);
HeapFree(GetProcessHeap(), 0, devInfo);
}
@@ -161,17 +181,19 @@ static void SETUPDI_GuidToString(const GUID *guid, LPWSTR guidStr)
/* Adds a device with GUID guid and identifer devInst to set. Allocates a
* struct DeviceInfo, and points the returned device info's Reserved member
- * to it.
+ * to it. "Phantom" devices are deleted from the registry when closed.
* Returns a pointer to the newly allocated device info.
*/
static BOOL SETUPDI_AddDeviceToSet(struct DeviceInfoSet *set,
const GUID *guid,
DWORD devInst,
LPCWSTR instanceId,
+ BOOL phantom,
SP_DEVINFO_DATA **dev)
{
BOOL ret = FALSE;
- struct DeviceInfo *devInfo = SETUPDI_AllocateDeviceInfo(instanceId);
+ struct DeviceInfo *devInfo = SETUPDI_AllocateDeviceInfo(instanceId,
+ phantom);
if (devInfo)
{
@@ -1002,7 +1024,7 @@ BOOL WINAPI SetupDiCreateDeviceInfoW(
SP_DEVINFO_DATA *dev = NULL;
ret = SETUPDI_AddDeviceToSet(set, ClassGuid, 0 /* FIXME: DevInst */,
- instanceId, &dev);
+ instanceId, TRUE, &dev);
if (ret)
{
if (DeviceDescription)
More information about the wine-cvs
mailing list