Module: wine Branch: master Commit: 81d2b419b87214ead8e0b2d8dd696536b45d82aa URL: https://source.winehq.org/git/wine.git/?a=commit;h=81d2b419b87214ead8e0b2d8d...
Author: Zebediah Figura z.figura12@gmail.com Date: Tue Nov 27 19:55:36 2018 -0600
setupapi: Avoid unnecessary buffer allocation in SetupDiGetDeviceInstanceIdA().
Signed-off-by: Zebediah Figura z.figura12@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/setupapi/devinst.c | 64 +++++++++++++------------------------------------ 1 file changed, 16 insertions(+), 48 deletions(-)
diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c index a9145ad..be7ce64 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -1607,57 +1607,25 @@ BOOL WINAPI SetupDiEnumDeviceInfo(HDEVINFO devinfo, DWORD index, SP_DEVINFO_DATA /*********************************************************************** * SetupDiGetDeviceInstanceIdA (SETUPAPI.@) */ -BOOL WINAPI SetupDiGetDeviceInstanceIdA( - HDEVINFO DeviceInfoSet, - PSP_DEVINFO_DATA DeviceInfoData, - PSTR DeviceInstanceId, - DWORD DeviceInstanceIdSize, - PDWORD RequiredSize) +BOOL WINAPI SetupDiGetDeviceInstanceIdA(HDEVINFO devinfo, SP_DEVINFO_DATA *device_data, + char *id, DWORD size, DWORD *needed) { - BOOL ret = FALSE; - DWORD size; - PWSTR instanceId; - - TRACE("%p %p %p %d %p\n", DeviceInfoSet, DeviceInfoData, DeviceInstanceId, - DeviceInstanceIdSize, RequiredSize); - - SetupDiGetDeviceInstanceIdW(DeviceInfoSet, - DeviceInfoData, - NULL, - 0, - &size); - if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) + WCHAR idW[MAX_DEVICE_ID_LEN]; + + TRACE("devinfo %p, device_data %p, id %p, size %d, needed %p.\n", + devinfo, device_data, id, size, needed); + + if (!SetupDiGetDeviceInstanceIdW(devinfo, device_data, idW, ARRAY_SIZE(idW), NULL)) return FALSE; - instanceId = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR)); - if (instanceId) - { - ret = SetupDiGetDeviceInstanceIdW(DeviceInfoSet, - DeviceInfoData, - instanceId, - size, - &size); - if (ret) - { - int len = WideCharToMultiByte(CP_ACP, 0, instanceId, -1, - DeviceInstanceId, - DeviceInstanceIdSize, NULL, NULL);
- if (!len) - ret = FALSE; - else - { - if (len > DeviceInstanceIdSize) - { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - ret = FALSE; - } - if (RequiredSize) - *RequiredSize = len; - } - } - HeapFree(GetProcessHeap(), 0, instanceId); - } - return ret; + if (needed) + *needed = WideCharToMultiByte(CP_ACP, 0, idW, -1, NULL, 0, NULL, NULL); + + if (size && WideCharToMultiByte(CP_ACP, 0, idW, -1, id, size, NULL, NULL)) + return TRUE; + + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return FALSE; }
/***********************************************************************