Leaked source code of windows server 2003
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.

724 lines
17 KiB

  1. /*++
  2. Copyright (c) 1999 Microsoft Corporation
  3. Module Name:
  4. list.c
  5. Abstract:
  6. WinDbg Extension Api
  7. implements !list
  8. Author:
  9. jdunn
  10. Environment:
  11. User Mode.
  12. Revision History:
  13. --*/
  14. #include "precomp.h"
  15. #include "usbhcdkd.h"
  16. // _list DH
  17. VOID
  18. DumpDeviceHandleList(
  19. MEMLOC HeadMemLoc
  20. )
  21. {
  22. MEMLOC flink;
  23. MEMLOC blink;
  24. MEMLOC memLoc;
  25. ULONG i=0;
  26. UCHAR cs[] = "_USBD_DEVICE_HANDLE";
  27. PrintfMemLoc("*LIST -- DeviceHandleList ", HeadMemLoc, "\n");
  28. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Flink", flink);
  29. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Blink", blink);
  30. //PrintfMemLoc("blink: ", blink, "\n");
  31. //PrintfMemLoc("flink: ", flink, "\n");
  32. while (flink != HeadMemLoc) {
  33. USHORT vid, pid;
  34. // get the address of the USBPORT_MINIPORT_DRIVER
  35. // struct
  36. memLoc = flink - UsbFieldOffset(cs,
  37. "ListEntry");
  38. dprintf ("[%d] DeviceHandle: ", i);
  39. PrintfMemLoc("", memLoc, " ");
  40. i++;
  41. dprintf("VID %04.4x PID %04.4x\n",
  42. UsbReadFieldUshort(memLoc, cs, "DeviceDescriptor.idVendor"),
  43. UsbReadFieldUshort(memLoc, cs, "DeviceDescriptor.idProduct"));
  44. #if 0
  45. PrintfMemLoc("\tDriverObject: ",
  46. UsbReadFieldPtr(mpMemLoc, cs, "DriverObject"),
  47. "\n");
  48. PrintfMemLoc("\tMiniportUnload: ",
  49. UsbReadFieldPtr(mpMemLoc, cs, "MiniportUnload"),
  50. "\n");
  51. #endif
  52. flink = UsbReadFieldPtr(memLoc, cs, "ListEntry.Flink");
  53. }
  54. }
  55. #define LT_ENDPOINT_ACTIVE_LIST 0
  56. #define LT_MAP_TRANSFER_LIST 1
  57. #define LT_DONE_TRANSFER_LIST 2
  58. #define LT_ENDPOINT_CANCEL_LIST 3
  59. #define LT_ENDPOINT_PENDING_LIST 4
  60. // AL, MT, DT
  61. VOID
  62. DumpTransferList(
  63. ULONG ListType,
  64. MEMLOC HeadMemLoc
  65. )
  66. {
  67. MEMLOC flink, blink, memLoc;
  68. UCHAR cs[] = "_HCD_TRANSFER_CONTEXT";
  69. ULONG i=0;
  70. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Flink", flink);
  71. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Blink", blink);
  72. //PrintfMemLoc("blink: ", blink, "\n");
  73. //PrintfMemLoc("flink: ", flink, "\n");
  74. switch(ListType) {
  75. case LT_ENDPOINT_ACTIVE_LIST:
  76. dprintf ("*LIST -- EndpointActiveList\n");
  77. break;
  78. case LT_MAP_TRANSFER_LIST:
  79. dprintf ("*LIST -- MapTransferList\n");
  80. break;
  81. case LT_DONE_TRANSFER_LIST:
  82. dprintf ("*LIST -- DoneTransferList\n");
  83. break;
  84. case LT_ENDPOINT_CANCEL_LIST:
  85. dprintf ("*LIST -- EndpointCancelList\n");
  86. break;
  87. case LT_ENDPOINT_PENDING_LIST:
  88. dprintf ("*LIST -- EndpointPendingList\n");
  89. break;
  90. }
  91. while (flink != HeadMemLoc) {
  92. ULONG f;
  93. // get the address of the USBPORT_MINIPORT_DRIVER
  94. // struct
  95. memLoc = flink - UsbFieldOffset(cs,
  96. "TransferLink");
  97. dprintf ("[%d] Transfer (_tfer): ", i);
  98. PrintfMemLoc(" ", memLoc, " ");
  99. PrintfMemLoc(" Urb (_urb): ",
  100. UsbReadFieldPtr(memLoc, cs, "Urb"),
  101. "");
  102. f = UsbReadFieldUlong(memLoc, cs, "Flags");
  103. if (f & USBPORT_TXFLAG_IN_MINIPORT) {
  104. dprintf (" USBPORT_TXFLAG_IN_MINIPORT\n");
  105. }
  106. dprintf ("\n");
  107. i++;
  108. flink = UsbReadFieldPtr(memLoc,
  109. cs, "TransferLink.Flink");
  110. }
  111. }
  112. // CL
  113. VOID
  114. DumpClosedEnpointList(
  115. MEMLOC HeadMemLoc
  116. )
  117. {
  118. MEMLOC flink;
  119. MEMLOC blink;
  120. MEMLOC memLoc;
  121. ULONG i=0;
  122. UCHAR cs[] = "_HCD_ENDPOINT";
  123. ENDPOINT_TRANSFER_TYPE tt;
  124. ENDPOINT_TRANSFER_DIRECTION dir;
  125. USHORT ea, da;
  126. PrintfMemLoc("*LIST -- EpClosedList ", HeadMemLoc, "\n");
  127. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Flink", flink);
  128. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Blink", blink);
  129. //PrintfMemLoc("blink: ", blink, "\n");
  130. //PrintfMemLoc("flink: ", flink, "\n");
  131. while (flink != HeadMemLoc) {
  132. // get the address of the USBPORT_MINIPORT_DRIVER
  133. // struct
  134. memLoc = flink - UsbFieldOffset(cs,
  135. "ClosedLink");
  136. dprintf ("[%d] Endpoint: ", i);
  137. PrintfMemLoc("", memLoc, "\n");
  138. da = UsbReadFieldUshort(memLoc, cs, "Parameters.DeviceAddress");
  139. ea = UsbReadFieldUshort(memLoc, cs, "Parameters.EndpointAddress");
  140. tt = UsbReadFieldUlong(memLoc, cs, "Parameters.TransferType");
  141. dir = UsbReadFieldUlong(memLoc, cs, "Parameters.TransferDirection");
  142. dprintf ("\tDevice Address: 0x%02.2x, ep 0x%02.2x ",
  143. da,
  144. ea);
  145. EpType(tt);
  146. dprintf (" ");
  147. if (tt != Control) {
  148. EpDir(dir);
  149. }
  150. dprintf ("\n");
  151. i++;
  152. flink = UsbReadFieldPtr(memLoc, cs, "ClosedLink.Flink");
  153. }
  154. }
  155. // AT
  156. VOID
  157. DumpAttendEndpointList(
  158. MEMLOC HeadMemLoc
  159. )
  160. {
  161. MEMLOC flink;
  162. MEMLOC blink;
  163. MEMLOC memLoc;
  164. ULONG i=0;
  165. UCHAR cs[] = "_HCD_ENDPOINT";
  166. ENDPOINT_TRANSFER_TYPE tt;
  167. ENDPOINT_TRANSFER_DIRECTION dir;
  168. USHORT ea, da;
  169. PrintfMemLoc("*LIST -- AttendEndpointList ", HeadMemLoc, "\n");
  170. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Flink", flink);
  171. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Blink", blink);
  172. //PrintfMemLoc("blink: ", blink, "\n");
  173. //PrintfMemLoc("flink: ", flink, "\n");
  174. while (flink != HeadMemLoc) {
  175. // get the address of the USBPORT_MINIPORT_DRIVER
  176. // struct
  177. memLoc = flink - UsbFieldOffset(cs,
  178. "AttendLink");
  179. dprintf ("[%d] Endpoint: ", i);
  180. PrintfMemLoc("", memLoc, "\n");
  181. da = UsbReadFieldUshort(memLoc, cs, "Parameters.DeviceAddress");
  182. ea = UsbReadFieldUshort(memLoc, cs, "Parameters.EndpointAddress");
  183. tt = UsbReadFieldUlong(memLoc, cs, "Parameters.TransferType");
  184. dir = UsbReadFieldUlong(memLoc, cs, "Parameters.TransferDirection");
  185. dprintf ("\tDevice Address: 0x%02.2x, ep 0x%02.2x ",
  186. da,
  187. ea);
  188. EpType(tt);
  189. dprintf (" ");
  190. if (tt != Control) {
  191. EpDir(dir);
  192. }
  193. dprintf ("\n");
  194. i++;
  195. flink = UsbReadFieldPtr(memLoc, cs, "AttendLink.Flink");
  196. }
  197. }
  198. // GL
  199. VOID
  200. DumpGlobalEnpointList(
  201. MEMLOC HeadMemLoc
  202. )
  203. {
  204. MEMLOC flink;
  205. MEMLOC blink;
  206. MEMLOC memLoc;
  207. ULONG i=0;
  208. UCHAR cs[] = "_HCD_ENDPOINT";
  209. ENDPOINT_TRANSFER_TYPE tt;
  210. ENDPOINT_TRANSFER_DIRECTION dir;
  211. USHORT ea, da;
  212. PrintfMemLoc("*LIST -- GlobalEndpointList ", HeadMemLoc, "\n");
  213. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Flink", flink);
  214. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Blink", blink);
  215. //PrintfMemLoc("blink: ", blink, "\n");
  216. //PrintfMemLoc("flink: ", flink, "\n");
  217. while (flink != HeadMemLoc) {
  218. // get the address of the USBPORT_MINIPORT_DRIVER
  219. // struct
  220. memLoc = flink - UsbFieldOffset(cs,
  221. "GlobalLink");
  222. dprintf ("[%d] Endpoint (_endp): ", i);
  223. PrintfMemLoc("", memLoc, "\n");
  224. da = UsbReadFieldUshort(memLoc, cs, "Parameters.DeviceAddress");
  225. ea = UsbReadFieldUshort(memLoc, cs, "Parameters.EndpointAddress");
  226. tt = UsbReadFieldUlong(memLoc, cs, "Parameters.TransferType");
  227. dir = UsbReadFieldUlong(memLoc, cs, "Parameters.TransferDirection");
  228. dprintf ("\tDevice Address: 0x%02.2x, ep 0x%02.2x ",
  229. da,
  230. ea);
  231. EpType(tt);
  232. dprintf (" ");
  233. if (tt != Control) {
  234. EpDir(dir);
  235. }
  236. dprintf ("\n");
  237. i++;
  238. flink = UsbReadFieldPtr(memLoc, cs, "GlobalLink.Flink");
  239. }
  240. }
  241. // SC
  242. VOID
  243. DumpStateEnpointList(
  244. MEMLOC HeadMemLoc
  245. )
  246. {
  247. MEMLOC flink;
  248. MEMLOC blink;
  249. MEMLOC memLoc;
  250. ULONG i=0;
  251. UCHAR cs[] = "_HCD_ENDPOINT";
  252. ENDPOINT_TRANSFER_TYPE tt;
  253. ENDPOINT_TRANSFER_DIRECTION dir;
  254. ULONG f;
  255. PrintfMemLoc("*LIST -- EpStateChangeList ", HeadMemLoc, "\n");
  256. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Flink", flink);
  257. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Blink", blink);
  258. //PrintfMemLoc("blink: ", blink, "\n");
  259. //PrintfMemLoc("flink: ", flink, "\n");
  260. while (flink != HeadMemLoc) {
  261. // get the address of the USBPORT_MINIPORT_DRIVER
  262. // struct
  263. memLoc = flink - UsbFieldOffset(cs,
  264. "StateLink");
  265. dprintf ("[%d] Endpoint (_endp): ", i);
  266. PrintfMemLoc("", memLoc, " ");
  267. f = UsbReadFieldUlong(memLoc, cs, "StateChangeFrame");
  268. dprintf ("- frame (0x%x) \n", f);
  269. i++;
  270. flink = UsbReadFieldPtr(memLoc, cs, "StateLink.Flink");
  271. }
  272. }
  273. // PH
  274. VOID
  275. DumpPipeHandleList(
  276. MEMLOC HeadMemLoc
  277. )
  278. {
  279. MEMLOC flink;
  280. MEMLOC blink;
  281. MEMLOC memLoc;
  282. ULONG i=0;
  283. UCHAR cs[] = "USBD_PIPE_HANDLE_I";
  284. PrintfMemLoc("*LIST -- PipeHandleList ", HeadMemLoc, "\n");
  285. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Flink", flink);
  286. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Blink", blink);
  287. //PrintfMemLoc("blink: ", blink, "\n");
  288. //PrintfMemLoc("flink: ", flink, "\n");
  289. while (flink != HeadMemLoc && i<100) {
  290. // get the address of the USBPORT_MINIPORT_DRIVER
  291. // struct
  292. memLoc = flink - UsbFieldOffset(cs,
  293. "ListEntry");
  294. dprintf ("[%d] PipeHandle (_piph): ", i);
  295. PrintfMemLoc("", memLoc, "\n");
  296. dprintf ("\n");
  297. i++;
  298. flink = UsbReadFieldPtr(memLoc, cs, "ListEntry.Flink");
  299. }
  300. #if 0
  301. LIST_ENTRY headListEntry;
  302. ULONG pipeMemLoc, result, i=0;
  303. USBD_PIPE_HANDLE_I pipeHandle;
  304. ULONG memLocListEntry;
  305. dprintf ("*LIST -- PipeHandleList\n");
  306. if (ReadMemory (HeadMemLoc, &headListEntry, sizeof (LIST_ENTRY), &result)) {
  307. memLocListEntry = (ULONG) headListEntry.Flink;
  308. while (memLocListEntry != HeadMemLoc) {
  309. // extact this device handle
  310. pipeMemLoc = memLocListEntry;
  311. pipeMemLoc = pipeMemLoc-
  312. FIELD_OFFSET(USBD_PIPE_HANDLE_I, ListEntry);
  313. if (ReadMemory (pipeMemLoc, &pipeHandle, sizeof (pipeHandle), &result)) {
  314. dprintf ("[%d] PipeHandle: %08.8x endpoint: %08.8x\n", i,
  315. pipeMemLoc, pipeHandle.Endpoint);
  316. // display the address and type
  317. i++;
  318. memLocListEntry = (ULONG) pipeHandle.ListEntry.Flink;
  319. } else {
  320. dprintf ("Could not read Pipehandle\n");
  321. break;
  322. }
  323. }
  324. } else {
  325. dprintf ("Could not read list head\n");
  326. }
  327. #endif
  328. }
  329. VOID
  330. DumpRegCacheList(
  331. MEMLOC HeadMemLoc
  332. )
  333. {
  334. MEMLOC flink;
  335. MEMLOC blink;
  336. MEMLOC memLoc;
  337. ULONG i=0;
  338. UCHAR cs[] = "_USBPORT_REG_CACHE_ENTRY";
  339. PrintfMemLoc("*LIST -- RegCache ", HeadMemLoc, "\n");
  340. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Flink", flink);
  341. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Blink", blink);
  342. //PrintfMemLoc("blink: ", blink, "\n");
  343. //PrintfMemLoc("flink: ", flink, "\n");
  344. while (flink != HeadMemLoc && i<100) {
  345. // get the address of the USBPORT_MINIPORT_DRIVER
  346. // struct
  347. memLoc = flink - UsbFieldOffset(cs,
  348. "RegLink");
  349. dprintf ("[%d] RegCache ( _USBPORT_REG_CACHE_ENTRY ): ", i);
  350. PrintfMemLoc("", memLoc, "\n");
  351. dprintf ("\n");
  352. i++;
  353. flink = UsbReadFieldPtr(memLoc, cs, "RegLink.Flink");
  354. }
  355. }
  356. // TT
  357. VOID
  358. DumpTtList(
  359. MEMLOC HeadMemLoc
  360. )
  361. {
  362. MEMLOC flink;
  363. MEMLOC blink;
  364. MEMLOC memLoc;
  365. ULONG i=0;
  366. UCHAR cs[] = "_TRANSACTION_TRANSLATOR";
  367. PrintfMemLoc("*LIST -- TtList ", HeadMemLoc, "\n");
  368. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Flink", flink);
  369. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Blink", blink);
  370. //PrintfMemLoc("blink: ", blink, "\n");
  371. //PrintfMemLoc("flink: ", flink, "\n");
  372. while (flink != HeadMemLoc && i<100) {
  373. // get the address of the USBPORT_MINIPORT_DRIVER
  374. // struct
  375. memLoc = flink - UsbFieldOffset(cs,
  376. "TtLink");
  377. dprintf ("[%d] TT (_tt): ", i);
  378. PrintfMemLoc("", memLoc, "\n");
  379. dprintf ("\n");
  380. i++;
  381. flink = UsbReadFieldPtr(memLoc, cs, "TtLink.Flink");
  382. }
  383. }
  384. // BA
  385. VOID
  386. DumpBadRequestList(
  387. MEMLOC HeadMemLoc
  388. )
  389. {
  390. MEMLOC flink;
  391. MEMLOC blink;
  392. MEMLOC memLoc, irpMemLoc;
  393. ULONG i=0;
  394. PrintfMemLoc("*LIST -- BadRequest ", HeadMemLoc, "\n");
  395. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Flink", flink);
  396. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Blink", blink);
  397. PrintfMemLoc("blink: ", blink, "\n");
  398. PrintfMemLoc("flink: ", flink, "\n");
  399. memLoc = flink;
  400. while (flink != HeadMemLoc && i<30) {
  401. irpMemLoc = memLoc;
  402. GetFieldValue(memLoc, "_LIST_ENTRY", "Flink", memLoc);
  403. irpMemLoc = irpMemLoc-
  404. UsbFieldOffset("_IRP",
  405. "Tail.Overlay.ListEntry");
  406. dprintf ("[%d] Irp: ", i);
  407. PrintfMemLoc("", irpMemLoc, "\n");
  408. i++;
  409. flink = memLoc;
  410. }
  411. }
  412. // AI
  413. VOID
  414. DumpAbortIrpList(
  415. MEMLOC HeadMemLoc
  416. )
  417. {
  418. MEMLOC flink;
  419. MEMLOC blink;
  420. MEMLOC memLoc;
  421. MEMLOC irpMemLoc;
  422. ULONG i = 0;
  423. PrintfMemLoc("*LIST -- AbortIrpList ", HeadMemLoc, "\n");
  424. #if 0
  425. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Flink", flink);
  426. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Blink", blink);
  427. memLoc = flink;
  428. while (memLoc != HeadMemLoc) {
  429. // extract this entry
  430. irpMemLoc = memLoc;
  431. GetFieldValue(memLoc, "_LIST_ENTRY", "Flink", memLoc);
  432. irpMemLoc = irpMemLoc-
  433. UsbFieldOffset("_IRP",
  434. "Tail.Overlay.ListEntry");
  435. dprintf ("[%d] Irp: ", i);
  436. PrintfMemLoc("", irpMemLoc, "\n");
  437. i++;
  438. }
  439. #endif
  440. }
  441. PCHAR
  442. ListEmpty(
  443. MEMLOC HeadMemLoc
  444. )
  445. {
  446. MEMLOC flink;
  447. MEMLOC blink;
  448. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Flink", flink);
  449. GetFieldValue(HeadMemLoc, "_LIST_ENTRY", "Blink", blink);
  450. if (flink == HeadMemLoc) {
  451. return "empty\n";
  452. } else {
  453. return "\n";
  454. }
  455. }
  456. DECLARE_API( _list )
  457. /*++
  458. Routine Description:
  459. dumps a usbport list
  460. Arguments:
  461. args - Address flags
  462. Return Value:
  463. None
  464. --*/
  465. {
  466. MEMLOC addr;
  467. PCSTR s;
  468. UCHAR parm[32];
  469. GetExpressionEx( args, &addr, &s );
  470. PrintfMemLoc("list: ", addr, " ");
  471. sscanf(s, ",%s", &parm);
  472. dprintf("%s\n", parm);
  473. if (_strcmpi(parm, "DH") == 0) {
  474. DumpDeviceHandleList(addr);
  475. }
  476. if (_strcmpi(parm, "GL") == 0) {
  477. DumpGlobalEnpointList(addr);
  478. }
  479. if (_strcmpi(parm, "AL") == 0) {
  480. DumpTransferList(LT_ENDPOINT_ACTIVE_LIST, addr);
  481. }
  482. if (_strcmpi(parm, "PL") == 0) {
  483. DumpTransferList(LT_ENDPOINT_PENDING_LIST, addr);
  484. }
  485. if (_strcmpi(parm, "AI") == 0) {
  486. DumpAbortIrpList(addr);
  487. }
  488. if (_strcmpi(parm, "BA") == 0) {
  489. DumpBadRequestList(addr);
  490. }
  491. if (_strcmpi(parm, "XL") == 0) {
  492. DumpClosedEnpointList(addr);
  493. }
  494. if (_strcmpi(parm, "AT") == 0) {
  495. DumpAttendEndpointList(addr);
  496. }
  497. if (_strcmpi(parm, "SC") == 0) {
  498. DumpStateEnpointList(addr);
  499. }
  500. if (_strcmpi(parm, "PH") == 0) {
  501. DumpPipeHandleList(addr);
  502. }
  503. if (_strcmpi(parm, "TT") == 0) {
  504. DumpTtList(addr);
  505. }
  506. if (_strcmpi(parm, "DT") == 0) {
  507. DumpTransferList(LT_DONE_TRANSFER_LIST, addr);
  508. }
  509. if (_strcmpi(parm, "MT") == 0) {
  510. DumpTransferList(LT_MAP_TRANSFER_LIST, addr);
  511. }
  512. if (_strcmpi(parm, "RE") == 0) {
  513. DumpRegCacheList(addr);
  514. }
  515. #if 0
  516. if (_strcmpi(parm, "XL") == 0) {
  517. DumpClosedEnpointList(memLoc, level);
  518. }
  519. if (_strcmpi(parm, "SC") == 0) {
  520. DumpStateEnpointList(memLoc, level);
  521. }
  522. if (_strcmpi(parm, "PH") == 0) {
  523. DumpPipeHandleList(memLoc, level);
  524. }
  525. if (_strcmpi(parm, "AT") == 0) {
  526. DumpAttendEndpointList(memLoc, level);
  527. }
  528. // endpoint transfer lists
  529. if (_strcmpi(parm, "AL") == 0) {
  530. DumpTransferList(LT_ENDPOINT_ACTIVE_LIST, memLoc, level);
  531. }
  532. if (_strcmpi(parm, "CL") == 0) {
  533. DumpTransferList(LT_ENDPOINT_CANCEL_LIST, memLoc, level);
  534. }
  535. if (_strcmpi(parm, "PL") == 0) {
  536. DumpTransferList(LT_ENDPOINT_PENDING_LIST, memLoc, level);
  537. }
  538. // global transfer lists
  539. if (_strcmpi(parm, "MT") == 0) {
  540. DumpTransferList(LT_MAP_TRANSFER_LIST, memLoc, level);
  541. }
  542. if (_strcmpi(parm, "DT") == 0) {
  543. DumpTransferList(LT_DONE_TRANSFER_LIST, memLoc, level);
  544. }
  545. if (_strcmpi(parm, "AI") == 0) {
  546. DumpAbortIrpList(memLoc, level);
  547. }
  548. #endif
  549. return S_OK;
  550. }