#include #pragma hdrstop #include "nsbase.h" #include "ncreg.h" #include "ncsetup.h" #include "ndispnp.h" #include "resource.h" //+--------------------------------------------------------------------------- // // Function: GetLocationInfo // // Purpose: Gets the slot and port number of a device and formats // a display string into a buffer. // // Arguments: // pszDevNodeId [in] The device isntance id of the adapter. // pszBuffer [in] Buffer to add location string. // (must be preallocated) // // Returns: // // Author: billbe 2 Aug 1999 // // Notes: Slot and/or port number may not exist so the buffer // may not be modified. // VOID GetLocationInfo ( IN PCWSTR pszDevNodeId, OUT PWSTR pszLocation) { HDEVINFO hdi; SP_DEVINFO_DATA deid; HRESULT hr; // Create the device info set needed to access SetupDi fcns. // hr = HrSetupDiCreateDeviceInfoList (&GUID_DEVCLASS_NET, NULL, &hdi); if (S_OK == hr) { TraceTag (ttidLanUi, "Opening %S", pszDevNodeId); // Open the device info for the adapter. // hr = HrSetupDiOpenDeviceInfo (hdi, pszDevNodeId, NULL, 0, &deid); if (S_OK == hr) { BOOL fHaveSlotNumber; DWORD dwSlotNumber; DWORD dwPortNumber; BOOL fHavePortNumber; // Slot number is stored as the UINumber registry property. // hr = HrSetupDiGetDeviceRegistryProperty (hdi, &deid, SPDRP_UI_NUMBER, NULL, (BYTE*)&dwSlotNumber, sizeof (dwSlotNumber), NULL); TraceTag (ttidLanUi, "Getting ui number result %lX %d", hr, dwSlotNumber); fHaveSlotNumber = (S_OK == hr); // Port information is stored by the class installer in the // device key. // HKEY hkey; fHavePortNumber = FALSE; hr = HrSetupDiOpenDevRegKey (hdi, &deid, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ, &hkey); if (S_OK == hr) { hr = HrRegQueryDword(hkey, L"Port", &dwPortNumber); fHavePortNumber = (S_OK == hr); RegCloseKey (hkey); } // Format the string according to what information // we were able to retrieve. // HINSTANCE hinst = _Module.GetResourceInstance(); if (fHaveSlotNumber && fHavePortNumber) { swprintf (pszLocation, SzLoadString (hinst, IDS_SLOT_PORT_LOCATION), dwSlotNumber, dwPortNumber); TraceTag (ttidLanUi, "Found slot and port. %S", pszLocation); } else if (fHaveSlotNumber) { swprintf (pszLocation, SzLoadString (hinst, IDS_SLOT_LOCATION), dwSlotNumber); TraceTag (ttidLanUi, "Found slot. %S", pszLocation); } else if (fHavePortNumber) { swprintf (pszLocation, SzLoadString (hinst, IDS_PORT_LOCATION), dwPortNumber);; TraceTag (ttidLanUi, "Found port. %S", pszLocation); } } SetupDiDestroyDeviceInfoList (hdi); } } //+--------------------------------------------------------------------------- // // Function: AppendMacAddress // // Purpose: Appends the MAC address of a LAN adapter to a buffer for // display in UI. // // Arguments: // pszBindName [in] Bind name of adapter. // pszBuffer [in] Buffer to add MAC address string. // (must be preallocated) // // Returns: // // Author: tongl 17 Sept 1998 // billbe 3 Aug 1999 Modified for datatip // // Notes: // VOID AppendMacAddress ( IN PCWSTR pszBindName, IN OUT PWSTR pszBuffer) { Assert (pszBindName); Assert (pszBuffer); WCHAR szExport[_MAX_PATH]; if (pszBindName) { wcscpy (szExport, L"\\Device\\"); wcscat (szExport, pszBindName); UNICODE_STRING ustrDevice; RtlInitUnicodeString(&ustrDevice, szExport); // Get the Mac Address UINT uiRet; UCHAR MacAddr[6]; UCHAR PMacAddr[6]; UCHAR VendorId[3]; uiRet = NdisQueryHwAddress(&ustrDevice, MacAddr, PMacAddr, VendorId); if (uiRet) { // Succeeded WCHAR pszNumber[32]; *pszNumber = 0; WCHAR szBuff[4]; for (INT i=0; i<=5; i++) { wsprintfW(szBuff, L"%02X", MacAddr[i]); wcscat(pszNumber, szBuff); if (i != 5) { wcscat(pszNumber, L"-"); } } if (*pszBuffer) { wcscat (pszBuffer, L"\n"); } DwFormatString(SzLoadString (_Module.GetResourceInstance(), IDS_MAC_ADDRESS), pszBuffer + wcslen (pszBuffer), _MAX_PATH, pszNumber); } } } //+--------------------------------------------------------------------------- // // Function: CreateDeviceDataTip // // Purpose: Creates a data tip that will display device specific // information when the user hovers over nIdTool. // // Arguments: // hwndParent [in] hwnd to parent window. // phwndDataTip [in] pointer to the hwnd of data tip. Must be // preallocated and the hwnd assigned to NULL if // data tip has not been created. // nIdTool [in] resource is of tool to add datatip to. // pszDevNodeId [in] The device isntance id of the adapter. // pszBindName [in] Bind name of adapter. // // Returns: nothing // // Author: billbe 2 Aug 1999 // // Notes: // VOID CreateDeviceDataTip ( IN HWND hwndParent, IN OUT HWND* phwndDataTip, IN UINT nIdTool, IN PCWSTR pszDevNodeId, IN PCWSTR pszBindName) { if (!*phwndDataTip) { TraceTag (ttidLanUi, "Creating device datatip!!!"); *phwndDataTip = CreateWindowExW (0, TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwndParent, NULL, NULL, NULL); if (*phwndDataTip) { SetWindowPos (*phwndDataTip, HWND_TOPMOST, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); } } if (*phwndDataTip) { TTTOOLINFOW toolinfo = {0}; toolinfo.cbSize = sizeof (toolinfo); toolinfo.uId = (UINT_PTR)GetDlgItem (hwndParent, nIdTool); toolinfo.uFlags = TTF_SUBCLASS | TTF_IDISHWND; WCHAR szDataTip[_MAX_PATH] = {0}; // Get location info. if (pszDevNodeId) { GetLocationInfo (pszDevNodeId, szDataTip); } // Append Mac address. if (pszBindName) { AppendMacAddress (pszBindName, szDataTip); } // If there is anything to display, set the data tip. // if (*szDataTip) { toolinfo.lpszText = szDataTip; SendMessage (*phwndDataTip, TTM_ADDTOOL, 0, (LPARAM)&toolinfo); // In order to use '\n' to move to the next line of the data tip, // we need to set the width. We will set it to have of the // promary monitor's screen size. // DWORD dwToolTipWidth = GetSystemMetrics (SM_CXSCREEN) / 2; if (dwToolTipWidth) { SendMessage (*phwndDataTip, TTM_SETMAXTIPWIDTH, 0, dwToolTipWidth); } // Keep the tip up for 30 seconds. SendMessage (*phwndDataTip, TTM_SETDELAYTIME, TTDT_AUTOPOP, MAKELONG (30000, 0)); TraceTag (ttidLanUi, "Creating device datatip complete!!!"); } } else { TraceTag (ttidError, "Creating datatip failed"); } }