/////////////////////////////////////////////////////////////////////////////// // Hardware Event Detector /////////////////////////////////////////////////////////////////////////////// #ifndef _SHHWDTCT_H #define _SHHWDTCT_H #include "unk.h" #include "service.h" #include "namellst.h" #include #define HINT_NONE 0 #define HINT_NEW 1 extern const CLSID CLSID_HWEventDetector; class CHWEventDetectorImpl : public CCOMBase, public IService { public: // Interface IService STDMETHODIMP InitMinimum(DWORD cArg, LPWSTR* ppszArgs, LPCWSTR pszEventRelinquishControl, DWORD* pdwCtrlAccept, BOOL* pfWantsDeviceEvents); STDMETHODIMP InitDeviceEventHandler(SERVICE_STATUS_HANDLE ssh); STDMETHODIMP InitFinal(); STDMETHODIMP Run(); // return S_FALSE and a non-zero dwWaitHint if pending STDMETHODIMP HandleServiceControl(DWORD dwControlCode, DWORD* pdwWaitHint); STDMETHODIMP HandlePowerEvent(DWORD dwEventType, LPVOID pEventData); STDMETHODIMP HandleDeviceEvent(DWORD dwEventType, LPVOID pEventData); STDMETHODIMP HandleHWProfileEvent(DWORD dwEventType, LPVOID pEventData); STDMETHODIMP HandleSessionChange(DWORD dwEventType, LPVOID pvEventData); public: CHWEventDetectorImpl(); ~CHWEventDetectorImpl(); static HRESULT HandleVolumeMediaEvent(LPCWSTR pszDeviceIDVolume, class CHWDeviceInst* phwdevinst, LPCWSTR pszEventType, BOOL* pfHasHandler); private: HRESULT _HandleInterfaceEvent(DEV_BROADCAST_DEVICEINTERFACE* pdbdi, DWORD dwEventType); HRESULT _HandleBroadcastHandleEvent(DEV_BROADCAST_HANDLE* pdbh, DWORD dwEventType); HRESULT _RegisterForNotif(); HRESULT _UnregisterForNotif(); // COM Server stuff HRESULT _RegisterFactories(); HRESULT _UnregisterFactories(); HRESULT _SuspendFactories(); HRESULT _ResumeFactories(); private: HANDLE _hEventRelinquishControl; HDEVNOTIFY _hdevnotifyAllInterfaces; HANDLE _hEventInitCompleted; #ifdef DEBUG void _DbgAssertValidState(); #endif }; typedef CUnkTmpl CHWEventDetector; // for now HRESULT _ExecuteHandler(LPCWSTR pszDeviceID, LPCWSTR pszEventType, LPCWSTR pszHandler); HRESULT _FinalDispatch(LPCWSTR pszDeviceIntfID, LPCWSTR pszEventType, LPCWSTR pszEventHandler); HRESULT _DispatchToHandler(LPCWSTR pszDeviceIntfID, class CHWDeviceInst* phwdevinst, LPCWSTR pszEventType, BOOL* pfHasHandler); HRESULT _ProcessInterfaceSpecialCased(GUID* pguidInterface, LPCWSTR pszDeviceID, DWORD dwEventType); HRESULT _IsInterfaceSpecialCased(GUID* pguidClass, BOOL* pfSpecialCased); HRESULT _TryAutoplay(LPCWSTR pszDeviceIntfID, CHWDeviceInst* phwdevinst, DWORD dwEventType); #endif // _SHHWDTCT_H