|
|
1.1 root 1: /****************************************************************************
2: *
3: * mmdrv.c
4: *
5: * Multimedia kernel driver support component (mmdrv)
6: *
7: * Copyright (c) Microsoft Corporation 1992. All rights reserved.
8: *
9: * This module contains
10: *
11: * -- the entry point and startup code
12: * -- debug support code
13: *
14: * History
15: * 01-Feb-1992 - Robin Speed (RobinSp) wrote it
16: * 04-Feb-1992 - Reviewed by SteveDav
17: *
18: ***************************************************************************/
19:
20: #include "mmdrv.h"
21: #include <stdarg.h>
22:
23: CRITICAL_SECTION mmDrvCritSec; // Serialize access to device lists
24:
25:
26: /**************************************************************************
27:
28: @doc EXTERNAL
29:
30: @api BOOL | DllInstanceInit | This procedure is called whenever a
31: process attaches or detaches from the DLL.
32:
33: @parm PVOID | hModule | Handle of the DLL.
34:
35: @parm ULONG | Reason | What the reason for the call is.
36:
37: @parm PCONTEXT | pContext | Some random other information.
38:
39: @rdesc The return value is TRUE if the initialisation completed ok,
40: FALSE if not.
41:
42: **************************************************************************/
43:
44: BOOL DllInstanceInit(PVOID hModule, ULONG Reason, PCONTEXT pContext)
45: {
46:
47: UNREFERENCED_PARAMETER(pContext);
48:
49: if (Reason == DLL_PROCESS_ATTACH) {
50: #if DBG
51: mmdrvDebugLevel = GetProfileInt(L"MMDEBUG", L"MMDRV", 1);
52: dprintf2 (("Starting, debug level=%d", mmdrvDebugLevel));
53: #endif
54:
55: //
56: // Create our process DLL heap
57: //
58: hHeap = HeapCreate(0, 800, 0);
59: if (hHeap == NULL) {
60: return FALSE;
61: }
62:
63: InitializeCriticalSection(&mmDrvCritSec);
64:
65: } else {
66: if (Reason == DLL_PROCESS_DETACH) {
67: dprintf2(("Ending"));
68:
69: TerminateMidi();
70: TerminateWave();
71:
72: DeleteCriticalSection(&mmDrvCritSec);
73: HeapDestroy(hHeap);
74: }
75: }
76: return TRUE;
77: }
78:
79:
80: /***************************************************************************
81: * @doc INTERNAL
82: *
83: * @api LONG | DriverProc | The entry point for an installable driver.
84: *
85: * @parm DWORD | dwDriverId | For most messages, <p dwDriverId> is the DWORD
86: * value that the driver returns in response to a <m DRV_OPEN> message.
87: * Each time that the driver is opened, through the <f DrvOpen> API,
88: * the driver receives a <m DRV_OPEN> message and can return an
89: * arbitrary, non-zero value. The installable driver interface
90: * saves this value and returns a unique driver handle to the
91: * application. Whenever the application sends a message to the
92: * driver using the driver handle, the interface routes the message
93: * to this entry point and passes the corresponding <p dwDriverId>.
94: * This mechanism allows the driver to use the same or different
95: * identifiers for multiple opens but ensures that driver handles
96: * are unique at the application interface layer.
97: *
98: * The following messages are not related to a particular open
99: * instance of the driver. For these messages, the dwDriverId
100: * will always be zero.
101: *
102: * DRV_LOAD, DRV_FREE, DRV_ENABLE, DRV_DISABLE, DRV_OPEN
103: *
104: * @parm HANDLE | hDriver | This is the handle returned to the
105: * application by the driver interface.
106: *
107: * @parm UINT | wMessage | The requested action to be performed. Message
108: * values below <m DRV_RESERVED> are used for globally defined messages.
109: * Message values from <m DRV_RESERVED> to <m DRV_USER> are used for
110: * defined driver protocols. Messages above <m DRV_USER> are used
111: * for driver specific messages.
112: *
113: * @parm LONG | lParam1 | Data for this message. Defined separately for
114: * each message
115: *
116: * @parm LONG | lParam2 | Data for this message. Defined separately for
117: * each message
118: *
119: * @rdesc Defined separately for each message.
120: ***************************************************************************/
121: LONG DriverProc(DWORD dwDriverID, HANDLE hDriver, UINT wMessage, LONG lParam1, LONG lParam2)
122: {
123: switch (wMessage)
124: {
125: case DRV_LOAD:
126: dprintf2(("DRV_LOAD"));
127:
128: /*
129: Sent to the driver when it is loaded. Always the first
130: message received by a driver.
131:
132: dwDriverID is 0L.
133: lParam1 is 0L.
134: lParam2 is 0L.
135:
136: Return 0L to fail the load.
137:
138: DefDriverProc will return NON-ZERO so we don't have to
139: handle DRV_LOAD
140: */
141:
142: return 1L;
143:
144: case DRV_FREE:
145: dprintf2(("DRV_FREE"));
146:
147: /*
148: Sent to the driver when it is about to be discarded. This
149: will always be the last message received by a driver before
150: it is freed.
151:
152: dwDriverID is 0L.
153: lParam1 is 0L.
154: lParam2 is 0L.
155:
156: Return value is ignored.
157: */
158:
159: return 1L;
160:
161: case DRV_OPEN:
162: dprintf2(("DRV_OPEN"));
163:
164: /*
165: Sent to the driver when it is opened.
166:
167: dwDriverID is 0L.
168:
169: lParam1 is a far pointer to a zero-terminated string
170: containing the name used to open the driver.
171:
172: lParam2 is passed through from the drvOpen call.
173:
174: Return 0L to fail the open.
175:
176: DefDriverProc will return ZERO so we do have to
177: handle the DRV_OPEN message.
178: */
179:
180: return 1L;
181:
182: case DRV_CLOSE:
183: dprintf2(("DRV_CLOSE"));
184:
185: /*
186: Sent to the driver when it is closed. Drivers are unloaded
187: when the close count reaches zero.
188:
189: dwDriverID is the driver identifier returned from the
190: corresponding DRV_OPEN.
191:
192: lParam1 is passed through from the drvClose call.
193:
194: lParam2 is passed through from the drvClose call.
195:
196: Return 0L to fail the close.
197:
198: DefDriverProc will return ZERO so we do have to
199: handle the DRV_CLOSE message.
200: */
201:
202: return 1L;
203:
204: case DRV_ENABLE:
205: dprintf2(("DRV_ENABLE"));
206:
207: /*
208: Sent to the driver when the driver is loaded or reloaded
209: and whenever Windows is enabled. Drivers should only
210: hook interrupts or expect ANY part of the driver to be in
211: memory between enable and disable messages
212:
213: dwDriverID is 0L.
214: lParam1 is 0L.
215: lParam2 is 0L.
216:
217: Return value is ignored.
218: */
219:
220: return 1L;
221:
222: case DRV_DISABLE:
223: dprintf2(("DRV_DISABLE"));
224:
225: /*
226: Sent to the driver before the driver is freed.
227: and whenever Windows is disabled
228:
229: dwDriverID is 0L.
230: lParam1 is 0L.
231: lParam2 is 0L.
232:
233: Return value is ignored.
234: */
235:
236: return 1L;
237:
238: case DRV_QUERYCONFIGURE:
239: dprintf2(("DRV_QUERYCONFIGURE"));
240:
241: /*
242: Sent to the driver so that applications can
243: determine whether the driver supports custom
244: configuration. The driver should return a
245: non-zero value to indicate that configuration
246: is supported.
247:
248: dwDriverID is the value returned from the DRV_OPEN
249: call that must have succeeded before this message
250: was sent.
251:
252: lParam1 is passed from the app and is undefined.
253: lParam2 is passed from the app and is undefined.
254:
255: Return 0L to indicate configuration NOT supported.
256: */
257:
258: return 0L; // we don't do configuration at the moment
259:
260: case DRV_CONFIGURE:
261: dprintf2(("DRV_CONFIGURE"));
262:
263: /*
264: Sent to the driver so that it can display a custom
265: configuration dialog box.
266:
267: lParam1 is passed from the app. and should contain
268: the parent window handle in the loword.
269: lParam2 is passed from the app and is undefined.
270:
271: Return value is undefined.
272:
273: Drivers should create their own section in system.ini.
274: The section name should be the driver name.
275: */
276:
277: return 0L;
278:
279: case DRV_INSTALL:
280: dprintf2(("DRV_INSTALL"));
281: return DRVCNF_RESTART;
282:
283: default:
284: return DefDriverProc(dwDriverID, hDriver, wMessage,lParam1,lParam2);
285: }
286: }
287:
288:
289:
290: #if DBG
291:
292: int mmdrvDebugLevel = 1;
293:
294: /***************************************************************************
295:
296: @doc INTERNAL
297:
298: @api void | mmdrvDbgOut | This function sends output to the current
299: debug output device.
300:
301: @parm LPSTR | lpszFormat | Pointer to a printf style format string.
302: @parm ??? | ... | Args.
303:
304: @rdesc There is no return value.
305:
306: ****************************************************************************/
307:
308: void mmdrvDbgOut(LPSTR lpszFormat, ...)
309: {
310: char buf[256];
311: va_list va;
312:
313: OutputDebugStringA("MMDRV: ");
314:
315: va_start(va, lpszFormat);
316: vsprintf(buf, lpszFormat, va);
317: va_end(va);
318:
319: OutputDebugStringA(buf);
320: OutputDebugStringA("\n");
321: }
322:
323: /***************************************************************************
324:
325: @doc INTERNAL
326:
327: @api void | dDbgAssert | This function prints an assertion message.
328:
329: @parm LPSTR | exp | Pointer to the expression string.
330: @parm LPSTR | file | Pointer to the file name.
331: @parm int | line | The line number.
332:
333: @rdesc There is no return value.
334:
335: ****************************************************************************/
336:
337: void dDbgAssert(LPSTR exp, LPSTR file, int line)
338: {
339: dprintf1(("Assertion failure:"));
340: dprintf1((" Exp: %s", exp));
341: dprintf1((" File: %s, line: %d", file, line));
342: DebugBreak();
343: }
344:
345: #endif // DBG
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.