[MSPORTS] Check and show which parallel port is in use.
authorEric Kohl <eric.kohl@reactos.org>
Thu, 4 Oct 2018 08:20:12 +0000 (10:20 +0200)
committerEric Kohl <eric.kohl@reactos.org>
Thu, 4 Oct 2018 08:21:06 +0000 (10:21 +0200)
17 files changed:
dll/win32/msports/lang/bg-BG.rc
dll/win32/msports/lang/de-DE.rc
dll/win32/msports/lang/en-US.rc
dll/win32/msports/lang/es-ES.rc
dll/win32/msports/lang/he-IL.rc
dll/win32/msports/lang/it-IT.rc
dll/win32/msports/lang/ja-JP.rc
dll/win32/msports/lang/pl-PL.rc
dll/win32/msports/lang/ro-RO.rc
dll/win32/msports/lang/ru-RU.rc
dll/win32/msports/lang/sq-AL.rc
dll/win32/msports/lang/tr-TR.rc
dll/win32/msports/lang/uk-UA.rc
dll/win32/msports/lang/zh-CN.rc
dll/win32/msports/lang/zh-TW.rc
dll/win32/msports/parallel.c
dll/win32/msports/resource.h

index de8fa74..cdc3c25 100644 (file)
@@ -38,4 +38,5 @@ BEGIN
     IDS_PARITY "Even,Odd,None,Mark,Space"
     IDS_STOPBITS "1,1.5,2"
     IDS_FLOWCONTROL "Xon / Xoff,Hardware,None"
+    IDS_PORT_IN_USE " (in use)"
 END
index b968518..f1ccb23 100644 (file)
@@ -38,4 +38,5 @@ BEGIN
     IDS_PARITY "Gerade,Ungerade,Keine,Mark,Space"
     IDS_STOPBITS "1,1.5,2"
     IDS_FLOWCONTROL "Xon / Xoff,Hardware,Keine"
+    IDS_PORT_IN_USE " (wird benutzt)"
 END
index baf2725..eb37b84 100644 (file)
@@ -38,4 +38,5 @@ BEGIN
     IDS_PARITY "Even,Odd,None,Mark,Space"
     IDS_STOPBITS "1,1.5,2"
     IDS_FLOWCONTROL "Xon / Xoff,Hardware,None"
+    IDS_PORT_IN_USE " (in use)"
 END
index dd6587b..d6c7c70 100644 (file)
@@ -38,4 +38,5 @@ BEGIN
     IDS_PARITY "Even,Odd,None,Mark,Space"
     IDS_STOPBITS "1,1.5,2"
     IDS_FLOWCONTROL "Xon / Xoff,Hardware,None"
+    IDS_PORT_IN_USE " (in use)"
 END
index e6fef32..61933ac 100644 (file)
@@ -38,4 +38,5 @@ BEGIN
     IDS_PARITY "Even,Odd,None,Mark,Space"
     IDS_STOPBITS "1,1.5,2"
     IDS_FLOWCONTROL "Xon / Xoff,Hardware,None"
+    IDS_PORT_IN_USE " (in use)"
 END
index eeaad20..666a6b8 100644 (file)
@@ -38,4 +38,5 @@ BEGIN
     IDS_PARITY "Even,Odd,None,Mark,Space"
     IDS_STOPBITS "1,1.5,2"
     IDS_FLOWCONTROL "Xon / Xoff,Hardware,None"
+    IDS_PORT_IN_USE " (in use)"
 END
index 25e5dfc..cedc65f 100644 (file)
@@ -38,4 +38,5 @@ BEGIN
     IDS_PARITY "Even,Odd,None,Mark,Space"
     IDS_STOPBITS "1,1.5,2"
     IDS_FLOWCONTROL "Xon / Xoff,Hardware,None"
+    IDS_PORT_IN_USE " (in use)"
 END
index d7af8e7..6cd025f 100644 (file)
@@ -46,4 +46,5 @@ BEGIN
     IDS_PARITY "Even,Odd,None,Mark,Space"
     IDS_STOPBITS "1,1.5,2"
     IDS_FLOWCONTROL "Xon / Xoff,Hardware,None"
+    IDS_PORT_IN_USE " (in use)"
 END
index caa284e..825eeb5 100644 (file)
@@ -44,4 +44,5 @@ BEGIN
     IDS_PARITY "Even,Odd,None,Mark,Space"
     IDS_STOPBITS "1,1.5,2"
     IDS_FLOWCONTROL "Xon / Xoff,Hardware,None"
+    IDS_PORT_IN_USE " (in use)"
 END
index d6ac1e7..f90eb9c 100644 (file)
@@ -44,4 +44,5 @@ BEGIN
     IDS_PARITY "Чёт,Нечёт,Нет,Маркер,Пробел"
     IDS_STOPBITS "1,1.5,2"
     IDS_FLOWCONTROL "Xon / Xoff,Аппаратное,Нет"
+    IDS_PORT_IN_USE " (in use)"
 END
index 73cc86a..6ee7f1f 100644 (file)
@@ -42,4 +42,5 @@ BEGIN
     IDS_PARITY "Even,Odd,None,Mark,Space"
     IDS_STOPBITS "1,1.5,2"
     IDS_FLOWCONTROL "Xon / Xoff,Hardware,None"
+    IDS_PORT_IN_USE " (in use)"
 END
index 39bad63..c7132fe 100644 (file)
@@ -40,4 +40,5 @@ BEGIN
     IDS_PARITY "Even,Odd,None,Mark,Space"
     IDS_STOPBITS "1,1.5,2"
     IDS_FLOWCONTROL "Xon / Xoff,Hardware,None"
+    IDS_PORT_IN_USE " (in use)"
 END
index 0f16117..503cb49 100644 (file)
@@ -46,4 +46,5 @@ BEGIN
     IDS_PARITY "Even,Odd,None,Mark,Space"
     IDS_STOPBITS "1,1.5,2"
     IDS_FLOWCONTROL "Xon / Xoff,Hardware,None"
+    IDS_PORT_IN_USE " (in use)"
 END
index 9f17ba4..f6daeb3 100644 (file)
@@ -40,4 +40,5 @@ BEGIN
     IDS_PARITY "Even,Odd,None,Mark,Space"
     IDS_STOPBITS "1,1.5,2"
     IDS_FLOWCONTROL "Xon / Xoff,Hardware,None"
+    IDS_PORT_IN_USE " (in use)"
 END
index cfaf247..ac9c6e2 100644 (file)
@@ -40,5 +40,6 @@ BEGIN
     IDS_PARITY "Even,Odd,None,Mark,Space"
     IDS_STOPBITS "1,1.5,2"
     IDS_FLOWCONTROL "Xon / Xoff,Hardware,None"
+    IDS_PORT_IN_USE " (in use)"
 END
 
index ddb72c5..076bb20 100644 (file)
@@ -8,18 +8,83 @@
 
 #include "precomp.h"
 
+
 typedef struct _PORT_DATA
 {
     HDEVINFO DeviceInfoSet;
     PSP_DEVINFO_DATA DeviceInfoData;
 
     WCHAR szPortName[16];
+    DWORD dwPortNumber;
     DWORD dwFilterResourceMethod;
     DWORD dwLegacy;
 
 } PORT_DATA, *PPORT_DATA;
 
 
+static
+VOID
+GetUsedPorts(
+    PDWORD pPortMap)
+{
+    WCHAR szDeviceName[64];
+    WCHAR szDosDeviceName[64];
+    DWORD dwIndex, dwType, dwPortNumber;
+    DWORD dwDeviceNameSize, dwDosDeviceNameSize;
+    PWSTR ptr;
+    HKEY hKey;
+    DWORD dwError;
+
+    *pPortMap = 0;
+
+    dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
+                            L"Hardware\\DeviceMap\\PARALLEL PORTS",
+                            0,
+                            KEY_READ,
+                            &hKey);
+    if (dwError == ERROR_SUCCESS)
+    {
+        for (dwIndex = 0; ; dwIndex++)
+        {
+            dwDeviceNameSize = ARRAYSIZE(szDeviceName);
+            dwDosDeviceNameSize = sizeof(szDosDeviceName);
+            dwError = RegEnumValueW(hKey,
+                                    dwIndex,
+                                    szDeviceName,
+                                    &dwDeviceNameSize,
+                                    NULL,
+                                    &dwType,
+                                    (LPBYTE)szDosDeviceName,
+                                    &dwDosDeviceNameSize);
+            if (dwError != ERROR_SUCCESS)
+                break;
+
+            if (dwType == REG_SZ)
+            {
+                TRACE("%S --> %S\n", szDeviceName, szDosDeviceName);
+                if (_wcsnicmp(szDosDeviceName, L"\\DosDevices\\LPT", wcslen(L"\\DosDevices\\LPT")) == 0)
+                {
+                     ptr = szDosDeviceName + wcslen(L"\\DosDevices\\LPT");
+                     if (wcschr(ptr, L'.') == NULL)
+                     {
+                         TRACE("Device number %S\n", ptr);
+                         dwPortNumber = wcstoul(ptr, NULL, 10);
+                         if (dwPortNumber != 0)
+                         {
+                             *pPortMap |=(1 << dwPortNumber);
+                         }
+                     }
+                }
+            }
+        }
+
+        RegCloseKey(hKey);
+    }
+
+    TRACE("Done\n");
+}
+
+
 static
 VOID
 ReadPortSettings(
@@ -33,6 +98,7 @@ ReadPortSettings(
 
     pPortData->dwFilterResourceMethod = 1; /* Never use an interrupt */
     pPortData->dwLegacy = 0;               /* Disabled */
+    pPortData->dwPortNumber = 0;           /* Unknown */
 
     hKey = SetupDiOpenDevRegKey(pPortData->DeviceInfoSet,
                                 pPortData->DeviceInfoData,
@@ -102,6 +168,7 @@ WritePortSettings(
     DWORD dwDisposition;
     DWORD dwFilterResourceMethod;
     DWORD dwLegacy;
+    DWORD dwPortNumber;
     HKEY hKey;
     DWORD dwError;
 
@@ -169,9 +236,24 @@ WritePortSettings(
             if (dwError == ERROR_SUCCESS)
             {
                 FIXME("Notify the driver!\n");
+
+                pPortData->dwLegacy = dwLegacy;
             }
         }
     }
+
+    dwPortNumber = ComboBox_GetCurSel(GetDlgItem(hwnd, IDC_PARALLEL_NAME));
+    if (dwPortNumber != LB_ERR)
+    {
+        dwPortNumber++;
+        if (dwPortNumber != pPortData->dwPortNumber)
+        {
+            FIXME("Port name changed! LPT%lu --> LPT%lu", pPortData->dwPortNumber, dwPortNumber);
+
+
+//            pPortData->dwPortNumber = dwPortNumber;
+        }
+    }
 }
 
 
@@ -181,9 +263,11 @@ OnInitDialog(HWND hwnd,
              WPARAM wParam,
              LPARAM lParam)
 {
+    WCHAR szBuffer[256];
+    WCHAR szPortInUse[64];
     PPORT_DATA pPortData;
     HWND hwndControl;
-    WCHAR szBuffer[256];
+    DWORD dwPortMap;
     UINT i;
 
     TRACE("OnInitDialog()\n");
@@ -214,18 +298,31 @@ OnInitDialog(HWND hwnd,
                         pPortData->dwLegacy ? BST_CHECKED : BST_UNCHECKED);
     }
 
+    LoadStringW(hInstance, IDS_PORT_IN_USE, szPortInUse, ARRAYSIZE(szPortInUse));
+
     /* Fill the 'LPT Port Number' combobox */
     hwndControl = GetDlgItem(hwnd, IDC_PARALLEL_NAME);
     if (hwndControl)
     {
-        for (i = 0; i < 3; i++)
+        GetUsedPorts(&dwPortMap);
+
+        for (i = 1; i < 4; i++)
         {
-            swprintf(szBuffer, L"LPT%lu", i + 1);
+            swprintf(szBuffer, L"LPT%lu", i);
+
+            if ((dwPortMap & (1 << i)) && (pPortData->dwPortNumber != i))
+                wcscat(szBuffer, szPortInUse);
+
             ComboBox_AddString(hwndControl, szBuffer);
+
+            if (_wcsicmp(pPortData->szPortName, szBuffer) == 0)
+                pPortData->dwPortNumber = i;
         }
 
-        /* Disable it */
-        EnableWindow(hwndControl, FALSE);
+        if (pPortData->dwPortNumber != 0)
+        {
+            ComboBox_SetCurSel(hwndControl, pPortData->dwPortNumber - 1);
+        }
     }
 
     return TRUE;
index c9d7168..335f74a 100644 (file)
@@ -20,3 +20,4 @@
 #define IDS_PARITY                11
 #define IDS_STOPBITS              12
 #define IDS_FLOWCONTROL           13
+#define IDS_PORT_IN_USE           61