WindowsXP-SP1/admin/pchealth/sysinfo/control/devnode.h
2020-09-30 16:53:49 +02:00

253 lines
6.5 KiB
C++

/******************************************************************
devnode.h
Generic class for tracking CM32 Devnodes
first created (as such) by jeffth
Revision history
3-99 jeffth created
*******************************************************************/
#ifndef _INCLUDE_DEVNODE_H_
#define _INCLUDE_DEVNODE_H_
/*******************************************************************
INCLUDES
*******************************************************************/
#include <windows.h>
//#include <stl.h>
#include <cfgmgr32.h>
#include <alclass.h>
#include <stdio.h>
#include <stdlib.h>
// if we are ever compliled against win9x version of cfgmgr32.h
#ifndef CM_DISABLE_UI_NOT_OK
#define CM_DISABLE_UI_NOT_OK (0x00000004)
#endif
/*******************************************************************
DEFINES
*******************************************************************/
// UNICODE conversions
#ifdef UNICODE
#define sprintf swprintf
#define strstr wcsstr
#define strlen wcslen
#define strcmp wcscmp
#define _strupr _wcsupr
#define strcpy wcscpy
#define _strlwr _wcslwr
#define strncpy wcsncpy
#define atoi _wtoi
#define strchr wcschr
#define _fullpath _wfullpath
#define system _wsystem
#endif
#define CAN_DISABLE_BITS (DN_DISABLEABLE)
#define IGNORE_ME_BITS (DN_STOP_FREE_RES | DN_NEED_TO_ENUM | DN_ARM_WAKEUP)
// I had to copy this from ntioapi.h
// did not want to , but if i included all of teh goo that ntioapi.h wanted me to include,
// would break everyting else
//
// Define the I/O bus interface types.
//
typedef enum _INTERFACE_TYPE {
InterfaceTypeUndefined = -1,
Internal,
Isa,
Eisa,
MicroChannel,
TurboChannel,
PCIBus,
VMEBus,
NuBus,
PCMCIABus,
CBus,
MPIBus,
MPSABus,
ProcessorInternal,
InternalPowerBus,
PNPISABus,
PNPBus,
MaximumInterfaceType
}INTERFACE_TYPE, *PINTERFACE_TYPE;
#define BADHANDLE(x) ((x == 0 ) || ((HANDLE)x == INVALID_HANDLE_VALUE))
#define BUFFSIZE 1024
/*******************************************************************
CLASSES and STRUCTS
*******************************************************************/
class DevnodeClass : public AutoListClass
{
public:
DevnodeClass(void);
DevnodeClass(DEVNODE hDevnode, DEVNODE hParent = NULL);
~DevnodeClass(void);
virtual BOOL SetHandle(DEVNODE hDevnode, DEVNODE hParent = NULL);
// Disable funcions
CONFIGRET Remove(ULONG uFlags = CM_REMOVE_UI_NOT_OK);
CONFIGRET Refresh(ULONG uFlags = CM_REENUMERATE_SYNCHRONOUS);
CONFIGRET Enable(ULONG uFlags = CM_SETUP_DEVNODE_READY); // enables the devnode, returns CM_ERROR code
CONFIGRET Disable(ULONG uFlags = (CM_DISABLE_POLITE | CM_DISABLE_UI_NOT_OK)); // disables the devnode, returns CM_ERROR code
CONFIGRET GetProblemCode(ULONG *Status = NULL, ULONG *Problem = NULL);
// getrelations
CONFIGRET GetChild (DEVNODE *pChildDevnode);
CONFIGRET GetParent (DEVNODE *pParentDevnode);
CONFIGRET GetSibling (DEVNODE *pSiblingDevnode);
int operator==(const DevnodeClass &OtherDevnode);
// refresh devnode funcitons
CONFIGRET GetDeviceInformation (void); // gets information about the devnode
CONFIGRET FindDevnode(void);
// acessor funcitons
ULONG ProblemCode(void) {return ulProblemCode;};
ULONG StatusCode(void) {return ulStatus;};
TCHAR *DeviceName(void) {return pszDescription;};
TCHAR *DeviceClass(void) {return pszClass;};
TCHAR *HardwareID(void) {return pHardwareID;};
TCHAR *CompatID(void) {return pCompatID;};
BOOL GetMark(void) {return bDNHasMark;};
TCHAR *DeviceID(void) {return pDeviceID;};
void SetMark(BOOL bMark = TRUE) {bDNHasMark = bMark;};
void SetPass(BOOL bPass = TRUE) {bDidPass = bPass;};
DEVNODE Devnode(void) {return hDevnode;};
DEVNODE Parent(void) {return hParent;};
BOOL BCanTest(void) {return bCanTest;};
TCHAR *GUID(void) {return pszGUID;};
TCHAR *Location(void) {return pszLocation;};
TCHAR *PDO(void) {return pszPDO;};
TCHAR *MFG(void) {return pszMFG;};
TCHAR *FriendlyName(void) {return pszFriendlyName;};
INTERFACE_TYPE BusType(void) {return InterfaceBusType;};
protected:
TCHAR * pDeviceID;
TCHAR * pHardwareID;
TCHAR * pCompatID;
DEVNODE hDevnode;
DEVNODE hParent;
TCHAR * pszDescription;
TCHAR * pszFriendlyName;
ULONG ulProblemCode;
ULONG ulStatus;
TCHAR * pszClass;
TCHAR * pszGUID;
TCHAR * pszLocation;
BOOL bDNHasMark;
BOOL bCanDisable;
BOOL bCanTest;
BOOL bDidPass;
TCHAR * pszPDO;
TCHAR * pszMFG;
INTERFACE_TYPE InterfaceBusType;
private:
};
/*******************************************************************
GLOBALS
*******************************************************************/
/*******************************************************************
PROTOTYPES
*******************************************************************/
ULONG ReadRegKeyInformationSZ (HKEY RootKey, TCHAR *KeyName, TCHAR **Value);
// from the new disabler classes
// error string reporting
TCHAR * CM_ErrToStr(ULONG);
TCHAR * DN_ErrStr(ULONG *);
TCHAR * CM_ProbToStr(ULONG ErrorCode);
ULONG EnumerateTree_Devnode(void);
template <class T>
BOOL Enumerate_WalkTree_Template( T type, DEVNODE hDevnode, DEVNODE hParent)
{
CONFIGRET retval;
T *pNewDevice;
DEVNODE hSib;
pNewDevice = new T(hDevnode, hParent);
retval = pNewDevice->GetChild(&hSib);
if ( !retval )
{
Enumerate_WalkTree_Template(type, hSib, hDevnode);
}
retval = pNewDevice->GetSibling(&hSib);
if ( !retval )
{
Enumerate_WalkTree_Template(type, hSib, hParent);
}
return (retval);
}
template <class T>
ULONG EnumerateTree_Template(T type)
{
DEVNODE hDevnode;
CM_Locate_DevNode(&hDevnode, NULL, CM_LOCATE_DEVNODE_NORMAL);
Enumerate_WalkTree_Template(type, hDevnode, NULL);
return (DevnodeClass::ALCCount());
}
#endif //_INCLUDE_DEVNODE_H_
// cause compiler demands this anyway