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.
 
 
 
 
 
 

664 lines
14 KiB

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
hwcomp.h
Abstract:
This file declares the interface for hardware compatibility code.
This includes the routines that build hwcomp.dat (the NT PNP ID
list), that compare the hardware on Win9x to what is supported by
NT, that enumerate the Win9x devices, and that manage the Have Disk
capability for drivers.
Author:
Jim Schmidt (jimschm) 06-Jul-1996
Revision History:
jimschm 09-Jan-1998 Work on hwcomp.dat rebuild detection
jimschm 11-Nov-1997 Have Disk capability, online detection
jimschm 09-Oct-1997 Revised to use project's APIs
--*/
#pragma once
#define MAX_HARDWARE_STRING 256
//
// The list of fields needed from a device
//
#define DEVICE_FIELDS \
DECLARE(Class, TEXT("Class")) \
DECLARE(DeviceDesc, TEXT("DeviceDesc")) \
DECLARE(Mfg, TEXT("Mfg")) \
DECLARE(Driver, TEXT("Driver")) \
DECLARE(HardwareID, TEXT("HardwareID")) \
DECLARE(CompatibleIDs, TEXT("CompatibleIDs")) \
DECLARE(HWRevision, TEXT("HWRevision")) \
DECLARE(BusType, TEXT("BusType")) \
DECLARE(InfName, TEXT("InfName")) \
DECLARE(CurrentDriveLetter, TEXT("CurrentDriveLetter")) \
DECLARE(ProductId, TEXT("ProductId")) \
DECLARE(SCSILUN, TEXT("SCSILUN")) \
DECLARE(SCSITargetID, TEXT("SCSITargetID")) \
DECLARE(ClassGUID, TEXT("ClassGUID")) \
DECLARE(MasterCopy, TEXT("MasterCopy")) \
DECLARE(UserDriveLetter, TEXT("UserDriveLetter")) \
DECLARE(CurrentDriveLetterAssignment, TEXT("CurrentDriveLetterAssignment")) \
DECLARE(UserDriveLetterAssignment, TEXT("UserDriveLetterAssignment")) \
#define DECLARE(varname,text) PCTSTR varname;
typedef enum {
ENUM_ALL_DEVICES,
ENUM_COMPATIBLE_DEVICES,
ENUM_INCOMPATIBLE_DEVICES,
ENUM_UNSUPPORTED_DEVICES,
ENUM_NON_FUNCTIONAL_DEVICES
} TYPE_OF_ENUM;
//
// Things caller does NOT want from enumeration
// (makes enumeration faster)
//
#define ENUM_DONT_WANT_DEV_FIELDS 0x0001
#define ENUM_DONT_WANT_USER_SUPPLIED 0x0002
//
// Things caller wants from enumerations
//
#define ENUM_WANT_USER_SUPPLIED_ONLY 0x0004
#define ENUM_WANT_DEV_FIELDS 0x0000 // default!
#define ENUM_WANT_ONLINE_FLAG 0x0010
#define ENUM_WANT_COMPATIBLE_FLAG 0x0020
#define ENUM_WANT_USER_SUPPLIED_FLAG 0x0040
//
// Flag to supress the requirement for the Hardware ID.
//
#define ENUM_DONT_REQUIRE_HARDWAREID 0x0100
#define ENUM_WANT_ALL (ENUM_WANT_DEV_FIELDS| \
ENUM_WANT_ONLINE_FLAG| \
ENUM_WANT_COMPATIBLE_FLAG| \
ENUM_WANT_USER_SUPPLIED_FLAG)
typedef struct {
//
// Enumeration state
//
PCTSTR InstanceId;
PCTSTR FullKey;
HKEY KeyHandle;
//
// Optional enumeration elements
//
// Not filled when ENUM_DONT_WANT_DEV_FIELDS is specified in EnumFlags
DEVICE_FIELDS
// Only when ENUM_WANT_ONLINE_FLAG is specified in EnumFlags
BOOL Online;
// Only when ENUM_WANT_COMPATIBLE_FLAG is specified in EnumFlags
BOOL HardwareIdCompatible;
BOOL CompatibleIdCompatible;
BOOL SuppliedByUi;
BOOL Compatible;
BOOL HardwareIdUnsupported;
BOOL CompatibleIdUnsupported;
BOOL Unsupported;
//
// Enumeration position
//
REGTREE_ENUM ek;
REGVALUE_ENUM ev;
UINT State;
TYPE_OF_ENUM TypeOfEnum;
DWORD EnumFlags;
} HARDWARE_ENUM, *PHARDWARE_ENUM;
#undef DECLARE
BOOL
WINAPI
HwComp_Entry(
HINSTANCE hInstance,
DWORD dwReason,
LPVOID lpReserved
);
BOOL
RealEnumFirstHardware (
OUT PHARDWARE_ENUM EnumPtr,
IN TYPE_OF_ENUM TypeOfEnum,
IN DWORD EnumFlags
);
#define EnumFirstHardware(e,type,flags) SETTRACKCOMMENT(BOOL,"EnumFirstHardware",__FILE__,__LINE__)\
RealEnumFirstHardware(e,type,flags)\
CLRTRACKCOMMENT
BOOL
RealEnumNextHardware (
IN OUT PHARDWARE_ENUM EnumPtr
);
#define EnumNextHardware(e) SETTRACKCOMMENT(BOOL,"EnumNextHardware",__FILE__,__LINE__)\
RealEnumNextHardware(e)\
CLRTRACKCOMMENT
VOID
AbortHardwareEnum (
IN OUT PHARDWARE_ENUM EnumPtr
);
BOOL
CreateNtHardwareList (
IN PCTSTR * NtInfPaths,
IN UINT NtInfPathCount,
IN PCTSTR HwCompDatPath, OPTIONAL
IN INT UiMode
);
BOOL
HwComp_ScanForCriticalDevices (
VOID
);
VOID
FreeNtHardwareList (
VOID
);
BOOL
FindHardwareId (
IN PCTSTR PnpId,
OUT PTSTR InfFileName
);
BOOL
FindUnsupportedHardwareId (
IN PCTSTR PnpId,
OUT PTSTR InfFileName
);
BOOL
FindUserSuppliedDriver (
IN PCTSTR HardwareIdList, OPTIONAL
IN PCTSTR CompatibleIdList OPTIONAL
);
BOOL
FindHardwareIdInHashTable (
IN PCTSTR PnpIdList,
OUT PTSTR InfFileName, OPTIONAL
IN HASHTABLE StrTable,
IN BOOL UseOverrideList
);
typedef enum {
QUERY,
LOAD,
DUMP
} LOADOP;
BOOL
LoadDeviceList (
IN LOADOP QueryFlag,
IN PCTSTR HwCompDat
);
BOOL
SaveDeviceList (
PCTSTR HwCompDat
);
PCTSTR
ExtractPnpId (
IN PCTSTR PnpIdList,
OUT PTSTR PnpIdBuf
);
BOOL
AddPnpIdsToHashTable (
IN OUT HASHTABLE Table,
IN PCTSTR PnpIdList
);
BOOL
AddPnpIdsToGrowList (
IN OUT PGROWLIST GrowList,
IN PCTSTR PnpIdList
);
PCTSTR
AddPnpIdsToGrowBuf (
IN OUT PGROWBUFFER GrowBuffer,
IN PCTSTR PnpIdList
);
#define KNOWN_HARDWARE TRUE
#define UNKNOWN_HARDWARE FALSE
//
// Network adapter enumeration
//
typedef enum {
BUSTYPE_ISA,
BUSTYPE_EISA,
BUSTYPE_MCA,
BUSTYPE_PCI,
BUSTYPE_PNPISA,
BUSTYPE_PCMCIA,
BUSTYPE_ROOT,
BUSTYPE_UNKNOWN
} BUSTYPE;
extern PCTSTR g_BusType[];
typedef enum {
TRANSCIEVERTYPE_AUTO,
TRANSCIEVERTYPE_THICKNET,
TRANSCIEVERTYPE_THINNET,
TRANSCIEVERTYPE_TP,
TRANSCIEVERTYPE_UNKNOWN
} TRANSCIEVERTYPE;
extern PCTSTR g_TranscieverType[];
typedef enum {
IOCHANNELREADY_EARLY,
IOCHANNELREADY_LATE,
IOCHANNELREADY_NEVER,
IOCHANNELREADY_AUTODETECT,
IOCHANNELREADY_UNKNOWN
} IOCHANNELREADY;
extern PCTSTR g_IoChannelReady[];
typedef struct {
// Enumeration output
TCHAR HardwareId[MAX_HARDWARE_STRING];
TCHAR CompatibleIDs[MAX_HARDWARE_STRING];
TCHAR Description[MAX_HARDWARE_STRING];
BUSTYPE BusType;
TCHAR IoAddrs[MAX_HARDWARE_STRING];
TCHAR Irqs[MAX_HARDWARE_STRING];
TCHAR Dma[MAX_HARDWARE_STRING];
TCHAR MemRanges[MAX_HARDWARE_STRING];
TCHAR CurrentKey[MAX_HARDWARE_STRING];
TRANSCIEVERTYPE TranscieverType;
IOCHANNELREADY IoChannelReady;
// Enumeration variables
HARDWARE_ENUM HardwareEnum;
UINT State;
} NETCARD_ENUM, *PNETCARD_ENUM;
BOOL
EnumFirstNetCard (
OUT PNETCARD_ENUM EnumPtr
);
BOOL
EnumNextNetCard (
IN OUT PNETCARD_ENUM EnumPtr
);
VOID
EnumNetCardAbort (
IN PNETCARD_ENUM EnumPtr
);
BOOL
GetLegacyKeyboardId (
OUT PTSTR Buffer,
IN UINT BufferSize
);
//
// HKEY_DYN_DATA enumeration functions
//
typedef struct {
PTSTR ClassFilter; // supplied by caller
REGKEY_ENUM CurrentDevice; // for enumeration
HKEY ConfigMgrKey; // key to HKDD\Config Manager
HKEY EnumKey; // key to HKLM\Enum
HKEY ActualDeviceKey; // key to HKLM\Enum\<enumerator>\<pnpid>\<device>
BOOL NotFirst; // for enumeration
TCHAR RegLocation[MAX_REGISTRY_KEY]; // <enumerator>\<pnpid>\<instance>
} ACTIVE_HARDWARE_ENUM, *PACTIVE_HARDWARE_ENUM;
BOOL
EnumFirstActiveHardware (
OUT PACTIVE_HARDWARE_ENUM EnumPtr,
IN PCTSTR ClassFilter OPTIONAL
);
BOOL
EnumNextActiveHardware (
IN OUT PACTIVE_HARDWARE_ENUM EnumPtr
);
VOID
AbortActiveHardwareEnum (
IN PACTIVE_HARDWARE_ENUM EnumPtr
);
BOOL
IsPnpIdOnline (
IN PCTSTR PnpId,
IN PCTSTR Class OPTIONAL
);
BOOL
HwComp_DoesDatFileNeedRebuilding (
VOID
);
INT
HwComp_GetProgressMax (
VOID
);
LONG
HwComp_PrepareReport (
VOID
);
//
// PNPREPT encoding and decoding routines
//
#define MAX_INF_DESCRIPTION 512
#define MAX_PNPID_LENGTH 256
#define MAX_ENCODED_PNPID_LENGTH (MAX_PNPID_LENGTH*2)
VOID
EncodePnpId (
IN OUT PSTR Id
);
VOID
DecodePnpId (
IN OUT PSTR Id
);
#define REGULAR_OUTPUT 0
#define VERBOSE_OUTPUT 1
#define PNPREPT_OUTPUT 2
BOOL
HwComp_DialUpAdapterFound (
VOID
);
BOOL
HwComp_NtUsableHardDriveExists (
VOID
);
BOOL
HwComp_NtUsableCdRomDriveExists (
VOID
);
BOOL
HwComp_MakeLocalSourceDeviceExists (
VOID
);
BOOL
HwComp_ReportIncompatibleController (
VOID
);
BOOL
ScanPathForDrivers (
IN HWND CopyDlgParent, OPTIONAL
IN PCTSTR SourceInfDir,
IN PCTSTR TempDir,
IN HANDLE CancelEvent OPTIONAL
);
#define WMX_BEGIN_FILE_COPY (WM_APP+100)
typedef struct {
//
// Enumeration return member
//
PBYTE Resource;
DWORD Type;
PBYTE ResourceData;
//
// Internal enumeration member (do not modify)
//
PBYTE Resources;
PBYTE NextResource;
} DEVNODERESOURCE_ENUM, *PDEVNODERESOURCE_ENUM;
PBYTE
GetDevNodeResources (
IN PCTSTR RegKey
);
VOID
FreeDevNodeResources (
IN PBYTE ResourceData
);
BOOL
EnumFirstDevNodeResourceEx (
OUT PDEVNODERESOURCE_ENUM EnumPtr,
IN PBYTE DevNodeResources
);
BOOL
EnumNextDevNodeResourceEx (
IN OUT PDEVNODERESOURCE_ENUM EnumPtr
);
BOOL
EnumFirstDevNodeResource (
OUT PDEVNODERESOURCE_ENUM EnumPtr,
IN PCTSTR DevNode
);
BOOL
EnumNextDevNodeResource (
IN OUT PDEVNODERESOURCE_ENUM EnumPtr
);
#define MAX_RESOURCE_NAME 64
#define MAX_RESOURCE_VALUE 128
typedef struct {
//
// Enumeration output
//
TCHAR ResourceName[MAX_RESOURCE_NAME];
TCHAR Value[MAX_RESOURCE_VALUE];
//
// Internal state
//
DEVNODERESOURCE_ENUM Enum;
} DEVNODESTRING_ENUM, *PDEVNODESTRING_ENUM;
BOOL
EnumFirstDevNodeString (
OUT PDEVNODESTRING_ENUM EnumPtr,
IN PCTSTR DevNodeKeyStr
);
BOOL
EnumNextDevNodeString (
IN OUT PDEVNODESTRING_ENUM EnumPtr
);
#pragma pack(push,1)
//
// MEM_RANGE Structure for Win9x
//
typedef struct {
DWORD MR_Align; // specifies mask for base alignment
DWORD MR_nBytes; // specifies number of bytes required
DWORD MR_Min; // specifies minimum address of the range
DWORD MR_Max; // specifies maximum address of the range
WORD MR_Flags; // specifies flags describing range (fMD flags)
WORD MR_Reserved;
DWORD MR_PcCardFlags;
DWORD MR_MemCardAddr;
} MEM_RANGE_9X, *PMEM_RANGE_9X;
//
// MEM_DES structure for Win9x
//
typedef struct {
WORD MD_Count; // number of MEM_RANGE structs in MEM_RESOURCE
WORD MD_Type; // size (in bytes) of MEM_RANGE (MType_Range)
DWORD MD_Alloc_Base; // base memory address of range allocated
DWORD MD_Alloc_End; // end of allocated range
WORD MD_Flags; // flags describing allocated range (fMD flags)
WORD MD_Reserved;
} MEM_DES_9X, *PMEM_DES_9X;
//
// MEM_RESOURCE structure for Win9x
//
typedef struct {
MEM_DES_9X MEM_Header; // info about memory range list
MEM_RANGE_9X MEM_Data[ANYSIZE_ARRAY]; // list of memory ranges
} MEM_RESOURCE_9X, *PMEM_RESOURCE_9X;
//
// IO_RANGE structure for Win9x
//
typedef struct {
WORD IOR_Align; // mask for base alignment
WORD IOR_nPorts; // number of ports
WORD IOR_Min; // minimum port address
WORD IOR_Max; // maximum port address
WORD IOR_RangeFlags; // flags for this port range
BYTE IOR_Alias; // multiplier that generates aliases for port(s)
BYTE IOR_Decode;
DWORD PcCardFlags;
} IO_RANGE_9X, *PIO_RANGE_9X;
//
// IO_DES structure for Win9x
//
typedef struct {
WORD IOD_Count; // number of IO_RANGE structs in IO_RESOURCE
WORD IOD_Type; // size (in bytes) of IO_RANGE (IOType_Range)
WORD IOD_Alloc_Base; // base of allocated port range
WORD IOD_Alloc_End; // end of allocated port range
WORD IOD_DesFlags; // flags relating to allocated port range
BYTE IOD_Alloc_Alias;
BYTE IOD_Alloc_Decode;
} IO_DES_9X, *PIO_DES_9X;
//
// IO_RESOURCE for Win9x
//
typedef struct {
IO_DES_9X IO_Header; // info about I/O port range list
IO_RANGE_9X IO_Data[ANYSIZE_ARRAY]; // list of I/O port ranges
} IO_RESOURCE_9X, *PIO_RESOURCE_9X;
//
// DMA_RESOURCE for Win9x
//
typedef struct {
WORD DMA_Unknown;
WORD DMA_Bits;
} DMA_RESOURCE_9X, *PDMA_RESOURCE_9X;
#define DMA_CHANNEL_0 0x0001
#define DMA_CHANNEL_1 0x0002
#define DMA_CHANNEL_2 0x0004
#define DMA_CHANNEL_3 0x0008
//
// IRQ_RESOURCE for Win9x
//
typedef struct {
WORD Flags;
WORD AllocNum;
WORD ReqMask;
WORD Reserved;
DWORD PcCardFlags;
} IRQ_RESOURCE_9X, *PIRQ_RESOURCE_9X;
#pragma pack(pop)
BOOL
EjectDriverMedia (
IN PCSTR IgnoreMediaOnDrive OPTIONAL
);
BOOL
IsComputerOffline (
VOID
);
BOOL
HwComp_AnyNeededDrivers (
VOID
);
BOOL
AppendDynamicSuppliedDrivers (
IN PCTSTR DriversPath
);