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.

563 lines
20 KiB

  1. /*==========================================================================;
  2. *
  3. * mmddk.h -- Include file for Multimedia Device Development
  4. *
  5. * Version 4.00
  6. *
  7. * Copyright (C) 1992-1994 Microsoft Corporation. All rights reserved.
  8. *
  9. *--------------------------------------------------------------------------;
  10. * Note: You must include the WINDOWS.H and MMSYSTEM.H header files
  11. * before including this file.
  12. *
  13. * Define: Prevent inclusion of:
  14. * -------------- --------------------------------------------------------
  15. * MMNOMIDIDEV MIDI support
  16. * MMNOWAVEDEV Waveform support
  17. * MMNOAUXDEV Auxiliary output support
  18. * MMNOMIXERDEV Mixer support
  19. * MMNOTIMERDEV Timer support
  20. * MMNOJOYDEV Joystick support
  21. * MMNOMCIDEV MCI support
  22. * MMNOTASKDEV Task support
  23. *
  24. *==========================================================================;
  25. */
  26. #ifndef _INC_MMDDK
  27. #define _INC_MMDDK /* #defined if mmddk.h has been included */
  28. #ifndef RC_INVOKED
  29. #pragma pack(1) /* Assume byte packing throughout */
  30. #endif
  31. #ifdef __cplusplus
  32. extern "C" { /* Assume C declarations for C++ */
  33. #endif /* __cplusplus */
  34. /***************************************************************************
  35. Helper functions for drivers
  36. ***************************************************************************/
  37. #ifdef WIN32
  38. #ifndef NODRIVERS
  39. #define DRV_LOAD 0x0001
  40. #define DRV_ENABLE 0x0002
  41. #define DRV_OPEN 0x0003
  42. #define DRV_CLOSE 0x0004
  43. #define DRV_DISABLE 0x0005
  44. #define DRV_FREE 0x0006
  45. #define DRV_CONFIGURE 0x0007
  46. #define DRV_QUERYCONFIGURE 0x0008
  47. #define DRV_INSTALL 0x0009
  48. #define DRV_REMOVE 0x000A
  49. #define DRV_RESERVED 0x0800
  50. #define DRV_USER 0x4000
  51. #define DRIVERS_SECTION TEXT("DRIVERS32") // Section name for installed drivers
  52. #define MCI_SECTION TEXT("MCI32") // Section name for installed MCI drivers
  53. LRESULT WINAPI DefDriverProc(DWORD dwDriverIdentifier, HDRVR hdrvr, UINT uMsg, LPARAM lParam1, LPARAM lParam2);
  54. #endif /* !NODRIVERS */
  55. #endif /* ifdef WIN32 */
  56. #if (WINVER < 0x0400)
  57. #define DCB_NOSWITCH 0x0008 /* obsolete switch */
  58. #endif
  59. #define DCB_TYPEMASK 0x0007 /* callback type mask */
  60. #define DCB_NULL 0x0000 /* unknown callback type */
  61. /* flags for wFlags parameter of DriverCallback() */
  62. #define DCB_WINDOW 0x0001 /* dwCallback is a HWND */
  63. #define DCB_TASK 0x0002 /* dwCallback is a HTASK */
  64. #define DCB_FUNCTION 0x0003 /* dwCallback is a FARPROC */
  65. #define DCB_WINDOW32 0x0004 /* dwCallback is a WINDOW */ /* ;Internal */
  66. BOOL WINAPI DriverCallback(DWORD dwCallback, UINT uFlags,
  67. HANDLE hDevice, UINT uMessage, DWORD dwUser, DWORD dwParam1, DWORD dwParam2);
  68. #if (WINVER < 0x0400)
  69. void WINAPI StackEnter(void);
  70. void WINAPI StackLeave(void);
  71. #endif
  72. /* generic prototype for audio device driver entry-point functions */
  73. /* midMessage(), modMessage(), widMessage(), wodMessage(), auxMessage() */
  74. typedef DWORD (CALLBACK SOUNDDEVMSGPROC)(UINT uDeviceID, UINT uMessage,
  75. DWORD dwInstance, DWORD dwParam1, DWORD dwParam2);
  76. typedef SOUNDDEVMSGPROC FAR *LPSOUNDDEVMSGPROC;
  77. /*
  78. * Message sent by mmsystem to media specific entry points when it first
  79. * initializes the drivers, and when they are closed.
  80. */
  81. #define DRVM_INIT 100
  82. #define DRVM_EXIT 101
  83. // message base for driver specific messages.
  84. //
  85. #define DRVM_MAPPER 0x2000
  86. #define DRVM_USER 0x4000
  87. #define DRVM_MAPPER_STATUS (DRVM_MAPPER+0)
  88. #define DRVM_MAPPER_RECONFIGURE (DRVM_MAPPER+1)
  89. #if (WINVER >= 0x0400)
  90. #define DRV_QUERYDRVENTRY (DRV_RESERVED + 1)
  91. #define DRV_QUERYDEVNODE (DRV_RESERVED + 2)
  92. #define DRV_QUERYNAME (DRV_RESERVED + 3)
  93. #define DRV_F_ADD 0x00000000
  94. #define DRV_F_REMOVE 0x00000001
  95. #define DRV_F_CHANGE 0x00000002
  96. #define DRV_F_PROP_INSTR 0x00000004
  97. #define DRV_F_PARAM_IS_DEVNODE 0x10000000
  98. #endif
  99. /* PnP version of device caps */
  100. typedef struct {
  101. DWORD cbSize;
  102. LPVOID pCaps;
  103. } DEVICECAPSEX;
  104. #ifndef MMNOWAVEDEV
  105. /****************************************************************************
  106. Waveform device driver support
  107. ****************************************************************************/
  108. /* maximum number of wave device drivers loaded */
  109. #define MAXWAVEDRIVERS 10
  110. /* waveform input and output device open information structure */
  111. typedef struct waveopendesc_tag {
  112. HWAVE hWave; /* handle */
  113. const WAVEFORMAT FAR* lpFormat; /* format of wave data */
  114. DWORD dwCallback; /* callback */
  115. DWORD dwInstance; /* app's private instance information */
  116. UINT uMappedDeviceID; /* device to map to if WAVE_MAPPED set */
  117. DWORD dnDevNode; /* if device is PnP */
  118. } WAVEOPENDESC;
  119. typedef WAVEOPENDESC FAR *LPWAVEOPENDESC;
  120. #define WODM_USER DRVM_USER
  121. #define WIDM_USER DRVM_USER
  122. #define WODM_MAPPER DRVM_MAPPER
  123. #define WIDM_MAPPER DRVM_MAPPER
  124. #define WODM_INIT DRVM_INIT
  125. #define WIDM_INIT DRVM_INIT
  126. /* messages sent to wodMessage() entry-point function */
  127. #define WODM_GETNUMDEVS 3
  128. #define WODM_GETDEVCAPS 4
  129. #define WODM_OPEN 5
  130. #define WODM_CLOSE 6
  131. #define WODM_PREPARE 7
  132. #define WODM_UNPREPARE 8
  133. #define WODM_WRITE 9
  134. #define WODM_PAUSE 10
  135. #define WODM_RESTART 11
  136. #define WODM_RESET 12
  137. #define WODM_GETPOS 13
  138. #define WODM_GETPITCH 14
  139. #define WODM_SETPITCH 15
  140. #define WODM_GETVOLUME 16
  141. #define WODM_SETVOLUME 17
  142. #define WODM_GETPLAYBACKRATE 18
  143. #define WODM_SETPLAYBACKRATE 19
  144. #define WODM_BREAKLOOP 20
  145. #if (WINVER >= 0x0400)
  146. #define WODM_MAPPER_STATUS (DRVM_MAPPER_STATUS + 0)
  147. #define WAVEOUT_MAPPER_STATUS_DEVICE 0
  148. #define WAVEOUT_MAPPER_STATUS_MAPPED 1
  149. #define WAVEOUT_MAPPER_STATUS_FORMAT 2
  150. #endif
  151. /* messages sent to widMessage() entry-point function */
  152. #define WIDM_GETNUMDEVS 50
  153. #define WIDM_GETDEVCAPS 51
  154. #define WIDM_OPEN 52
  155. #define WIDM_CLOSE 53
  156. #define WIDM_PREPARE 54
  157. #define WIDM_UNPREPARE 55
  158. #define WIDM_ADDBUFFER 56
  159. #define WIDM_START 57
  160. #define WIDM_STOP 58
  161. #define WIDM_RESET 59
  162. #define WIDM_GETPOS 60
  163. #if (WINVER >= 0x0400)
  164. #define WIDM_MAPPER_STATUS (DRVM_MAPPER_STATUS + 0)
  165. #define WAVEIN_MAPPER_STATUS_DEVICE 0
  166. #define WAVEIN_MAPPER_STATUS_MAPPED 1
  167. #define WAVEIN_MAPPER_STATUS_FORMAT 2
  168. #endif
  169. #endif /*ifndef MMNOWAVEDEV */
  170. #ifndef MMNOMIDIDEV
  171. /****************************************************************************
  172. MIDI device driver support
  173. ****************************************************************************/
  174. /* maximum number of MIDI device drivers loaded */
  175. #define MAXMIDIDRIVERS 10
  176. #define MODM_USER DRVM_USER
  177. #define MIDM_USER DRVM_USER
  178. #define MODM_MAPPER DRVM_MAPPER
  179. #define MIDM_MAPPER DRVM_MAPPER
  180. #define MODM_INIT DRVM_INIT
  181. #define MIDM_INIT DRVM_INIT
  182. /* MIDI input and output device open information structure */
  183. typedef struct midiopendesc_tag {
  184. HMIDI hMidi; /* handle */
  185. DWORD dwCallback; /* callback */
  186. DWORD dwInstance; /* app's private instance information */
  187. UINT uMappedDeviceID; /* device to map to if WAVE_MAPPED set */
  188. DWORD dnDevNode; /* if device is PnP */
  189. } MIDIOPENDESC;
  190. typedef MIDIOPENDESC FAR *LPMIDIOPENDESC;
  191. #if (WINVER >= 0x0400)
  192. /* structure pointed to by lParam1 for MODM_GET/MODM_SETTIMEPARMS */
  193. typedef struct miditimeparms_tag {
  194. DWORD dwTimeDivision; /* time division ala MIDI file spec */
  195. DWORD dwTempo; /* tempo ala MIDI file spec */
  196. } MIDITIMEPARMS,
  197. FAR *LPMIDITIMEPARMS;
  198. #endif
  199. /* messages sent to modMessage() entry-point function */
  200. #define MODM_GETNUMDEVS 1
  201. #define MODM_GETDEVCAPS 2
  202. #define MODM_OPEN 3
  203. #define MODM_CLOSE 4
  204. #define MODM_PREPARE 5
  205. #define MODM_UNPREPARE 6
  206. #define MODM_DATA 7
  207. #define MODM_LONGDATA 8
  208. #define MODM_RESET 9
  209. #define MODM_GETVOLUME 10
  210. #define MODM_SETVOLUME 11
  211. #define MODM_CACHEPATCHES 12
  212. #define MODM_CACHEDRUMPATCHES 13
  213. #if (WINVER >= 0x0400)
  214. #define MODM_POLYMSG 14
  215. //#define MODM_SETTIMEPARMS 15
  216. //#define MODM_GETTIMEPARMS 16
  217. #define MODM_GETPOS 17
  218. #define MODM_PAUSE 18
  219. #define MODM_RESTART 19
  220. #define MODM_STOP 20
  221. #define MODM_PROPERTIES 21
  222. #define MODM_RECONFIGURE (MODM_USER+0x0768)
  223. #endif
  224. /* messages sent to midMessage() entry-point function */
  225. #define MIDM_GETNUMDEVS 53
  226. #define MIDM_GETDEVCAPS 54
  227. #define MIDM_OPEN 55
  228. #define MIDM_CLOSE 56
  229. #define MIDM_PREPARE 57
  230. #define MIDM_UNPREPARE 58
  231. #define MIDM_ADDBUFFER 59
  232. #define MIDM_START 60
  233. #define MIDM_STOP 61
  234. #define MIDM_RESET 62
  235. #if (WINVER >= 0x0400)
  236. //#define MIDM_SETTIMEPARMS 63
  237. //#define MIDM_GETTIMEPARMS 64 /* Who will need to call this? */
  238. #define MIDM_GETPOS 65
  239. #define MIDM_PROPERTIES 66
  240. #endif
  241. #endif /*ifndef MMNOMIDIDEV */
  242. #ifndef MMNOAUXDEV
  243. /****************************************************************************
  244. Auxiliary audio device driver support
  245. ****************************************************************************/
  246. /* maximum number of auxiliary device drivers loaded */
  247. #define MAXAUXDRIVERS 10
  248. #define AUXM_INIT DRVM_INIT
  249. #define AUXM_USER DRVM_USER
  250. #define AUXDM_MAPPER DRVM_MAPPER
  251. /* messages sent to auxMessage() entry-point function */
  252. #define AUXDM_GETNUMDEVS 3
  253. #define AUXDM_GETDEVCAPS 4
  254. #define AUXDM_GETVOLUME 5
  255. #define AUXDM_SETVOLUME 6
  256. #endif /*ifndef MMNOAUXDEV */
  257. #ifndef MMNOMIXERDEV
  258. #if (WINVER >= 0x0400)
  259. /****************************************************************************
  260. Mixer Driver Support
  261. ****************************************************************************/
  262. //
  263. // maximum number of mixer drivers that can be loaded by MSMIXMGR.DLL
  264. //
  265. #define MAXMIXERDRIVERS 10
  266. //
  267. // mixer device open information structure
  268. //
  269. //
  270. typedef struct tMIXEROPENDESC
  271. {
  272. HMIXER hmx; // handle that will be used
  273. LPVOID pReserved0; // reserved--driver should ignore
  274. DWORD dwCallback; // callback
  275. DWORD dwInstance; // app's private instance information
  276. DWORD dnDevNode; // if device is PnP
  277. } MIXEROPENDESC, *PMIXEROPENDESC, FAR *LPMIXEROPENDESC;
  278. //
  279. //
  280. //
  281. //
  282. #define MXDM_INIT DRVM_INIT
  283. #define MXDM_USER DRVM_USER
  284. #define MXDM_MAPPER DRVM_MAPPER
  285. #define MXDM_BASE (1)
  286. #define MXDM_GETNUMDEVS (MXDM_BASE + 0)
  287. #define MXDM_GETDEVCAPS (MXDM_BASE + 1)
  288. #define MXDM_OPEN (MXDM_BASE + 2)
  289. #define MXDM_CLOSE (MXDM_BASE + 3)
  290. #define MXDM_GETLINEINFO (MXDM_BASE + 4)
  291. #define MXDM_GETLINECONTROLS (MXDM_BASE + 5)
  292. #define MXDM_GETCONTROLDETAILS (MXDM_BASE + 6)
  293. #define MXDM_SETCONTROLDETAILS (MXDM_BASE + 7)
  294. #endif /* ifdef WINVER >= 0x0400 */
  295. #endif /* ifndef MMNOMIXERDEV */
  296. #ifndef MMNOTIMERDEV
  297. /****************************************************************************
  298. Timer device driver support
  299. ****************************************************************************/
  300. typedef struct timerevent_tag {
  301. UINT wDelay; /* delay required */
  302. UINT wResolution; /* resolution required */
  303. LPTIMECALLBACK lpFunction; /* ptr to callback function */
  304. DWORD dwUser; /* user DWORD */
  305. UINT wFlags; /* defines how to program event */
  306. } TIMEREVENT;
  307. typedef TIMEREVENT FAR *LPTIMEREVENT;
  308. /* messages sent to tddMessage() function */
  309. #define TDD_KILLTIMEREVENT (DRV_RESERVED + 0) /* indices into a table of */
  310. #define TDD_SETTIMEREVENT (DRV_RESERVED + 4) /* functions; thus offset by */
  311. #define TDD_GETSYSTEMTIME (DRV_RESERVED + 8) /* four each time... */
  312. #define TDD_GETDEVCAPS (DRV_RESERVED + 12) /* room for future expansion */
  313. #define TDD_BEGINMINPERIOD (DRV_RESERVED + 16) /* room for future expansion */
  314. #define TDD_ENDMINPERIOD (DRV_RESERVED + 20) /* room for future expansion */
  315. #endif /*ifndef MMNOTIMERDEV */
  316. #ifndef MMNOJOYDEV
  317. /****************************************************************************
  318. Joystick device driver support
  319. ****************************************************************************/
  320. /* joystick calibration info structure */
  321. typedef struct joycalibrate_tag {
  322. UINT wXbase;
  323. UINT wXdelta;
  324. UINT wYbase;
  325. UINT wYdelta;
  326. UINT wZbase;
  327. UINT wZdelta;
  328. } JOYCALIBRATE;
  329. typedef JOYCALIBRATE FAR *LPJOYCALIBRATE;
  330. /* prototype for joystick message function */
  331. typedef UINT (CALLBACK JOYDEVMSGPROC)(DWORD dwID, UINT uMessage, LPARAM lParam1, LPARAM lParam2);
  332. typedef JOYDEVMSGPROC FAR *LPJOYDEVMSGPROC;
  333. /* messages sent to joystick driver's DriverProc() function */
  334. #define JDD_GETNUMDEVS (DRV_RESERVED + 0x0001)
  335. #define JDD_GETDEVCAPS (DRV_RESERVED + 0x0002)
  336. #define JDD_GETPOS (DRV_RESERVED + 0x0101)
  337. #define JDD_SETCALIBRATION (DRV_RESERVED + 0x0102)
  338. #endif /*ifndef MMNOJOYDEV */
  339. #ifndef MMNOMCIDEV
  340. /****************************************************************************
  341. MCI device driver support
  342. ****************************************************************************/
  343. /* internal MCI messages */
  344. #define MCI_OPEN_DRIVER (DRV_RESERVED + 0x0001)
  345. #define MCI_CLOSE_DRIVER (DRV_RESERVED + 0x0002)
  346. #define MAKEMCIRESOURCE(wRet, wRes) MAKELRESULT((wRet), (wRes))
  347. /* string return values only used with MAKEMCIRESOURCE */
  348. #define MCI_FALSE (MCI_STRING_OFFSET + 19)
  349. #define MCI_TRUE (MCI_STRING_OFFSET + 20)
  350. /* resource string return values */
  351. #define MCI_FORMAT_RETURN_BASE MCI_FORMAT_MILLISECONDS_S
  352. #define MCI_FORMAT_MILLISECONDS_S (MCI_STRING_OFFSET + 21)
  353. #define MCI_FORMAT_HMS_S (MCI_STRING_OFFSET + 22)
  354. #define MCI_FORMAT_MSF_S (MCI_STRING_OFFSET + 23)
  355. #define MCI_FORMAT_FRAMES_S (MCI_STRING_OFFSET + 24)
  356. #define MCI_FORMAT_SMPTE_24_S (MCI_STRING_OFFSET + 25)
  357. #define MCI_FORMAT_SMPTE_25_S (MCI_STRING_OFFSET + 26)
  358. #define MCI_FORMAT_SMPTE_30_S (MCI_STRING_OFFSET + 27)
  359. #define MCI_FORMAT_SMPTE_30DROP_S (MCI_STRING_OFFSET + 28)
  360. #define MCI_FORMAT_BYTES_S (MCI_STRING_OFFSET + 29)
  361. #define MCI_FORMAT_SAMPLES_S (MCI_STRING_OFFSET + 30)
  362. #define MCI_FORMAT_TMSF_S (MCI_STRING_OFFSET + 31)
  363. #define MCI_VD_FORMAT_TRACK_S (MCI_VD_OFFSET + 5)
  364. #define WAVE_FORMAT_PCM_S (MCI_WAVE_OFFSET + 0)
  365. #define WAVE_MAPPER_S (MCI_WAVE_OFFSET + 1)
  366. #define MCI_SEQ_MAPPER_S (MCI_SEQ_OFFSET + 5)
  367. #define MCI_SEQ_FILE_S (MCI_SEQ_OFFSET + 6)
  368. #define MCI_SEQ_MIDI_S (MCI_SEQ_OFFSET + 7)
  369. #define MCI_SEQ_SMPTE_S (MCI_SEQ_OFFSET + 8)
  370. #define MCI_SEQ_FORMAT_SONGPTR_S (MCI_SEQ_OFFSET + 9)
  371. #define MCI_SEQ_NONE_S (MCI_SEQ_OFFSET + 10)
  372. #define MIDIMAPPER_S (MCI_SEQ_OFFSET + 11)
  373. /* parameters for internal version of MCI_OPEN message sent from */
  374. /* mciOpenDevice() to the driver */
  375. typedef struct {
  376. MCIDEVICEID wDeviceID; /* device ID */
  377. LPCSTR lpstrParams; /* parameter string for entry in SYSTEM.INI */
  378. UINT wCustomCommandTable; /* custom command table (0xFFFF if none) */
  379. /* filled in by the driver */
  380. UINT wType; /* driver type */
  381. /* filled in by the driver */
  382. } MCI_OPEN_DRIVER_PARMS,
  383. FAR *LPMCI_OPEN_DRIVER_PARMS;
  384. /* maximum length of an MCI device type */
  385. #define MCI_MAX_DEVICE_TYPE_LENGTH 80
  386. /* flags for mciSendCommandInternal() which direct mciSendString() how to */
  387. /* interpret the return value */
  388. #define MCI_RESOURCE_RETURNED 0x00010000 /* resource ID */
  389. #define MCI_COLONIZED3_RETURN 0x00020000 /* colonized ID, 3 bytes data */
  390. #define MCI_COLONIZED4_RETURN 0x00040000 /* colonized ID, 4 bytes data */
  391. #define MCI_INTEGER_RETURNED 0x00080000 /* integer conversion needed */
  392. #define MCI_RESOURCE_DRIVER 0x00100000 /* driver owns returned resource */
  393. /* invalid command table ID */
  394. #define MCI_NO_COMMAND_TABLE -1
  395. /* command table information type tags */
  396. #define MCI_COMMAND_HEAD 0
  397. #define MCI_STRING 1
  398. #define MCI_INTEGER 2
  399. #define MCI_END_COMMAND 3
  400. #define MCI_RETURN 4
  401. #define MCI_FLAG 5
  402. #define MCI_END_COMMAND_LIST 6
  403. #define MCI_RECT 7
  404. #define MCI_CONSTANT 8
  405. #define MCI_END_CONSTANT 9
  406. /* function prototypes for MCI driver functions */
  407. DWORD WINAPI mciGetDriverData(UINT uDeviceID);
  408. BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD dwData);
  409. UINT WINAPI mciDriverYield(UINT uDeviceID);
  410. BOOL WINAPI mciDriverNotify(HWND hwndCallback, UINT uDeviceID,
  411. UINT uStatus);
  412. #ifdef WIN32
  413. UINT WINAPI mciLoadCommandResource(HINSTANCE hInstance, LPCWSTR lpResName, UINT uType);
  414. #else
  415. UINT WINAPI mciLoadCommandResource(HINSTANCE hInstance, LPCSTR lpResName, UINT uType);
  416. #endif
  417. BOOL WINAPI mciFreeCommandResource(UINT uTable);
  418. #endif /*ifndef MMNOMCIDEV */
  419. #ifndef MMNOTASKDEV
  420. /*****************************************************************************
  421. Task support
  422. *****************************************************************************/
  423. /* error return values */
  424. #define TASKERR_NOTASKSUPPORT 1
  425. #define TASKERR_OUTOFMEMORY 2
  426. /* task support function prototypes */
  427. #ifdef BUILDDLL /* ;Internal */
  428. typedef void (FAR PASCAL TASKCALLBACK) (DWORD dwInst); /* ;Internal */
  429. #else /*ifdef BUILDDLL*/ /* ;Internal */
  430. typedef void (CALLBACK TASKCALLBACK) (DWORD dwInst);
  431. #endif /*ifdef BUILDDLL*/ /* ;Internal */
  432. typedef TASKCALLBACK FAR *LPTASKCALLBACK;
  433. UINT WINAPI mmTaskCreate(LPTASKCALLBACK lpfnTaskProc, HTASK FAR * lphTask, DWORD dwInst);
  434. UINT WINAPI mmTaskBlock(HTASK h);
  435. BOOL WINAPI mmTaskSignal(HTASK h);
  436. void WINAPI mmTaskYield(void);
  437. HTASK WINAPI mmGetCurrentTask(void);
  438. #endif /*ifndef MMNOTASKDEV */
  439. #define MMDDKINC /* ;Internal */
  440. #ifdef __cplusplus
  441. } /* End of extern "C" { */
  442. #endif /* __cplusplus */
  443. #ifndef RC_INVOKED
  444. #pragma pack() /* Revert to default packing */
  445. #endif
  446. #endif /* _INC_MMDDK */