///////////////////////////////////////////////////////////////////////// // // cfgmgrdevice.h // // Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved // // History: 10/15/97 Sanj Created by Sanj // 10/17/97 jennymc Moved things a tiny bit // ///////////////////////////////////////////////////////////////////////// #ifndef __CFGMGRDEVICE_H__ #define __CFGMGRDEVICE_H__ ///////////////////////////////////////////////////////////////////////// // registry keys ///////////////////////////////////////////////////////////////////////// #define CONFIGMGR_ENUM_KEY L"Config Manager\\Enum\\" #define LOCALMACHINE_ENUM_KEY L"Enum\\" #define CONFIGMGR_DEVICE_HARDWAREKEY_VALUE _T("HardwareKey") #define CONFIGMGR_DEVICE_ALLOCATION_VALUE _T("Allocation") #define CONFIGMGR_DEVICEDESC_VALUE _T("DeviceDesc") #define CONFIGMGR_DEVICE_PROBLEM_VALUE _T("Problem") #define CONFIGMGR_DEVICE_STATUS_VALUE L"Status" #define CONFIGMGR_DEVICE_STATUS_VALUET _T("Status") #include "iodesc.h" #include "chwres.h" #include "sms95lanexp.h" #include "refptrlite.h" class CIRQCollection; class CDMACollection; class CDeviceMemoryCollection; class CNT4ServiceToResourceMap; BOOL WINAPI FindDosDeviceName ( const TCHAR *a_DosDeviceNameList , const CHString a_SymbolicName , CHString &a_DosDevice , BOOL a_MappedDevice = FALSE ) ; BOOL WINAPI QueryDosDeviceNames ( TCHAR *&a_DosDeviceNameList ) ; class __declspec(uuid("CB0E0536-D375-11d2-B35E-00104BC97924")) CConfigMgrDevice; _COM_SMARTPTR_TYPEDEF(CConfigMgrDevice, __uuidof(CConfigMgrDevice)); ///////////////////////////////////////////////////////////////////////// class __declspec(uuid("CB0E0536-D375-11d2-B35E-00104BC97924")) CConfigMgrDevice : public CRefPtrLite { public: // Construction/Destruction CConfigMgrDevice( LPCWSTR pszConfigMgrName,DWORD dwTypeToGet ); //CConfigMgrDevice( LPCWSTR pszDevice ); CConfigMgrDevice( DEVNODE dn = NULL, DWORD dwResType = ResType_All ); ~CConfigMgrDevice(); ////////////////////////////////////////////////// // AVOID THESE FUNCTIONS, THESE ARE LEGACY // ////////////////////////////////////////////////// LPCWSTR GetName( void ); LPCWSTR GetHardwareKey( void ); LPCWSTR GetDeviceDesc( void ); // Status and problem functions DWORD GetStatus( void ); BOOL GetStatus( CHString& str ); void GetProblem( CHString& str ); DWORD GetProblem( void ); BOOL IsOK( void ); BOOL MapKeyToConfigMgrDeviceName(); ////////////////////////////////// // END LEGACY FUNCTIONS // ////////////////////////////////// ////////////////////////////////////////////////////// // USE THESE FUNCTIONS, THESE ARE THE REAL THING! // ////////////////////////////////////////////////////// // New functions that use config manager APIs directly // Resource retrieval void GetResourceList( CResourceCollection& resourceList, CNT4ServiceToResourceMap* pResourceMap = NULL ); BOOL GetIRQResources( CIRQCollection& irqList, CNT4ServiceToResourceMap* pResourceMap = NULL ); BOOL GetIOResources( CIOCollection& ioList, CNT4ServiceToResourceMap* pResourceMap = NULL ); BOOL GetDMAResources( CDMACollection& dmaList, CNT4ServiceToResourceMap* pResourceMap = NULL ); BOOL GetDeviceMemoryResources( CDeviceMemoryCollection& DeviceMemoryList, CNT4ServiceToResourceMap* pResourceMap = NULL ); // String Values BOOL GetDeviceDesc( CHString& strVal ); BOOL GetService( CHString& strVal ); BOOL GetClass( CHString& strVal ); BOOL GetClassGUID( CHString& strVal ); BOOL GetDriver( CHString& strVal ); BOOL GetMfg( CHString& strVal ); BOOL GetFriendlyName( CHString& strVal ); BOOL GetLocationInformation( CHString& strVal ); BOOL GetPhysicalDeviceObjectName( CHString& strVal ); BOOL GetEnumeratorName( CHString& strVal ); // DWORD Values BOOL GetConfigFlags( DWORD& dwVal ); BOOL GetCapabilities( DWORD& dwVal ); BOOL GetUINumber( DWORD& dwVal ); // MULTI_SZ Values BOOL GetHardwareID( CHStringArray& strArray ); BOOL GetCompatibleIDS( CHStringArray& strArray ); BOOL GetUpperFilters( CHStringArray& strArray ); BOOL GetLowerFilters( CHStringArray& strArray ); // Use Config Manager APIs directly BOOL GetStringProperty( ULONG ulProperty, CHString& strValue ); BOOL GetDWORDProperty( ULONG ulProperty, DWORD* pdwVal ); BOOL GetMULTISZProperty( ULONG ulProperty, CHStringArray& strArray ); // Device Relationship functions BOOL GetParent( CConfigMgrDevicePtr & pParentDevice ); BOOL GetChild( CConfigMgrDevicePtr & pChildDevice ); BOOL GetSibling( CConfigMgrDevicePtr & pSiblingDevice ); // Miscelaneous Device functions BOOL GetBusInfo( INTERFACE_TYPE* pitBusType, LPDWORD pdwBusNumber, CNT4ServiceToResourceMap* pResourceMap = NULL ); BOOL GetDeviceID( CHString& strID ); BOOL GetStatus( LPDWORD pdwStatus, LPDWORD pdwProblem ); BOOL IsUsingForcedConfig(); BOOL IsClass(LPCWSTR pwszClassName); // Direct registry access helpers BOOL GetRegistryKeyName( CHString &strName); BOOL GetRegStringProperty(LPCWSTR szProperty, CHString &strValue); BOOL operator == ( const CConfigMgrDevice& device ); private: // Registry traversal helpers // LEGACY FUNCTIONS BEGIN BOOL GetConfigMgrInfo( void ); BOOL GetDeviceInfo( void ); BOOL GetHardwareKey( HKEY hKey ); BOOL GetResourceAllocation( HKEY hKey ); BOOL GetStatusInfo( HKEY hKey ); BOOL GetDeviceDesc( HKEY hKey ); // LEGACY FUNCTIONS END #if NTONLY > 4 // NT 5 Helpers BOOL GetBusInfoNT5( INTERFACE_TYPE* pitBusType, LPDWORD pdwBusNumber ); static BOOL WINAPI IsIsaReallyEisa(); static INTERFACE_TYPE WINAPI ConvertBadIsaBusType(INTERFACE_TYPE type); #endif // Resource Allocation Data Helpers // Resource allocation registry walkthroughs void TraverseAllocationData( CResourceCollection& resourceList ); void TraverseData( const BYTE *& pbTraverseData, DWORD& dwSizeRemainingData, DWORD dwSizeTraverse ); BOOL GetNextResource( const BYTE * pbTraverseData, DWORD dwSizeRemainingData, DWORD& dwResourceType, DWORD& dwResourceSize ); // Resource functions BOOL WalkAllocatedResources( CResourceCollection& resourceList, CNT4ServiceToResourceMap* pResourceMap, RESOURCEID resType ); BOOL AddResourceToList( RESOURCEID resourceID, LPVOID pResource, DWORD dwResourceLength, CResourceCollection& resourceList ); #ifdef NTONLY // NT4 Resource functions BOOL WalkAllocatedResourcesNT4( CResourceCollection& resourceList, CNT4ServiceToResourceMap* pResourceMap, CM_RESOURCE_TYPE resType ); BOOL GetServiceResourcesNT4( LPCWSTR pszServiceName, CNT4ServiceToResourceMap& resourceMap, CResourceCollection& resourceList, CM_RESOURCE_TYPE cmrtFilter = CmResourceTypeNull ); #if NTONLY == 4 BOOL GetBusInfoNT4( INTERFACE_TYPE* pitBusType, LPDWORD pdwBusNumber, CNT4ServiceToResourceMap* pResourceMap ); #endif // NT 4 resource datatype coercsion functions CM_RESOURCE_TYPE RESOURCEIDToCM_RESOURCE_TYPE( RESOURCEID resType ); void NT4IRQToIRQ_DES( LPRESOURCE_DESCRIPTOR pResourceDescriptor, PIRQ_DES pirqDes32 ); void NT4IOToIOWBEM_DES( LPRESOURCE_DESCRIPTOR pResourceDescriptor, PIOWBEM_DES pioDes32 ); void NT4MEMToMEM_DES( LPRESOURCE_DESCRIPTOR pResourceDescriptor, PMEM_DES pmemDes32 ); void NT4DMAToDMA_DES( LPRESOURCE_DESCRIPTOR pResourceDescriptor, PDMA_DES pdmaDes32 ); #endif // 16 to 32-bit coercsion functions void IRQDes16To32( PIRQ_DES16 pirqDes16, PIRQ_DES pirqDes32 ); void IODes16To32( PIO_DES16 pioDes16, PIOWBEM_DES pioDes32 ); void DMADes16To32( PDMA_DES16 pdmaDes16, PDMA_DES pdmaDes32 ); void MEMDes16To32( PMEM_DES16 pmemDes16, PMEM_DES pmemDes32 ); BOOL BusType16ToInterfaceType( CMBUSTYPE cmBusType16, INTERFACE_TYPE* pinterfaceType ); // LEGACY VARIABLES BEGIN CHString m_strConfigMgrName; CHString m_strHardwareKey; CHString m_strDeviceDesc; DWORD m_dwTypeToGet; // If we get allocation information, we store it in here. BYTE* m_pbAllocationData; DWORD m_dwSizeAllocationData; // Device status info DWORD m_dwStatus; DWORD m_dwProblem; #ifdef WIN9XONLY DWORD GetStatusFromConfigManagerDirectly(void); #endif // LEGACY VARIABLES END // Use the devnode to query values directly from config manager DEVNODE m_dn; }; inline LPCWSTR CConfigMgrDevice::GetName( void ) { return m_strConfigMgrName; } inline LPCWSTR CConfigMgrDevice::GetHardwareKey( void ) { return m_strHardwareKey; } inline LPCWSTR CConfigMgrDevice::GetDeviceDesc( void ) { return m_strDeviceDesc; } inline void CConfigMgrDevice::GetResourceList( CResourceCollection& resourceList, CNT4ServiceToResourceMap* pResourceMap/*=NULL*/ ) { WalkAllocatedResources( resourceList, pResourceMap, m_dwTypeToGet ); } inline DWORD CConfigMgrDevice::GetStatus( void ) { return m_dwStatus; } inline DWORD CConfigMgrDevice::GetProblem( void ) { return m_dwProblem; } inline BOOL CConfigMgrDevice::IsOK( void ) { return ( 0 == m_dwProblem ); } // New Config manager functions that query Config Manager (16 & 32 bit) // directly for info. // REG_SZ Properties inline BOOL CConfigMgrDevice::GetDeviceDesc( CHString& strVal ) { return GetStringProperty( CM_DRP_DEVICEDESC, strVal ); } inline BOOL CConfigMgrDevice::GetService( CHString& strVal ) { return GetStringProperty( CM_DRP_SERVICE, strVal ); } inline BOOL CConfigMgrDevice::GetClass( CHString& strVal ) { return GetStringProperty( CM_DRP_CLASS, strVal ); } inline BOOL CConfigMgrDevice::GetClassGUID( CHString& strVal ) { return GetStringProperty( CM_DRP_CLASSGUID, strVal ); } inline BOOL CConfigMgrDevice::GetDriver( CHString& strVal ) { return GetStringProperty( CM_DRP_DRIVER, strVal ); } inline BOOL CConfigMgrDevice::GetMfg( CHString& strVal ) { return GetStringProperty( CM_DRP_MFG, strVal ); } inline BOOL CConfigMgrDevice::GetFriendlyName( CHString& strVal ) { return GetStringProperty( CM_DRP_FRIENDLYNAME, strVal ); } inline BOOL CConfigMgrDevice::GetLocationInformation( CHString& strVal ) { return GetStringProperty( CM_DRP_LOCATION_INFORMATION, strVal ); } inline BOOL CConfigMgrDevice::GetPhysicalDeviceObjectName( CHString& strVal ) { return GetStringProperty( CM_DRP_PHYSICAL_DEVICE_OBJECT_NAME, strVal ); } inline BOOL CConfigMgrDevice::GetEnumeratorName( CHString& strVal ) { return GetStringProperty( CM_DRP_ENUMERATOR_NAME, strVal ); } // DWORD functions inline BOOL CConfigMgrDevice::GetConfigFlags( DWORD& dwVal ) { return GetDWORDProperty( CM_DRP_CONFIGFLAGS, &dwVal ); } inline BOOL CConfigMgrDevice::GetCapabilities( DWORD& dwVal ) { return GetDWORDProperty( CM_DRP_CAPABILITIES, &dwVal ); } inline BOOL CConfigMgrDevice::GetUINumber( DWORD& dwVal ) { return GetDWORDProperty( CM_DRP_UI_NUMBER, &dwVal ); } // MULTI_SZ properties inline BOOL CConfigMgrDevice::GetHardwareID( CHStringArray& strArray ) { return GetMULTISZProperty( CM_DRP_HARDWAREID, strArray ); } inline BOOL CConfigMgrDevice::GetCompatibleIDS( CHStringArray& strArray ) { return GetMULTISZProperty( CM_DRP_COMPATIBLEIDS, strArray ); } inline BOOL CConfigMgrDevice::GetUpperFilters( CHStringArray& strArray ) { return GetMULTISZProperty( CM_DRP_UPPERFILTERS, strArray ); } inline BOOL CConfigMgrDevice::GetLowerFilters( CHStringArray& strArray ) { return GetMULTISZProperty( CM_DRP_LOWERFILTERS, strArray ); } // Overloaded == operator. Checks if DEVNODEs are the same. inline BOOL CConfigMgrDevice::operator == ( const CConfigMgrDevice& device ) { return ( m_dn == device.m_dn ); } // A collection of Devices class CDeviceCollection : public TRefPtr { public: // Construction/Destruction CDeviceCollection(); ~CDeviceCollection(); // Get the resources for this list of devices. BOOL GetResourceList( CResourceCollection& resourceList ); BOOL GetIRQResources( CIRQCollection& IRQList ); BOOL GetDMAResources( CDMACollection& DMAList ); BOOL GetIOResources( CIOCollection& IOList ); BOOL GetDeviceMemoryResources( CDeviceMemoryCollection& DeviceMemoryList ); private: // Because we're inheriting, we need to declare this here // (= operator is not inherited). const CDeviceCollection& operator = ( const CDeviceCollection& srcCollection ); }; #endif