Source code of Windows XP (NT5)
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.8 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