From e53f1ac93249bf78a57924e8f5db48d4ee773bfe Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 25 Feb 2017 12:45:05 +0000 Subject: [PATCH] [SETUPAPI] - Implement CM_Get_Class_Registry_PropertyA(). - Move mapping of poperty type to registry value type into a separate function and use it in CM_Get_Class_Registry_PropertyA(), CM_Set_DevNode_Registry_Property_ExA() and CM_Set_DevNode_Registry_Property_ExW(). svn path=/trunk/; revision=73904 --- reactos/dll/win32/setupapi/cfgmgr.c | 283 ++++++++++++---------------- 1 file changed, 119 insertions(+), 164 deletions(-) diff --git a/reactos/dll/win32/setupapi/cfgmgr.c b/reactos/dll/win32/setupapi/cfgmgr.c index 542c98c826b..990692dc0c0 100644 --- a/reactos/dll/win32/setupapi/cfgmgr.c +++ b/reactos/dll/win32/setupapi/cfgmgr.c @@ -95,6 +95,59 @@ RpcStatusToCmStatus(RPC_STATUS Status) } +static +ULONG +GetRegistryPropertyType( + ULONG ulProperty) +{ + switch (ulProperty) + { + case CM_DRP_DEVICEDESC: + case CM_DRP_SERVICE: + case CM_DRP_CLASS: + case CM_DRP_CLASSGUID: + case CM_DRP_DRIVER: + case CM_DRP_MFG: + case CM_DRP_FRIENDLYNAME: + case CM_DRP_LOCATION_INFORMATION: + case CM_DRP_PHYSICAL_DEVICE_OBJECT_NAME: + case CM_DRP_ENUMERATOR_NAME: + case CM_DRP_SECURITY_SDS: + case CM_DRP_UI_NUMBER_DESC_FORMAT: + return REG_SZ; + + case CM_DRP_HARDWAREID: + case CM_DRP_COMPATIBLEIDS: + case CM_DRP_UPPERFILTERS: + case CM_DRP_LOWERFILTERS: + return REG_MULTI_SZ; + + case CM_DRP_CONFIGFLAGS: + case CM_DRP_CAPABILITIES: + case CM_DRP_UI_NUMBER: + case CM_DRP_LEGACYBUSTYPE: + case CM_DRP_BUSNUMBER: + case CM_DRP_DEVTYPE: + case CM_DRP_EXCLUSIVE: + case CM_DRP_CHARACTERISTICS: + case CM_DRP_ADDRESS: + case CM_DRP_REMOVAL_POLICY: + case CM_DRP_REMOVAL_POLICY_HW_DEFAULT: + case CM_DRP_REMOVAL_POLICY_OVERRIDE: + case CM_DRP_INSTALL_STATE: + return REG_DWORD; + + case CM_DRP_BUSTYPEGUID: + case CM_DRP_SECURITY: + case CM_DRP_DEVICE_POWER_DATA: + default: + return REG_BINARY; + } + + return REG_NONE; +} + + /*********************************************************************** * CMP_Init_Detection [SETUPAPI.@] */ @@ -1689,10 +1742,68 @@ CONFIGRET WINAPI CM_Get_Class_Registry_PropertyA( LPGUID ClassGuid, ULONG ulProperty, PULONG pulRegDataType, PVOID Buffer, PULONG pulLength, ULONG ulFlags, HMACHINE hMachine) { - FIXME("%p %lu %p %p %p %lx %lx\n", + PWSTR BufferW = NULL; + ULONG ulLength = 0; + ULONG ulType; + CONFIGRET ret; + + TRACE("%p %lu %p %p %p %lx %lx\n", ClassGuid, ulProperty, pulRegDataType, Buffer, pulLength, ulFlags, hMachine); - return CR_CALL_NOT_IMPLEMENTED; + + if (pulLength == NULL) + return CR_INVALID_POINTER; + + if (ulProperty < CM_CRP_MIN || ulProperty > CM_CRP_MAX) + return CR_INVALID_PROPERTY; + + ulType = GetRegistryPropertyType(ulProperty); + if (ulType == REG_SZ || ulType == REG_MULTI_SZ) + { + /* Get the required buffer size */ + ret = CM_Get_Class_Registry_PropertyW(ClassGuid, ulProperty, pulRegDataType, + NULL, &ulLength, ulFlags, hMachine); + if (ret != CR_BUFFER_SMALL) + return ret; + + /* Allocate the unicode buffer */ + BufferW = HeapAlloc(GetProcessHeap(), 0, ulLength); + if (BufferW == NULL) + return CR_OUT_OF_MEMORY; + + /* Get the property */ + ret = CM_Get_Class_Registry_PropertyW(ClassGuid, ulProperty, pulRegDataType, + BufferW, &ulLength, ulFlags, hMachine); + if (ret != CR_SUCCESS) + { + HeapFree(GetProcessHeap(), 0, BufferW); + return ret; + } + + /* Do W->A conversion */ + *pulLength = WideCharToMultiByte(CP_ACP, + 0, + BufferW, + lstrlenW(BufferW) + 1, + Buffer, + *pulLength, + NULL, + NULL); + + /* Release the unicode buffer */ + HeapFree(GetProcessHeap(), 0, BufferW); + + if (*pulLength == 0) + ret = CR_FAILURE; + } + else + { + /* Get the property */ + ret = CM_Get_Class_Registry_PropertyW(ClassGuid, ulProperty, pulRegDataType, + Buffer, pulLength, ulFlags, hMachine); + } + + return ret; } @@ -5435,6 +5546,9 @@ CONFIGRET WINAPI CM_Set_DevNode_Registry_Property_ExA( if (Buffer == NULL && ulLength != 0) return CR_INVALID_POINTER; + if (ulProperty < CM_DRP_MIN || ulProperty > CM_DRP_MAX) + return CR_INVALID_PROPERTY; + if (Buffer == NULL) { ret = CM_Set_DevNode_Registry_Property_ExW(dnDevInst, @@ -5447,87 +5561,7 @@ CONFIGRET WINAPI CM_Set_DevNode_Registry_Property_ExA( else { /* Get property type */ - switch (ulProperty) - { - case CM_DRP_DEVICEDESC: - ulType = REG_SZ; - break; - - case CM_DRP_HARDWAREID: - ulType = REG_MULTI_SZ; - break; - - case CM_DRP_COMPATIBLEIDS: - ulType = REG_MULTI_SZ; - break; - - case CM_DRP_SERVICE: - ulType = REG_SZ; - break; - - case CM_DRP_CLASS: - ulType = REG_SZ; - break; - - case CM_DRP_CLASSGUID: - ulType = REG_SZ; - break; - - case CM_DRP_DRIVER: - ulType = REG_SZ; - break; - - case CM_DRP_CONFIGFLAGS: - ulType = REG_DWORD; - break; - - case CM_DRP_MFG: - ulType = REG_SZ; - break; - - case CM_DRP_FRIENDLYNAME: - ulType = REG_SZ; - break; - - case CM_DRP_LOCATION_INFORMATION: - ulType = REG_SZ; - break; - - case CM_DRP_UPPERFILTERS: - ulType = REG_MULTI_SZ; - break; - - case CM_DRP_LOWERFILTERS: - ulType = REG_MULTI_SZ; - break; - - case CM_DRP_SECURITY: - ulType = REG_BINARY; - break; - - case CM_DRP_DEVTYPE: - ulType = REG_DWORD; - break; - - case CM_DRP_EXCLUSIVE: - ulType = REG_DWORD; - break; - - case CM_DRP_CHARACTERISTICS: - ulType = REG_DWORD; - break; - - case CM_DRP_UI_NUMBER_DESC_FORMAT: - ulType = REG_SZ; - break; - - case CM_DRP_REMOVAL_POLICY_OVERRIDE: - ulType = REG_DWORD; - break; - - default: - return CR_INVALID_PROPERTY; - } + ulType = GetRegistryPropertyType(ulProperty); /* Allocate buffer if needed */ if (ulType == REG_SZ || @@ -5623,87 +5657,8 @@ CONFIGRET WINAPI CM_Set_DevNode_Registry_Property_ExW( if (lpDevInst == NULL) return CR_INVALID_DEVNODE; - switch (ulProperty) - { - case CM_DRP_DEVICEDESC: - ulType = REG_SZ; - break; - - case CM_DRP_HARDWAREID: - ulType = REG_MULTI_SZ; - break; - - case CM_DRP_COMPATIBLEIDS: - ulType = REG_MULTI_SZ; - break; - - case CM_DRP_SERVICE: - ulType = REG_SZ; - break; - - case CM_DRP_CLASS: - ulType = REG_SZ; - break; - - case CM_DRP_CLASSGUID: - ulType = REG_SZ; - break; - - case CM_DRP_DRIVER: - ulType = REG_SZ; - break; - - case CM_DRP_CONFIGFLAGS: - ulType = REG_DWORD; - break; - - case CM_DRP_MFG: - ulType = REG_SZ; - break; - - case CM_DRP_FRIENDLYNAME: - ulType = REG_SZ; - break; - - case CM_DRP_LOCATION_INFORMATION: - ulType = REG_SZ; - break; - - case CM_DRP_UPPERFILTERS: - ulType = REG_MULTI_SZ; - break; - - case CM_DRP_LOWERFILTERS: - ulType = REG_MULTI_SZ; - break; - - case CM_DRP_SECURITY: - ulType = REG_BINARY; - break; - - case CM_DRP_DEVTYPE: - ulType = REG_DWORD; - break; - - case CM_DRP_EXCLUSIVE: - ulType = REG_DWORD; - break; - - case CM_DRP_CHARACTERISTICS: - ulType = REG_DWORD; - break; - - case CM_DRP_UI_NUMBER_DESC_FORMAT: - ulType = REG_SZ; - break; - - case CM_DRP_REMOVAL_POLICY_OVERRIDE: - ulType = REG_DWORD; - break; - - default: - return CR_INVALID_PROPERTY; - } + /* Get property type */ + ulType = GetRegistryPropertyType(ulProperty); RpcTryExcept {