/****************************************************************************** Copyright (C) Microsoft Corporation 1985-1991. All rights reserved. Title: drvproc.c - Multimedia Systems Media Control Interface driver for AVI. *****************************************************************************/ #include "graphic.h" #include "cnfgdlg.h" // to get IDA_CONFIG #include "avitask.h" // to get mciaviTaskCleanup() #ifndef WIN32 // Not used in 32 bit world void NEAR PASCAL AppExit(HTASK htask, BOOL fNormalExit); #endif #define CONFIG_ID 10000L // Use the hiword of dwDriverID to identify HANDLE ghModule; extern HWND ghwndConfig; /* Link to DefDriverProc in MMSystem explicitly, so we don't get the ** one in USER by mistake. */ #ifndef WIN32 extern DWORD FAR PASCAL mmDefDriverProc(DWORD, HANDLE, UINT, DWORD, DWORD); #else #define mmDefDriverProc DefDriverProc #endif #ifndef WIN32 BOOL FAR PASCAL LibMain (HANDLE hModule, int cbHeap, LPSTR lpchCmdLine) { ghModule = hModule; return TRUE; } #else BOOL DllInstanceInit(PVOID hModule, ULONG Reason, PCONTEXT pContext) { if (Reason == DLL_PROCESS_ATTACH) { ghModule = hModule; // All we need to save is our module handle... } else { if (Reason == DLL_PROCESS_DETACH) { } } return TRUE; } #endif // WIN16 /*************************************************************************** * * @doc INTERNAL * * @api DWORD | DriverProc | The entry point for an installable driver. * * @parm DWORD | dwDriverId | For most messages, dwDriverId is the DWORD * value that the driver returns in response to a DRV_OPEN message. * Each time that the driver is opened, through the DrvOpen API, * the driver receives a DRV_OPEN message and can return an * arbitrary, non-zero, value. The installable driver interface * saves this value and returns a unique driver handle to the * application. Whenever the application sends a message to the * driver using the driver handle, the interface routes the message * to this entry point and passes the corresponding dwDriverId. * * This mechanism allows the driver to use the same or different * identifiers for multiple opens but ensures that driver handles * are unique at the application interface layer. * * The following messages are not related to a particular open * instance of the driver. For these messages, the dwDriverId * will always be ZERO. * * DRV_LOAD, DRV_FREE, DRV_ENABLE, DRV_DISABLE, DRV_OPEN * * @parm UINT | wMessage | The requested action to be performed. Message * values below DRV_RESERVED are used for globally defined messages. * Message values from DRV_RESERVED to DRV_USER are used for * defined driver portocols. Messages above DRV_USER are used * for driver specific messages. * * @parm DWORD | dwParam1 | Data for this message. Defined separately for * each message * * @parm DWORD | dwParam2 | Data for this message. Defined separately for * each message * * @rdesc Defined separately for each message. * ***************************************************************************/ DWORD FAR PASCAL _LOADDS DriverProc (DWORD dwDriverID, HANDLE hDriver, UINT wMessage, DWORD dwParam1, DWORD dwParam2) { DWORD dwRes = 0L; /* * critical sections are now per-device. This means they * cannot be held around the whole driver-proc, since until we open * the device, we don't have a critical section to hold. * The critical section is allocated in mciSpecial on opening. It is * also held in mciDriverEntry, in GraphicWndProc, and around * all worker thread draw functions. */ switch (wMessage) { // Standard, globally used messages. case DRV_LOAD: if (GraphicInit()) // Initialize graphic mgmt. dwRes = 1L; else dwRes = 0L; break; case DRV_FREE: GraphicFree(); dwRes = 1L; break; case DRV_OPEN: if (!dwParam2) dwRes = CONFIG_ID; else dwRes = GraphicDrvOpen((LPMCI_OPEN_DRIVER_PARMS)dwParam2); break; case DRV_CLOSE: /* If we have a configure dialog up, fail the close. ** Otherwise, we'll be unloaded while we still have the ** configuration window up. */ if (ghwndConfig) dwRes = 0L; else dwRes = 1L; break; case DRV_ENABLE: dwRes = 1L; break; case DRV_DISABLE: dwRes = 1L; break; case DRV_QUERYCONFIGURE: dwRes = 1L; /* Yes, we can be configured */ break; case DRV_CONFIGURE: ConfigDialog((HWND)(UINT)dwParam1, NULL); dwRes = 1L; break; #ifndef WIN32 // // sent when a application is terminating // // lParam1: // DRVEA_ABNORMALEXIT // DRVEA_NORMALEXIT // case DRV_EXITAPPLICATION: AppExit(GetCurrentTask(), (BOOL)dwParam1 == DRVEA_NORMALEXIT); break; #endif default: if (!HIWORD(dwDriverID) && wMessage >= DRV_MCI_FIRST && wMessage <= DRV_MCI_LAST) dwRes = mciDriverEntry ((UINT)dwDriverID, wMessage, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2); else dwRes = mmDefDriverProc(dwDriverID, hDriver, wMessage, dwParam1, dwParam2); break; } return dwRes; } #ifndef WIN32 /***************************************************************************** * @doc INTERNAL * * @func void | AppExit | * a application is exiting * ****************************************************************************/ void NEAR PASCAL AppExit(HTASK htask, BOOL fNormalExit) { // // walk the list of open MCIAVI instances and see if // the dying task is the background task and do cleanup. // NPMCIGRAPHIC npMCI; extern NPMCIGRAPHIC npMCIList; // in graphic.c for (npMCI=npMCIList; npMCI; npMCI = npMCI->npMCINext) { if (npMCI->hTask == htask) { DPF(("Calling mciaviTaskCleanup()\n")); mciaviTaskCleanup(npMCI); return; } } } #endif