|
|
/***MD sysdetmg.h - System Detection Manager definitions
* * This module contains System Detection Manager definitions including * Detection Module Services definitions and Module Function definitions. * * Copyright (c) 1992,1993 Microsoft Corporation * Author: Michael Tsang (MikeTs) * Created 12/10/92 * * MODIFICATION HISTORY */
#ifndef _INC_SYSDETMG
#define _INC_SYSDETMG
/* do not complain about in-line comment and pragma use in windows.h */ #pragma warning(disable:4001 4103 4705)
#include <sdmerror.h>
#ifdef CALLCM //only do this hack if we need to call CM
#define WINVER 0x030a //system detection can be run under win31
#include <windows.h>
// Windows.h defines the following set of things for old reg users, whose
// WINVER is less than 0x0400. Normally this is not a problem, but SYSDETMG
// is a special DLL whose winver is 0x030a, but we really use Win4.0 reg
// error codes, so we need to pick up the defines in WINERROR.H, so this
// prevents macro redef warnings.
#ifdef ERROR_SUCCESS
#undef ERROR_SUCCESS
#endif
#ifdef ERROR_BADDB
#undef ERROR_BADDB
#endif
#ifdef ERROR_BADKEY
#undef ERROR_BADKEY
#endif
#ifdef ERROR_CANTOPEN
#undef ERROR_CANTOPEN
#endif
#ifdef ERROR_CANTREAD
#undef ERROR_CANTREAD
#endif
#ifdef ERROR_CANTWRITE
#undef ERROR_CANTWRITE
#endif
#ifdef ERROR_INSUFFICIENT_MEMORY
#undef ERROR_INSUFFICIENT_MEMORY
#endif
#ifdef ERROR_INVALID_PARAMETER
#undef ERROR_INVALID_PARAMETER
#endif
#ifdef ERROR_ACCESS_DENIED
#undef ERROR_ACCESS_DENIED
#endif
#ifdef HKEY_CLASSES_ROOT
#undef HKEY_CLASSES_ROOT
#endif
#ifndef REG_BINARY
#define REG_BINARY 0x0003
#endif
#ifndef HKEY_CURRENT_CONFIG
#define HKEY_CURRENT_CONFIG ((HKEY)0x80000005)
#endif
#ifndef HKEY_LOCAL_MACHINE
#define HKEY_LOCAL_MACHINE ((HKEY)0x80000002)
#endif
#else //ifdef SYSDETMG
#include <windows.h>
#endif
#include <winerror.h>
#define NOPRSHT //do not include prsht.h
#include <setupx.h>
/*** Miscellaneou macros
*/
#define BYTEOF(d,i) (((BYTE *)&(d))[i])
#define WORDOF(d,i) (((WORD *)&(d))[i])
#define LOCAL PASCAL FAR
#define LOCALC CDECL FAR
#define DLLENTRY _loadds WINAPI
#define DEREF(x) ((x) = (x))
#define ALLOC(n) ((VOID FAR *)GlobalAllocPtr(GHND, (n)))
#define FREE(p) GlobalFreePtr((p))
#ifdef ERRMSG
#define CATMSG(p) CatMsg p
#define CATERR(rc,p) {if (rc) CatMsg p;}
#else
#define CATMSG(p)
#define CATERR(rc,p)
#endif
#ifdef DEBUG
#define ENTER(p) EnterProc p
#define EXIT(p) ExitProc p
#define PRINTTRACE(p) PrintTrace p
#else
#define ENTER(p)
#define EXIT(p)
#define PRINTTRACE(p)
#endif
#define CODESEG _based(_segname("_CODE"))
/*** Implementation constants
*/
#define MAX_PATHNAME_LEN 63 //max. length of path name
#define MAX_CLASSNAME_LEN 15 //max. length of device class name
#define MAX_FUNCNAME_LEN 31 //max. length of function name
#define MAX_DEVNAME_LEN 15 //max. length of device name
#define MAX_INSTNAME_LEN 15 //device instance name length
#define MAX_DOSDEVNAME_LEN 8 //dos device name length
#define MAX_PARAMLINE_LEN 63 //TSR parameter line length
#define MAX_DESC_LEN 63 //max. description length
/*** Callback function error
*/
#define DCBERR_NONE 0x00000000 //no error
#define DCBERR_SKIP 0x80000001 //skip detection function
#define DCBERR_ABORT 0x80000002 //abort detection
/*** Other constants
*/
#define STR_INFNAME_MSDETINF "msdet.inf" //main detection INF name
//dwfDetOpen flags
#define DOF_CUSTOM 0x00000001 //custom detection
#define DOF_NORISK 0x00000002 //no risk detection mode
#define DOF_CLEANREG 0x00000004 //clean hw from registry
#define DOF_QUIET 0x00000008 //don't show progress bar
#define DOF_VERBOSE 0x00000010 //detection progress dialog
#define DOF_NORECOVER 0x00000020 //no recover from last crash
#define DOF_MAXCALLBACK 0x00000040 //maximum callback
#define DOF_PROMPTBEFORE 0x00000080 //prompt before detect
#define DOF_PROGRESSCALLBACK 0x00000100 //do progress callback
#define DOF_INSETUP 0x00000200 //called by Setup
#define DOF_LOGPERFORMANCE 0x00000400 //enable performance logging
#define DOF_ERRORPOPUP 0x00008000 //enable error message box
//dwfDetect flags
#define DETF_NORISK 0x00010000 //no risk detection
#define DETF_VERIFY 0x00020000 //verify mode
//dwCallBackContext
#define CBC_DEVDETECTED 1 //device detected
#define CBC_REPORTERR 2 //report error
#define CBC_QUERYRES 3 //DMSQueryIOMem has been called
#define CBC_DETECTDONE 4 //detection done
#define CBC_VERIFYDANGER 5 //verifying old danger entry
#define CBC_NEWDANGER 6 //creating new danger entry
#define CBC_DISCARDCRASH 7 //discarding a crash entry
#define CBC_VERIFYDONE 8 //finish verifying devices
#define CBC_BEGINVERIFY 9 //begin verify
#define CBC_VERIFYPROGRESS 10 //verify progress
#define CBC_BEGINDETECT 11 //begin detection
#define CBC_DETECTPROGRESS 12 //detection progress
#define CBC_DETECTING 13 //just above to detect a device
#define CBC_DISCARDDANGER 14 //discard a danger entry
#define CBC_SKIPCRASHFUNC 15 //skip a crash function
#define CBC_DMSWRITELOG 16 //detection module log entry
#define CBC_PERFORMANCE 17 //log detection performance data
//dwfSearch flags
#define MSF_REALADDR 0x00000001 //real mode address
#define MSF_IGNORECASE 0x00000002 //case insensitive search
//dwResType values
#define RESTYPE_IO 1 //I/O resource
#define RESTYPE_MEM 2 //memory resource
#define RESTYPE_IRQ 3 //irq resource
#define RESTYPE_DMA 4 //dma resource
//Return values of DMSQueryIOMem or DMSQueryIRQDMA
#define RES_NOMATCH 0 //resources have no owner
#define RES_OVERLAP 1 //resources overlap with existing owner
#define RES_MATCH 2 //resources match with existing owner
#define RES_SHARED 3 //resources are shareable by the owner
#define RES_SUPERSET 4 //resources are superset of existing owner
/*** Function type definitions
*/
typedef LONG (DLLENTRY *LPFNDET)(HDET, DWORD, DWORD); typedef LONG (FAR PASCAL _loadds *LPFNDCB)(DWORD, LPSTR, DWORD); typedef VOID (FAR PASCAL _loadds *LPFNICB)(DWORD); typedef VOID (FAR PASCAL *LPFNGEN)(); typedef DWORD (FAR PASCAL _loadds *LPFNPROC)();
/*** Structure and related definitions
*/
#define HANDLE_NULL 0 //null handle
typedef DWORD HDET; //detection handle
typedef DWORD HDEV; //device handle
typedef union _REGS FAR *LPREGS; typedef struct _SREGS FAR *LPSREGS;
#define SYSENVF_EISASYSTEM 0x00000001
#define SYSENVF_MCASYSTEM 0x00000002
#define MACHINFO_MCABUS 0x02000000 //machine has MCA bus
#define MACHINFO_EXTBIOSAREA 0x04000000 //extended BIOS area allocated
#define MACHINFO_WAITEXTEVENT 0x08000000 //wait ext. event supported
#define MACHINFO_INT154FCALLOUT 0x10000000 //int15/4f callout at int09
#define MACHINFO_CMOSRTC 0x20000000 //CMOS/RTC installed
#define MACHINFO_PIC2 0x40000000 //2nd PIC
#define MACHINFO_HDDMA3 0x80000000 //hard disk BIOS using DMA3
typedef struct sysenv_s { DWORD dwSDMVersion; //byte 0,1=build number
//byte 2=version minor
//byte 3=version major
DWORD dwWinVer; //byte 0=winver minor
//byte 1=winver major
//byte 2=dosver minor
//byte 3=dosver major
DWORD dwWinFlags; //WinFlags from GetWinFlags
DWORD dwMachineInfo; //byte 0=model
//byte 1=sub-model
//byte 2=BIOS revision
//byte 3=features
DWORD dwfSysEnv; //system environment flags
char szDetPath[MAX_PATHNAME_LEN + 1]; //detection path string
} SYSENV;
typedef SYSENV *PSYSENV; typedef SYSENV FAR *LPSYSENV;
typedef struct resinfo_s { int icIO; //number of I/O resource regions
int ioffsetIO; //offset of I/O resource array
int icMem; //number of memory resource regions
int ioffsetMem; //offset of memory resource array
int icIRQ; //number of IRQs
int ioffsetIRQ; //offset of IRQ resource array
int icDMA; //number of DMAs
int ioffsetDMA; //offset of DMA resource array
int icbResBuff; //resource buffer size that follows
// IOMEM and/or IRQDMA array follows here
} RESINFO;
typedef RESINFO *PRESINFO; typedef RESINFO FAR *LPRESINFO;
typedef struct ownerinfo_s { char szClassName[MAX_CLASSNAME_LEN + 1]; //owner's class name
char szDevName[MAX_DEVNAME_LEN + 1]; //owner's device name
HDEV hdevOwner; //owner's device handle
LPRESINFO lpresinfo; //resource info.
} OWNERINFO;
typedef OWNERINFO *POWNERINFO; typedef OWNERINFO FAR *LPOWNERINFO;
typedef struct iomem_s { DWORD dwStartAddr; //region starting address
DWORD dwEndAddr; //region ending address
DWORD dwDecodeMask; //decode mask (don't care aliases)
DWORD dwAliasMask; //alias mask (used aliases)
DWORD dwResAttr; //region attributes
} IOMEM;
typedef IOMEM *PIOMEM; typedef IOMEM FAR *LPIOMEM;
typedef struct irqdma_s { DWORD dwResNum; //IRQ or DMA number
DWORD dwResAttr; //attributes for this IRQ or DMA
} IRQDMA;
typedef IRQDMA *PIRQDMA; typedef IRQDMA FAR *LPIRQDMA;
//dwfDev flags
#define DEVF_CHARDEV 0x00000001 //lpstrDevName is a char dev name
typedef struct dosdev_s { char szFileName[MAX_DOSDEVNAME_LEN + 1];//driver filename to query
char szDevName[MAX_DOSDEVNAME_LEN + 1];//to hold device name
WORD wfDevAttr; //to hold device attribute
WORD wcUnits; //to hold number of block dev units
WORD wbitIRQs; //to hold IRQ bit vector used by dev.
DWORD dwDevHdrPtr; //to hold pointer to device header
DWORD dwNextDevHdrPtr; //to hold pointer to next in chain
} DOSDEV;
typedef DOSDEV *PDOSDEV; typedef DOSDEV FAR *LPDOSDEV;
typedef struct dostsr_s { char szPathName[MAX_PATH_LEN + 1]; //to hold the TSR full path name
char szMCBOwner[9]; WORD segTSRPSP; //to hold TSR's segment address
WORD wcparaTSRSize; //to hold TSR's size in paragrahs
WORD segParentPSP; WORD wbitIRQs; //to hold IRQ bit vector used by TSR
char szParamLine[MAX_PARAMLINE_LEN + 1];//to hold TSR's parameter line
DWORD dwNextMCBPtr; //to hold the seg addr of next MCB
} DOSTSR;
typedef DOSTSR *PDOSTSR; typedef DOSTSR FAR *LPDOSTSR;
#define MAX_MCA_SLOTS 8
/*** EISA related stuff
*/
#define MAX_EISAID_LEN 7
#define MAX_EISA_SLOTS 16
#define MAX_IOCONFIGS 20
#define MAX_MEMCONFIGS 9
#define MAX_IRQCONFIGS 7
#define MAX_DMACONFIGS 4
#define IDSLOT_DUPID 0x0080
#define IDSLOT_NOREADID 0x0040
#define IDSLOT_SLOTTYPEMASK 0x0030
#define IDSLOT_EXPANSLOT 0x0000
#define IDSLOT_EMBEDSLOT 0x0010
#define IDSLOT_VIRTSLOT 0x0020
#define IDSLOT_DUPCFGIDMASK 0x000f
#define IDSLOT_INCOMPLETECONFIG 0x8000
#define IDSLOT_SUPPORTIOCHKERR 0x0200
#define IDSLOT_SUPPORTENABLE 0x0100
#define FUNCINFO_FUNCDISABLED 0x80
#define FUNCINFO_FREEFORMDATA 0x40
#define FUNCINFO_IOINITENTRIES 0x20
#define FUNCINFO_IORANGEENTRIES 0x10
#define FUNCINFO_DMAENTRIES 0x08
#define FUNCINFO_IRQENTRIES 0x04
#define FUNCINFO_MEMENTRIES 0x02
#define FUNCINFO_TYPEENTRY 0x01
#define PORTINFO_MOREENTRIES 0x80
#define PORTINFO_SHARED 0x40
#define PORTINFO_NUMPORTMASK 0x1f
#define MEMCFG_MOREENTRIES 0x80
#define MEMCFG_SHARED 0x20
#define MEMCFG_MEMTYPEMASK 0x18
#define MEMCFG_CACHED 0x02
#define MEMCFG_READWRITE 0x01
#define MEMSIZ_DECODEMASK 0x0c
#define MEMSIZ_DECODE20BIT 0x00
#define MEMSIZ_DECODE24BIT 0x04
#define MEMSIZ_DECODE32BIT 0x08
#define IRQCFG_MOREENTRIES 0x80
#define IRQCFG_SHARED 0x40
#define IRQCFG_LEVELTRIGGERED 0x20
#define IRQCFG_INTNUMMASK 0x0f
#define DMACFG_MOREENTRIES 0x0080
#define DMACFG_SHARED 0x0040
#define DMACFG_DMANUMMASK 0x0007
#define DMACFG_TIMINGMASK 0x3000
#define DMACFG_XFERSIZEMASK 0x0c00
#pragma pack(1)
typedef struct memconfig_s { BYTE bMemConfig; BYTE bMemDataSize; BYTE bStartAddrLo; //divided by 0x100
WORD wStartAddrHi; WORD wMemSize; //divided by 0x400
} MEMCONFIG;
typedef struct ioconfig_s { BYTE bPortInfo; WORD wStartPort; } IOCONFIG;
typedef struct initdata_s { BYTE bInitType; WORD wPortAddr; } INITDATA;
typedef struct eisaconfig_s { DWORD dwEISAID; WORD wIDSlotInfo; BYTE bMajorRev; BYTE bMinorRev; BYTE abSelections[26]; BYTE bFuncInfo; char achTypeInfo[80]; MEMCONFIG amemconfig[MAX_MEMCONFIGS]; WORD awIRQConfig[MAX_IRQCONFIGS]; WORD awDMAConfig[MAX_DMACONFIGS]; IOCONFIG aioconfig[MAX_IOCONFIGS]; INITDATA ainitdata[20]; } EISACONFIG;
typedef EISACONFIG FAR *LPEISACONFIG;
/*** DPMI call structure
*/
typedef struct dwregs_s { DWORD edi; DWORD esi; DWORD ebp; DWORD rmdw1; DWORD ebx; DWORD edx; DWORD ecx; DWORD eax; } DWREGS;
typedef struct wregs_s { WORD di; WORD rmw1; WORD si; WORD rmw2; WORD bp; WORD rmw3; DWORD rmw4; WORD bx; WORD rmw5; WORD dx; WORD rmw6; WORD cx; WORD rmw7; WORD ax; } WREGS;
typedef struct bregs_s { DWORD rmb1[4]; BYTE bl; BYTE bh; WORD rmb2; BYTE dl; BYTE dh; WORD rmb3; BYTE cl; BYTE ch; WORD rmb4; BYTE al; BYTE ah; } BREGS;
typedef struct rmcs_s { union { DWREGS dw; WREGS w; BREGS b; } regs; WORD flags; WORD es; WORD ds; WORD fs; WORD gs; WORD ip; WORD cs; WORD sp; WORD ss; } RMCS, FAR *LPRMCS; #pragma pack()
/*** SDS Services prototypes
*/
LONG DLLENTRY SDSOpen(HWND hwnd, LPCSTR lpstrDetPath, WORD wfDetOpen, LPFNDCB lpfnCallBack, LPSTR lpstrParams); LONG DLLENTRY SDSClose(VOID); LONG DLLENTRY SDSDetect(LPSTR lpstrClass, LPSTR lpstrFunc, WORD wfDetect, DWORD dwDetParam); LONG DLLENTRY SDSRegAvoidRes(int icIO, LPIOMEM lpaio, int icMem, LPIOMEM lpamem, int icIRQ, LPIRQDMA lpairq, int icDMA, LPIRQDMA lpadma); VOID DLLENTRY SDSGetErrMsg(LONG lErr, LPSTR lpstrBuff, int icbLen);
/*** DMS Services prototypes
*/
VOID _loadds FAR CDECL CatMsg(LPCSTR lpstrFormat, ...); VOID _loadds FAR CDECL EnterProc(int iTraceLevel, LPCSTR lpstrFormat, ...); VOID _loadds FAR CDECL ExitProc(int iTraceLevel, LPCSTR lpstrFormat, ...); VOID _loadds FAR CDECL PrintTrace(int iTraceLevel, LPCSTR lpstrFormat, ...); LONG DLLENTRY DMSQueryIOMem(HDET hdet, int iResType, int icEntries, LPIOMEM lpaiomem, LPOWNERINFO lpownerinfo); LONG DLLENTRY DMSQueryIRQDMA(HDET hdet, int iResType, int icEntries, LPIRQDMA lpairqdma, LPOWNERINFO lpownerinfo); LONG DLLENTRY DMSRegHW(HDET hdet, LPSTR lpstrHWName, HKEY FAR *lphkHW, HINF FAR *lphinfHW, int icIO, LPIOMEM lpaio, int icMem, LPIOMEM lpamem, int icIRQ, LPIRQDMA lpairq, int icDMA, LPIRQDMA lpadma, WORD wfRegHW); int DLLENTRY DMSInp(unsigned uPort); unsigned DLLENTRY DMSInpw(unsigned uPort); DWORD DLLENTRY DMSInpdw(unsigned uPort); int DLLENTRY DMSOutp(unsigned uPort, int iData); unsigned DLLENTRY DMSOutpw(unsigned uPort, unsigned uData); DWORD DLLENTRY DMSOutpdw(unsigned uPort, DWORD dwData); int DLLENTRY DMSDetectIRQ(unsigned uIRQMask, LPFNICB lpfnIntOn, LPFNICB lpfnIntOff, DWORD dwParam); BOOL DLLENTRY DMSTimeout(DWORD dwcTicks); VOID DLLENTRY DMSDelayTicks(DWORD dwcTicks); LPBYTE DLLENTRY DMSGetMemAlias(DWORD dwRealMemAddr, DWORD dwcbSize); VOID DLLENTRY DMSFreeMemAlias(LPBYTE lpbMemAlias); LPBYTE DLLENTRY DMSFindMemStr(LPBYTE lpbAddr, DWORD dwcbSize, LPCSTR lpstr, WORD wfSearch); LONG DLLENTRY DMSQueryDosDev(DWORD dwDevHdrPtr, LPCSTR lpstrDevName, WORD wfDev, LPDOSDEV lpdosdev); LONG DLLENTRY DMSQueryDosTSR(DWORD dwMCBPtr, LPSTR lpstrTSRName, LPDOSTSR lpdostsr); VOID DLLENTRY DMSQuerySysEnv(LPSYSENV lpsysenv); LONG DLLENTRY DMSGetIHVEISADevSlots(LPCSTR lpstrIHVID); LONG DLLENTRY DMSGetSlotEISAID(int iSlot, LPSTR lpstrDevID); LONG DLLENTRY DMSGetEISAFuncConfig(int iSlot, int iFunc, LPEISACONFIG lpcfg, LPSTR lpstrEISAID); BOOL DLLENTRY DMSGetEISACardConfig(int iSlot, LPSTR lpstrDevID, int FAR *lpicIO, LPIOMEM lpaio, int FAR *lpicMem, LPIOMEM lpamem, int FAR *lpicIRQ, LPIRQDMA lpairq, int FAR *lpicDMA, LPIRQDMA lpadma, WORD wcbTypeBuff, LPSTR lpstrTypeBuff); LONG DLLENTRY DMSGetMCADevSlots(WORD wMCAID); LONG DLLENTRY DMSGetSlotMCAID(int iSlot); int DLLENTRY DMSInt86x(int iIntNum, LPREGS lpregsIn, LPREGS lpregsOut, LPSREGS lpsregs); BOOL DLLENTRY DMSQueryVerifyState(HDET hdet); LPSTR DLLENTRY DMSCatPath(LPSTR lpstrPath, LPSTR lpstrName); LPSTR DLLENTRY DMSGetWinDir(LPSTR lpstrWinDir, int icbBuffLen); LPFNPROC DLLENTRY DMSRegRing0Proc(LPFNPROC lpfnR3Proc, int icwArg); VOID DLLENTRY DMSFreeRing0Proc(LPFNPROC lpfnR0Proc); LONG DLLENTRY DMSWriteLog(LPSTR lpstrMsg);
/*** Module function error codes
*/
#define MODERR_NONE 0L //no error
#define MODERR_SDMERR 0x80008001 //sysdetmg error
#define MODERR_REGERR 0x80008002 //cannot access registry
#define MODERR_UNRECOVERABLE 0x80000003 //unrecoverable error
#endif //_INC_SYSDETMG
|