[PATCH v6 0/6] MR10584: cfgmgr32: Implement CM_Get_DevNode_Property* and CM_Get_Device_ID_List*.
And move remaining stubs from setupapi. -- v6: cfgmgr32: Move remaining stubs from setupapi. setupapi: Forward CM_Get_Device_ID_List(_Size)(_Ex)(A|W) to cfgmgr32. cfgmgr32: Implement CM_Get_Device_ID_List(_Size)(_Ex)(A|W). cfgmgr32: Implement CM_Get_DevNode_Property_Keys(_Ex). setupapi: Forward CM_Get_DevNode_Property(_Ex)(A|W) to cfgmgr32. cfgmgr32: Implement CM_Get_DevNode_Property(_Ex)(A|W). https://gitlab.winehq.org/wine/wine/-/merge_requests/10584
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/cfgmgr32/cfgmgr32.c | 151 +++++++++++++++- dlls/cfgmgr32/cfgmgr32.spec | 4 +- dlls/cfgmgr32/cfgmgr32_private.h | 5 +- dlls/cfgmgr32/tests/cfgmgr32.c | 297 +++++++++++++++++++++++++++++++ 4 files changed, 448 insertions(+), 9 deletions(-) diff --git a/dlls/cfgmgr32/cfgmgr32.c b/dlls/cfgmgr32/cfgmgr32.c index 280f10dd4db..42cd5a42d28 100644 --- a/dlls/cfgmgr32/cfgmgr32.c +++ b/dlls/cfgmgr32/cfgmgr32.c @@ -137,7 +137,7 @@ LSTATUS init_property( struct property *prop, const DEVPROPKEY *key, DEVPROPTYPE if (!key) return ERROR_INVALID_PARAMETER; if (!(prop->type = type) || !(prop->size = size)) return ERROR_INVALID_USER_BUFFER; if (!(prop->buffer = buffer) && (*prop->size)) return ERROR_INVALID_USER_BUFFER; - prop->ansi = FALSE; + prop->flags = PROP_FLAG_BINARY; prop->key = *key; prop->reg_type = NULL; return ERROR_SUCCESS; @@ -148,7 +148,7 @@ static LSTATUS init_registry_property( struct property *prop, const DEVPROPKEY * if (!(prop->size = size)) return ERROR_INVALID_USER_BUFFER; if (!(prop->buffer = buffer) && (*prop->size)) return ERROR_INVALID_USER_BUFFER; prop->type = NULL; - prop->ansi = ansi; + prop->flags = ansi ? PROP_FLAG_ANSI : 0; memcpy( &prop->key, base, sizeof(prop->key) ); prop->key.pid = property + 1; prop->reg_type = type; @@ -175,13 +175,25 @@ static LSTATUS query_named_property( HKEY hkey, const WCHAR *nameW, DEVPROPTYPE { LSTATUS err; - if (!prop->ansi) err = RegQueryValueExW( hkey, nameW, NULL, prop->reg_type, prop->buffer, prop->size ); - else + if (prop->flags & PROP_FLAG_ANSI) { char nameA[MAX_PATH]; if (nameW) WideCharToMultiByte( CP_ACP, 0, nameW, -1, nameA, sizeof(nameA), NULL, NULL ); err = RegQueryValueExA( hkey, nameW ? nameA : NULL, NULL, prop->reg_type, prop->buffer, prop->size ); } + else if (type == DEVPROP_TYPE_GUID && (prop->flags & PROP_FLAG_BINARY)) + { + WCHAR buffer[39]; + DWORD len = *prop->size >= sizeof(GUID) ? sizeof(buffer) : 0; + + if (!(err = RegQueryValueExW( hkey, nameW, NULL, prop->reg_type, (BYTE *)buffer, &len ))) + err = guid_from_string( buffer, prop->buffer ); + *prop->size = sizeof(GUID); + } + else + { + err = RegQueryValueExW( hkey, nameW, NULL, prop->reg_type, prop->buffer, prop->size ); + } if (!err && !prop->buffer) err = ERROR_MORE_DATA; if ((!err || err == ERROR_MORE_DATA) && prop->type) *prop->type = type; @@ -203,6 +215,11 @@ static LSTATUS return_property_bool( struct property *prop, DEVPROP_BOOLEAN valu return return_property( prop, DEVPROP_TYPE_BOOLEAN, &value, sizeof(value) ); } +static LSTATUS return_property_string( struct property *prop, const WCHAR *value ) +{ + return return_property( prop, DEVPROP_TYPE_STRING, value, (wcslen( value ) + 1) * sizeof(WCHAR) ); +} + static LSTATUS enum_objects_size( HKEY hkey, const void *object, const WCHAR *path, UINT path_len, void *context ) { UINT *total = context; @@ -612,10 +629,85 @@ static const struct property_desc device_properties[] = { &DEVPKEY_Device_InstallState, DEVPROP_TYPE_UINT32, L"InstallState" }, { &DEVPKEY_Device_LocationPaths, DEVPROP_TYPE_STRING_LIST, L"LocationPaths" }, { &DEVPKEY_Device_BaseContainerId, DEVPROP_TYPE_GUID, L"BaseContainerId" }, + /* unicode-only properties */ + { &DEVPKEY_Device_InstanceId, DEVPROP_TYPE_STRING }, + { &DEVPKEY_Device_DevNodeStatus, DEVPROP_TYPE_UINT32 }, + { &DEVPKEY_Device_ProblemCode, DEVPROP_TYPE_UINT32 }, + { &DEVPKEY_Device_EjectionRelations, DEVPROP_TYPE_STRING_LIST }, + { &DEVPKEY_Device_RemovalRelations, DEVPROP_TYPE_STRING_LIST }, + { &DEVPKEY_Device_PowerRelations, DEVPROP_TYPE_STRING_LIST }, + { &DEVPKEY_Device_BusRelations, DEVPROP_TYPE_STRING_LIST }, + { &DEVPKEY_Device_Parent, DEVPROP_TYPE_STRING }, + { &DEVPKEY_Device_Children, DEVPROP_TYPE_STRING_LIST }, + { &DEVPKEY_Device_Siblings, DEVPROP_TYPE_STRING_LIST }, + { &DEVPKEY_Device_TransportRelations, DEVPROP_TYPE_STRING_LIST }, + { &DEVPKEY_Device_ProblemStatus, DEVPROP_TYPE_NTSTATUS }, + { &DEVPKEY_Device_Reported, DEVPROP_TYPE_BOOLEAN }, + { &DEVPKEY_Device_Legacy, DEVPROP_TYPE_BOOLEAN }, + { &DEVPKEY_Device_ContainerId, DEVPROP_TYPE_GUID, L"ContainerId" }, + { &DEVPKEY_Device_InLocalMachineContainer, DEVPROP_TYPE_BOOLEAN }, + { &DEVPKEY_Device_Model, DEVPROP_TYPE_STRING }, + { &DEVPKEY_Device_ModelId, DEVPROP_TYPE_GUID }, + { &DEVPKEY_Device_FriendlyNameAttributes, DEVPROP_TYPE_UINT32 }, + { &DEVPKEY_Device_ManufacturerAttributes, DEVPROP_TYPE_UINT32 }, + { &DEVPKEY_Device_PresenceNotForDevice, DEVPROP_TYPE_BOOLEAN }, + { &DEVPKEY_Device_SignalStrength, DEVPROP_TYPE_INT32 }, + { &DEVPKEY_Device_IsAssociateableByUserAction, DEVPROP_TYPE_BOOLEAN }, + { &DEVPKEY_Device_ShowInUninstallUI, DEVPROP_TYPE_BOOLEAN }, + { &DEVPKEY_Device_Numa_Proximity_Domain, DEVPROP_TYPE_UINT32 }, + { &DEVPKEY_Device_DHP_Rebalance_Policy, DEVPROP_TYPE_UINT32 }, + { &DEVPKEY_Device_Numa_Node, DEVPROP_TYPE_UINT32 }, + { &DEVPKEY_Device_BusReportedDeviceDesc, DEVPROP_TYPE_STRING }, + { &DEVPKEY_Device_IsPresent, DEVPROP_TYPE_BOOLEAN }, + { &DEVPKEY_Device_HasProblem, DEVPROP_TYPE_BOOLEAN }, + { &DEVPKEY_Device_ConfigurationId, DEVPROP_TYPE_STRING }, + { &DEVPKEY_Device_ReportedDeviceIdsHash, DEVPROP_TYPE_UINT32 }, + { &DEVPKEY_Device_PhysicalDeviceLocation, DEVPROP_TYPE_BINARY }, + { &DEVPKEY_Device_BiosDeviceName, DEVPROP_TYPE_STRING }, + { &DEVPKEY_Device_DriverProblemDesc, DEVPROP_TYPE_STRING }, + { &DEVPKEY_Device_DebuggerSafe, DEVPROP_TYPE_UINT32 }, + { &DEVPKEY_Device_PostInstallInProgress, DEVPROP_TYPE_BOOLEAN }, + { &DEVPKEY_Device_Stack, DEVPROP_TYPE_STRING_LIST }, + { &DEVPKEY_Device_ExtendedConfigurationIds, DEVPROP_TYPE_STRING_LIST }, + { &DEVPKEY_Device_IsRebootRequired, DEVPROP_TYPE_BOOLEAN }, + { &DEVPKEY_Device_FirmwareDate, DEVPROP_TYPE_FILETIME }, + { &DEVPKEY_Device_FirmwareVersion, DEVPROP_TYPE_STRING }, + { &DEVPKEY_Device_FirmwareRevision, DEVPROP_TYPE_STRING }, + { &DEVPKEY_Device_DependencyProviders, DEVPROP_TYPE_STRING_LIST }, + { &DEVPKEY_Device_DependencyDependents, DEVPROP_TYPE_STRING_LIST }, + { &DEVPKEY_Device_SoftRestartSupported, DEVPROP_TYPE_BOOLEAN }, + { &DEVPKEY_Device_ExtendedAddress, DEVPROP_TYPE_UINT64 }, + { &DEVPKEY_Device_SessionId, DEVPROP_TYPE_UINT32 }, + { &DEVPKEY_Device_InstallDate, DEVPROP_TYPE_FILETIME }, + { &DEVPKEY_Device_FirstInstallDate, DEVPROP_TYPE_FILETIME }, + { &DEVPKEY_Device_LastArrivalDate, DEVPROP_TYPE_FILETIME }, + { &DEVPKEY_Device_LastRemovalDate, DEVPROP_TYPE_FILETIME }, + { &DEVPKEY_Device_DriverDate, DEVPROP_TYPE_FILETIME, L"DriverDateData" }, + { &DEVPKEY_Device_DriverVersion, DEVPROP_TYPE_STRING, L"DriverVersion" }, + { &DEVPKEY_Device_DriverDesc, DEVPROP_TYPE_STRING, L"DriverDesc" }, + { &DEVPKEY_Device_DriverInfPath, DEVPROP_TYPE_STRING, L"InfPath" }, + { &DEVPKEY_Device_DriverInfSection, DEVPROP_TYPE_STRING, L"InfSection" }, + { &DEVPKEY_Device_DriverInfSectionExt, DEVPROP_TYPE_STRING, L"InfSectionExt" }, + { &DEVPKEY_Device_MatchingDeviceId, DEVPROP_TYPE_STRING, L"MatchingDeviceId" }, + { &DEVPKEY_Device_DriverProvider, DEVPROP_TYPE_STRING, L"ProviderName" }, + { &DEVPKEY_Device_DriverPropPageProvider, DEVPROP_TYPE_STRING, L"EnumPropPages32" }, + { &DEVPKEY_Device_DriverCoInstallers, DEVPROP_TYPE_STRING_LIST, L"CoInstallers32" }, + { &DEVPKEY_Device_ResourcePickerTags, DEVPROP_TYPE_STRING, L"ResourcePickerTags" }, + { &DEVPKEY_Device_ResourcePickerExceptions, DEVPROP_TYPE_STRING, L"ResourcePickerExceptions" }, + { &DEVPKEY_Device_DriverRank, DEVPROP_TYPE_UINT32 }, + { &DEVPKEY_Device_DriverLogoLevel, DEVPROP_TYPE_UINT32 }, + { &DEVPKEY_Device_NoConnectSound, DEVPROP_TYPE_BOOLEAN }, + { &DEVPKEY_Device_GenericDriverInstalled, DEVPROP_TYPE_BOOLEAN }, + { &DEVPKEY_Device_AdditionalSoftwareRequested, DEVPROP_TYPE_BOOLEAN }, + { &DEVPKEY_Device_SafeRemovalRequired, DEVPROP_TYPE_BOOLEAN }, + { &DEVPKEY_Device_SafeRemovalRequiredOverride, DEVPROP_TYPE_BOOLEAN }, }; -static LSTATUS query_device_property( HKEY hkey, struct property *prop ) +static LSTATUS query_device_property( HKEY hkey, const struct device *dev, struct property *prop ) { + if (!memcmp( &DEVPKEY_Device_InstanceId, &prop->key, sizeof(prop->key) )) + return return_property_string( prop, dev->instance ); + for (UINT i = 0; i < ARRAY_SIZE(device_properties); i++) { const struct property_desc *desc = device_properties + i; @@ -640,7 +732,7 @@ static LSTATUS get_device_property( HKEY root, const struct device *dev, struct if (!(err = open_device_key( root, dev, KEY_QUERY_VALUE, TRUE, &hkey ))) { - err = query_device_property( hkey, prop ); + err = query_device_property( hkey, dev, prop ); RegCloseKey( hkey ); } @@ -1524,3 +1616,50 @@ CONFIGRET WINAPI CM_Get_DevNode_Registry_PropertyA( DEVINST node, ULONG property { return CM_Get_DevNode_Registry_Property_ExA( node, property, type, buffer, len, flags, NULL ); } + +/*********************************************************************** + * CM_Get_DevNode_Property_ExW (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Get_DevNode_Property_ExW( DEVINST node, const DEVPROPKEY *key, DEVPROPTYPE *type, BYTE *buffer, ULONG *size, ULONG flags, HMACHINE machine ) +{ + struct property prop; + struct device dev; + LSTATUS err; + + TRACE( "node %#lx, key %s, type %p, buffer %p, size %p, flags %#lx, machine %p\n", node, debugstr_DEVPROPKEY(key), type, buffer, size, flags, machine ); + if (machine) FIXME( "machine %p not implemented!\n", machine ); + if (flags) FIXME( "flags %#lx not implemented!\n", flags ); + + if (devnode_get_device( node, &dev )) return CR_INVALID_DEVNODE; + if ((err = init_property( &prop, key, type, buffer, size ))) return map_error( err ); + + return map_error( get_device_property( HKEY_LOCAL_MACHINE, &dev, &prop ) ); +} + +/*********************************************************************** + * CM_Get_DevNode_PropertyW (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Get_DevNode_PropertyW( DEVINST node, const DEVPROPKEY *key, DEVPROPTYPE *type, BYTE *buffer, ULONG *size, ULONG flags ) +{ + return CM_Get_DevNode_Property_ExW( node, key, type, buffer, size, flags, NULL ); +} + +/*********************************************************************** + * CM_Get_DevNode_Property_Keys_Ex (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Get_DevNode_Property_Keys_Ex( DEVINST node, DEVPROPKEY *keys, ULONG *count, ULONG flags, HMACHINE machine ) +{ + TRACE( "node %#lx, keys %p, count %p, flags %#lx, machine %p\n", node, keys, count, flags, machine ); + if (machine) FIXME( "machine %p not implemented!\n", machine ); + if (flags) FIXME( "flags %#lx not implemented!\n", flags ); + + return CR_CALL_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * CM_Get_DevNode_Property_Keys (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Get_DevNode_Property_Keys( DEVINST node, DEVPROPKEY *keys, ULONG *count, ULONG flags ) +{ + return CM_Get_DevNode_Property_Keys_Ex( node, keys, count, flags, NULL ); +} diff --git a/dlls/cfgmgr32/cfgmgr32.spec b/dlls/cfgmgr32/cfgmgr32.spec index 9f5ed24ebf0..a728a908a2e 100644 --- a/dlls/cfgmgr32/cfgmgr32.spec +++ b/dlls/cfgmgr32/cfgmgr32.spec @@ -84,8 +84,8 @@ @ 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 +@ stdcall CM_Get_DevNode_PropertyW(long ptr ptr ptr ptr long) +@ stdcall CM_Get_DevNode_Property_ExW(long ptr ptr ptr ptr long ptr) @ 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) diff --git a/dlls/cfgmgr32/cfgmgr32_private.h b/dlls/cfgmgr32/cfgmgr32_private.h index 81ebd413c12..f614e594c58 100644 --- a/dlls/cfgmgr32/cfgmgr32_private.h +++ b/dlls/cfgmgr32/cfgmgr32_private.h @@ -50,9 +50,12 @@ static inline const char *debugstr_DEVPROPCOMPKEY( const DEVPROPCOMPKEY *key ) debugstr_w( key->LocaleName ) ); } +#define PROP_FLAG_ANSI 1 +#define PROP_FLAG_BINARY 2 + struct property { - BOOL ansi; + UINT flags; DEVPROPKEY key; DEVPROPTYPE *type; DWORD *reg_type; diff --git a/dlls/cfgmgr32/tests/cfgmgr32.c b/dlls/cfgmgr32/tests/cfgmgr32.c index 8fe2b9e7241..540b38f12ca 100644 --- a/dlls/cfgmgr32/tests/cfgmgr32.c +++ b/dlls/cfgmgr32/tests/cfgmgr32.c @@ -3317,6 +3317,302 @@ static void test_CM_Get_DevNode_Registry_Property(void) todo_wine ok_u4( len, ==, 78 ); } +static void test_CM_Get_DevNode_Property(void) +{ + WCHAR iface[4096], instance_id[MAX_PATH], buffer[MAX_PATH]; + DWORD size, type, len; + CONFIGRET ret; + DEVINST node; + GUID guid; + + + guid = GUID_DEVINTERFACE_HID; + ret = CM_Get_Device_Interface_ListW( &guid, NULL, iface, ARRAY_SIZE(iface), CM_GET_DEVICE_INTERFACE_LIST_PRESENT ); + if (broken( !*iface )) + { + skip( "No HID device present, skipping tests\n" ); + return; + } + ok_x4( ret, ==, CR_SUCCESS ); + size = sizeof(instance_id); + ret = CM_Get_Device_Interface_PropertyW( iface, &DEVPKEY_Device_InstanceId, &type, (BYTE *)instance_id, &size, 0 ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_x4( type, ==, DEVPROP_TYPE_STRING ); + + node = 0xdeadbeef; + ret = CM_Locate_DevNodeW( &node, instance_id, 0 ); + ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_x4( node, ==, 2 ); + + + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( 0, &DEVPKEY_Device_ClassGuid, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_INVALID_DEVNODE ); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_ClassGuid, NULL, (BYTE *)NULL, NULL, 0 ); + ok_x4( ret, ==, CR_INVALID_POINTER ); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_ClassGuid, &type, (BYTE *)buffer, NULL, 0 ); + ok_x4( ret, ==, CR_INVALID_POINTER ); + len = 1; + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_ClassGuid, &type, (BYTE *)NULL, &len, 0 ); + ok_x4( ret, ==, CR_INVALID_POINTER ); + + len = 0; + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_ClassGuid, &type, (BYTE *)NULL, &len, 0 ); + ok_x4( ret, ==, CR_BUFFER_SMALL ); + ok_x4( len, ==, 16 ); + len = 1; + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_ClassGuid, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_BUFFER_SMALL ); + ok_x4( len, ==, 16 ); + + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( 10, &DEVPKEY_Device_ClassGuid, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_INVALID_DEVNODE ); + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, 0, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_FAILURE ); + + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_DeviceDesc, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( type, ==, DEVPROP_TYPE_STRING ); + ok_u4( len, >, 1 ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_HardwareIds, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( type, ==, DEVPROP_TYPE_STRING_LIST ); + ok_u4( len, >, 1 ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_CompatibleIds, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( type, ==, DEVPROP_TYPE_STRING_LIST ); + ok_u4( len, >, 1 ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_Service, &type, (BYTE *)buffer, &len, 0 ); + ok( ret == CR_NO_SUCH_VALUE || ret == CR_SUCCESS, "got ret == %#lx\n", ret ); + ok( type == 0xdeadbeef || type == DEVPROP_TYPE_STRING, "got type == %#lx\n", type ); + ok( len == 0 || len == 14, "got len == %#lx\n", len ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_Class, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( type, ==, DEVPROP_TYPE_STRING ); + ok_u4( len, >, 1 ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_ClassGuid, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( type, ==, DEVPROP_TYPE_GUID ); + ok_u4( len, ==, 0x10 ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_Driver, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( type, ==, DEVPROP_TYPE_STRING ); + ok_u4( len, >, 1 ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_ConfigFlags, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( type, ==, DEVPROP_TYPE_UINT32 ); + ok_u4( len, ==, 4 ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_Manufacturer, &type, (BYTE *)buffer, &len, 0 ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_u4( type, ==, DEVPROP_TYPE_STRING ); + todo_wine ok_u4( len, >, 1 ); + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_FriendlyName, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_LocationInfo, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ok_u4( type, ==, 0xdeadbeef ); + ok_u4( len, ==, 0 ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_PDOName, &type, (BYTE *)buffer, &len, 0 ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_u4( type, ==, DEVPROP_TYPE_STRING ); + todo_wine ok_u4( len, >, 1 ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_Capabilities, &type, (BYTE *)buffer, &len, 0 ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_u4( type, ==, DEVPROP_TYPE_UINT32 ); + todo_wine ok_u4( len, ==, 4 ); + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_UINumber, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_UpperFilters, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_LowerFilters, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_BusTypeGuid, &type, (BYTE *)buffer, &len, 0 ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_u4( type, ==, DEVPROP_TYPE_GUID ); + todo_wine ok_u4( len, ==, 16 ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_LegacyBusType, &type, (BYTE *)buffer, &len, 0 ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_u4( type, ==, DEVPROP_TYPE_UINT32 ); + todo_wine ok_u4( len, ==, 4 ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_BusNumber, &type, (BYTE *)buffer, &len, 0 ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_u4( type, ==, DEVPROP_TYPE_UINT32 ); + todo_wine ok_u4( len, ==, 4 ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_EnumeratorName, &type, (BYTE *)buffer, &len, 0 ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_u4( type, ==, DEVPROP_TYPE_STRING ); + todo_wine ok_u4( len, >, 1 ); + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_Security, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_SecuritySDS, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_DevType, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_Exclusive, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_Characteristics, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_Address, &type, (BYTE *)buffer, &len, 0 ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_u4( type, ==, DEVPROP_TYPE_UINT32 ); + todo_wine ok_u4( len, ==, 4 ); + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_UINumberDescFormat, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_PowerData, &type, (BYTE *)buffer, &len, 0 ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_u4( type, ==, DEVPROP_TYPE_BINARY ); + todo_wine ok_u4( len, >, 1 ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_RemovalPolicy, &type, (BYTE *)buffer, &len, 0 ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_u4( type, ==, DEVPROP_TYPE_UINT32 ); + todo_wine ok_u4( len, ==, 4 ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_RemovalPolicyDefault, &type, (BYTE *)buffer, &len, 0 ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_u4( type, ==, DEVPROP_TYPE_UINT32 ); + todo_wine ok_u4( len, ==, 4 ); + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_RemovalPolicyOverride, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_InstallState, &type, (BYTE *)buffer, &len, 0 ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_u4( type, ==, DEVPROP_TYPE_UINT32 ); + todo_wine ok_u4( len, ==, 4 ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_LocationPaths, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ok_u4( type, ==, 0xdeadbeef ); + ok_u4( len, ==, 0 ); + + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_BaseContainerId, &type, (BYTE *)buffer, &len, 0 ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_u4( type, ==, DEVPROP_TYPE_GUID ); + todo_wine ok_u4( len, ==, 0x10 ); + + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_InstanceId, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( type, ==, DEVPROP_TYPE_STRING ); + ok_u4( len, >, 1 ); + + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_EjectionRelations, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_RemovalRelations, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_PowerRelations, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_BusRelations, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_Parent, &type, (BYTE *)buffer, &len, 0 ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_Children, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_Siblings, &type, (BYTE *)buffer, &len, 0 ); + ok( ret == CR_SUCCESS || ret == CR_NO_SUCH_VALUE, "got %#lx\n", ret ); + if (ret == CR_SUCCESS) + { + ok_u4( type, ==, DEVPROP_TYPE_STRING_LIST ); + ok_u4( len, >, 1 ); + } + + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_ContainerId, &type, (BYTE *)buffer, &len, 0 ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( type, ==, DEVPROP_TYPE_GUID ); + ok_u4( len, ==, 0x10 ); + + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_DriverDate, &type, (BYTE *)buffer, &len, 0 ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_u4( type, ==, DEVPROP_TYPE_FILETIME ); + todo_wine ok_u4( len, ==, 8 ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_DriverVersion, &type, (BYTE *)buffer, &len, 0 ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_u4( type, ==, DEVPROP_TYPE_STRING ); + todo_wine ok_u4( len, >, 1 ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_DriverDesc, &type, (BYTE *)buffer, &len, 0 ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_u4( type, ==, DEVPROP_TYPE_STRING ); + todo_wine ok_u4( len, >, 1 ); + type = 0xdeadbeef; + len = sizeof(buffer); + ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_DriverInfPath, &type, (BYTE *)buffer, &len, 0 ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_u4( type, ==, DEVPROP_TYPE_STRING ); + todo_wine ok_u4( len, >, 1 ); +} + static void test_CM_Get_Class_Property_Keys(void) { GUID guid = GUID_DEVCLASS_HIDCLASS; @@ -3393,6 +3689,7 @@ START_TEST(cfgmgr32) test_CM_Register_Notification(); test_CM_Open_DevNode_Key(); test_CM_Get_DevNode_Registry_Property(); + test_CM_Get_DevNode_Property(); test_DevGetObjects(); test_DevCreateObjectQuery(); test_DevGetObjectProperties_invalid(); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10584
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/setupapi/devinst.c | 76 ------------------------------------- dlls/setupapi/setupapi.spec | 12 +++--- 2 files changed, 6 insertions(+), 82 deletions(-) diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c index 11cdff54f14..d7b7cdbcf7c 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -853,29 +853,6 @@ static struct device *create_device(struct DeviceInfoSet *set, return device; } -static struct device *get_devnode_device(DEVINST devnode, HDEVINFO *set, SP_DEVINFO_DATA *data) -{ - WCHAR instance_id[MAX_PATH]; - - data->cbSize = sizeof(*data); - *set = NULL; - if (CM_Get_Device_IDW(devnode, instance_id, ARRAY_SIZE(instance_id), 0)) - { - WARN("device node %lu not found\n", devnode); - return NULL; - } - - *set = SetupDiCreateDeviceInfoListExW(NULL, NULL, NULL, NULL); - if (*set == INVALID_HANDLE_VALUE) return NULL; - if (!SetupDiOpenDeviceInfoW(*set, instance_id, NULL, 0, data)) - { - SetupDiDestroyDeviceInfoList(*set); - *set = NULL; - return NULL; - } - return get_device(*set, data); -} - /*********************************************************************** * SetupDiBuildClassInfoList (SETUPAPI.@) */ @@ -4685,59 +4662,6 @@ BOOL WINAPI SetupDiGetDevicePropertyW(HDEVINFO devinfo, PSP_DEVINFO_DATA device_ return !ls; } -/*********************************************************************** - * CM_Get_DevNode_Property_ExW (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_DevNode_Property_ExW(DEVINST devnode, const DEVPROPKEY *prop_key, DEVPROPTYPE *prop_type, - BYTE *prop_buff, ULONG *prop_buff_size, ULONG flags, HMACHINE machine) -{ - HDEVINFO set; - SP_DEVINFO_DATA data = { sizeof(data) }; - struct device *device; - LSTATUS ls; - - TRACE("%lu, %p, %p, %p, %p, %#lx, %p\n", devnode, prop_key, prop_type, prop_buff, prop_buff_size, - flags, machine); - - if (machine) - return CR_MACHINE_UNAVAILABLE; - - if (!prop_buff_size) - return CR_INVALID_POINTER; - - if (!(device = get_devnode_device(devnode, &set, &data))) - return CR_NO_SUCH_DEVINST; - - ls = get_device_property(device, set, &data, prop_key, prop_type, prop_buff, *prop_buff_size, - prop_buff_size, flags); - SetupDiDestroyDeviceInfoList(set); - switch (ls) - { - case NO_ERROR: - return CR_SUCCESS; - case ERROR_INVALID_DATA: - return CR_INVALID_DATA; - case ERROR_INVALID_USER_BUFFER: - return CR_INVALID_POINTER; - case ERROR_INVALID_FLAGS: - return CR_INVALID_FLAG; - case ERROR_INSUFFICIENT_BUFFER: - return CR_BUFFER_SMALL; - case ERROR_NOT_FOUND: - return CR_NO_SUCH_VALUE; - } - return CR_FAILURE; -} - -/*********************************************************************** - * CM_Get_DevNode_PropertyW (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_DevNode_PropertyW(DEVINST dev, const DEVPROPKEY *key, DEVPROPTYPE *type, - BYTE *buf, PULONG len, ULONG flags) -{ - return CM_Get_DevNode_Property_ExW(dev, key, type, buf, len, flags, NULL); -} - /*********************************************************************** * SetupDiInstallDeviceInterfaces (SETUPAPI.@) */ diff --git a/dlls/setupapi/setupapi.spec b/dlls/setupapi/setupapi.spec index 6deb5cd949b..4c47b2ffe70 100644 --- a/dlls/setupapi/setupapi.spec +++ b/dlls/setupapi/setupapi.spec @@ -67,12 +67,12 @@ @ stdcall CM_Get_Class_Registry_PropertyW(ptr long ptr ptr long long ptr) cfgmgr32.CM_Get_Class_Registry_PropertyW @ stub CM_Get_Depth @ stub CM_Get_Depth_Ex -@ stdcall CM_Get_DevNode_PropertyW(long ptr ptr ptr ptr long) -@ stdcall CM_Get_DevNode_Property_ExW(long ptr ptr ptr ptr long ptr) -@ stdcall CM_Get_DevNode_Registry_PropertyA(long long ptr ptr ptr long) -@ stdcall CM_Get_DevNode_Registry_PropertyW(long long ptr ptr ptr long) -@ stdcall CM_Get_DevNode_Registry_Property_ExA(long long ptr ptr ptr long ptr) -@ stdcall CM_Get_DevNode_Registry_Property_ExW(long long ptr ptr ptr long ptr) +@ stdcall CM_Get_DevNode_PropertyW(long ptr ptr ptr ptr long) cfgmgr32.CM_Get_DevNode_PropertyW +@ stdcall CM_Get_DevNode_Property_ExW(long ptr ptr ptr ptr long ptr) cfgmgr32.CM_Get_DevNode_Property_ExW +@ stdcall CM_Get_DevNode_Registry_PropertyA(long long ptr ptr ptr long) cfgmgr32.CM_Get_DevNode_Registry_PropertyA +@ stdcall CM_Get_DevNode_Registry_PropertyW(long long ptr ptr ptr long) cfgmgr32.CM_Get_DevNode_Registry_PropertyW +@ stdcall CM_Get_DevNode_Registry_Property_ExA(long long ptr ptr ptr long ptr) cfgmgr32.CM_Get_DevNode_Registry_Property_ExA +@ stdcall CM_Get_DevNode_Registry_Property_ExW(long long ptr ptr ptr long ptr) cfgmgr32.CM_Get_DevNode_Registry_Property_ExW @ stdcall CM_Get_DevNode_Status(ptr ptr long long) @ stdcall CM_Get_DevNode_Status_Ex(ptr ptr long long ptr) @ stdcall CM_Get_Device_IDA(ptr ptr long long) cfgmgr32.CM_Get_Device_IDA -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10584
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/cfgmgr32/cfgmgr32.c | 58 ++++++++++++++++++++++++++++- dlls/cfgmgr32/cfgmgr32.spec | 4 +- dlls/cfgmgr32/tests/cfgmgr32.c | 67 ++++++++++++++++++++++++++++++++++ 3 files changed, 126 insertions(+), 3 deletions(-) diff --git a/dlls/cfgmgr32/cfgmgr32.c b/dlls/cfgmgr32/cfgmgr32.c index 42cd5a42d28..24a9ccb5643 100644 --- a/dlls/cfgmgr32/cfgmgr32.c +++ b/dlls/cfgmgr32/cfgmgr32.c @@ -740,6 +740,52 @@ static LSTATUS get_device_property( HKEY root, const struct device *dev, struct return err; } +LSTATUS enum_device_property_keys( HKEY hkey, const struct device *dev, DEVPROPKEY *buffer, ULONG *size ) +{ + ULONG capacity = *size, count = 0; + LSTATUS err = ERROR_SUCCESS; + HKEY props_key; + + if (capacity < ++count || !buffer) err = ERROR_MORE_DATA; + else buffer[count - 1] = DEVPKEY_Device_InstanceId; + + for (UINT i = 0; i < ARRAY_SIZE(device_properties); i++) + { + const struct property_desc *desc = device_properties + i; + if (desc->name && !RegQueryValueExW( hkey, desc->name, NULL, NULL, NULL, NULL )) + { + if (capacity < ++count || !buffer) err = ERROR_MORE_DATA; + else buffer[count - 1] = *desc->key; + } + } + + if (!open_key( hkey, L"Properties", KEY_ENUMERATE_SUB_KEYS, TRUE, &props_key )) + { + WCHAR name[MAX_PATH]; + for (ULONG i = 0, len = ARRAY_SIZE(name); !RegEnumValueW( props_key, i, name, &len, 0, NULL, NULL, NULL ); i++, len = ARRAY_SIZE(name)) + { + if (capacity < ++count || !buffer) err = ERROR_MORE_DATA; + else err = propkey_from_string( name, buffer + count - 1 ); + } + RegCloseKey( props_key ); + } + + *size = count; + return err; +} + +static LSTATUS get_device_property_keys( HKEY root, const struct device *dev, DEVPROPKEY *buffer, ULONG *size ) +{ + LSTATUS err; + HKEY hkey; + + if ((err = open_device_key( root, dev, KEY_QUERY_VALUE, TRUE, &hkey ))) return err; + err = enum_device_property_keys( hkey, dev, buffer, size ); + RegCloseKey( hkey ); + + return err; +} + static CRITICAL_SECTION devnode_cs; static CRITICAL_SECTION_DEBUG devnode_cs_debug = { 0, 0, &devnode_cs, @@ -1649,11 +1695,21 @@ CONFIGRET WINAPI CM_Get_DevNode_PropertyW( DEVINST node, const DEVPROPKEY *key, */ CONFIGRET WINAPI CM_Get_DevNode_Property_Keys_Ex( DEVINST node, DEVPROPKEY *keys, ULONG *count, ULONG flags, HMACHINE machine ) { + struct device dev; + LSTATUS err; + TRACE( "node %#lx, keys %p, count %p, flags %#lx, machine %p\n", node, keys, count, flags, machine ); if (machine) FIXME( "machine %p not implemented!\n", machine ); if (flags) FIXME( "flags %#lx not implemented!\n", flags ); - return CR_CALL_NOT_IMPLEMENTED; + if (!count) return CR_INVALID_POINTER; + if (*count && !keys) return CR_INVALID_POINTER; + if (devnode_get_device( node, &dev )) return CR_INVALID_DEVNODE; + + err = get_device_property_keys( HKEY_LOCAL_MACHINE, &dev, keys, count ); + if (err && err != ERROR_MORE_DATA) *count = 0; + if (err == ERROR_FILE_NOT_FOUND) return CR_NO_SUCH_DEVICE_INTERFACE; + return map_error( err ); } /*********************************************************************** diff --git a/dlls/cfgmgr32/cfgmgr32.spec b/dlls/cfgmgr32/cfgmgr32.spec index a728a908a2e..ae538de0a15 100644 --- a/dlls/cfgmgr32/cfgmgr32.spec +++ b/dlls/cfgmgr32/cfgmgr32.spec @@ -86,8 +86,8 @@ @ stub CM_Get_DevNode_Custom_Property_ExW @ stdcall CM_Get_DevNode_PropertyW(long ptr ptr ptr ptr long) @ stdcall CM_Get_DevNode_Property_ExW(long ptr ptr ptr ptr long ptr) -@ stub CM_Get_DevNode_Property_Keys -@ stub CM_Get_DevNode_Property_Keys_Ex +@ stdcall CM_Get_DevNode_Property_Keys(long ptr ptr long) +@ stdcall CM_Get_DevNode_Property_Keys_Ex(long ptr ptr long ptr) @ stdcall CM_Get_DevNode_Registry_PropertyA(long long ptr ptr ptr long) @ stdcall CM_Get_DevNode_Registry_PropertyW(long long ptr ptr ptr long) @ stdcall CM_Get_DevNode_Registry_Property_ExA(long long ptr ptr ptr long ptr) diff --git a/dlls/cfgmgr32/tests/cfgmgr32.c b/dlls/cfgmgr32/tests/cfgmgr32.c index 540b38f12ca..8939cf008b3 100644 --- a/dlls/cfgmgr32/tests/cfgmgr32.c +++ b/dlls/cfgmgr32/tests/cfgmgr32.c @@ -3564,9 +3564,12 @@ static void test_CM_Get_DevNode_Property(void) len = sizeof(buffer); ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_BusRelations, &type, (BYTE *)buffer, &len, 0 ); ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + type = 0xdeadbeef; len = sizeof(buffer); ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_Parent, &type, (BYTE *)buffer, &len, 0 ); todo_wine ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_u4( type, ==, DEVPROP_TYPE_STRING ); + todo_wine ok_u4( len, >, 1 ); len = sizeof(buffer); ret = CM_Get_DevNode_PropertyW( node, &DEVPKEY_Device_Children, &type, (BYTE *)buffer, &len, 0 ); ok_x4( ret, ==, CR_NO_SUCH_VALUE ); @@ -3613,6 +3616,69 @@ static void test_CM_Get_DevNode_Property(void) todo_wine ok_u4( len, >, 1 ); } +static void test_CM_Get_DevNode_Property_Keys(void) +{ + WCHAR iface[4096], instance_id[MAX_PATH]; + DEVPROPKEY buffer[128]; + DWORD i, size, type; + CONFIGRET ret; + DEVINST node; + GUID guid; + + + guid = GUID_DEVINTERFACE_HID; + ret = CM_Get_Device_Interface_ListW( &guid, NULL, iface, ARRAY_SIZE(iface), CM_GET_DEVICE_INTERFACE_LIST_PRESENT ); + if (broken( !*iface )) + { + skip( "No HID device present, skipping tests\n" ); + return; + } + ok_x4( ret, ==, CR_SUCCESS ); + size = sizeof(instance_id); + ret = CM_Get_Device_Interface_PropertyW( iface, &DEVPKEY_Device_InstanceId, &type, (BYTE *)instance_id, &size, 0 ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_x4( type, ==, DEVPROP_TYPE_STRING ); + + node = 0xdeadbeef; + ret = CM_Locate_DevNodeW( &node, instance_id, 0 ); + ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_x4( node, ==, 2 ); + + size = ARRAY_SIZE(buffer); + ret = CM_Get_DevNode_Property_Keys( 0, buffer, &size, 0 ); + ok_x4( ret, ==, CR_INVALID_DEVNODE ); + ok_u4( size, ==, ARRAY_SIZE(buffer) ); + size = ARRAY_SIZE(buffer); + ret = CM_Get_DevNode_Property_Keys( 0xdeadbeef, buffer, &size, 0 ); + ok_x4( ret, ==, CR_INVALID_DEVNODE ); + ok_u4( size, ==, ARRAY_SIZE(buffer) ); + size = ARRAY_SIZE(buffer); + ret = CM_Get_DevNode_Property_Keys( node, NULL, NULL, 0 ); + ok_x4( ret, ==, CR_INVALID_POINTER ); + size = ARRAY_SIZE(buffer); + ret = CM_Get_DevNode_Property_Keys( node, buffer, NULL, 0 ); + ok_x4( ret, ==, CR_INVALID_POINTER ); + size = ARRAY_SIZE(buffer); + ret = CM_Get_DevNode_Property_Keys( node, NULL, &size, 0 ); + ok_x4( ret, ==, CR_INVALID_POINTER ); + ok_u4( size, ==, ARRAY_SIZE(buffer) ); + size = 0; + ret = CM_Get_DevNode_Property_Keys( node, NULL, &size, 0 ); + ok_x4( ret, ==, CR_BUFFER_SMALL ); + ok_u4( size, >, 3 ); + size = ARRAY_SIZE(buffer); + memset( buffer, 0xcd, sizeof(buffer) ); + ret = CM_Get_DevNode_Property_Keys( node, buffer, &size, 0 ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( size, >, 3 ); + todo_wine ok( !memcmp( buffer + 0, &DEVPKEY_Device_DeviceDesc, sizeof(*buffer) ), "got {%s,%#lx}\n", debugstr_guid( &buffer[0].fmtid ), buffer[0].pid ); + todo_wine ok( !memcmp( buffer + 1, &DEVPKEY_Device_HardwareIds, sizeof(*buffer) ), "got {%s,%#lx}\n", debugstr_guid( &buffer[1].fmtid ), buffer[1].pid ); + todo_wine ok( !memcmp( buffer + 2, &DEVPKEY_Device_CompatibleIds, sizeof(*buffer) ), "got {%s,%#lx}\n", debugstr_guid( &buffer[2].fmtid ), buffer[2].pid ); + + for (i = 0; i < size; i++) if (!memcmp( buffer + i, &DEVPKEY_Device_Parent, sizeof(*buffer) )) break; + todo_wine ok( i < size, "DEVPKEY_Device_Parent not found\n" ); +} + static void test_CM_Get_Class_Property_Keys(void) { GUID guid = GUID_DEVCLASS_HIDCLASS; @@ -3690,6 +3756,7 @@ START_TEST(cfgmgr32) test_CM_Open_DevNode_Key(); test_CM_Get_DevNode_Registry_Property(); test_CM_Get_DevNode_Property(); + test_CM_Get_DevNode_Property_Keys(); test_DevGetObjects(); test_DevCreateObjectQuery(); test_DevGetObjectProperties_invalid(); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10584
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/cfgmgr32/cfgmgr32.c | 255 +++++++++++++++++++++- dlls/cfgmgr32/cfgmgr32.spec | 16 +- dlls/cfgmgr32/cfgmgr32_private.h | 2 +- dlls/cfgmgr32/devobject.c | 2 +- dlls/cfgmgr32/tests/cfgmgr32.c | 352 ++++++++++++++++++++++++++++++- 5 files changed, 611 insertions(+), 16 deletions(-) diff --git a/dlls/cfgmgr32/cfgmgr32.c b/dlls/cfgmgr32/cfgmgr32.c index 24a9ccb5643..8bd8a3bbe3b 100644 --- a/dlls/cfgmgr32/cfgmgr32.c +++ b/dlls/cfgmgr32/cfgmgr32.c @@ -132,12 +132,12 @@ static LSTATUS open_device_classes_key( HKEY root, const WCHAR *key, REGSAM acce return open_key( root, path, access, open, hkey ); } -LSTATUS init_property( struct property *prop, const DEVPROPKEY *key, DEVPROPTYPE *type, void *buffer, DWORD *size ) +LSTATUS init_property( struct property *prop, const DEVPROPKEY *key, DEVPROPTYPE *type, void *buffer, DWORD *size, BOOL binary ) { if (!key) return ERROR_INVALID_PARAMETER; if (!(prop->type = type) || !(prop->size = size)) return ERROR_INVALID_USER_BUFFER; if (!(prop->buffer = buffer) && (*prop->size)) return ERROR_INVALID_USER_BUFFER; - prop->flags = PROP_FLAG_BINARY; + prop->flags = binary ? PROP_FLAG_BINARY : 0; prop->key = *key; prop->reg_type = NULL; return ERROR_SUCCESS; @@ -786,6 +786,109 @@ static LSTATUS get_device_property_keys( HKEY root, const struct device *dev, DE return err; } +static LSTATUS get_device_strings( const WCHAR *instance_id, const DEVPROPKEY *key, ULONG *size, WCHAR *buffer ) +{ + const WCHAR *instance = instance_id && *instance_id ? instance_id : L"HTREE\\ROOT\\0"; + struct property prop; + struct device dev; + DEVPROPTYPE type; + LSTATUS err; + + if ((err = init_device( &dev, instance ))) return err; + if ((err = init_property( &prop, key, &type, buffer, size, TRUE ))) return err; + + if (!(err = get_device_property( HKEY_LOCAL_MACHINE, &dev, &prop ))) *size *= 3; /* maximum ANSI conversion size */ + return err; +} + +static LSTATUS matches_device_property( HKEY hkey, struct device *dev, const DEVPROPKEY *key, const WCHAR *value ) +{ + WCHAR buffer[MAX_PATH]; + ULONG size = sizeof(buffer); + struct property prop; + DEVPROPTYPE type; + LSTATUS err; + + if (!key) return ERROR_SUCCESS; + if ((err = init_property( &prop, key, &type, (BYTE *)buffer, &size, FALSE ))) return err; + if ((err = query_device_property( hkey, dev, &prop ))) return err == ERROR_FILE_NOT_FOUND ? ERROR_NO_MATCH : err; + return wcsicmp( buffer, value ) ? ERROR_NO_MATCH : ERROR_SUCCESS; +} + +static LSTATUS enum_device_instances( HKEY root, struct device *dev, const DEVPROPKEY *key, const WCHAR *value, + BOOL all, enum_objects_cb callback, void *context ) +{ + LSTATUS err = ERROR_SUCCESS; + HKEY hkey; + UINT len; + + for (UINT i = 0; !err && !(err = RegEnumKeyW( root, i, dev->instance, ARRAY_SIZE(dev->instance) )); i++) + { + if ((err = open_key( root, dev->instance, KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE, TRUE, &hkey ))) break; + if ((err = matches_device_property( hkey, dev, key, value )) == ERROR_NO_MATCH) err = ERROR_SUCCESS; + else if (!err) + { + WCHAR path[MAX_PATH]; + len = swprintf( path, ARRAY_SIZE(path), L"%s\\%s\\%s", dev->enumerator, dev->device, dev->instance ); + err = callback( hkey, dev, path, len + 1, context ); + } + RegCloseKey( hkey ); + } + if (err == ERROR_NO_MORE_ITEMS) err = ERROR_SUCCESS; + + return err; +} + +static LSTATUS enum_enumerator_devices( HKEY root, struct device *dev, const WCHAR *device, const DEVPROPKEY *key, + const WCHAR *prop, BOOL all, enum_objects_cb callback, void *context ) +{ + LSTATUS err = ERROR_SUCCESS; + HKEY hkey; + + for (UINT i = 0; !err && !(err = RegEnumKeyW( root, i, dev->device, ARRAY_SIZE(dev->device) )); i++) + { + if (device && wcsicmp( dev->device, device )) continue; + if ((err = open_key( root, dev->device, KEY_ENUMERATE_SUB_KEYS, TRUE, &hkey ))) break; + err = enum_device_instances( hkey, dev, key, prop, all, callback, context ); + RegCloseKey( hkey ); + } + if (err == ERROR_NO_MORE_ITEMS) err = ERROR_SUCCESS; + + return err; +} + +static LSTATUS enum_devices( const WCHAR *filter, const DEVPROPKEY *key, const WCHAR *value, BOOL all, enum_objects_cb callback, void *context ) +{ + WCHAR enumerator[MAX_PATH], *device = NULL; + LSTATUS err = ERROR_SUCCESS; + struct device dev; + HKEY root, hkey; + + if (key && !value) return ERROR_INVALID_USER_BUFFER; + if (filter) + { + if (!*filter) return ERROR_NO_MORE_ITEMS; + lstrcpynW( enumerator, filter, ARRAY_SIZE(enumerator) ); + if ((device = wcschr( enumerator, '\\' ))) *device++ = 0; + if (device && wcschr( device, '\\' )) return ERROR_NO_MORE_ITEMS; + } + + root = cache_root_key( HKEY_LOCAL_MACHINE, enum_rootW, NULL ); + if (root == (HKEY)-1) return ERROR_FILE_NOT_FOUND; + + for (UINT i = 0; !err && !(err = RegEnumKeyW( root, i, dev.enumerator, ARRAY_SIZE(dev.enumerator) )); i++) + { + if (filter && wcsicmp( dev.enumerator, enumerator )) continue; + if ((err = open_key( root, dev.enumerator, KEY_ENUMERATE_SUB_KEYS, TRUE, &hkey ))) break; + err = enum_enumerator_devices( hkey, &dev, device, key, value, all, callback, context ); + RegCloseKey( hkey ); + } + if (err == ERROR_NO_MORE_ITEMS) err = ERROR_SUCCESS; + + if (!err) callback( NULL, NULL, L"", 1, context ); + return err; +} + static CRITICAL_SECTION devnode_cs; static CRITICAL_SECTION_DEBUG devnode_cs_debug = { 0, 0, &devnode_cs, @@ -1147,7 +1250,7 @@ CONFIGRET WINAPI CM_Get_Class_Property_ExW( const GUID *class, const DEVPROPKEY if (flags) FIXME( "flags %#lx not implemented!\n", flags ); if (!class) return CR_INVALID_POINTER; - if ((err = init_property( &prop, key, type, buffer, size ))) return map_error( err ); + if ((err = init_property( &prop, key, type, buffer, size, TRUE ))) return map_error( err ); return map_error( get_class_property( class, &prop ) ); } @@ -1360,7 +1463,7 @@ CONFIGRET WINAPI CM_Get_Device_Interface_Property_ExW( const WCHAR *name, const if (!name) return CR_INVALID_POINTER; if (init_device_interface( &iface, name )) return CR_NO_SUCH_DEVICE_INTERFACE; - if ((err = init_property( &prop, key, type, buffer, size ))) return map_error( err ); + if ((err = init_property( &prop, key, type, buffer, size, TRUE ))) return map_error( err ); if (flags) return CR_INVALID_FLAG; return map_error( get_device_interface_property( &iface, &prop ) ); @@ -1408,6 +1511,148 @@ CONFIGRET WINAPI CM_Get_Device_Interface_Property_KeysW( const WCHAR *iface, DEV return CM_Get_Device_Interface_Property_Keys_ExW( iface, keys, count, flags, NULL ); } +/*********************************************************************** + * CM_Get_Device_ID_List_Size_ExW (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Get_Device_ID_List_Size_ExW( ULONG *len, const WCHAR *filter, ULONG flags, HMACHINE machine ) +{ + BOOL all = !(flags & CM_GETIDLIST_FILTER_PRESENT); + LSTATUS err; + GUID guid; + + TRACE( "len %p, filter %s, flags %#lx, machine %p\n", len, debugstr_w(filter), flags, machine ); + if (machine) FIXME( "machine %p not implemented!\n", machine ); + + if (!len) return CR_INVALID_POINTER; + if (flags & ~CM_GETIDLIST_FILTER_BITS) return CR_INVALID_FLAG; + if (flags & CM_GETIDLIST_DONOTGENERATE) FIXME( "CM_GETIDLIST_DONOTGENERATE not implemented!\n" ); + + *len = 0; + if (flags & CM_GETIDLIST_FILTER_CLASS && filter && guid_from_string( filter, &guid )) return CR_INVALID_DATA; + if ((flags & CM_GETIDLIST_FILTER_ENUMERATOR) && !filter) return CR_INVALID_POINTER; + if (!(flags &= ~(CM_GETIDLIST_DONOTGENERATE | CM_GETIDLIST_FILTER_PRESENT))) filter = NULL; + + switch (flags) + { + case 0: err = enum_devices( NULL, NULL, NULL, all, enum_objects_size, len ); break; + case CM_GETIDLIST_FILTER_ENUMERATOR: err = enum_devices( filter, NULL, NULL, all, enum_objects_size, len ); break; + case CM_GETIDLIST_FILTER_CLASS: err = enum_devices( NULL, &DEVPKEY_Device_ClassGuid, filter, all, enum_objects_size, len ); break; + case CM_GETIDLIST_FILTER_SERVICE: err = enum_devices( NULL, &DEVPKEY_Device_Service, filter, all, enum_objects_size, len ); break; + case CM_GETIDLIST_FILTER_BUSRELATIONS: err = get_device_strings( filter, &DEVPKEY_Device_BusRelations, len, NULL ); break; + case CM_GETIDLIST_FILTER_TRANSPORTRELATIONS: err = get_device_strings( filter, &DEVPKEY_Device_TransportRelations, len, NULL ); break; + case CM_GETIDLIST_FILTER_EJECTRELATIONS: err = get_device_strings( filter, &DEVPKEY_Device_EjectionRelations, len, NULL ); break; + case CM_GETIDLIST_FILTER_POWERRELATIONS: err = get_device_strings( filter, &DEVPKEY_Device_PowerRelations, len, NULL ); break; + case CM_GETIDLIST_FILTER_REMOVALRELATIONS: err = get_device_strings( filter, &DEVPKEY_Device_RemovalRelations, len, NULL ); break; + default: FIXME( "Unsupported flags %#lx\n", flags ); return CR_INVALID_FLAG; + } + + return map_error( err ); +} + +/*********************************************************************** + * CM_Get_Device_ID_List_Size_ExA (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Get_Device_ID_List_Size_ExA( ULONG *len, const char *filterA, ULONG flags, HMACHINE machine ) +{ + WCHAR filterW[MAX_PATH]; + + if (filterA) MultiByteToWideChar( CP_ACP, 0, filterA, -1, filterW, ARRAY_SIZE(filterW) ); + return CM_Get_Device_ID_List_Size_ExW( len, filterA ? filterW : NULL, flags, machine ); +} + +/*********************************************************************** + * CM_Get_Device_ID_List_SizeW (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Get_Device_ID_List_SizeW( ULONG *len, const WCHAR *filter, ULONG flags ) +{ + return CM_Get_Device_ID_List_Size_ExW( len, filter, flags, NULL ); +} + +/*********************************************************************** + * CM_Get_Device_ID_List_SizeA (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Get_Device_ID_List_SizeA( ULONG *len, const char *filter, ULONG flags ) +{ + return CM_Get_Device_ID_List_Size_ExA( len, filter, flags, NULL ); +} + +/*********************************************************************** + * CM_Get_Device_ID_List_ExW (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Get_Device_ID_List_ExW( const WCHAR *filter, WCHAR *buffer, ULONG len, ULONG flags, HMACHINE machine ) +{ + struct enum_objects_append_params params = {.buffer = buffer, .len = len}; + BOOL all = !(flags & CM_GETIDLIST_FILTER_PRESENT); + LSTATUS err; + GUID guid; + + TRACE( "filter %s, buffer %p, len %lu, flags %#lx, machine %p\n", debugstr_w(filter), buffer, len, flags, machine ); + if (machine) FIXME( "machine %p not implemented!\n", machine ); + + if (!buffer) return CR_INVALID_POINTER; + if (!len) return buffer ? CR_INVALID_POINTER : CR_BUFFER_SMALL; + if (flags & ~CM_GETIDLIST_FILTER_BITS) return CR_INVALID_FLAG; + if (flags & CM_GETIDLIST_DONOTGENERATE) FIXME( "CM_GETIDLIST_DONOTGENERATE not implemented!\n" ); + + *buffer = 0; + if (flags & CM_GETIDLIST_FILTER_CLASS && filter && guid_from_string( filter, &guid )) return CR_INVALID_DATA; + if ((flags & CM_GETIDLIST_FILTER_ENUMERATOR) && !filter) return CR_INVALID_POINTER; + if (!(flags &= ~(CM_GETIDLIST_DONOTGENERATE | CM_GETIDLIST_FILTER_PRESENT))) filter = NULL; + + switch (flags) + { + case 0: err = enum_devices( NULL, NULL, NULL, all, enum_objects_append, ¶ms ); break; + case CM_GETIDLIST_FILTER_ENUMERATOR: err = enum_devices( filter, NULL, NULL, all, enum_objects_append, ¶ms ); break; + case CM_GETIDLIST_FILTER_CLASS: err = enum_devices( NULL, &DEVPKEY_Device_ClassGuid, filter, all, enum_objects_append, ¶ms ); break; + case CM_GETIDLIST_FILTER_SERVICE: err = enum_devices( NULL, &DEVPKEY_Device_Service, filter, all, enum_objects_append, ¶ms ); break; + case CM_GETIDLIST_FILTER_BUSRELATIONS: err = get_device_strings( filter, &DEVPKEY_Device_BusRelations, &len, buffer ); break; + case CM_GETIDLIST_FILTER_TRANSPORTRELATIONS: err = get_device_strings( filter, &DEVPKEY_Device_TransportRelations, &len, buffer ); break; + case CM_GETIDLIST_FILTER_EJECTRELATIONS: err = get_device_strings( filter, &DEVPKEY_Device_EjectionRelations, &len, buffer ); break; + case CM_GETIDLIST_FILTER_POWERRELATIONS: err = get_device_strings( filter, &DEVPKEY_Device_PowerRelations, &len, buffer ); break; + case CM_GETIDLIST_FILTER_REMOVALRELATIONS: err = get_device_strings( filter, &DEVPKEY_Device_RemovalRelations, &len, buffer ); break; + default: WARN( "Unsupported flags %#lx\n", flags ); return CR_INVALID_FLAG; + } + + return map_error( err ); +} + +/*********************************************************************** + * CM_Get_Device_ID_List_ExA (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Get_Device_ID_List_ExA( const char *filterA, char *bufferA, ULONG len, ULONG flags, HMACHINE machine ) +{ + WCHAR filterW[MAX_PATH], *bufferW; + CONFIGRET ret; + + bufferW = bufferA ? malloc( len * sizeof(WCHAR) ) : NULL; + if (filterA) MultiByteToWideChar( CP_ACP, 0, filterA, -1, filterW, ARRAY_SIZE(filterW) ); + ret = CM_Get_Device_ID_List_ExW( filterA ? filterW : NULL, bufferA ? bufferW : NULL, len, flags, machine ); + if (!ret && bufferA && len && !WideCharToMultiByte( CP_ACP, 0, bufferW, len, bufferA, len, 0, 0 )) + { + if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) ret = CR_BUFFER_SMALL; + else ret = CR_FAILURE; + } + free( bufferW ); + + return ret; +} + +/*********************************************************************** + * CM_Get_Device_ID_ListW (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Get_Device_ID_ListW( const WCHAR *filter, WCHAR *buffer, ULONG len, ULONG flags ) +{ + return CM_Get_Device_ID_List_ExW( filter, buffer, len, flags, NULL ); +} + +/*********************************************************************** + * CM_Get_Device_ID_ListA (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Get_Device_ID_ListA( const char *filter, char *buffer, ULONG len, ULONG flags ) +{ + return CM_Get_Device_ID_List_ExA( filter, buffer, len, flags, NULL ); +} + /*********************************************************************** * CM_Locate_DevNode_ExW (cfgmgr32.@) */ @@ -1677,7 +1922,7 @@ CONFIGRET WINAPI CM_Get_DevNode_Property_ExW( DEVINST node, const DEVPROPKEY *ke if (flags) FIXME( "flags %#lx not implemented!\n", flags ); if (devnode_get_device( node, &dev )) return CR_INVALID_DEVNODE; - if ((err = init_property( &prop, key, type, buffer, size ))) return map_error( err ); + if ((err = init_property( &prop, key, type, buffer, size, TRUE ))) return map_error( err ); return map_error( get_device_property( HKEY_LOCAL_MACHINE, &dev, &prop ) ); } diff --git a/dlls/cfgmgr32/cfgmgr32.spec b/dlls/cfgmgr32/cfgmgr32.spec index ae538de0a15..33bcb1bb32c 100644 --- a/dlls/cfgmgr32/cfgmgr32.spec +++ b/dlls/cfgmgr32/cfgmgr32.spec @@ -98,14 +98,14 @@ @ stdcall CM_Get_Device_IDW(ptr ptr long long) @ stdcall CM_Get_Device_ID_ExA(ptr ptr long long ptr) @ stdcall CM_Get_Device_ID_ExW(ptr ptr long long ptr) -@ 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 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 -@ stdcall CM_Get_Device_ID_List_Size_ExW(ptr wstr long ptr) setupapi.CM_Get_Device_ID_List_Size_ExW +@ stdcall CM_Get_Device_ID_ListA(str ptr long long) +@ stdcall CM_Get_Device_ID_ListW(wstr ptr long long) +@ stdcall CM_Get_Device_ID_List_ExA(str ptr long long ptr) +@ stdcall CM_Get_Device_ID_List_ExW(wstr ptr long long ptr) +@ stdcall CM_Get_Device_ID_List_SizeA(ptr str long) +@ stdcall CM_Get_Device_ID_List_SizeW(ptr wstr long) +@ stdcall CM_Get_Device_ID_List_Size_ExA(ptr str long ptr) +@ stdcall CM_Get_Device_ID_List_Size_ExW(ptr wstr long ptr) @ stdcall CM_Get_Device_ID_Size(ptr ptr long) @ stdcall CM_Get_Device_ID_Size_Ex(ptr ptr long ptr) @ stdcall CM_Get_Device_Interface_AliasA(str ptr ptr ptr long) setupapi.CM_Get_Device_Interface_AliasA diff --git a/dlls/cfgmgr32/cfgmgr32_private.h b/dlls/cfgmgr32/cfgmgr32_private.h index f614e594c58..9051897daa5 100644 --- a/dlls/cfgmgr32/cfgmgr32_private.h +++ b/dlls/cfgmgr32/cfgmgr32_private.h @@ -63,7 +63,7 @@ struct property DWORD *size; }; -extern LSTATUS init_property( struct property *prop, const DEVPROPKEY *key, DEVPROPTYPE *type, void *buffer, DWORD *size ); +extern LSTATUS init_property( struct property *prop, const DEVPROPKEY *key, DEVPROPTYPE *type, void *buffer, DWORD *size, BOOL binary ); struct device_interface { diff --git a/dlls/cfgmgr32/devobject.c b/dlls/cfgmgr32/devobject.c index 2ee2c1f8387..14591eef4ab 100644 --- a/dlls/cfgmgr32/devobject.c +++ b/dlls/cfgmgr32/devobject.c @@ -317,7 +317,7 @@ static LSTATUS copy_device_interface_property( HKEY hkey, const struct device_in struct property prop; LSTATUS err; - init_property( &prop, &property->CompKey.Key, &property->Type, property->Buffer, &property->BufferSize ); + init_property( &prop, &property->CompKey.Key, &property->Type, property->Buffer, &property->BufferSize, TRUE ); if (!(err = query_device_interface_property( hkey, iface, &prop ))) return ERROR_SUCCESS; if (err && err != ERROR_MORE_DATA) return ERROR_SUCCESS; diff --git a/dlls/cfgmgr32/tests/cfgmgr32.c b/dlls/cfgmgr32/tests/cfgmgr32.c index 8939cf008b3..b5af953d229 100644 --- a/dlls/cfgmgr32/tests/cfgmgr32.c +++ b/dlls/cfgmgr32/tests/cfgmgr32.c @@ -187,7 +187,7 @@ const DEVPROPERTY* (WINAPI *pDevFindProperty)(const DEVPROPKEY *, DEVPROPSTORE, DEFINE_DEVPROPKEY(DEVPROPKEY_GPU_LUID, 0x60b193cb, 0x5276, 0x4d0f, 0x96, 0xfc, 0xf1, 0x73, 0xab, 0xad, 0x3e, 0xc6, 2); -static void test_CM_Get_Device_ID_List(void) +static void test_CM_Get_Device_ID_List_setupapi(void) { struct { @@ -3725,6 +3725,354 @@ static void test_CM_Get_Class_Property_Keys(void) if (len == 9) todo_wine ok( !memcmp( buffer + 5, &DEVPKEY_NAME, sizeof(*buffer) ), "got %s\n", debugstr_DEVPROPKEY( buffer + 5 ) ); } +static void test_CM_Get_Device_ID_List_Size(void) +{ + WCHAR instance[MAX_PATH], *buffer, *tmp; + ULONG size_all, size_present, size; + GUID guid = GUID_DEVINTERFACE_HID; + CONFIGRET ret; + + ret = CM_Get_Device_ID_List_SizeW( NULL, NULL, CM_GETIDLIST_FILTER_NONE ); + ok_x4( ret, ==, CR_INVALID_POINTER ); + for (UINT flag = 1; flag; flag <<= 1) + { + if (flag & CM_GETIDLIST_FILTER_BITS) continue; + winetest_push_context( "%#x", flag ); + ret = CM_Get_Device_ID_List_SizeW( &size, NULL, flag ); + ok_x4( ret, ==, CR_INVALID_FLAG ); + winetest_pop_context(); + } + + size_present = 0; + ret = CM_Get_Device_ID_List_SizeW( &size_present, NULL, CM_GETIDLIST_FILTER_PRESENT ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( size_present, >, 0 ); + size_all = 0; + ret = CM_Get_Device_ID_List_SizeW( &size_all, NULL, CM_GETIDLIST_FILTER_NONE ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( size_all, >, 0 ); + + size = 0; + ret = CM_Get_Device_ID_List_SizeA( &size, NULL, CM_GETIDLIST_FILTER_PRESENT ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( size, ==, size_present ); + size = 0; + ret = CM_Get_Device_ID_List_SizeW( &size, (WCHAR *)L"", CM_GETIDLIST_FILTER_PRESENT ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( size, ==, size_present ); + size = 0; + ret = CM_Get_Device_ID_List_SizeA( &size, NULL, CM_GETIDLIST_FILTER_NONE ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( size, ==, size_all ); + size = 0; + ret = CM_Get_Device_ID_List_SizeW( &size, (WCHAR *)L"", CM_GETIDLIST_FILTER_NONE ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( size, ==, size_all ); + + + ret = CM_Get_Device_ID_List_SizeW( &size, NULL, CM_GETIDLIST_FILTER_ENUMERATOR ); + ok_x4( ret, ==, CR_INVALID_POINTER ); + ret = CM_Get_Device_ID_List_SizeW( &size, L"", CM_GETIDLIST_FILTER_ENUMERATOR ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + size = 0xdeadbeef; + ret = CM_Get_Device_ID_List_SizeW( &size, L"INVALID", CM_GETIDLIST_FILTER_ENUMERATOR ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( size, ==, 1 ); + size = 0; + ret = CM_Get_Device_ID_List_SizeW( &size, L"HID\\VID", CM_GETIDLIST_FILTER_ENUMERATOR ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( size, ==, 1 ); + size = 0; + ret = CM_Get_Device_ID_List_SizeW( &size, L"HID", CM_GETIDLIST_FILTER_ENUMERATOR ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( size, >, 1 ); + + + ret = CM_Get_Device_ID_List_SizeW( &size, NULL, CM_GETIDLIST_FILTER_CLASS ); + ok_x4( ret, ==, CR_INVALID_POINTER ); + ret = CM_Get_Device_ID_List_SizeW( &size, L"", CM_GETIDLIST_FILTER_CLASS ); + ok_x4( ret, ==, CR_INVALID_DATA ); + ret = CM_Get_Device_ID_List_SizeW( &size, L"INVALID", CM_GETIDLIST_FILTER_CLASS ); + ok_x4( ret, ==, CR_INVALID_DATA ); + size = 0; + ret = CM_Get_Device_ID_List_SizeW( &size, L"{4d1e55b2-f16f-11cf-88cb-001111000030}" /* GUID_DEVINTERFACE_HID */, CM_GETIDLIST_FILTER_CLASS ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( size, ==, 1 ); + size = 0; + ret = CM_Get_Device_ID_List_SizeW( &size, L"{745a17a0-74d3-11d0-b6fe-00a0c90f57da}" /* GUID_DEVCLASS_HIDCLASS */, CM_GETIDLIST_FILTER_CLASS ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( size, >, 1 ); + + + ret = CM_Get_Device_ID_List_SizeW( &size, NULL, CM_GETIDLIST_FILTER_SERVICE ); + ok_x4( ret, ==, CR_INVALID_POINTER ); + size = 0; + ret = CM_Get_Device_ID_List_SizeW( &size, L"INVALID", CM_GETIDLIST_FILTER_SERVICE ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_u4( size, ==, 1 ); + size = 0; + ret = CM_Get_Device_ID_List_SizeW( &size, L"", CM_GETIDLIST_FILTER_SERVICE ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + todo_wine ok_u4( size, >, 1 ); + + + ret = CM_Get_Device_ID_List_SizeW( &size, NULL, CM_GETIDLIST_FILTER_EJECTRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_List_SizeW( &size, L"", CM_GETIDLIST_FILTER_EJECTRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_List_SizeW( &size, L"INVALID", CM_GETIDLIST_FILTER_EJECTRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_List_SizeW( &size, NULL, CM_GETIDLIST_FILTER_REMOVALRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_List_SizeW( &size, L"", CM_GETIDLIST_FILTER_REMOVALRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_List_SizeW( &size, L"INVALID", CM_GETIDLIST_FILTER_REMOVALRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_List_SizeW( &size, NULL, CM_GETIDLIST_FILTER_POWERRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_List_SizeW( &size, L"", CM_GETIDLIST_FILTER_POWERRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_List_SizeW( &size, L"INVALID", CM_GETIDLIST_FILTER_POWERRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_List_SizeW( &size, NULL, CM_GETIDLIST_FILTER_BUSRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_List_SizeW( &size, L"", CM_GETIDLIST_FILTER_BUSRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_List_SizeW( &size, L"INVALID", CM_GETIDLIST_FILTER_BUSRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_List_SizeW( &size, NULL, CM_GETIDLIST_FILTER_TRANSPORTRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_List_SizeW( &size, L"", CM_GETIDLIST_FILTER_TRANSPORTRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_List_SizeW( &size, L"INVALID", CM_GETIDLIST_FILTER_TRANSPORTRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + + + size = 0; + ret = CM_Get_Device_Interface_List_SizeW( &size, &guid, NULL, CM_GET_DEVICE_INTERFACE_LIST_ALL_DEVICES ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( size, >, 0 ); + buffer = malloc( size * sizeof(*buffer) ); + ok_ptr( buffer, !=, NULL ); + ret = CM_Get_Device_Interface_ListW( &guid, NULL, buffer, size, CM_GET_DEVICE_INTERFACE_LIST_PRESENT ); + ok_x4( ret, ==, CR_SUCCESS ); + + wcscpy( instance, buffer + 4 ); + *wcsrchr( instance, '#' ) = 0; + while ((tmp = wcschr( instance, '#' ))) *tmp = '\\'; + + ret = CM_Get_Device_ID_List_SizeW( &size, instance, CM_GETIDLIST_FILTER_EJECTRELATIONS ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_List_SizeW( &size, instance, CM_GETIDLIST_FILTER_REMOVALRELATIONS ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_List_SizeW( &size, instance, CM_GETIDLIST_FILTER_POWERRELATIONS ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_List_SizeW( &size, instance, CM_GETIDLIST_FILTER_BUSRELATIONS ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_List_SizeW( &size, instance, CM_GETIDLIST_FILTER_TRANSPORTRELATIONS ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + + size = 0xdeadbeef; + ret = CM_Get_Device_ID_List_SizeW( &size, instance, CM_GETIDLIST_FILTER_ENUMERATOR ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ok_u4( size, ==, 0 ); + *wcsrchr( instance, '\\' ) = 0; + size = 0; + ret = CM_Get_Device_ID_List_SizeW( &size, instance, CM_GETIDLIST_FILTER_ENUMERATOR ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( size, >, 1 ); + + free( buffer ); +} + +static void test_CM_Get_Device_ID_List(void) +{ + WCHAR *buffer, *bufferW, *instance, *tmp; + CONFIGRET ret; + char *bufferA; + ULONG size; + + size = 0; + ret = CM_Get_Device_ID_List_SizeW( &size, NULL, CM_GETIDLIST_FILTER_NONE ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_u4( size, >, 0 ); + + buffer = malloc( size * sizeof(*buffer) ); + ok_ptr( buffer, !=, NULL ); + bufferW = malloc( size * sizeof(*bufferW) ); + ok_ptr( bufferW, !=, NULL ); + + + ret = CM_Get_Device_ID_ListW( NULL, NULL, size, CM_GETIDLIST_FILTER_NONE ); + ok_x4( ret, ==, CR_INVALID_POINTER ); + for (UINT flag = 1; flag; flag <<= 1) + { + if (flag & CM_GETIDLIST_FILTER_BITS) continue; + winetest_push_context( "%#x", flag ); + ret = CM_Get_Device_ID_ListW( NULL, buffer, size, flag ); + ok_x4( ret, ==, CR_INVALID_FLAG ); + winetest_pop_context(); + } + + ret = CM_Get_Device_ID_ListW( NULL, buffer, size, CM_GETIDLIST_FILTER_PRESENT ); + ok_x4( ret, ==, CR_SUCCESS ); + ret = CM_Get_Device_ID_ListW( NULL, buffer, size, CM_GETIDLIST_FILTER_NONE ); + ok_x4( ret, ==, CR_SUCCESS ); + + + bufferA = malloc( size * sizeof(*bufferA) ); + ok_ptr( bufferA, !=, NULL ); + ret = CM_Get_Device_ID_ListA( NULL, bufferA, size, CM_GETIDLIST_FILTER_NONE ); + ok_x4( ret, ==, CR_SUCCESS ); + + memset( bufferW, 0xcc, size * sizeof(*bufferW) ); + MultiByteToWideChar( CP_ACP, 0, bufferA, size, bufferW, size ); + ok( !memcmp( bufferW, buffer, size * sizeof(*buffer) ), "got %s, %s.\n", debugstr_wn( bufferW, size ), debugstr_wn( buffer, size ) ); + free( bufferA ); + + ret = CM_Get_Device_ID_ListW( L"", buffer, size, CM_GETIDLIST_FILTER_NONE ); + ok_x4( ret, ==, CR_SUCCESS ); + ok( !memcmp( bufferW, buffer, size * sizeof(*buffer) ), "got %s, %s.\n", debugstr_wn( bufferW, size ), debugstr_wn( buffer, size ) ); + + + ret = CM_Get_Device_ID_ListW( NULL, buffer, size, CM_GETIDLIST_FILTER_ENUMERATOR ); + ok_x4( ret, ==, CR_INVALID_POINTER ); + ret = CM_Get_Device_ID_ListW( L"", buffer, size, CM_GETIDLIST_FILTER_ENUMERATOR ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_ListW( L"INVALID", buffer, size, CM_GETIDLIST_FILTER_ENUMERATOR ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_wcs( L"", buffer ); + ret = CM_Get_Device_ID_ListW( L"HID\\VID", buffer, size, CM_GETIDLIST_FILTER_ENUMERATOR ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_wcs( L"", buffer ); + ret = CM_Get_Device_ID_ListW( L"HID", buffer, size, CM_GETIDLIST_FILTER_ENUMERATOR ); + ok_x4( ret, ==, CR_SUCCESS ); + for (tmp = buffer; *tmp; tmp = tmp + wcslen( tmp ) + 1) + { + WCHAR *sep, substr[MAX_PATH], upper[MAX_PATH]; + ok( !wcsncmp( tmp, L"HID\\", 4 ), "got %s\n", debugstr_w( tmp ) ); + if (broken(!wcsncmp( tmp, L"HID\\{", 5 ))) continue; /* HID\\{cfa8b69e-5b4a-4cc0-b98b-8ba1a1f3f95a} (Microsoft Hyper-V Input?) */ + /* HID\\VID_XXXX&PID_XXXX upper case prefix */ + wcscpy( substr, tmp ); + if (!(sep = wcschr( substr + 4, '\\' ))) sep = substr + 4; + *sep = 0; + wcscpy( upper, substr ); + wcsupr( upper ); + ok_wcs( upper, substr ); + *sep = '\\'; + wcslwr( wcsrchr( substr, '\\' ) ); /* lowercase instance + refstring */ + flaky_wine ok_wcs( substr, tmp ); + } + ok( tmp > buffer, "got %s\n", debugstr_wn( buffer, size ) ); + + + ret = CM_Get_Device_ID_ListW( NULL, buffer, size, CM_GETIDLIST_FILTER_CLASS ); + ok_x4( ret, ==, CR_INVALID_POINTER ); + ret = CM_Get_Device_ID_ListW( L"", buffer, size, CM_GETIDLIST_FILTER_CLASS ); + ok_x4( ret, ==, CR_INVALID_DATA ); + ret = CM_Get_Device_ID_ListW( L"INVALID", buffer, size, CM_GETIDLIST_FILTER_CLASS ); + ok_x4( ret, ==, CR_INVALID_DATA ); + ret = CM_Get_Device_ID_ListW( L"{4d1e55b2-f16f-11cf-88cb-001111000030}", buffer, size, CM_GETIDLIST_FILTER_CLASS ); + ok_x4( ret, ==, CR_SUCCESS ); + ok_wcs( L"", buffer ); + ret = CM_Get_Device_ID_ListW( L"{745a17a0-74d3-11d0-b6fe-00a0c90f57da}", buffer, size, CM_GETIDLIST_FILTER_CLASS ); + ok_x4( ret, ==, CR_SUCCESS ); + for (tmp = buffer; *tmp; tmp = tmp + wcslen( tmp ) + 1) + ok( !!wcschr( tmp, '\\' ), "got %s\n", debugstr_w( tmp ) ); + ok( tmp > buffer, "got %s\n", debugstr_wn( buffer, size ) ); + + + ret = CM_Get_Device_ID_ListW( NULL, buffer, size, CM_GETIDLIST_FILTER_SERVICE ); + ok_x4( ret, ==, CR_INVALID_POINTER ); + ret = CM_Get_Device_ID_ListW( L"INVALID", buffer, size, CM_GETIDLIST_FILTER_SERVICE ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + ok_wcs( L"", buffer ); + ret = CM_Get_Device_ID_ListW( L"", buffer, size, CM_GETIDLIST_FILTER_SERVICE ); + todo_wine ok_x4( ret, ==, CR_SUCCESS ); + for (tmp = buffer; *tmp; tmp = tmp + wcslen( tmp ) + 1) + ok( !!wcschr( tmp, '\\' ), "got %s\n", debugstr_w( tmp ) ); + todo_wine ok( tmp > buffer, "got %s\n", debugstr_wn( buffer, size ) ); + + + ret = CM_Get_Device_ID_ListW( NULL, buffer, size, CM_GETIDLIST_FILTER_EJECTRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_ListW( L"", buffer, size, CM_GETIDLIST_FILTER_EJECTRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_ListW( L"INVALID", buffer, size, CM_GETIDLIST_FILTER_EJECTRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_ListW( NULL, buffer, size, CM_GETIDLIST_FILTER_REMOVALRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_ListW( L"", buffer, size, CM_GETIDLIST_FILTER_REMOVALRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_ListW( L"INVALID", buffer, size, CM_GETIDLIST_FILTER_REMOVALRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_ListW( NULL, buffer, size, CM_GETIDLIST_FILTER_POWERRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_ListW( L"", buffer, size, CM_GETIDLIST_FILTER_POWERRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_ListW( L"INVALID", buffer, size, CM_GETIDLIST_FILTER_POWERRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_ListW( NULL, buffer, size, CM_GETIDLIST_FILTER_BUSRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_ListW( L"", buffer, size, CM_GETIDLIST_FILTER_BUSRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_ListW( L"INVALID", buffer, size, CM_GETIDLIST_FILTER_BUSRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_ListW( NULL, buffer, size, CM_GETIDLIST_FILTER_TRANSPORTRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_ListW( L"", buffer, size, CM_GETIDLIST_FILTER_TRANSPORTRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_ListW( L"INVALID", buffer, size, CM_GETIDLIST_FILTER_TRANSPORTRELATIONS ); + todo_wine ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + + + ret = CM_Get_Device_ID_ListW( L"HID", buffer, size, CM_GETIDLIST_FILTER_ENUMERATOR ); + ok_x4( ret, ==, CR_SUCCESS ); + for (tmp = buffer; *tmp; tmp = tmp + wcslen( tmp ) + 1) + { + WCHAR *sep, substr[MAX_PATH], upper[MAX_PATH]; + ok( !wcsncmp( tmp, L"HID\\", 4 ), "got %s\n", debugstr_w( tmp ) ); + if (broken(!wcsncmp( tmp, L"HID\\{", 5 ))) continue; /* HID\\{cfa8b69e-5b4a-4cc0-b98b-8ba1a1f3f95a} (Microsoft Hyper-V Input?) */ + /* HID\\VID_XXXX&PID_XXXX upper case prefix */ + wcscpy( substr, tmp ); + if (!(sep = wcschr( substr + 4, '\\' ))) sep = substr + 4; + *sep = 0; + wcscpy( upper, substr ); + wcsupr( upper ); + ok_wcs( upper, substr ); + *sep = '\\'; + wcslwr( wcsrchr( substr, '\\' ) ); /* lowercase instance + refstring */ + flaky_wine ok_wcs( substr, tmp ); + } + ok( tmp > buffer, "got %s\n", debugstr_wn( buffer, size ) ); + memcpy( bufferW, buffer, size * sizeof(WCHAR) ); + + for (instance = bufferW; *instance; instance += wcslen( instance ) + 1) + { + ret = CM_Get_Device_ID_ListW( instance, buffer, size, CM_GETIDLIST_FILTER_EJECTRELATIONS ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_ListW( instance, buffer, size, CM_GETIDLIST_FILTER_REMOVALRELATIONS ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_ListW( instance, buffer, size, CM_GETIDLIST_FILTER_POWERRELATIONS ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_ListW( instance, buffer, size, CM_GETIDLIST_FILTER_BUSRELATIONS ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + ret = CM_Get_Device_ID_ListW( instance, buffer, size, CM_GETIDLIST_FILTER_TRANSPORTRELATIONS ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + + ret = CM_Get_Device_ID_ListW( instance, buffer, size, CM_GETIDLIST_FILTER_ENUMERATOR ); + ok_x4( ret, ==, CR_NO_SUCH_VALUE ); + if ((tmp = wcsrchr( instance, '\\' ))) *tmp = 0; + ret = CM_Get_Device_ID_ListW( instance, buffer, size, CM_GETIDLIST_FILTER_ENUMERATOR ); + ok_x4( ret, ==, CR_SUCCESS ); + ok( !wcsncmp( buffer, instance, tmp - instance ), "got %s\n", debugstr_w( buffer ) ); + if (tmp) *tmp = '\\'; + } + + free( bufferW ); + free( buffer ); +} + START_TEST(cfgmgr32) { HMODULE mod = GetModuleHandleA("cfgmgr32.dll"); @@ -3751,7 +4099,9 @@ START_TEST(cfgmgr32) test_CM_Get_Device_Interface_Property_Keys(); test_CM_Get_Device_Interface_PropertyW(); test_CM_Get_Device_Interface_Property_setupapi(); + test_CM_Get_Device_ID_List_Size(); test_CM_Get_Device_ID_List(); + test_CM_Get_Device_ID_List_setupapi(); test_CM_Register_Notification(); test_CM_Open_DevNode_Key(); test_CM_Get_DevNode_Registry_Property(); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10584
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/setupapi/devinst.c | 214 ------------------------------------ dlls/setupapi/setupapi.spec | 16 +-- 2 files changed, 8 insertions(+), 222 deletions(-) diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c index d7b7cdbcf7c..f6bfcc483b0 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -4161,220 +4161,6 @@ BOOL WINAPI SetupDiDeleteDevRegKey(HDEVINFO devinfo, SP_DEVINFO_DATA *device_dat return !l; } -static CONFIGRET get_device_id_list(const WCHAR *filter, WCHAR *buffer, ULONG *len, ULONG flags) -{ - const ULONG supported_flags = CM_GETIDLIST_FILTER_NONE | CM_GETIDLIST_FILTER_CLASS | CM_GETIDLIST_FILTER_PRESENT; - SP_DEVINFO_DATA device = { sizeof(device) }; - CONFIGRET ret = CR_SUCCESS; - GUID guid, *pguid = NULL; - unsigned int i, id_len; - ULONG query_flags = 0; - HDEVINFO set; - WCHAR id[256]; - ULONG needed; - WCHAR *p; - - if (!len || (buffer && !*len)) - return CR_INVALID_POINTER; - - needed = 1; - - if (buffer) - *buffer = 0; - if (flags & ~supported_flags) - { - FIXME("Flags %#lx are not supported.\n", flags); - *len = needed; - return CR_SUCCESS; - } - - if (!buffer) - *len = 0; - - if (flags & CM_GETIDLIST_FILTER_CLASS) - { - if (!filter) - return CR_INVALID_POINTER; - if (IIDFromString((WCHAR *)filter, &guid)) - return CR_INVALID_DATA; - pguid = &guid; - } - - if (!buffer) - *len = needed; - - if (!pguid) - query_flags |= DIGCF_ALLCLASSES; - if (flags & CM_GETIDLIST_FILTER_PRESENT) - query_flags |= DIGCF_PRESENT; - - set = SetupDiGetClassDevsW(pguid, NULL, NULL, query_flags); - if (set == INVALID_HANDLE_VALUE) - return CR_SUCCESS; - - p = buffer; - for (i = 0; SetupDiEnumDeviceInfo(set, i, &device); ++i) - { - ret = SetupDiGetDeviceInstanceIdW(set, &device, id, ARRAY_SIZE(id), NULL); - if (!ret) continue; - id_len = wcslen(id) + 1; - needed += id_len; - if (buffer) - { - if (needed > *len) - { - SetupDiDestroyDeviceInfoList(set); - *buffer = 0; - return CR_BUFFER_SMALL; - } - memcpy(p, id, sizeof(*p) * id_len); - p += id_len; - } - } - SetupDiDestroyDeviceInfoList(set); - *len = needed; - if (buffer) - *p = 0; - return CR_SUCCESS; -} - -/*********************************************************************** - * CM_Get_Device_ID_List_ExW (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Device_ID_List_ExW(const WCHAR *filter, WCHAR *buffer, ULONG len, ULONG flags, HMACHINE machine) -{ - TRACE("%s %p %ld %#lx %p.\n", debugstr_w(filter), buffer, len, flags, machine); - - if (machine) - FIXME("machine %p.\n", machine); - - if (!buffer) - return CR_INVALID_POINTER; - - return get_device_id_list(filter, buffer, &len, flags); -} - -/*********************************************************************** - * CM_Get_Device_ID_ListW (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Device_ID_ListW(const WCHAR *filter, WCHAR *buffer, ULONG len, ULONG flags) -{ - return CM_Get_Device_ID_List_ExW(filter, buffer, len, flags, NULL); -} - -/*********************************************************************** - * CM_Get_Device_ID_List_Size_ExW (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Device_ID_List_Size_ExW(ULONG *len, const WCHAR *filter, ULONG flags, HMACHINE machine) -{ - TRACE("%p %s %#lx, machine %p.\n", len, debugstr_w(filter), flags, machine); - - if (machine) - FIXME("machine %p.\n", machine); - - return get_device_id_list(filter, NULL, len, flags); -} - -/*********************************************************************** - * CM_Get_Device_ID_List_SizeW (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Device_ID_List_SizeW(ULONG *len, const WCHAR *filter, ULONG flags) -{ - TRACE("%p %s %#lx.\n", len, debugstr_w(filter), flags); - - return get_device_id_list(filter, NULL, len, flags); -} - -/*********************************************************************** - * CM_Get_Device_ID_List_ExA (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Device_ID_List_ExA(const char *filter, char *buffer, ULONG len, ULONG flags, HMACHINE machine) -{ - WCHAR *wbuffer, *wfilter = NULL, *p; - unsigned int slen; - CONFIGRET ret; - - TRACE("%s %p %ld %#lx.\n", debugstr_a(filter), buffer, len, flags); - - if (machine) - FIXME("machine %p.\n", machine); - - if (!buffer || !len) - return CR_INVALID_POINTER; - - if (!(wbuffer = malloc(len * sizeof(*wbuffer)))) - return CR_OUT_OF_MEMORY; - - if (filter) - { - slen = strlen(filter) + 1; - if (!(wfilter = malloc(slen * sizeof(*wfilter)))) - { - free(wbuffer); - return CR_OUT_OF_MEMORY; - } - MultiByteToWideChar(CP_ACP, 0, filter, slen, wfilter, slen); - } - - if (!(ret = CM_Get_Device_ID_ListW(wfilter, wbuffer, len, flags))) - { - p = wbuffer; - while (*p) - { - slen = wcslen(p) + 1; - WideCharToMultiByte(CP_ACP, 0, p, slen, buffer, slen, NULL, NULL); - p += slen; - buffer += slen; - } - *buffer = 0; - } - free(wfilter); - free(wbuffer); - return ret; -} - -/*********************************************************************** - * CM_Get_Device_ID_ListA (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Device_ID_ListA(const char *filter, char *buffer, ULONG len, ULONG flags) -{ - return CM_Get_Device_ID_List_ExA(filter, buffer, len, flags, NULL); -} - -/*********************************************************************** - * CM_Get_Device_ID_List_Size_ExA (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Device_ID_List_Size_ExA(ULONG *len, const char *filter, ULONG flags, HMACHINE machine) -{ - WCHAR *wfilter = NULL; - unsigned int slen; - CONFIGRET ret; - - TRACE("%p %s %#lx.\n", len, debugstr_a(filter), flags); - - if (machine) - FIXME("machine %p.\n", machine); - - if (filter) - { - slen = strlen(filter) + 1; - if (!(wfilter = malloc(slen * sizeof(*wfilter)))) - return CR_OUT_OF_MEMORY; - MultiByteToWideChar(CP_ACP, 0, filter, slen, wfilter, slen); - } - ret = CM_Get_Device_ID_List_SizeW(len, wfilter, flags); - free(wfilter); - return ret; -} - -/*********************************************************************** - * CM_Get_Device_ID_List_SizeA (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Device_ID_List_SizeA(ULONG *len, const char *filter, ULONG flags) -{ - return CM_Get_Device_ID_List_Size_ExA(len, filter, flags, NULL); -} - /*********************************************************************** * SetupDiGetINFClassA (SETUPAPI.@) */ diff --git a/dlls/setupapi/setupapi.spec b/dlls/setupapi/setupapi.spec index 4c47b2ffe70..f1ebdb0efa4 100644 --- a/dlls/setupapi/setupapi.spec +++ b/dlls/setupapi/setupapi.spec @@ -79,14 +79,14 @@ @ stdcall CM_Get_Device_IDW(ptr ptr long long) cfgmgr32.CM_Get_Device_IDW @ stdcall CM_Get_Device_ID_ExA(ptr ptr long long ptr) cfgmgr32.CM_Get_Device_ID_ExA @ stdcall CM_Get_Device_ID_ExW(ptr ptr long long ptr) cfgmgr32.CM_Get_Device_ID_ExW -@ stdcall CM_Get_Device_ID_ListA(str ptr long long) -@ stdcall CM_Get_Device_ID_ListW(wstr ptr long long) -@ stdcall CM_Get_Device_ID_List_ExA(str ptr long long ptr) -@ stdcall CM_Get_Device_ID_List_ExW(wstr ptr long long ptr) -@ stdcall CM_Get_Device_ID_List_SizeA(ptr str long) -@ stdcall CM_Get_Device_ID_List_SizeW(ptr wstr long) -@ stdcall CM_Get_Device_ID_List_Size_ExA(ptr str long ptr) -@ stdcall CM_Get_Device_ID_List_Size_ExW(ptr wstr long ptr) +@ stdcall CM_Get_Device_ID_ListA(str ptr long long) cfgmgr32.CM_Get_Device_ID_ListA +@ stdcall CM_Get_Device_ID_ListW(wstr ptr long long) cfgmgr32.CM_Get_Device_ID_ListW +@ stdcall CM_Get_Device_ID_List_ExA(str ptr long long ptr) cfgmgr32.CM_Get_Device_ID_List_ExA +@ stdcall CM_Get_Device_ID_List_ExW(wstr ptr long long ptr) cfgmgr32.CM_Get_Device_ID_List_ExW +@ stdcall CM_Get_Device_ID_List_SizeA(ptr str long) cfgmgr32.CM_Get_Device_ID_List_SizeA +@ stdcall CM_Get_Device_ID_List_SizeW(ptr wstr long) cfgmgr32.CM_Get_Device_ID_List_SizeW +@ stdcall CM_Get_Device_ID_List_Size_ExA(ptr str long ptr) cfgmgr32.CM_Get_Device_ID_List_Size_ExA +@ stdcall CM_Get_Device_ID_List_Size_ExW(ptr wstr long ptr) cfgmgr32.CM_Get_Device_ID_List_Size_ExW @ stdcall CM_Get_Device_ID_Size(ptr ptr long) cfgmgr32.CM_Get_Device_ID_Size @ stdcall CM_Get_Device_ID_Size_Ex(ptr ptr long ptr) cfgmgr32.CM_Get_Device_ID_Size_Ex @ stdcall CM_Get_Device_Interface_AliasA(str ptr ptr ptr long) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10584
From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/cfgmgr32/cfgmgr32.c | 206 ++++++++++++++++++++++++++++++++++++ dlls/cfgmgr32/cfgmgr32.spec | 40 +++---- dlls/setupapi/misc.c | 24 ----- dlls/setupapi/setupapi.spec | 44 ++++---- dlls/setupapi/stubs.c | 186 -------------------------------- 5 files changed, 248 insertions(+), 252 deletions(-) diff --git a/dlls/cfgmgr32/cfgmgr32.c b/dlls/cfgmgr32/cfgmgr32.c index 8bd8a3bbe3b..2ebc203ceb3 100644 --- a/dlls/cfgmgr32/cfgmgr32.c +++ b/dlls/cfgmgr32/cfgmgr32.c @@ -1010,6 +1010,33 @@ DWORD WINAPI CM_MapCrToWin32Err( CONFIGRET code, DWORD default_error ) return default_error; } +/*********************************************************************** + * CM_Connect_MachineW (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Connect_MachineW( const WCHAR *name, HMACHINE *machine ) +{ + FIXME( "name %s, machine %p stub!\n", debugstr_w(name), machine ); + return CR_ACCESS_DENIED; +} + +/*********************************************************************** + * CM_Connect_MachineA (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Connect_MachineA( const char *name, HMACHINE *machine ) +{ + FIXME( "name %s, machine %p stub!\n", debugstr_a(name), machine ); + return CR_ACCESS_DENIED; +} + +/*********************************************************************** + * CM_Disconnect_Machine (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Disconnect_Machine( HMACHINE machine ) +{ + FIXME( "machine %p stub!\n", machine ); + return CR_SUCCESS; +} + /*********************************************************************** * CM_Enumerate_Classes_Ex (cfgmgr32.@) */ @@ -1237,6 +1264,28 @@ CONFIGRET WINAPI CM_Get_Class_Registry_PropertyA( GUID *class, ULONG property, U return map_error( get_class_property( class, &prop ) ); } +/*********************************************************************** + * CM_Set_Class_Registry_PropertyW (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Set_Class_Registry_PropertyW( GUID *class, ULONG property, const void *buffer, + ULONG len, ULONG flags, HMACHINE machine ) +{ + FIXME( "class %s, property %#lx, buffer %p, length %#lx, flags %#lx, machine %p stub!\n", + debugstr_guid( class ), property, buffer, len, flags, machine ); + return CR_FAILURE; +} + +/*********************************************************************** + * CM_Set_Class_Registry_PropertyA (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Set_Class_Registry_PropertyA( GUID *class, ULONG property, const void *buffer, + ULONG len, ULONG flags, HMACHINE machine ) +{ + FIXME( "class %s, property %#lx, buffer %p, length %#lx, flags %#lx, machine %p stub!\n", + debugstr_guid( class ), property, buffer, len, flags, machine ); + return CR_FAILURE; +} + /*********************************************************************** * CM_Get_Class_Property_ExW (cfgmgr32.@) */ @@ -1511,6 +1560,24 @@ CONFIGRET WINAPI CM_Get_Device_Interface_Property_KeysW( const WCHAR *iface, DEV return CM_Get_Device_Interface_Property_Keys_ExW( iface, keys, count, flags, NULL ); } +/*********************************************************************** + * CM_Get_Device_Interface_AliasW (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Get_Device_Interface_AliasW( const WCHAR *iface, GUID *class, WCHAR *name, ULONG *len, ULONG flags ) +{ + FIXME( "iface %s, class %p, name %p, len %p, flags %#lx stub!\n", debugstr_w(iface), class, name, len, flags ); + return CR_FAILURE; +} + +/*********************************************************************** + * CM_Get_Device_Interface_AliasA (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Get_Device_Interface_AliasA( const char *iface, GUID *class, char *name, ULONG *len, ULONG flags ) +{ + FIXME( "iface %s, class %p, name %p, len %p, flags %#lx stub!\n", debugstr_a(iface), class, name, len, flags ); + return CR_FAILURE; +} + /*********************************************************************** * CM_Get_Device_ID_List_Size_ExW (cfgmgr32.@) */ @@ -1964,3 +2031,142 @@ CONFIGRET WINAPI CM_Get_DevNode_Property_Keys( DEVINST node, DEVPROPKEY *keys, U { return CM_Get_DevNode_Property_Keys_Ex( node, keys, count, flags, NULL ); } + +/*********************************************************************** + * CM_Get_Child_Ex (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Get_Child_Ex( DEVINST *child, DEVINST node, ULONG flags, HMACHINE machine ) +{ + FIXME( "child %p, node %#lx, flags %#lx, machine %p stub!\n", child, node, flags, machine ); + return CR_SUCCESS; +} + +/*********************************************************************** + * CM_Get_Child (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Get_Child( DEVINST *child, DEVINST node, ULONG flags ) +{ + return CM_Get_Child_Ex( child, node, flags, NULL ); +} + +/*********************************************************************** + * CM_Get_Parent (cfgmgr32.@) + */ +DWORD WINAPI CM_Get_Parent( DEVINST *parent, DEVINST child, ULONG flags ) +{ + FIXME( "parent %p, child %#lx, flags %#lx stub!\n", parent, child, flags ); + if (parent) *parent = 0; + return CR_NO_SUCH_DEVNODE; +} + +/*********************************************************************** + * CM_Create_DevNodeW (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Create_DevNodeW( DEVINST *node, DEVINSTID_W instance_id, DEVINST parent, ULONG flags ) +{ + FIXME( "node %p, instance_id %s, parent %#lx, flags %#lx stub\n", node, debugstr_w(instance_id), parent, flags ); + return CR_SUCCESS; +} + +/*********************************************************************** + * CM_Create_DevNodeA (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Create_DevNodeA( DEVINST *node, DEVINSTID_A instance_id, DEVINST parent, ULONG flags ) +{ + FIXME( "node %p, instance_id %s, parent %#lx, flags %#lx stub\n", node, debugstr_a(instance_id), parent, flags ); + return CR_SUCCESS; +} + +/*********************************************************************** + * CM_Get_DevNode_Status_Ex (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Get_DevNode_Status_Ex( ULONG *status, ULONG *problem, DEVINST node, ULONG flags, HMACHINE machine ) +{ + FIXME( "status %p, problem %p, node %#lx, flags %#lx, machine %p stub!\n", status, problem, + node, flags, machine ); + return CR_SUCCESS; +} + +/*********************************************************************** + * CM_Get_DevNode_Status (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Get_DevNode_Status( ULONG *status, ULONG *problem, DEVINST node, ULONG flags ) +{ + return CM_Get_DevNode_Status_Ex( status, problem, node, flags, NULL ); +} + +/*********************************************************************** + * CM_Get_Sibling_Ex (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Get_Sibling_Ex( DEVINST *sibling, DEVINST node, ULONG flags, HMACHINE machine ) +{ + FIXME( "sibling %p, node %#lx, flags %#lx, machine %p stub!\n", sibling, node, flags, machine ); + return CR_FAILURE; +} + +/*********************************************************************** + * CM_Get_Sibling (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Get_Sibling( DEVINST *sibling, DEVINST node, ULONG flags ) +{ + return CM_Get_Sibling_Ex( sibling, node, flags, NULL ); +} + +/*********************************************************************** + * CM_Reenumerate_DevNode_Ex (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Reenumerate_DevNode_Ex( DEVINST node, ULONG flags, HMACHINE machine ) +{ + FIXME( "node %#lx, flags %#lx, machine %p stub!\n", node, flags, machine ); + return CR_FAILURE; +} + +/*********************************************************************** + * CM_Reenumerate_DevNode (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Reenumerate_DevNode( DEVINST node, ULONG flags ) +{ + return CM_Reenumerate_DevNode_Ex( node, flags, NULL ); +} + +/*********************************************************************** + * CM_Request_Device_EjectA (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Request_Device_EjectA( DEVINST node, PNP_VETO_TYPE *type, char *name, ULONG length, ULONG flags ) +{ + FIXME( "node %#lx, type %p, name %p, length %#lx, flags %#lx stub!\n", node, type, name, length, flags ); + return CR_SUCCESS; +} + +/*********************************************************************** + * CM_Request_Device_EjectW (cfgmgr32.@) + */ +CONFIGRET WINAPI CM_Request_Device_EjectW( DEVINST node, PNP_VETO_TYPE *type, WCHAR *name, ULONG length, ULONG flags ) +{ + FIXME( "node %#lx, type %p, name %p, length %#lx, flags %#lx stub!\n", node, type, name, length, flags ); + return CR_SUCCESS; +} + +/*********************************************************************** + * CMP_WaitNoPendingInstallEvents (cfgmgr32.@) + */ +DWORD WINAPI CMP_WaitNoPendingInstallEvents( DWORD timeout ) +{ + static BOOL warned = FALSE; + + if (!warned) + { + FIXME( "%ld\n", timeout ); + warned = TRUE; + } + return WAIT_OBJECT_0; +} + +/*********************************************************************** + * CM_Get_Version (cfgmgr32.@) + */ +WORD WINAPI CM_Get_Version( void ) +{ + TRACE( "\n" ); + return 0x0400; +} diff --git a/dlls/cfgmgr32/cfgmgr32.spec b/dlls/cfgmgr32/cfgmgr32.spec index 33bcb1bb32c..df23120954c 100644 --- a/dlls/cfgmgr32/cfgmgr32.spec +++ b/dlls/cfgmgr32/cfgmgr32.spec @@ -4,7 +4,7 @@ @ stub CMP_RegisterServiceNotification @ stub CMP_Register_Notification @ stub CMP_Report_LogOn -@ stdcall CMP_WaitNoPendingInstallEvents(long) setupapi.CMP_WaitNoPendingInstallEvents +@ stdcall CMP_WaitNoPendingInstallEvents(long) @ stub CMP_WaitServicesAvailable @ stub CM_Add_Driver_PackageW @ stub CM_Add_Driver_Package_ExW @@ -18,10 +18,10 @@ @ 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 -@ stdcall CM_Create_DevNodeW(ptr wstr long long) setupapi.CM_Create_DevNodeW +@ stdcall CM_Connect_MachineA(str ptr) +@ stdcall CM_Connect_MachineW(wstr ptr) +@ stdcall CM_Create_DevNodeA(ptr str long long) +@ stdcall CM_Create_DevNodeW(ptr wstr long long) @ stub CM_Create_DevNode_ExA @ stub CM_Create_DevNode_ExW @ stub CM_Create_Range_List @@ -41,7 +41,7 @@ @ stub CM_Detect_Resource_Conflict_Ex @ stub CM_Disable_DevNode @ stub CM_Disable_DevNode_Ex -@ stdcall CM_Disconnect_Machine(long) setupapi.CM_Disconnect_Machine +@ stdcall CM_Disconnect_Machine(long) @ stub CM_Dup_Range_List @ stub CM_Duplicate_PowerScheme @ stub CM_Enable_DevNode @@ -62,8 +62,8 @@ @ 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 +@ stdcall CM_Get_Child(ptr long long) +@ stdcall CM_Get_Child_Ex(ptr long long ptr) @ stdcall CM_Get_Class_Key_NameA(ptr ptr ptr long) @ stdcall CM_Get_Class_Key_NameW(ptr ptr ptr long) @ stdcall CM_Get_Class_Key_Name_ExA(ptr ptr ptr long ptr) @@ -92,8 +92,8 @@ @ stdcall CM_Get_DevNode_Registry_PropertyW(long long ptr ptr ptr long) @ stdcall CM_Get_DevNode_Registry_Property_ExA(long long ptr ptr ptr long ptr) @ stdcall CM_Get_DevNode_Registry_Property_ExW(long long ptr ptr ptr long ptr) -@ stdcall CM_Get_DevNode_Status(ptr ptr long long) setupapi.CM_Get_DevNode_Status -@ stdcall CM_Get_DevNode_Status_Ex(ptr ptr long long ptr) setupapi.CM_Get_DevNode_Status_Ex +@ stdcall CM_Get_DevNode_Status(ptr ptr long long) +@ stdcall CM_Get_DevNode_Status_Ex(ptr ptr long long ptr) @ stdcall CM_Get_Device_IDA(ptr ptr long long) @ stdcall CM_Get_Device_IDW(ptr ptr long long) @ stdcall CM_Get_Device_ID_ExA(ptr ptr long long ptr) @@ -108,8 +108,8 @@ @ stdcall CM_Get_Device_ID_List_Size_ExW(ptr wstr long ptr) @ stdcall CM_Get_Device_ID_Size(ptr ptr long) @ stdcall CM_Get_Device_ID_Size_Ex(ptr ptr long ptr) -@ stdcall CM_Get_Device_Interface_AliasA(str ptr ptr ptr long) setupapi.CM_Get_Device_Interface_AliasA -@ stdcall CM_Get_Device_Interface_AliasW(wstr ptr ptr ptr long) setupapi.CM_Get_Device_Interface_AliasW +@ stdcall CM_Get_Device_Interface_AliasA(str ptr ptr ptr long) +@ stdcall CM_Get_Device_Interface_AliasW(wstr ptr ptr ptr long) @ stub CM_Get_Device_Interface_Alias_ExA @ stub CM_Get_Device_Interface_Alias_ExW @ stdcall CM_Get_Device_Interface_ListA(ptr ptr ptr long long) @@ -142,7 +142,7 @@ @ stub CM_Get_Next_Log_Conf_Ex @ stub CM_Get_Next_Res_Des @ stub CM_Get_Next_Res_Des_Ex -@ stdcall CM_Get_Parent(ptr long long) setupapi.CM_Get_Parent +@ stdcall CM_Get_Parent(ptr long long) @ stub CM_Get_Parent_Ex @ stub CM_Get_Res_Des_Data @ stub CM_Get_Res_Des_Data_Ex @@ -151,9 +151,9 @@ @ 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 +@ stdcall CM_Get_Sibling(ptr long long) +@ stdcall CM_Get_Sibling_Ex(ptr long long ptr) +@ stdcall CM_Get_Version() @ stub CM_Get_Version_Ex @ stub CM_Import_PowerScheme @ stub CM_Install_DevNodeW @@ -197,8 +197,8 @@ @ 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 +@ stdcall CM_Reenumerate_DevNode(ptr long) +@ stdcall CM_Reenumerate_DevNode_Ex(ptr long ptr) @ stub CM_Register_Device_Driver @ stub CM_Register_Device_Driver_Ex @ stub CM_Register_Device_InterfaceA @@ -221,8 +221,8 @@ @ 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 +@ stdcall CM_Set_Class_Registry_PropertyA(ptr long ptr long long ptr) +@ stdcall CM_Set_Class_Registry_PropertyW(ptr long ptr long long ptr) @ stub CM_Set_DevNode_Problem @ stub CM_Set_DevNode_Problem_Ex @ stub CM_Set_DevNode_PropertyW diff --git a/dlls/setupapi/misc.c b/dlls/setupapi/misc.c index bef8bfd7622..9bd47e7efee 100644 --- a/dlls/setupapi/misc.c +++ b/dlls/setupapi/misc.c @@ -799,21 +799,6 @@ void WINAPI pSetupSetGlobalFlags( DWORD flags ) global_flags = flags; } -/*********************************************************************** - * CMP_WaitNoPendingInstallEvents (SETUPAPI.@) - */ -DWORD WINAPI CMP_WaitNoPendingInstallEvents( DWORD dwTimeout ) -{ - static BOOL warned = FALSE; - - if (!warned) - { - FIXME("%ld\n", dwTimeout); - warned = TRUE; - } - return WAIT_OBJECT_0; -} - /*********************************************************************** * AssertFail (SETUPAPI.@) * @@ -1466,12 +1451,3 @@ BOOL WINAPI SetupLogErrorW(LPCWSTR message, LogSeverity severity) free(msg); return ret; } - -/*********************************************************************** - * CM_Get_Version (SETUPAPI.@) - */ -WORD WINAPI CM_Get_Version(void) -{ - TRACE("()\n"); - return 0x0400; -} diff --git a/dlls/setupapi/setupapi.spec b/dlls/setupapi/setupapi.spec index f1ebdb0efa4..908019b6103 100644 --- a/dlls/setupapi/setupapi.spec +++ b/dlls/setupapi/setupapi.spec @@ -7,7 +7,7 @@ @ stub CMP_RegisterNotification @ stub CMP_Report_LogOn @ stub CMP_UnregisterNotification -@ stdcall CMP_WaitNoPendingInstallEvents(long) +@ stdcall CMP_WaitNoPendingInstallEvents(long) cfgmgr32.CMP_WaitNoPendingInstallEvents @ stub CMP_WaitServices @ stub CM_Add_Empty_Log_Conf @ stub CM_Add_Empty_Log_Conf_Ex @@ -18,10 +18,10 @@ @ stub CM_Add_Range @ stub CM_Add_Res_Des @ stub CM_Add_Res_Des_Ex -@ stdcall CM_Connect_MachineA(str ptr) -@ stdcall CM_Connect_MachineW(wstr ptr) -@ stdcall CM_Create_DevNodeA(ptr str long long) -@ stdcall CM_Create_DevNodeW(ptr wstr long long) +@ stdcall CM_Connect_MachineA(str ptr) cfgmgr32.CM_Connect_MachineA +@ stdcall CM_Connect_MachineW(wstr ptr) cfgmgr32.CM_Connect_MachineW +@ stdcall CM_Create_DevNodeA(ptr str long long) cfgmgr32.CM_Create_DevNodeA +@ stdcall CM_Create_DevNodeW(ptr wstr long long) cfgmgr32.CM_Create_DevNodeW @ stub CM_Create_DevNode_ExA @ stub CM_Create_DevNode_ExW @ stub CM_Create_Range_List @@ -34,7 +34,7 @@ @ stub CM_Detect_Resource_Conflict_Ex @ stub CM_Disable_DevNode @ stub CM_Disable_DevNode_Ex -@ stdcall CM_Disconnect_Machine(long) +@ stdcall CM_Disconnect_Machine(long) cfgmgr32.CM_Disconnect_Machine @ stub CM_Dup_Range_List @ stub CM_Enable_DevNode @ stub CM_Enable_DevNode_Ex @@ -53,8 +53,8 @@ @ stub CM_Free_Res_Des @ stub CM_Free_Res_Des_Ex @ stub CM_Free_Res_Des_Handle -@ stdcall CM_Get_Child(ptr long long) -@ stdcall CM_Get_Child_Ex(ptr long long ptr) +@ stdcall CM_Get_Child(ptr long long) cfgmgr32.CM_Get_Child +@ stdcall CM_Get_Child_Ex(ptr long long ptr) cfgmgr32.CM_Get_Child_Ex @ stdcall CM_Get_Class_Key_NameA(ptr ptr ptr long) cfgmgr32.CM_Get_Class_Key_NameA @ stdcall CM_Get_Class_Key_NameW(ptr ptr ptr long) cfgmgr32.CM_Get_Class_Key_NameW @ stdcall CM_Get_Class_Key_Name_ExA(ptr ptr ptr long ptr) cfgmgr32.CM_Get_Class_Key_Name_ExA @@ -73,8 +73,8 @@ @ stdcall CM_Get_DevNode_Registry_PropertyW(long long ptr ptr ptr long) cfgmgr32.CM_Get_DevNode_Registry_PropertyW @ stdcall CM_Get_DevNode_Registry_Property_ExA(long long ptr ptr ptr long ptr) cfgmgr32.CM_Get_DevNode_Registry_Property_ExA @ stdcall CM_Get_DevNode_Registry_Property_ExW(long long ptr ptr ptr long ptr) cfgmgr32.CM_Get_DevNode_Registry_Property_ExW -@ stdcall CM_Get_DevNode_Status(ptr ptr long long) -@ stdcall CM_Get_DevNode_Status_Ex(ptr ptr long long ptr) +@ stdcall CM_Get_DevNode_Status(ptr ptr long long) cfgmgr32.CM_Get_DevNode_Status +@ stdcall CM_Get_DevNode_Status_Ex(ptr ptr long long ptr) cfgmgr32.CM_Get_DevNode_Status_Ex @ stdcall CM_Get_Device_IDA(ptr ptr long long) cfgmgr32.CM_Get_Device_IDA @ stdcall CM_Get_Device_IDW(ptr ptr long long) cfgmgr32.CM_Get_Device_IDW @ stdcall CM_Get_Device_ID_ExA(ptr ptr long long ptr) cfgmgr32.CM_Get_Device_ID_ExA @@ -89,8 +89,8 @@ @ stdcall CM_Get_Device_ID_List_Size_ExW(ptr wstr long ptr) cfgmgr32.CM_Get_Device_ID_List_Size_ExW @ stdcall CM_Get_Device_ID_Size(ptr ptr long) cfgmgr32.CM_Get_Device_ID_Size @ stdcall CM_Get_Device_ID_Size_Ex(ptr ptr long ptr) cfgmgr32.CM_Get_Device_ID_Size_Ex -@ stdcall CM_Get_Device_Interface_AliasA(str ptr ptr ptr long) -@ stdcall CM_Get_Device_Interface_AliasW(wstr ptr ptr ptr long) +@ stdcall CM_Get_Device_Interface_AliasA(str ptr ptr ptr long) cfgmgr32.CM_Get_Device_Interface_AliasA +@ stdcall CM_Get_Device_Interface_AliasW(wstr ptr ptr ptr long) cfgmgr32.CM_Get_Device_Interface_AliasW @ stub CM_Get_Device_Interface_Alias_ExA @ stub CM_Get_Device_Interface_Alias_ExW @ stdcall CM_Get_Device_Interface_ListA(ptr ptr ptr long long) cfgmgr32.CM_Get_Device_Interface_ListA @@ -119,15 +119,15 @@ @ stub CM_Get_Next_Log_Conf_Ex @ stub CM_Get_Next_Res_Des @ stub CM_Get_Next_Res_Des_Ex -@ stdcall CM_Get_Parent(ptr long long) +@ stdcall CM_Get_Parent(ptr long long) cfgmgr32.CM_Get_Parent @ stub CM_Get_Parent_Ex @ stub CM_Get_Res_Des_Data @ stub CM_Get_Res_Des_Data_Ex @ stub CM_Get_Res_Des_Data_Size @ stub CM_Get_Res_Des_Data_Size_Ex -@ stdcall CM_Get_Sibling(ptr long long) -@ stdcall CM_Get_Sibling_Ex(ptr long long ptr) -@ stdcall CM_Get_Version() +@ stdcall CM_Get_Sibling(ptr long long) cfgmgr32.CM_Get_Sibling +@ stdcall CM_Get_Sibling_Ex(ptr long long ptr) cfgmgr32.CM_Get_Sibling_Ex +@ stdcall CM_Get_Version() cfgmgr32.CM_Get_Version @ stub CM_Get_Version_Ex @ stub CM_Intersect_Range_List @ stub CM_Invert_Range_List @@ -158,8 +158,8 @@ @ stub CM_Query_Arbitrator_Free_Size_Ex @ stub CM_Query_Remove_SubTree @ stub CM_Query_Remove_SubTree_Ex -@ stdcall CM_Reenumerate_DevNode(ptr long) -@ stdcall CM_Reenumerate_DevNode_Ex(ptr long ptr) +@ stdcall CM_Reenumerate_DevNode(ptr long) cfgmgr32.CM_Reenumerate_DevNode +@ stdcall CM_Reenumerate_DevNode_Ex(ptr long ptr) cfgmgr32.CM_Reenumerate_DevNode_Ex @ stub CM_Register_Device_Driver @ stub CM_Register_Device_Driver_Ex @ stub CM_Register_Device_InterfaceA @@ -170,15 +170,15 @@ @ stub CM_Remove_SubTree_Ex @ stub CM_Remove_Unmarked_Children @ stub CM_Remove_Unmarked_Children_Ex -@ stdcall CM_Request_Device_EjectA(ptr ptr ptr long long) -@ stdcall CM_Request_Device_EjectW(ptr ptr ptr long long) +@ stdcall CM_Request_Device_EjectA(ptr ptr ptr long long) cfgmgr32.CM_Request_Device_EjectA +@ stdcall CM_Request_Device_EjectW(ptr ptr ptr long long) cfgmgr32.CM_Request_Device_EjectW @ stub CM_Request_Eject_PC @ stub CM_Reset_Children_Marks @ stub CM_Reset_Children_Marks_Ex @ stub CM_Run_Detection @ stub CM_Run_Detection_Ex -@ stdcall CM_Set_Class_Registry_PropertyA(ptr long ptr long long ptr) -@ stdcall CM_Set_Class_Registry_PropertyW(ptr long ptr long long ptr) +@ stdcall CM_Set_Class_Registry_PropertyA(ptr long ptr long long ptr) cfgmgr32.CM_Set_Class_Registry_PropertyA +@ stdcall CM_Set_Class_Registry_PropertyW(ptr long ptr long long ptr) cfgmgr32.CM_Set_Class_Registry_PropertyW @ stub CM_Set_DevNode_Problem @ stub CM_Set_DevNode_Problem_Ex @ stub CM_Set_DevNode_Registry_PropertyA diff --git a/dlls/setupapi/stubs.c b/dlls/setupapi/stubs.c index eccb82295c8..3b0f4ac8295 100644 --- a/dlls/setupapi/stubs.c +++ b/dlls/setupapi/stubs.c @@ -32,83 +32,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(setupapi); -/*********************************************************************** - * CM_Connect_MachineA (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Connect_MachineA(PCSTR name, PHMACHINE machine) -{ - FIXME("(%s %p) stub\n", name, machine); - return CR_ACCESS_DENIED; -} - -/*********************************************************************** - * CM_Connect_MachineW (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Connect_MachineW(PCWSTR name, PHMACHINE machine) -{ - FIXME("stub\n"); - return CR_ACCESS_DENIED; -} - -/*********************************************************************** - * CM_Create_DevNodeA (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Create_DevNodeA(PDEVINST pdnDevInst, DEVINSTID_A pDeviceID, DEVINST dnParent, ULONG ulFlags) -{ - FIXME("(%p %s 0x%08lx 0x%08lx) stub\n", pdnDevInst, pDeviceID, dnParent, ulFlags); - return CR_SUCCESS; -} - -/*********************************************************************** - * CM_Create_DevNodeW (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Create_DevNodeW(PDEVINST pdnDevInst, DEVINSTID_W pDeviceID, DEVINST dnParent, ULONG ulFlags) -{ - FIXME("(%p %s 0x%08lx 0x%08lx) stub\n", pdnDevInst, debugstr_w(pDeviceID), dnParent, ulFlags); - return CR_SUCCESS; -} - -/*********************************************************************** - * CM_Disconnect_Machine (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Disconnect_Machine(HMACHINE handle) -{ - FIXME("stub\n"); - return CR_SUCCESS; - -} - -/*********************************************************************** - * CM_Get_Child (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Child( - PDEVINST pdnDevInst, DEVINST dnDevInst, ULONG ulFlags) -{ - FIXME("%p 0x%08lx 0x%08lx: stub\n", pdnDevInst, dnDevInst, ulFlags); - return CR_SUCCESS; -} - -/*********************************************************************** - * CM_Get_Child_Ex (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Child_Ex( - PDEVINST pdnDevInst, DEVINST dnDevInst, ULONG ulFlags, HMACHINE hMachine) -{ - FIXME("%p 0x%08lx 0x%08lx %p: stub\n", pdnDevInst, dnDevInst, ulFlags, hMachine); - return CR_SUCCESS; -} - -/*********************************************************************** - * CM_Get_Parent (SETUPAPI.@) - */ -DWORD WINAPI CM_Get_Parent(PDEVINST pdnDevInst, DEVINST dnDevInst, ULONG ulFlags) -{ - FIXME("%p 0x%08lx 0x%08lx stub\n", pdnDevInst, dnDevInst, ulFlags); - if(pdnDevInst) - *pdnDevInst = 0; - return CR_NO_SUCH_DEVNODE; -} - /*********************************************************************** * SetupInitializeFileLogW(SETUPAPI.@) */ @@ -235,97 +158,6 @@ BOOL WINAPI SetupDiGetClassImageIndex(PSP_CLASSIMAGELIST_DATA ClassImageListData return FALSE; } -/*********************************************************************** - * CM_Get_Device_Interface_AliasA (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Device_Interface_AliasA(const char *interface, GUID *class, - char *name, ULONG *len, ULONG flags) -{ - FIXME("%s %p %p %p 0x%08lx: stub\n", debugstr_a(interface), class, name, len, flags); - return CR_FAILURE; -} - -/*********************************************************************** - * CM_Get_Device_Interface_AliasW (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Device_Interface_AliasW(const WCHAR *interface, GUID *class, - WCHAR *name, ULONG *len, ULONG flags) -{ - FIXME("%s %p %p %p 0x%08lx: stub\n", debugstr_w(interface), class, name, len, flags); - return CR_FAILURE; -} - -/*********************************************************************** - * CM_Get_DevNode_Status (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_DevNode_Status(ULONG *status, ULONG *problem, DEVINST dev, - ULONG flags) -{ - return CM_Get_DevNode_Status_Ex(status, problem, dev, flags, NULL); -} - -/*********************************************************************** - * CM_Get_DevNode_Status_Ex (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_DevNode_Status_Ex(ULONG *status, ULONG *problem, DEVINST dev, - ULONG flags, HMACHINE machine) -{ - FIXME("%p %p 0x%08lx 0x%08lx %p: stub\n", status, problem, dev, flags, machine); - return CR_SUCCESS; -} - -/*********************************************************************** - * CM_Get_Sibling (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Sibling( - PDEVINST pdnDevInst, DEVINST DevInst, ULONG ulFlags) -{ - FIXME("%p 0x%08lx 0x%08lx: stub\n", pdnDevInst, DevInst, ulFlags); - return CR_FAILURE; -} - -/*********************************************************************** - * CM_Get_Sibling_Ex (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Get_Sibling_Ex( - PDEVINST pdnDevInst, DEVINST DevInst, ULONG ulFlags, HMACHINE hMachine) -{ - FIXME("%p 0x%08lx 0x%08lx %p: stub\n", pdnDevInst, DevInst, ulFlags, hMachine); - return CR_FAILURE; -} - -CONFIGRET WINAPI CM_Reenumerate_DevNode(DEVINST dnDevInst, ULONG ulFlags) -{ - FIXME("0x%08lx 0x%08lx: stub\n", dnDevInst, ulFlags); - return CR_FAILURE; -} - -CONFIGRET WINAPI CM_Reenumerate_DevNode_Ex(DEVINST dnDevInst, ULONG ulFlags, HMACHINE machine) -{ - FIXME("0x%08lx 0x%08lx %p: stub\n", dnDevInst, ulFlags, machine); - return CR_FAILURE; -} - -/*********************************************************************** - * CM_Set_Class_Registry_PropertyA (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Set_Class_Registry_PropertyA(LPGUID class, ULONG prop, LPCVOID buf, ULONG len, - ULONG flags, HMACHINE machine) -{ - FIXME("%p %lu %p %lu 0x%08lx %p: stub\n", class, prop, buf, len, flags, machine); - return CR_FAILURE; -} - -/*********************************************************************** - * CM_Set_Class_Registry_PropertyW (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Set_Class_Registry_PropertyW(LPGUID class, ULONG prop, LPCVOID buf, ULONG len, - ULONG flags, HMACHINE machine) -{ - FIXME("%p %lu %p %lu 0x%08lx %p: stub\n", class, prop, buf, len, flags, machine); - return CR_FAILURE; -} - /*********************************************************************** * SetupLogFileW (SETUPAPI.@) */ @@ -426,24 +258,6 @@ BOOL WINAPI SetupDiSetSelectedDevice(HDEVINFO SetupDiSetSelectedDevice, PSP_DEVI return TRUE; } -/*********************************************************************** - * CM_Request_Device_EjectA (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Request_Device_EjectA(DEVINST dev, PPNP_VETO_TYPE type, LPSTR name, ULONG length, ULONG flags) -{ - FIXME("(0x%08lx, %p, %p, %lu, 0x%08lx) stub\n", dev, type, name, length, flags); - return CR_SUCCESS; -} - -/*********************************************************************** - * CM_Request_Device_EjectW (SETUPAPI.@) - */ -CONFIGRET WINAPI CM_Request_Device_EjectW(DEVINST dev, PPNP_VETO_TYPE type, LPWSTR name, ULONG length, ULONG flags) -{ - FIXME("(0x%08lx, %p, %p, %lu, 0x%08lx) stub\n", dev, type, name, length, flags); - return CR_SUCCESS; -} - BOOL WINAPI SetupDiGetClassRegistryPropertyW(const GUID *class, DWORD prop, DWORD *datatype, BYTE *buff, DWORD size, DWORD *req_size, const WCHAR *name, VOID *reserved) { -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10584
v3: Actually workaround the Windows CI failures, looks like there's some weird HID devices there, possibly from HyperV or something. I don't think the ntoskrnl.exe Linux failure is related, it wasn't failing in the previous pushes and I only changed cfgmgr32 tests. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10584#note_135298
participants (2)
-
Rémi Bernon -
Rémi Bernon (@rbernon)