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.
252 lines
6.5 KiB
252 lines
6.5 KiB
/******************************************************************
|
|
|
|
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
|
|
|
|
|
|
|