configmg.h
来自「用于查询PC机上的USB端口是否有设备挂接上」· C头文件 代码 · 共 1,777 行 · 第 1/5 页
H
1,777 行
/*****************************************************************************
*
* (C) Copyright MICROSOFT Corp., 1993
*
* Title: CONFIGMG.H - Configuration manager header file
*
* Version: 1.00
*
* Date: 02-Feb-1993
*
* Authors: PYS & RAL
*
*------------------------------------------------------------------------------
*
* Change log:
*
* DATE REV DESCRIPTION
* ----------- --- -----------------------------------------------------------
* 02-Feb-1993 PYS Original
*****************************************************************************/
#ifndef _CONFIGMG_H
#define _CONFIGMG_H
#ifdef _VMM_
#define CONFIGMG_VERSION DDK_VERSION
#define PNPDRVS_Major_Ver (CONFIGMG_VERSION >> 8)
#define PNPDRVS_Minor_Ver (CONFIGMG_VERSION & 0xFF)
#endif
#define CONFIGMG_W32IOCTL_RANGE 0x80000000
#ifdef GOLDEN
#ifndef DEBUG
#define CM_GOLDEN_RETAIL
#endif
#endif
/*XLATOFF*/
#include <pshpack1.h>
/*XLATON*/
#ifndef NORESDES
/****************************************************************************
*
* EQUATES FOR RESOURCE DESCRIPTOR
*
* The equates for resource descriptor work the exact same way as those
* for VxD IDs, which is:
*
* Device ID's are a combination of OEM # and device # in the form:
*
* xOOOOOOOOOODDDDD
*
* The high bit of the device ID is reserved for future use. The next
* 10 bits are the OEM # which is assigned by Microsoft. The last 5 bits
* are the device #. This allows each OEM to create 32 unique devices.
* If an OEM is creating a replacement for a standard device, then it
* should re-use the standard ID listed below. Microsoft reserves the
* first 16 OEM #'s (0 thru 0Fh)
*
* To make your resource ID, you must use the same 10 OEMs bit that
* have been given by Microsoft as OEM VxD ID range. You can then tag
* any of the 32 unique number in that range (it does not have to be
* the same as the VxD as some VxD may have mupltiple arbitrators).
*
* If the ResType_Ignored_Bit is set, the resource is not arbitrated.
* You cannot register a handler for such a resource.
*
***************************************************************************/
#define ResType_All 0x00000000 // Return all resource types.
#define ResType_None 0x00000000 // Arbitration always succeeded.
#define ResType_Mem 0x00000001 // Physical address resource.
#define ResType_IO 0x00000002 // Physical IO address resource.
#define ResType_DMA 0x00000003 // DMA channels 0-7 resource.
#define ResType_IRQ 0x00000004 // IRQ 0-15 resource.
#define ResType_Max 0x00000004 // Max KNOWN ResType (for DEBUG).
#define ResType_Ignored_Bit 0x00008000 // This resource is to be ignored.
#define DEBUG_RESTYPE_NAMES \
char CMFAR *lpszResourceName[ResType_Max+1]= \
{ \
"None", \
"Mem ", \
"IO ", \
"DMA ", \
"IRQ ", \
};
/************************************************************************
* *
* OEMS WHO WANT A VXD DEVICE ID ASSIGNED TO THEM, *
* PLEASE CONTACT MICROSOFT PRODUCT SUPPORT *
* *
************************************************************************/
/****************************************************************************
*
* RESOURCE DESCRIPTORS
*
* Each resource descriptor consists of an array of resource requests.
* Exactly one element of the array must be satisfied. The data
* of each array element is resource specific an described below.
* The data may specify one or more resource requests. At least
* one element of a Res_Des must be satisfied to satisfy the request
* represented by the Res_Des. The values allocated to the Res_Des
* are stored within the Res_Des.
* Each subarray (OR element) is a single Res_Des followed
* by data specific to the type of resource. The data includes the
* allocated resource (if any) followed by resource requests (which
* will include the values indicated by the allocated resource.
*
***************************************************************************/
/****************************************************************************
* Memory resource requests consist of ranges of pages
***************************************************************************/
#define MType_Range sizeof(struct Mem_Range_s)
#define fMD_MemoryType 1 // Memory range is ROM/RAM
#define fMD_ROM 0 // Memory range is ROM
#define fMD_RAM 1 // Memory range is RAM
#define fMD_32_24 2 // Memory range is 32/24 (for ISAPNP only)
#define fMD_24 0 // Memory range is 24
#define fMD_32 2 // Memory range is 32
#define fMD_Pref 4 // Memory range is Prefetch
#define fMD_CombinedWrite 8 // Memory range is write combineable (no effect, for WDM only)
#define fMD_Cacheable 0x10 // Memory range is cacheable (no effect, for WDM only)
/* Memory Range descriptor data
*/
struct Mem_Range_s {
ULONG MR_Align; // Mask for base alignment
ULONG MR_nBytes; // Count of bytes
ULONG MR_Min; // Min Address
ULONG MR_Max; // Max Address
WORD MR_Flags; // Flags
WORD MR_Reserved;
};
typedef struct Mem_Range_s MEM_RANGE;
/* Mem Resource descriptor header structure
* MD_Count * MD_Type bytes of data follow header in an
* array of MEM_RANGE structures. When an allocation is made,
* the allocated value is stored in the MD_Alloc_... variables.
*
* Example for memory Resource Description:
* Mem_Des_s {
* MD_Count = 1;
* MD_Type = MTypeRange;
* MD_Alloc_Base = 0;
* MD_Alloc_End = 0;
* MD_Flags = 0;
* MD_Reserved = 0;
* };
* Mem_Range_s {
* MR_Align = 0xFFFFFF00; // 256 byte alignment
* MR_nBytes = 32; // 32 bytes needed
* MR_Min = 0;
* MR_Max = 0xFFFFFFFF; // Any place in address space
* MR_Flags = 0;
* MR_Reserved = 0;
* };
*/
struct Mem_Des_s {
WORD MD_Count;
WORD MD_Type;
ULONG MD_Alloc_Base;
ULONG MD_Alloc_End;
WORD MD_Flags;
WORD MD_Reserved;
};
typedef struct Mem_Des_s MEM_DES;
/****************************************************************************
* IO resource allocations consist of fixed ranges or variable ranges
* The Alias and Decode masks provide additional flexibility
* in specifying how the address is handled. They provide a convenient
* method for specifying what port aliases a card responds to. An alias
* is a port address that is responded to as if it were another address.
* Additionally, some cards will actually use additional ports for
* different purposes, but use a decoding scheme that makes it look as
* though it were using aliases. E.G., an ISA card may decode 10 bits
* and require port 03C0h. It would need to specify an Alias offset of
* 04h and a Decode of 3 (no aliases are used as actual ports). For
* convenience, the alias field can be set to zero indicate no aliases
* are required and then decode is ignored.
* If the card were to use the ports at 7C0h, 0BC0h and 0FC0h, where these
* ports have different functionality, the Alias would be the same and the
* the decode would be 0Fh indicating bits 11 and 12 of the port address
* are significant. Thus, the allocation is for all of the ports
* (PORT[i] + (n*Alias*256)) & (Decode*256 | 03FFh), where n is
* any integer and PORT is the range specified by the nPorts, Min and
* Max fields. Note that the minimum Alias is 4 and the minimum
* Decode is 3.
* Because of the history of the ISA bus, all ports that can be described
* by the formula PORT = n*400h + zzzz, where "zzzz" is a port in the
* range 100h - 3FFh, will be checked for compatibility with the port
* zzzz, assuming that the port zzzz is using a 10 bit decode. If a card
* is on a local bus that can prevent the IO address from appearing on
* the ISA bus (e.g. PCI), then the logical configuration should specify
* an alias of IOA_Local which will prevent the arbitrator from checking
* for old ISA bus compatibility.
*/
#define IOType_Range sizeof(struct IO_Range_s) // Variable range
/* IO Range descriptor data */
struct IO_Range_s {
WORD IOR_Align; // Mask for base alignment
WORD IOR_nPorts; // Number of ports
WORD IOR_Min; // Min port address
WORD IOR_Max; // Max port address
WORD IOR_RangeFlags; // Flags
BYTE IOR_Alias; // Alias offset
BYTE IOR_Decode; // Address specified
};
typedef struct IO_Range_s IO_RANGE;
/* IO Resource descriptor header structure
* IOD_Count * IOD_Type bytes of data follow header in an
* array of IO_RANGE structures. When an allocation is made,
* the allocated value is stored in the IOD_Alloc_... variables.
*
* Example for IO Resource Description:
* IO_Des_s {
* IOD_Count = 1;
* IOD_Type = IOType_Range;
* IOD_Alloc_Base = 0;
* IOD_Alloc_End = 0;
* IOD_Alloc_Alias = 0;
* IOD_Alloc_Decode = 0;
* IOD_DesFlags = 0;
* IOD_Reserved = 0;
* };
* IO_Range_s {
* IOR_Align = 0xFFF0; // 16 byte alignment
* IOR_nPorts = 16; // 16 ports required
* IOR_Min = 0x0100;
* IOR_Max = 0x03FF; // Anywhere in ISA std ports
* IOR_RangeFlags = 0;
* IOR_Alias = 0004; // Standard ISA 10 bit aliasing
* IOR_Decode = 0x000F; // Use first 3 aliases (e.g. if
* // 0x100 were base port, 0x500
* // 0x900, and 0xD00 would
* // also be allocated)
* };
*/
struct IO_Des_s {
WORD IOD_Count;
WORD IOD_Type;
WORD IOD_Alloc_Base;
WORD IOD_Alloc_End;
WORD IOD_DesFlags;
BYTE IOD_Alloc_Alias;
BYTE IOD_Alloc_Decode;
};
typedef struct IO_Des_s IO_DES;
/* Definition for special alias value indicating card on PCI or similar local bus
* This value should used for the IOR_Alias and IOD_Alias fields
*/
#define IOA_Local 0xff
/****************************************************************************
* DMA channel resource allocations consist of one WORD channel bit masks.
* The mask indcates alternative channel allocations,
* one bit for each alternative (only one is allocated per mask).
*/
/*DMA flags
*First two are DMA channel width: BYTE, WORD or DWORD
*/
#define mDD_Width 0x0003 // Mask for channel width
#define fDD_BYTE 0
#define fDD_WORD 1
#define fDD_DWORD 2
#define szDMA_Des_Flags "WD"
/* DMA Resource descriptor structure
*
* Example for DMA Resource Description:
*
* DMA_Des_s {
* DD_Flags = fDD_Byte; // Byte transfer
* DD_Alloc_Chan = 0;
* DD_Req_Mask = 0x60; // Channel 5 or 6
* DD_Reserved = 0;
* };
*/
struct DMA_Des_s {
BYTE DD_Flags;
BYTE DD_Alloc_Chan; // Channel number allocated
BYTE DD_Req_Mask; // Mask of possible channels
BYTE DD_Reserved;
};
typedef struct DMA_Des_s DMA_DES;
/****************************************************************************
* IRQ resource allocations consist of two WORD IRQ bit masks.
* The first mask indcates alternatives for IRQ allocation,
* one bit for each alternative (only one is allocated per mask). The
* second mask is used to specify that the IRQ can be shared.
*/
/*
* IRQ flags
*/
#define fIRQD_Share_Bit 0 // IRQ can be shared
#define fIRQD_Share 1 // IRQ can be shared
#define fIRQD_Level_Bit 1 // IRQ is level (PCI)
#define fIRQD_Level 2 // IRQ is level (PCI)
#define cIRQ_Des_Flags 'S'
/* IRQ Resource descriptor structure
*
* Example for IRQ Resource Description:
*
* IRQ_Des_s {
* IRQD_Flags = fIRQD_Share // IRQ can be shared
* IRQD_Alloc_Num = 0;
* IRQD_Req_Mask = 0x18; // IRQ 3 or 4
* IRQD_Reserved = 0;
* };
*/
struct IRQ_Des_s {
WORD IRQD_Flags;
WORD IRQD_Alloc_Num; // Allocated IRQ number
WORD IRQD_Req_Mask; // Mask of possible IRQs
WORD IRQD_Reserved;
};
typedef struct IRQ_Des_s IRQ_DES;
/*XLATOFF*/
/****************************************************************************
*
* 'C'-only defined total resource structure. Since a resource consists of
* one resource header followed by an undefined number of resource data
* structure, we use the undefined array size [] on the *_DATA structure
* member. Unfortunately, this does not H2INC since the total size of the
* array cannot be computed from the definition.
*
***************************************************************************/
#pragma warning (disable:4200) // turn off undefined array size
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?