[MSPORTS] Check and show which parallel port is in use.

This commit is contained in:
Eric Kohl 2018-10-04 10:20:12 +02:00
parent bf59669065
commit c444231b87
17 changed files with 118 additions and 5 deletions

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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;

View file

@ -20,3 +20,4 @@
#define IDS_PARITY 11
#define IDS_STOPBITS 12
#define IDS_FLOWCONTROL 13
#define IDS_PORT_IN_USE 61