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.

2946 lines
102 KiB

  1. /*****************************************************************************
  2. *
  3. * (C) Copyright MICROSOFT Corp., 1993
  4. *
  5. * Title: CONFIGMG.H - Configuration manager header file
  6. *
  7. * Version: 1.00
  8. *
  9. * Date: 02-Feb-1993
  10. *
  11. * Authors: PYS & RAL
  12. *
  13. *------------------------------------------------------------------------------
  14. *
  15. * Change log:
  16. *
  17. * DATE REV DESCRIPTION
  18. * ----------- --- -----------------------------------------------------------
  19. * 02-Feb-1993 PYS Original
  20. *****************************************************************************/
  21. #ifndef _CONFIGMG_H
  22. #define _CONFIGMG_H
  23. #ifdef WIN40COMPAT
  24. #define CONFIGMG_VERSION 0x0400
  25. #define PNPDRVS_Major_Ver 0x0004
  26. #define PNPDRVS_Minor_Ver 0x0000
  27. #define ASD_SUPPORT 1
  28. #define ASSERT_STRING_SUPPORT 1
  29. #else
  30. #define CONFIGMG_VERSION 0x040A
  31. #define PNPDRVS_Major_Ver 0x0004
  32. #define PNPDRVS_Minor_Ver 0x000A
  33. #define ASD_SUPPORT 0
  34. #define ASSERT_STRING_SUPPORT 0
  35. #endif
  36. #define CONFIGMG_W32IOCTL_RANGE 0x80000000
  37. #ifdef MAXDEBUG
  38. #define CM_PERFORMANCE_INFO
  39. #endif
  40. #ifdef GOLDEN
  41. #ifndef DEBUG
  42. #define CM_GOLDEN_RETAIL
  43. #endif
  44. #endif
  45. /*XLATOFF*/
  46. #include <pshpack1.h>
  47. /*XLATON*/
  48. #ifndef NORESDES
  49. /****************************************************************************
  50. *
  51. * EQUATES FOR RESOURCE DESCRIPTOR
  52. *
  53. * The equates for resource descriptor work the exact same way as those
  54. * for VxD IDs, which is:
  55. *
  56. * Device ID's are a combination of OEM # and device # in the form:
  57. *
  58. * xOOOOOOOOOODDDDD
  59. *
  60. * The high bit of the device ID is reserved for future use. The next
  61. * 10 bits are the OEM # which is assigned by Microsoft. The last 5 bits
  62. * are the device #. This allows each OEM to create 32 unique devices.
  63. * If an OEM is creating a replacement for a standard device, then it
  64. * should re-use the standard ID listed below. Microsoft reserves the
  65. * first 16 OEM #'s (0 thru 0Fh)
  66. *
  67. * To make your resource ID, you must use the same 10 OEMs bit that
  68. * have been given by Microsoft as OEM VxD ID range. You can then tag
  69. * any of the 32 unique number in that range (it does not have to be
  70. * the same as the VxD as some VxD may have mupltiple arbitrators).
  71. *
  72. * If the ResType_Ignored_Bit is set, the resource is not arbitrated.
  73. * You cannot register a handler for such a resource.
  74. *
  75. ***************************************************************************/
  76. #define ResType_All 0x00000000 // Return all resource types.
  77. #define ResType_None 0x00000000 // Arbitration always succeeded.
  78. #define ResType_Mem 0x00000001 // Physical address resource.
  79. #define ResType_IO 0x00000002 // Physical IO address resource.
  80. #define ResType_DMA 0x00000003 // DMA channels 0-7 resource.
  81. #define ResType_IRQ 0x00000004 // IRQ 0-15 resource.
  82. #define ResType_Max 0x00000004 // Max KNOWN ResType (for DEBUG).
  83. #define ResType_Ignored_Bit 0x00008000 // This resource is to be ignored.
  84. #define DEBUG_RESTYPE_NAMES \
  85. char CMFAR *lpszResourceName[ResType_Max+1]= \
  86. { \
  87. "None", \
  88. "Mem ", \
  89. "IO ", \
  90. "DMA ", \
  91. "IRQ ", \
  92. };
  93. /************************************************************************
  94. * *
  95. * OEMS WHO WANT A VXD DEVICE ID ASSIGNED TO THEM, *
  96. * PLEASE CONTACT MICROSOFT PRODUCT SUPPORT *
  97. * *
  98. ************************************************************************/
  99. /****************************************************************************
  100. *
  101. * RESOURCE DESCRIPTORS
  102. *
  103. * Each resource descriptor consists of an array of resource requests.
  104. * Exactly one element of the array must be satisfied. The data
  105. * of each array element is resource specific an described below.
  106. * The data may specify one or more resource requests. At least
  107. * one element of a Res_Des must be satisfied to satisfy the request
  108. * represented by the Res_Des. The values allocated to the Res_Des
  109. * are stored within the Res_Des.
  110. * Each subarray (OR element) is a single Res_Des followed
  111. * by data specific to the type of resource. The data includes the
  112. * allocated resource (if any) followed by resource requests (which
  113. * will include the values indicated by the allocated resource.
  114. *
  115. ***************************************************************************/
  116. /****************************************************************************
  117. * Memory resource requests consist of ranges of pages
  118. ***************************************************************************/
  119. #define MType_Range sizeof(struct Mem_Range_s)
  120. #define fMD_MemoryType 1 // Memory range is ROM/RAM
  121. #define fMD_ROM 0 // Memory range is ROM
  122. #define fMD_RAM 1 // Memory range is RAM
  123. #define fMD_32_24 2 // Memory range is 32/24 (for ISAPNP only)
  124. #define fMD_24 0 // Memory range is 24
  125. #define fMD_32 2 // Memory range is 32
  126. #define fMD_Pref 4 // Memory range is Prefetch
  127. #define fMD_CombinedWrite 8 // Memory range is write combineable (no effect, for WDM only)
  128. #define fMD_Cacheable 0x10 // Memory range is cacheable (no effect, for WDM only)
  129. /* Memory Range descriptor data
  130. */
  131. struct Mem_Range_s {
  132. ULONG MR_Align; // Mask for base alignment
  133. ULONG MR_nBytes; // Count of bytes
  134. ULONG MR_Min; // Min Address
  135. ULONG MR_Max; // Max Address
  136. WORD MR_Flags; // Flags
  137. WORD MR_Reserved;
  138. };
  139. typedef struct Mem_Range_s MEM_RANGE;
  140. /* Mem Resource descriptor header structure
  141. * MD_Count * MD_Type bytes of data follow header in an
  142. * array of MEM_RANGE structures. When an allocation is made,
  143. * the allocated value is stored in the MD_Alloc_... variables.
  144. *
  145. * Example for memory Resource Description:
  146. * Mem_Des_s {
  147. * MD_Count = 1;
  148. * MD_Type = MTypeRange;
  149. * MD_Alloc_Base = 0;
  150. * MD_Alloc_End = 0;
  151. * MD_Flags = 0;
  152. * MD_Reserved = 0;
  153. * };
  154. * Mem_Range_s {
  155. * MR_Align = 0xFFFFFF00; // 256 byte alignment
  156. * MR_nBytes = 32; // 32 bytes needed
  157. * MR_Min = 0;
  158. * MR_Max = 0xFFFFFFFF; // Any place in address space
  159. * MR_Flags = 0;
  160. * MR_Reserved = 0;
  161. * };
  162. */
  163. struct Mem_Des_s {
  164. WORD MD_Count;
  165. WORD MD_Type;
  166. ULONG MD_Alloc_Base;
  167. ULONG MD_Alloc_End;
  168. WORD MD_Flags;
  169. WORD MD_Reserved;
  170. };
  171. typedef struct Mem_Des_s MEM_DES;
  172. /****************************************************************************
  173. * IO resource allocations consist of fixed ranges or variable ranges
  174. * The Alias and Decode masks provide additional flexibility
  175. * in specifying how the address is handled. They provide a convenient
  176. * method for specifying what port aliases a card responds to. An alias
  177. * is a port address that is responded to as if it were another address.
  178. * Additionally, some cards will actually use additional ports for
  179. * different purposes, but use a decoding scheme that makes it look as
  180. * though it were using aliases. E.G., an ISA card may decode 10 bits
  181. * and require port 03C0h. It would need to specify an Alias offset of
  182. * 04h and a Decode of 3 (no aliases are used as actual ports). For
  183. * convenience, the alias field can be set to zero indicate no aliases
  184. * are required and then decode is ignored.
  185. * If the card were to use the ports at 7C0h, 0BC0h and 0FC0h, where these
  186. * ports have different functionality, the Alias would be the same and the
  187. * the decode would be 0Fh indicating bits 11 and 12 of the port address
  188. * are significant. Thus, the allocation is for all of the ports
  189. * (PORT[i] + (n*Alias*256)) & (Decode*256 | 03FFh), where n is
  190. * any integer and PORT is the range specified by the nPorts, Min and
  191. * Max fields. Note that the minimum Alias is 4 and the minimum
  192. * Decode is 3.
  193. * Because of the history of the ISA bus, all ports that can be described
  194. * by the formula PORT = n*400h + zzzz, where "zzzz" is a port in the
  195. * range 100h - 3FFh, will be checked for compatibility with the port
  196. * zzzz, assuming that the port zzzz is using a 10 bit decode. If a card
  197. * is on a local bus that can prevent the IO address from appearing on
  198. * the ISA bus (e.g. PCI), then the logical configuration should specify
  199. * an alias of IOA_Local which will prevent the arbitrator from checking
  200. * for old ISA bus compatibility.
  201. */
  202. #define IOType_Range sizeof(struct IO_Range_s) // Variable range
  203. /* IO Range descriptor data */
  204. struct IO_Range_s {
  205. WORD IOR_Align; // Mask for base alignment
  206. WORD IOR_nPorts; // Number of ports
  207. WORD IOR_Min; // Min port address
  208. WORD IOR_Max; // Max port address
  209. WORD IOR_RangeFlags; // Flags
  210. BYTE IOR_Alias; // Alias offset
  211. BYTE IOR_Decode; // Address specified
  212. };
  213. typedef struct IO_Range_s IO_RANGE;
  214. /* IO Resource descriptor header structure
  215. * IOD_Count * IOD_Type bytes of data follow header in an
  216. * array of IO_RANGE structures. When an allocation is made,
  217. * the allocated value is stored in the IOD_Alloc_... variables.
  218. *
  219. * Example for IO Resource Description:
  220. * IO_Des_s {
  221. * IOD_Count = 1;
  222. * IOD_Type = IOType_Range;
  223. * IOD_Alloc_Base = 0;
  224. * IOD_Alloc_End = 0;
  225. * IOD_Alloc_Alias = 0;
  226. * IOD_Alloc_Decode = 0;
  227. * IOD_DesFlags = 0;
  228. * IOD_Reserved = 0;
  229. * };
  230. * IO_Range_s {
  231. * IOR_Align = 0xFFF0; // 16 byte alignment
  232. * IOR_nPorts = 16; // 16 ports required
  233. * IOR_Min = 0x0100;
  234. * IOR_Max = 0x03FF; // Anywhere in ISA std ports
  235. * IOR_RangeFlags = 0;
  236. * IOR_Alias = 0004; // Standard ISA 10 bit aliasing
  237. * IOR_Decode = 0x000F; // Use first 3 aliases (e.g. if
  238. * // 0x100 were base port, 0x500
  239. * // 0x900, and 0xD00 would
  240. * // also be allocated)
  241. * };
  242. */
  243. struct IO_Des_s {
  244. WORD IOD_Count;
  245. WORD IOD_Type;
  246. WORD IOD_Alloc_Base;
  247. WORD IOD_Alloc_End;
  248. WORD IOD_DesFlags;
  249. BYTE IOD_Alloc_Alias;
  250. BYTE IOD_Alloc_Decode;
  251. };
  252. typedef struct IO_Des_s IO_DES;
  253. /* Definition for special alias value indicating card on PCI or similar local bus
  254. * This value should used for the IOR_Alias and IOD_Alias fields
  255. */
  256. #define IOA_Local 0xff
  257. /****************************************************************************
  258. * DMA channel resource allocations consist of one WORD channel bit masks.
  259. * The mask indcates alternative channel allocations,
  260. * one bit for each alternative (only one is allocated per mask).
  261. */
  262. /*DMA flags
  263. *First two are DMA channel width: BYTE, WORD or DWORD
  264. */
  265. #define mDD_Width 0x0003 // Mask for channel width
  266. #define fDD_BYTE 0
  267. #define fDD_WORD 1
  268. #define fDD_DWORD 2
  269. #define szDMA_Des_Flags "WD"
  270. /* DMA Resource descriptor structure
  271. *
  272. * Example for DMA Resource Description:
  273. *
  274. * DMA_Des_s {
  275. * DD_Flags = fDD_Byte; // Byte transfer
  276. * DD_Alloc_Chan = 0;
  277. * DD_Req_Mask = 0x60; // Channel 5 or 6
  278. * DD_Reserved = 0;
  279. * };
  280. */
  281. struct DMA_Des_s {
  282. BYTE DD_Flags;
  283. BYTE DD_Alloc_Chan; // Channel number allocated
  284. BYTE DD_Req_Mask; // Mask of possible channels
  285. BYTE DD_Reserved;
  286. };
  287. typedef struct DMA_Des_s DMA_DES;
  288. /****************************************************************************
  289. * IRQ resource allocations consist of two WORD IRQ bit masks.
  290. * The first mask indcates alternatives for IRQ allocation,
  291. * one bit for each alternative (only one is allocated per mask). The
  292. * second mask is used to specify that the IRQ can be shared.
  293. */
  294. /*
  295. * IRQ flags
  296. */
  297. #define fIRQD_Share_Bit 0 // IRQ can be shared
  298. #define fIRQD_Share 1 // IRQ can be shared
  299. #define fIRQD_Level_Bit 1 // IRQ is level (PCI)
  300. #define fIRQD_Level 2 // IRQ is level (PCI)
  301. #define cIRQ_Des_Flags 'S'
  302. /* IRQ Resource descriptor structure
  303. *
  304. * Example for IRQ Resource Description:
  305. *
  306. * IRQ_Des_s {
  307. * IRQD_Flags = fIRQD_Share // IRQ can be shared
  308. * IRQD_Alloc_Num = 0;
  309. * IRQD_Req_Mask = 0x18; // IRQ 3 or 4
  310. * IRQD_Reserved = 0;
  311. * };
  312. */
  313. struct IRQ_Des_s {
  314. WORD IRQD_Flags;
  315. WORD IRQD_Alloc_Num; // Allocated IRQ number
  316. WORD IRQD_Req_Mask; // Mask of possible IRQs
  317. WORD IRQD_Reserved;
  318. };
  319. typedef struct IRQ_Des_s IRQ_DES;
  320. /*XLATOFF*/
  321. /****************************************************************************
  322. *
  323. * 'C'-only defined total resource structure. Since a resource consists of
  324. * one resource header followed by an undefined number of resource data
  325. * structure, we use the undefined array size [] on the *_DATA structure
  326. * member. Unfortunately, this does not H2INC since the total size of the
  327. * array cannot be computed from the definition.
  328. *
  329. ***************************************************************************/
  330. #pragma warning (disable:4200) // turn off undefined array size
  331. typedef MEM_DES *PMEM_DES;
  332. typedef MEM_RANGE *PMEM_RANGE;
  333. typedef IO_DES *PIO_DES;
  334. typedef IO_RANGE *PIO_RANGE;
  335. typedef DMA_DES *PDMA_DES;
  336. typedef IRQ_DES *PIRQ_DES;
  337. struct MEM_Resource_s {
  338. MEM_DES MEM_Header;
  339. MEM_RANGE MEM_Data[];
  340. };
  341. typedef struct MEM_Resource_s MEM_RESOURCE;
  342. typedef MEM_RESOURCE *PMEM_RESOURCE;
  343. struct MEM_Resource1_s {
  344. MEM_DES MEM_Header;
  345. MEM_RANGE MEM_Data;
  346. };
  347. typedef struct MEM_Resource1_s MEM_RESOURCE1;
  348. typedef MEM_RESOURCE1 *PMEM_RESOURCE1;
  349. #define SIZEOF_MEM(x) (sizeof(MEM_DES)+(x)*sizeof(MEM_RANGE))
  350. struct IO_Resource_s {
  351. IO_DES IO_Header;
  352. IO_RANGE IO_Data[];
  353. };
  354. typedef struct IO_Resource_s IO_RESOURCE;
  355. typedef IO_RESOURCE *PIO_RESOURCE;
  356. struct IO_Resource1_s {
  357. IO_DES IO_Header;
  358. IO_RANGE IO_Data;
  359. };
  360. typedef struct IO_Resource1_s IO_RESOURCE1;
  361. typedef IO_RESOURCE1 *PIO_RESOURCE1;
  362. #define SIZEOF_IORANGE(x) (sizeof(IO_DES)+(x)*sizeof(IO_RANGE))
  363. struct DMA_Resource_s {
  364. DMA_DES DMA_Header;
  365. };
  366. typedef struct DMA_Resource_s DMA_RESOURCE;
  367. #define SIZEOF_DMA sizeof(DMA_DES)
  368. struct IRQ_Resource_s {
  369. IRQ_DES IRQ_Header;
  370. };
  371. typedef struct IRQ_Resource_s IRQ_RESOURCE;
  372. #define SIZEOF_IRQ sizeof(IRQ_DES)
  373. #pragma warning (default:4200) // turn on undefined array size
  374. /*XLATON*/
  375. #endif // ifndef NORESDES
  376. #define LCPRI_FORCECONFIG 0x00000000 // Logical configuration priorities.
  377. #define LCPRI_BOOTCONFIG 0x00000001
  378. #define LCPRI_DESIRED 0x00002000
  379. #define LCPRI_NORMAL 0x00003000
  380. #define LCPRI_LASTBESTCONFIG 0x00003FFF // CM ONLY, DO NOT USE.
  381. #define LCPRI_SUBOPTIMAL 0x00005000
  382. #define LCPRI_LASTSOFTCONFIG 0x00007FFF // CM ONLY, DO NOT USE.
  383. #define LCPRI_RESTART 0x00008000
  384. #define LCPRI_REBOOT 0x00009000
  385. #define LCPRI_POWEROFF 0x0000A000
  386. #define LCPRI_HARDRECONFIG 0x0000C000
  387. #define LCPRI_HARDWIRED 0x0000E000
  388. #define LCPRI_IMPOSSIBLE 0x0000F000
  389. #define LCPRI_DISABLED 0x0000FFFF
  390. #define MAX_LCPRI 0x0000FFFF
  391. #define MAX_MEM_REGISTERS 9
  392. #define MAX_IO_PORTS 20
  393. #define MAX_IRQS 7
  394. #define MAX_DMA_CHANNELS 7
  395. struct Config_Buff_s {
  396. WORD wNumMemWindows; // Num memory windows
  397. DWORD dMemBase[MAX_MEM_REGISTERS]; // Memory window base
  398. DWORD dMemLength[MAX_MEM_REGISTERS]; // Memory window length
  399. WORD wMemAttrib[MAX_MEM_REGISTERS]; // Memory window Attrib
  400. WORD wNumIOPorts; // Num IO ports
  401. WORD wIOPortBase[MAX_IO_PORTS]; // I/O port base
  402. WORD wIOPortLength[MAX_IO_PORTS]; // I/O port length
  403. WORD wNumIRQs; // Num IRQ info
  404. BYTE bIRQRegisters[MAX_IRQS]; // IRQ list
  405. BYTE bIRQAttrib[MAX_IRQS]; // IRQ Attrib list
  406. WORD wNumDMAs; // Num DMA channels
  407. BYTE bDMALst[MAX_DMA_CHANNELS]; // DMA list
  408. WORD wDMAAttrib[MAX_DMA_CHANNELS]; // DMA Attrib list
  409. BYTE bReserved1[3]; // Reserved
  410. };
  411. typedef struct Config_Buff_s CMCONFIG; // Config buffer info
  412. #ifndef CMJUSTRESDES
  413. #define MAX_DEVICE_ID_LEN 200
  414. #define CM_FIRST_BOOT_START 0x00000001
  415. #define CM_FIRST_BOOT 0x00000002
  416. #define CM_FIRST_BOOT_FINISH 0x00000004
  417. #define CM_QUEUE_REBOOT_START 0x00000008
  418. #define CM_QUEUE_REBOOT_FINISH 0x00000010
  419. #define CM_INSTALL_MEDIA_READY 0x00000020
  420. #include <vmmreg.h>
  421. /*XLATOFF*/
  422. #ifdef Not_VxD
  423. #include <dbt.h>
  424. #pragma warning(disable:4001) // Non-standard extensions
  425. #pragma warning(disable:4505) // Unreferenced local functions
  426. #ifdef IS_32
  427. #define CMFAR
  428. #else
  429. #define CMFAR _far
  430. #endif
  431. #else // Not_VxD
  432. #define CMFAR
  433. #endif // Not_VxD
  434. #ifdef IS_32
  435. typedef DWORD RETURN_TYPE;
  436. #else // IS_32
  437. typedef WORD RETURN_TYPE;
  438. #endif // IS_32
  439. #define CONFIGMG_Service Declare_Service
  440. /*XLATON*/
  441. /*MACROS*/
  442. Begin_Service_Table(CONFIGMG, VxD)
  443. CONFIGMG_Service (_CONFIGMG_Get_Version, VxD_CODE)
  444. CONFIGMG_Service (_CONFIGMG_Initialize, VxD_CODE)
  445. CONFIGMG_Service (_CONFIGMG_Locate_DevNode, VxD_CODE)
  446. CONFIGMG_Service (_CONFIGMG_Get_Parent, VxD_CODE)
  447. CONFIGMG_Service (_CONFIGMG_Get_Child, VxD_CODE)
  448. CONFIGMG_Service (_CONFIGMG_Get_Sibling, VxD_CODE)
  449. CONFIGMG_Service (_CONFIGMG_Get_Device_ID_Size, VxD_CODE)
  450. CONFIGMG_Service (_CONFIGMG_Get_Device_ID, VxD_CODE)
  451. CONFIGMG_Service (_CONFIGMG_Get_Depth, VxD_CODE)
  452. CONFIGMG_Service (_CONFIGMG_Get_Private_DWord, VxD_CODE)
  453. CONFIGMG_Service (_CONFIGMG_Set_Private_DWord, VxD_CODE)
  454. CONFIGMG_Service (_CONFIGMG_Create_DevNode, VxD_CODE)
  455. CONFIGMG_Service (_CONFIGMG_Query_Remove_SubTree, VxD_CODE)
  456. CONFIGMG_Service (_CONFIGMG_Remove_SubTree, VxD_CODE)
  457. CONFIGMG_Service (_CONFIGMG_Register_Device_Driver, VxD_CODE)
  458. CONFIGMG_Service (_CONFIGMG_Register_Enumerator, VxD_CODE)
  459. CONFIGMG_Service (_CONFIGMG_Register_Arbitrator, VxD_CODE)
  460. CONFIGMG_Service (_CONFIGMG_Deregister_Arbitrator, VxD_CODE)
  461. CONFIGMG_Service (_CONFIGMG_Query_Arbitrator_Free_Size, VxD_CODE)
  462. CONFIGMG_Service (_CONFIGMG_Query_Arbitrator_Free_Data, VxD_CODE)
  463. CONFIGMG_Service (_CONFIGMG_Sort_NodeList, VxD_CODE)
  464. CONFIGMG_Service (_CONFIGMG_Yield, VxD_CODE)
  465. CONFIGMG_Service (_CONFIGMG_Lock, VxD_CODE)
  466. CONFIGMG_Service (_CONFIGMG_Unlock, VxD_CODE)
  467. CONFIGMG_Service (_CONFIGMG_Add_Empty_Log_Conf, VxD_CODE)
  468. CONFIGMG_Service (_CONFIGMG_Free_Log_Conf, VxD_CODE)
  469. CONFIGMG_Service (_CONFIGMG_Get_First_Log_Conf, VxD_CODE)
  470. CONFIGMG_Service (_CONFIGMG_Get_Next_Log_Conf, VxD_CODE)
  471. CONFIGMG_Service (_CONFIGMG_Add_Res_Des, VxD_CODE)
  472. CONFIGMG_Service (_CONFIGMG_Modify_Res_Des, VxD_CODE)
  473. CONFIGMG_Service (_CONFIGMG_Free_Res_Des, VxD_CODE)
  474. CONFIGMG_Service (_CONFIGMG_Get_Next_Res_Des, VxD_CODE)
  475. CONFIGMG_Service (_CONFIGMG_Get_Performance_Info, VxD_CODE)
  476. CONFIGMG_Service (_CONFIGMG_Get_Res_Des_Data_Size, VxD_CODE)
  477. CONFIGMG_Service (_CONFIGMG_Get_Res_Des_Data, VxD_CODE)
  478. CONFIGMG_Service (_CONFIGMG_Process_Events_Now, VxD_CODE)
  479. CONFIGMG_Service (_CONFIGMG_Create_Range_List, VxD_CODE)
  480. CONFIGMG_Service (_CONFIGMG_Add_Range, VxD_CODE)
  481. CONFIGMG_Service (_CONFIGMG_Delete_Range, VxD_CODE)
  482. CONFIGMG_Service (_CONFIGMG_Test_Range_Available, VxD_CODE)
  483. CONFIGMG_Service (_CONFIGMG_Dup_Range_List, VxD_CODE)
  484. CONFIGMG_Service (_CONFIGMG_Free_Range_List, VxD_CODE)
  485. CONFIGMG_Service (_CONFIGMG_Invert_Range_List, VxD_CODE)
  486. CONFIGMG_Service (_CONFIGMG_Intersect_Range_List, VxD_CODE)
  487. CONFIGMG_Service (_CONFIGMG_First_Range, VxD_CODE)
  488. CONFIGMG_Service (_CONFIGMG_Next_Range, VxD_CODE)
  489. CONFIGMG_Service (_CONFIGMG_Dump_Range_List, VxD_CODE)
  490. CONFIGMG_Service (_CONFIGMG_Load_DLVxDs, VxD_CODE)
  491. CONFIGMG_Service (_CONFIGMG_Get_DDBs, VxD_CODE)
  492. CONFIGMG_Service (_CONFIGMG_Get_CRC_CheckSum, VxD_CODE)
  493. CONFIGMG_Service (_CONFIGMG_Register_DevLoader, VxD_CODE)
  494. CONFIGMG_Service (_CONFIGMG_Reenumerate_DevNode, VxD_CODE)
  495. CONFIGMG_Service (_CONFIGMG_Setup_DevNode, VxD_CODE)
  496. CONFIGMG_Service (_CONFIGMG_Reset_Children_Marks, VxD_CODE)
  497. CONFIGMG_Service (_CONFIGMG_Get_DevNode_Status, VxD_CODE)
  498. CONFIGMG_Service (_CONFIGMG_Remove_Unmarked_Children, VxD_CODE)
  499. CONFIGMG_Service (_CONFIGMG_ISAPNP_To_CM, VxD_CODE)
  500. CONFIGMG_Service (_CONFIGMG_CallBack_Device_Driver, VxD_CODE)
  501. CONFIGMG_Service (_CONFIGMG_CallBack_Enumerator, VxD_CODE)
  502. CONFIGMG_Service (_CONFIGMG_Get_Alloc_Log_Conf, VxD_CODE)
  503. CONFIGMG_Service (_CONFIGMG_Get_DevNode_Key_Size, VxD_CODE)
  504. CONFIGMG_Service (_CONFIGMG_Get_DevNode_Key, VxD_CODE)
  505. CONFIGMG_Service (_CONFIGMG_Read_Registry_Value, VxD_CODE)
  506. CONFIGMG_Service (_CONFIGMG_Write_Registry_Value, VxD_CODE)
  507. CONFIGMG_Service (_CONFIGMG_Disable_DevNode, VxD_CODE)
  508. CONFIGMG_Service (_CONFIGMG_Enable_DevNode, VxD_CODE)
  509. CONFIGMG_Service (_CONFIGMG_Move_DevNode, VxD_CODE)
  510. CONFIGMG_Service (_CONFIGMG_Set_Bus_Info, VxD_CODE)
  511. CONFIGMG_Service (_CONFIGMG_Get_Bus_Info, VxD_CODE)
  512. CONFIGMG_Service (_CONFIGMG_Set_HW_Prof, VxD_CODE)
  513. CONFIGMG_Service (_CONFIGMG_Recompute_HW_Prof, VxD_CODE)
  514. CONFIGMG_Service (_CONFIGMG_Query_Change_HW_Prof, VxD_CODE)
  515. CONFIGMG_Service (_CONFIGMG_Get_Device_Driver_Private_DWord, VxD_CODE)
  516. CONFIGMG_Service (_CONFIGMG_Set_Device_Driver_Private_DWord, VxD_CODE)
  517. CONFIGMG_Service (_CONFIGMG_Get_HW_Prof_Flags, VxD_CODE)
  518. CONFIGMG_Service (_CONFIGMG_Set_HW_Prof_Flags, VxD_CODE)
  519. CONFIGMG_Service (_CONFIGMG_Read_Registry_Log_Confs, VxD_CODE)
  520. CONFIGMG_Service (_CONFIGMG_Run_Detection, VxD_CODE)
  521. CONFIGMG_Service (_CONFIGMG_Call_At_Appy_Time, VxD_CODE)
  522. CONFIGMG_Service (_CONFIGMG_Fail_Change_HW_Prof, VxD_CODE)
  523. CONFIGMG_Service (_CONFIGMG_Set_Private_Problem, VxD_CODE)
  524. CONFIGMG_Service (_CONFIGMG_Debug_DevNode, VxD_CODE)
  525. CONFIGMG_Service (_CONFIGMG_Get_Hardware_Profile_Info, VxD_CODE)
  526. CONFIGMG_Service (_CONFIGMG_Register_Enumerator_Function, VxD_CODE)
  527. CONFIGMG_Service (_CONFIGMG_Call_Enumerator_Function, VxD_CODE)
  528. CONFIGMG_Service (_CONFIGMG_Add_ID, VxD_CODE)
  529. CONFIGMG_Service (_CONFIGMG_Find_Range, VxD_CODE)
  530. CONFIGMG_Service (_CONFIGMG_Get_Global_State, VxD_CODE)
  531. CONFIGMG_Service (_CONFIGMG_Broadcast_Device_Change_Message, VxD_CODE)
  532. CONFIGMG_Service (_CONFIGMG_Call_DevNode_Handler, VxD_CODE)
  533. CONFIGMG_Service (_CONFIGMG_Remove_Reinsert_All, VxD_CODE)
  534. //
  535. // 4.0 OPK2 Services
  536. //
  537. CONFIGMG_Service (_CONFIGMG_Change_DevNode_Status, VxD_CODE)
  538. CONFIGMG_Service (_CONFIGMG_Reprocess_DevNode, VxD_CODE)
  539. CONFIGMG_Service (_CONFIGMG_Assert_Structure, VxD_CODE)
  540. CONFIGMG_Service (_CONFIGMG_Discard_Boot_Log_Conf, VxD_CODE)
  541. CONFIGMG_Service (_CONFIGMG_Set_Dependent_DevNode, VxD_CODE)
  542. CONFIGMG_Service (_CONFIGMG_Get_Dependent_DevNode, VxD_CODE)
  543. CONFIGMG_Service (_CONFIGMG_Refilter_DevNode, VxD_CODE)
  544. CONFIGMG_Service (_CONFIGMG_Merge_Range_List, VxD_CODE)
  545. CONFIGMG_Service (_CONFIGMG_Substract_Range_List, VxD_CODE)
  546. CONFIGMG_Service (_CONFIGMG_Set_DevNode_PowerState, VxD_CODE)
  547. CONFIGMG_Service (_CONFIGMG_Get_DevNode_PowerState, VxD_CODE)
  548. CONFIGMG_Service (_CONFIGMG_Set_DevNode_PowerCapabilities, VxD_CODE)
  549. CONFIGMG_Service (_CONFIGMG_Get_DevNode_PowerCapabilities, VxD_CODE)
  550. CONFIGMG_Service (_CONFIGMG_Read_Range_List, VxD_CODE)
  551. CONFIGMG_Service (_CONFIGMG_Write_Range_List, VxD_CODE)
  552. CONFIGMG_Service (_CONFIGMG_Get_Set_Log_Conf_Priority, VxD_CODE)
  553. CONFIGMG_Service (_CONFIGMG_Support_Share_Irq, VxD_CODE)
  554. CONFIGMG_Service (_CONFIGMG_Get_Parent_Structure, VxD_CODE)
  555. //
  556. // 4.1 Services
  557. //
  558. CONFIGMG_Service (_CONFIGMG_Register_DevNode_For_Idle_Detection, VxD_CODE)
  559. CONFIGMG_Service (_CONFIGMG_CM_To_ISAPNP, VxD_CODE)
  560. CONFIGMG_Service (_CONFIGMG_Get_DevNode_Handler, VxD_CODE)
  561. CONFIGMG_Service (_CONFIGMG_Detect_Resource_Conflict, VxD_CODE)
  562. CONFIGMG_Service (_CONFIGMG_Get_Device_Interface_List, VxD_CODE)
  563. CONFIGMG_Service (_CONFIGMG_Get_Device_Interface_List_Size, VxD_CODE)
  564. CONFIGMG_Service (_CONFIGMG_Get_Conflict_Info, VxD_CODE)
  565. CONFIGMG_Service (_CONFIGMG_Add_Remove_DevNode_Property, VxD_CODE)
  566. CONFIGMG_Service (_CONFIGMG_CallBack_At_Appy_Time, VxD_CODE)
  567. CONFIGMG_Service (_CONFIGMG_Register_Device_Interface, VxD_CODE)
  568. CONFIGMG_Service (_CONFIGMG_System_Device_Power_State_Mapping, VxD_CODE)
  569. CONFIGMG_Service (_CONFIGMG_Get_Arbitrator_Info, VxD_CODE)
  570. CONFIGMG_Service (_CONFIGMG_Waking_Up_From_DevNode, VxD_CODE)
  571. CONFIGMG_Service (_CONFIGMG_Set_DevNode_Problem, VxD_CODE)
  572. CONFIGMG_Service (_CONFIGMG_Get_Device_Interface_Alias, VxD_CODE)
  573. End_Service_Table(CONFIGMG, VxD)
  574. /*ENDMACROS*/
  575. /*XLATOFF*/
  576. #define NUM_CM_SERVICES ((WORD)(Num_CONFIGMG_Services & 0xFFFF))
  577. #define DEBUG_SERVICE_NAMES \
  578. char CMFAR *lpszServiceName[NUM_CM_SERVICES]= \
  579. { \
  580. "_CONFIGMG_Get_Version", \
  581. "_CONFIGMG_Initialize", \
  582. "_CONFIGMG_Locate_DevNode", \
  583. "_CONFIGMG_Get_Parent", \
  584. "_CONFIGMG_Get_Child", \
  585. "_CONFIGMG_Get_Sibling", \
  586. "_CONFIGMG_Get_Device_ID_Size", \
  587. "_CONFIGMG_Get_Device_ID", \
  588. "_CONFIGMG_Get_Depth", \
  589. "_CONFIGMG_Get_Private_DWord", \
  590. "_CONFIGMG_Set_Private_DWord", \
  591. "_CONFIGMG_Create_DevNode", \
  592. "_CONFIGMG_Query_Remove_SubTree", \
  593. "_CONFIGMG_Remove_SubTree", \
  594. "_CONFIGMG_Register_Device_Driver", \
  595. "_CONFIGMG_Register_Enumerator", \
  596. "_CONFIGMG_Register_Arbitrator", \
  597. "_CONFIGMG_Deregister_Arbitrator", \
  598. "_CONFIGMG_Query_Arbitrator_Free_Size", \
  599. "_CONFIGMG_Query_Arbitrator_Free_Data", \
  600. "_CONFIGMG_Sort_NodeList", \
  601. "_CONFIGMG_Yield", \
  602. "_CONFIGMG_Lock", \
  603. "_CONFIGMG_Unlock", \
  604. "_CONFIGMG_Add_Empty_Log_Conf", \
  605. "_CONFIGMG_Free_Log_Conf", \
  606. "_CONFIGMG_Get_First_Log_Conf", \
  607. "_CONFIGMG_Get_Next_Log_Conf", \
  608. "_CONFIGMG_Add_Res_Des", \
  609. "_CONFIGMG_Modify_Res_Des", \
  610. "_CONFIGMG_Free_Res_Des", \
  611. "_CONFIGMG_Get_Next_Res_Des", \
  612. "_CONFIGMG_Get_Performance_Info", \
  613. "_CONFIGMG_Get_Res_Des_Data_Size", \
  614. "_CONFIGMG_Get_Res_Des_Data", \
  615. "_CONFIGMG_Process_Events_Now", \
  616. "_CONFIGMG_Create_Range_List", \
  617. "_CONFIGMG_Add_Range", \
  618. "_CONFIGMG_Delete_Range", \
  619. "_CONFIGMG_Test_Range_Available", \
  620. "_CONFIGMG_Dup_Range_List", \
  621. "_CONFIGMG_Free_Range_List", \
  622. "_CONFIGMG_Invert_Range_List", \
  623. "_CONFIGMG_Intersect_Range_List", \
  624. "_CONFIGMG_First_Range", \
  625. "_CONFIGMG_Next_Range", \
  626. "_CONFIGMG_Dump_Range_List", \
  627. "_CONFIGMG_Load_DLVxDs", \
  628. "_CONFIGMG_Get_DDBs", \
  629. "_CONFIGMG_Get_CRC_CheckSum", \
  630. "_CONFIGMG_Register_DevLoader", \
  631. "_CONFIGMG_Reenumerate_DevNode", \
  632. "_CONFIGMG_Setup_DevNode", \
  633. "_CONFIGMG_Reset_Children_Marks", \
  634. "_CONFIGMG_Get_DevNode_Status", \
  635. "_CONFIGMG_Remove_Unmarked_Children", \
  636. "_CONFIGMG_ISAPNP_To_CM", \
  637. "_CONFIGMG_CallBack_Device_Driver", \
  638. "_CONFIGMG_CallBack_Enumerator", \
  639. "_CONFIGMG_Get_Alloc_Log_Conf", \
  640. "_CONFIGMG_Get_DevNode_Key_Size", \
  641. "_CONFIGMG_Get_DevNode_Key", \
  642. "_CONFIGMG_Read_Registry_Value", \
  643. "_CONFIGMG_Write_Registry_Value", \
  644. "_CONFIGMG_Disable_DevNode", \
  645. "_CONFIGMG_Enable_DevNode", \
  646. "_CONFIGMG_Move_DevNode", \
  647. "_CONFIGMG_Set_Bus_Info", \
  648. "_CONFIGMG_Get_Bus_Info", \
  649. "_CONFIGMG_Set_HW_Prof", \
  650. "_CONFIGMG_Recompute_HW_Prof", \
  651. "_CONFIGMG_Query_Change_HW_Prof", \
  652. "_CONFIGMG_Get_Device_Driver_Private_DWord", \
  653. "_CONFIGMG_Set_Device_Driver_Private_DWord", \
  654. "_CONFIGMG_Get_HW_Prof_Flags", \
  655. "_CONFIGMG_Set_HW_Prof_Flags", \
  656. "_CONFIGMG_Read_Registry_Log_Confs", \
  657. "_CONFIGMG_Run_Detection", \
  658. "_CONFIGMG_Call_At_Appy_Time", \
  659. "_CONFIGMG_Fail_Change_HW_Prof", \
  660. "_CONFIGMG_Set_Private_Problem", \
  661. "_CONFIGMG_Debug_DevNode", \
  662. "_CONFIGMG_Get_Hardware_Profile_Info", \
  663. "_CONFIGMG_Register_Enumerator_Function", \
  664. "_CONFIGMG_Call_Enumerator_Function", \
  665. "_CONFIGMG_Add_ID", \
  666. "_CONFIGMG_Find_Range", \
  667. "_CONFIGMG_Get_Global_State", \
  668. "_CONFIGMG_Broadcast_Device_Change_Message", \
  669. "_CONFIGMG_Call_DevNode_Handler", \
  670. "_CONFIGMG_Remove_Reinsert_All", \
  671. "_CONFIGMG_Change_DevNode_Status", \
  672. "_CONFIGMG_Reprocess_DevNode", \
  673. "_CONFIGMG_Assert_Structure", \
  674. "_CONFIGMG_Discard_Boot_Log_Conf", \
  675. "_CONFIGMG_Set_Dependent_DevNode", \
  676. "_CONFIGMG_Get_Dependent_DevNode", \
  677. "_CONFIGMG_Refilter_DevNode", \
  678. "_CONFIGMG_Merge_Range_List", \
  679. "_CONFIGMG_Substract_Range_List", \
  680. "_CONFIGMG_Set_DevNode_PowerState", \
  681. "_CONFIGMG_Get_DevNode_PowerState", \
  682. "_CONFIGMG_Set_DevNode_PowerCapabilities", \
  683. "_CONFIGMG_Get_DevNode_PowerCapabilities", \
  684. "_CONFIGMG_Read_Range_List", \
  685. "_CONFIGMG_Write_Range_List", \
  686. "_CONFIGMG_Get_Set_Log_Conf_Priority", \
  687. "_CONFIGMG_Support_Share_Irq", \
  688. "_CONFIGMG_Get_Parent_Structure", \
  689. "_CONFIGMG_Register_For_Idle_Detection", \
  690. "_CONFIGMG_CM_To_ISAPNP", \
  691. "_CONFIGMG_Get_DevNode_Handler", \
  692. "_CONFIGMG_Detect_Resource_Conflict", \
  693. "_CONFIGMG_Get_Device_Interface_List", \
  694. "_CONFIGMG_Get_Device_Interface_List_Size", \
  695. "_CONFIGMG_Get_Conflict_Info", \
  696. "_CONFIGMG_Add_Remove_DevNode_Property", \
  697. "_CONFIGMG_CallBack_At_Appy_Time", \
  698. "_CONFIGMG_Register_Device_Interface", \
  699. "_CONFIGMG_System_Device_Power_State_Mapping", \
  700. "_CONFIGMG_Get_Arbitrator_Info", \
  701. "_CONFIGMG_Waking_Up_From_DevNode", \
  702. "_CONFIGMG_Set_DevNode_Problem", \
  703. "_CONFIGMG_Get_Device_Interface_Alias", \
  704. };
  705. /*XLATON*/
  706. /****************************************************************************
  707. *
  708. * GLOBALLY DEFINED TYPEDEFS
  709. *
  710. ***************************************************************************/
  711. typedef RETURN_TYPE CONFIGRET; // Standardized return value.
  712. typedef PPVMMDDB *PPPVMMDDB; // Too long to describe.
  713. typedef VOID CMFAR *PFARVOID; // Pointer to a VOID.
  714. typedef ULONG CMFAR *PFARULONG; // Pointer to a ULONG.
  715. typedef char CMFAR *PFARCHAR; // Pointer to a string.
  716. typedef VMMHKEY CMFAR *PFARHKEY; // Pointer to a HKEY.
  717. typedef char CMFAR *DEVNODEID; // Device ID ANSI name.
  718. typedef DWORD LOG_CONF; // Logical configuration.
  719. typedef LOG_CONF CMFAR *PLOG_CONF; // Pointer to logical configuration.
  720. typedef DWORD RES_DES; // Resource descriptor.
  721. typedef RES_DES CMFAR *PRES_DES; // Pointer to resource descriptor.
  722. typedef DWORD DEVNODE; // Devnode.
  723. typedef DEVNODE CMFAR *PDEVNODE; // Pointer to devnode.
  724. typedef DWORD REGISTERID; // Arbitartor registration.
  725. typedef REGISTERID CMFAR *PREGISTERID; // Pointer to arbitartor registration.
  726. typedef ULONG RESOURCEID; // Resource type ID.
  727. typedef RESOURCEID CMFAR *PRESOURCEID; // Pointer to resource type ID.
  728. typedef ULONG PRIORITY; // Priority number.
  729. typedef PRIORITY CMFAR *PPRIORITY; // Pointer to a priority number.
  730. typedef DWORD RANGE_LIST; // Range list handle.
  731. typedef RANGE_LIST CMFAR *PRANGE_LIST; // Pointer to a range list handle.
  732. typedef DWORD RANGE_ELEMENT; // Range list element handle.
  733. typedef RANGE_ELEMENT CMFAR *PRANGE_ELEMENT;// Pointer to a range element handle.
  734. typedef DWORD LOAD_TYPE; // For the loading function.
  735. typedef CMCONFIG CMFAR *PCMCONFIG; // Pointer to a config buffer info.
  736. typedef DWORD CMBUSTYPE; // Type of the bus.
  737. typedef CMBUSTYPE CMFAR *PCMBUSTYPE; // Pointer to a bus type.
  738. typedef double VMM_TIME; // Time in microticks.
  739. #define LODWORD(x) ((DWORD)(x))
  740. #define HIDWORD(x) (*(PDWORD)(PDWORD(&x)+1))
  741. #ifdef _NTDDK_
  742. typedef DEVICE_POWER_STATE PSMAPPING[PowerSystemMaximum];
  743. #else
  744. typedef VOID PSMAPPING;
  745. #endif
  746. typedef PSMAPPING CMFAR *PPSMAPPING;
  747. typedef ULONG CONFIGFUNC;
  748. typedef ULONG SUBCONFIGFUNC;
  749. typedef CONFIGRET (CMFAR _cdecl *CMCONFIGHANDLER)(CONFIGFUNC, SUBCONFIGFUNC, DEVNODE, ULONG, ULONG);
  750. typedef CONFIGRET (CMFAR _cdecl *CMENUMHANDLER)(CONFIGFUNC, SUBCONFIGFUNC, DEVNODE, DEVNODE, ULONG);
  751. typedef VOID (CMFAR _cdecl *CMAPPYCALLBACKHANDLER)(ULONG);
  752. typedef ULONG ENUMFUNC;
  753. typedef CONFIGRET (CMFAR _cdecl *CMENUMFUNCTION)(ENUMFUNC, ULONG, DEVNODE, PFARVOID, ULONG);
  754. /****************************************************************************
  755. *
  756. * Arbitration list structures (they must be key in sync with CONFIGMG's
  757. * local.h own structure).
  758. *
  759. ***************************************************************************/
  760. typedef struct nodelist_s NODELIST;
  761. typedef NODELIST CMFAR *PNODELIST;
  762. typedef PNODELIST CMFAR *PPNODELIST;
  763. struct nodelist_s {
  764. struct nodelist_s *nl_Next; // Next node element
  765. struct nodelist_s *nl_Previous; // Previous node element
  766. DEVNODE nl_ItsDevNode; // The dev node it represent
  767. LOG_CONF nl_Test_Req; // Test resource alloc request
  768. ULONG nl_ulSortDWord; // Specifies the sort order
  769. };
  770. struct nodelistheader_s {
  771. struct nodelist_s *nlh_Head; // First node element
  772. struct nodelist_s *nlh_Tail; // Last node element
  773. };
  774. typedef struct nodelistheader_s NODELISTHEADER;
  775. typedef NODELISTHEADER CMFAR *PNODELISTHEADER;
  776. /*XLATOFF*/
  777. struct arbitfree_s {
  778. PFARVOID af_PointerToInfo; // the arbitrator info
  779. ULONG af_SizeOfInfo; // size of the info
  780. };
  781. /*XLATON*/
  782. /* ASM
  783. arbitfree_s STRUC
  784. af_PointerToInfo dd ?
  785. af_SizeOfInfo dd ?
  786. arbitfree_s ENDS
  787. */
  788. typedef struct arbitfree_s ARBITFREE;
  789. typedef ARBITFREE CMFAR *PARBITFREE;
  790. typedef ULONG ARBFUNC;
  791. typedef CONFIGRET (CMFAR _cdecl *CMARBHANDLER)(ARBFUNC, ULONG, DEVNODE, PNODELISTHEADER);
  792. /****************************************************************************
  793. *
  794. * CONFIGURATION MANAGER BUS TYPES
  795. *
  796. ***************************************************************************/
  797. #define BusType_None 0x00000000
  798. #define BusType_ISA 0x00000001
  799. #define BusType_EISA 0x00000002
  800. #define BusType_PCI 0x00000004
  801. #define BusType_PCMCIA 0x00000008
  802. #define BusType_ISAPNP 0x00000010
  803. #define BusType_MCA 0x00000020
  804. #define BusType_BIOS 0x00000040
  805. #define BusType_ACPI 0x00000080
  806. #define BusType_IDE 0x00000100
  807. #define BusType_MF 0x00000200
  808. /****************************************************************************
  809. *
  810. * CONFIGURATION MANAGER STRUCTURE TYPES
  811. *
  812. ***************************************************************************/
  813. #define CMAS_UNKNOWN 0x00000000
  814. #define CMAS_DEVNODE 0x00000001
  815. #define CMAS_LOG_CONF 0x00000002
  816. #define CMAS_RES_DES 0x00000003
  817. #define CMAS_RANGELIST_HEADER 0x00000004
  818. #define CMAS_RANGELIST 0x00000005
  819. #define CMAS_NODELIST_HEADER 0x00000006
  820. #define CMAS_NODELIST 0x00000007
  821. #define CMAS_INTERNAL_RES_DES 0x00000008
  822. #define CMAS_ARBITRATOR 0x00000009
  823. /****************************************************************************
  824. *
  825. * CONFIGURATION MANAGER RETURN VALUES
  826. *
  827. ***************************************************************************/
  828. #define CR_SUCCESS 0x00000000
  829. #define CR_DEFAULT 0x00000001
  830. #define CR_OUT_OF_MEMORY 0x00000002
  831. #define CR_INVALID_POINTER 0x00000003
  832. #define CR_INVALID_FLAG 0x00000004
  833. #define CR_INVALID_DEVNODE 0x00000005
  834. #define CR_INVALID_RES_DES 0x00000006
  835. #define CR_INVALID_LOG_CONF 0x00000007
  836. #define CR_INVALID_ARBITRATOR 0x00000008
  837. #define CR_INVALID_NODELIST 0x00000009
  838. #define CR_DEVNODE_HAS_REQS 0x0000000A
  839. #define CR_INVALID_RESOURCEID 0x0000000B
  840. #define CR_DLVXD_NOT_FOUND 0x0000000C
  841. #define CR_NO_SUCH_DEVNODE 0x0000000D
  842. #define CR_NO_MORE_LOG_CONF 0x0000000E
  843. #define CR_NO_MORE_RES_DES 0x0000000F
  844. #define CR_ALREADY_SUCH_DEVNODE 0x00000010
  845. #define CR_INVALID_RANGE_LIST 0x00000011
  846. #define CR_INVALID_RANGE 0x00000012
  847. #define CR_FAILURE 0x00000013
  848. #define CR_NO_SUCH_LOGICAL_DEV 0x00000014
  849. #define CR_CREATE_BLOCKED 0x00000015
  850. #define CR_NOT_A_GOOD_TIME 0x00000016
  851. #define CR_REMOVE_VETOED 0x00000017
  852. #define CR_APM_VETOED 0x00000018
  853. #define CR_INVALID_LOAD_TYPE 0x00000019
  854. #define CR_BUFFER_SMALL 0x0000001A
  855. #define CR_NO_ARBITRATOR 0x0000001B
  856. #define CR_NO_REGISTRY_HANDLE 0x0000001C
  857. #define CR_REGISTRY_ERROR 0x0000001D
  858. #define CR_INVALID_DEVICE_ID 0x0000001E
  859. #define CR_INVALID_DATA 0x0000001F
  860. #define CR_INVALID_API 0x00000020
  861. #define CR_DEVLOADER_NOT_READY 0x00000021
  862. #define CR_NEED_RESTART 0x00000022
  863. #define CR_NO_MORE_HW_PROFILES 0x00000023
  864. #define CR_DEVICE_NOT_THERE 0x00000024
  865. #define CR_NO_SUCH_VALUE 0x00000025
  866. #define CR_WRONG_TYPE 0x00000026
  867. #define CR_INVALID_PRIORITY 0x00000027
  868. #define CR_NOT_DISABLEABLE 0x00000028
  869. #define CR_FREE_RESOURCES 0x00000029
  870. #define CR_QUERY_VETOED 0x0000002A
  871. #define CR_CANT_SHARE_IRQ 0x0000002B
  872. //
  873. // 4.0 OPK2 results
  874. //
  875. #define CR_NO_DEPENDENT 0x0000002C
  876. //
  877. // 4.1 OPK2 results
  878. //
  879. #define CR_SAME_RESOURCES 0x0000002D
  880. #define CR_ALREADY_SUCH_DEPENDENT 0x0000002E
  881. #define NUM_CR_RESULTS 0x0000002F
  882. /*XLATOFF*/
  883. #define DEBUG_RETURN_CR_NAMES \
  884. char CMFAR *lpszReturnCRName[NUM_CR_RESULTS]= \
  885. { \
  886. "CR_SUCCESS", \
  887. "CR_DEFAULT", \
  888. "CR_OUT_OF_MEMORY", \
  889. "CR_INVALID_POINTER", \
  890. "CR_INVALID_FLAG", \
  891. "CR_INVALID_DEVNODE", \
  892. "CR_INVALID_RES_DES", \
  893. "CR_INVALID_LOG_CONF", \
  894. "CR_INVALID_ARBITRATOR", \
  895. "CR_INVALID_NODELIST", \
  896. "CR_DEVNODE_HAS_REQS", \
  897. "CR_INVALID_RESOURCEID", \
  898. "CR_DLVXD_NOT_FOUND", \
  899. "CR_NO_SUCH_DEVNODE", \
  900. "CR_NO_MORE_LOG_CONF", \
  901. "CR_NO_MORE_RES_DES", \
  902. "CR_ALREADY_SUCH_DEVNODE", \
  903. "CR_INVALID_RANGE_LIST", \
  904. "CR_INVALID_RANGE", \
  905. "CR_FAILURE", \
  906. "CR_NO_SUCH_LOGICAL_DEVICE", \
  907. "CR_CREATE_BLOCKED", \
  908. "CR_NOT_A_GOOD_TIME", \
  909. "CR_REMOVE_VETOED", \
  910. "CR_APM_VETOED", \
  911. "CR_INVALID_LOAD_TYPE", \
  912. "CR_BUFFER_SMALL", \
  913. "CR_NO_ARBITRATOR", \
  914. "CR_NO_REGISTRY_HANDLE", \
  915. "CR_REGISTRY_ERROR", \
  916. "CR_INVALID_DEVICE_ID", \
  917. "CR_INVALID_DATA", \
  918. "CR_INVALID_API", \
  919. "CR_DEVLOADER_NOT_READY", \
  920. "CR_NEED_RESTART", \
  921. "CR_NO_MORE_HW_PROFILES", \
  922. "CR_DEVICE_NOT_THERE", \
  923. "CR_NO_SUCH_VALUE", \
  924. "CR_WRONG_TYPE", \
  925. "CR_INVALID_PRIORITY", \
  926. "CR_NOT_DISABLEABLE", \
  927. "CR_FREE_RESOURCES", \
  928. "CR_QUERY_VETOED", \
  929. "CR_CANT_SHARE_IRQ", \
  930. "CR_NO_DEPENDENT", \
  931. "CR_SAME_RESOURCES", \
  932. "CR_ALREADY_SUCH_DEPENDENT", \
  933. };
  934. /*XLATON*/
  935. #define CM_PROB_NOT_CONFIGURED 0x00000001
  936. #define CM_PROB_DEVLOADER_FAILED 0x00000002
  937. #define CM_PROB_OUT_OF_MEMORY 0x00000003
  938. #define CM_PROB_ENTRY_IS_WRONG_TYPE 0x00000004
  939. #define CM_PROB_LACKED_ARBITRATOR 0x00000005
  940. #define CM_PROB_BOOT_CONFIG_CONFLICT 0x00000006
  941. #define CM_PROB_FAILED_FILTER 0x00000007
  942. #define CM_PROB_DEVLOADER_NOT_FOUND 0x00000008
  943. #define CM_PROB_INVALID_DATA 0x00000009
  944. #define CM_PROB_FAILED_START 0x0000000A
  945. #define CM_PROB_ASD_FAILED 0x0000000B
  946. #define CM_PROB_NORMAL_CONFLICT 0x0000000C
  947. #define CM_PROB_NOT_VERIFIED 0x0000000D
  948. #define CM_PROB_NEED_RESTART 0x0000000E
  949. #define CM_PROB_REENUMERATION 0x0000000F
  950. #define CM_PROB_PARTIAL_LOG_CONF 0x00000010
  951. #define CM_PROB_UNKNOWN_RESOURCE 0x00000011
  952. #define CM_PROB_REINSTALL 0x00000012
  953. #define CM_PROB_REGISTRY 0x00000013
  954. #define CM_PROB_VXDLDR 0x00000014
  955. #define CM_PROB_WILL_BE_REMOVED 0x00000015
  956. #define CM_PROB_DISABLED 0x00000016
  957. #define CM_PROB_DEVLOADER_NOT_READY 0x00000017
  958. #define CM_PROB_DEVICE_NOT_THERE 0x00000018
  959. #define CM_PROB_MOVED 0x00000019
  960. #define CM_PROB_TOO_EARLY 0x0000001A
  961. #define CM_PROB_NO_VALID_LOG_CONF 0x0000001B
  962. #define CM_PROB_FAILED_INSTALL 0x0000001C
  963. #define CM_PROB_HARDWARE_DISABLED 0x0000001D
  964. #define CM_PROB_CANT_SHARE_IRQ 0x0000001E
  965. //
  966. // 4.0 OPK2 Problems
  967. //
  968. #define CM_PROB_DEPENDENT_PROBLEM 0x0000001F
  969. //
  970. // 4.1 Problems
  971. //
  972. #define CM_PROB_INSTALL_MEDIA_NOT_READY 0x00000020
  973. #define CM_PROB_HARDWARE_MALFUNCTION 0x00000021
  974. #define NUM_CM_PROB 0x00000022
  975. /*XLATOFF*/
  976. #define DEBUG_CM_PROB_NAMES \
  977. char CMFAR *lpszCMProbName[NUM_CM_PROB]= \
  978. { \
  979. "No Problem", \
  980. "No ConfigFlags (not configured)", \
  981. "Devloader failed", \
  982. "Run out of memory", \
  983. "Devloader/StaticVxD/Configured is of wrong type", \
  984. "Lacked an arbitrator", \
  985. "Boot config conflicted", \
  986. "Filtering failed", \
  987. "Devloader not found", \
  988. "Invalid data in registry", \
  989. "Device failed to start", \
  990. "ASD check failed", \
  991. "Was normal conflicting", \
  992. "Did not verified", \
  993. "Need restart", \
  994. "Is probably reenumeration", \
  995. "Was not fully detected", \
  996. "Resource number was not found", \
  997. "Reinstall", \
  998. "Registry returned unknown result", \
  999. "VxDLdr returned unknown result", \
  1000. "Will be removed", \
  1001. "Disabled", \
  1002. "Devloader was not ready", \
  1003. "Device not there", \
  1004. "Was moved", \
  1005. "Too early", \
  1006. "No valid log conf", \
  1007. "Failed install", \
  1008. "Hardware Disabled", \
  1009. "Can't share IRQ", \
  1010. "Dependent failed", \
  1011. "Install media not ready", \
  1012. "Hardware malfunction", \
  1013. };
  1014. /*XLATON*/
  1015. //
  1016. // Flags to be passed in the various APIs
  1017. //
  1018. #define CM_INITIALIZE_VMM 0x00000000
  1019. #define CM_INITIALIZE_BITS 0x00000000
  1020. #define CM_YIELD_NO_RESUME_EXEC 0x00000000
  1021. #define CM_YIELD_RESUME_EXEC 0x00000001
  1022. #define CM_YIELD_BITS 0x00000001
  1023. #define CM_LOCK_UNLOCK_NORMAL 0x00000000
  1024. #define CM_LOCK_UNLOCK_JUST_DEVNODES_CHANGED 0x00000001
  1025. #define CM_LOCK_UNLOCK_BITS 0x00000001
  1026. #define CM_CREATE_DEVNODE_NORMAL 0x00000000
  1027. #define CM_CREATE_DEVNODE_NO_WAIT_INSTALL 0x00000001
  1028. #define CM_CREATE_DEVNODE_ADD_PARENT_INSTANCE 0x00000002
  1029. #define CM_CREATE_DEVNODE_BITS 0x00000003
  1030. #define CM_REGISTER_DEVICE_DRIVER_STATIC 0x00000000
  1031. #define CM_REGISTER_DEVICE_DRIVER_DISABLEABLE 0x00000001
  1032. #define CM_REGISTER_DEVICE_DRIVER_REMOVABLE 0x00000002
  1033. #define CM_REGISTER_DEVICE_DRIVER_SYNCHRONOUS 0x00000000
  1034. #define CM_REGISTER_DEVICE_DRIVER_ASYNCHRONOUS 0x00000004
  1035. #define CM_REGISTER_DEVICE_DRIVER_ACPI_APM 0x00000008
  1036. #define CM_REGISTER_DEVICE_DRIVER_LOAD_DRIVER 0x00000010
  1037. #define CM_REGISTER_DEVICE_DRIVER_BITS 0x0000001F
  1038. #define CM_REGISTER_ENUMERATOR_SOFTWARE 0x00000000
  1039. #define CM_REGISTER_ENUMERATOR_HARDWARE 0x00000001
  1040. #define CM_REGISTER_ENUMERATOR_ACPI_APM 0x00000002
  1041. #define CM_REGISTER_ENUMERATOR_BITS 0x00000003
  1042. #define CM_REGISTER_ARBITRATOR_GLOBAL 0x00000001
  1043. #define CM_REGISTER_ARBITRATOR_LOCAL 0x00000000
  1044. #define CM_REGISTER_ARBITRATOR_MYSELF 0x00000002
  1045. #define CM_REGISTER_ARBITRATOR_NOT_MYSELF 0x00000000
  1046. #define CM_REGISTER_ARBITRATOR_CONFLICT_FREE 0x00000004
  1047. #define CM_REGISTER_ARBITRATOR_CAN_CONFLICT 0x00000000
  1048. #define CM_REGISTER_ARBITRATOR_PARTIAL 0x00000008
  1049. #define CM_REGISTER_ARBITRATOR_COMPLETE 0x00000000
  1050. #define CM_REGISTER_ARBITRATOR_PARTIAL_RES_DES 0x00000010
  1051. #define CM_REGISTER_ARBITRATOR_PARTIAL_DEVNODE 0x00000000
  1052. #define CM_REGISTER_ARBITRATOR_BITS 0x0000001F
  1053. #define CM_QUERY_REMOVE_UI_OK 0x00000000
  1054. #define CM_QUERY_REMOVE_UI_NOT_OK 0x00000001
  1055. #define CM_QUERY_REMOVE_BITS 0x00000001
  1056. #define CM_REMOVE_UI_OK 0x00000000
  1057. #define CM_REMOVE_UI_NOT_OK 0x00000001
  1058. #define CM_REMOVE_BITS 0x00000001
  1059. #define CM_SETUP_DEVNODE_READY 0x00000000
  1060. #define CM_SETUP_DOWNLOAD 0x00000001
  1061. #define CM_SETUP_WRITE_LOG_CONFS 0x00000002
  1062. #define CM_SETUP_PROP_CHANGE 0x00000003
  1063. #define CM_SETUP_BITS 0x00000003
  1064. #define CM_ADD_RANGE_ADDIFCONFLICT 0x00000000
  1065. #define CM_ADD_RANGE_DONOTADDIFCONFLICT 0x00000001
  1066. #define CM_ADD_RANGE_BITS 0x00000001
  1067. #define CM_ISAPNP_ADD_RES_DES 0x00000000
  1068. #define CM_ISAPNP_SETUP 0x00000001
  1069. #define CM_ISAPNP_ADD_BOOT_RES_DES 0x00000002
  1070. #define CM_ISAPNP_ADD_RES_DES_UNCONFIGURABLE 0x00000003
  1071. #define CM_ISAPNP_BITS 0x00000003
  1072. #define CM_GET_BUS_INFO_DONT_RETURN_MF_INFO 0x00000000
  1073. #define CM_GET_BUS_INFO_RETURN_MF_INFO 0x00000001
  1074. #define CM_GET_BUS_INFO_FLAGS 0x00000001
  1075. #define CM_GET_PERFORMANCE_INFO_DATA 0x00000000
  1076. #define CM_GET_PERFORMANCE_INFO_RESET 0x00000001
  1077. #define CM_GET_PERFORMANCE_INFO_START 0x00000002
  1078. #define CM_GET_PERFORMANCE_INFO_STOP 0x00000003
  1079. #define CM_RESET_HIT_DATA 0x00000004
  1080. #define CM_GET_HIT_DATA 0x00000005
  1081. #define CM_GET_PERFORMANCE_INFO_BITS 0x0000000F
  1082. #define CM_HIT_DATA_FILES 0xFFFF0000
  1083. #define CM_HIT_DATA_SIZE ((256*8)+8) // magic number!
  1084. #define CM_GET_ALLOC_LOG_CONF_ALLOC 0x00000000
  1085. #define CM_GET_ALLOC_LOG_CONF_BOOT_ALLOC 0x00000001
  1086. #define CM_GET_ALLOC_LOG_CONF_BITS 0x00000001
  1087. #define CM_DUMP_RANGE_NORMAL 0x00000000
  1088. #define CM_DUMP_RANGE_JUST_LIST 0x00000001
  1089. #define CM_DUMP_RANGE_BITS 0x00000001
  1090. #define CM_REGISTRY_HARDWARE 0x00000000 // Select hardware branch if NULL subkey
  1091. #define CM_REGISTRY_SOFTWARE 0x00000001 // Select software branch if NULL subkey
  1092. #define CM_REGISTRY_USER 0x00000100 // Use HKEY_CURRENT_USER
  1093. #define CM_REGISTRY_CONFIG 0x00000200 // Use HKEY_CURRENT_CONFIG
  1094. #define CM_REGISTRY_BITS 0x00000301 // The bits for the registry functions
  1095. #define CM_DISABLE_POLITE 0x00000000 // Ask the driver
  1096. #define CM_DISABLE_ABSOLUTE 0x00000001 // Don't ask the driver
  1097. #define CM_DISABLE_HARDWARE 0x00000002 // Don't ask the driver, and won't be restarteable
  1098. #define CM_DISABLE_BITS 0x00000003 // The bits for the disable function
  1099. #define CM_HW_PROF_UNDOCK 0x00000000 // Computer not in a dock.
  1100. #define CM_HW_PROF_DOCK 0x00000001 // Computer in a docking station
  1101. #define CM_HW_PROF_RECOMPUTE_BITS 0x00000001 // RecomputeConfig
  1102. #define CM_HW_PROF_DOCK_KNOWN 0x00000002 // Computer in a known docking station
  1103. #define CM_HW_PROF_QUERY_CHANGE_BITS 0x00000003 // QueryChangeConfig
  1104. #define CM_DETECT_NEW_PROFILE 0x00000001 // run detect for a new profile
  1105. #define CM_DETECT_CRASHED 0x00000002 // detection crashed before
  1106. #define CM_DETECT_HWPROF_FIRST_BOOT 0x00000004 // first boot in a new profile
  1107. #define CM_DETECT_TOPBUSONLY 0x00000008 // detect only top level bus
  1108. #define CM_DETECT_VERIFYONLY 0x00000010 // verify, dont detect
  1109. #define CM_DETECT_EXCLENUMDEVS 0x00000020 // exclude enum devs
  1110. #define CM_DETECT_DOUI 0x00000040 // detect all HW
  1111. #define CM_DETECT_RUN 0x80000000 // run detection for new hardware
  1112. #define CM_ADD_ID_HARDWARE 0x00000000
  1113. #define CM_ADD_ID_COMPATIBLE 0x00000001
  1114. #define CM_ADD_ID_BITS 0x00000001
  1115. #define CM_REENUMERATE_NORMAL 0x00000000
  1116. #define CM_REENUMERATE_SYNCHRONOUS 0x00000001
  1117. #define CM_REENUMERATE_BITS 0x00000001
  1118. #define CM_BROADCAST_SEND 0x00000000
  1119. #define CM_BROADCAST_QUERY 0x00000001
  1120. #define CM_BROADCAST_BITS 0x00000001
  1121. #define CM_CALL_HANDLER_ENUMERATOR 0x00000000
  1122. #define CM_CALL_HANDLER_DEVICE_DRIVER 0x00000001
  1123. #define CM_CALL_HANDLER_BITS 0x00000001
  1124. #define CM_GLOBAL_STATE_CAN_DO_UI 0x00000001
  1125. #define CM_GLOBAL_STATE_ON_BIG_STACK 0x00000002
  1126. #define CM_GLOBAL_STATE_SERVICES_AVAILABLE 0x00000004
  1127. #define CM_GLOBAL_STATE_SHUTING_DOWN 0x00000008
  1128. #define CM_GLOBAL_STATE_DETECTION_PENDING 0x00000010
  1129. #define CM_GLOBAL_STATE_ON_BATTERY 0x00000020
  1130. #define CM_GLOBAL_STATE_SUSPEND_PHASE 0x00000040
  1131. #define CM_GLOBAL_STATE_SUSPEND_LOCKED_PHASE 0x00000080
  1132. #define CM_GLOBAL_STATE_REBALANCE 0x00000100
  1133. #define CM_GLOBAL_STATE_LOGGING_ON 0x00000200
  1134. #define CM_REMOVE_REINSERT_ALL_REMOVE 0x00000000
  1135. #define CM_REMOVE_REINSERT_ALL_REINSERT 0x00000001
  1136. #define CM_REMOVE_REINSERT_ALL_BITS 0x00000001
  1137. #define CM_CHANGE_DEVNODE_STATUS_REMOVE_FLAGS 0x00000000
  1138. #define CM_CHANGE_DEVNODE_STATUS_ADD_FLAGS 0x00000001
  1139. #define CM_CHANGE_DEVNODE_STATUS_BITS 0x00000001
  1140. #define CM_REPROCESS_DEVNODE_ASYNCHRONOUS 0x00000000
  1141. #define CM_REPROCESS_DEVNODE_SYNCHRONOUS 0x00000001
  1142. #define CM_REPROCESS_DEVNODE_BITS 0x00000001
  1143. //
  1144. // SET_DEVNODE_POWERSTATE_PERSISTANT is ignored in 4.1. You need to call
  1145. // Set_DevNode_Property(CM_PROPERTY_ARM_WAKEUP).
  1146. //
  1147. //#define CM_SET_DEVNODE_POWERSTATE_PERSISTANT 0x00000001
  1148. #define CM_SET_DEVNODE_POWERSTATE_BITS 0x00000001
  1149. #define CM_POWERSTATE_D0 0x00000001
  1150. #define CM_POWERSTATE_D1 0x00000002
  1151. #define CM_POWERSTATE_D2 0x00000004
  1152. #define CM_POWERSTATE_D3 0x00000008
  1153. #define CM_POWERSTATE_BITS 0x0000000f
  1154. #define CM_CAPABILITIES_NORMAL 0x00000000
  1155. #define CM_CAPABILITIES_FOR_WAKEUP 0x00000001
  1156. #define CM_CAPABILITIES_OVERRIDE 0x00000002 // Should be used by ACPI only
  1157. #define CM_CAPABILITIES_MERGE 0x00000000
  1158. #define CM_GET_CAPABILITIES_BITS 0x00000001
  1159. #define CM_SET_CAPABILITIES_BITS 0x00000003
  1160. #define CM_CM_TO_ISAPNP_NORMAL 0x00000000
  1161. #define CM_CM_TO_ISAPNP_FAIL_NUL_TAGS 0x00000001
  1162. #define CM_CM_TO_ISAPNP_BITS 0x00000001
  1163. #define CM_SET_DEPENDENT_DEVNODE_ADD 0x00000000
  1164. #define CM_SET_DEPENDENT_DEVNODE_REMOVE 0x00000001
  1165. #define CM_SET_DEPENDENT_DEVNODE_BITS 0x00000001
  1166. #define CM_GET_DEVNODE_HANDLER_CONFIG 0x00000000
  1167. #define CM_GET_DEVNODE_HANDLER_ENUM 0x00000001
  1168. #define CM_GET_DEVNODE_HANDLER_BITS 0x00000001
  1169. #define CM_GET_DEVICE_INTERFACE_LIST_PRESENT 0x00000000 // only currently 'live' devices
  1170. #define CM_GET_DEVICE_INTERFACE_LIST_ALL_DEVICES 0x00000001 // all registered devices, live or not
  1171. #define CM_GET_DEVICE_INTERFACE_LIST_BITS 0x00000001
  1172. #define CM_ADD_REMOVE_DEVNODE_PROPERTY_ADD 0x00000000
  1173. #define CM_ADD_REMOVE_DEVNODE_PROPERTY_REMOVE 0x00000001
  1174. #define CM_ADD_REMOVE_DEVNODE_PROPERTY_NEEDS_LOCKING 0x00000002
  1175. #define CM_ADD_REMOVE_DEVNODE_PROPERTY_ARM_WAKEUP 0x00000004
  1176. #define CM_ADD_REMOVE_DEVNODE_PROPERTY_LIGHT_SLEEP 0x00000008
  1177. #define CM_ADD_REMOVE_DEVNODE_PROPERTY_BITS 0x0000000F
  1178. #define CM_SYSTEM_DEVICE_POWER_STATE_MAPPING_GET 0x00000000
  1179. #define CM_SYSTEM_DEVICE_POWER_STATE_MAPPING_SET 0x00000001
  1180. #define CM_SYSTEM_DEVICE_POWER_STATE_MAPPING_BITS 0x00000001
  1181. #define CM_WAKING_UP_FROM_DEVNODE_ASYNCHRONOUS 0x00000000
  1182. #define CM_WAKING_UP_FROM_DEVNODE_SYNCHRONOUS 0x00000001
  1183. #define CM_WAKING_UP_FROM_DEVNODE_BITS 0x00000001
  1184. #define CM_GET_LOG_CONF_PRIORITY 0x00000000
  1185. #define CM_SET_LOG_CONF_PRIORITY 0x00000001
  1186. #define CM_GET_SET_LOG_CONF_PRIORITY_BITS 0x00000001
  1187. /****************************************************************************
  1188. *
  1189. * CONFIGURATION MANAGER FUNCTIONS
  1190. *
  1191. ****************************************************************************
  1192. *
  1193. * Each devnode has a config handler field and a enum handler field
  1194. * which are getting called every time Configuration Manager wants a
  1195. * devnode to perform some configuration related function. The handler
  1196. * is registered with CM_Register_Device_Driver or
  1197. * CM_Register_Enumerator, depending if the handler is for the device
  1198. * itself or for one of the children of the devnode.
  1199. *
  1200. * The registered handler is called with:
  1201. *
  1202. * result=dnToDevNode->dn_Config(if dnToDevNode==dnAboutDevNode)
  1203. * result=dnToDevNode->dn_Enum(if dnToDevNode!=dnAboutDevNode)
  1204. * ( FuncName,
  1205. * SubFuncName,
  1206. * dnToDevNode,
  1207. * dnAboutDevNode, (if enum)
  1208. * dwRefData, (if driver)
  1209. * ulFlags);
  1210. * Where:
  1211. *
  1212. * FuncName is one of CONFIG_FILTER, CONFIG_START, CONFIG_STOP,
  1213. * CONFIG_TEST, CONFIG_REMOVE, CONFIG_ENUMERATE, CONFIG_SETUP or
  1214. * CONFIG_CALLBACK.
  1215. *
  1216. * SubFuncName is the specific CONFIG_xxxx_* that further describe
  1217. * we START, STOP or TEST.
  1218. *
  1219. * dnToDevNode is the devnode we are calling. This is given so that
  1220. * a signle handler can handle multiple devnodes.
  1221. *
  1222. * dnAboutDevNode specifies which devnode the function is about. For
  1223. * a config handler, this is necessarily the same as dnToDevNode. For
  1224. * an enumerator handler, this devnode is necessarily different as it
  1225. * is a child of the dnToDevNode (special case: CONFIG_ENUMERATE
  1226. * necessarily has dnAboutDevNode==NULL). For instance, when starting
  1227. * a COM devnode under a BIOS enumerator, we would make the following
  1228. * two calls:
  1229. *
  1230. * To BIOS with (CONFIG_START, ?, BIOS, COM, ?, 0).
  1231. *
  1232. * To COM with (CONFIG_START, ?, COM, COM, ?, 0).
  1233. *
  1234. * dwRefData is a dword of reference data. For a config handler, it is
  1235. * the DWORD passed on the CONFIGMG_Register_Device_Driver call. For an
  1236. * enumerator, it is the same as CONFIGMG_Get_Private_DWord(?,
  1237. * dnToDevNode, dnToDevNode, 0).
  1238. *
  1239. * ulFlags is 0 and is reserved for future extensions.
  1240. *
  1241. * Here is the explanation of each event, in parenthesis I put the
  1242. * order the devnodes will be called:
  1243. *
  1244. * CONFIG_FILTER (BRANCH GOING UP) is the first thing called when a new
  1245. * insertion or change of configuration need to be processed. First
  1246. * CM copies the requirement list (BASIC_LOG_CONF) onto the filtered
  1247. * requirement list (FILTER_LOG_CONF) so that they are originally
  1248. * the same. CM then calls every node up, giving them the chance to
  1249. * patch the requirement of the dnAboutDevNode (they can also
  1250. * alter their own requirement). Examples are PCMCIA which would
  1251. * remove some IRQ that the adapter can't do, prealloc some IO
  1252. * windows and memory windows. ISA which would limit address space
  1253. * to being <16Meg. A device driver should look only at
  1254. * FILTER_LOG_CONF during this call.
  1255. *
  1256. * CONFIG_START (BRANCH GOING DOWN) are called to change the
  1257. * configuration. A config handler/enumerator hander should look
  1258. * only at the allocated list (ALLOC_LOG_CONF).
  1259. *
  1260. * CONFIG_STOP (WHOLE TREE BUT ONLY DEVNODES THAT CHANGE
  1261. * CONFIGURATION (FOR EACH DEVNODE, BRANCH GOING UP)) is called
  1262. * for two reasons:
  1263. *
  1264. * 1) Just after the rebalance algorithm came up with a
  1265. * solution and we want to stop all devnodes that will be
  1266. * rebalance. This is to avoid the problem of having two cards
  1267. * that can respond to 110h and 220h and that need to toggle
  1268. * their usage. We do not want two people responding to 220h,
  1269. * even for a brief amount of time. This is the normal call
  1270. * though.
  1271. *
  1272. * 2) There was a conflict and the user selected this device
  1273. * to kill.
  1274. *
  1275. * CONFIG_TEST (WHOLE TREE) is called before starting the rebalance
  1276. * algorithm. Device drivers that fail this call will be considered
  1277. * worst than jumpered configured for the reminder of this balancing
  1278. * process.
  1279. *
  1280. * CONFIG_REMOVE (FOR EACH SUB TREE NODE, DOING BRANCH GOING UP), is
  1281. * called when someone notify CM via CM_Remove_SubTree that a devnode
  1282. * is not needed anymore. A static VxD probably has nothing to do. A
  1283. * dynamic VxD should check whether it should unload itself (return
  1284. * CR_SUCCESS_UNLOAD) or not (CR_SUCCESS).
  1285. *
  1286. * Note, failing any of CONFIG_START, or CONFIG_STOP is really bad,
  1287. * both in terms of performance and stability. Requirements for a
  1288. * configuration to succeed should be noted/preallocated during
  1289. * CONFIG_FILTER. Failing CONFIG_TEST is less bad as what basically
  1290. * happens is that the devnode is considered worst than jumpered
  1291. * configured for the reminder of this pass of the balancing algorithm.
  1292. *
  1293. * COMFIG_ENUMERATE, the called node should create children devnodes
  1294. * using CM_Create_DevNode (but no need for grand children) and remove
  1295. * children using CM_Remove_SubTree as appropriate. Config Manager
  1296. * will recurse calling the children until nothing new appears. During
  1297. * this call, dnAboutDevNode will be NULL. Note that there is an easy
  1298. * way for buses which do not have direct children accessibility to
  1299. * detect (ISAPNP for instance will isolate one board at a time and
  1300. * there is no way to tell one specific board not to participate in
  1301. * the isolation sequence):
  1302. *
  1303. * If some children have soft-eject capability, check those first.
  1304. * If the user is pressing the eject button, call Query_Remove_SubTree
  1305. * and if that succeed, call Remove_SubTree.
  1306. *
  1307. * Do a CM_Reset_Children_Marks on the bus devnode.
  1308. *
  1309. * Do the usual sequence doing CM_Create_DevNode calls. If a devnode
  1310. * was already there, CR_ALREADY_SUCH_DEVNODE is returned and this
  1311. * devnode's DN_HAS_MARK will be set. There is nothing more to do with
  1312. * this devnode has it should just continue running. If the devnode
  1313. * was not previously there, CR_SUCCESS will be return, in which case
  1314. * the enumerator should add the logical configurations.
  1315. *
  1316. * Once all the devnode got created. The enumerator can call
  1317. * CM_Remove_Unmarked_Children to remove the devnode that are now gone.
  1318. * Essentially, this is a for loop thru all the children of the bus
  1319. * devnode, doing Remove_SubTree on the the devnode which have their
  1320. * mark cleared. Alternatively, an enumerator can use CM_Get_Child,
  1321. * CM_Get_Sibling, CM_Remove_SubTree and CM_Get_DevNode_Status.
  1322. *
  1323. * For CONFIG_SETUP, the called node should install drivers if it
  1324. * know out to get them. This is mostly for drivers imbeded in the
  1325. * cards (ISA_RTR, PCI or PCMCIA). For most old cards/driver, this
  1326. * should return CR_NO_DRIVER.
  1327. *
  1328. * WARNING: For any non-defined service, the enumertor / device
  1329. * driver handler should return CR_DEFAULT. This will be treated
  1330. * as the compatibility case in future version.
  1331. *
  1332. * So normally what happens is as follows:
  1333. *
  1334. * - Some detection code realize there is a new device. This can be at
  1335. * initialization time or at run-time (usually during a media_change
  1336. * interrupt). The code does a CM_Reenumerate_DevNode(dnBusDevNode)
  1337. * asynchronous call.
  1338. *
  1339. * - During appy time event, CM gets notified.
  1340. *
  1341. * - CM calls the enumerator with:
  1342. *
  1343. * BusEnumHandler(CONFIG_ENUMERATE, 0, dnBusDevNode, NULL, ?, 0);
  1344. *
  1345. * - The parent uses CM_Create_DevNode and CM_Remove_SubTree as
  1346. * appropriate, usually for only its immediate children.
  1347. *
  1348. * - The parent return to CM from the enumerator call.
  1349. *
  1350. * - CM walks the children, first loading their device driver if
  1351. * needed, then calling their enumerators. Thus the whole process
  1352. * will terminate only when all grand-...-grand-children have stopped
  1353. * using CM_Create_DevNode.
  1354. *
  1355. * If rebalance is called (a new devnode is conflicting):
  1356. *
  1357. * - All devnode receives the CONFIG_TEST. Devnodes that
  1358. * fail it are considered worst than jumpered configured.
  1359. *
  1360. * - CM does the rebalance algorithm.
  1361. *
  1362. * - All affected devnodes that where previously loaded get the
  1363. * CONFIG_STOP event.
  1364. *
  1365. * - All affected devnode and the new devnodes receives a CONFIG_START.
  1366. *
  1367. * If rebalancing failed (couldn't make one or more devnodes work):
  1368. *
  1369. * - Device installer is called which will present the user with a
  1370. * choice of devnode to kill.
  1371. *
  1372. * - Those devnodes will received a CONFIG_STOP message.
  1373. *
  1374. ***************************************************************************/
  1375. // Possible CONFIGFUNC FuncNames:
  1376. #define CONFIG_FILTER 0x00000000 // Ancestors must filter requirements.
  1377. #define CONFIG_START 0x00000001 // Devnode dynamic initialization.
  1378. #define CONFIG_STOP 0x00000002 // Devnode must stop using config.
  1379. #define CONFIG_TEST 0x00000003 // Can devnode change state now.
  1380. #define CONFIG_REMOVE 0x00000004 // Devnode must stop using config.
  1381. #define CONFIG_ENUMERATE 0x00000005 // Devnode must enumerated.
  1382. #define CONFIG_SETUP 0x00000006 // Devnode should download driver.
  1383. #define CONFIG_CALLBACK 0x00000007 // Devnode is being called back.
  1384. #define CONFIG_APM 0x00000008 // APM functions.
  1385. #define CONFIG_TEST_FAILED 0x00000009 // Continue as before after a TEST.
  1386. #define CONFIG_TEST_SUCCEEDED 0x0000000A // Prepare for the STOP/REMOVE.
  1387. #define CONFIG_VERIFY_DEVICE 0x0000000B // Insure the legacy card is there.
  1388. #define CONFIG_PREREMOVE 0x0000000C // Devnode must stop using config.
  1389. #define CONFIG_SHUTDOWN 0x0000000D // We are shutting down.
  1390. #define CONFIG_PREREMOVE2 0x0000000E // Devnode must stop using config.
  1391. #define CONFIG_READY 0x0000000F // The devnode has been setup.
  1392. #define CONFIG_PROP_CHANGE 0x00000010 // The property page is exiting.
  1393. #define CONFIG_PRIVATE 0x00000011 // Someone called Call_Handler.
  1394. #define CONFIG_PRESHUTDOWN 0x00000012 // We are shutting down
  1395. #define CONFIG_BEGIN_PNP_MODE 0x00000013 // We will start configuring PNP devs.
  1396. #define CONFIG_LOCK 0x00000014 // Gets call during suspend
  1397. #define CONFIG_UNLOCK 0x00000015 // Gets call during resume
  1398. #define CONFIG_IRP 0x00000016 // IRP from WDM driver
  1399. #define CONFIG_WAKEUP 0x00000017 // Please arm/disarm the wake up.
  1400. #define CONFIG_WAKEUP_CALLBACK 0x00000018 // You are waking up
  1401. #define NUM_CONFIG_COMMANDS 0x00000019 // For DEBUG.
  1402. /*XLATOFF*/
  1403. #define DEBUG_CONFIG_NAMES \
  1404. char CMFAR *lpszConfigName[NUM_CONFIG_COMMANDS]= \
  1405. { \
  1406. "CONFIG_FILTER", \
  1407. "CONFIG_START", \
  1408. "CONFIG_STOP", \
  1409. "CONFIG_TEST", \
  1410. "CONFIG_REMOVE", \
  1411. "CONFIG_ENUMERATE", \
  1412. "CONFIG_SETUP", \
  1413. "CONFIG_CALLBACK", \
  1414. "CONFIG_APM", \
  1415. "CONFIG_TEST_FAILED", \
  1416. "CONFIG_TEST_SUCCEEDED", \
  1417. "CONFIG_VERIFY_DEVICE", \
  1418. "CONFIG_PREREMOVE", \
  1419. "CONFIG_SHUTDOWN", \
  1420. "CONFIG_PREREMOVE2", \
  1421. "CONFIG_READY", \
  1422. "CONFIG_PROP_CHANGE", \
  1423. "CONFIG_PRIVATE", \
  1424. "CONFIG_PRESHUTDOWN", \
  1425. "CONFIG_BEGIN_PNP_MODE", \
  1426. "CONFIG_LOCK", \
  1427. "CONFIG_UNLOCK", \
  1428. "CONFIG_IRP", \
  1429. "CONFIG_WAKEUP", \
  1430. "CONFIG_WAKEUP_CALLBACK", \
  1431. };
  1432. /*XLATON*/
  1433. // Possible SUBCONFIGFUNC SubFuncNames:
  1434. #define CONFIG_START_DYNAMIC_START 0x00000000
  1435. #define CONFIG_START_FIRST_START 0x00000001
  1436. #define CONFIG_START_SHUTDOWN_START 0x00000002
  1437. #define NUM_START_COMMANDS 0x00000003
  1438. /*XLATOFF*/
  1439. #define DEBUG_START_NAMES \
  1440. char CMFAR *lpszStartName[NUM_START_COMMANDS] = \
  1441. { \
  1442. "DYNAMIC_START", \
  1443. "FIRST_START", \
  1444. "SHUTDOWN_START", \
  1445. };
  1446. /*XLATON*/
  1447. #define CONFIG_STOP_DYNAMIC_STOP 0x00000000
  1448. #define CONFIG_STOP_HAS_PROBLEM 0x00000001
  1449. #define NUM_STOP_COMMANDS 0x00000002
  1450. /*XLATOFF*/
  1451. #define DEBUG_STOP_NAMES \
  1452. char CMFAR *lpszStopName[NUM_STOP_COMMANDS] = \
  1453. { \
  1454. "DYNAMIC_STOP", \
  1455. "HAS_PROBLEM", \
  1456. };
  1457. /*XLATON*/
  1458. //
  1459. // For both CONFIG_REMOVE, CONFIG_PREREMOVE and CONFIG_POSTREMOVE
  1460. //
  1461. #define CONFIG_REMOVE_DYNAMIC 0x00000000
  1462. #define CONFIG_REMOVE_SHUTDOWN 0x00000001
  1463. #define CONFIG_REMOVE_REBOOT 0x00000002
  1464. #define CONFIG_SHUTDOWN_OFF 0x00000000
  1465. #define CONFIG_SHUTDOWN_REBOOT 0x00000001
  1466. #define NUM_REMOVE_COMMANDS 0x00000003
  1467. /*XLATOFF*/
  1468. #define DEBUG_REMOVE_NAMES \
  1469. char CMFAR *lpszRemoveName[NUM_REMOVE_COMMANDS] = \
  1470. { \
  1471. "DYNAMIC", \
  1472. "SHUTDOWN", \
  1473. "REBOOT", \
  1474. };
  1475. /*XLATON*/
  1476. #define CONFIG_ENUMERATE_DYNAMIC 0x00000000
  1477. #define CONFIG_ENUMERATE_FIRST_TIME 0x00000001
  1478. #define NUM_ENUMERATE_COMMANDS 0x00000002
  1479. /*XLATOFF*/
  1480. #define DEBUG_ENUMERATE_NAMES \
  1481. char CMFAR *lpszEnumerateName[NUM_ENUMERATE_COMMANDS] = \
  1482. { \
  1483. "DYNAMIC", \
  1484. "FIRST_TIME", \
  1485. };
  1486. /*XLATON*/
  1487. #define CONFIG_TEST_CAN_STOP 0x00000000
  1488. #define CONFIG_TEST_CAN_REMOVE 0x00000001
  1489. #define NUM_TEST_COMMANDS 0x00000002
  1490. /*XLATOFF*/
  1491. #define DEBUG_TEST_NAMES \
  1492. char CMFAR *lpszTestName[NUM_TEST_COMMANDS] = \
  1493. { \
  1494. "CAN_STOP", \
  1495. "CAN_REMOVE", \
  1496. };
  1497. /*XLATON*/
  1498. //
  1499. // APM changed drastically in 4.1. We do not send the old APM message at all.
  1500. // Enumerators/Device Driver
  1501. //
  1502. //
  1503. // APM messages have a flag part (the high part) as well as message number
  1504. // part (the low part).
  1505. //
  1506. #define CONFIG_APM_FLAGS_MASK 0xFFFFF000
  1507. //
  1508. // APM flags
  1509. //
  1510. #define CONFIG_APM_UI_IS_ALLOWED 0x80000000
  1511. #define CONFIG_APM_SUSPEND_PHASE 0x40000000
  1512. #define CONFIG_APM_SUSPEND_LOCKED_PHASE 0x20000000
  1513. #define CONFIG_APM_ARM_WAKEUP 0x10000000
  1514. #define CONFIG_APM_RESUME_CRITICAL 0x08000000
  1515. #define CONFIG_APM_QUERY_D1 0x00000000
  1516. #define CONFIG_APM_QUERY_D2 0x00000001
  1517. #define CONFIG_APM_QUERY_D3 0x00000002
  1518. #define CONFIG_APM_FAILED_D1 0x00000003
  1519. #define CONFIG_APM_FAILED_D2 0x00000004
  1520. #define CONFIG_APM_FAILED_D3 0x00000005
  1521. #define CONFIG_APM_SET_D0 0x00000006
  1522. #define CONFIG_APM_SET_D1 0x00000007
  1523. #define CONFIG_APM_SET_D2 0x00000008
  1524. #define CONFIG_APM_SET_D3 0x00000009
  1525. //
  1526. // Normally you shouldn't listen to the resume ones unless you care about
  1527. // behing turned on right away on resume.
  1528. //
  1529. #define CONFIG_APM_RESUME_D0 0x0000000A
  1530. #define CONFIG_APM_RESUME_D1 0x0000000B
  1531. #define CONFIG_APM_RESUME_D2 0x0000000C
  1532. #define CONFIG_APM_RESUME_D3 0x0000000D
  1533. //
  1534. // Only NTKern should listen to the following ones.
  1535. //
  1536. #define CONFIG_APM_QUERY_S1 0x0000000E
  1537. #define CONFIG_APM_QUERY_S2 0x0000000F
  1538. #define CONFIG_APM_QUERY_S3 0x00000010
  1539. #define CONFIG_APM_QUERY_S4 0x00000011
  1540. #define CONFIG_APM_QUERY_S5 0x00000012
  1541. #define CONFIG_APM_SET_S0 0x00000013
  1542. #define CONFIG_APM_SET_S1 0x00000014
  1543. #define CONFIG_APM_SET_S2 0x00000015
  1544. #define CONFIG_APM_SET_S3 0x00000016
  1545. #define CONFIG_APM_SET_S4 0x00000017
  1546. #define CONFIG_APM_SET_S5 0x00000018
  1547. #define NUM_APM_COMMANDS 0x00000019
  1548. /*XLATOFF*/
  1549. #define DEBUG_APM_NAMES \
  1550. char CMFAR *lpszAPMName[NUM_APM_COMMANDS] = \
  1551. { \
  1552. "QUERY_D1", \
  1553. "QUERY_D2", \
  1554. "QUERY_D3", \
  1555. "FAILED_D1", \
  1556. "FAILED_D2", \
  1557. "FAILED_D3", \
  1558. "SET_D0", \
  1559. "SET_D1", \
  1560. "SET_D2", \
  1561. "SET_D3", \
  1562. "RESUME_D0", \
  1563. "RESUME_D1", \
  1564. "RESUME_D2", \
  1565. "RESUME_D3", \
  1566. "QUERY_S1", \
  1567. "QUERY_S2", \
  1568. "QUERY_S3", \
  1569. "QUERY_S4", \
  1570. "QUERY_S5", \
  1571. "SET_S0", \
  1572. "SET_S1", \
  1573. "SET_S2", \
  1574. "SET_S3", \
  1575. "SET_S4", \
  1576. "SET_S5", \
  1577. };
  1578. /*XLATON*/
  1579. #define CONFIG_WAKEUP_ARM 0x00000000
  1580. #define CONFIG_WAKEUP_DISABLE 0x00000001
  1581. #define NUM_WAKEUP_COMMANDS 0x00000002
  1582. /*XLATOFF*/
  1583. #define DEBUG_WAKEUP_NAMES \
  1584. char CMFAR *lpszWakeupName[NUM_WAKEUP_COMMANDS] = \
  1585. { \
  1586. "ARM", \
  1587. "DISABLE", \
  1588. };
  1589. /*XLATON*/
  1590. /****************************************************************************
  1591. *
  1592. * ARBITRATOR FUNCTIONS
  1593. *
  1594. ****************************************************************************
  1595. *
  1596. * Each arbitrator has a handler field which is getting called every
  1597. * time Configuration Manager wants it to perform a function. The
  1598. * handler is called with:
  1599. *
  1600. * result=paArbitrator->Arbitrate( EventName,
  1601. * paArbitrator->DWordToBePassed,
  1602. * paArbitrator->dnItsDevNode,
  1603. * pnlhNodeListHeader);
  1604. *
  1605. * ENTRY: NodeListHeader contains a logical configuration for all
  1606. * devices the configuration manager would like to reconfigure.
  1607. * DWordToBePassed is the arbitrator reference data.
  1608. * ItsDevNode is the pointer to arbitrator's devnode.
  1609. * EventName is one of the following:
  1610. *
  1611. * -------------------------------------------------------------------------
  1612. *
  1613. * ARB_TEST_ALLOC - Test allocation of resource
  1614. *
  1615. * DESC: The arbitration routine will attempt to satisfy all
  1616. * allocation requests contained in the nodelist for its
  1617. * resource. See individual arbitrator for the algorithm
  1618. * employed. Generally, the arbitration consists
  1619. * of sorting the list according to most likely succesful
  1620. * allocation order, making a copy of the current allocation
  1621. * data strucuture(s), releasing all resource currently
  1622. * allocated to devnodes on the list from the copy data structure
  1623. * and then attempting to satisfy allocation requests
  1624. * by passing through the entire list, trying all possible
  1625. * combinations of allocations before failing. The arbitrator
  1626. * saves the resultant successful allocations, both in the node
  1627. * list per device and the copy of the allocation data structure.
  1628. * The configuration manager is expected to subsequently call
  1629. * either ARB_SET_ALLOC or ARB_RELEASE_ALLOC.
  1630. *
  1631. * EXIT: CR_SUCCESS if successful allocation
  1632. * CR_FAILURE if unsuccessful allocation
  1633. * CR_OUT_OF_MEMORY if not enough memory.
  1634. *
  1635. * CR_DEFAULT is CR_SUCCESS.
  1636. *
  1637. * -------------------------------------------------------------------------
  1638. *
  1639. * ARB_RETEST_ALLOC - Retest allocation of resource
  1640. *
  1641. * DESC: The arbitration routine will attempt to satisfy all
  1642. * allocation requests contained in the nodelist for its
  1643. * resource. It will take the result of a previous TEST_ALLOC
  1644. * and attempt to allocate that resource for each allcoation in
  1645. * the list. It will not sort the node list. It will make a copy
  1646. * of the current allocation data strucuture(s), release all
  1647. * resource currently allocated to devnodes on the list from
  1648. * the copy data structure and then attempt to satisfy the
  1649. * allocations from the previous TEST_ALLOC. The arbitrator
  1650. * saves the resultant copy of the allocation data structure.
  1651. * The configuration manager is expected to subsequently call
  1652. * either ARB_SET_ALLOC or ARB_RELEASE_ALLOC.
  1653. *
  1654. * EXIT: CR_SUCCESS if successful allocation
  1655. * CR_FAILURE if unsuccessful allocation
  1656. * CR_OUT_OF_MEMORY if not enough memory.
  1657. *
  1658. * CR_DEFAULT is CR_SUCCESS.
  1659. *
  1660. * -------------------------------------------------------------------------
  1661. *
  1662. * ARB_SET_ALLOC - Makes a test allocation the real allocation
  1663. *
  1664. * DESC: Makes the copy of the allocation data structure the
  1665. * current valid allocation.
  1666. *
  1667. * EXIT: CR_SUCCESS
  1668. *
  1669. * CR_DEFAULT is CR_SUCCESS.
  1670. *
  1671. * -------------------------------------------------------------------------
  1672. *
  1673. * ARB_RELEASE_ALLOC - Clean up after failed test allocation
  1674. *
  1675. * DESC: Free all allocation that were allocated by the previous
  1676. * ARB_TEST_ALLOC.
  1677. *
  1678. * EXIT: CR_SUCCESS
  1679. *
  1680. * CR_DEFAULT is CR_SUCCESS.
  1681. *
  1682. * -------------------------------------------------------------------------
  1683. *
  1684. * ARB_QUERY_FREE - Add all free resource logical configuration
  1685. *
  1686. * DESC: Return resource specific data on the free element. Note
  1687. * than the pnlhNodeListHeader is a cast of an arbitfree_s.
  1688. *
  1689. * EXIT: CR_SUCCESS if successful
  1690. * CR_FAILURE if the request makes no sense.
  1691. * CR_OUT_OF_MEMORY if not enough memory.
  1692. *
  1693. * -------------------------------------------------------------------------
  1694. *
  1695. * ARB_REMOVE - The devnode the arbitrator registered with is going away
  1696. *
  1697. * DESC: Arbitrator registered with a non-NULL devnode (thus is
  1698. * normally local), and the devnode is being removed. Arbitrator
  1699. * should do appropriate cleanup.
  1700. *
  1701. * EXIT: CR_SUCCESS
  1702. *
  1703. * CR_DEFAULT is CR_SUCCESS.
  1704. *
  1705. * -------------------------------------------------------------------------
  1706. *
  1707. * ARB_FORCE_ALLOC - Retest allocation of resource, always succeed
  1708. *
  1709. * DESC: The arbitration routine will satisfy all
  1710. * allocation requests contained in the nodelist for its
  1711. * resource. It will take the result of a previous TEST_ALLOC
  1712. * and allocate that resource for each allocation in
  1713. * the list. It will not sort the node list. It will make a copy
  1714. * of the current allocation data strucuture(s), release all
  1715. * resource currently allocated to devnodes on the list from
  1716. * the copy data structure and then satisfy the
  1717. * allocations from the previous TEST_ALLOC. The arbitrator
  1718. * saves the resultant copy of the allocation data structure.
  1719. * The configuration manager is expected to subsequently call
  1720. * either ARB_SET_ALLOC or ARB_RELEASE_ALLOC.
  1721. *
  1722. * EXIT: CR_SUCCESS if successful allocation
  1723. * CR_OUT_OF_MEMORY if not enough memory.
  1724. *
  1725. * CR_DEFAULT is CR_SUCCESS.
  1726. *
  1727. * -------------------------------------------------------------------------
  1728. *
  1729. * 4.0 OPK2 Messages
  1730. *
  1731. * -------------------------------------------------------------------------
  1732. *
  1733. * ARB_QUERY_ARBITRATE - Ask if arbitrator arbitrates this node
  1734. *
  1735. * DESC: Local partial arbitrator is passed a one devnode nodelist,
  1736. * and returns whether it arbitrates for that devnode.
  1737. *
  1738. * EXIT: CR_SUCCESS if arbitrator wants to arbitrate this node.
  1739. * CR_FAILURE if the arbitrator does not arbitrate this node.
  1740. *
  1741. * CR_DEFAULT is CR_SUCCESS.
  1742. *
  1743. * -------------------------------------------------------------------------
  1744. *
  1745. * ARB_ADD_RESERVE - Tell the arbitrator it should reserve this alloc
  1746. *
  1747. * DESC: In 4.0, arbitrators were learning reserve resources
  1748. * (resources that would be given only during a second pass)
  1749. * when called with ARB_RETEST/FORCE_ALLOC. However, we can
  1750. * ARB_RETEST_ALLOC during rebalance, so with 4.0 OPK2 we send a
  1751. * specific message telling the arbitrator that the resources
  1752. * in the test_alloc are for a FORCED or BOOT LOG_CONF and thus
  1753. * should be marked to be given only in a second pass during
  1754. * an ARB_TEST_ALLOC. This is for optimization only: to avoid
  1755. * rebalance.
  1756. *
  1757. * EXIT: CR_SUCCESS if the arbitrator understand this message and did
  1758. * something about it.
  1759. * CR_FAILURE if nothing was done.
  1760. *
  1761. * CR_DEFAULT is CR_FAILURE.
  1762. *
  1763. * -------------------------------------------------------------------------
  1764. *
  1765. * ARB_WRITE_RESERVE - Tell the arbitrator it should save the reserve
  1766. * list in the registry
  1767. *
  1768. * DESC: If an arbitrator returns CR_SUCCESS to ARB_SET_RESERVE, it
  1769. * will be called later on to save the reserve list.
  1770. *
  1771. * EXIT: CR_SUCCESS
  1772. *
  1773. * CR_DEFAULT is CR_SUCCESS.
  1774. *
  1775. * WARNING: For any non-defined service, the arbitrator should return
  1776. * CR_DEFAULT. This will be treated as the compatibility case in future
  1777. * version.
  1778. *
  1779. * -------------------------------------------------------------------------
  1780. *
  1781. * ARB_BEGIN_PNP_MODE - Tell the arbitrator that PNP mode is about to be
  1782. * started.
  1783. *
  1784. * DESC: If an arbitrator returns CR_SUCCESS, it understood the message and
  1785. * performed some action accordingly.
  1786. *
  1787. * EXIT: CR_SUCCESS if the arbitrator understand this message and did
  1788. * something about it.
  1789. * CR_FAILURE if nothing was done.
  1790. *
  1791. * WARNING: For any non-defined service, the arbitrator should return
  1792. * CR_DEFAULT. This will be treated as the compatibility case in future
  1793. * version.
  1794. *
  1795. ***************************************************************************/
  1796. #define ARB_TEST_ALLOC 0x00000000 // Check if can make alloc works.
  1797. #define ARB_RETEST_ALLOC 0x00000001 // Check if can take previous alloc.
  1798. #define ARB_SET_ALLOC 0x00000002 // Set the tested allocation.
  1799. #define ARB_RELEASE_ALLOC 0x00000003 // Release the tested allocation.
  1800. #define ARB_QUERY_FREE 0x00000004 // Return free resource.
  1801. #define ARB_REMOVE 0x00000005 // DevNode is gone.
  1802. #define ARB_FORCE_ALLOC 0x00000006 // Force previous TEST_ALLOC.
  1803. #define ARB_QUERY_ARBITRATE 0x00000007 // Check if wants to arbitrate.
  1804. #define ARB_ADD_RESERVE 0x00000008 // Mark alloc as reserved.
  1805. #define ARB_WRITE_RESERVE 0x00000009 // Save reserve in registry.
  1806. #define ARB_BEGIN_PNP_MODE 0x0000000A // Tell the arb the start of PNP mode.
  1807. #define ARB_APPLY_ALLOC 0x0000000B // Called after the stop of the rebalance.
  1808. #define NUM_ARB_COMMANDS 0x0000000C // Number of arb commands.
  1809. /*XLATOFF*/
  1810. #define DEBUG_ARB_NAMES \
  1811. char CMFAR *lpszArbFuncName[NUM_ARB_COMMANDS]= \
  1812. { \
  1813. "ARB_TEST_ALLOC",\
  1814. "ARB_RETEST_ALLOC",\
  1815. "ARB_SET_ALLOC",\
  1816. "ARB_RELEASE_ALLOC",\
  1817. "ARB_QUERY_FREE",\
  1818. "ARB_REMOVE",\
  1819. "ARB_FORCE_ALLOC",\
  1820. "ARB_QUERY_ARBITRATE",\
  1821. "ARB_ADD_RESERVE",\
  1822. "ARB_WRITE_RESERVE",\
  1823. "ARB_BEGIN_PNP_MODE",\
  1824. "ARB_APPLY_ALLOC",\
  1825. };
  1826. /*XLATON*/
  1827. /****************************************************************************
  1828. *
  1829. * DEVNODE STATUS
  1830. *
  1831. ****************************************************************************
  1832. *
  1833. * These are the bits in the devnode's status that someone can query
  1834. * with a CM_Get_DevNode_Status. The A/S column tells wheter the flag
  1835. * can be change asynchronously or not.
  1836. *
  1837. ***************************************************************************/
  1838. #define DN_ROOT_ENUMERATED 0x00000001 // S: Was enumerated by ROOT
  1839. #define DN_DRIVER_LOADED 0x00000002 // S: Has Register_Device_Driver
  1840. #define DN_ENUM_LOADED 0x00000004 // S: Has Register_Enumerator
  1841. #define DN_STARTED 0x00000008 // S: Is currently configured
  1842. #define DN_MANUAL 0x00000010 // S: Manually installed
  1843. #define DN_NEED_TO_ENUM 0x00000020 // A: May need reenumeration
  1844. #define DN_NOT_FIRST_TIME 0x00000040 // S: Has received a config start
  1845. #define DN_HARDWARE_ENUM 0x00000080 // S: Enum generates hardware ID
  1846. #define DN_LIAR 0x00000100 // S: Lied about can reconfig once
  1847. #define DN_HAS_MARK 0x00000200 // S: Not CM_Create_DevNode lately
  1848. #define DN_HAS_PROBLEM 0x00000400 // S: Need device installer
  1849. #define DN_FILTERED 0x00000800 // S: Is filtered
  1850. #define DN_MOVED 0x00001000 // S: Has been moved
  1851. #define DN_DISABLEABLE 0x00002000 // S: Can be rebalanced
  1852. #define DN_REMOVABLE 0x00004000 // S: Can be removed
  1853. #define DN_PRIVATE_PROBLEM 0x00008000 // S: Has a private problem
  1854. #define DN_MF_PARENT 0x00010000 // S: Multi function parent
  1855. #define DN_MF_CHILD 0x00020000 // S: Multi function child
  1856. #define DN_WILL_BE_REMOVED 0x00040000 // S: Devnode is being removed
  1857. //
  1858. // 4.0 OPK2 Flags
  1859. //
  1860. #define DN_NOT_FIRST_TIMEE 0x00080000 // S: Has received a config enumerate
  1861. #define DN_STOP_FREE_RES 0x00100000 // S: When child is stopped, free resources
  1862. #define DN_REBAL_CANDIDATE 0x00200000 // S: Don't skip during rebalance
  1863. #define DN_BAD_PARTIAL 0x00400000 // S: This devnode's log_confs do not have same resources
  1864. #define DN_NT_ENUMERATOR 0x00800000 // S: This devnode's is an NT enumerator
  1865. #define DN_NT_DRIVER 0x01000000 // S: This devnode's is an NT driver
  1866. //
  1867. // 4.1 Flags
  1868. //
  1869. #define DN_NEEDS_LOCKING 0x02000000 // S: Devnode need lock resume processing
  1870. #define DN_ARM_WAKEUP 0x04000000 // S: Devnode can be the wakeup device
  1871. #define DN_APM_ENUMERATOR 0x08000000 // S: APM aware enumerator
  1872. #define DN_APM_DRIVER 0x10000000 // S: APM aware driver
  1873. #define DN_SILENT_INSTALL 0x20000000 // S: Silent install
  1874. #define DN_NO_SHOW_IN_DM 0x40000000 // S: No show in device manager
  1875. #define DN_BOOT_LOG_PROB 0x80000000 // S: Had a problem during preassignment of boot log conf
  1876. #define DN_CHANGEABLE_FLAGS 0x79BB62E0
  1877. /*XLATOFF*/
  1878. #define NUM_DN_FLAG 0x00000020 // DEBUG: maximum flag (number)
  1879. #define DN_FLAG_LEN 0x00000002 // DEBUG: flag length
  1880. #define DEBUG_DN_FLAGS_NAMES \
  1881. char CMFAR lpszDNFlagsName[NUM_DN_FLAG][DN_FLAG_LEN]= \
  1882. { \
  1883. "rt", \
  1884. "dl", \
  1885. "el", \
  1886. "st", \
  1887. "mn", \
  1888. "ne", \
  1889. "fs", \
  1890. "hw", \
  1891. "lr", \
  1892. "mk", \
  1893. "pb", \
  1894. "ft", \
  1895. "mv", \
  1896. "db", \
  1897. "rb", \
  1898. "pp", \
  1899. "mp", \
  1900. "mc", \
  1901. "rm", \
  1902. "fe", \
  1903. "sf", \
  1904. "rc", \
  1905. "bp", \
  1906. "ze", \
  1907. "zd", \
  1908. "nl", \
  1909. "wk", \
  1910. "ae", \
  1911. "ad", \
  1912. "si", \
  1913. "ns", \
  1914. "bl", \
  1915. };
  1916. typedef ULONG VMMTIME;
  1917. typedef VMMTIME *PVMMTIME;
  1918. struct cmtime_s {
  1919. DWORD dwAPICount;
  1920. VMMTIME vtAPITime;
  1921. };
  1922. typedef struct cmtime_s CMTIME;
  1923. typedef CMTIME *PCMTIME;
  1924. struct cm_performance_info_s {
  1925. CMTIME ctBoot;
  1926. CMTIME ctAPI[NUM_CM_SERVICES];
  1927. CMTIME ctWalk;
  1928. CMTIME ctGarbageCollection;
  1929. CMTIME ctRing3;
  1930. CMTIME ctProcessTree;
  1931. CMTIME ctAssignResources;
  1932. CMTIME ctSort;
  1933. CMTIME ctAppyTime;
  1934. CMTIME ctSyncAppyTime;
  1935. CMTIME ctAsyncAppyTime;
  1936. CMTIME ctAsyncWorker;
  1937. CMTIME ctWaitForAppy;
  1938. CMTIME ctWaitForWorker;
  1939. CMTIME ctWaitForWorkers;
  1940. CMTIME ctReceiveMessage;
  1941. CMTIME ctRegistryOpen;
  1942. CMTIME ctRegistryCreate;
  1943. CMTIME ctRegistryClose;
  1944. CMTIME ctRegistryRead;
  1945. CMTIME ctRegistryWrite;
  1946. CMTIME ctRegistryEnumKey;
  1947. CMTIME ctRegistryEnumValue;
  1948. CMTIME ctRegistryFlush;
  1949. CMTIME ctRegistryDelete;
  1950. CMTIME ctRegistryOther;
  1951. CMTIME ctVxDLdr;
  1952. CMTIME ctNewDevNode;
  1953. CMTIME ctSendMessage;
  1954. CMTIME ctShell;
  1955. CMTIME ctHeap;
  1956. CMTIME ctAssertRange;
  1957. CMTIME ctASD;
  1958. CMTIME ctConfigMessage[NUM_CONFIG_COMMANDS];
  1959. CMTIME ctArbTime[ResType_Max+1][NUM_ARB_COMMANDS];
  1960. DWORD dwStackSize;
  1961. DWORD dwMaxProcessTreePasses;
  1962. DWORD dwStackAlloc;
  1963. };
  1964. typedef struct cm_performance_info_s CMPERFINFO;
  1965. typedef CMPERFINFO CMFAR *PCMPERFINFO;
  1966. /*XLATON*/
  1967. /****************************************************************************
  1968. *
  1969. * DLVXD FUNCTIONS
  1970. *
  1971. ****************************************************************************
  1972. *
  1973. * We load a Dynamically loaded VxD when there is a DEVLOADER=... line
  1974. * in the registry, or when someone calls CM_Load_Device. We then do
  1975. * a direct system control call (PNP_NEW_DEVNODE) to it, telling the
  1976. * DLVXD whether we loaded it to be an enumerator, a driver or a
  1977. * devloader (config manager does only deal with devloaders, but the
  1978. * default devloaders does CM_Load_Device with DLVXD_LOAD_ENUMERATOR
  1979. * and DLVXD_LOAD_DRIVER).
  1980. *
  1981. ***************************************************************************/
  1982. #define DLVXD_LOAD_ENUMERATOR 0x00000000 // We loaded DLVxD as an enumerator.
  1983. #define DLVXD_LOAD_DEVLOADER 0x00000001 // We loaded DLVxD as a devloader.
  1984. #define DLVXD_LOAD_DRIVER 0x00000002 // We loaded DLVxD as a device driver.
  1985. #define NUM_DLVXD_LOAD_TYPE 0x00000003 // Number of DLVxD load type.
  1986. /****************************************************************************
  1987. *
  1988. * GLOBALLY DEFINED FLAGS
  1989. *
  1990. ***************************************************************************/
  1991. #define BASIC_LOG_CONF 0x00000000 // Specifies the req list.
  1992. #define FILTERED_LOG_CONF 0x00000001 // Specifies the filtered req list.
  1993. #define ALLOC_LOG_CONF 0x00000002 // Specifies the Alloc Element.
  1994. #define BOOT_LOG_CONF 0x00000003 // Specifies the RM Alloc Element.
  1995. #define FORCED_LOG_CONF 0x00000004 // Specifies the Forced Log Conf
  1996. #define REALMODE_LOG_CONF 0x00000005 // Specifies the Realmode Log Conf.
  1997. #define NEW_ALLOC_LOG_CONF 0x00000006 // Specifies the Old Alloc Log Conf.
  1998. #define NUM_LOG_CONF 0x00000007 // Number of Log Conf type
  1999. #define LOG_CONF_BITS 0x00000007 // The bits of the log conf type.
  2000. #define DEBUG_LOG_CONF_NAMES \
  2001. char CMFAR *lpszLogConfName[NUM_LOG_CONF]= \
  2002. { \
  2003. "BASIC_LOG_CONF",\
  2004. "FILTERED_LOG_CONF",\
  2005. "ALLOC_LOG_CONF",\
  2006. "BOOT_LOG_CONF",\
  2007. "FORCED_LOG_CONF",\
  2008. "REALMODE_LOG_CONF",\
  2009. "NEW_ALLOC_LOG_CONF",\
  2010. };
  2011. #define PRIORITY_EQUAL_FIRST 0x00000008 // Same priority, new one is first.
  2012. #define PRIORITY_EQUAL_LAST 0x00000000 // Same priority, new one is last.
  2013. #define PRIORITY_BIT 0x00000008 // The bit of priority.
  2014. /****************************************************************************
  2015. * ARB_QUERY_FREE arbitrator function for memory returns a Range List (see
  2016. * configuration manager for APIs to use with Range Lists). The values
  2017. * in the Range List are ranges of taken memory address space.
  2018. */
  2019. struct MEM_Arb_s {
  2020. RANGE_LIST MEMA_Alloc;
  2021. };
  2022. typedef struct MEM_Arb_s MEMA_ARB;
  2023. /****************************************************************************
  2024. * ARB_QUERY_FREE arbitrator function for IO returns a Range List (see
  2025. * configuration manager for APIs to use with Range Lists). The values
  2026. * in the Range List are ranges of taken IO address space.
  2027. */
  2028. struct IO_Arb_s {
  2029. RANGE_LIST IOA_Alloc;
  2030. };
  2031. typedef struct IO_Arb_s IOA_ARB;
  2032. /****************************************************************************
  2033. * ARB_QUERY_FREE arbitrator function for DMA returns the DMA_Arb_s,
  2034. * 16 bits of allocation bit mask, where DMAA_Alloc is inverted
  2035. * (set bit indicates free port).
  2036. */
  2037. struct DMA_Arb_s {
  2038. WORD DMAA_Alloc;
  2039. };
  2040. typedef struct DMA_Arb_s DMA_ARB;
  2041. /***************************************************************************
  2042. * ARB_QUERY_FREE arbitrator function for IRQ returns the IRQ_Arb_s,
  2043. * 16 bits of allocation bit mask, 16 bits of share bit mask and 16
  2044. * BYTES of share count. IRQA_Alloc is inverted (bit set indicates free
  2045. * port). If port is not free, IRQA_Share bit set indicates port
  2046. * that is shareable. For shareable IRQs, IRQA_Share_Count indicates
  2047. * number of devices that are sharing an IRQ.
  2048. */
  2049. struct IRQ_Arb_s {
  2050. WORD IRQA_Alloc;
  2051. WORD IRQA_Share;
  2052. BYTE IRQA_Share_Count[16];
  2053. WORD IRQA_Level;
  2054. WORD IRQA_Unused;
  2055. };
  2056. typedef struct IRQ_Arb_s IRQ_ARB;
  2057. /* ASM
  2058. DebugCommand Macro FuncName
  2059. local DC_01
  2060. ifndef CM_GOLDEN_RETAIL
  2061. ifndef debug
  2062. IsDebugOnlyLoaded DC_01
  2063. endif
  2064. Control_Dispatch DEBUG_QUERY, FuncName, sCall
  2065. endif
  2066. DC_01:
  2067. endm
  2068. IFDEF CM_PERFORMANCE_INFO
  2069. CM_PAGEABLE_CODE_SEG TEXTEQU <VxD_LOCKED_CODE_SEG>
  2070. CM_PAGEABLE_CODE_ENDS TEXTEQU <VxD_LOCKED_CODE_ENDS>
  2071. CM_PAGEABLE_DATA_SEG TEXTEQU <VxD_LOCKED_DATA_SEG>
  2072. CM_PAGEABLE_DATA_ENDS TEXTEQU <VxD_LOCKED_DATA_ENDS>
  2073. CM_LOCKABLE_CODE_SEG TEXTEQU <VxD_LOCKED_CODE_SEG>
  2074. CM_LOCKABLE_CODE_ENDS TEXTEQU <VxD_LOCKED_CODE_ENDS>
  2075. CM_LOCKABLE_DATA_SEG TEXTEQU <VxD_LOCKED_CODE_SEG>
  2076. CM_LOCKABLE_DATA_ENDS TEXTEQU <VxD_LOCKED_CODE_ENDS>
  2077. ELSE
  2078. CM_PAGEABLE_CODE_SEG TEXTEQU <VxD_PNP_CODE_SEG>
  2079. CM_PAGEABLE_CODE_ENDS TEXTEQU <VxD_PNP_CODE_ENDS>
  2080. CM_PAGEABLE_DATA_SEG TEXTEQU <VxD_PAGEABLE_DATA_SEG>
  2081. CM_PAGEABLE_DATA_ENDS TEXTEQU <VxD_PAGEABLE_DATA_ENDS>
  2082. CM_LOCKABLE_CODE_SEG TEXTEQU <VxD_LOCKABLE_CODE_SEG>
  2083. CM_LOCKABLE_CODE_ENDS TEXTEQU <VxD_LOCKABLE_CODE_ENDS>
  2084. CM_LOCKABLE_DATA_SEG TEXTEQU <VxD_LOCKABLE_CODE_SEG>
  2085. CM_LOCKABLE_DATA_ENDS TEXTEQU <VxD_LOCKABLE_CODE_ENDS>
  2086. ENDIF
  2087. IFDEF CM_GOLDEN_RETAIL
  2088. CM_DEBUG_CODE_SEG TEXTEQU <.err>
  2089. CM_DEBUG_CODE_ENDS TEXTEQU <.err>
  2090. ELSE
  2091. IFDEF DEBUG
  2092. CM_DEBUG_CODE_SEG TEXTEQU <VxD_LOCKED_CODE_SEG>
  2093. CM_DEBUG_CODE_ENDS TEXTEQU <VxD_LOCKED_CODE_ENDS>
  2094. ELSE
  2095. CM_DEBUG_CODE_SEG TEXTEQU <VxD_DEBUG_ONLY_CODE_SEG>
  2096. CM_DEBUG_CODE_ENDS TEXTEQU <VxD_DEBUG_ONLY_CODE_ENDS>
  2097. ENDIF
  2098. ENDIF
  2099. */
  2100. struct CM_API_s {
  2101. DWORD pCMAPIStack;
  2102. DWORD dwCMAPIService;
  2103. DWORD dwCMAPIRet;
  2104. };
  2105. typedef struct CM_API_s CMAPI;
  2106. #ifndef MAX_PROFILE_LEN
  2107. #define MAX_PROFILE_LEN 80
  2108. #endif
  2109. struct HWProfileInfo_s {
  2110. ULONG HWPI_ulHWProfile; // the profile handle
  2111. char HWPI_szFriendlyName[MAX_PROFILE_LEN]; // the friendly name (OEM format)
  2112. DWORD HWPI_dwFlags; // CM_HWPI_* flags
  2113. };
  2114. typedef struct HWProfileInfo_s HWPROFILEINFO;
  2115. typedef struct HWProfileInfo_s *PHWPROFILEINFO;
  2116. typedef struct HWProfileInfo_s CMFAR *PFARHWPROFILEINFO;
  2117. #define CM_HWPI_NOT_DOCKABLE 0x00000000
  2118. #define CM_HWPI_UNDOCKED 0x00000001
  2119. #define CM_HWPI_DOCKED 0x00000002
  2120. /*XLATOFF*/
  2121. #define CM_VXD_RESULT int
  2122. #define CM_EXTERNAL _cdecl
  2123. #define CM_HANDLER _cdecl
  2124. #define CM_SYSCTRL _stdcall
  2125. #define CM_GLOBAL_DATA
  2126. #define CM_LOCAL_DATA static
  2127. #define CM_OFFSET_OF(type, id) ((DWORD)(&(((type)0)->id)))
  2128. #define CM_BUGBUG(d, id, msg) message("BUGBUG: "##d##", "##id##": "##msg)
  2129. #define CM_DEREF(var) {var=var;}
  2130. #ifndef DEBUG
  2131. #define CM_WARN1(strings)
  2132. #define CM_WARN2(strings)
  2133. #define CM_ERROR(strings)
  2134. #else
  2135. #ifndef MAXDEBUG
  2136. #define CM_WARN1(strings) {\
  2137. LCODE__Debug_Printf_Service(WARNNAME " WARNS: "); \
  2138. LCODE__Debug_Printf_Service##strings; \
  2139. LCODE__Debug_Printf_Service("\n");}
  2140. #define CM_WARN2(strings)
  2141. #define CM_ERROR(strings) {\
  2142. LCODE__Debug_Printf_Service(WARNNAME " ERROR: "); \
  2143. LCODE__Debug_Printf_Service##strings; \
  2144. LCODE__Debug_Printf_Service("\n");}
  2145. #else
  2146. #define CM_WARN1(strings) {\
  2147. LCODE__Debug_Printf_Service(WARNNAME " WARNS: "); \
  2148. LCODE__Debug_Printf_Service##strings; \
  2149. LCODE__Debug_Printf_Service("\n");}
  2150. #define CM_WARN2(strings) {\
  2151. LCODE__Debug_Printf_Service(WARNNAME " WARNS: "); \
  2152. LCODE__Debug_Printf_Service##strings; \
  2153. LCODE__Debug_Printf_Service("\n");}
  2154. #define CM_ERROR(strings) {\
  2155. LCODE__Debug_Printf_Service(WARNNAME " ERROR: "); \
  2156. LCODE__Debug_Printf_Service##strings; \
  2157. LCODE__Debug_Printf_Service("\n"); \
  2158. {_asm int 3}}
  2159. #endif
  2160. #endif
  2161. #ifdef DEBUG
  2162. #define CM_DEBUG_CODE VxD_LOCKED_CODE_SEG
  2163. #define CM_DEBUG_DATA VxD_LOCKED_DATA_SEG
  2164. #else
  2165. #define CM_DEBUG_CODE VxD_DEBUG_ONLY_CODE_SEG
  2166. #define CM_DEBUG_DATA VxD_DEBUG_ONLY_DATA_SEG
  2167. #endif
  2168. #ifdef CM_PERFORMANCE_INFO
  2169. #define CM_LOCKABLE_CODE VxD_LOCKED_CODE_SEG
  2170. #define CM_LOCKABLE_DATA VxD_LOCKED_DATA_SEG
  2171. #define CM_PAGEABLE_CODE VxD_LOCKED_CODE_SEG
  2172. #define CM_PAGEABLE_DATA VxD_LOCKED_DATA_SEG
  2173. #define CM_INIT_CODE VxD_INIT_CODE_SEG
  2174. #define CM_INIT_DATA VxD_INIT_DATA_SEG
  2175. #undef CURSEG
  2176. #define CURSEG() LCODE
  2177. #define CM_HEAPFLAGS (HEAPZEROINIT)
  2178. #else
  2179. #define CM_LOCKABLE_CODE VxD_LOCKABLE_CODE_SEG
  2180. #define CM_LOCKABLE_DATA VxD_LOCKABLE_DATA_SEG
  2181. #define CM_PAGEABLE_CODE VxD_PNP_CODE_SEG
  2182. #define CM_PAGEABLE_DATA VxD_PAGEABLE_DATA_SEG
  2183. #define CM_INIT_CODE VxD_INIT_CODE_SEG
  2184. #define CM_INIT_DATA VxD_INIT_DATA_SEG
  2185. #undef CURSEG
  2186. #define CURSEG() CCODE
  2187. #define CM_HEAPFLAGS (HEAPSWAP|HEAPZEROINIT)
  2188. #endif
  2189. #ifndef CM_GOLDEN_RETAIL
  2190. #define CM_DEBUGGER_USE_CODE VxD_LOCKED_CODE_SEG
  2191. #define CM_DEBUGGER_USE_DATA VxD_LOCKED_DATA_SEG
  2192. #else
  2193. #define CM_DEBUGGER_USE_CODE CM_LOCKABLE_CODE
  2194. #define CM_DEBUGGER_USE_DATA CM_LOCKABLE_DATA
  2195. #endif
  2196. #ifdef DEBUG
  2197. #define CM_INTERNAL _cdecl
  2198. #else
  2199. #define CM_INTERNAL _fastcall
  2200. #endif
  2201. #define CM_NAKED __declspec ( naked )
  2202. #define CM_LOCAL CM_INTERNAL
  2203. #define CM_UNIQUE static CM_INTERNAL
  2204. #define CM_INLINE _inline
  2205. #define CM_BEGIN_CRITICAL {\
  2206. _asm pushfd \
  2207. _asm cli \
  2208. }
  2209. #define CM_END_CRITICAL {\
  2210. _asm popfd \
  2211. }
  2212. #ifndef NEC_98
  2213. #define CM_PIC_MASTER 0x21
  2214. #define CM_PIC_SLAVE 0xA1
  2215. #else
  2216. #define CM_PIC_MASTER 0x02
  2217. #define CM_PIC_SLAVE 0x0A
  2218. #endif
  2219. #define CM_MASK_PIC(wPICMask) { \
  2220. _asm in al, CM_PIC_SLAVE \
  2221. _asm mov ah, al \
  2222. _asm in al, CM_PIC_MASTER \
  2223. _asm mov word ptr [wPICMask], ax \
  2224. _asm or al, 0xff \
  2225. _asm out CM_PIC_SLAVE, al \
  2226. _asm out CM_PIC_MASTER, al \
  2227. }
  2228. #define CM_LOCK_PIC(dwEFlags, wPICMask) { \
  2229. {_asm pushfd \
  2230. _asm pop [dwEFlags] \
  2231. _asm cli \
  2232. }; CM_MASK_PIC(wPICMask); \
  2233. }
  2234. #define CM_UNMASK_PIC(wPICMask) { \
  2235. _asm mov ax, word ptr [wPICMask] \
  2236. _asm out CM_PIC_MASTER, al \
  2237. _asm mov al, ah \
  2238. _asm out CM_PIC_SLAVE, al \
  2239. }
  2240. #define CM_UNLOCK_PIC(dwEFlags, wPICMask) { \
  2241. CM_UNMASK_PIC(wPICMask); \
  2242. { _asm push [dwEFlags] \
  2243. _asm popfd }\
  2244. }
  2245. #define CM_FOREVER for (;;)
  2246. #ifndef No_CM_Calls
  2247. #ifdef Not_VxD
  2248. #ifdef IS_32
  2249. #include <vwin32.h>
  2250. struct _WIN32CMIOCTLPACKET {
  2251. DWORD dwStack;
  2252. DWORD dwServiceNumber;
  2253. };
  2254. typedef struct _WIN32CMIOCTLPACKET WIN32CMIOCTLPACKET;
  2255. typedef WIN32CMIOCTLPACKET *PWIN32CMIOCTLPACKET;
  2256. #ifdef CM_USE_OPEN_SERVICE
  2257. CONFIGRET WINAPI
  2258. WIN32CMIOCTLHandler(PWIN32CMIOCTLPACKET pPacket);
  2259. CONFIGRET WINAPI
  2260. CMWorker(DWORD dwStack, DWORD dwServiceNumber);
  2261. BOOL WINAPI
  2262. CM_Open(VOID);
  2263. VOID WINAPI
  2264. CM_Close(VOID);
  2265. #define MAKE_CM_HEADER(Function, Parameters) \
  2266. CONFIGRET static _cdecl \
  2267. CM_##Function##Parameters \
  2268. { \
  2269. DWORD dwStack; \
  2270. _asm {mov dwStack, ebp}; \
  2271. dwStack+=8; \
  2272. return(CMWorker(dwStack, CONFIGMG_W32IOCTL_RANGE+(GetVxDServiceOrdinal(_CONFIGMG_##Function) & 0xFFFF))); \
  2273. }
  2274. #define CM_IS_FILE_PROVIDING_SERVICES \
  2275. HANDLE hCONFIGMG=INVALID_HANDLE_VALUE; \
  2276. BOOL WINAPI \
  2277. CM_Open(VOID) \
  2278. { \
  2279. hCONFIGMG=CreateFile( "\\\\.\\CONFIGMG", \
  2280. GENERIC_READ|GENERIC_WRITE, \
  2281. FILE_SHARE_READ|FILE_SHARE_WRITE, \
  2282. NULL, OPEN_EXISTING, 0, NULL); \
  2283. if (hCONFIGMG==INVALID_HANDLE_VALUE) \
  2284. return(FALSE); \
  2285. return(CM_Get_Version()>=0x400); \
  2286. } \
  2287. VOID WINAPI \
  2288. CM_Close(VOID) \
  2289. { \
  2290. CloseHandle(hCONFIGMG); \
  2291. \
  2292. hCONFIGMG==INVALID_HANDLE_VALUE; \
  2293. } \
  2294. CONFIGRET WINAPI \
  2295. WIN32CMIOCTLHandler(PWIN32CMIOCTLPACKET pPacket) \
  2296. { \
  2297. CONFIGRET crReturnValue=CR_FAILURE; \
  2298. DWORD dwReturnSize=0; \
  2299. if (!DeviceIoControl( hCONFIGMG, \
  2300. pPacket->dwServiceNumber, \
  2301. &(pPacket->dwStack), \
  2302. sizeof(pPacket->dwStack), \
  2303. &crReturnValue, \
  2304. sizeof(crReturnValue), \
  2305. &dwReturnSize, \
  2306. NULL)) \
  2307. return(CR_FAILURE); \
  2308. if (dwReturnSize!=sizeof(crReturnValue)) \
  2309. return(CR_FAILURE); \
  2310. return(crReturnValue); \
  2311. } \
  2312. CONFIGRET WINAPI \
  2313. CMWorker(DWORD dwStack, DWORD dwServiceNumber) \
  2314. { \
  2315. WIN32CMIOCTLPACKET Packet; \
  2316. Packet.dwStack=dwStack; \
  2317. Packet.dwServiceNumber=dwServiceNumber; \
  2318. return(WIN32CMIoctlHandler(&Packet)); \
  2319. }
  2320. #else // ifdef CM_USE_OPEN_SERVICE
  2321. CONFIGRET static WINAPI
  2322. WIN32CMIOCTLHandler(PWIN32CMIOCTLPACKET pPacket)
  2323. {
  2324. HANDLE hCONFIGMG;
  2325. CONFIGRET crReturnValue=CR_FAILURE;
  2326. DWORD dwReturnSize=0;
  2327. hCONFIGMG=CreateFile( "\\\\.\\CONFIGMG",
  2328. GENERIC_READ|GENERIC_WRITE,
  2329. FILE_SHARE_READ|FILE_SHARE_WRITE,
  2330. NULL, OPEN_EXISTING, 0, NULL);
  2331. if (hCONFIGMG==INVALID_HANDLE_VALUE)
  2332. return(CR_FAILURE);
  2333. if (!DeviceIoControl( hCONFIGMG,
  2334. pPacket->dwServiceNumber,
  2335. &(pPacket->dwStack),
  2336. sizeof(pPacket->dwStack),
  2337. &crReturnValue,
  2338. sizeof(crReturnValue),
  2339. &dwReturnSize,
  2340. NULL))
  2341. crReturnValue=CR_FAILURE;
  2342. CloseHandle(hCONFIGMG);
  2343. if (dwReturnSize!=sizeof(crReturnValue))
  2344. crReturnValue=CR_FAILURE;
  2345. return(crReturnValue);
  2346. }
  2347. #define MAKE_CM_HEADER(Function, Parameters) \
  2348. CONFIGRET static _cdecl \
  2349. CM_##Function##Parameters \
  2350. { \
  2351. WIN32CMIOCTLPACKET Packet; \
  2352. DWORD dwStack; \
  2353. _asm {mov dwStack, ebp}; \
  2354. dwStack+=8; \
  2355. Packet.dwStack=dwStack; \
  2356. Packet.dwServiceNumber=CONFIGMG_W32IOCTL_RANGE+(GetVxDServiceOrdinal(_CONFIGMG_##Function) & 0xFFFF); \
  2357. return(WIN32CMIOCTLHandler(&Packet)); \
  2358. }
  2359. #endif // ifdef CM_USE_OPEN_SERVICE
  2360. #else // IS_32
  2361. #ifdef CM_USE_OPEN_SERVICE
  2362. extern DWORD CMEntryPoint;
  2363. BOOL
  2364. CM_Open(void);
  2365. #define MAKE_CM_HEADER(Function, Parameters) \
  2366. CONFIGRET static _near _cdecl \
  2367. CM_##Function##Parameters \
  2368. { \
  2369. CONFIGRET CMRetValue=0; \
  2370. WORD wCMAPIService=GetVxDServiceOrdinal(_CONFIGMG_##Function); \
  2371. if (CMEntryPoint==0) \
  2372. return(0); \
  2373. _asm {mov ax, wCMAPIService};\
  2374. _asm {call CMEntryPoint}; \
  2375. _asm {mov CMRetValue, ax};\
  2376. return(CMRetValue); \
  2377. }
  2378. #define CM_IS_FILE_PROVIDING_SERVICES \
  2379. DWORD CMEntryPoint=0; \
  2380. BOOL \
  2381. CM_Open(void) \
  2382. { \
  2383. _asm {push bx}; \
  2384. _asm {push es}; \
  2385. _asm {push di}; \
  2386. _asm {xor di, di}; \
  2387. _asm {mov ax, 0x1684}; \
  2388. _asm {mov bx, 0x33}; \
  2389. _asm {mov es, di}; \
  2390. _asm {int 0x2f}; \
  2391. _asm {mov word ptr [CMEntryPoint+2], es}; \
  2392. _asm {mov word ptr [CMEntryPoint], di}; \
  2393. _asm {pop di}; \
  2394. _asm {pop es}; \
  2395. _asm {pop bx}; \
  2396. if (!CMEntryPoint) \
  2397. return(FALSE); \
  2398. return(CM_Get_Version()>=0x400); \
  2399. }
  2400. #else // ifdef CM_USE_OPEN_SERVICE
  2401. DWORD static
  2402. CM_Get_Entry_Point(void)
  2403. {
  2404. static DWORD CMEntryPoint=NULL;
  2405. if (CMEntryPoint)
  2406. return(CMEntryPoint);
  2407. _asm push bx
  2408. _asm push es
  2409. _asm push di
  2410. _asm xor di, di
  2411. _asm mov ax, 0x1684
  2412. _asm mov bx, 0x33
  2413. _asm mov es, di
  2414. _asm int 0x2f
  2415. _asm mov word ptr [CMEntryPoint+2], es
  2416. _asm mov word ptr [CMEntryPoint], di
  2417. _asm pop di
  2418. _asm pop es
  2419. _asm pop bx
  2420. return(CMEntryPoint);
  2421. }
  2422. #define MAKE_CM_HEADER(Function, Parameters) \
  2423. CONFIGRET static _near _cdecl \
  2424. CM_##Function##Parameters \
  2425. { \
  2426. CONFIGRET CMRetValue=0; \
  2427. DWORD CMEntryPoint; \
  2428. WORD wCMAPIService=GetVxDServiceOrdinal(_CONFIGMG_##Function); \
  2429. if ((CMEntryPoint=CM_Get_Entry_Point())==0) \
  2430. return(0); \
  2431. _asm {mov ax, wCMAPIService};\
  2432. _asm {call CMEntryPoint}; \
  2433. _asm {mov CMRetValue, ax};\
  2434. return(CMRetValue); \
  2435. }
  2436. #endif // ifdef CM_USE_OPEN_SERVICE
  2437. #endif // IS_32
  2438. #else // Not_VxD
  2439. #define MAKE_CM_HEADER(Function, Parameters) \
  2440. MAKE_HEADER(CONFIGRET, _cdecl, CAT(_CONFIGMG_, Function), Parameters)
  2441. #endif // Not_VxD
  2442. /****************************************************************************
  2443. *
  2444. * WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING!
  2445. *
  2446. * Each of the following functions must match their equivalent service
  2447. * and the parameter table in dos386\vmm\configmg\services.*.
  2448. *
  2449. * Except for the Get_Version, each function return a CR_* result in EAX
  2450. * (AX for non IS_32 app) and can trash ECX and/or EDX as they are 'C'
  2451. * callable.
  2452. *
  2453. * WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING!
  2454. *
  2455. ***************************************************************************/
  2456. #pragma warning (disable:4100) // Param not used
  2457. #ifdef Not_VxD
  2458. MAKE_CM_HEADER(Get_Version, (VOID))
  2459. #else
  2460. WORD VXDINLINE
  2461. CONFIGMG_Get_Version(VOID)
  2462. {
  2463. WORD w;
  2464. VxDCall(_CONFIGMG_Get_Version);
  2465. _asm mov [w], ax
  2466. return(w);
  2467. }
  2468. #define CM_Get_Version CONFIGMG_Get_Version
  2469. #endif
  2470. MAKE_CM_HEADER(Initialize, (ULONG ulFlags))
  2471. MAKE_CM_HEADER(Locate_DevNode, (PDEVNODE pdnDevNode, DEVNODEID pDeviceID, ULONG ulFlags))
  2472. MAKE_CM_HEADER(Get_Parent, (PDEVNODE pdnDevNode, DEVNODE dnDevNode, ULONG ulFlags))
  2473. MAKE_CM_HEADER(Get_Child, (PDEVNODE pdnDevNode, DEVNODE dnDevNode, ULONG ulFlags))
  2474. MAKE_CM_HEADER(Get_Sibling, (PDEVNODE pdnDevNode, DEVNODE dnDevNode, ULONG ulFlags))
  2475. MAKE_CM_HEADER(Get_Device_ID_Size, (PFARULONG pulLen, DEVNODE dnDevNode, ULONG ulFlags))
  2476. MAKE_CM_HEADER(Get_Device_ID, (DEVNODE dnDevNode, PFARVOID Buffer, ULONG BufferLen, ULONG ulFlags))
  2477. MAKE_CM_HEADER(Get_Depth, (PFARULONG pulDepth, DEVNODE dnDevNode, ULONG ulFlags))
  2478. MAKE_CM_HEADER(Get_Private_DWord, (PFARULONG pulPrivate, DEVNODE dnInDevNode, DEVNODE dnForDevNode, ULONG ulFlags))
  2479. MAKE_CM_HEADER(Set_Private_DWord, (DEVNODE dnInDevNode, DEVNODE dnForDevNode, ULONG ulValue, ULONG ulFlags))
  2480. MAKE_CM_HEADER(Create_DevNode, (PDEVNODE pdnDevNode, DEVNODEID pDeviceID, DEVNODE dnParent, ULONG ulFlags))
  2481. MAKE_CM_HEADER(Query_Remove_SubTree, (DEVNODE dnAncestor, ULONG ulFlags))
  2482. MAKE_CM_HEADER(Remove_SubTree, (DEVNODE dnAncestor, ULONG ulFlags))
  2483. MAKE_CM_HEADER(Register_Device_Driver, (DEVNODE dnDevNode, CMCONFIGHANDLER Handler, ULONG ulRefData, ULONG ulFlags))
  2484. MAKE_CM_HEADER(Register_Enumerator, (DEVNODE dnDevNode, CMENUMHANDLER Handler, ULONG ulFlags))
  2485. MAKE_CM_HEADER(Register_Arbitrator, (PREGISTERID pRid, RESOURCEID id, CMARBHANDLER Handler, ULONG ulDWordToBePassed, DEVNODE dnArbitratorNode, ULONG ulFlags))
  2486. MAKE_CM_HEADER(Deregister_Arbitrator, (REGISTERID id, ULONG ulFlags))
  2487. MAKE_CM_HEADER(Query_Arbitrator_Free_Size, (PFARULONG pulSize, DEVNODE dnDevNode, RESOURCEID ResourceID, ULONG ulFlags))
  2488. MAKE_CM_HEADER(Query_Arbitrator_Free_Data, (PFARVOID pData, ULONG DataLen, DEVNODE dnDevNode, RESOURCEID ResourceID, ULONG ulFlags))
  2489. MAKE_CM_HEADER(Sort_NodeList, (PNODELISTHEADER nlhNodeListHeader, ULONG ulFlags))
  2490. MAKE_CM_HEADER(Yield, (ULONG ulMicroseconds, ULONG ulFlags))
  2491. MAKE_CM_HEADER(Lock, (ULONG ulFlags))
  2492. MAKE_CM_HEADER(Unlock, (ULONG ulFlags))
  2493. MAKE_CM_HEADER(Add_Empty_Log_Conf, (PLOG_CONF plcLogConf, DEVNODE dnDevNode, PRIORITY Priority, ULONG ulFlags))
  2494. MAKE_CM_HEADER(Free_Log_Conf, (LOG_CONF lcLogConfToBeFreed, ULONG ulFlags))
  2495. MAKE_CM_HEADER(Get_First_Log_Conf, (PLOG_CONF plcLogConf, DEVNODE dnDevNode, ULONG ulFlags))
  2496. MAKE_CM_HEADER(Get_Next_Log_Conf, (PLOG_CONF plcLogConf, LOG_CONF lcLogConf, ULONG ulFlags))
  2497. MAKE_CM_HEADER(Add_Res_Des, (PRES_DES prdResDes, LOG_CONF lcLogConf, RESOURCEID ResourceID, PFARVOID ResourceData, ULONG ResourceLen, ULONG ulFlags))
  2498. MAKE_CM_HEADER(Modify_Res_Des, (PRES_DES prdResDes, RES_DES rdResDes, RESOURCEID ResourceID, PFARVOID ResourceData, ULONG ResourceLen, ULONG ulFlags))
  2499. MAKE_CM_HEADER(Free_Res_Des, (PRES_DES prdResDes, RES_DES rdResDes, ULONG ulFlags))
  2500. MAKE_CM_HEADER(Get_Next_Res_Des, (PRES_DES prdResDes, RES_DES CurrentResDesOrLogConf, RESOURCEID ForResource, PRESOURCEID pResourceID, ULONG ulFlags))
  2501. MAKE_CM_HEADER(Get_Performance_Info, (PCMPERFINFO pPerfInfo, ULONG ulFlags))
  2502. MAKE_CM_HEADER(Get_Res_Des_Data_Size, (PFARULONG pulSize, RES_DES rdResDes, ULONG ulFlags))
  2503. MAKE_CM_HEADER(Get_Res_Des_Data, (RES_DES rdResDes, PFARVOID Buffer, ULONG BufferLen, ULONG ulFlags))
  2504. MAKE_CM_HEADER(Process_Events_Now, (ULONG ulFlags))
  2505. MAKE_CM_HEADER(Create_Range_List, (PRANGE_LIST prlh, ULONG ulFlags))
  2506. MAKE_CM_HEADER(Add_Range, (ULONG ulStartValue, ULONG ulEndValue, RANGE_LIST rlh, ULONG ulFlags))
  2507. MAKE_CM_HEADER(Delete_Range, (ULONG ulStartValue, ULONG ulEndValue, RANGE_LIST rlh, ULONG ulFlags))
  2508. MAKE_CM_HEADER(Test_Range_Available, (ULONG ulStartValue, ULONG ulEndValue, RANGE_LIST rlh, ULONG ulFlags))
  2509. MAKE_CM_HEADER(Dup_Range_List, (RANGE_LIST rlhOld, RANGE_LIST rlhNew, ULONG ulFlags))
  2510. MAKE_CM_HEADER(Free_Range_List, (RANGE_LIST rlh, ULONG ulFlags))
  2511. MAKE_CM_HEADER(Invert_Range_List, (RANGE_LIST rlhOld, RANGE_LIST rlhNew, ULONG ulMaxVal, ULONG ulFlags))
  2512. MAKE_CM_HEADER(Intersect_Range_List, (RANGE_LIST rlhOld1, RANGE_LIST rlhOld2, RANGE_LIST rlhNew, ULONG ulFlags))
  2513. MAKE_CM_HEADER(First_Range, (RANGE_LIST rlh, PFARULONG pulStart, PFARULONG pulEnd, PRANGE_ELEMENT preElement, ULONG ulFlags))
  2514. MAKE_CM_HEADER(Next_Range, (PRANGE_ELEMENT preElement, PFARULONG pulStart, PFARULONG pulEnd, ULONG ulFlags))
  2515. MAKE_CM_HEADER(Dump_Range_List, (RANGE_LIST rlh, ULONG ulFlags))
  2516. MAKE_CM_HEADER(Load_DLVxDs, (DEVNODE dnDevNode, PFARCHAR FileNames, LOAD_TYPE LoadType, ULONG ulFlags))
  2517. MAKE_CM_HEADER(Get_DDBs, (PPPVMMDDB ppDDB, PFARULONG pulCount, LOAD_TYPE LoadType, DEVNODE dnDevNode, ULONG ulFlags))
  2518. MAKE_CM_HEADER(Get_CRC_CheckSum, (PFARVOID pBuffer, ULONG ulSize, PFARULONG pulSeed, ULONG ulFlags))
  2519. MAKE_CM_HEADER(Register_DevLoader, (PVMMDDB pDDB, ULONG ulFlags))
  2520. MAKE_CM_HEADER(Reenumerate_DevNode, (DEVNODE dnDevNode, ULONG ulFlags))
  2521. MAKE_CM_HEADER(Setup_DevNode, (DEVNODE dnDevNode, ULONG ulFlags))
  2522. MAKE_CM_HEADER(Reset_Children_Marks, (DEVNODE dnDevNode, ULONG ulFlags))
  2523. MAKE_CM_HEADER(Get_DevNode_Status, (PFARULONG pulStatus, PFARULONG pulProblemNumber, DEVNODE dnDevNode, ULONG ulFlags))
  2524. MAKE_CM_HEADER(Remove_Unmarked_Children, (DEVNODE dnDevNode, ULONG ulFlags))
  2525. MAKE_CM_HEADER(ISAPNP_To_CM, (PFARVOID pBuffer, DEVNODE dnDevNode, ULONG ulLogDev, ULONG ulFlags))
  2526. MAKE_CM_HEADER(CallBack_Device_Driver, (CMCONFIGHANDLER Handler, ULONG ulFlags))
  2527. MAKE_CM_HEADER(CallBack_Enumerator, (CMENUMHANDLER Handler, ULONG ulFlags))
  2528. MAKE_CM_HEADER(Get_Alloc_Log_Conf, (PCMCONFIG pccBuffer, DEVNODE dnDevNode, ULONG ulFlags))
  2529. MAKE_CM_HEADER(Get_DevNode_Key_Size, (PFARULONG pulLen, DEVNODE dnDevNode, PFARCHAR pszSubKey, ULONG ulFlags))
  2530. MAKE_CM_HEADER(Get_DevNode_Key, (DEVNODE dnDevNode, PFARCHAR pszSubKey, PFARVOID Buffer, ULONG BufferLen, ULONG ulFlags))
  2531. MAKE_CM_HEADER(Read_Registry_Value, (DEVNODE dnDevNode, PFARCHAR pszSubKey, PFARCHAR pszValueName, ULONG ulExpectedType, PFARVOID pBuffer, PFARULONG pulLength, ULONG ulFlags))
  2532. MAKE_CM_HEADER(Write_Registry_Value, (DEVNODE dnDevNode, PFARCHAR pszSubKey, PFARCHAR pszValueName, ULONG ulType, PFARVOID pBuffer, ULONG ulLength, ULONG ulFlags))
  2533. MAKE_CM_HEADER(Disable_DevNode, (DEVNODE dnDevNode, ULONG ulFlags))
  2534. MAKE_CM_HEADER(Enable_DevNode, (DEVNODE dnDevNode, ULONG ulFlags))
  2535. MAKE_CM_HEADER(Move_DevNode, (DEVNODE dnFromDevNode, DEVNODE dnToDevNode, ULONG ulFlags))
  2536. MAKE_CM_HEADER(Set_Bus_Info, (DEVNODE dnDevNode, CMBUSTYPE btBusType, ULONG ulSizeOfInfo, PFARVOID pInfo, ULONG ulFlags))
  2537. MAKE_CM_HEADER(Get_Bus_Info, (DEVNODE dnDevNode, PCMBUSTYPE pbtBusType, PFARULONG pulSizeOfInfo, PFARVOID pInfo, ULONG ulFlags))
  2538. MAKE_CM_HEADER(Set_HW_Prof, (ULONG ulConfig, ULONG ulFlags))
  2539. MAKE_CM_HEADER(Recompute_HW_Prof, (ULONG ulDock, ULONG ulSerialNo, ULONG ulFlags))
  2540. MAKE_CM_HEADER(Query_Change_HW_Prof, (ULONG ulDock, ULONG ulSerialNo, ULONG ulFlags))
  2541. MAKE_CM_HEADER(Get_Device_Driver_Private_DWord, (DEVNODE dnDevNode, PFARULONG pulDWord, ULONG ulFlags))
  2542. MAKE_CM_HEADER(Set_Device_Driver_Private_DWord, (DEVNODE dnDevNode, ULONG ulDword, ULONG ulFlags))
  2543. MAKE_CM_HEADER(Get_HW_Prof_Flags, (PFARCHAR szDevNodeName, ULONG ulConfig, PFARULONG pulValue, ULONG ulFlags))
  2544. MAKE_CM_HEADER(Set_HW_Prof_Flags, (PFARCHAR szDevNodeName, ULONG ulConfig, ULONG ulValue, ULONG ulFlags))
  2545. MAKE_CM_HEADER(Read_Registry_Log_Confs, (DEVNODE dnDevNode, ULONG ulFlags))
  2546. MAKE_CM_HEADER(Run_Detection, (ULONG ulFlags))
  2547. MAKE_CM_HEADER(Call_At_Appy_Time, (CMAPPYCALLBACKHANDLER Handler, ULONG ulRefData, ULONG ulFlags))
  2548. MAKE_CM_HEADER(Fail_Change_HW_Prof, (DEVNODE dnDevnode, ULONG ulFlags))
  2549. MAKE_CM_HEADER(Set_Private_Problem, (DEVNODE dnDevNode, ULONG ulRefData, ULONG ulFlags))
  2550. MAKE_CM_HEADER(Debug_DevNode, (DEVNODE dnDevNode, ULONG ulFlags))
  2551. MAKE_CM_HEADER(Get_Hardware_Profile_Info, (ULONG ulIndex, PFARHWPROFILEINFO pHWProfileInfo, ULONG ulFlags))
  2552. MAKE_CM_HEADER(Register_Enumerator_Function, (DEVNODE dnDevNode, CMENUMFUNCTION Handler, ULONG ulFlags))
  2553. MAKE_CM_HEADER(Call_Enumerator_Function, (DEVNODE dnDevNode, ENUMFUNC efFunc, ULONG ulRefData, PFARVOID pBuffer, ULONG ulBufferSize, ULONG ulFlags))
  2554. MAKE_CM_HEADER(Add_ID, (DEVNODE dnDevNode, PFARCHAR pszID, ULONG ulFlags))
  2555. MAKE_CM_HEADER(Find_Range, (PFARULONG pulStart, ULONG ulStart, ULONG ulLength, ULONG ulAlignment, ULONG ulEnd, RANGE_LIST rlh, ULONG ulFlags))
  2556. MAKE_CM_HEADER(Get_Global_State, (PFARULONG pulState, ULONG ulFlags))
  2557. MAKE_CM_HEADER(Broadcast_Device_Change_Message, (ULONG ulwParam, PFARVOID plParam, ULONG ulFlags))
  2558. MAKE_CM_HEADER(Call_DevNode_Handler, (DEVNODE dnDevNode, ULONG ulPrivate, ULONG ulFlags))
  2559. MAKE_CM_HEADER(Remove_Reinsert_All, (ULONG ulFlags))
  2560. //
  2561. // 4.0 OPK2 Services
  2562. //
  2563. MAKE_CM_HEADER(Change_DevNode_Status, (DEVNODE dnDevNode, ULONG ulStatus, ULONG ulFlags))
  2564. MAKE_CM_HEADER(Reprocess_DevNode, (DEVNODE dnDevNode, ULONG ulFlags))
  2565. MAKE_CM_HEADER(Assert_Structure, (PFARULONG pulPointerType, DWORD dwData, ULONG ulFlags))
  2566. MAKE_CM_HEADER(Discard_Boot_Log_Conf, (DEVNODE dnDevNode, ULONG ulFlags))
  2567. MAKE_CM_HEADER(Set_Dependent_DevNode, (DEVNODE dnDependOnDevNode, DEVNODE dnDependingDevNode, ULONG ulFlags))
  2568. MAKE_CM_HEADER(Get_Dependent_DevNode, (PDEVNODE dnDependOnDevNode, DEVNODE dnDependingDevNode, ULONG ulFlags))
  2569. MAKE_CM_HEADER(Refilter_DevNode, (DEVNODE dnDevNode, ULONG ulFlags))
  2570. MAKE_CM_HEADER(Set_DevNode_PowerState, (DEVNODE dnDevNode, ULONG ulPowerState, ULONG ulFlags))
  2571. MAKE_CM_HEADER(Get_DevNode_PowerState, (DEVNODE dnDevNode, PFARULONG pulPowerState, ULONG ulFlags))
  2572. MAKE_CM_HEADER(Set_DevNode_PowerCapabilities, (DEVNODE dnDevNode, ULONG ulPowerCapabilities, ULONG ulFlags))
  2573. MAKE_CM_HEADER(Get_DevNode_PowerCapabilities, (DEVNODE dnDevNode, PFARULONG pulPowerCapabilities, ULONG ulFlags))
  2574. MAKE_CM_HEADER(Substract_Range_List, (RANGE_LIST rlhFrom, RANGE_LIST rlhWith, RANGE_LIST rlhDifference, ULONG ulFlags))
  2575. MAKE_CM_HEADER(Merge_Range_List, (RANGE_LIST rlh1, RANGE_LIST rlh2, RANGE_LIST rlhTotal, ULONG ulFlags))
  2576. MAKE_CM_HEADER(Read_Range_List, (PFARCHAR pszKeyName, RANGE_LIST rlh, ULONG ulFlags))
  2577. MAKE_CM_HEADER(Write_Range_List, (PFARCHAR pszKeyName, RANGE_LIST rlh, ULONG ulFlags))
  2578. MAKE_CM_HEADER(Get_Set_Log_Conf_Priority, (PPRIORITY pPriority, LOG_CONF lcLogConf, ULONG ulFlags))
  2579. MAKE_CM_HEADER(Support_Share_Irq, (DEVNODE dnDevNode, ULONG ulFlags))
  2580. MAKE_CM_HEADER(Get_Parent_Structure, (PFARULONG pulParentStructure, RES_DES CurrentResDesOrLogConf, ULONG ulFlags))
  2581. //
  2582. // 4.1 Services
  2583. //
  2584. MAKE_CM_HEADER(Register_DevNode_For_Idle_Detection, (DEVNODE dnDevNode, ULONG ulConservationTime, ULONG ulPerformanceTime, PFARULONG pulCounterVariable, ULONG ulState, ULONG ulFlags))
  2585. MAKE_CM_HEADER(CM_To_ISAPNP, (LOG_CONF lcLogConf, PFARVOID pCurrentResources, PFARVOID pNewResources, ULONG ulLength, ULONG ulFlags))
  2586. MAKE_CM_HEADER(Get_DevNode_Handler, (DEVNODE dnDevNode, PFARULONG pAddress, ULONG ulFlags))
  2587. MAKE_CM_HEADER(Detect_Resource_Conflict, (DEVNODE dnDevNode, RESOURCEID ResourceID, PFARVOID pResourceData, ULONG ulResourceLen, PFARCHAR pfConflictDetected, ULONG ulFlags))
  2588. MAKE_CM_HEADER(Get_Device_Interface_List, (PFARVOID pInterfaceGuid, PFARCHAR pDeviceID, PFARCHAR pBuffer, ULONG ulBufferLen, ULONG ulFlags))
  2589. MAKE_CM_HEADER(Get_Device_Interface_List_Size, (PFARULONG pulLen, PFARVOID pInterfaceGuid, PFARCHAR pDeviceID, ULONG ulFlags))
  2590. MAKE_CM_HEADER(Get_Conflict_Info, (DEVNODE dnDevNode, PRESOURCEID pResourceID, ULONG ulFlags))
  2591. MAKE_CM_HEADER(Add_Remove_DevNode_Property, (DEVNODE dnDevNode, ULONG ulFlags))
  2592. MAKE_CM_HEADER(CallBack_At_Appy_Time, (CMAPPYCALLBACKHANDLER Handler, ULONG ulRefData, ULONG ulFlags))
  2593. MAKE_CM_HEADER(Register_Device_Interface, (DEVNODE dnDevNode, PFARVOID pInterfaceGuid, PFARCHAR pReference, PFARCHAR pInterfaceDevice, PFARULONG pulLen, ULONG ulFlags))
  2594. MAKE_CM_HEADER(System_Device_Power_State_Mapping, (DEVNODE dnDevNode, PPSMAPPING pPSMapping, ULONG ulFlags))
  2595. MAKE_CM_HEADER(Get_Arbitrator_Info, (PFARULONG pInfo, PDEVNODE pdnDevNode, DEVNODE dnDevNode, RESOURCEID ResourceID, PFARVOID pResourceData, ULONG ulResourceLen, ULONG ulFlags))
  2596. MAKE_CM_HEADER(Waking_Up_From_DevNode, (DEVNODE dnDevNode, ULONG ulFlags))
  2597. MAKE_CM_HEADER(Set_DevNode_Problem, (DEVNODE dnDevNode, ULONG ulProblem, ULONG ulFlags))
  2598. MAKE_CM_HEADER(Get_Device_Interface_Alias, (PFARCHAR pDeviceInterface, PFARVOID pAliasInterfaceGuid, PFARCHAR pAliasDeviceInterface, PFARULONG pulLen, ULONG ulFlags))
  2599. #pragma warning (default:4100) // Param not used
  2600. #endif // ifndef No_CM_Calls
  2601. /*XLATON*/
  2602. #endif // ifndef CMJUSTRESDES
  2603. /*XLATOFF*/
  2604. #include <poppack.h>
  2605. /*XLATON*/
  2606. #endif // _CONFIGMG_H