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.

557 lines
20 KiB

  1. /*
  2. mmsysi.h
  3. private include file for mm kitchen sink
  4. */
  5. #include <logerror.h>
  6. #ifdef DEBUG
  7. #define DEBUG_RETAIL
  8. #endif
  9. #define WinFlags (WORD)(&__WinFlags)
  10. extern short pascal __WinFlags;
  11. extern HINSTANCE ghInst;
  12. // Define the product version to be returned from
  13. // mmsystemgetversion and any other messagebox or
  14. // API that needs the public product version.
  15. #define MMSYSTEM_VERSION 0X0101
  16. #define MM_SND_PLAY (WM_MM_RESERVED_FIRST+0x2B)
  17. /* -------------------------------------------------------------------------
  18. ** Thunking stuff
  19. ** -------------------------------------------------------------------------
  20. */
  21. DWORD
  22. mciAppExit(
  23. HTASK hTask
  24. );
  25. /****************************************************************************
  26. external interupt time data (in INTDS)
  27. this global data is in the FIXED DATA SEGMENT.
  28. ****************************************************************************/
  29. extern WORD FAR PASCAL gwStackFrames; // in STACK.ASM
  30. extern WORD FAR PASCAL gwStackSize; // in STACK.ASM
  31. extern HGLOBAL FAR PASCAL gwStackSelector; // in STACK.ASM
  32. extern WORD FAR PASCAL gwStackUse; // in STACK.ASM
  33. extern HLOCAL FAR PASCAL hdrvDestroy; // in STACK.ASM
  34. extern HDRVR FAR PASCAL hTimeDrv; // in TIMEA.ASM
  35. extern FARPROC FAR PASCAL lpTimeMsgProc; // in TIMEA.ASM
  36. extern WORD FAR PASCAL fDebugOutput; // in COMM.ASM
  37. /****************************************************************************
  38. KERNEL APIs we use that are not in WINDOWS.H
  39. ****************************************************************************/
  40. //extern long WINAPI _hread(HFILE, void _huge*, long);
  41. //extern long WINAPI _hwrite(HFILE, const void _huge*, long);
  42. extern UINT FAR PASCAL LocalCountFree(void);
  43. extern UINT FAR PASCAL LocalHeapSize(void);
  44. /****************************************************************************
  45. API to install/remove a MMSYS driver
  46. ****************************************************************************/
  47. #define MMDRVI_TYPE 0x000F // low 4 bits give driver type
  48. #define MMDRVI_WAVEIN 0x0001
  49. #define MMDRVI_WAVEOUT 0x0002
  50. #define MMDRVI_MIDIIN 0x0003
  51. #define MMDRVI_MIDIOUT 0x0004
  52. #define MMDRVI_AUX 0x0005
  53. #define MMDRVI_MAPPER 0x8000 // install this driver as the mapper
  54. #define MMDRVI_HDRV 0x4000 // hDriver is a installable driver
  55. #define MMDRVI_REMOVE 0x2000 // remove the driver
  56. // generic prototype for audio device driver entry-point functions
  57. // midMessage(), modMessage(), widMessage(), wodMessage(), auxMessage()
  58. typedef DWORD (CALLBACK *DRIVERMSGPROC)(UINT wDeviceID, UINT message, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2);
  59. BOOL WINAPI mmDrvInstall(HANDLE hDriver, DRIVERMSGPROC *drvMessage, UINT wFlags);
  60. HDRVR NEAR PASCAL mmDrvOpen( LPSTR szAlias );
  61. /****************************************************************************
  62. ****************************************************************************/
  63. //
  64. // exclude some stuff if MMDDK.H is not included
  65. //
  66. #ifdef MMDDKINC // use this to test for MMDDK.H
  67. //
  68. // note this must be the same as MIDIDRV/WAVEDRV/AUXDRV
  69. //
  70. typedef struct {
  71. HDRVR hDriver; // handle to the module
  72. DRIVERMSGPROC drvMessage; // pointer to entry point
  73. BYTE bNumDevs; // number of devices supported
  74. BYTE bUsage; // usage count (number of handle's open)
  75. } MMDRV, *PMMDRV;
  76. #ifndef MMNOMIDI
  77. typedef MMDRV MIDIDRV, *PMIDIDRV;
  78. #endif //ifndef MMNOMIDI
  79. #ifndef MMNOWAVE
  80. typedef MMDRV WAVEDRV, *PWAVEDRV;
  81. //
  82. // Wave Mapper support
  83. //
  84. extern LPSOUNDDEVMSGPROC PASCAL wodMapper;
  85. extern LPSOUNDDEVMSGPROC PASCAL widMapper;
  86. #endif //ifndef MMNOWAVE
  87. #ifndef MMNOAUX
  88. typedef MMDRV AUXDRV, *PAUXDRV;
  89. #endif //ifndef MMNOAUX
  90. #ifdef DEBUG_RETAIL
  91. extern BYTE fIdReverse;
  92. #endif //ifdef DEBUG_RETAIL
  93. #endif //ifdef MMDDKINC
  94. /****************************************************************************
  95. prototypes
  96. ****************************************************************************/
  97. BOOL FAR PASCAL JoyInit(void);
  98. BOOL NEAR PASCAL TimeInit(void);
  99. BOOL NEAR PASCAL MCIInit(void);
  100. void NEAR PASCAL MCITerminate(void);
  101. BOOL FAR PASCAL StackInit(void); // in init.c
  102. #define IDS_TASKSTUB 2000
  103. #define STR_MCIUNKNOWN 2001
  104. //#define STR_WAVEINPUT 2004
  105. //#define STR_WAVEOUTPUT 2005
  106. //#define STR_MIDIINPUT 2006
  107. //#define STR_MIDIOUTPUT 2007
  108. #ifdef DEBUG
  109. #define STR_MCISSERRTXT 2009
  110. #define STR_MCISCERRTXT 2010
  111. #endif
  112. #define MAXPATHLEN 157 // 144 chars + "\12345678.123"
  113. BOOL FAR PASCAL HugePageLock(LPVOID lpArea, DWORD dwLength);
  114. void FAR PASCAL HugePageUnlock(LPVOID lpArea, DWORD dwLength);
  115. /****************************************************************************
  116. MMSYSTEM global notify window
  117. ****************************************************************************/
  118. extern HWND hwndNotify; // in MMWND.C
  119. BOOL NEAR PASCAL WndInit(void); // in MMWND.C
  120. void NEAR PASCAL WndTerminate(void); // in MMWND.C
  121. void FAR PASCAL MciNotify(WPARAM wParam, LPARAM lParam); // in MCI.C
  122. void FAR PASCAL WaveOutNotify(WPARAM wParam, LPARAM lParam);// in PLAYWAV.C
  123. BOOL FAR PASCAL sndPlaySoundI(LPCSTR lszSoundName, UINT wFlags);// in SOUND.C
  124. BOOL FAR PASCAL sndMessage(LPSTR lszSoundName, UINT wFlags);// in SOUND.C
  125. /****************************************************************************
  126. MCI allocation stuff
  127. ****************************************************************************/
  128. extern HGLOBAL FAR PASCAL HeapCreate(int cbSize);
  129. extern void FAR PASCAL HeapDestroy(HGLOBAL hHeap);
  130. extern LPVOID FAR PASCAL HeapAlloc(HGLOBAL hHeap, int cbSize);
  131. extern LPVOID FAR PASCAL HeapReAlloc(LPVOID lp, int cbSize);
  132. extern void FAR PASCAL HeapFree(LPVOID lp);
  133. extern HGLOBAL hMciHeap; // in MCISYS.C
  134. #define BMCIHEAP _based((_segment)hMciHeap)
  135. #define mciAlloc(cb) HeapAlloc(hMciHeap, cb)
  136. #define mciReAlloc(lp, size) HeapReAlloc (lp, size)
  137. #define mciFree(lp) HeapFree(lp)
  138. /****************************************************************************
  139. strings
  140. ****************************************************************************/
  141. #define SZCODE char _based(_segname("_CODE"))
  142. /****************************************************************************
  143. handle apis's
  144. ****************************************************************************/
  145. //
  146. // all MMSYSTEM handles are tagged with the following structure.
  147. //
  148. // a MMSYSTEM handle is really a fixed local memory object.
  149. //
  150. // the functions NewHandle() and FreeHandle() create and release a MMSYSTEM
  151. // handle.
  152. //
  153. //
  154. //**************************************************************************;
  155. // IF YOU CHANGE THIS STRUCTURE YOU MUST ALSO CHANGE THE ONE IN DEBUG.ASM
  156. //**************************************************************************;
  157. typedef struct tagHNDL {
  158. struct tagHNDL *pNext; // link to next handle
  159. WORD wType; // type of handle wave, midi, mmio, ...
  160. HTASK hTask; // task that owns it
  161. } HNDL, NEAR *PHNDL;
  162. //**************************************************************************;
  163. #define HtoPH(h) ((PHNDL)(h)-1)
  164. #define PHtoH(ph) ((ph) ? (HLOCAL)((PHNDL)(ph)+1) : 0)
  165. //
  166. // all wave and midi handles will be linked into
  167. // a global list, so we can enumerate them latter if needed.
  168. //
  169. // all handle structures start with a HNDL structure, that contain common fields
  170. //
  171. // pHandleList points to the first handle in the list
  172. //
  173. // the NewHandle() and FreeHandle() functions are used to add/remove
  174. // a handle to/from the list
  175. //
  176. extern PHNDL pHandleList;
  177. extern HLOCAL FAR PASCAL NewHandle(WORD wType, WORD size);
  178. extern HLOCAL FAR PASCAL FreeHandle(HLOCAL h);
  179. #define GetHandleType(h) (HtoPH(h)->wType)
  180. #define GetHandleOwner(h) (HtoPH(h)->hTask)
  181. #define GetHandleFirst() (PHtoH(pHandleList))
  182. #define GetHandleNext(h) (PHtoH(HtoPH(h)->pNext))
  183. #define SetHandleOwner(h,hOwn) (HtoPH(h)->hTask = (hOwn))
  184. /****************************************************************************
  185. debug support
  186. ****************************************************************************/
  187. #if 1 // was #ifdef DEBUG_RETAIL
  188. #define MM_GET_DEBUG DRV_USER
  189. #define MM_GET_DEBUGOUT DRV_USER+1
  190. #define MM_SET_DEBUGOUT DRV_USER+2
  191. #define MM_GET_MCI_DEBUG DRV_USER+3
  192. #define MM_SET_MCI_DEBUG DRV_USER+4
  193. #define MM_GET_MM_DEBUG DRV_USER+5
  194. #define MM_SET_MM_DEBUG DRV_USER+6
  195. #define MM_HINFO_NEXT DRV_USER+10
  196. #define MM_HINFO_TASK DRV_USER+11
  197. #define MM_HINFO_TYPE DRV_USER+12
  198. #define MM_HINFO_MCI DRV_USER+20
  199. #define MM_DRV_RESTART DRV_USER+30
  200. //
  201. // these validation routines can be found in DEBUG.ASM
  202. //
  203. extern BOOL FAR PASCAL ValidateHandle(HANDLE h, WORD wType);
  204. extern BOOL FAR PASCAL ValidateHeader(const void FAR* p, UINT wSize, WORD wType);
  205. extern BOOL FAR PASCAL ValidateReadPointer(const void FAR* p, DWORD len);
  206. extern BOOL FAR PASCAL ValidateWritePointer(const void FAR* p, DWORD len);
  207. extern BOOL FAR PASCAL ValidateDriverCallback(DWORD dwCallback, UINT wFlags);
  208. extern BOOL FAR PASCAL ValidateCallback(FARPROC lpfnCallback);
  209. extern BOOL FAR PASCAL ValidateString(LPCSTR lsz, UINT max_len);
  210. #ifndef MMNOTIMER
  211. extern BOOL FAR PASCAL ValidateTimerCallback(LPTIMECALLBACK lpfn);
  212. #endif
  213. #define V_HANDLE(h, t, r) { if (!ValidateHandle(h, t)) return (r); }
  214. #define V_HEADER(p, w, t, r) { if (!ValidateHeader((p), (w), (t))) return (r); }
  215. #define V_RPOINTER(p, l, r) { if (!ValidateReadPointer((p), (l))) return (r); }
  216. #define V_RPOINTER0(p, l, r) { if ((p) && !ValidateReadPointer((p), (l))) return (r); }
  217. #define V_WPOINTER(p, l, r) { if (!ValidateWritePointer((p), (l))) return (r); }
  218. #define V_WPOINTER0(p, l, r) { if ((p) && !ValidateWritePointer((p), (l))) return (r); }
  219. #define V_DCALLBACK(d, w, r) { if (!ValidateDriverCallback((d), (w))) return (r); }
  220. #define V_TCALLBACK(d, r) { if (!ValidateTimerCallback((d))) return (r); }
  221. #define V_CALLBACK(f, r) { if (!ValidateCallback(f)) return (r); }
  222. #define V_CALLBACK0(f, r) { if ((f) && !ValidateCallback(f)) return (r); }
  223. #define V_STRING(s, l, r) { if (!ValidateString(s,l)) return (r); }
  224. #define V_FLAGS(t, b, f, r) { if ((t) & ~(b)) {LogParamError(ERR_BAD_FLAGS, (FARPROC)(f), (LPVOID)(DWORD)(t)); return (r); }}
  225. #else //ifdef DEBUG_RETAIL
  226. #define V_HANDLE(h, t, r) { if (!(h)) return (r); }
  227. #define V_HEADER(p, w, t, r) { if (!(p)) return (r); }
  228. #define V_RPOINTER(p, l, r) { if (!(p)) return (r); }
  229. #define V_RPOINTER0(p, l, r) 0
  230. #define V_WPOINTER(p, l, r) { if (!(p)) return (r); }
  231. #define V_WPOINTER0(p, l, r) 0
  232. #define V_DCALLBACK(d, w, r) 0
  233. #define V_TCALLBACK(d, r) 0
  234. #define V_CALLBACK(f, r) { if (!(f)) return (r); }
  235. #define V_CALLBACK0(f, r) 0
  236. #define V_STRING(s, l, r) { if (!(s)) return (r); }
  237. #define V_FLAGS(t, b, f, r) 0
  238. #endif //ifdef DEBUG_RETAIL
  239. //**************************************************************************;
  240. // IF YOU CHANGE THESE TYPES YOU MUST ALSO CHANGE THE ONES IN DEBUG.ASM
  241. //**************************************************************************;
  242. #define TYPE_WAVEOUT 1
  243. #define TYPE_WAVEIN 2
  244. #define TYPE_MIDIOUT 3
  245. #define TYPE_MIDIIN 4
  246. #define TYPE_MMIO 5
  247. #define TYPE_IOPROC 6
  248. #define TYPE_MCI 7
  249. #define TYPE_DRVR 8
  250. #define TYPE_MIXER 9
  251. //**************************************************************************;
  252. /****************************************************************************
  253. support for debug output
  254. ****************************************************************************/
  255. #ifdef DEBUG_RETAIL
  256. #define ROUT(sz) {static SZCODE ach[] = sz; DebugOutput(DBF_TRACE | DBF_MMSYSTEM, ach); }
  257. #define ROUTS(sz) {DebugOutput(DBF_TRACE | DBF_MMSYSTEM, sz);}
  258. #define DebugErr(flags, sz) {static SZCODE ach[] = "MMSYSTEM: "sz; DebugOutput((flags) | DBF_MMSYSTEM, ach); }
  259. #define DebugErr1(flags, sz, a) {static SZCODE ach[] = "MMSYSTEM: "sz; DebugOutput((flags) | DBF_MMSYSTEM, ach,a); }
  260. #define DebugErr2(flags, sz, a, b) {static SZCODE ach[] = "MMSYSTEM: "sz; DebugOutput((flags) | DBF_MMSYSTEM, ach,a,b); }
  261. #define RPRINTF1(sz,x) {static SZCODE ach[] = sz; DebugOutput(DBF_TRACE | DBF_MMSYSTEM, ach, x); }
  262. #define RPRINTF2(sz,x,y) {static SZCODE ach[] = sz; DebugOutput(DBF_TRACE | DBF_MMSYSTEM, ach, x, y); }
  263. #else //ifdef DEBUG_RETAIL
  264. #define ROUT(sz)
  265. #define ROUTS(sz)
  266. #define DebugErr(flags, sz)
  267. #define DebugErr1(flags, sz, a)
  268. #define DebugErr2(flags, sz, a, b)
  269. #define RPRINTF1(sz,x)
  270. #define RPRINTF2(sz,x,y)
  271. #endif //ifdef DEBUG_RETAIL
  272. #ifdef DEBUG
  273. extern void FAR cdecl dprintf(LPSTR, ...); // in COMM.ASM
  274. extern void FAR PASCAL dout(LPSTR); // in COMM.ASM
  275. #define DOUT(sz) {static SZCODE buf[] = sz; dout(buf); }
  276. #define DOUTS(sz) dout(sz);
  277. #define DPRINTF(x) dprintf x
  278. #define DPRINTF1(sz,a) {static SZCODE buf[] = sz; dprintf(buf, a); }
  279. #define DPRINTF2(sz,a,b) {static SZCODE buf[] = sz; dprintf(buf, a, b); }
  280. #else //ifdef DEBUG
  281. #define DOUT(sz) 0
  282. #define DOUTS(sz) 0
  283. #define DPRINTF(x) 0
  284. #define DPRINTF1(sz,a) 0
  285. #define DPRINTF2(sz,a,b) 0
  286. #endif //ifdef DEBUG
  287. #ifndef MMNOMCI
  288. /****************************************************************************
  289. Internal MCI stuff
  290. ****************************************************************************/
  291. #define MCI_VALID_DEVICE_ID(wID) ((wID) > 0 && (wID) < MCI_wNextDeviceID && MCI_lpDeviceList[wID])
  292. #define MCI_MAX_PARAM_SLOTS 30
  293. #define MCI_TOLOWER(c) ((char)((c) >= 'A' && (c) <= 'Z' ? (c) + 0x20 : (c)))
  294. typedef struct
  295. {
  296. HGLOBAL hResource;
  297. HINSTANCE hModule; // If not NULL then free module
  298. // when device is free'd
  299. UINT wType;
  300. UINT FAR * lpwIndex;
  301. LPSTR lpResource;
  302. #ifdef DEBUG
  303. WORD wLockCount; // Used for debugging
  304. #endif //ifdef DEBUG
  305. } command_table_type;
  306. #define MCINODE_ISCLOSING 0x00000001 // Lock out all cmd's during close
  307. #define MCINODE_ISAUTOCLOSING 0x00010000 // Lock out all cmd's during close
  308. // except internally generated close
  309. #define MCINODE_ISAUTOOPENED 0x00020000 // Device was auto opened
  310. #define MCINODE_16BIT_DRIVER 0x80000000 // Device is a 16-bit driver
  311. typedef struct {
  312. LPSTR lpstrName; // The name used in subsequent calls to
  313. // mciSendString to refer to the device
  314. LPSTR lpstrInstallName;// The device name from system.ini
  315. DWORD dwMCIOpenFlags; // Flags set on open may be:
  316. DWORD lpDriverData; // DWORD of driver instance data
  317. DWORD dwElementID; // The element ID set by MCI_OPEN_ELEMENT_ID
  318. YIELDPROC fpYieldProc; // The current yield procedure if any
  319. DWORD dwYieldData; // Data send to the current yield procedure
  320. UINT wDeviceID; // The ID used in subsequent calls to
  321. // mciSendCommand to refer to the device
  322. UINT wDeviceType; // The type returned from the DRV_OPEN call
  323. // MCI_OPEN_SHAREABLE
  324. // MCI_OPEN_ELEMENT_ID
  325. UINT wCommandTable; // The device type specific command table
  326. UINT wCustomCommandTable; // The custom device command table if any
  327. //(-1 if none)
  328. HINSTANCE hDriver; // Module instance handle for the driver
  329. HTASK hCreatorTask; // The task context the device is in
  330. HTASK hOpeningTask; // The task context which send the open command
  331. HDRVR hDrvDriver; // The installable driver handle
  332. DWORD dwMCIFlags; // Internal MCI flags
  333. } MCI_DEVICE_NODE;
  334. typedef MCI_DEVICE_NODE FAR *LPMCI_DEVICE_NODE;
  335. typedef MCI_DEVICE_NODE BMCIHEAP *PMCI_DEVICE_NODE;
  336. typedef struct {
  337. LPSTR lpstrParams;
  338. LPSTR FAR * lpstrPointerList;
  339. HTASK hCallingTask;
  340. UINT wParsingError;
  341. } MCI_INTERNAL_OPEN_INFO;
  342. typedef MCI_INTERNAL_OPEN_INFO FAR *LPMCI_INTERNAL_OPEN_INFO;
  343. typedef struct {
  344. LPSTR lpstrCommand;
  345. LPSTR lpstrReturnString;
  346. UINT wReturnLength;
  347. HTASK hCallingTask;
  348. LPSTR lpstrNewDirectory; // The current directory of the calling
  349. // task
  350. int nNewDrive; // The current drive of the calling task
  351. } MCI_SYSTEM_MESSAGE;
  352. typedef MCI_SYSTEM_MESSAGE FAR *LPMCI_SYSTEM_MESSAGE;
  353. #define MCI_INIT_DEVICE_LIST_SIZE 4
  354. #define MCI_DEVICE_LIST_GROW_SIZE 4
  355. #define MAX_COMMAND_TABLES 20
  356. extern BOOL MCI_bDeviceListInitialized;
  357. extern LPMCI_DEVICE_NODE FAR *MCI_lpDeviceList;
  358. extern UINT MCI_wDeviceListSize;
  359. extern UINT MCI_wNextDeviceID; // the next device ID to use for a new device
  360. extern command_table_type command_tables[MAX_COMMAND_TABLES];
  361. // In mciparse.c
  362. extern void PASCAL NEAR mciToLower (LPSTR lpstrString);
  363. extern UINT NEAR PASCAL mciLoadTableType(UINT wType);
  364. extern LPSTR PASCAL NEAR FindCommandInTable (UINT wTable, LPCSTR lpstrCommand,
  365. UINT FAR * lpwMessage);
  366. extern LPSTR PASCAL NEAR FindCommandItem (UINT wDeviceID, LPCSTR lpstrType,
  367. LPCSTR lpstrCommand, UINT FAR * lpwMessage,
  368. UINT FAR* lpwTable);
  369. extern UINT PASCAL NEAR mciEatToken (LPCSTR FAR *lplpstrInput, char cSeparater,
  370. LPSTR FAR *lplpstrOutput, BOOL bMustFind);
  371. extern UINT PASCAL NEAR mciParseParams (LPCSTR lpstrParams,
  372. LPCSTR lpCommandList,
  373. LPDWORD lpdwFlags,
  374. LPSTR lpOutputParams,
  375. UINT wParamsSize,
  376. LPSTR FAR * FAR * lpPointerList,
  377. UINT FAR* lpwParsingError);
  378. extern void NEAR PASCAL mciParserFree (LPSTR FAR *lpstrPointerList);
  379. extern UINT NEAR PASCAL mciEatCommandEntry(LPCSTR lpEntry, LPDWORD lpValue,
  380. UINT FAR* lpID);
  381. extern UINT NEAR PASCAL mciParseCommand (UINT wDeviceID,
  382. LPSTR lpstrCommand,
  383. LPCSTR lpstrDeviceName,
  384. LPSTR FAR * lpCommandList,
  385. UINT FAR* lpwTable);
  386. extern UINT PASCAL NEAR mciGetParamSize (DWORD dwValue, UINT wID);
  387. extern BOOL PASCAL NEAR mciUnlockCommandTable (UINT wCommandTable);
  388. // In mcisys.c
  389. extern BOOL NEAR PASCAL mciInitDeviceList(void);
  390. extern UINT NEAR PASCAL mciOpenDevice(DWORD dwFlags,
  391. LPMCI_OPEN_PARMS lpOpenParms,
  392. LPMCI_INTERNAL_OPEN_INFO lpOpenInfo);
  393. extern UINT NEAR PASCAL mciCloseDevice(UINT wID, DWORD dwFlags,
  394. LPMCI_GENERIC_PARMS lpGeneric,
  395. BOOL bCloseDriver);
  396. extern UINT NEAR PASCAL mciExtractTypeFromID (LPMCI_OPEN_PARMS lpOpen);
  397. extern DWORD PASCAL NEAR mciSysinfo (UINT wDeviceID, DWORD dwFlags,
  398. LPMCI_SYSINFO_PARMS lpSysinfo);
  399. extern UINT PASCAL NEAR mciLookUpType (LPCSTR lpstrTypeName);
  400. extern BOOL PASCAL NEAR mciExtractDeviceType (LPCSTR lpstrDeviceName,
  401. LPSTR lpstrDeviceType,
  402. UINT wBufLen);
  403. extern UINT NEAR PASCAL mciSetBreakKey (UINT wDeviceID, int nVirtKey, HWND hwndTrap);
  404. extern UINT NEAR PASCAL mciGetDeviceIDInternal (LPCSTR lpstrName, HTASK hTask);
  405. extern BOOL NEAR PASCAL Is16bitDrv(UINT wDeviceID);
  406. extern BOOL NEAR PASCAL CouldBe16bitDrv(UINT wDeviceID);
  407. // In mci.c
  408. extern DWORD FAR PASCAL mciRelaySystemString (LPMCI_SYSTEM_MESSAGE lpMessage);
  409. #endif //ifndef MMNOMCI