|
|
#include <pch.h>
#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"); } }
|