From: Eric Kohl Date: Thu, 26 May 2011 21:20:06 +0000 (+0000) Subject: [MSPORTS] X-Git-Tag: backups/ros-amd64-bringup@60669^2~593 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=00aee505e3c3f45325f309ba660ae45845dadf6d [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. svn path=/trunk/; revision=51935 --- diff --git a/reactos/dll/win32/msports/classinst.c b/reactos/dll/win32/msports/classinst.c index 5bbeb248919..0b082b5cca3 100644 --- a/reactos/dll/win32/msports/classinst.c +++ b/reactos/dll/win32/msports/classinst.c @@ -24,6 +24,9 @@ typedef enum _PORT_TYPE SerialPort } PORT_TYPE; +LPWSTR pszCom = L"COM"; +LPWSTR pszLpt = L"LPT"; + BOOL GetBootResourceList(HDEVINFO DeviceInfoSet, @@ -243,10 +246,12 @@ InstallSerialPort(IN HDEVINFO DeviceInfoSet, { 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 @@ InstallSerialPort(IN HDEVINFO DeviceInfoSet, /* 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 @@ InstallSerialPort(IN HDEVINFO DeviceInfoSet, } /* 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 @@ InstallParallelPort(IN HDEVINFO DeviceInfoSet, { 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 @@ InstallParallelPort(IN HDEVINFO DeviceInfoSet, return GetLastError(); } + /* Get the device description... */ if (SetupDiGetDeviceRegistryPropertyW(DeviceInfoSet, DeviceInfoData, SPDRP_DEVICEDESC, @@ -379,6 +478,7 @@ InstallParallelPort(IN HDEVINFO DeviceInfoSet, 256 * sizeof(WCHAR), NULL)) { + /* ... and use it to build a new friendly name */ swprintf(szFriendlyName, L"%s (%s)", szDeviceDescription, @@ -386,8 +486,9 @@ InstallParallelPort(IN HDEVINFO DeviceInfoSet, } else { + /* ... or build a generic friendly name */ swprintf(szFriendlyName, - L"Serial Port (%s)", + L"Parallel Port (%s)", szPortName); }