Author: ekohl
Date: Thu May 26 21:20:06 2011
New Revision: 51935
URL:
http://svn.reactos.org/svn/reactos?rev=51935&view=rev
Log:
[MSPORTS]
- Try to read the PortName registry value and get the port number from the name.
- Determine the port number for parallel ports the same way we determine the port number
for serial ports, except for the use of the com port database.
Modified:
trunk/reactos/dll/win32/msports/classinst.c
Modified: trunk/reactos/dll/win32/msports/classinst.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/msports/classins…
==============================================================================
--- trunk/reactos/dll/win32/msports/classinst.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/msports/classinst.c [iso-8859-1] Thu May 26 21:20:06 2011
@@ -23,6 +23,9 @@
ParallelPort,
SerialPort
} PORT_TYPE;
+
+LPWSTR pszCom = L"COM";
+LPWSTR pszLpt = L"LPT";
BOOL
@@ -243,10 +246,12 @@
{
WCHAR szDeviceDescription[256];
WCHAR szFriendlyName[256];
- WCHAR szPortName[5];
- DWORD dwPortNumber;
+ WCHAR szPortName[8];
+ DWORD dwPortNumber = 0;
+ DWORD dwSize;
HCOMDB hComDB = HCOMDB_INVALID_HANDLE_VALUE;
HKEY hKey;
+ LONG lError;
TRACE("InstallSerialPort(%p, %p)\n",
DeviceInfoSet, DeviceInfoData);
@@ -254,9 +259,40 @@
/* Open the com port database */
ComDBOpen(&hComDB);
+ /* Try to read the 'PortName' value and determine the port number */
+ hKey = SetupDiCreateDevRegKeyW(DeviceInfoSet,
+ DeviceInfoData,
+ DICS_FLAG_GLOBAL,
+ 0,
+ DIREG_DEV,
+ NULL,
+ NULL);
+ if (hKey != INVALID_HANDLE_VALUE)
+ {
+ dwSize = sizeof(szPortName);
+ lError = RegQueryValueEx(hKey,
+ L"PortName",
+ NULL,
+ NULL,
+ (PBYTE)szPortName,
+ &dwSize);
+ if (lError == ERROR_SUCCESS)
+ {
+ if (_wcsnicmp(szPortName, pszCom, wcslen(pszCom)) == 0)
+ {
+ dwPortNumber = _wtoi(szPortName + wcslen(pszCom));
+ TRACE("COM port number found: %lu\n", dwPortNumber);
+ }
+ }
+
+ RegCloseKey(hKey);
+ }
+
/* Determine the port number from its resources ... */
- dwPortNumber = GetSerialPortNumber(DeviceInfoSet,
- DeviceInfoData);
+ if (dwPortNumber == 0)
+ dwPortNumber = GetSerialPortNumber(DeviceInfoSet,
+ DeviceInfoData);
+
if (dwPortNumber != 0)
{
/* ... and claim the port number in the database */
@@ -273,7 +309,7 @@
}
/* Build the name of the port device */
- swprintf(szPortName, L"COM%u", dwPortNumber);
+ swprintf(szPortName, L"%s%u", pszCom, dwPortNumber);
/* Close the com port database */
if (hComDB != HCOMDB_INVALID_HANDLE_VALUE)
@@ -346,23 +382,85 @@
{
WCHAR szDeviceDescription[256];
WCHAR szFriendlyName[256];
- WCHAR szPortName[5];
- DWORD dwPortNumber;
+ WCHAR szPortName[8];
+ DWORD dwPortNumber = 0;
+ DWORD dwSize;
+ LONG lError;
+ HKEY hKey;
TRACE("InstallParallelPort(%p, %p)\n",
DeviceInfoSet, DeviceInfoData);
- dwPortNumber = GetParallelPortNumber(DeviceInfoSet,
- DeviceInfoData);
+ /* Try to read the 'PortName' value and determine the port number */
+ hKey = SetupDiCreateDevRegKeyW(DeviceInfoSet,
+ DeviceInfoData,
+ DICS_FLAG_GLOBAL,
+ 0,
+ DIREG_DEV,
+ NULL,
+ NULL);
+ if (hKey != INVALID_HANDLE_VALUE)
+ {
+ dwSize = sizeof(szPortName);
+ lError = RegQueryValueEx(hKey,
+ L"PortName",
+ NULL,
+ NULL,
+ (PBYTE)szPortName,
+ &dwSize);
+ if (lError == ERROR_SUCCESS)
+ {
+ if (_wcsnicmp(szPortName, pszLpt, wcslen(pszLpt)) == 0)
+ {
+ dwPortNumber = _wtoi(szPortName + wcslen(pszLpt));
+ TRACE("LPT port number found: %lu\n", dwPortNumber);
+ }
+ }
+
+ RegCloseKey(hKey);
+ }
+
+ /* ... try to determine the port number from its resources */
+ if (dwPortNumber == 0)
+ dwPortNumber = GetParallelPortNumber(DeviceInfoSet,
+ DeviceInfoData);
+
+ if (dwPortNumber == 0)
+ {
+ /* FIXME */
+ }
+
if (dwPortNumber != 0)
{
- swprintf(szPortName, L"LPT%u", dwPortNumber);
+ swprintf(szPortName, L"%s%u", pszLpt, dwPortNumber);
}
else
{
wcscpy(szPortName, L"LPTx");
}
+ if (dwPortNumber != 0)
+ {
+ /* Set the 'PortName' value */
+ hKey = SetupDiCreateDevRegKeyW(DeviceInfoSet,
+ DeviceInfoData,
+ DICS_FLAG_GLOBAL,
+ 0,
+ DIREG_DEV,
+ NULL,
+ NULL);
+ if (hKey != INVALID_HANDLE_VALUE)
+ {
+ RegSetValueExW(hKey,
+ L"PortName",
+ 0,
+ REG_SZ,
+ (LPBYTE)szPortName,
+ (wcslen(szPortName) + 1) * sizeof(WCHAR));
+
+ RegCloseKey(hKey);
+ }
+ }
/* Install the device */
if (!SetupDiInstallDevice(DeviceInfoSet,
@@ -371,6 +469,7 @@
return GetLastError();
}
+ /* Get the device description... */
if (SetupDiGetDeviceRegistryPropertyW(DeviceInfoSet,
DeviceInfoData,
SPDRP_DEVICEDESC,
@@ -379,6 +478,7 @@
256 * sizeof(WCHAR),
NULL))
{
+ /* ... and use it to build a new friendly name */
swprintf(szFriendlyName,
L"%s (%s)",
szDeviceDescription,
@@ -386,8 +486,9 @@
}
else
{
+ /* ... or build a generic friendly name */
swprintf(szFriendlyName,
- L"Serial Port (%s)",
+ L"Parallel Port (%s)",
szPortName);
}