Annotation of ntddk/src/mmedia/mmdrv/mmdrv.c, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.