[DEVMGR]
authorGed Murphy <gedmurphy@reactos.org>
Thu, 15 Oct 2015 21:29:11 +0000 (21:29 +0000)
committerGed Murphy <gedmurphy@reactos.org>
Thu, 15 Oct 2015 21:29:11 +0000 (21:29 +0000)
- Move all public interface functions to api.cpp
- Implement DeviceManager_ExecuteA

svn path=/trunk/; revision=69548

reactos/dll/win32/devmgr/api.cpp
reactos/dll/win32/devmgr/properties/advprop.cpp
reactos/dll/win32/devmgr/properties/misc.cpp
reactos/dll/win32/devmgr/properties/properties.h

index 423aa00..b053bce 100644 (file)
@@ -3,7 +3,7 @@
 * COPYRIGHT:       See COPYING in the top level directory
 * PROJECT:         ReactOS devmgr.dll
 * FILE:            dll/win32/devmgr/api.cpp
-* PURPOSE:         devmgr.dll stubs
+* PURPOSE:         devmgr.dll interface
 * PROGRAMMER:      Thomas Weidenmueller (w3seek@users.sourceforge.net)
 *                  Ged Murphy (gedmurphy@reactos.org)
 * NOTES:           
 #include "precomp.h"
 #include <devmgr/devmgr.h>
 #include "devmgmt/MainWindow.h"
+#include "properties/properties.h"
 
 HINSTANCE hDllInstance = NULL;
 
-WINE_DEFAULT_DEBUG_CHANNEL(devmgr);
+
+
+/***************************************************************************
+* NAME                                                         EXPORTED
+*      DeviceAdvancedPropertiesW
+*
+* DESCRIPTION
+*   Invokes the device properties dialog, this version may add some property pages
+*   for some devices
+*
+* ARGUMENTS
+*   hWndParent:    Handle to the parent window
+*   lpMachineName: Machine Name, NULL is the local machine
+*   lpDeviceID:    Specifies the device whose properties are to be shown
+*
+* RETURN VALUE
+*   Always returns -1, a call to GetLastError returns 0 if successful
+*
+* @implemented
+*/
+INT_PTR
+WINAPI
+DeviceAdvancedPropertiesW(IN HWND hWndParent  OPTIONAL,
+                          IN LPCWSTR lpMachineName  OPTIONAL,
+                          IN LPCWSTR lpDeviceID)
+{
+    HDEVINFO hDevInfo;
+    SP_DEVINFO_DATA DevInfoData;
+    HINSTANCE hComCtl32;
+    INT_PTR Ret = -1;
+
+    if (lpDeviceID == NULL)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
+    /* dynamically load comctl32 */
+    hComCtl32 = LoadAndInitComctl32();
+    if (hComCtl32 != NULL)
+    {
+        hDevInfo = SetupDiCreateDeviceInfoListEx(NULL,
+                                                 hWndParent,
+                                                 lpMachineName,
+                                                 NULL);
+        if (hDevInfo != INVALID_HANDLE_VALUE)
+        {
+            DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
+            if (SetupDiOpenDeviceInfo(hDevInfo,
+                                      lpDeviceID,
+                                      hWndParent,
+                                      0,
+                                      &DevInfoData))
+            {
+                Ret = DisplayDeviceAdvancedProperties(hWndParent,
+                                                      lpDeviceID,
+                                                      hDevInfo,
+                                                      &DevInfoData,
+                                                      hComCtl32,
+                                                      lpMachineName,
+                                                      0);
+            }
+
+            SetupDiDestroyDeviceInfoList(hDevInfo);
+        }
+
+        FreeLibrary(hComCtl32);
+    }
+
+    return Ret;
+}
+
+
+/***************************************************************************
+* NAME                                                         EXPORTED
+*      DeviceAdvancedPropertiesA
+*
+* DESCRIPTION
+*   Invokes the device properties dialog, this version may add some property pages
+*   for some devices
+*
+* ARGUMENTS
+*   hWndParent:    Handle to the parent window
+*   lpMachineName: Machine Name, NULL is the local machine
+*   lpDeviceID:    Specifies the device whose properties are to be shown
+*
+* RETURN VALUE
+*   Always returns -1, a call to GetLastError returns 0 if successful
+*
+* @implemented
+*/
+INT_PTR
+WINAPI
+DeviceAdvancedPropertiesA(IN HWND hWndParent  OPTIONAL,
+                          IN LPCSTR lpMachineName  OPTIONAL,
+                          IN LPCSTR lpDeviceID)
+{
+    LPWSTR lpMachineNameW = NULL;
+    LPWSTR lpDeviceIDW = NULL;
+    INT_PTR Ret = -1;
+
+    if (lpMachineName != NULL)
+    {
+        if (!(lpMachineNameW = ConvertMultiByteToUnicode(lpMachineName,
+                                                         CP_ACP)))
+        {
+            goto Cleanup;
+        }
+    }
+    if (lpDeviceID != NULL)
+    {
+        if (!(lpDeviceIDW = ConvertMultiByteToUnicode(lpDeviceID,
+                                                      CP_ACP)))
+        {
+            goto Cleanup;
+        }
+    }
+
+    Ret = DeviceAdvancedPropertiesW(hWndParent,
+                                    lpMachineNameW,
+                                    lpDeviceIDW);
+
+Cleanup:
+    if (lpMachineNameW != NULL)
+    {
+        HeapFree(GetProcessHeap(),
+                 0,
+                 lpMachineNameW);
+    }
+    if (lpDeviceIDW != NULL)
+    {
+        HeapFree(GetProcessHeap(),
+                 0,
+                 lpDeviceIDW);
+    }
+
+    return Ret;
+}
+
+
+/***************************************************************************
+* NAME                                                         EXPORTED
+*      DevicePropertiesExA
+*
+* DESCRIPTION
+*   Invokes the extended device properties dialog
+*
+* ARGUMENTS
+*   hWndParent:    Handle to the parent window
+*   lpMachineName: Machine Name, NULL is the local machine
+*   lpDeviceID:    Specifies the device whose properties are to be shown, optional if
+*                  bShowDevMgr is nonzero
+*   dwFlags:       This parameter can be a combination of the following flags:
+*                  * DPF_DEVICE_STATUS_ACTION: Only valid if bShowDevMgr, causes
+*                                              the default device status action button
+*                                              to be clicked (Troubleshoot, Enable
+*                                              Device, etc)
+*   bShowDevMgr:   If non-zero it displays the device manager instead of
+*                  the advanced device property dialog
+*
+* RETURN VALUE
+*   1:  if bShowDevMgr is non-zero and no error occured
+*   -1: a call to GetLastError returns 0 if successful
+*
+* @implemented
+*/
+INT_PTR
+WINAPI
+DevicePropertiesExA(IN HWND hWndParent  OPTIONAL,
+                    IN LPCSTR lpMachineName  OPTIONAL,
+                    IN LPCSTR lpDeviceID  OPTIONAL,
+                    IN DWORD dwFlags  OPTIONAL,
+                    IN BOOL bShowDevMgr)
+{
+    LPWSTR lpMachineNameW = NULL;
+    LPWSTR lpDeviceIDW = NULL;
+    INT_PTR Ret = -1;
+
+    if (lpMachineName != NULL)
+    {
+        if (!(lpMachineNameW = ConvertMultiByteToUnicode(lpMachineName,
+                                                         CP_ACP)))
+        {
+            goto Cleanup;
+        }
+    }
+    if (lpDeviceID != NULL)
+    {
+        if (!(lpDeviceIDW = ConvertMultiByteToUnicode(lpDeviceID,
+                                                      CP_ACP)))
+        {
+            goto Cleanup;
+        }
+    }
+
+    Ret = DevicePropertiesExW(hWndParent,
+                              lpMachineNameW,
+                              lpDeviceIDW,
+                              dwFlags,
+                              bShowDevMgr);
+
+Cleanup:
+    if (lpMachineNameW != NULL)
+    {
+        HeapFree(GetProcessHeap(),
+                 0,
+                 lpMachineNameW);
+    }
+    if (lpDeviceIDW != NULL)
+    {
+        HeapFree(GetProcessHeap(),
+                 0,
+                 lpDeviceIDW);
+    }
+
+    return Ret;
+}
+
+
+/***************************************************************************
+* NAME                                                         EXPORTED
+*      DevicePropertiesExW
+*
+* DESCRIPTION
+*   Invokes the extended device properties dialog
+*
+* ARGUMENTS
+*   hWndParent:    Handle to the parent window
+*   lpMachineName: Machine Name, NULL is the local machine
+*   lpDeviceID:    Specifies the device whose properties are to be shown, optional if
+*                  bShowDevMgr is nonzero
+*   dwFlags:       This parameter can be a combination of the following flags:
+*                  * DPF_DEVICE_STATUS_ACTION: Only valid if bShowDevMgr, causes
+*                                              the default device status action button
+*                                              to be clicked (Troubleshoot, Enable
+*                                              Device, etc)
+*   bShowDevMgr:   If non-zero it displays the device manager instead of
+*                  the advanced device property dialog
+*
+* RETURN VALUE
+*   1:  if bShowDevMgr is non-zero and no error occured
+*   -1: a call to GetLastError returns 0 if successful
+*
+* @implemented
+*/
+INT_PTR
+WINAPI
+DevicePropertiesExW(IN HWND hWndParent  OPTIONAL,
+                    IN LPCWSTR lpMachineName  OPTIONAL,
+                    IN LPCWSTR lpDeviceID  OPTIONAL,
+                    IN DWORD dwFlags  OPTIONAL,
+                    IN BOOL bShowDevMgr)
+{
+    INT_PTR Ret = -1;
+
+    if (dwFlags & ~(DPF_EXTENDED | DPF_DEVICE_STATUS_ACTION))
+    {
+        FIXME("DevPropertiesExW: Invalid flags: 0x%x\n",
+              dwFlags & ~(DPF_EXTENDED | DPF_DEVICE_STATUS_ACTION));
+        SetLastError(ERROR_INVALID_FLAGS);
+        return -1;
+    }
+
+    if (bShowDevMgr)
+    {
+        FIXME("DevPropertiesExW doesn't support bShowDevMgr!\n");
+        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+    }
+    else
+    {
+        HDEVINFO hDevInfo;
+        SP_DEVINFO_DATA DevInfoData;
+        HINSTANCE hComCtl32;
+
+        if (lpDeviceID == NULL)
+        {
+            SetLastError(ERROR_INVALID_PARAMETER);
+            return -1;
+        }
+
+        /* dynamically load comctl32 */
+        hComCtl32 = LoadAndInitComctl32();
+        if (hComCtl32 != NULL)
+        {
+            hDevInfo = SetupDiCreateDeviceInfoListEx(NULL,
+                                                     hWndParent,
+                                                     lpMachineName,
+                                                     NULL);
+            if (hDevInfo != INVALID_HANDLE_VALUE)
+            {
+                DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
+                if (SetupDiOpenDeviceInfo(hDevInfo,
+                                          lpDeviceID,
+                                          hWndParent,
+                                          0,
+                                          &DevInfoData))
+                {
+                    Ret = DisplayDeviceAdvancedProperties(hWndParent,
+                                                          lpDeviceID,
+                                                          hDevInfo,
+                                                          &DevInfoData,
+                                                          hComCtl32,
+                                                          lpMachineName,
+                                                          dwFlags);
+                }
+
+                SetupDiDestroyDeviceInfoList(hDevInfo);
+            }
+
+            FreeLibrary(hComCtl32);
+        }
+    }
+
+    return Ret;
+}
+
+
+/***************************************************************************
+* NAME                                                         EXPORTED
+*      DevicePropertiesA
+*
+* DESCRIPTION
+*   Invokes the device properties dialog directly
+*
+* ARGUMENTS
+*   hWndParent:    Handle to the parent window
+*   lpMachineName: Machine Name, NULL is the local machine
+*   lpDeviceID:    Specifies the device whose properties are to be shown
+*   bShowDevMgr:   If non-zero it displays the device manager instead of
+*                  the device property dialog
+*
+* RETURN VALUE
+*   >=0: if no errors occured
+*   -1:  if errors occured
+*
+* REVISIONS
+*
+* @implemented
+*/
+int
+WINAPI
+DevicePropertiesA(HWND hWndParent,
+                  LPCSTR lpMachineName,
+                  LPCSTR lpDeviceID,
+                  BOOL bShowDevMgr)
+{
+    return DevicePropertiesExA(hWndParent,
+                               lpMachineName,
+                               lpDeviceID,
+                               DPF_EXTENDED,
+                               bShowDevMgr);
+}
+
+
+/***************************************************************************
+* NAME                                                         EXPORTED
+*      DevicePropertiesW
+*
+* DESCRIPTION
+*   Invokes the device properties dialog directly
+*
+* ARGUMENTS
+*   hWndParent:    Handle to the parent window
+*   lpMachineName: Machine Name, NULL is the local machine
+*   lpDeviceID:    Specifies the device whose properties are to be shown
+*   bShowDevMgr:   If non-zero it displays the device manager instead of
+*                  the device property dialog
+*
+* RETURN VALUE
+*   >=0: if no errors occured
+*   -1:  if errors occured
+*
+* REVISIONS
+*
+* @implemented
+*/
+int
+WINAPI
+DevicePropertiesW(HWND hWndParent,
+                  LPCWSTR lpMachineName,
+                  LPCWSTR lpDeviceID,
+                  BOOL bShowDevMgr)
+{
+    return DevicePropertiesExW(hWndParent,
+                               lpMachineName,
+                               lpDeviceID,
+                               DPF_EXTENDED,
+                               bShowDevMgr);
+}
+
+
+/***************************************************************************
+* NAME                                                         EXPORTED
+*      DeviceProperties_RunDLLA
+*
+* DESCRIPTION
+*   Invokes the device properties dialog
+*
+* ARGUMENTS
+*   hWndParent:  Handle to the parent window
+*   hInst:       Handle to the application instance
+*   lpDeviceCmd: A command that includes the DeviceID of the properties to be shown,
+*                also see NOTEs
+*   nCmdShow:    Specifies how the window should be shown
+*
+* RETURN VALUE
+*
+* REVISIONS
+*
+* NOTE
+*   - lpDeviceCmd is a string in the form of "/MachineName MACHINE /DeviceID DEVICEPATH"
+*     (/MachineName is optional). This function only parses this string and eventually
+*     calls DeviceProperties().
+*
+* @implemented
+*/
+VOID
+WINAPI
+DeviceProperties_RunDLLA(HWND hWndParent,
+                         HINSTANCE hInst,
+                         LPCSTR lpDeviceCmd,
+                         int nCmdShow)
+{
+    LPWSTR lpDeviceCmdW = NULL;
+
+    if (lpDeviceCmd != NULL)
+    {
+        if ((lpDeviceCmdW = ConvertMultiByteToUnicode(lpDeviceCmd,
+                                                      CP_ACP)))
+        {
+            DeviceProperties_RunDLLW(hWndParent,
+                                     hInst,
+                                     lpDeviceCmdW,
+                                     nCmdShow);
+        }
+    }
+
+    if (lpDeviceCmdW != NULL)
+    {
+        HeapFree(GetProcessHeap(),
+                 0,
+                 lpDeviceCmdW);
+    }
+}
+
+
+/***************************************************************************
+* NAME                                                         EXPORTED
+*      DeviceProperties_RunDLLW
+*
+* DESCRIPTION
+*   Invokes the device properties dialog
+*
+* ARGUMENTS
+*   hWndParent:  Handle to the parent window
+*   hInst:       Handle to the application instance
+*   lpDeviceCmd: A command that includes the DeviceID of the properties to be shown,
+*                also see NOTEs
+*   nCmdShow:    Specifies how the window should be shown
+*
+* RETURN VALUE
+*
+* REVISIONS
+*
+* NOTE
+*   - lpDeviceCmd is a string in the form of "/MachineName MACHINE /DeviceID DEVICEPATH"
+*     (/MachineName is optional). This function only parses this string and eventually
+*     calls DeviceProperties().
+*
+* @implemented
+*/
+VOID
+WINAPI
+DeviceProperties_RunDLLW(HWND hWndParent,
+                         HINSTANCE hInst,
+                         LPCWSTR lpDeviceCmd,
+                         int nCmdShow)
+{
+    WCHAR szDeviceID[MAX_DEVICE_ID_LEN + 1];
+    WCHAR szMachineName[MAX_COMPUTERNAME_LENGTH + 1];
+    LPWSTR lpString = (LPWSTR)lpDeviceCmd;
+
+    if (!GetDeviceAndComputerName(lpString,
+                                  szDeviceID,
+                                  szMachineName))
+    {
+        ERR("DeviceProperties_RunDLLW DeviceID: %S, MachineName: %S\n", szDeviceID, szMachineName);
+        return;
+    }
+
+    DevicePropertiesW(hWndParent,
+                      szMachineName,
+                      szDeviceID,
+                      FALSE);
+}
+
 
 
 /***************************************************************************
@@ -48,7 +544,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(devmgr);
 *   - Win runs the device manager in a separate process, so hWndParent is somehow
 *     obsolete.
 *
-* @unimplemented
+* @implemented
 */
 BOOL
 WINAPI
@@ -57,8 +553,32 @@ DeviceManager_ExecuteA(HWND hWndParent,
                        LPCSTR lpMachineName,
                        int nCmdShow)
 {
-    UNIMPLEMENTED;
-    return FALSE;
+    LPWSTR lpMachineNameW = NULL;
+    BOOL Ret;
+
+    if (lpMachineName != NULL)
+    {
+        if (!(lpMachineNameW = ConvertMultiByteToUnicode(lpMachineName,
+                                                         CP_ACP)))
+        {
+            return FALSE;
+        }
+    }
+
+    Ret = DeviceManager_ExecuteW(hWndParent,
+                                 hInst,
+                                 lpMachineNameW,
+                                 nCmdShow);
+
+    if (lpMachineNameW != NULL)
+    {
+        HeapFree(GetProcessHeap(),
+                 0,
+                 lpMachineNameW);
+    }
+
+
+    return Ret;
 }
 
 
@@ -85,7 +605,7 @@ DeviceManager_ExecuteA(HWND hWndParent,
 *   - Win runs the device manager in a separate process, so hWndParent is somehow
 *     obsolete.
 *
-* @unimplemented
+* @implemented
 */
 BOOL
 WINAPI
index 56ec07d..fbe1039 100644 (file)
@@ -2744,556 +2744,3 @@ Cleanup:
 
     return Ret;
 }
-
-
-static BOOL
-GetDeviceAndComputerName(LPWSTR lpString,
-                         WCHAR szDeviceID[],
-                         WCHAR szMachineName[])
-{
-    BOOL ret = FALSE;
-
-    szDeviceID[0] = L'\0';
-    szMachineName[0] = L'\0';
-
-    while (*lpString != L'\0')
-    {
-        if (*lpString == L'/')
-        {
-            lpString++;
-            if(!_wcsnicmp(lpString, L"DeviceID", 8))
-            {
-                lpString += 9;
-                if (*lpString != L'\0')
-                {
-                    int i = 0;
-                    while ((*lpString != L' ') &&
-                           (*lpString != L'\0') &&
-                           (i <= MAX_DEVICE_ID_LEN))
-                    {
-                        szDeviceID[i++] = *lpString++;
-                    }
-                    szDeviceID[i] = L'\0';
-                    ret = TRUE;
-                }
-            }
-            else if (!_wcsnicmp(lpString, L"MachineName", 11))
-            {
-                lpString += 12;
-                if (*lpString != L'\0')
-                {
-                    int i = 0;
-                    while ((*lpString != L' ') &&
-                           (*lpString != L'\0') &&
-                           (i <= MAX_COMPUTERNAME_LENGTH))
-                    {
-                        szMachineName[i++] = *lpString++;
-                    }
-                    szMachineName[i] = L'\0';
-                }
-            }
-            /* knock the pointer back one and let the next
-             * pointer deal with incrementing, otherwise we
-             * go past the end of the string */
-             lpString--;
-        }
-        lpString++;
-    }
-
-    return ret;
-}
-
-
-/***************************************************************************
- * NAME                                                         EXPORTED
- *      DeviceAdvancedPropertiesW
- *
- * DESCRIPTION
- *   Invokes the device properties dialog, this version may add some property pages
- *   for some devices
- *
- * ARGUMENTS
- *   hWndParent:    Handle to the parent window
- *   lpMachineName: Machine Name, NULL is the local machine
- *   lpDeviceID:    Specifies the device whose properties are to be shown
- *
- * RETURN VALUE
- *   Always returns -1, a call to GetLastError returns 0 if successful
- *
- * @implemented
- */
-INT_PTR
-WINAPI
-DeviceAdvancedPropertiesW(IN HWND hWndParent  OPTIONAL,
-                          IN LPCWSTR lpMachineName  OPTIONAL,
-                          IN LPCWSTR lpDeviceID)
-{
-    HDEVINFO hDevInfo;
-    SP_DEVINFO_DATA DevInfoData;
-    HINSTANCE hComCtl32;
-    INT_PTR Ret = -1;
-
-    if (lpDeviceID == NULL)
-    {
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return FALSE;
-    }
-
-    /* dynamically load comctl32 */
-    hComCtl32 = LoadAndInitComctl32();
-    if (hComCtl32 != NULL)
-    {
-        hDevInfo = SetupDiCreateDeviceInfoListEx(NULL,
-                                                 hWndParent,
-                                                 lpMachineName,
-                                                 NULL);
-        if (hDevInfo != INVALID_HANDLE_VALUE)
-        {
-            DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
-            if (SetupDiOpenDeviceInfo(hDevInfo,
-                                      lpDeviceID,
-                                      hWndParent,
-                                      0,
-                                      &DevInfoData))
-            {
-                Ret = DisplayDeviceAdvancedProperties(hWndParent,
-                                                      lpDeviceID,
-                                                      hDevInfo,
-                                                      &DevInfoData,
-                                                      hComCtl32,
-                                                      lpMachineName,
-                                                      0);
-            }
-
-            SetupDiDestroyDeviceInfoList(hDevInfo);
-        }
-
-        FreeLibrary(hComCtl32);
-    }
-
-    return Ret;
-}
-
-
-/***************************************************************************
- * NAME                                                         EXPORTED
- *      DeviceAdvancedPropertiesA
- *
- * DESCRIPTION
- *   Invokes the device properties dialog, this version may add some property pages
- *   for some devices
- *
- * ARGUMENTS
- *   hWndParent:    Handle to the parent window
- *   lpMachineName: Machine Name, NULL is the local machine
- *   lpDeviceID:    Specifies the device whose properties are to be shown
- *
- * RETURN VALUE
- *   Always returns -1, a call to GetLastError returns 0 if successful
- *
- * @implemented
- */
-INT_PTR
-WINAPI
-DeviceAdvancedPropertiesA(IN HWND hWndParent  OPTIONAL,
-                          IN LPCSTR lpMachineName  OPTIONAL,
-                          IN LPCSTR lpDeviceID)
-{
-    LPWSTR lpMachineNameW = NULL;
-    LPWSTR lpDeviceIDW = NULL;
-    INT_PTR Ret = -1;
-
-    if (lpMachineName != NULL)
-    {
-        if (!(lpMachineNameW = ConvertMultiByteToUnicode(lpMachineName,
-                                                         CP_ACP)))
-        {
-            goto Cleanup;
-        }
-    }
-    if (lpDeviceID != NULL)
-    {
-        if (!(lpDeviceIDW = ConvertMultiByteToUnicode(lpDeviceID,
-                                                      CP_ACP)))
-        {
-            goto Cleanup;
-        }
-    }
-
-    Ret = DeviceAdvancedPropertiesW(hWndParent,
-                                    lpMachineNameW,
-                                    lpDeviceIDW);
-
-Cleanup:
-    if (lpMachineNameW != NULL)
-    {
-        HeapFree(GetProcessHeap(),
-                 0,
-                 lpMachineNameW);
-    }
-    if (lpDeviceIDW != NULL)
-    {
-        HeapFree(GetProcessHeap(),
-                 0,
-                 lpDeviceIDW);
-    }
-
-    return Ret;
-}
-
-
-/***************************************************************************
- * NAME                                                         EXPORTED
- *      DevicePropertiesExA
- *
- * DESCRIPTION
- *   Invokes the extended device properties dialog
- *
- * ARGUMENTS
- *   hWndParent:    Handle to the parent window
- *   lpMachineName: Machine Name, NULL is the local machine
- *   lpDeviceID:    Specifies the device whose properties are to be shown, optional if
- *                  bShowDevMgr is nonzero
- *   dwFlags:       This parameter can be a combination of the following flags:
- *                  * DPF_DEVICE_STATUS_ACTION: Only valid if bShowDevMgr, causes
- *                                              the default device status action button
- *                                              to be clicked (Troubleshoot, Enable
- *                                              Device, etc)
- *   bShowDevMgr:   If non-zero it displays the device manager instead of
- *                  the advanced device property dialog
- *
- * RETURN VALUE
- *   1:  if bShowDevMgr is non-zero and no error occured
- *   -1: a call to GetLastError returns 0 if successful
- *
- * @implemented
- */
-INT_PTR
-WINAPI
-DevicePropertiesExA(IN HWND hWndParent  OPTIONAL,
-                    IN LPCSTR lpMachineName  OPTIONAL,
-                    IN LPCSTR lpDeviceID  OPTIONAL,
-                    IN DWORD dwFlags  OPTIONAL,
-                    IN BOOL bShowDevMgr)
-{
-    LPWSTR lpMachineNameW = NULL;
-    LPWSTR lpDeviceIDW = NULL;
-    INT_PTR Ret = -1;
-
-    if (lpMachineName != NULL)
-    {
-        if (!(lpMachineNameW = ConvertMultiByteToUnicode(lpMachineName,
-                                                         CP_ACP)))
-        {
-            goto Cleanup;
-        }
-    }
-    if (lpDeviceID != NULL)
-    {
-        if (!(lpDeviceIDW = ConvertMultiByteToUnicode(lpDeviceID,
-                                                      CP_ACP)))
-        {
-            goto Cleanup;
-        }
-    }
-
-    Ret = DevicePropertiesExW(hWndParent,
-                              lpMachineNameW,
-                              lpDeviceIDW,
-                              dwFlags,
-                              bShowDevMgr);
-
-Cleanup:
-    if (lpMachineNameW != NULL)
-    {
-        HeapFree(GetProcessHeap(),
-                 0,
-                 lpMachineNameW);
-    }
-    if (lpDeviceIDW != NULL)
-    {
-        HeapFree(GetProcessHeap(),
-                 0,
-                 lpDeviceIDW);
-    }
-
-    return Ret;
-}
-
-
-/***************************************************************************
- * NAME                                                         EXPORTED
- *      DevicePropertiesExW
- *
- * DESCRIPTION
- *   Invokes the extended device properties dialog
- *
- * ARGUMENTS
- *   hWndParent:    Handle to the parent window
- *   lpMachineName: Machine Name, NULL is the local machine
- *   lpDeviceID:    Specifies the device whose properties are to be shown, optional if
- *                  bShowDevMgr is nonzero
- *   dwFlags:       This parameter can be a combination of the following flags:
- *                  * DPF_DEVICE_STATUS_ACTION: Only valid if bShowDevMgr, causes
- *                                              the default device status action button
- *                                              to be clicked (Troubleshoot, Enable
- *                                              Device, etc)
- *   bShowDevMgr:   If non-zero it displays the device manager instead of
- *                  the advanced device property dialog
- *
- * RETURN VALUE
- *   1:  if bShowDevMgr is non-zero and no error occured
- *   -1: a call to GetLastError returns 0 if successful
- *
- * @implemented
- */
-INT_PTR
-WINAPI
-DevicePropertiesExW(IN HWND hWndParent  OPTIONAL,
-                    IN LPCWSTR lpMachineName  OPTIONAL,
-                    IN LPCWSTR lpDeviceID  OPTIONAL,
-                    IN DWORD dwFlags  OPTIONAL,
-                    IN BOOL bShowDevMgr)
-{
-    INT_PTR Ret = -1;
-
-    if (dwFlags & ~(DPF_EXTENDED | DPF_DEVICE_STATUS_ACTION))
-    {
-        FIXME("DevPropertiesExW: Invalid flags: 0x%x\n",
-                dwFlags & ~(DPF_EXTENDED | DPF_DEVICE_STATUS_ACTION));
-        SetLastError(ERROR_INVALID_FLAGS);
-        return -1;
-    }
-
-    if (bShowDevMgr)
-    {
-        FIXME("DevPropertiesExW doesn't support bShowDevMgr!\n");
-        SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    }
-    else
-    {
-        HDEVINFO hDevInfo;
-        SP_DEVINFO_DATA DevInfoData;
-        HINSTANCE hComCtl32;
-
-        if (lpDeviceID == NULL)
-        {
-            SetLastError(ERROR_INVALID_PARAMETER);
-            return -1;
-        }
-
-        /* dynamically load comctl32 */
-        hComCtl32 = LoadAndInitComctl32();
-        if (hComCtl32 != NULL)
-        {
-            hDevInfo = SetupDiCreateDeviceInfoListEx(NULL,
-                                                     hWndParent,
-                                                     lpMachineName,
-                                                     NULL);
-            if (hDevInfo != INVALID_HANDLE_VALUE)
-            {
-                DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
-                if (SetupDiOpenDeviceInfo(hDevInfo,
-                                          lpDeviceID,
-                                          hWndParent,
-                                          0,
-                                          &DevInfoData))
-                {
-                    Ret = DisplayDeviceAdvancedProperties(hWndParent,
-                                                          lpDeviceID,
-                                                          hDevInfo,
-                                                          &DevInfoData,
-                                                          hComCtl32,
-                                                          lpMachineName,
-                                                          dwFlags);
-                }
-
-                SetupDiDestroyDeviceInfoList(hDevInfo);
-            }
-
-            FreeLibrary(hComCtl32);
-        }
-    }
-
-    return Ret;
-}
-
-
-/***************************************************************************
- * NAME                                                         EXPORTED
- *      DevicePropertiesA
- *
- * DESCRIPTION
- *   Invokes the device properties dialog directly
- *
- * ARGUMENTS
- *   hWndParent:    Handle to the parent window
- *   lpMachineName: Machine Name, NULL is the local machine
- *   lpDeviceID:    Specifies the device whose properties are to be shown
- *   bShowDevMgr:   If non-zero it displays the device manager instead of
- *                  the device property dialog
- *
- * RETURN VALUE
- *   >=0: if no errors occured
- *   -1:  if errors occured
- *
- * REVISIONS
- *
- * @implemented
- */
-int
-WINAPI
-DevicePropertiesA(HWND hWndParent,
-                  LPCSTR lpMachineName,
-                  LPCSTR lpDeviceID,
-                  BOOL bShowDevMgr)
-{
-    return DevicePropertiesExA(hWndParent,
-                               lpMachineName,
-                               lpDeviceID,
-                               DPF_EXTENDED,
-                               bShowDevMgr);
-}
-
-
-/***************************************************************************
- * NAME                                                         EXPORTED
- *      DevicePropertiesW
- *
- * DESCRIPTION
- *   Invokes the device properties dialog directly
- *
- * ARGUMENTS
- *   hWndParent:    Handle to the parent window
- *   lpMachineName: Machine Name, NULL is the local machine
- *   lpDeviceID:    Specifies the device whose properties are to be shown
- *   bShowDevMgr:   If non-zero it displays the device manager instead of
- *                  the device property dialog
- *
- * RETURN VALUE
- *   >=0: if no errors occured
- *   -1:  if errors occured
- *
- * REVISIONS
- *
- * @implemented
- */
-int
-WINAPI
-DevicePropertiesW(HWND hWndParent,
-                  LPCWSTR lpMachineName,
-                  LPCWSTR lpDeviceID,
-                  BOOL bShowDevMgr)
-{
-    return DevicePropertiesExW(hWndParent,
-                               lpMachineName,
-                               lpDeviceID,
-                               DPF_EXTENDED,
-                               bShowDevMgr);
-}
-
-
-/***************************************************************************
- * NAME                                                         EXPORTED
- *      DeviceProperties_RunDLLA
- *
- * DESCRIPTION
- *   Invokes the device properties dialog
- *
- * ARGUMENTS
- *   hWndParent:  Handle to the parent window
- *   hInst:       Handle to the application instance
- *   lpDeviceCmd: A command that includes the DeviceID of the properties to be shown,
- *                also see NOTEs
- *   nCmdShow:    Specifies how the window should be shown
- *
- * RETURN VALUE
- *
- * REVISIONS
- *
- * NOTE
- *   - lpDeviceCmd is a string in the form of "/MachineName MACHINE /DeviceID DEVICEPATH"
- *     (/MachineName is optional). This function only parses this string and eventually
- *     calls DeviceProperties().
- *
- * @implemented
- */
-VOID
-WINAPI
-DeviceProperties_RunDLLA(HWND hWndParent,
-                         HINSTANCE hInst,
-                         LPCSTR lpDeviceCmd,
-                         int nCmdShow)
-{
-    LPWSTR lpDeviceCmdW = NULL;
-
-    if (lpDeviceCmd != NULL)
-    {
-        if ((lpDeviceCmdW = ConvertMultiByteToUnicode(lpDeviceCmd,
-                                                      CP_ACP)))
-        {
-            DeviceProperties_RunDLLW(hWndParent,
-                                     hInst,
-                                     lpDeviceCmdW,
-                                     nCmdShow);
-        }
-    }
-
-    if (lpDeviceCmdW != NULL)
-    {
-        HeapFree(GetProcessHeap(),
-                 0,
-                 lpDeviceCmdW);
-    }
-}
-
-
-/***************************************************************************
- * NAME                                                         EXPORTED
- *      DeviceProperties_RunDLLW
- *
- * DESCRIPTION
- *   Invokes the device properties dialog
- *
- * ARGUMENTS
- *   hWndParent:  Handle to the parent window
- *   hInst:       Handle to the application instance
- *   lpDeviceCmd: A command that includes the DeviceID of the properties to be shown,
- *                also see NOTEs
- *   nCmdShow:    Specifies how the window should be shown
- *
- * RETURN VALUE
- *
- * REVISIONS
- *
- * NOTE
- *   - lpDeviceCmd is a string in the form of "/MachineName MACHINE /DeviceID DEVICEPATH"
- *     (/MachineName is optional). This function only parses this string and eventually
- *     calls DeviceProperties().
- *
- * @implemented
- */
-VOID
-WINAPI
-DeviceProperties_RunDLLW(HWND hWndParent,
-                         HINSTANCE hInst,
-                         LPCWSTR lpDeviceCmd,
-                         int nCmdShow)
-{
-    WCHAR szDeviceID[MAX_DEVICE_ID_LEN+1];
-    WCHAR szMachineName[MAX_COMPUTERNAME_LENGTH+1];
-    LPWSTR lpString = (LPWSTR)lpDeviceCmd;
-
-    if (!GetDeviceAndComputerName(lpString,
-                                  szDeviceID,
-                                  szMachineName))
-    {
-        ERR("DeviceProperties_RunDLLW DeviceID: %S, MachineName: %S\n", szDeviceID, szMachineName);
-        return;
-    }
-
-    DevicePropertiesW(hWndParent,
-                      szMachineName,
-                      szDeviceID,
-                      FALSE);
-}
index d0bb7c8..37c719a 100644 (file)
@@ -1129,3 +1129,61 @@ LoadAndInitComctl32(VOID)
 
     return hComCtl32;
 }
+
+
+BOOL
+GetDeviceAndComputerName(LPWSTR lpString,
+                         WCHAR szDeviceID[],
+                         WCHAR szMachineName[])
+{
+    BOOL ret = FALSE;
+
+    szDeviceID[0] = L'\0';
+    szMachineName[0] = L'\0';
+
+    while (*lpString != L'\0')
+    {
+        if (*lpString == L'/')
+        {
+            lpString++;
+            if (!_wcsnicmp(lpString, L"DeviceID", 8))
+            {
+                lpString += 9;
+                if (*lpString != L'\0')
+                {
+                    int i = 0;
+                    while ((*lpString != L' ') &&
+                           (*lpString != L'\0') &&
+                           (i <= MAX_DEVICE_ID_LEN))
+                    {
+                        szDeviceID[i++] = *lpString++;
+                    }
+                    szDeviceID[i] = L'\0';
+                    ret = TRUE;
+                }
+            }
+            else if (!_wcsnicmp(lpString, L"MachineName", 11))
+            {
+                lpString += 12;
+                if (*lpString != L'\0')
+                {
+                    int i = 0;
+                    while ((*lpString != L' ') &&
+                           (*lpString != L'\0') &&
+                           (i <= MAX_COMPUTERNAME_LENGTH))
+                    {
+                        szMachineName[i++] = *lpString++;
+                    }
+                    szMachineName[i] = L'\0';
+                }
+            }
+            /* knock the pointer back one and let the next
+            * pointer deal with incrementing, otherwise we
+            * go past the end of the string */
+            lpString--;
+        }
+        lpString++;
+    }
+
+    return ret;
+}
index ec822ae..9a7f135 100644 (file)
@@ -128,6 +128,11 @@ ConvertMultiByteToUnicode(IN LPCSTR lpMultiByteStr,
 HINSTANCE
 LoadAndInitComctl32(VOID);
 
+BOOL
+GetDeviceAndComputerName(LPWSTR lpString,
+                         WCHAR szDeviceID[],
+                         WCHAR szMachineName[]);
+
 BOOL
 GetDeviceManufacturerString(IN HDEVINFO DeviceInfoSet,
                             IN PSP_DEVINFO_DATA DeviceInfoData,