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.
 
 
 
 
 
 

176 lines
5.2 KiB

#ifndef _CMMN_H_
#define _CMMN_H_
#include "namellst.h"
#include "mischlpr.h"
#include <objbase.h>
#include <dbt.h>
#include <cfgmgr32.h>
#include <devioctl.h>
#define MAX_SURPRISEREMOVALFN 50
///////////////////////////////////////////////////////////////////////////////
//
extern const GUID guidVolumeClass;
extern const GUID guidDiskClass;
extern const GUID guidCdRomClass;
extern const GUID guidImagingDeviceClass;
extern const GUID guidVideoCameraClass;
extern const GUID guidInvalid;
///////////////////////////////////////////////////////////////////////////////
//
class CHandleNotifTarget
{
public:
virtual HRESULT HNTHandleEvent(DEV_BROADCAST_HANDLE* pdbh,
DWORD dwEventType) = 0;
HRESULT HNTInitSurpriseRemoval();
BOOL HNTIsSurpriseRemovalAware();
CHandleNotifTarget();
virtual ~CHandleNotifTarget();
private:
BOOL _fSurpriseRemovalAware;
};
enum HWEDLIST
{
HWEDLIST_INVALID = -1,
HWEDLIST_HANDLENOTIF,
HWEDLIST_VOLUME,
HWEDLIST_DISK,
HWEDLIST_MTPT,
HWEDLIST_MISCDEVINTF,
HWEDLIST_MISCDEVNODE,
HWEDLIST_ADVISECLIENT,
HWEDLIST_COUNT_OF_LISTS, //always last, not a list
};
class CHWEventDetectorHelper
{
public:
static HRESULT Init();
static HRESULT Cleanup();
static void TraceDiagnosticMsg(LPTSTR pszMsg, ...);
static HRESULT CheckDiagnosticAppPresence();
static HRESULT SetServiceStatusHandle(SERVICE_STATUS_HANDLE ssh);
static HRESULT CreateLists();
static HRESULT DeleteLists();
static HRESULT FillLists();
static HRESULT EmptyLists();
static HRESULT GetList(HWEDLIST hwedlist, CNamedElemList** ppnel);
static HRESULT RegisterDeviceNotification(PVOID pvNotificationFilter,
HDEVNOTIFY* phdevnotify, BOOL fAllInterfaceClasses);
static HRESULT InitDockState();
static HRESULT DockStateChanged(BOOL* pfDockStateChanged);
static HRESULT GetImpersonateEveryone(class CImpersonateEveryone** ppieo);
#ifdef DEBUG
public:
static void _DbgAssertValidState();
#endif
public:
static BOOL _fDiagnosticAppPresent;
private:
static DWORD _dwDiagAppLastCheck;
static SERVICE_STATUS_HANDLE _ssh;
static BOOL _fListCreated;
static CNamedElemList* _rgpnel[];
static DWORD _cpnel;
static BOOL _fDocked;
static CImpersonateEveryone* _pieo;
static CCriticalSection _cs;
static BOOL _fInited;
};
///////////////////////////////////////////////////////////////////////////////
//
typedef HRESULT (*INTERFACEENUMFILTERCALLBACK)(LPCWSTR pszDeviceIntfID);
class CIntfFillEnum
{
public:
HRESULT Next(LPWSTR pszElemName, DWORD cchElemName, DWORD* pcchRequired);
HRESULT _Init(const GUID* pguidInterface, INTERFACEENUMFILTERCALLBACK iecb);
public:
CIntfFillEnum();
~CIntfFillEnum();
private:
LPWSTR _pszNextInterface;
LPWSTR _pszDeviceInterface;
INTERFACEENUMFILTERCALLBACK _iecb;
};
///////////////////////////////////////////////////////////////////////////////
//
HRESULT _DeviceInstIsRemovable(DEVINST devinst, BOOL* pfRemovable);
HANDLE _GetDeviceHandle(LPCTSTR psz, DWORD dwDesiredAccess);
void _CloseDeviceHandle(HANDLE hDevice);
HRESULT _GetDeviceNumberInfoFromHandle(HANDLE h, DEVICE_TYPE* pdevtype,
ULONG* pulDeviceNumber, ULONG* pulPartitionNumber);
HRESULT _GetVolumeName(LPCWSTR pszDeviceID, LPWSTR pszVolumeName,
DWORD cchVolumeName);
HRESULT _GetDeviceIDFromMtPtName(LPCWSTR pszMtPt, LPWSTR pszDeviceID,
DWORD cchDeviceID);
HRESULT _GetDeviceIDFromHDevNotify(HDEVNOTIFY hdevnotify,
LPWSTR pszDeviceID, DWORD cchDeviceID, DWORD* pcchRequired);
HRESULT _GetDeviceID(LPCWSTR pszName, LPWSTR pszDeviceID,
DWORD cchDeviceID);
HRESULT _GetHWDeviceInstFromDeviceOrVolumeIntfID(LPCWSTR pszDeviceIntfID,
class CHWDeviceInst** pphwdevinst, CNamedElem** ppelemToRelease);
HRESULT _GetHWDeviceInstFromVolumeIntfID(LPCWSTR pszDeviceIntfID,
CHWDeviceInst** pphwdevinst, CNamedElem** ppelemToRelease);
HRESULT _GetHWDeviceInstFromDeviceIntfID(LPCWSTR pszDeviceIntfID,
CHWDeviceInst** pphwdevinst, CNamedElem** ppelemToRelease);
HRESULT _GetHWDeviceInstFromDeviceNode(LPCWSTR pszDeviceNode,
CHWDeviceInst** pphwdevinst, CNamedElem** ppelemToRelease);
HRESULT _GetVolume(LPCWSTR pszVolume, class CVolume** ppvol);
HRESULT _GetAltDeviceID(LPCWSTR pszDeviceID, LPWSTR pszDeviceIDAlt,
DWORD cchDeviceIDAlt);
HRESULT _CoTaskMemCopy(LPCWSTR pszSrc, LPWSTR* ppszDest);
void _CoTaskMemFree(void* pv);
HRESULT DupString(LPCWSTR pszSrc, LPWSTR* ppszDest);
HRESULT _GetDeviceInstance(LPCWSTR pszDeviceIntfID, DEVINST* pdevinst,
GUID* pguidInterface);
HRESULT _GetDeviceInstanceFromDevNode(LPCWSTR pszDeviceNode,
DEVINST* pdevinst);
HRESULT _MachineIsDocked(BOOL* pfDocked);
HRESULT _BuildMoniker(LPCWSTR pszEventHandler, REFCLSID rclsid,
DWORD dwSessionID, IMoniker** ppmoniker);
///////////////////////////////////////////////////////////////////////////////
//
#define DIAGNOSTIC(__allargs) { if (CHWEventDetectorHelper::_fDiagnosticAppPresent) \
{ CHWEventDetectorHelper::TraceDiagnosticMsg __allargs ; } else \
{ ; } }
#endif //_CMMN_H_