windows-nt/Source/XPSP1/NT/shell/osshell/cpls/usb/entry.cpp
2020-09-26 16:20:57 +08:00

287 lines
7.2 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*******************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORP., 1993-1995
* TITLE: ENTRY.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 "UsbPopup.h"
#include "debug.h"
#include "usbapp.h"
HINSTANCE gHInst = 0;
extern "C" {
BOOL APIENTRY
DllMain(HANDLE hDll,
DWORD dwReason,
LPVOID lpReserved)
{
switch (dwReason) {
case DLL_PROCESS_ATTACH:
gHInst = (HINSTANCE) hDll;
UsbPropertyPage::SetHandle(hDll);
InitCommonControls();
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
default:
break;
}
return TRUE;
}
BOOL APIENTRY
UsbControlPanelApplet()
{
UsbApplet *applet = new UsbApplet();
if (applet) {
return applet->CustomDialog();
}
return FALSE;
}
BOOL APIENTRY
USBControllerPropPageProvider(LPVOID pinfo,
LPFNADDPROPSHEETPAGE pfnAdd,
LPARAM lParam)
{
PSP_PROPSHEETPAGE_REQUEST request;
HPROPSHEETPAGE hBandwidth; //, hPower;
BandwidthPage *bandwidth;
// PowerPage *power;
request = (PSP_PROPSHEETPAGE_REQUEST) pinfo;
if (request->PageRequested != SPPSR_ENUM_ADV_DEVICE_PROPERTIES)
return FALSE;
bandwidth = new BandwidthPage(request->DeviceInfoSet,
request->DeviceInfoData);
if (!bandwidth) {
USBERROR((_T("Out of memory!\n")));
return FALSE;
}
AddChunk(bandwidth);
hBandwidth = bandwidth->Create();
if (!hBandwidth) {
DeleteChunk(bandwidth);
delete bandwidth;
CheckMemory();
return FALSE;
}
if (!pfnAdd(hBandwidth, lParam)) {
DestroyPropertySheetPage(hBandwidth);
DeleteChunk(bandwidth);
delete bandwidth;
CheckMemory();
return FALSE;
}
return TRUE;
}
BOOL APIENTRY
USBDevicePropPageProvider(LPVOID pinfo,
LPFNADDPROPSHEETPAGE pfnAdd,
LPARAM lParam)
{
PSP_PROPSHEETPAGE_REQUEST request;
HPROPSHEETPAGE hDevicePage; //, hPower;
GenericPage *generic;
// PowerPage *power;
request = (PSP_PROPSHEETPAGE_REQUEST) pinfo;
if (request->PageRequested != SPPSR_ENUM_ADV_DEVICE_PROPERTIES)
return FALSE;
generic = new GenericPage(request->DeviceInfoSet,
request->DeviceInfoData);
if (!generic) {
USBERROR((_T("Out of memory!\n")));
return FALSE;
}
AddChunk(generic);
hDevicePage = generic->Create();
if (!hDevicePage) {
DeleteChunk(generic);
delete generic;
CheckMemory();
return FALSE;
}
if (!pfnAdd(hDevicePage, lParam)) {
DestroyPropertySheetPage(hDevicePage);
DeleteChunk(generic);
delete generic;
CheckMemory();
return FALSE;
}
return TRUE;
}
BOOL APIENTRY
USBHubPropPageProvider(LPVOID pinfo,
LPFNADDPROPSHEETPAGE pfnAdd,
LPARAM lParam)
{
PSP_PROPSHEETPAGE_REQUEST request;
HPROPSHEETPAGE hPower;
PowerPage *power;
request = (PSP_PROPSHEETPAGE_REQUEST) pinfo;
if (request->PageRequested != SPPSR_ENUM_ADV_DEVICE_PROPERTIES)
return FALSE;
power = new PowerPage(request->DeviceInfoSet,
request->DeviceInfoData);
if (!power) {
USBERROR((_T("Out of memory!\n")));
return FALSE;
}
AddChunk(power);
hPower = power->Create();
if (!hPower) {
DeleteChunk(power);
delete power;
CheckMemory();
return FALSE;
}
if (!pfnAdd(hPower, lParam)) {
DestroyPropertySheetPage(hPower);
DeleteChunk(power);
delete power;
CheckMemory();
return FALSE;
}
return TRUE;
}
BOOL
USBControllerBandwidthPage(HWND hWndParent,
LPCSTR DeviceName)
{
BandwidthPage *band;
band = new BandwidthPage(hWndParent, DeviceName);
if (!band) {
USBERROR((_T("Out of memory!\n")));
return FALSE;
}
AddChunk(band);
band->CreateIndependent();
delete band;
return TRUE;
}
BOOL
USBHubPowerPage(HWND hWndParent,
LPCSTR DeviceName)
{
PowerPage *power;
power = new PowerPage(hWndParent, DeviceName);
if (!power) {
USBERROR((_T("Out of memory!\n")));
return FALSE;
}
AddChunk(power);
power->CreateIndependent();
delete power;
return TRUE;
}
void USBErrorHandler(PUSB_CONNECTION_NOTIFICATION usbConnectionNotification,
LPTSTR strInstanceName)
{
static LONG bandwidthPopupExists = 0;
static LONG powerPopupExists = 0;
static LONG legacyPopupExists = 0;
static LONG overcurrentPopupExists = 0;
static LPTSTR currentInstanceName = NULL;
static HANDLE hMutex = NULL;
if (!hMutex) {
hMutex = CreateMutex(NULL, TRUE, NULL);
} else {
WaitForSingleObject(hMutex, INFINITE);
}
//
// Call the appropriate handler
//
USBTRACE((_T("Error Notification - %d\n"), usbConnectionNotification->NotificationType));
switch (usbConnectionNotification->NotificationType) {
case InsufficentBandwidth:
USBTRACE((_T("Insufficent Bandwidth\n")));
if (InterlockedIncrement(&bandwidthPopupExists) == 1) {
UsbBandwidthPopup popup;
popup.Make(usbConnectionNotification, strInstanceName);
}
InterlockedDecrement(&bandwidthPopupExists);
break;
case InsufficentPower: {
USBTRACE((_T("Insufficent Power\n")));
UsbPowerPopup popup;
popup.Make(usbConnectionNotification, strInstanceName);
break; }
case OverCurrent: {
USBTRACE((_T("Over Current\n")));
UsbOvercurrentPopup popup;
popup.Make(usbConnectionNotification, strInstanceName);
break; }
case EnumerationFailure: {
USBTRACE((_T("Enumeration Failure\n")));
UsbEnumFailPopup popup;
popup.Make(usbConnectionNotification, strInstanceName);
break; }
case ModernDeviceInLegacyHub: {
USBTRACE((_T("ModernDeviceInLegacyHub\n")));
UsbLegacyPopup popup;
popup.Make(usbConnectionNotification, strInstanceName);
break; }
case HubNestedTooDeeply: {
USBTRACE((_T("HubNestedTooDeeply\n")));
UsbNestedHubPopup popup;
popup.Make(usbConnectionNotification, strInstanceName);
break; }
case ResetOvercurrent:
default:
break;
}
CheckMemory();
ReleaseMutex(hMutex);
}
} // extern "C"