[PATCH 0/5] MR9930: cfgmgr32: Update header and specifications.
This is in preparation for implementing cfgmgr32 functions more properly, which are widely used by native gameinput. The module is supposed to be the lower-level API, abstracting the registry, and used by other modules like setupapi instead of the other way around. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/9930
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/cfgmgr32/tests/cfgmgr32.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dlls/cfgmgr32/tests/cfgmgr32.c b/dlls/cfgmgr32/tests/cfgmgr32.c index 6061d26fda2..84a932a330c 100644 --- a/dlls/cfgmgr32/tests/cfgmgr32.c +++ b/dlls/cfgmgr32/tests/cfgmgr32.c @@ -701,7 +701,7 @@ static void test_DevGetObjectProperties( DEV_OBJECT_TYPE type, const WCHAR *id, buf = NULL; hr = pDevGetObjectProperties( type, id, DevQueryFlagNone, 1, &dummy_propcompkey, &buf_len, &buf ); ok( hr == S_OK, "got hr %#lx\n", hr ); - ok( !!buf, "got buf %p", buf ); + ok( !!buf, "got buf %p\n", buf ); ok( buf_len == 1, "got buf_len %lu\n", buf_len ); if (buf) { @@ -1648,7 +1648,7 @@ static void test_DevGetObjects( void ) ok( IsEqualDevPropKey( obj->pProperties[0].CompKey.Key, DEVPKEY_dummy ), "got property %s != %s\n", debugstr_DEVPROPKEY( &obj->pProperties[0].CompKey.Key ), debugstr_DEVPROPKEY( &DEVPKEY_dummy ) ); - ok( obj->pProperties[0].Type == DEVPROP_TYPE_EMPTY, "got Type %#lx != %#x", obj->pProperties[0].Type, + ok( obj->pProperties[0].Type == DEVPROP_TYPE_EMPTY, "got Type %#lx != %#x\n", obj->pProperties[0].Type, DEVPROP_TYPE_EMPTY ); found_prop = pDevFindProperty( &DEVPKEY_dummy, DEVPROP_STORE_SYSTEM, NULL, obj->cPropertyCount, obj->pProperties ); ok( found_prop == &obj->pProperties[0], "got found_prop %p != %p\n", found_prop, &obj->pProperties[0] ); @@ -1701,7 +1701,7 @@ static void WINAPI query_result_callback( HDEVQUERY query, void *user_data, cons { const DEV_OBJECT *obj = &action_data->Data.DeviceObject; winetest_push_context( "device %s", debugstr_w( obj->pszObjectId ) ); - ok_( __FILE__, data->line )( obj->ObjectType == data->exp_type, "got DeviceObject.ObjectType %d != %d", + ok_( __FILE__, data->line )( obj->ObjectType == data->exp_type, "got DeviceObject.ObjectType %d != %d\n", obj->ObjectType, data->exp_type ); test_dev_object_iface_props( data->line, &action_data->Data.DeviceObject, data->exp_props, data->props_len ); winetest_pop_context(); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9930
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/cfgmgr32/tests/cfgmgr32.c | 2 +- dlls/setupapi/devinst.c | 2 +- dlls/setupapi/stubs.c | 8 +- include/cfgmgr32.h | 402 +++++++++++++++++++++++++++------ 4 files changed, 345 insertions(+), 69 deletions(-) diff --git a/dlls/cfgmgr32/tests/cfgmgr32.c b/dlls/cfgmgr32/tests/cfgmgr32.c index 84a932a330c..7f529e04269 100644 --- a/dlls/cfgmgr32/tests/cfgmgr32.c +++ b/dlls/cfgmgr32/tests/cfgmgr32.c @@ -248,7 +248,7 @@ static void test_CM_Get_Device_ID_List(void) ok(!ret, "got %#lx.\n", ret); ok(!wcscmp(id, instances[i].id), "got %s, expected %s.\n", debugstr_w(id), debugstr_w(instances[i].id)); size = len; - ret = CM_Get_DevNode_PropertyW(instances[i].inst, &DEVPROPKEY_GPU_LUID, &type, wbuf, &size, 0); + ret = CM_Get_DevNode_PropertyW(instances[i].inst, &DEVPROPKEY_GPU_LUID, &type, (BYTE *)wbuf, &size, 0); ok(!ret || ret == CR_NO_SUCH_VALUE, "got %#lx.\n", ret); if (!ret) ok(type == DEVPROP_TYPE_UINT64, "got %#lx.\n", type); diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c index ef3e6a55735..b7ef248feb3 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -5415,7 +5415,7 @@ CONFIGRET WINAPI CM_Get_DevNode_Property_ExW(DEVINST devnode, const DEVPROPKEY * * CM_Get_DevNode_PropertyW (SETUPAPI.@) */ CONFIGRET WINAPI CM_Get_DevNode_PropertyW(DEVINST dev, const DEVPROPKEY *key, DEVPROPTYPE *type, - PVOID buf, PULONG len, ULONG flags) + BYTE *buf, PULONG len, ULONG flags) { return CM_Get_DevNode_Property_ExW(dev, key, type, buf, len, flags, NULL); } diff --git a/dlls/setupapi/stubs.c b/dlls/setupapi/stubs.c index 44c81a1fd97..97914aded40 100644 --- a/dlls/setupapi/stubs.c +++ b/dlls/setupapi/stubs.c @@ -357,9 +357,9 @@ CONFIGRET WINAPI CM_Enumerate_Classes(ULONG index, LPGUID class, ULONG flags) * CM_Get_Class_Registry_PropertyA (SETUPAPI.@) */ CONFIGRET WINAPI CM_Get_Class_Registry_PropertyA(LPGUID class, ULONG prop, PULONG regdatatype, - PVOID buf, ULONG len, ULONG flags, HMACHINE machine) + void *buf, ULONG *len, ULONG flags, HMACHINE machine) { - FIXME("%p %lu %p %p %lu 0x%08lx %p: stub\n", class, prop, regdatatype, buf, len, flags, machine); + FIXME("%p %lu %p %p %p 0x%08lx %p: stub\n", class, prop, regdatatype, buf, len, flags, machine); return CR_FAILURE; } @@ -367,9 +367,9 @@ CONFIGRET WINAPI CM_Get_Class_Registry_PropertyA(LPGUID class, ULONG prop, PULON * CM_Get_Class_Registry_PropertyW (SETUPAPI.@) */ CONFIGRET WINAPI CM_Get_Class_Registry_PropertyW(LPGUID class, ULONG prop, PULONG regdatatype, - PVOID buf, ULONG len, ULONG flags, HMACHINE machine) + void *buf, ULONG *len, ULONG flags, HMACHINE machine) { - FIXME("%p %lu %p %p %lu 0x%08lx %p: stub\n", class, prop, regdatatype, buf, len, flags, machine); + FIXME("%p %lu %p %p %p 0x%08lx %p: stub\n", class, prop, regdatatype, buf, len, flags, machine); return CR_FAILURE; } diff --git a/include/cfgmgr32.h b/include/cfgmgr32.h index ee84533a2d0..32df2f8aac5 100644 --- a/include/cfgmgr32.h +++ b/include/cfgmgr32.h @@ -21,6 +21,7 @@ #include <cfg.h> #include <devpropdef.h> +#include <winreg.h> #ifndef GUID_DEFINED # include <guiddef.h> @@ -207,6 +208,13 @@ typedef HANDLE HCMNOTIFICATION, *PHCMNOTIFICATION; typedef CHAR *DEVNODEID_A, *DEVINSTID_A; typedef WCHAR *DEVNODEID_W, *DEVINSTID_W; typedef ULONG REGDISPOSITION; +typedef DWORD_PTR LOG_CONF; +typedef ULONG PRIORITY; +typedef DWORD_PTR RANGE_LIST; +typedef DWORD_PTR RANGE_ELEMENT; +typedef DWORD_PTR RES_DES; +typedef ULONG RESOURCEID; +typedef ULONG_PTR CONFLICT_LIST; #define CM_NOTIFY_FILTER_FLAG_ALL_INTERFACE_CLASSES 0x0001 typedef enum _CM_NOTIFY_FILTER_TYPE @@ -280,7 +288,41 @@ typedef struct _CM_NOTIFY_EVENT_DATA } u; } CM_NOTIFY_EVENT_DATA, *PCM_NOTIFY_EVENT_DATA; -typedef DWORD (WINAPI *PCM_NOTIFY_CALLBACK)(HCMNOTIFICATION,void*,CM_NOTIFY_ACTION,CM_NOTIFY_EVENT_DATA*,DWORD); +typedef struct +{ + ULONG HWPI_ulHWProfile; + char HWPI_szFriendlyName[MAX_PROFILE_LEN]; + DWORD HWPI_dwFlags; +} HWPROFILEINFO_A; + +typedef struct +{ + ULONG HWPI_ulHWProfile; + WCHAR HWPI_szFriendlyName[MAX_PROFILE_LEN]; + DWORD HWPI_dwFlags; +} HWPROFILEINFO_W; + +typedef struct +{ + ULONG CD_ulSize; + ULONG CD_ulMask; + DEVINST CD_dnDevInst; + RES_DES CD_rdResDes; + ULONG CD_ulFlags; + char CD_szDescription[MAX_PATH]; +} CONFLICT_DETAILS_A; + +typedef struct +{ + ULONG CD_ulSize; + ULONG CD_ulMask; + DEVINST CD_dnDevInst; + RES_DES CD_rdResDes; + ULONG CD_ulFlags; + WCHAR CD_szDescription[MAX_PATH]; +} CONFLICT_DETAILS_W; + +typedef DWORD (CALLBACK *PCM_NOTIFY_CALLBACK)( HCMNOTIFICATION notify, void *context, CM_NOTIFY_ACTION action, CM_NOTIFY_EVENT_DATA *data, DWORD data_size ); DECL_WINELIB_CFGMGR32_TYPE_AW(DEVNODEID) DECL_WINELIB_CFGMGR32_TYPE_AW(DEVINSTID) @@ -289,68 +331,302 @@ DECL_WINELIB_CFGMGR32_TYPE_AW(DEVINSTID) extern "C" { #endif -CMAPI CONFIGRET WINAPI CM_Connect_MachineA(PCSTR,PHMACHINE); -CMAPI CONFIGRET WINAPI CM_Connect_MachineW(PCWSTR,PHMACHINE); -#define CM_Connect_Machine WINELIB_NAME_AW(CM_Connect_Machine) -CMAPI CONFIGRET WINAPI CM_Create_DevNodeA(PDEVINST,DEVINSTID_A,DEVINST,ULONG); -CMAPI CONFIGRET WINAPI CM_Create_DevNodeW(PDEVINST,DEVINSTID_W,DEVINST,ULONG); -#define CM_Create_DevNode WINELIB_NAME_AW(CM_Create_DevNode) -CMAPI CONFIGRET WINAPI CM_Disconnect_Machine(HMACHINE); -CMAPI CONFIGRET WINAPI CM_Get_Child(PDEVINST pdnDevInst, DEVINST dnDevInst, ULONG ulFlags); -CMAPI CONFIGRET WINAPI CM_Get_Child_Ex(PDEVINST pdnDevInst, DEVINST dnDevInst, ULONG ulFlags, HMACHINE hMachine); -CMAPI CONFIGRET WINAPI CM_Get_Device_IDA(DEVINST,PSTR,ULONG,ULONG); -CMAPI CONFIGRET WINAPI CM_Get_Device_IDW(DEVINST,PWSTR,ULONG,ULONG); -#define CM_Get_Device_ID WINELIB_NAME_AW(CM_Get_Device_ID) -CMAPI CONFIGRET WINAPI CM_Get_Device_ID_ExA(DEVINST,PSTR,ULONG,ULONG,HMACHINE); -CMAPI CONFIGRET WINAPI CM_Get_Device_ID_ExW(DEVINST,PWSTR,ULONG,ULONG,HMACHINE); -#define CM_Get_Device_ID_Ex WINELIB_NAME_AW(CM_Get_Device_ID_Ex) -CMAPI CONFIGRET WINAPI CM_Get_Device_ID_ListA(PCSTR,PCHAR,ULONG,ULONG); -CMAPI CONFIGRET WINAPI CM_Get_Device_ID_ListW(PCWSTR,PWCHAR,ULONG,ULONG); -#define CM_Get_Device_ID_List WINELIB_NAME_AW(CM_Get_Device_ID_List) -CMAPI CONFIGRET WINAPI CM_Get_Device_ID_List_SizeA(PULONG,PCSTR,ULONG); -CMAPI CONFIGRET WINAPI CM_Get_Device_ID_List_SizeW(PULONG,PCWSTR,ULONG); -#define CM_Get_Device_ID_List_Size WINELIB_NAME_AW(CM_Get_Device_ID_List_Size) -CMAPI CONFIGRET WINAPI CM_Get_Device_ID_List_ExA(PCSTR,PCHAR,ULONG,ULONG,HMACHINE); -CMAPI CONFIGRET WINAPI CM_Get_Device_ID_List_ExW(PCWSTR,PWCHAR,ULONG,ULONG,HMACHINE); -#define CM_Get_Device_ID_List_Ex WINELIB_NAME_AW(CM_Get_Device_ID_List_Ex) -CMAPI CONFIGRET WINAPI CM_Get_Device_ID_List_Size_ExA(PULONG,PCSTR,ULONG,HMACHINE); -CMAPI CONFIGRET WINAPI CM_Get_Device_ID_List_Size_ExW(PULONG,PCWSTR,ULONG,HMACHINE); -#define CM_Get_Device_ID_List_Size_Ex WINELIB_NAME_AW(CM_Get_Device_ID_List_Size_Ex) -CMAPI CONFIGRET WINAPI CM_Get_Device_ID_Size(PULONG,DEVINST,ULONG); -CMAPI CONFIGRET WINAPI CM_Get_Device_ID_Size_Ex(PULONG,DEVINST,ULONG,HMACHINE); -CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_ListW(LPGUID,DEVINSTID_W,PZZWSTR,ULONG,ULONG); -CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_ListA(LPGUID,DEVINSTID_A,PZZSTR,ULONG,ULONG); -#define CM_Get_Device_Interface_List WINELIB_NAME_AW(CM_Get_Device_Interface_List) -CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_List_SizeW(PULONG,LPGUID,DEVINSTID_W,ULONG); -CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_List_SizeA(PULONG,LPGUID,DEVINSTID_A,ULONG); -#define CM_Get_Device_Interface_List_Size WINELIB_NAME_AW(CM_Get_Device_Interface_List_Size) -CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_List_ExW(LPGUID,DEVINSTID_W,PZZWSTR,ULONG,ULONG,HMACHINE); -CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_List_ExA(LPGUID,DEVINSTID_A,PZZSTR,ULONG,ULONG,HMACHINE); -#define CM_Get_Device_Interface_List_Ex WINELIB_NAME_AW(CM_Get_Device_Interface_List_Ex) -CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_List_Size_ExW(PULONG,LPGUID,DEVINSTID_W,ULONG,HMACHINE); -CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_List_Size_ExA(PULONG,LPGUID,DEVINSTID_A,ULONG,HMACHINE); -#define CM_Get_Device_Interface_List_Size_Ex WINELIB_NAME_AW(CM_Get_Device_Interface_List_Size_Ex) -CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_PropertyW(LPCWSTR,const DEVPROPKEY*,DEVPROPTYPE*,PBYTE,PULONG,ULONG); -CMAPI CONFIGRET WINAPI CM_Get_DevNode_PropertyW(DEVINST,const DEVPROPKEY *,DEVPROPTYPE *type,PVOID,PULONG,ULONG); -CMAPI CONFIGRET WINAPI CM_Get_DevNode_PropertyExW(DEVINST,const DEVPROPKEY *,DEVPROPTYPE *type,PVOID,PULONG,ULONG,HMACHINE); -CMAPI CONFIGRET WINAPI CM_Get_DevNode_Status(PULONG,PULONG,DEVINST,ULONG); -CMAPI CONFIGRET WINAPI CM_Get_DevNode_Status_Ex(PULONG,PULONG,DEVINST,ULONG,HMACHINE); -CMAPI CONFIGRET WINAPI CM_Get_Sibling(PDEVINST,DEVINST,ULONG); -CMAPI CONFIGRET WINAPI CM_Get_Sibling_Ex(PDEVINST pdnDevInst, DEVINST DevInst, ULONG ulFlags, HMACHINE hMachine); -CMAPI WORD WINAPI CM_Get_Version(void); -CMAPI CONFIGRET WINAPI CM_Locate_DevNodeA(PDEVINST,DEVINSTID_A,ULONG); -CMAPI CONFIGRET WINAPI CM_Locate_DevNode_ExA(PDEVINST,DEVINSTID_A,ULONG,HMACHINE); -CMAPI CONFIGRET WINAPI CM_Locate_DevNodeW(PDEVINST,DEVINSTID_W,ULONG); -CMAPI CONFIGRET WINAPI CM_Locate_DevNode_ExW(PDEVINST,DEVINSTID_W,ULONG,HMACHINE); -#define CM_Locate_DevNode WINELIB_NAME_AW(CM_Locate_DevNode) -CMAPI DWORD WINAPI CM_MapCrToWin32Err(CONFIGRET,DWORD); -CMAPI CONFIGRET WINAPI CM_Open_DevNode_Key(DEVINST dnDevInst, REGSAM access, ULONG ulHardwareProfile, - REGDISPOSITION disposition, PHKEY phkDevice, ULONG ulFlags); -CMAPI CONFIGRET WINAPI CM_Register_Notification(PCM_NOTIFY_FILTER,PVOID,PCM_NOTIFY_CALLBACK,PHCMNOTIFICATION); -CMAPI CONFIGRET WINAPI CM_Unregister_Notification(HCMNOTIFICATION); -CMAPI CONFIGRET WINAPI CM_Request_Device_EjectA(DEVINST dev, PPNP_VETO_TYPE type, LPSTR name, ULONG length, ULONG flags); -CMAPI CONFIGRET WINAPI CM_Request_Device_EjectW(DEVINST dev, PPNP_VETO_TYPE type, LPWSTR name, ULONG length, ULONG flags); -#define CM_Request_Device_Eject WINELIB_NAME_AW(CM_Get_Device_ID_List_Ex) +CMAPI BOOL WINAPI CM_Is_Version_Available( WORD version ); +CMAPI BOOL WINAPI CM_Is_Version_Available_Ex( WORD version, HMACHINE machine ); + +CMAPI CONFIGRET WINAPI CM_Add_Empty_Log_Conf( LOG_CONF *conf, DEVINST node, PRIORITY priority, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Add_Empty_Log_Conf_Ex( LOG_CONF *conf, DEVINST node, PRIORITY priority, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Add_ID_ExA( DEVINST node, char *id, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Add_ID_ExW( DEVINST node, WCHAR *id, ULONG flags, HMACHINE machine ); +#define CM_Add_ID_Ex WINELIB_NAME_AW(CM_Add_ID_Ex) +CMAPI CONFIGRET WINAPI CM_Add_IDA( DEVINST node, char *id, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Add_IDW( DEVINST node, WCHAR *id, ULONG flags ); +#define CM_Add_ID WINELIB_NAME_AW(CM_Add_ID) +CMAPI CONFIGRET WINAPI CM_Add_Range( DWORDLONG start, DWORDLONG end, RANGE_LIST ranges, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Add_Res_Des( RES_DES *res, LOG_CONF conf, RESOURCEID id, const void *resource, ULONG len, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Add_Res_Des_Ex( RES_DES *res, LOG_CONF conf, RESOURCEID id, const void *resource, ULONG len, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Connect_MachineA( const char *server_name, HMACHINE *machine ); +CMAPI CONFIGRET WINAPI CM_Connect_MachineW( const WCHAR *server_name, HMACHINE *machine ); +#define CM_Connect_Machine WINELIB_NAME_AW(CM_Connect_Machine) +CMAPI CONFIGRET WINAPI CM_Create_DevNode_ExA( DEVINST *node, DEVINSTID_A instance_id, DEVINST parent, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Create_DevNode_ExW( DEVINST *node, DEVINSTID_W instance_id, DEVINST parent, ULONG flags, HMACHINE machine ); +#define CM_Create_DevNode_Ex WINELIB_NAME_AW(CM_Create_DevNode_Ex) +CMAPI CONFIGRET WINAPI CM_Create_DevNodeA( DEVINST *node, DEVINSTID_A instance_id, DEVINST parent, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Create_DevNodeW( DEVINST *node, DEVINSTID_W instance_id, DEVINST parent, ULONG flags ); +#define CM_Create_DevNode WINELIB_NAME_AW(CM_Create_DevNode) +CMAPI CONFIGRET WINAPI CM_Create_Range_List( RANGE_LIST *ranges, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Delete_Class_Key( GUID *class, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Delete_Class_Key_Ex( GUID *class, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Delete_Device_Interface_Key_ExA( const char *iface, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Delete_Device_Interface_Key_ExW( const WCHAR *iface, ULONG flags, HMACHINE machine ); +#define CM_Delete_Device_Interface_Key_Ex WINELIB_NAME_AW(CM_Delete_Device_Interface_Key_Ex) +CMAPI CONFIGRET WINAPI CM_Delete_Device_Interface_KeyA( const char *iface, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Delete_Device_Interface_KeyW( const WCHAR *iface, ULONG flags ); +#define CM_Delete_Device_Interface_Key WINELIB_NAME_AW(CM_Delete_Device_Interface_Key) +CMAPI CONFIGRET WINAPI CM_Delete_DevNode_Key( DEVNODE node, ULONG profile, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Delete_DevNode_Key_Ex( DEVNODE node, ULONG profile, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Delete_Range( DWORDLONG start, DWORDLONG end, RANGE_LIST ranges, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Detect_Resource_Conflict( DEVINST node, RESOURCEID id, const void *resource, ULONG len, BOOL *detected, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Detect_Resource_Conflict_Ex( DEVINST node, RESOURCEID id, const void *resource, ULONG len, BOOL *detected, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Disable_DevNode( DEVINST node, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Disable_DevNode_Ex( DEVINST node, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Disconnect_Machine( HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Dup_Range_List( RANGE_LIST old_ranges, RANGE_LIST new_ranges, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Enable_DevNode( DEVINST node, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Enable_DevNode_Ex( DEVINST node, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Enumerate_Classes( ULONG index, GUID *class, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Enumerate_Classes_Ex( ULONG index, GUID *class, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Enumerate_Enumerators_ExA( ULONG index, char *buffer, ULONG *len, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Enumerate_Enumerators_ExW( ULONG index, WCHAR *buffer, ULONG *len, ULONG flags, HMACHINE machine ); +#define CM_Enumerate_Enumerators_Ex WINELIB_NAME_AW(CM_Enumerate_Enumerators_Ex) +CMAPI CONFIGRET WINAPI CM_Enumerate_EnumeratorsA( ULONG index, char *buffer, ULONG *len, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Enumerate_EnumeratorsW( ULONG index, WCHAR *buffer, ULONG *len, ULONG flags ); +#define CM_Enumerate_Enumerators WINELIB_NAME_AW(CM_Enumerate_Enumerators) +CMAPI CONFIGRET WINAPI CM_Find_Range( DWORDLONG *start, DWORDLONG from, ULONG length, DWORDLONG alignment, DWORDLONG end, RANGE_LIST ranges, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_First_Range( RANGE_LIST ranges, DWORDLONG *start, DWORDLONG *end, RANGE_ELEMENT *element, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Free_Log_Conf( LOG_CONF conf, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Free_Log_Conf_Ex( LOG_CONF conf, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Free_Log_Conf_Handle( LOG_CONF conf ); +CMAPI CONFIGRET WINAPI CM_Free_Range_List( RANGE_LIST ranges, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Free_Res_Des( RES_DES *previous, RES_DES desc, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Free_Res_Des_Ex( RES_DES *previous, RES_DES desc, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Free_Res_Des_Handle( RES_DES desc ); +CMAPI CONFIGRET WINAPI CM_Free_Resource_Conflict_Handle( CONFLICT_LIST conflicts ); +CMAPI CONFIGRET WINAPI CM_Get_Child( DEVINST *child, DEVINST node, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Child_Ex( DEVINST *child, DEVINST node, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Class_Key_Name_ExA( GUID *class, char *name, ULONG *len, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Class_Key_Name_ExW( GUID *class, WCHAR *name, ULONG *len, ULONG flags, HMACHINE machine ); +#define CM_Get_Class_Key_Name_Ex WINELIB_NAME_AW(CM_Get_Class_Key_Name_Ex) +CMAPI CONFIGRET WINAPI CM_Get_Class_Key_NameA( GUID *class, char *name, ULONG *len, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Class_Key_NameW( GUID *class, WCHAR *name, ULONG *len, ULONG flags ); +#define CM_Get_Class_Key_Name WINELIB_NAME_AW(CM_Get_Class_Key_Name) +CMAPI CONFIGRET WINAPI CM_Get_Class_Name_ExA( GUID *class, char *buffer, ULONG *len, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Class_Name_ExW( GUID *class, WCHAR *buffer, ULONG *len, ULONG flags, HMACHINE machine ); +#define CM_Get_Class_Name_Ex WINELIB_NAME_AW(CM_Get_Class_Name_Ex) +CMAPI CONFIGRET WINAPI CM_Get_Class_NameA( GUID *class, char *buffer, ULONG *len, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Class_NameW( GUID *class, WCHAR *buffer, ULONG *len, ULONG flags ); +#define CM_Get_Class_Name WINELIB_NAME_AW(CM_Get_Class_Name) +CMAPI CONFIGRET WINAPI CM_Get_Class_Property_ExW( const GUID *class, const DEVPROPKEY *key, DEVPROPTYPE *type, BYTE *buffer, ULONG *size, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Class_Property_Keys( const GUID *class, DEVPROPKEY *keys, ULONG *count, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Class_Property_Keys_Ex( const GUID *class, DEVPROPKEY *keys, ULONG *count, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Class_PropertyW( const GUID *class, const DEVPROPKEY *key, DEVPROPTYPE *type, BYTE *buffer, ULONG *size, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Class_Registry_PropertyA( GUID *class, ULONG property, ULONG *type, void *buffer, ULONG *len, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Class_Registry_PropertyW( GUID *class, ULONG property, ULONG *type, void *buffer, ULONG *len, ULONG flags, HMACHINE machine ); +#define CM_Get_Class_Registry_Property WINELIB_NAME_AW(CM_Get_Class_Registry_Property) +CMAPI CONFIGRET WINAPI CM_Get_Depth( ULONG *depth, DEVINST node, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Depth_Ex( ULONG *depth, DEVINST node, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Device_ID_ExA( DEVINST node, char *buffer, ULONG len, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Device_ID_ExW( DEVINST node, WCHAR *buffer, ULONG len, ULONG flags, HMACHINE machine ); +#define CM_Get_Device_ID_Ex WINELIB_NAME_AW(CM_Get_Device_ID_Ex) +CMAPI CONFIGRET WINAPI CM_Get_Device_ID_List_ExA( const char *filter, char *buffer, ULONG len, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Device_ID_List_ExW( const WCHAR *filter, WCHAR *buffer, ULONG len, ULONG flags, HMACHINE machine ); +#define CM_Get_Device_ID_List_Ex WINELIB_NAME_AW(CM_Get_Device_ID_List_Ex) +CMAPI CONFIGRET WINAPI CM_Get_Device_ID_List_Size_ExA( ULONG *len, const char *filter, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Device_ID_List_Size_ExW( ULONG *len, const WCHAR *filter, ULONG flags, HMACHINE machine ); +#define CM_Get_Device_ID_List_Size_Ex WINELIB_NAME_AW(CM_Get_Device_ID_List_Size_Ex) +CMAPI CONFIGRET WINAPI CM_Get_Device_ID_List_SizeA( ULONG *len, const char *filter, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Device_ID_List_SizeW( ULONG *len, const WCHAR *filter, ULONG flags ); +#define CM_Get_Device_ID_List_Size WINELIB_NAME_AW(CM_Get_Device_ID_List_Size) +CMAPI CONFIGRET WINAPI CM_Get_Device_ID_ListA( const char *filter, char *buffer, ULONG len, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Device_ID_ListW( const WCHAR *filter, WCHAR *buffer, ULONG len, ULONG flags ); +#define CM_Get_Device_ID_List WINELIB_NAME_AW(CM_Get_Device_ID_List) +CMAPI CONFIGRET WINAPI CM_Get_Device_ID_Size( ULONG *len, DEVINST node, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Device_ID_Size_Ex( ULONG *len, DEVINST node, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Device_IDA( DEVINST node, char *buffer, ULONG len, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Device_IDW( DEVINST node, WCHAR *buffer, ULONG len, ULONG flags ); +#define CM_Get_Device_ID WINELIB_NAME_AW(CM_Get_Device_ID) +CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_Alias_ExA( const char *iface, GUID *alias_guid, char *alias_iface, ULONG *len, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_Alias_ExW( const WCHAR *iface, GUID *alias_guid, WCHAR *alias_iface, ULONG *len, ULONG flags, HMACHINE machine ); +#define CM_Get_Device_Interface_Alias_Ex WINELIB_NAME_AW(CM_Get_Device_Interface_Alias_Ex) +CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_AliasA( const char *iface, GUID *alias_guid, char *alias_iface, ULONG *len, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_AliasW( const WCHAR *iface, GUID *alias_guid, WCHAR *alias_iface, ULONG *len, ULONG flags ); +#define CM_Get_Device_Interface_Alias WINELIB_NAME_AW(CM_Get_Device_Interface_Alias) +CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_List_ExA( GUID *class, DEVINSTID_A instance_id, char *buffer, ULONG len, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_List_ExW( GUID *class, DEVINSTID_W instance_id, WCHAR *buffer, ULONG len, ULONG flags, HMACHINE machine ); +#define CM_Get_Device_Interface_List_Ex WINELIB_NAME_AW(CM_Get_Device_Interface_List_Ex) +CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_List_Size_ExA( ULONG *len, GUID *class, DEVINSTID_A instance_id, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_List_Size_ExW( ULONG *len, GUID *class, DEVINSTID_W instance_id, ULONG flags, HMACHINE machine ); +#define CM_Get_Device_Interface_List_Size_Ex WINELIB_NAME_AW(CM_Get_Device_Interface_List_Size_Ex) +CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_List_SizeA( ULONG *len, GUID *class, DEVINSTID_A instance_id, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_List_SizeW( ULONG *len, GUID *class, DEVINSTID_W instance_id, ULONG flags ); +#define CM_Get_Device_Interface_List_Size WINELIB_NAME_AW(CM_Get_Device_Interface_List_Size) +CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_ListA( GUID *class, DEVINSTID_A instance_id, char *buffer, ULONG len, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_ListW( GUID *class, DEVINSTID_W instance_id, WCHAR *buffer, ULONG len, ULONG flags ); +#define CM_Get_Device_Interface_List WINELIB_NAME_AW(CM_Get_Device_Interface_List) +CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_Property_ExW( const WCHAR *iface, const DEVPROPKEY *key, DEVPROPTYPE *type, BYTE *buffer, ULONG *size, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_Property_Keys_ExW( const WCHAR *iface, DEVPROPKEY *keys, ULONG *count, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_Property_KeysW( const WCHAR *iface, DEVPROPKEY *keys, ULONG *count, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Device_Interface_PropertyW( const WCHAR *iface, const DEVPROPKEY *key, DEVPROPTYPE *type, BYTE *buffer, ULONG *size, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_DevNode_Custom_Property_ExA( DEVINST node, const char *name, ULONG *type, void *buffer, ULONG *len, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_DevNode_Custom_Property_ExW( DEVINST node, const WCHAR *name, ULONG *type, void *buffer, ULONG *len, ULONG flags, HMACHINE machine ); +#define CM_Get_DevNode_Custom_Property_Ex WINELIB_NAME_AW(CM_Get_DevNode_Custom_Property_Ex) +CMAPI CONFIGRET WINAPI CM_Get_DevNode_Custom_PropertyA( DEVINST node, const char *name, ULONG *type, void *buffer, ULONG *len, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_DevNode_Custom_PropertyW( DEVINST node, const WCHAR *name, ULONG *type, void *buffer, ULONG *len, ULONG flags ); +#define CM_Get_DevNode_Custom_Property WINELIB_NAME_AW(CM_Get_DevNode_Custom_Property) +CMAPI CONFIGRET WINAPI CM_Get_DevNode_Property_ExW( DEVINST node, const DEVPROPKEY *key, DEVPROPTYPE *type, BYTE *buffer, ULONG *size, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_DevNode_Property_Keys( DEVINST node, DEVPROPKEY *keys, ULONG *count, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_DevNode_Property_Keys_Ex( DEVINST node, DEVPROPKEY *keys, ULONG *count, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_DevNode_PropertyW( DEVINST node, const DEVPROPKEY *key, DEVPROPTYPE *type, BYTE *buffer, ULONG *size, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_DevNode_Registry_Property_ExA( DEVINST node, ULONG property, ULONG *type, void *buffer, ULONG *len, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_DevNode_Registry_Property_ExW( DEVINST node, ULONG property, ULONG *type, void *buffer, ULONG *len, ULONG flags, HMACHINE machine ); +#define CM_Get_DevNode_Registry_Property_Ex WINELIB_NAME_AW(CM_Get_DevNode_Registry_Property_Ex) +CMAPI CONFIGRET WINAPI CM_Get_DevNode_Registry_PropertyA( DEVINST node, ULONG property, ULONG *type, void *buffer, ULONG *len, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_DevNode_Registry_PropertyW( DEVINST node, ULONG property, ULONG *type, void *buffer, ULONG *len, ULONG flags ); +#define CM_Get_DevNode_Registry_Property WINELIB_NAME_AW(CM_Get_DevNode_Registry_Property) +CMAPI CONFIGRET WINAPI CM_Get_DevNode_Status( ULONG *status, ULONG *number, DEVINST node, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_DevNode_Status_Ex( ULONG *status, ULONG *number, DEVINST node, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_First_Log_Conf( LOG_CONF *conf, DEVINST node, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_First_Log_Conf_Ex( LOG_CONF *conf, DEVINST node, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Global_State( ULONG *state, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Global_State_Ex( ULONG *state, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Hardware_Profile_Info_ExA( ULONG index, HWPROFILEINFO_A *info, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Hardware_Profile_Info_ExW( ULONG index, HWPROFILEINFO_W *info, ULONG flags, HMACHINE machine ); +#define CM_Get_Hardware_Profile_Info_Ex WINELIB_NAME_AW(CM_Get_Hardware_Profile_Info_Ex) +CMAPI CONFIGRET WINAPI CM_Get_Hardware_Profile_InfoA( ULONG index, HWPROFILEINFO_A *info, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Hardware_Profile_InfoW( ULONG index, HWPROFILEINFO_W *info, ULONG flags ); +#define CM_Get_Hardware_Profile_Info WINELIB_NAME_AW(CM_Get_Hardware_Profile_Info) +CMAPI CONFIGRET WINAPI CM_Get_HW_Prof_Flags_ExA( DEVINSTID_A instance_id, ULONG profile, ULONG *value, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_HW_Prof_Flags_ExW( DEVINSTID_W instance_id, ULONG profile, ULONG *value, ULONG flags, HMACHINE machine ); +#define CM_Get_HW_Prof_Flags_Ex WINELIB_NAME_AW(CM_Get_HW_Prof_Flags_Ex) +CMAPI CONFIGRET WINAPI CM_Get_HW_Prof_FlagsA( DEVINSTID_A instance_id, ULONG profile, ULONG *value, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_HW_Prof_FlagsW( DEVINSTID_W instance_id, ULONG profile, ULONG *value, ULONG flags ); +#define CM_Get_HW_Prof_Flags WINELIB_NAME_AW(CM_Get_HW_Prof_Flags) +CMAPI CONFIGRET WINAPI CM_Get_Log_Conf_Priority( LOG_CONF conf, PRIORITY *priority, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Log_Conf_Priority_Ex( LOG_CONF conf, PRIORITY *priority, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Next_Log_Conf( LOG_CONF *next, LOG_CONF conf, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Next_Log_Conf_Ex( LOG_CONF *next, LOG_CONF conf, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Next_Res_Des( RES_DES *next, RES_DES desc, RESOURCEID resource, RESOURCEID *next_resource, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Next_Res_Des_Ex( RES_DES *next, RES_DES desc, RESOURCEID resource, RESOURCEID *next_resource, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Parent( DEVINST *parent, DEVINST node, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Parent_Ex( DEVINST *parent, DEVINST node, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Res_Des_Data( RES_DES desc, void *buffer, ULONG len, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Res_Des_Data_Ex( RES_DES desc, void *buffer, ULONG len, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Res_Des_Data_Size( ULONG *size, RES_DES desc, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Res_Des_Data_Size_Ex( ULONG *size, RES_DES desc, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Get_Resource_Conflict_Count( CONFLICT_LIST conflicts, ULONG *count ); +CMAPI CONFIGRET WINAPI CM_Get_Resource_Conflict_DetailsA( CONFLICT_LIST conflicts, ULONG index, CONFLICT_DETAILS_A *details ); +CMAPI CONFIGRET WINAPI CM_Get_Resource_Conflict_DetailsW( CONFLICT_LIST conflicts, ULONG index, CONFLICT_DETAILS_W *details ); +#define CM_Get_Resource_Conflict_Details WINELIB_NAME_AW(CM_Get_Resource_Conflict_Details) +CMAPI CONFIGRET WINAPI CM_Get_Sibling( DEVINST *sibling, DEVINST node, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Get_Sibling_Ex( DEVINST *sibling, DEVINST node, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Intersect_Range_List( RANGE_LIST old_ranges_1, RANGE_LIST old_ranges_2, RANGE_LIST new_ranges, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Invert_Range_List( RANGE_LIST old_ranges, RANGE_LIST new_ranges, DWORDLONG max_value, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Is_Dock_Station_Present( BOOL *present ); +CMAPI CONFIGRET WINAPI CM_Is_Dock_Station_Present_Ex( BOOL *present, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Locate_DevNode_ExA( DEVINST *node, DEVINSTID_A instance_id, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Locate_DevNode_ExW( DEVINST *node, DEVINSTID_W instance_id, ULONG flags, HMACHINE machine ); +#define CM_Locate_DevNode_Ex WINELIB_NAME_AW(CM_Locate_DevNode_Ex) +CMAPI CONFIGRET WINAPI CM_Locate_DevNodeA( DEVINST *node, DEVINSTID_A instance_id, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Locate_DevNodeW( DEVINST *node, DEVINSTID_W instance_id, ULONG flags ); +#define CM_Locate_DevNode WINELIB_NAME_AW(CM_Locate_DevNode) +CMAPI CONFIGRET WINAPI CM_Merge_Range_List( RANGE_LIST old_ranges_1, RANGE_LIST old_ranges_2, RANGE_LIST new_ranges, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Modify_Res_Des( RES_DES *new_desc, RES_DES old_desc, RESOURCEID id, const void *resource, ULONG len, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Modify_Res_Des_Ex( RES_DES *new_desc, RES_DES old_desc, RESOURCEID id, const void *resource, ULONG len, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Move_DevNode( DEVINST node_src, DEVINST node_dst, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Move_DevNode_Ex( DEVINST node_src, DEVINST node_dst, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Next_Range( RANGE_ELEMENT *element, DWORDLONG *start, DWORDLONG *end, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Open_Class_Key_ExA( GUID *class, const char *name, REGSAM access, REGDISPOSITION disposition, HKEY *hkey, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Open_Class_Key_ExW( GUID *class, const WCHAR *name, REGSAM access, REGDISPOSITION disposition, HKEY *hkey, ULONG flags, HMACHINE machine ); +#define CM_Open_Class_Key_Ex WINELIB_NAME_AW(CM_Open_Class_Key_Ex) +CMAPI CONFIGRET WINAPI CM_Open_Class_KeyA( GUID *class, const char *name, REGSAM access, REGDISPOSITION disposition, HKEY *hkey, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Open_Class_KeyW( GUID *class, const WCHAR *name, REGSAM access, REGDISPOSITION disposition, HKEY *hkey, ULONG flags ); +#define CM_Open_Class_Key WINELIB_NAME_AW(CM_Open_Class_Key) +CMAPI CONFIGRET WINAPI CM_Open_Device_Interface_Key_ExA( const char *iface, REGSAM access, REGDISPOSITION disposition, HKEY *hkey, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Open_Device_Interface_Key_ExW( const WCHAR *iface, REGSAM access, REGDISPOSITION disposition, HKEY *hkey, ULONG flags, HMACHINE machine ); +#define CM_Open_Device_Interface_Key_Ex WINELIB_NAME_AW(CM_Open_Device_Interface_Key_Ex) +CMAPI CONFIGRET WINAPI CM_Open_Device_Interface_KeyA( const char *iface, REGSAM access, REGDISPOSITION disposition, HKEY *hkey, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Open_Device_Interface_KeyW( const WCHAR *iface, REGSAM access, REGDISPOSITION disposition, HKEY *hkey, ULONG flags ); +#define CM_Open_Device_Interface_Key WINELIB_NAME_AW(CM_Open_Device_Interface_Key) +CMAPI CONFIGRET WINAPI CM_Open_DevNode_Key( DEVINST node, REGSAM access, ULONG profile, REGDISPOSITION disposition, HKEY *hkey, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Open_DevNode_Key_Ex( DEVINST node, REGSAM access, ULONG profile, REGDISPOSITION disposition, HKEY *hkey, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Query_And_Remove_SubTree_ExA( DEVINST ancestor, PNP_VETO_TYPE *type, char *name, ULONG len, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Query_And_Remove_SubTree_ExW( DEVINST ancestor, PNP_VETO_TYPE *type, WCHAR *name, ULONG len, ULONG flags, HMACHINE machine ); +#define CM_Query_And_Remove_SubTree_Ex WINELIB_NAME_AW(CM_Query_And_Remove_SubTree_Ex) +CMAPI CONFIGRET WINAPI CM_Query_And_Remove_SubTreeA( DEVINST ancestor, PNP_VETO_TYPE *type, char *name, ULONG len, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Query_And_Remove_SubTreeW( DEVINST ancestor, PNP_VETO_TYPE *type, WCHAR *name, ULONG len, ULONG flags ); +#define CM_Query_And_Remove_SubTree WINELIB_NAME_AW(CM_Query_And_Remove_SubTree) +CMAPI CONFIGRET WINAPI CM_Query_Arbitrator_Free_Data( void *data, ULONG len, DEVINST node, RESOURCEID id, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Query_Arbitrator_Free_Data_Ex( void *data, ULONG len, DEVINST node, RESOURCEID id, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Query_Arbitrator_Free_Size( ULONG *size, DEVINST node, RESOURCEID id, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Query_Arbitrator_Free_Size_Ex( ULONG *size, DEVINST node, RESOURCEID id, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Query_Remove_SubTree( DEVINST ancestor, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Query_Remove_SubTree_Ex( DEVINST ancestor, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Query_Resource_Conflict_List( CONFLICT_LIST *conflicts, DEVINST node, RESOURCEID id, const void *resource, ULONG len, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Reenumerate_DevNode( DEVINST node, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Reenumerate_DevNode_Ex( DEVINST node, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Register_Device_Driver( DEVINST node, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Register_Device_Driver_Ex( DEVINST node, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Register_Device_Interface_ExA( DEVINST node, GUID *class, const char *reference, char *iface, ULONG *len, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Register_Device_Interface_ExW( DEVINST node, GUID *class, const WCHAR *reference, WCHAR *iface, ULONG *len, ULONG flags, HMACHINE machine ); +#define CM_Register_Device_Interface_Ex WINELIB_NAME_AW(CM_Register_Device_Interface_Ex) +CMAPI CONFIGRET WINAPI CM_Register_Device_InterfaceA( DEVINST node, GUID *class, const char *reference, char *iface, ULONG *len, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Register_Device_InterfaceW( DEVINST node, GUID *class, const WCHAR *reference, WCHAR *iface, ULONG *len, ULONG flags ); +#define CM_Register_Device_Interface WINELIB_NAME_AW(CM_Register_Device_Interface) +CMAPI CONFIGRET WINAPI CM_Register_Notification( CM_NOTIFY_FILTER *filter, void *context, PCM_NOTIFY_CALLBACK callback, HCMNOTIFICATION *notify ); +CMAPI CONFIGRET WINAPI CM_Remove_SubTree( DEVINST ancestor, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Remove_SubTree_Ex( DEVINST ancestor, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Request_Device_Eject_ExA( DEVINST node, PNP_VETO_TYPE *type, char *name, ULONG len, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Request_Device_Eject_ExW( DEVINST node, PNP_VETO_TYPE *type, WCHAR *name, ULONG len, ULONG flags, HMACHINE machine ); +#define CM_Request_Device_Eject_Ex WINELIB_NAME_AW(CM_Request_Device_Eject_Ex) +CMAPI CONFIGRET WINAPI CM_Request_Device_EjectA( DEVINST node, PNP_VETO_TYPE *type, char *name, ULONG len, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Request_Device_EjectW( DEVINST node, PNP_VETO_TYPE *type, WCHAR *name, ULONG len, ULONG flags ); +#define CM_Request_Device_Eject WINELIB_NAME_AW(CM_Request_Device_Eject) +CMAPI CONFIGRET WINAPI CM_Request_Eject_PC(void); +CMAPI CONFIGRET WINAPI CM_Request_Eject_PC_Ex( HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Run_Detection( ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Run_Detection_Ex( ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Set_Class_Property_ExW( const GUID *class, const DEVPROPKEY *key, DEVPROPTYPE type, const BYTE *buffer, ULONG size, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Set_Class_PropertyW( const GUID *class, const DEVPROPKEY *key, DEVPROPTYPE type, const BYTE *buffer, ULONG size, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Set_Class_Registry_PropertyA( GUID *class, ULONG property, const void *buffer, ULONG len, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Set_Class_Registry_PropertyW( GUID *class, ULONG property, const void *buffer, ULONG len, ULONG flags, HMACHINE machine ); +#define CM_Set_Class_Registry_Property WINELIB_NAME_AW(CM_Set_Class_Registry_Property) +CMAPI CONFIGRET WINAPI CM_Set_Device_Interface_Property_ExW( const WCHAR *iface, const DEVPROPKEY *key, DEVPROPTYPE type, const BYTE *buffer, ULONG size, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Set_Device_Interface_PropertyW( const WCHAR *iface, const DEVPROPKEY *key, DEVPROPTYPE type, const BYTE *buffer, ULONG size, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Set_DevNode_Problem( DEVINST node, ULONG problem, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Set_DevNode_Problem_Ex( DEVINST node, ULONG problem, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Set_DevNode_Property_ExW( DEVINST node, const DEVPROPKEY *key, DEVPROPTYPE type, const BYTE *buffer, ULONG size, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Set_DevNode_PropertyW( DEVINST node, const DEVPROPKEY *key, DEVPROPTYPE type, const BYTE *buffer, ULONG size, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Set_DevNode_Registry_Property_ExA( DEVINST node, ULONG property, const void *buffer, ULONG len, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Set_DevNode_Registry_Property_ExW( DEVINST node, ULONG property, const void *buffer, ULONG len, ULONG flags, HMACHINE machine ); +#define CM_Set_DevNode_Registry_Property_Ex WINELIB_NAME_AW(CM_Set_DevNode_Registry_Property_Ex) +CMAPI CONFIGRET WINAPI CM_Set_DevNode_Registry_PropertyA( DEVINST node, ULONG property, const void *buffer, ULONG len, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Set_DevNode_Registry_PropertyW( DEVINST node, ULONG property, const void *buffer, ULONG len, ULONG flags ); +#define CM_Set_DevNode_Registry_Property WINELIB_NAME_AW(CM_Set_DevNode_Registry_Property) +CMAPI CONFIGRET WINAPI CM_Set_HW_Prof( ULONG profile, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Set_HW_Prof_Ex( ULONG profile, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Set_HW_Prof_Flags_ExA( DEVINSTID_A instance_id, ULONG config, ULONG value, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Set_HW_Prof_Flags_ExW( DEVINSTID_W instance_id, ULONG config, ULONG value, ULONG flags, HMACHINE machine ); +#define CM_Set_HW_Prof_Flags_Ex WINELIB_NAME_AW(CM_Set_HW_Prof_Flags_Ex) +CMAPI CONFIGRET WINAPI CM_Set_HW_Prof_FlagsA( DEVINSTID_A instance_id, ULONG config, ULONG value, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Set_HW_Prof_FlagsW( DEVINSTID_W instance_id, ULONG config, ULONG value, ULONG flags ); +#define CM_Set_HW_Prof_Flags WINELIB_NAME_AW(CM_Set_HW_Prof_Flags) +CMAPI CONFIGRET WINAPI CM_Setup_DevNode( DEVINST node, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Setup_DevNode_Ex( DEVINST node, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Test_Range_Available( DWORDLONG start, DWORDLONG end, RANGE_LIST ranges, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Uninstall_DevNode( DEVNODE node, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Uninstall_DevNode_Ex( DEVNODE node, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Unregister_Device_Interface_ExA( const char *iface, ULONG flags, HMACHINE machine ); +CMAPI CONFIGRET WINAPI CM_Unregister_Device_Interface_ExW( const WCHAR *iface, ULONG flags, HMACHINE machine ); +#define CM_Unregister_Device_Interface_Ex WINELIB_NAME_AW(CM_Unregister_Device_Interface_Ex) +CMAPI CONFIGRET WINAPI CM_Unregister_Device_InterfaceA( const char *iface, ULONG flags ); +CMAPI CONFIGRET WINAPI CM_Unregister_Device_InterfaceW( const WCHAR *iface, ULONG flags ); +#define CM_Unregister_Device_Interface WINELIB_NAME_AW(CM_Unregister_Device_Interface) +CMAPI CONFIGRET WINAPI CM_Unregister_Notification( HCMNOTIFICATION notify ); + +CMAPI DWORD WINAPI CM_MapCrToWin32Err( CONFIGRET ret, DWORD default_err ); +CMAPI WORD WINAPI CM_Get_Version(void); +CMAPI WORD WINAPI CM_Get_Version_Ex( HMACHINE machine ); + +CONFIGRET CM_Apply_PowerScheme(void); +CONFIGRET CM_Delete_PowerScheme( const GUID *scheme, DWORD *error ); +CONFIGRET CM_Duplicate_PowerScheme( const GUID *scheme_src, GUID **scheme_dst, DWORD *error ); +CONFIGRET CM_Import_PowerScheme( const WCHAR *filename, GUID **scheme_dst, DWORD *error ); +CONFIGRET CM_Restore_DefaultPowerScheme( const GUID *scheme, DWORD *error ); +CONFIGRET CM_RestoreAll_DefaultPowerSchemes( DWORD *error ); +CONFIGRET CM_Set_ActiveScheme( const GUID *scheme, DWORD *error ); +CONFIGRET CM_Write_UserPowerKey( const GUID *scheme, const GUID *subgroup, const GUID *setting, ULONG access, ULONG type, UCHAR *buffer, DWORD size, DWORD *error ); + +DWORD WINAPI CM_WaitNoPendingInstallEvents( DWORD timeout ); #ifdef __cplusplus } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9930
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/cfgmgr32/cfgmgr32.spec | 86 ++++++++++++++++++++++++++++++++++--- 1 file changed, 81 insertions(+), 5 deletions(-) diff --git a/dlls/cfgmgr32/cfgmgr32.spec b/dlls/cfgmgr32/cfgmgr32.spec index 9fd536329a3..862045663b6 100644 --- a/dlls/cfgmgr32/cfgmgr32.spec +++ b/dlls/cfgmgr32/cfgmgr32.spec @@ -1,4 +1,13 @@ +@ stub CMP_GetBlockedDriverInfo +@ stub CMP_GetServerSideDeviceInstallFlags +@ stub CMP_Init_Detection +@ stub CMP_RegisterServiceNotification +@ stub CMP_Register_Notification +@ stub CMP_Report_LogOn @ stdcall CMP_WaitNoPendingInstallEvents(long) setupapi.CMP_WaitNoPendingInstallEvents +@ stub CMP_WaitServicesAvailable +@ stub CM_Add_Driver_PackageW +@ stub CM_Add_Driver_Package_ExW @ stub CM_Add_Empty_Log_Conf @ stub CM_Add_Empty_Log_Conf_Ex @ stub CM_Add_IDA @@ -8,6 +17,7 @@ @ stub CM_Add_Range @ stub CM_Add_Res_Des @ stub CM_Add_Res_Des_Ex +@ stub CM_Apply_PowerScheme @ stdcall CM_Connect_MachineA(str ptr) setupapi.CM_Connect_MachineA @ stdcall CM_Connect_MachineW(wstr ptr) setupapi.CM_Connect_MachineW @ stdcall CM_Create_DevNodeA(ptr str long long) setupapi.CM_Create_DevNodeA @@ -19,6 +29,13 @@ @ stub CM_Delete_Class_Key_Ex @ stub CM_Delete_DevNode_Key @ stub CM_Delete_DevNode_Key_Ex +@ stub CM_Delete_Device_Interface_KeyA +@ stub CM_Delete_Device_Interface_KeyW +@ stub CM_Delete_Device_Interface_Key_ExA +@ stub CM_Delete_Device_Interface_Key_ExW +@ stub CM_Delete_Driver_PackageW +@ stub CM_Delete_Driver_Package_ExW +@ stub CM_Delete_PowerScheme @ stub CM_Delete_Range @ stub CM_Detect_Resource_Conflict @ stub CM_Detect_Resource_Conflict_Ex @@ -26,6 +43,7 @@ @ stub CM_Disable_DevNode_Ex @ stdcall CM_Disconnect_Machine(long) setupapi.CM_Disconnect_Machine @ stub CM_Dup_Range_List +@ stub CM_Duplicate_PowerScheme @ stub CM_Enable_DevNode @ stub CM_Enable_DevNode_Ex @ stdcall CM_Enumerate_Classes(long ptr long) setupapi.CM_Enumerate_Classes @@ -43,6 +61,7 @@ @ stub CM_Free_Res_Des @ stub CM_Free_Res_Des_Ex @ stub CM_Free_Res_Des_Handle +@ stub CM_Free_Resource_Conflict_Handle @ stdcall CM_Get_Child(ptr long long) setupapi.CM_Get_Child @ stdcall CM_Get_Child_Ex(ptr long long ptr) setupapi.CM_Get_Child_Ex @ stub CM_Get_Class_Key_NameA @@ -53,12 +72,22 @@ @ stub CM_Get_Class_NameW @ stub CM_Get_Class_Name_ExA @ stub CM_Get_Class_Name_ExW +@ stub CM_Get_Class_PropertyW +@ stub CM_Get_Class_Property_ExW +@ stdcall CM_Get_Class_Property_Keys(ptr ptr ptr long) setupapi.CM_Get_Class_Property_Keys +@ stdcall CM_Get_Class_Property_Keys_Ex(ptr ptr ptr long ptr) setupapi.CM_Get_Class_Property_Keys_Ex @ stdcall CM_Get_Class_Registry_PropertyA(ptr long ptr ptr long long ptr) setupapi.CM_Get_Class_Registry_PropertyA @ stdcall CM_Get_Class_Registry_PropertyW(ptr long ptr ptr long long ptr) setupapi.CM_Get_Class_Registry_PropertyW @ stub CM_Get_Depth @ stub CM_Get_Depth_Ex +@ stub CM_Get_DevNode_Custom_PropertyA +@ stub CM_Get_DevNode_Custom_PropertyW +@ stub CM_Get_DevNode_Custom_Property_ExA +@ stub CM_Get_DevNode_Custom_Property_ExW @ stdcall CM_Get_DevNode_PropertyW(long ptr ptr ptr ptr long) setupapi.CM_Get_DevNode_PropertyW @ stdcall CM_Get_DevNode_Property_ExW(long ptr ptr ptr ptr long ptr) setupapi.CM_Get_DevNode_Property_ExW +@ stub CM_Get_DevNode_Property_Keys +@ stub CM_Get_DevNode_Property_Keys_Ex @ stdcall CM_Get_DevNode_Registry_PropertyA(long long ptr ptr ptr long) setupapi.CM_Get_DevNode_Registry_PropertyA @ stdcall CM_Get_DevNode_Registry_PropertyW(long long ptr ptr ptr long) setupapi.CM_Get_DevNode_Registry_PropertyW @ stdcall CM_Get_DevNode_Registry_Property_ExA(long long ptr ptr ptr long ptr) setupapi.CM_Get_DevNode_Registry_Property_ExA @@ -72,7 +101,7 @@ @ stdcall CM_Get_Device_ID_ListA(str ptr long long) setupapi.CM_Get_Device_ID_ListA @ stdcall CM_Get_Device_ID_ListW(wstr ptr long long) setupapi.CM_Get_Device_ID_ListW @ stdcall CM_Get_Device_ID_List_ExA(str ptr long long ptr) setupapi.CM_Get_Device_ID_List_ExA -@ stdcall CM_Get_Device_ID_List_ExW(wstr ptr long long) setupapi.CM_Get_Device_ID_List_ExW +@ stdcall CM_Get_Device_ID_List_ExW(wstr ptr long long ptr) setupapi.CM_Get_Device_ID_List_ExW @ stdcall CM_Get_Device_ID_List_SizeA(ptr str long) setupapi.CM_Get_Device_ID_List_SizeA @ stdcall CM_Get_Device_ID_List_SizeW(ptr wstr long) setupapi.CM_Get_Device_ID_List_SizeW @ stdcall CM_Get_Device_ID_List_Size_ExA(ptr str long ptr) setupapi.CM_Get_Device_ID_List_Size_ExA @@ -92,6 +121,9 @@ @ stdcall CM_Get_Device_Interface_List_Size_ExA(ptr ptr str long ptr) setupapi.CM_Get_Device_Interface_List_Size_ExA @ stdcall CM_Get_Device_Interface_List_Size_ExW(ptr ptr wstr long ptr) setupapi.CM_Get_Device_Interface_List_Size_ExW @ stdcall CM_Get_Device_Interface_PropertyW(wstr ptr ptr ptr ptr long) +@ stub CM_Get_Device_Interface_Property_ExW +@ stub CM_Get_Device_Interface_Property_KeysW +@ stub CM_Get_Device_Interface_Property_Keys_ExW @ stub CM_Get_First_Log_Conf @ stub CM_Get_First_Log_Conf_Ex @ stub CM_Get_Global_State @@ -116,17 +148,27 @@ @ stub CM_Get_Res_Des_Data_Ex @ stub CM_Get_Res_Des_Data_Size @ stub CM_Get_Res_Des_Data_Size_Ex +@ stub CM_Get_Resource_Conflict_Count +@ stub CM_Get_Resource_Conflict_DetailsA +@ stub CM_Get_Resource_Conflict_DetailsW @ stdcall CM_Get_Sibling(ptr long long) setupapi.CM_Get_Sibling @ stdcall CM_Get_Sibling_Ex(ptr long long ptr) setupapi.CM_Get_Sibling_Ex @ stdcall CM_Get_Version() setupapi.CM_Get_Version @ stub CM_Get_Version_Ex +@ stub CM_Import_PowerScheme +@ stub CM_Install_DevNodeW +@ stub CM_Install_DevNode_ExW @ stub CM_Intersect_Range_List @ stub CM_Invert_Range_List @ stub CM_Is_Dock_Station_Present +@ stub CM_Is_Dock_Station_Present_Ex +@ stub CM_Is_Version_Available +@ stub CM_Is_Version_Available_Ex @ stdcall CM_Locate_DevNodeA(ptr str long) setupapi.CM_Locate_DevNodeA @ stdcall CM_Locate_DevNodeW(ptr wstr long) setupapi.CM_Locate_DevNodeW @ stdcall CM_Locate_DevNode_ExA(ptr str long long) setupapi.CM_Locate_DevNode_ExA @ stdcall CM_Locate_DevNode_ExW(ptr wstr long long) setupapi.CM_Locate_DevNode_ExW +@ stub CM_MapCrToSpErr @ stdcall CM_MapCrToWin32Err(long long) @ stub CM_Merge_Range_List @ stub CM_Modify_Res_Des @@ -140,12 +182,21 @@ @ stub CM_Open_Class_Key_ExW @ stdcall CM_Open_DevNode_Key(long long long long ptr long) setupapi.CM_Open_DevNode_Key @ stub CM_Open_DevNode_Key_Ex +@ stub CM_Open_Device_Interface_KeyA +@ stub CM_Open_Device_Interface_KeyW +@ stub CM_Open_Device_Interface_Key_ExA +@ stub CM_Open_Device_Interface_Key_ExW +@ stub CM_Query_And_Remove_SubTreeA +@ stub CM_Query_And_Remove_SubTreeW +@ stub CM_Query_And_Remove_SubTree_ExA +@ stub CM_Query_And_Remove_SubTree_ExW @ stub CM_Query_Arbitrator_Free_Data @ stub CM_Query_Arbitrator_Free_Data_Ex @ stub CM_Query_Arbitrator_Free_Size @ stub CM_Query_Arbitrator_Free_Size_Ex @ stub CM_Query_Remove_SubTree @ stub CM_Query_Remove_SubTree_Ex +@ stub CM_Query_Resource_Conflict_List @ stdcall CM_Reenumerate_DevNode(ptr long) setupapi.CM_Reenumerate_DevNode @ stdcall CM_Reenumerate_DevNode_Ex(ptr long ptr) setupapi.CM_Reenumerate_DevNode_Ex @ stub CM_Register_Device_Driver @@ -157,21 +208,31 @@ @ stdcall CM_Register_Notification(ptr ptr ptr ptr) @ stub CM_Remove_SubTree @ stub CM_Remove_SubTree_Ex -@ stub CM_Remove_Unmarked_Children -@ stub CM_Remove_Unmarked_Children_Ex +@ stub CM_Request_Device_EjectA +@ stub CM_Request_Device_EjectW +@ stub CM_Request_Device_Eject_ExA +@ stub CM_Request_Device_Eject_ExW @ stub CM_Request_Eject_PC -@ stub CM_Reset_Children_Marks -@ stub CM_Reset_Children_Marks_Ex +@ stub CM_Request_Eject_PC_Ex +@ stub CM_RestoreAll_DefaultPowerSchemes +@ stub CM_Restore_DefaultPowerScheme @ stub CM_Run_Detection @ stub CM_Run_Detection_Ex +@ stub CM_Set_ActiveScheme +@ stub CM_Set_Class_PropertyW +@ stub CM_Set_Class_Property_ExW @ stdcall CM_Set_Class_Registry_PropertyA(ptr long ptr long long ptr) setupapi.CM_Set_Class_Registry_PropertyA @ stdcall CM_Set_Class_Registry_PropertyW(ptr long ptr long long ptr) setupapi.CM_Set_Class_Registry_PropertyW @ stub CM_Set_DevNode_Problem @ stub CM_Set_DevNode_Problem_Ex +@ stub CM_Set_DevNode_PropertyW +@ stub CM_Set_DevNode_Property_ExW @ stub CM_Set_DevNode_Registry_PropertyA @ stub CM_Set_DevNode_Registry_PropertyW @ stub CM_Set_DevNode_Registry_Property_ExA @ stub CM_Set_DevNode_Registry_Property_ExW +@ stub CM_Set_Device_Interface_PropertyW +@ stub CM_Set_Device_Interface_Property_ExW @ stub CM_Set_HW_Prof @ stub CM_Set_HW_Prof_Ex @ stub CM_Set_HW_Prof_FlagsA @@ -188,9 +249,14 @@ @ stub CM_Unregister_Device_Interface_ExA @ stub CM_Unregister_Device_Interface_ExW @ stdcall CM_Unregister_Notification(ptr) +@ stub CM_Write_UserPowerKey @ stdcall DevCloseObjectQuery(ptr) @ stdcall DevCreateObjectQuery(long long long ptr long ptr ptr ptr ptr) @ stdcall DevCreateObjectQueryEx(long long long ptr long ptr long ptr ptr ptr ptr) +@ stub DevCreateObjectQueryFromId +@ stub DevCreateObjectQueryFromIdEx +@ stub DevCreateObjectQueryFromIds +@ stub DevCreateObjectQueryFromIdsEx @ stdcall DevFindProperty(ptr long wstr long ptr) @ stdcall DevFreeObjectProperties(long ptr) @ stdcall DevFreeObjects(long ptr) @@ -198,3 +264,13 @@ @ stdcall DevGetObjectPropertiesEx(long ptr long long ptr long ptr ptr ptr) @ stdcall DevGetObjects(long long long ptr long ptr ptr ptr) @ stdcall DevGetObjectsEx(long long long ptr long ptr long ptr ptr ptr) +@ stub DevSetObjectProperties +@ stub SwDeviceClose +@ stub SwDeviceCreate +@ stub SwDeviceGetLifetime +@ stub SwDeviceInterfacePropertySet +@ stub SwDeviceInterfaceRegister +@ stub SwDeviceInterfaceSetState +@ stub SwDevicePropertySet +@ stub SwDeviceSetLifetime +@ stub SwMemFree -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9930
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/cfgmgr32/Makefile.in | 3 +- dlls/cfgmgr32/main.c | 182 ----------------------------- dlls/cfgmgr32/notification.c | 218 +++++++++++++++++++++++++++++++++++ 3 files changed, 220 insertions(+), 183 deletions(-) create mode 100644 dlls/cfgmgr32/notification.c diff --git a/dlls/cfgmgr32/Makefile.in b/dlls/cfgmgr32/Makefile.in index fd819760e6f..da946c2160e 100644 --- a/dlls/cfgmgr32/Makefile.in +++ b/dlls/cfgmgr32/Makefile.in @@ -3,4 +3,5 @@ IMPORTLIB = cfgmgr32 IMPORTS = advapi32 rpcrt4 sechost setupapi SOURCES = \ - main.c + main.c \ + notification.c diff --git a/dlls/cfgmgr32/main.c b/dlls/cfgmgr32/main.c index 8ae08e7c7e8..06ef5a09623 100644 --- a/dlls/cfgmgr32/main.c +++ b/dlls/cfgmgr32/main.c @@ -72,188 +72,6 @@ DWORD WINAPI CM_MapCrToWin32Err( CONFIGRET code, DWORD default_error ) return default_error; } -struct cm_notify_context -{ - HDEVNOTIFY notify; - void *user_data; - PCM_NOTIFY_CALLBACK callback; -}; - -CALLBACK DWORD devnotify_callback( HANDLE handle, DWORD flags, DEV_BROADCAST_HDR *header ) -{ - struct cm_notify_context *ctx = handle; - CM_NOTIFY_EVENT_DATA *event_data; - CM_NOTIFY_ACTION action; - DWORD size, ret; - - TRACE( "(%p, %#lx, %p)\n", handle, flags, header ); - - switch (flags) - { - case DBT_DEVICEARRIVAL: - action = CM_NOTIFY_ACTION_DEVICEINTERFACEARRIVAL; - break; - case DBT_DEVICEREMOVECOMPLETE: - FIXME( "CM_NOTIFY_ACTION_DEVICEREMOVECOMPLETE not implemented\n" ); - action = CM_NOTIFY_ACTION_DEVICEINTERFACEREMOVAL; - break; - case DBT_CUSTOMEVENT: - action = CM_NOTIFY_ACTION_DEVICECUSTOMEVENT; - break; - default: - FIXME( "Unexpected flags value: %#lx\n", flags ); - return 0; - } - - switch (header->dbch_devicetype) - { - case DBT_DEVTYP_DEVICEINTERFACE: - { - const DEV_BROADCAST_DEVICEINTERFACE_W *iface = (DEV_BROADCAST_DEVICEINTERFACE_W *)header; - UINT data_size = wcslen( iface->dbcc_name ) + 1; - - size = offsetof( CM_NOTIFY_EVENT_DATA, u.DeviceInterface.SymbolicLink[data_size] ); - if (!(event_data = calloc( 1, size ))) return 0; - - event_data->FilterType = CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE; - event_data->u.DeviceInterface.ClassGuid = iface->dbcc_classguid; - memcpy( event_data->u.DeviceInterface.SymbolicLink, iface->dbcc_name, data_size * sizeof(WCHAR) ); - break; - } - case DBT_DEVTYP_HANDLE: - { - const DEV_BROADCAST_HANDLE *handle = (DEV_BROADCAST_HANDLE *)header; - UINT data_size = handle->dbch_size - 2 * sizeof(WCHAR) - offsetof( DEV_BROADCAST_HANDLE, dbch_data ); - - size = offsetof( CM_NOTIFY_EVENT_DATA, u.DeviceHandle.Data[data_size] ); - if (!(event_data = calloc( 1, size ))) return 0; - - event_data->FilterType = CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE; - event_data->u.DeviceHandle.EventGuid = handle->dbch_eventguid; - event_data->u.DeviceHandle.NameOffset = handle->dbch_nameoffset; - event_data->u.DeviceHandle.DataSize = data_size; - memcpy( event_data->u.DeviceHandle.Data, handle->dbch_data, data_size ); - break; - } - default: - FIXME( "Unexpected devicetype value: %#lx\n", header->dbch_devicetype ); - return 0; - } - - ret = ctx->callback( ctx, ctx->user_data, action, event_data, size ); - free( event_data ); - return ret; -} - -static const char *debugstr_CM_NOTIFY_FILTER( const CM_NOTIFY_FILTER *filter ) -{ - if (!filter) return "(null)"; - switch (filter->FilterType) - { - case CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE: - return wine_dbg_sprintf( "{%#lx %lx CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE %lu {{%s}}}", filter->cbSize, - filter->Flags, filter->Reserved, - debugstr_guid( &filter->u.DeviceInterface.ClassGuid ) ); - case CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE: - return wine_dbg_sprintf( "{%#lx %lx CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE %lu {{%p}}}", filter->cbSize, - filter->Flags, filter->Reserved, filter->u.DeviceHandle.hTarget ); - case CM_NOTIFY_FILTER_TYPE_DEVICEINSTANCE: - return wine_dbg_sprintf( "{%#lx %lx CM_NOTIFY_FILTER_TYPE_DEVICEINSTANCE %lu {{%s}}}", filter->cbSize, - filter->Flags, filter->Reserved, debugstr_w( filter->u.DeviceInstance.InstanceId ) ); - default: - return wine_dbg_sprintf( "{%#lx %lx (unknown FilterType %d) %lu}", filter->cbSize, filter->Flags, - filter->FilterType, filter->Reserved ); - } -} - -static CONFIGRET create_notify_context( const CM_NOTIFY_FILTER *filter, HCMNOTIFICATION *notify_handle, - PCM_NOTIFY_CALLBACK callback, void *user_data ) -{ - union - { - DEV_BROADCAST_HDR header; - DEV_BROADCAST_DEVICEINTERFACE_W iface; - DEV_BROADCAST_HANDLE handle; - } notify_filter = {0}; - struct cm_notify_context *ctx; - static const GUID GUID_NULL; - - switch (filter->FilterType) - { - case CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE: - notify_filter.iface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; - if (filter->Flags & CM_NOTIFY_FILTER_FLAG_ALL_INTERFACE_CLASSES) - { - if (!IsEqualGUID( &filter->u.DeviceInterface.ClassGuid, &GUID_NULL )) return CR_INVALID_DATA; - notify_filter.iface.dbcc_size = offsetof( DEV_BROADCAST_DEVICEINTERFACE_W, dbcc_classguid ); - } - else - { - notify_filter.iface.dbcc_size = offsetof( DEV_BROADCAST_DEVICEINTERFACE_W, dbcc_name ); - notify_filter.iface.dbcc_classguid = filter->u.DeviceInterface.ClassGuid; - } - break; - case CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE: - notify_filter.handle.dbch_devicetype = DBT_DEVTYP_HANDLE; - notify_filter.handle.dbch_size = sizeof(notify_filter.handle); - notify_filter.handle.dbch_handle = filter->u.DeviceHandle.hTarget; - break; - case CM_NOTIFY_FILTER_TYPE_DEVICEINSTANCE: - FIXME( "CM_NOTIFY_FILTER_TYPE_DEVICEINSTANCE is not supported!\n" ); - return CR_CALL_NOT_IMPLEMENTED; - default: - return CR_INVALID_DATA; - } - - if (!(ctx = calloc( 1, sizeof(*ctx) ))) return CR_OUT_OF_MEMORY; - - ctx->user_data = user_data; - ctx->callback = callback; - if (!(ctx->notify = I_ScRegisterDeviceNotification( ctx, ¬ify_filter.header, devnotify_callback ))) - { - free( ctx ); - switch (GetLastError()) - { - case ERROR_NOT_ENOUGH_MEMORY: return CR_OUT_OF_MEMORY; - case ERROR_INVALID_PARAMETER: return CR_INVALID_DATA; - default: return CR_FAILURE; - } - } - *notify_handle = ctx; - return CR_SUCCESS; -} - -/*********************************************************************** - * CM_Register_Notification (cfgmgr32.@) - */ -CONFIGRET WINAPI CM_Register_Notification( CM_NOTIFY_FILTER *filter, void *context, - PCM_NOTIFY_CALLBACK callback, HCMNOTIFICATION *notify_context ) -{ - TRACE( "(%s %p %p %p)\n", debugstr_CM_NOTIFY_FILTER( filter ), context, callback, notify_context ); - - if (!notify_context) return CR_FAILURE; - if (!filter || !callback || filter->cbSize != sizeof(*filter)) return CR_INVALID_DATA; - - return create_notify_context( filter, notify_context, callback, context ); -} - -/*********************************************************************** - * CM_Unregister_Notification (cfgmgr32.@) - */ -CONFIGRET WINAPI CM_Unregister_Notification( HCMNOTIFICATION notify ) -{ - struct cm_notify_context *ctx = notify; - - TRACE( "(%p)\n", notify ); - - if (!notify) return CR_INVALID_DATA; - - I_ScUnregisterDeviceNotification( ctx->notify ); - free( ctx ); - - return CR_SUCCESS; -} - /*********************************************************************** * CM_Get_Device_Interface_PropertyW (cfgmgr32.@) */ diff --git a/dlls/cfgmgr32/notification.c b/dlls/cfgmgr32/notification.c new file mode 100644 index 00000000000..bc004efcccb --- /dev/null +++ b/dlls/cfgmgr32/notification.c @@ -0,0 +1,218 @@ +/* + * Copyright (C) 2023 Mohamad Al-Jaf + * Copyright (C) 2025 Vibhav Pant + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <assert.h> + +#include "wine/debug.h" +#include "wine/rbtree.h" +#include "winreg.h" +#include "winternl.h" +#include "cfgmgr32.h" +#include "winuser.h" +#include "dbt.h" +#include "wine/plugplay.h" +#include "setupapi.h" +#include "devfiltertypes.h" +#include "devquery.h" + +#include "initguid.h" +#include "devpkey.h" + +WINE_DEFAULT_DEBUG_CHANNEL(setupapi); + +static const char *debugstr_CM_NOTIFY_FILTER( const CM_NOTIFY_FILTER *filter ) +{ + if (!filter) return "(null)"; + switch (filter->FilterType) + { + case CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE: + return wine_dbg_sprintf( "{%#lx %lx CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE %lu {{%s}}}", filter->cbSize, + filter->Flags, filter->Reserved, debugstr_guid( &filter->u.DeviceInterface.ClassGuid ) ); + case CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE: + return wine_dbg_sprintf( "{%#lx %lx CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE %lu {{%p}}}", filter->cbSize, + filter->Flags, filter->Reserved, filter->u.DeviceHandle.hTarget ); + case CM_NOTIFY_FILTER_TYPE_DEVICEINSTANCE: + return wine_dbg_sprintf( "{%#lx %lx CM_NOTIFY_FILTER_TYPE_DEVICEINSTANCE %lu {{%s}}}", filter->cbSize, + filter->Flags, filter->Reserved, debugstr_w( filter->u.DeviceInstance.InstanceId ) ); + default: + return wine_dbg_sprintf( "{%#lx %lx (unknown FilterType %d) %lu}", filter->cbSize, filter->Flags, + filter->FilterType, filter->Reserved ); + } +} + +struct cm_notify_context +{ + HDEVNOTIFY notify; + void *user_data; + PCM_NOTIFY_CALLBACK callback; +}; + +CALLBACK DWORD devnotify_callback( HANDLE handle, DWORD flags, DEV_BROADCAST_HDR *header ) +{ + struct cm_notify_context *ctx = handle; + CM_NOTIFY_EVENT_DATA *event_data; + CM_NOTIFY_ACTION action; + DWORD size, ret; + + TRACE( "(%p, %#lx, %p)\n", handle, flags, header ); + + switch (flags) + { + case DBT_DEVICEARRIVAL: + action = CM_NOTIFY_ACTION_DEVICEINTERFACEARRIVAL; + break; + case DBT_DEVICEREMOVECOMPLETE: + FIXME( "CM_NOTIFY_ACTION_DEVICEREMOVECOMPLETE not implemented\n" ); + action = CM_NOTIFY_ACTION_DEVICEINTERFACEREMOVAL; + break; + case DBT_CUSTOMEVENT: + action = CM_NOTIFY_ACTION_DEVICECUSTOMEVENT; + break; + default: + FIXME( "Unexpected flags value: %#lx\n", flags ); + return 0; + } + + switch (header->dbch_devicetype) + { + case DBT_DEVTYP_DEVICEINTERFACE: + { + const DEV_BROADCAST_DEVICEINTERFACE_W *iface = (DEV_BROADCAST_DEVICEINTERFACE_W *)header; + UINT data_size = wcslen( iface->dbcc_name ) + 1; + + size = offsetof( CM_NOTIFY_EVENT_DATA, u.DeviceInterface.SymbolicLink[data_size] ); + if (!(event_data = calloc( 1, size ))) return 0; + + event_data->FilterType = CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE; + event_data->u.DeviceInterface.ClassGuid = iface->dbcc_classguid; + memcpy( event_data->u.DeviceInterface.SymbolicLink, iface->dbcc_name, data_size * sizeof(WCHAR) ); + break; + } + case DBT_DEVTYP_HANDLE: + { + const DEV_BROADCAST_HANDLE *handle = (DEV_BROADCAST_HANDLE *)header; + UINT data_size = handle->dbch_size - 2 * sizeof(WCHAR) - offsetof( DEV_BROADCAST_HANDLE, dbch_data ); + + size = offsetof( CM_NOTIFY_EVENT_DATA, u.DeviceHandle.Data[data_size] ); + if (!(event_data = calloc( 1, size ))) return 0; + + event_data->FilterType = CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE; + event_data->u.DeviceHandle.EventGuid = handle->dbch_eventguid; + event_data->u.DeviceHandle.NameOffset = handle->dbch_nameoffset; + event_data->u.DeviceHandle.DataSize = data_size; + memcpy( event_data->u.DeviceHandle.Data, handle->dbch_data, data_size ); + break; + } + default: + FIXME( "Unexpected devicetype value: %#lx\n", header->dbch_devicetype ); + return 0; + } + + ret = ctx->callback( ctx, ctx->user_data, action, event_data, size ); + free( event_data ); + return ret; +} + +static CONFIGRET create_notify_context( const CM_NOTIFY_FILTER *filter, HCMNOTIFICATION *notify_handle, + PCM_NOTIFY_CALLBACK callback, void *user_data ) +{ + union + { + DEV_BROADCAST_HDR header; + DEV_BROADCAST_DEVICEINTERFACE_W iface; + DEV_BROADCAST_HANDLE handle; + } notify_filter = {0}; + struct cm_notify_context *ctx; + static const GUID GUID_NULL; + + switch (filter->FilterType) + { + case CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE: + notify_filter.iface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; + if (filter->Flags & CM_NOTIFY_FILTER_FLAG_ALL_INTERFACE_CLASSES) + { + if (!IsEqualGUID( &filter->u.DeviceInterface.ClassGuid, &GUID_NULL )) return CR_INVALID_DATA; + notify_filter.iface.dbcc_size = offsetof( DEV_BROADCAST_DEVICEINTERFACE_W, dbcc_classguid ); + } + else + { + notify_filter.iface.dbcc_size = offsetof( DEV_BROADCAST_DEVICEINTERFACE_W, dbcc_name ); + notify_filter.iface.dbcc_classguid = filter->u.DeviceInterface.ClassGuid; + } + break; + case CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE: + notify_filter.handle.dbch_devicetype = DBT_DEVTYP_HANDLE; + notify_filter.handle.dbch_size = sizeof(notify_filter.handle); + notify_filter.handle.dbch_handle = filter->u.DeviceHandle.hTarget; + break; + case CM_NOTIFY_FILTER_TYPE_DEVICEINSTANCE: + FIXME( "CM_NOTIFY_FILTER_TYPE_DEVICEINSTANCE is not supported!\n" ); + return CR_CALL_NOT_IMPLEMENTED; + default: + return CR_INVALID_DATA; + } + + if (!(ctx = calloc( 1, sizeof(*ctx) ))) return CR_OUT_OF_MEMORY; + + ctx->user_data = user_data; + ctx->callback = callback; + if (!(ctx->notify = I_ScRegisterDeviceNotification( ctx, ¬ify_filter.header, devnotify_callback ))) + { + free( ctx ); + switch (GetLastError()) + { + case ERROR_NOT_ENOUGH_MEMORY: return CR_OUT_OF_MEMORY; + case ERROR_INVALID_PARAMETER: return CR_INVALID_DATA; + default: return CR_FAILURE; + } + } + *notify_handle = ctx; + return CR_SUCCESS; +} + +/*********************************************************************** + * CM_Register_Notification (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Register_Notification( CM_NOTIFY_FILTER *filter, void *context, + PCM_NOTIFY_CALLBACK callback, HCMNOTIFICATION *notify_context ) +{ + TRACE( "(%s %p %p %p)\n", debugstr_CM_NOTIFY_FILTER( filter ), context, callback, notify_context ); + + if (!notify_context) return CR_FAILURE; + if (!filter || !callback || filter->cbSize != sizeof(*filter)) return CR_INVALID_DATA; + + return create_notify_context( filter, notify_context, callback, context ); +} + +/*********************************************************************** + * CM_Unregister_Notification (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Unregister_Notification( HCMNOTIFICATION notify ) +{ + struct cm_notify_context *ctx = notify; + + TRACE( "(%p)\n", notify ); + + if (!notify) return CR_INVALID_DATA; + + I_ScUnregisterDeviceNotification( ctx->notify ); + free( ctx ); + + return CR_SUCCESS; +} -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9930
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/cfgmgr32/Makefile.in | 2 +- dlls/cfgmgr32/{main.c => cfgmgr32.c} | 4 ++++ dlls/setupapi/Makefile.in | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) rename dlls/cfgmgr32/{main.c => cfgmgr32.c} (99%) diff --git a/dlls/cfgmgr32/Makefile.in b/dlls/cfgmgr32/Makefile.in index da946c2160e..75a8ed7e514 100644 --- a/dlls/cfgmgr32/Makefile.in +++ b/dlls/cfgmgr32/Makefile.in @@ -3,5 +3,5 @@ IMPORTLIB = cfgmgr32 IMPORTS = advapi32 rpcrt4 sechost setupapi SOURCES = \ - main.c \ + cfgmgr32.c \ notification.c diff --git a/dlls/cfgmgr32/main.c b/dlls/cfgmgr32/cfgmgr32.c similarity index 99% rename from dlls/cfgmgr32/main.c rename to dlls/cfgmgr32/cfgmgr32.c index 06ef5a09623..e27faf52420 100644 --- a/dlls/cfgmgr32/main.c +++ b/dlls/cfgmgr32/cfgmgr32.c @@ -118,6 +118,8 @@ CONFIGRET WINAPI CM_Get_Device_Interface_PropertyW( LPCWSTR device_interface, co } } +#ifndef _SETUPAPI_ + static BOOL dev_properties_append( DEVPROPERTY **properties, ULONG *props_len, const DEVPROPKEY *key, DEVPROPTYPE type, ULONG buf_size, void *buf ) { @@ -1336,3 +1338,5 @@ void WINAPI DevFreeObjectProperties( ULONG len, const DEVPROPERTY *props ) free( properties[i].Buffer ); free( properties ); } + +#endif /* _SETUPAPI_ */ \ No newline at end of file diff --git a/dlls/setupapi/Makefile.in b/dlls/setupapi/Makefile.in index 4a2d1109707..8fbd4a9046c 100644 --- a/dlls/setupapi/Makefile.in +++ b/dlls/setupapi/Makefile.in @@ -3,8 +3,10 @@ MODULE = setupapi.dll IMPORTLIB = setupapi IMPORTS = uuid advapi32 rpcrt4 kernelbase DELAYIMPORTS = cabinet shell32 wintrust ole32 comdlg32 user32 +PARENTSRC = ../cfgmgr32 SOURCES = \ + cfgmgr32.c \ devinst.c \ dialog.c \ dirid.c \ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9930
I don't think sharing sources works. SP_DEVINFO_DATA returns a handle to the CM node which can then be used with CM functions. This is documented and even tested, briefly. I think we need to reimplement SetupDi* over CM_* and only then move things to cfgmgr32. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/9930#note_127426
I think it can work for many basic functions, the CM node is different indeed because it maintains a local cache, but we can already share sources for class and device interface APIs, and then consider how to migrate the remaining device node related functions. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/9930#note_127445
I mean, sure, it can, but why not just be safe and do the conversion first? That way we don't have to duplicate anything either. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/9930#note_127446
I don't understand what difference it makes? It's not going to duplicate anything? -- https://gitlab.winehq.org/wine/wine/-/merge_requests/9930#note_127447
Fwiw cfgmgr32 has some functions that also need to be implemented without setupapi, and sharing the sources is necessary to share the internal helpers for them, as using the CM API for them is not efficient. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/9930#note_127757
Maybe I'm missing something, it just seems like this is a more complicated and roundabout way of achieving the goal than just flipping the implementation first and then moving things to cfgmgr32. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/9930#note_128065
Can we stop spending weeks arguing about how to move code around *differently*? It is not possible to implement things in setupapi only. CM_Get_Device_Interface_PropertyW is in cfgmgr32 only and cannot be implemented without setupapi, unless the registry helpers are available in cfgmgr32 as well. Other functions like the Dev* API would need it or have similar issue. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/9930#note_128112
participants (3)
-
Elizabeth Figura (@zfigura) -
Rémi Bernon -
Rémi Bernon (@rbernon)