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/classinst... ============================================================================== --- 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); }