Leaked source code of windows server 2003
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.
 
 
 
 
 
 

383 lines
12 KiB

/////////////////////////////////////////////////////////////////////////
//
// 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<CConfigMgrDevice>
{
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