You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.9 KiB
91 lines
2.9 KiB
///////////////////////////////////////////////////////////////////////////////
|
|
// Hardware Event Detector
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
#ifndef _SHHWDTCT_H
|
|
#define _SHHWDTCT_H
|
|
|
|
#include "unk.h"
|
|
#include "service.h"
|
|
#include "namellst.h"
|
|
|
|
#include <dbt.h>
|
|
|
|
#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<CHWEventDetectorImpl> 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
|