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.

768 lines
22 KiB

  1. /*++
  2. Copyright (c) 1998 Microsoft Corporation
  3. Module Name:
  4. wdmaud.c
  5. Abstract:
  6. WinDbg Extension Api
  7. Author:
  8. Noel Cross (NoelC) 18-Sept-1998
  9. Environment:
  10. Kernel Mode.
  11. Revision History:
  12. --*/
  13. #include "precomp.h"
  14. #define UNDER_NT
  15. #define WDMA_KD
  16. // #include "..\..\ntos\dd\wdm\audio\legacy\wdmaud.sys\wdmsys.h"
  17. typedef union _WDMAUD_FLAGS {
  18. struct {
  19. ULONG Ioctls : 1;
  20. ULONG PendingIrps : 1;
  21. ULONG AllocatedMdls : 1;
  22. ULONG pContextList : 1;
  23. ULONG Reserved1 : 4;
  24. ULONG Verbose : 1;
  25. ULONG Reserved : 23;
  26. };
  27. ULONG Flags;
  28. } WDMAUD_FLAGS;
  29. /**********************************************************************
  30. * Forward References
  31. **********************************************************************
  32. */
  33. VOID
  34. PrintCommand (
  35. ULONG IoCode
  36. );
  37. VOID
  38. DumpIoctlLog (
  39. ULONG64 memLoc,
  40. ULONG flags
  41. );
  42. VOID
  43. DumpPendingIrps (
  44. ULONG64 memLoc,
  45. ULONG flags
  46. );
  47. VOID
  48. DumpAllocatedMdls (
  49. ULONG64 memLoc,
  50. ULONG flags
  51. );
  52. VOID
  53. DumpContextList (
  54. ULONG64 memLoc,
  55. ULONG flags
  56. );
  57. DECLARE_API( wdmaud )
  58. /*++
  59. Routine Description:
  60. Entry point for the kernel debugger extensions for wdmaud
  61. Arguments:
  62. flags - 1 - Ioctl History Dump
  63. 2 - Pending Irps
  64. 4 - Allocated Mdls
  65. 8 - pContext Dump
  66. 100 - Verbose
  67. Return Value:
  68. None.
  69. --*/
  70. {
  71. ULONG64 memLoc=0;
  72. CHAR buffer[256];
  73. WDMAUD_FLAGS flags;
  74. buffer[0] = '\0';
  75. flags.Flags = 0;
  76. //
  77. // get the arguments
  78. //
  79. if (!*args)
  80. {
  81. memLoc = EXPRLastDump;
  82. }
  83. else
  84. {
  85. if (GetExpressionEx( args, &memLoc, &args)) {
  86. StringCchCopy(buffer, sizeof(buffer), args );
  87. }
  88. }
  89. if( '\0' != buffer[0] )
  90. {
  91. flags.Flags = (ULONG) GetExpression( buffer );
  92. }
  93. if (memLoc)
  94. {
  95. if (flags.Ioctls)
  96. {
  97. //
  98. // dump wdmaud's history of ioctls
  99. //
  100. DumpIoctlLog ( memLoc, flags.Flags );
  101. }
  102. else if (flags.PendingIrps)
  103. {
  104. //
  105. // dump any pending irps that wdmaud hasn't completed yet
  106. //
  107. DumpPendingIrps ( memLoc, flags.Flags );
  108. }
  109. else if (flags.AllocatedMdls)
  110. {
  111. //
  112. // dump all Mdls which have been allocated by wdmaud
  113. //
  114. DumpAllocatedMdls ( memLoc, flags.Flags );
  115. }
  116. else if (flags.pContextList)
  117. {
  118. //
  119. // dump the list of all registered pContexts
  120. //
  121. DumpContextList ( memLoc, flags.Flags );
  122. }
  123. else
  124. {
  125. dprintf("\nNo valid flags\n");
  126. dprintf("SYNTAX: !wdmaud <address> <flags>\n");
  127. }
  128. }
  129. else
  130. {
  131. dprintf("\nInvalid memory location\n");
  132. dprintf("SYNTAX: !wdmaud <address> <flags>\n");
  133. }
  134. return S_OK;
  135. }
  136. VOID
  137. PrintCommand(
  138. ULONG IoCode
  139. )
  140. /*++
  141. Routine Description:
  142. Prints out individual ioctls
  143. Arguments:
  144. pCommand - Ioctl to log
  145. Return Value:
  146. None.
  147. --*/
  148. {
  149. switch( IoCode )
  150. {
  151. case IRP_MJ_CREATE:
  152. dprintf("IRP_MJ_CREATE");
  153. break;
  154. case IRP_MJ_CLOSE:
  155. dprintf("IRP_MJ_CLOSE");
  156. break;
  157. case IOCTL_WDMAUD_INIT:
  158. dprintf("IOCTL_WDMAUD_INIT");
  159. break;
  160. case IOCTL_WDMAUD_EXIT:
  161. dprintf("IOCTL_WDMAUD_EXIT");
  162. break;
  163. case IOCTL_WDMAUD_ADD_DEVNODE:
  164. dprintf("IOCTL_WDMAUD_ADD_DEVNODE");
  165. break;
  166. case IOCTL_WDMAUD_REMOVE_DEVNODE:
  167. dprintf("IOCTL_WDMAUD_REMOVE_DEVNODE");
  168. break;
  169. case IOCTL_WDMAUD_GET_CAPABILITIES:
  170. dprintf("IOCTL_WDMAUD_GET_CAPABILITIES");
  171. break;
  172. case IOCTL_WDMAUD_GET_NUM_DEVS:
  173. dprintf("IOCTL_WDMAUD_GET_NUM_DEVS");
  174. break;
  175. case IOCTL_WDMAUD_OPEN_PIN:
  176. dprintf("IOCTL_WDMAUD_OPEN_PIN");
  177. break;
  178. case IOCTL_WDMAUD_CLOSE_PIN:
  179. dprintf("IOCTL_WDMAUD_CLOSE_PIN");
  180. break;
  181. case IOCTL_WDMAUD_WAVE_OUT_PAUSE:
  182. dprintf("IOCTL_WDMAUD_WAVE_OUT_PAUSE");
  183. break;
  184. case IOCTL_WDMAUD_WAVE_OUT_PLAY:
  185. dprintf("IOCTL_WDMAUD_WAVE_OUT_PLAY");
  186. break;
  187. case IOCTL_WDMAUD_WAVE_OUT_RESET:
  188. dprintf("IOCTL_WDMAUD_WAVE_OUT_RESET");
  189. break;
  190. case IOCTL_WDMAUD_WAVE_OUT_BREAKLOOP:
  191. dprintf("IOCTL_WDMAUD_WAVE_OUT_BREAKLOOP");
  192. break;
  193. case IOCTL_WDMAUD_WAVE_OUT_GET_POS:
  194. dprintf("IOCTL_WDMAUD_WAVE_OUT_GET_POS");
  195. break;
  196. case IOCTL_WDMAUD_WAVE_OUT_SET_VOLUME:
  197. dprintf("IOCTL_WDMAUD_WAVE_OUT_SET_VOLUME");
  198. break;
  199. case IOCTL_WDMAUD_WAVE_OUT_GET_VOLUME:
  200. dprintf("IOCTL_WDMAUD_WAVE_OUT_GET_VOLUME");
  201. break;
  202. case IOCTL_WDMAUD_WAVE_OUT_WRITE_PIN:
  203. dprintf("IOCTL_WDMAUD_WAVE_OUT_WRITE_PIN");
  204. break;
  205. case IOCTL_WDMAUD_WAVE_IN_STOP:
  206. dprintf("IOCTL_WDMAUD_WAVE_IN_STOP");
  207. break;
  208. case IOCTL_WDMAUD_WAVE_IN_RECORD:
  209. dprintf("IOCTL_WDMAUD_WAVE_IN_RECORD");
  210. break;
  211. case IOCTL_WDMAUD_WAVE_IN_RESET:
  212. dprintf("IOCTL_WDMAUD_WAVE_IN_RESET");
  213. break;
  214. case IOCTL_WDMAUD_WAVE_IN_GET_POS:
  215. dprintf("IOCTL_WDMAUD_WAVE_IN_GET_POS");
  216. break;
  217. case IOCTL_WDMAUD_WAVE_IN_READ_PIN:
  218. dprintf("IOCTL_WDMAUD_WAVE_IN_READ_PIN");
  219. break;
  220. case IOCTL_WDMAUD_MIDI_OUT_RESET:
  221. dprintf("IOCTL_WDMAUD_MIDI_OUT_RESET");
  222. break;
  223. case IOCTL_WDMAUD_MIDI_OUT_SET_VOLUME:
  224. dprintf("IOCTL_WDMAUD_MIDI_OUT_SET_VOLUME");
  225. break;
  226. case IOCTL_WDMAUD_MIDI_OUT_GET_VOLUME:
  227. dprintf("IOCTL_WDMAUD_MIDI_OUT_GET_VOLUME");
  228. break;
  229. case IOCTL_WDMAUD_MIDI_OUT_WRITE_DATA:
  230. dprintf("IOCTL_WDMAUD_MIDI_OUT_WRITE_DATA");
  231. break;
  232. case IOCTL_WDMAUD_MIDI_OUT_WRITE_LONGDATA:
  233. dprintf("IOCTL_WDMAUD_MIDI_OUT_WRITE_LONGDATA");
  234. break;
  235. case IOCTL_WDMAUD_MIDI_IN_STOP:
  236. dprintf("IOCTL_WDMAUD_MIDI_IN_STOP");
  237. break;
  238. case IOCTL_WDMAUD_MIDI_IN_RECORD:
  239. dprintf("IOCTL_WDMAUD_MIDI_IN_RECORD");
  240. break;
  241. case IOCTL_WDMAUD_MIDI_IN_RESET:
  242. dprintf("IOCTL_WDMAUD_MIDI_IN_RESET");
  243. break;
  244. case IOCTL_WDMAUD_MIDI_IN_READ_PIN:
  245. dprintf("IOCTL_WDMAUD_MIDI_IN_READ_PIN");
  246. break;
  247. case IOCTL_WDMAUD_MIXER_OPEN:
  248. dprintf("IOCTL_WDMAUD_MIXER_OPEN");
  249. break;
  250. case IOCTL_WDMAUD_MIXER_CLOSE:
  251. dprintf("IOCTL_WDMAUD_MIXER_CLOSE");
  252. break;
  253. case IOCTL_WDMAUD_MIXER_GETLINEINFO:
  254. dprintf("IOCTL_WDMAUD_MIXER_GETLINEINFO");
  255. break;
  256. case IOCTL_WDMAUD_MIXER_GETLINECONTROLS:
  257. dprintf("IOCTL_WDMAUD_MIXER_GETLINECONTROLS");
  258. break;
  259. case IOCTL_WDMAUD_MIXER_GETCONTROLDETAILS:
  260. dprintf("IOCTL_WDMAUD_MIXER_GETCONTROLDETAILS");
  261. break;
  262. case IOCTL_WDMAUD_MIXER_SETCONTROLDETAILS:
  263. dprintf("IOCTL_WDMAUD_MIXER_SETCONTROLDETAILS");
  264. break;
  265. default:
  266. dprintf("UNKNOWN command %X", IoCode );
  267. break;
  268. }
  269. }
  270. VOID
  271. DumpIoctlLog (
  272. ULONG64 memLoc,
  273. ULONG flags
  274. )
  275. /*++
  276. Routine Description:
  277. This routine dumps out a list of Ioctls that have been sent down
  278. to wdmaud.sys. In debugging it is useful to see the context and
  279. request being made to wdmaud.sys to track down coding errors.
  280. Arguments:
  281. Flags - Verbose turns prints the pContext that the Ioctl was sent
  282. down with.
  283. Return Value:
  284. None
  285. --*/
  286. {
  287. LIST_ENTRY List;
  288. ULONG64 ple;
  289. ULONG64 pIoctlHistoryListItem;
  290. // IOCTL_HISTORY_LIST_ITEM IoctlHistoryBuffer;
  291. ULONG Result;
  292. WDMAUD_FLAGS Flags;
  293. ULONG IoCode, IoStatus;
  294. ULONG NextOffset;
  295. FIELD_INFO offField = {"Next", NULL, 0, DBG_DUMP_FIELD_RETURN_ADDRESS, 0, NULL};
  296. SYM_DUMP_PARAM TypeSym ={
  297. sizeof (SYM_DUMP_PARAM), "tag_IOCTL_HISTORY_LIST_ITEM", DBG_DUMP_NO_PRINT, 0,
  298. NULL, NULL, NULL, 1, &offField
  299. };
  300. // Get the offset of Next in tag_IOCTL_HISTORY_LIST_ITEM
  301. if (Ioctl(IG_DUMP_SYMBOL_INFO, &TypeSym, TypeSym.size)) {
  302. return ;
  303. }
  304. NextOffset = (ULONG) offField.address;
  305. Flags.Flags = flags;
  306. if (GetFieldValue(memLoc, "LIST_ENTRY", "Flink", ple))
  307. {
  308. dprintf("Unable to get value of WdmaIoctlHistoryListHead\n");
  309. return;
  310. }
  311. dprintf("Command history, newest first:\n");
  312. // ple = List.Flink;
  313. if (ple == 0)
  314. {
  315. dprintf("WdmaIoctlHistoryListHead is NULL!\n");
  316. return;
  317. }
  318. while (ple != memLoc)
  319. {
  320. ULONG64 pContext, pIrp;
  321. if (CheckControlC())
  322. {
  323. return;
  324. }
  325. pIoctlHistoryListItem = ple - NextOffset;
  326. if (GetFieldValue(pIoctlHistoryListItem,
  327. "tag_IOCTL_HISTORY_LIST_ITEM",
  328. "IoCode",
  329. IoCode))
  330. {
  331. dprintf("Unable to read IOCTL_HISTORY_LIST_ITEM at %08p",pIoctlHistoryListItem);
  332. return;
  333. }
  334. PrintCommand ( IoCode );
  335. GetFieldValue(pIoctlHistoryListItem,"tag_IOCTL_HISTORY_LIST_ITEM","IoStatus",IoStatus);
  336. dprintf(" Status=%08X, ", IoStatus );
  337. if ( Flags.Verbose )
  338. {
  339. GetFieldValue(pIoctlHistoryListItem,"tag_IOCTL_HISTORY_LIST_ITEM","pContext",pContext);
  340. GetFieldValue(pIoctlHistoryListItem,"tag_IOCTL_HISTORY_LIST_ITEM","pIrp",pIrp);
  341. dprintf(" pContext=%08X, Irp=%08X\n", pContext, pIrp );
  342. }
  343. else
  344. {
  345. dprintf("\n");
  346. }
  347. GetFieldValue(pIoctlHistoryListItem,"tag_IOCTL_HISTORY_LIST_ITEM", "Next.Flink", ple);
  348. }
  349. }
  350. VOID
  351. DumpPendingIrps (
  352. ULONG64 memLoc,
  353. ULONG flags
  354. )
  355. /*++
  356. Routine Description:
  357. This routine dumps out a list of Irps that WDMAUD has marked
  358. pending. WDMAUD needs to make sure that all Irps have completed
  359. for a context before allowing the context to be closed.
  360. Arguments:
  361. Flags - Verbose mode will print out the context on which this
  362. Irp was allocated.
  363. Return Value:
  364. None
  365. --*/
  366. {
  367. LIST_ENTRY List;
  368. ULONG64 ple;
  369. ULONG64 pPendingIrpListItem;
  370. // PENDING_IRP_LIST_ITEM PendingIrpBuffer;
  371. ULONG Result;
  372. WDMAUD_FLAGS Flags;
  373. ULONG NextOffset;
  374. FIELD_INFO offField = {"Next", NULL, 0, DBG_DUMP_FIELD_RETURN_ADDRESS, 0, NULL};
  375. SYM_DUMP_PARAM TypeSym ={
  376. sizeof (SYM_DUMP_PARAM), "tag_PENDING_IRP_LIST_ITEM", DBG_DUMP_NO_PRINT, 0,
  377. NULL, NULL, NULL, 1, &offField
  378. };
  379. // Get the offset of Next in tag_IOCTL_HISTORY_LIST_ITEM
  380. if (Ioctl(IG_DUMP_SYMBOL_INFO, &TypeSym, TypeSym.size)) {
  381. return ;
  382. }
  383. NextOffset = (ULONG) offField.address;
  384. Flags.Flags = flags;
  385. if (GetFieldValue(memLoc, "LIST_ENTRY", "Flink", ple))
  386. {
  387. dprintf("Unable to get value of WdmaPendingIrpListHead\n");
  388. return;
  389. }
  390. dprintf("Dumping pending irps:\n");
  391. // ple = List.Flink;
  392. if (ple == 0)
  393. {
  394. dprintf("WdmaPendingIrpListHead is NULL!\n");
  395. return;
  396. }
  397. while (ple != memLoc)
  398. {
  399. ULONG64 pIrp, pContext;
  400. ULONG IrpDeviceType;
  401. if (CheckControlC())
  402. {
  403. return;
  404. }
  405. pPendingIrpListItem = ple - NextOffset;
  406. if (GetFieldValue(pPendingIrpListItem,
  407. "tag_PENDING_IRP_LIST_ITEM",
  408. "IrpDeviceType",
  409. IrpDeviceType))
  410. {
  411. dprintf("Unable to read PENDING_IRP_LIST_ITEM at %08p",pPendingIrpListItem);
  412. return;
  413. }
  414. GetFieldValue(pPendingIrpListItem,"tag_PENDING_IRP_LIST_ITEM","pIrp",pIrp);
  415. if ( Flags.Verbose )
  416. {
  417. GetFieldValue(pPendingIrpListItem,
  418. "tag_PENDING_IRP_LIST_ITEM",
  419. "pContext",
  420. pContext);
  421. dprintf("Irp: %p, ", pIrp);
  422. switch (IrpDeviceType)
  423. {
  424. case WaveOutDevice:
  425. dprintf("IrpType: WaveOut, ");
  426. break;
  427. case WaveInDevice:
  428. dprintf("IrpType: WaveIn, ");
  429. break;
  430. case MidiOutDevice:
  431. dprintf("IrpType: MidiOut, ");
  432. break;
  433. case MidiInDevice:
  434. dprintf("IrpType: MidiIn, ");
  435. break;
  436. case MixerDevice:
  437. dprintf("IrpType: Mixer, ");
  438. break;
  439. case AuxDevice:
  440. dprintf("IrpType: Aux, ");
  441. break;
  442. default:
  443. dprintf("IrpType: Unknown, ");
  444. break;
  445. }
  446. dprintf("pContext: %p\n", pContext);
  447. }
  448. else
  449. {
  450. dprintf("Irp: %p\n", pIrp);
  451. }
  452. GetFieldValue(pPendingIrpListItem,"tag_PENDING_IRP_LIST_ITEM","Next.Flink", ple);
  453. }
  454. }
  455. VOID
  456. DumpAllocatedMdls (
  457. ULONG64 memLoc,
  458. ULONG flags
  459. )
  460. /*++
  461. Routine Description:
  462. This routine dumps out a list of MDLs that WDMAUD has allocated.
  463. WDMAUD needs to make sure that all MDLs have freed for a context
  464. before allowing the context to be closed.
  465. Arguments:
  466. Flags - Verbose mode will print out the context on which this
  467. Mdl was allocated.
  468. Return Value:
  469. None
  470. --*/
  471. {
  472. LIST_ENTRY List;
  473. ULONG64 ple;
  474. ULONG64 pAllocatedMdlListItem;
  475. // ALLOCATED_MDL_LIST_ITEM AllocatedMdlBuffer;
  476. ULONG Result;
  477. WDMAUD_FLAGS Flags;
  478. ULONG NextOffset;
  479. FIELD_INFO offField = {"Next", NULL, 0, DBG_DUMP_FIELD_RETURN_ADDRESS, 0, NULL};
  480. SYM_DUMP_PARAM TypeSym ={
  481. sizeof (SYM_DUMP_PARAM), "ALLOCATED_MDL_LIST_ITEM", DBG_DUMP_NO_PRINT, 0,
  482. NULL, NULL, NULL, 1, &offField
  483. };
  484. // Get the offset of Next in tag_IOCTL_HISTORY_LIST_ITEM
  485. if (Ioctl(IG_DUMP_SYMBOL_INFO, &TypeSym, TypeSym.size)) {
  486. return ;
  487. }
  488. NextOffset = (ULONG) offField.address;
  489. Flags.Flags = flags;
  490. if (GetFieldValue(memLoc, "LIST_ENTRY", "Flink", ple))
  491. {
  492. dprintf("Unable to get value of WdmaPendingIrpListHead\n");
  493. return;
  494. }
  495. dprintf("Dumping allocated Mdls:\n");
  496. // ple = List.Flink;
  497. if (ple == 0)
  498. {
  499. dprintf("WdmaPendingIrpListHead is NULL!\n");
  500. return;
  501. }
  502. while (ple != memLoc)
  503. {
  504. ULONG64 pMdl, pContext;
  505. ULONG IrpDeviceType;
  506. if (CheckControlC())
  507. {
  508. return;
  509. }
  510. pAllocatedMdlListItem = ple - NextOffset;
  511. if (GetFieldValue(pAllocatedMdlListItem,
  512. "ALLOCATED_MDL_LIST_ITEM",
  513. "pMdl",
  514. pMdl))
  515. {
  516. dprintf("Unable to read ALLOCATED_MDL_LIST_ITEM at %08p",pAllocatedMdlListItem);
  517. return;
  518. }
  519. if ( Flags.Verbose )
  520. {
  521. GetFieldValue(pAllocatedMdlListItem,"ALLOCATED_MDL_LIST_ITEM","pContext",pContext);
  522. dprintf("Mdl: %p, pContext: %p\n", pMdl,
  523. pContext);
  524. }
  525. else
  526. {
  527. dprintf("Mdl: %p\n", pMdl);
  528. }
  529. GetFieldValue(pAllocatedMdlListItem,"ALLOCATED_MDL_LIST_ITEM","Next.Flink", ple);
  530. }
  531. }
  532. VOID
  533. DumpContextList (
  534. ULONG64 memLoc,
  535. ULONG flags
  536. )
  537. /*++
  538. Routine Description:
  539. This routine dumps out a list of active contexts attached to wdmaud.sys.
  540. The contexts contain most of the state data for each device. Whenever
  541. wdmaud.drv is loaded into a new process, wdmaud.sys will be notified
  542. of its arrival. When wdmaud.drv is unload, wdmaud.sys cleans up any
  543. allocation made in that context.
  544. Arguments:
  545. Flags - Verbose mode will print out the data members of each
  546. context structure.
  547. Return Value:
  548. None
  549. --*/
  550. {
  551. LIST_ENTRY List;
  552. ULONG64 ple;
  553. ULONG64 pWdmaContextListItem;
  554. // WDMACONTEXT WdmaContextBuffer;
  555. ULONG Result;
  556. WDMAUD_FLAGS Flags;
  557. ULONG NextOffset;
  558. FIELD_INFO offField = {"Next", NULL, 0, DBG_DUMP_FIELD_RETURN_ADDRESS, 0, NULL};
  559. SYM_DUMP_PARAM TypeSym ={
  560. sizeof (SYM_DUMP_PARAM), "WDMACONTEXT", DBG_DUMP_NO_PRINT, 0,
  561. NULL, NULL, NULL, 1, &offField
  562. };
  563. // Get the offset of Next in WDMACONTEXT
  564. if (Ioctl(IG_DUMP_SYMBOL_INFO, &TypeSym, TypeSym.size)) {
  565. return ;
  566. }
  567. NextOffset = (ULONG) offField.address;
  568. Flags.Flags = flags;
  569. if (GetFieldValue(memLoc, "LIST_ENTRY", "Flink", ple))
  570. {
  571. dprintf("Unable to get value of WdmaContextListHead\n");
  572. return;
  573. }
  574. dprintf("Dumping list of active WDMAUD contexts:\n");
  575. // ple = List.Flink;
  576. if (ple == 0)
  577. {
  578. dprintf("WdmaAllocatedMdlListHead is NULL!\n");
  579. return;
  580. }
  581. while (ple != memLoc)
  582. {
  583. ULONG64 pContext;
  584. if (CheckControlC())
  585. {
  586. return;
  587. }
  588. pWdmaContextListItem = ple - NextOffset;
  589. if (GetFieldValue(pWdmaContextListItem,
  590. "WDMACONTEXT",
  591. "Next.Flink",
  592. ple))
  593. {
  594. dprintf("Unable to read WDMACONTEXT at %08lx",pWdmaContextListItem);
  595. return;
  596. }
  597. if ( Flags.Verbose )
  598. {
  599. dprintf("Use dt WDMACONTEXT <addr>\n");
  600. /* dprintf("pContext: %X\n", pWdmaContextListItem);
  601. dprintf(" fInList: %X\n", WdmaContextBuffer.fInList);
  602. dprintf(" fInitializeSysaudio: %X\n", WdmaContextBuffer.fInitializeSysaudio);
  603. dprintf(" InitializedSysaudioEvent: %X\n", &WdmaContextBuffer.InitializedSysaudioEvent);
  604. dprintf(" pFileObjectSysaudio: %X\n", WdmaContextBuffer.pFileObjectSysaudio);
  605. dprintf(" EventData: %X\n", &WdmaContextBuffer.EventData);
  606. dprintf(" VirtualWavePinId: %X\n", WdmaContextBuffer.VirtualWavePinId);
  607. dprintf(" VirtualMidiPinId: %X\n", WdmaContextBuffer.VirtualMidiPinId);
  608. dprintf(" PreferredSysaudioWaveDevice:%X\n", WdmaContextBuffer.PreferredSysaudioWaveDevice);
  609. dprintf(" DevNodeListHead: %X\n", WdmaContextBuffer.DevNodeListHead);
  610. dprintf(" NotificationEntry: %X\n", WdmaContextBuffer.NotificationEntry);
  611. dprintf(" WorkListWorkItem: %X\n", WdmaContextBuffer.WorkListWorkItem);
  612. dprintf(" WorkListHead: %X\n", WdmaContextBuffer.WorkListHead);
  613. dprintf(" WorkListSpinLock: %X\n", WdmaContextBuffer.WorkListSpinLock);
  614. dprintf(" cPendingWorkList: %X\n", WdmaContextBuffer.cPendingWorkList);
  615. dprintf(" SysaudioWorkItem: %X\n", WdmaContextBuffer.SysaudioWorkItem);
  616. dprintf(" WorkListWorkerObject: %X\n", WdmaContextBuffer.WorkListWorkerObject);
  617. dprintf(" SysaudioWorkerObject: %X\n", WdmaContextBuffer.SysaudioWorkerObject);
  618. dprintf(" WaveOutDevs: %X\n", &WdmaContextBuffer.WaveOutDevs);
  619. dprintf(" WaveInDevs: %X\n", &WdmaContextBuffer.WaveInDevs);
  620. dprintf(" MidiOutDevs: %X\n", &WdmaContextBuffer.MidiOutDevs);
  621. dprintf(" MidiInDevs: %X\n", &WdmaContextBuffer.MidiInDevs);
  622. dprintf(" MixerDevs: %X\n", &WdmaContextBuffer.MixerDevs);
  623. dprintf(" AuxDevs: %X\n", &WdmaContextBuffer.AuxDevs);
  624. dprintf(" apCommonDevice: %X\n", &WdmaContextBuffer.apCommonDevice);*/
  625. }
  626. else
  627. {
  628. dprintf("pContext: %p\n", pWdmaContextListItem);
  629. }
  630. // ple = WdmaContextBuffer.Next.Flink;
  631. }
  632. }