/*++ 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\\\ BOOL NotFirst; // for enumeration TCHAR RegLocation[MAX_REGISTRY_KEY]; // \\ } 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 );