444 lines
12 KiB
C++
444 lines
12 KiB
C++
|
/*******************************************************************************
|
||
|
*
|
||
|
* (C) COPYRIGHT MICROSOFT CORP., 1993-1995
|
||
|
* TITLE: PROPPAGE.CPP
|
||
|
* VERSION: 1.0
|
||
|
* AUTHOR: jsenior
|
||
|
* DATE: 10/28/1998
|
||
|
*
|
||
|
********************************************************************************
|
||
|
*
|
||
|
* CHANGE LOG:
|
||
|
*
|
||
|
* DATE REV DESCRIPTION
|
||
|
* ---------- ------- ----------------------------------------------------------
|
||
|
* 10/28/1998 jsenior Original implementation.
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
#include "BandPage.h"
|
||
|
#include "PowrPage.h"
|
||
|
#include "debug.h"
|
||
|
|
||
|
HANDLE UsbPropertyPage::hInst = (HANDLE) 0;
|
||
|
|
||
|
UsbPropertyPage::UsbPropertyPage(HDEVINFO DeviceInfoSet,
|
||
|
PSP_DEVINFO_DATA DeviceInfoData) :
|
||
|
deviceInfoSet(DeviceInfoSet), deviceInfoData(DeviceInfoData), imageList()
|
||
|
{
|
||
|
preItem = 0;
|
||
|
hWndParent = NULL;
|
||
|
rootItem = NULL;
|
||
|
}
|
||
|
|
||
|
UsbPropertyPage::UsbPropertyPage(HWND HWndParent, LPCSTR DeviceName) :
|
||
|
deviceInfoSet(0), deviceInfoData(0), imageList()
|
||
|
{
|
||
|
WCHAR realName[MAX_PATH];
|
||
|
|
||
|
if (MultiByteToWideChar(CP_ACP,
|
||
|
MB_PRECOMPOSED,
|
||
|
DeviceName,
|
||
|
-1,
|
||
|
realName,
|
||
|
MAX_PATH)) {
|
||
|
deviceName = realName;
|
||
|
}
|
||
|
|
||
|
preItem = 0;
|
||
|
hWndParent = HWndParent;
|
||
|
rootItem = NULL;
|
||
|
}
|
||
|
|
||
|
UsbPropertyPage::UsbPropertyPage(UsbItem *item) :
|
||
|
deviceInfoSet(0), deviceInfoData(0), imageList()
|
||
|
{
|
||
|
preItem = item;
|
||
|
hWndParent = NULL;
|
||
|
rootItem = NULL;
|
||
|
}
|
||
|
|
||
|
HPROPSHEETPAGE UsbPropertyPage::Create()
|
||
|
{
|
||
|
//
|
||
|
// Add the Port Settings property page
|
||
|
//
|
||
|
psp.dwSize = sizeof(PROPSHEETPAGE);
|
||
|
psp.dwFlags = PSP_USECALLBACK; // | PSP_HASHELP;
|
||
|
psp.hInstance = (HINSTANCE) hInst;
|
||
|
psp.pszTemplate = MAKEINTRESOURCE(dlgResource);
|
||
|
|
||
|
//
|
||
|
// following points to the dlg window proc
|
||
|
//
|
||
|
psp.pfnDlgProc = StaticDialogProc;
|
||
|
psp.lParam = (LPARAM) this;
|
||
|
|
||
|
//
|
||
|
// Following points to the control callback of the dlg window proc.
|
||
|
// The callback gets called before creation/after destruction of the page
|
||
|
//
|
||
|
psp.pfnCallback = StaticDialogCallback;
|
||
|
|
||
|
//
|
||
|
// Allocate the actual page
|
||
|
//
|
||
|
return CreatePropertySheetPage(&psp);
|
||
|
}
|
||
|
|
||
|
UINT CALLBACK
|
||
|
UsbPropertyPage::StaticDialogCallback(HWND Hwnd,
|
||
|
UINT Msg,
|
||
|
LPPROPSHEETPAGE Page)
|
||
|
{
|
||
|
UsbPropertyPage *that;
|
||
|
that = (UsbPropertyPage*) Page->lParam;
|
||
|
|
||
|
switch (Msg) {
|
||
|
case PSPCB_CREATE:
|
||
|
return TRUE; // return TRUE to continue with creation of page
|
||
|
case PSPCB_RELEASE:
|
||
|
DeleteChunk(that);
|
||
|
delete that;
|
||
|
CheckMemory();
|
||
|
|
||
|
return 0; // return value ignored
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
UsbPropertyPage::OnContextMenu(HWND HwndControl,
|
||
|
WORD Xpos,
|
||
|
WORD Ypos)
|
||
|
{
|
||
|
WinHelp(HwndControl,
|
||
|
TEXT(HELPFILE),
|
||
|
HELP_CONTEXTMENU,
|
||
|
(USBULONG_PTR) HelpIds);
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
UsbPropertyPage::OnHelp(HWND ParentHwnd,
|
||
|
LPHELPINFO HelpInfo)
|
||
|
{
|
||
|
if (HelpInfo->iContextType == HELPINFO_WINDOW) {
|
||
|
WinHelp((HWND) HelpInfo->hItemHandle,
|
||
|
TEXT(HELPFILE),
|
||
|
HELP_WM_HELP,
|
||
|
(USBULONG_PTR) HelpIds);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
USBINT_PTR APIENTRY UsbPropertyPage::StaticDialogProc(IN HWND hDlg,
|
||
|
IN UINT uMessage,
|
||
|
IN WPARAM wParam,
|
||
|
IN LPARAM lParam)
|
||
|
{
|
||
|
UsbPropertyPage *that;
|
||
|
|
||
|
that = (UsbPropertyPage *) UsbGetWindowLongPtr(hDlg, USBDWLP_USER);
|
||
|
|
||
|
if (!that && uMessage != WM_INITDIALOG)
|
||
|
return FALSE; //DefDlgProc(hDlg, uMessage, wParam, lParam);
|
||
|
|
||
|
switch (uMessage) {
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
return that->OnCommand(HIWORD(wParam),
|
||
|
LOWORD(wParam),
|
||
|
(HWND) lParam);
|
||
|
|
||
|
case WM_INITDIALOG:
|
||
|
that = (UsbPropertyPage *) ((LPPROPSHEETPAGE)lParam)->lParam;
|
||
|
UsbSetWindowLongPtr(hDlg, USBDWLP_USER, (USBLONG_PTR) that);
|
||
|
that->hwnd = hDlg;
|
||
|
|
||
|
return that->OnInitDialog();
|
||
|
|
||
|
case WM_NOTIFY:
|
||
|
return that->OnNotify(hDlg, (int) wParam, (LPNMHDR) lParam);
|
||
|
|
||
|
case WM_CONTEXTMENU:
|
||
|
return that->OnContextMenu((HWND)wParam, LOWORD(lParam), HIWORD(lParam));
|
||
|
|
||
|
case WM_HELP:
|
||
|
that->OnHelp(hDlg, (LPHELPINFO) lParam);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return that->ActualDialogProc(hDlg, uMessage, wParam, lParam);
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL UsbPropertyPage::OnNotify(HWND hDlg, int nID, LPNMHDR pnmh)
|
||
|
{
|
||
|
switch (pnmh->code) {
|
||
|
//
|
||
|
// Sent when the user clicks on Apply OR OK !!
|
||
|
//
|
||
|
case PSN_APPLY:
|
||
|
//
|
||
|
// Do what ever action is necessary
|
||
|
//
|
||
|
UsbSetWindowLongPtr(hwnd, USBDWLP_MSGRESULT, PSNRET_NOERROR);
|
||
|
|
||
|
return TRUE;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
UsbPropertyPage::GetDeviceName()
|
||
|
{
|
||
|
HKEY hDeviceKey;
|
||
|
DWORD dwBufferSize, dwError;
|
||
|
WCHAR szBuffer[MAX_PATH];
|
||
|
|
||
|
//
|
||
|
// Open the device key for the source device instance, and retrieve its
|
||
|
// "SymbolicName" value.
|
||
|
//
|
||
|
hDeviceKey = SetupDiOpenDevRegKey(deviceInfoSet,
|
||
|
deviceInfoData,
|
||
|
DICS_FLAG_GLOBAL,
|
||
|
0,
|
||
|
DIREG_DEV,
|
||
|
KEY_ALL_ACCESS);
|
||
|
|
||
|
if (INVALID_HANDLE_VALUE == hDeviceKey) {
|
||
|
goto GetDeviceNameError;
|
||
|
}
|
||
|
|
||
|
dwBufferSize = sizeof(szBuffer);
|
||
|
dwError = RegQueryValueEx(hDeviceKey,
|
||
|
_T("SymbolicName"),
|
||
|
NULL,
|
||
|
NULL,
|
||
|
(PBYTE)szBuffer,
|
||
|
&dwBufferSize);
|
||
|
|
||
|
if(ERROR_SUCCESS != dwError) {
|
||
|
goto GetDeviceNameError;
|
||
|
}
|
||
|
deviceName = szBuffer;
|
||
|
RegCloseKey(hDeviceKey);
|
||
|
return TRUE;
|
||
|
GetDeviceNameError:
|
||
|
if (hDeviceKey != INVALID_HANDLE_VALUE) {
|
||
|
RegCloseKey(hDeviceKey);
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
UsbPropertyPage::DisplayPPSelectedListItem(HWND main, HWND hList)
|
||
|
{
|
||
|
LVITEM item;
|
||
|
BOOL b;
|
||
|
int itemIndex = ListView_GetNextItem(hList, -1, LVNI_SELECTED);
|
||
|
|
||
|
ZeroMemory(&item, sizeof(LVITEM));
|
||
|
item.mask = LVIF_PARAM;
|
||
|
item.iItem = itemIndex;
|
||
|
b = ListView_GetItem(hList, &item);
|
||
|
|
||
|
if (!b) {
|
||
|
return;
|
||
|
}
|
||
|
ShowPropertyPage(main, (UsbItem*) item.lParam);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
UsbPropertyPage::DisplayPPSelectedTreeItem(HWND main, HWND hList)
|
||
|
{
|
||
|
TVITEM item;
|
||
|
BOOL b;
|
||
|
|
||
|
ZeroMemory(&item, sizeof(TVITEM));
|
||
|
|
||
|
if (NULL == (item.hItem = TreeView_GetSelection(hList))) {
|
||
|
return;
|
||
|
}
|
||
|
item.mask = TVIF_PARAM;
|
||
|
|
||
|
b = TreeView_GetItem(hList, &item);
|
||
|
if (!b) {
|
||
|
return;
|
||
|
}
|
||
|
ShowPropertyPage(main, (UsbItem*) item.lParam);
|
||
|
}
|
||
|
|
||
|
#ifdef WINNT
|
||
|
typedef USBINT_PTR (FAR *DeviceProp)(HWND, LPCTSTR, LPCTSTR, BOOL);
|
||
|
|
||
|
void
|
||
|
UsbPropertyPage::ShowPropertyPage(HWND parent, UsbItem *usbItem)
|
||
|
{
|
||
|
HINSTANCE h;
|
||
|
DeviceProp p;
|
||
|
TCHAR buf[MAX_PATH];
|
||
|
|
||
|
if (usbItem != NULL) {
|
||
|
CM_Get_Device_ID(usbItem->configInfo->devInst,
|
||
|
buf,
|
||
|
MAX_PATH,
|
||
|
NULL);
|
||
|
h = LoadLibrary(TEXT("devmgr.dll"));
|
||
|
if (h) {
|
||
|
p = (DeviceProp) GetProcAddress(h, "DevicePropertiesW");
|
||
|
if (p) {
|
||
|
p (parent, NULL, buf, FALSE);
|
||
|
}
|
||
|
FreeLibrary(h);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#else
|
||
|
void
|
||
|
UsbPropertyPage::ShowPropertyPage(HWND HWndParent, UsbItem *usbItem)
|
||
|
{
|
||
|
CHAR buf[MAX_PATH];
|
||
|
ULONG len = MAX_PATH;
|
||
|
CONFIGRET cfgRet;
|
||
|
HKEY hDevKey;
|
||
|
|
||
|
if (usbItem != NULL) {
|
||
|
if (CR_SUCCESS != (cfgRet =
|
||
|
CM_Open_DevNode_Key(usbItem->configInfo->devInst,
|
||
|
KEY_QUERY_VALUE,
|
||
|
CM_REGISTRY_HARDWARE,
|
||
|
RegDisposition_OpenExisting,
|
||
|
&hDevKey,
|
||
|
0))) {
|
||
|
return;
|
||
|
}
|
||
|
len = MAX_PATH;
|
||
|
if (ERROR_SUCCESS != RegQueryValueEx(hDevKey,
|
||
|
_T("SymbolicName"),
|
||
|
NULL,
|
||
|
NULL,
|
||
|
(LPBYTE) &buf,
|
||
|
&len)) {
|
||
|
RegCloseKey(hDevKey);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (usbItem->itemType == UsbItem::UsbItemType::HCD) {
|
||
|
BandwidthPage *band;
|
||
|
band = new BandwidthPage(HWndParent, buf);
|
||
|
AddChunk(band);
|
||
|
if (!band) {
|
||
|
return;
|
||
|
}
|
||
|
band->CreateIndependent();
|
||
|
DeleteChunk(band);
|
||
|
delete band;
|
||
|
} else if (usbItem->itemType == UsbItem::UsbItemType::RootHub ||
|
||
|
usbItem->itemType == UsbItem::UsbItemType::Hub) {
|
||
|
PowerPage *power;
|
||
|
power = new PowerPage(HWndParent, buf);
|
||
|
AddChunk(power);
|
||
|
if (!power) {
|
||
|
return;
|
||
|
}
|
||
|
power->CreateIndependent();
|
||
|
DeleteChunk(power);
|
||
|
delete power;
|
||
|
} /*else {
|
||
|
GenericPage *generic;
|
||
|
generic = new GenericPage(HWndParent, buf);
|
||
|
AddChunk(generic);
|
||
|
if (!generic) {
|
||
|
return;
|
||
|
}
|
||
|
generic->CreateIndependent();
|
||
|
DeleteChunk(generic);
|
||
|
delete generic;
|
||
|
} */
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
VOID
|
||
|
UsbPropertyPage::CreateAsChild(HWND HWndParent,
|
||
|
HWND hCreateOn,
|
||
|
UsbItem *item)
|
||
|
{
|
||
|
RECT rc;
|
||
|
POINT *p = (POINT*) &rc;
|
||
|
GetWindowRect(hCreateOn, &rc);
|
||
|
ScreenToClient(HWndParent, p++);
|
||
|
ScreenToClient(HWndParent, p);
|
||
|
if (NULL != (hwnd = CreateDialogParam(gHInst,
|
||
|
MAKEINTRESOURCE(dlgResource),
|
||
|
HWndParent,
|
||
|
AppletDialogProc,
|
||
|
(LPARAM) this))) {
|
||
|
SetWindowPos(hwnd,
|
||
|
hCreateOn,
|
||
|
rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top,
|
||
|
SWP_SHOWWINDOW);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
UsbPropertyPage::CreateIndependent()
|
||
|
{
|
||
|
int error;
|
||
|
|
||
|
if (-1 == DialogBoxParam(gHInst,
|
||
|
MAKEINTRESOURCE(dlgResource),
|
||
|
hWndParent,
|
||
|
AppletDialogProc,
|
||
|
(LPARAM) this)) {
|
||
|
error = GetLastError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BOOL UsbPropertyPage::DestroyChild()
|
||
|
{
|
||
|
if (hwnd) {
|
||
|
return DestroyWindow(hwnd);
|
||
|
}
|
||
|
//
|
||
|
// If there's nothing to destroy, then in a way we've been successful
|
||
|
//
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
USBINT_PTR APIENTRY UsbPropertyPage::AppletDialogProc(IN HWND hDlg,
|
||
|
IN UINT uMessage,
|
||
|
IN WPARAM wParam,
|
||
|
IN LPARAM lParam)
|
||
|
{
|
||
|
UsbPropertyPage *that;
|
||
|
|
||
|
switch (uMessage) {
|
||
|
|
||
|
case WM_INITDIALOG:
|
||
|
that = (UsbPropertyPage *) lParam;
|
||
|
UsbSetWindowLongPtr(hDlg, USBDWLP_USER, (USBLONG_PTR) that);
|
||
|
that->hwnd = hDlg;
|
||
|
|
||
|
return that->OnInitDialog();
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
return StaticDialogProc(hDlg, uMessage, wParam, lParam);
|
||
|
}
|
||
|
|
||
|
|