Windows-Server-2003/multimedia/media/avi/mciavi.16/drvproc.c

232 lines
6.7 KiB
C

/******************************************************************************
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