/******************************************************************************* * * (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"