287 lines
7.2 KiB
C++
287 lines
7.2 KiB
C++
/*******************************************************************************
|
||
*
|
||
* (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"
|
||
|
||
|
||
|