252 lines
7.4 KiB
C
252 lines
7.4 KiB
C
/****************************************************************************
|
|
*
|
|
* drvproc.c
|
|
*
|
|
***************************************************************************/
|
|
/**************************************************************************
|
|
*
|
|
* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
|
|
* KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
|
|
* PURPOSE.
|
|
*
|
|
* Copyright (c) 1991 - 1995 Microsoft Corporation. All Rights Reserved.
|
|
*
|
|
**************************************************************************/
|
|
|
|
#include <windows.h>
|
|
#include <windowsx.h>
|
|
#include <mmsystem.h>
|
|
#include <compddk.h>
|
|
#include "msrle.h"
|
|
|
|
HMODULE ghModule;
|
|
|
|
/***************************************************************************
|
|
* @doc INTERNAL
|
|
*
|
|
* @api LRESULT | DriverProc | The entry point for an installable driver.
|
|
*
|
|
* @parm DWORD | dwDriverId | For most messages, <p dwDriverId> is the DWORD
|
|
* value that the driver returns in response to a <m DRV_OPEN> message.
|
|
* Each time that the driver is opened, through the <f DrvOpen> API,
|
|
* the driver receives a <m 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 <p 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 HDRVR | hDriver | This is the handle returned to the
|
|
* application by the driver interface.
|
|
*
|
|
* @parm UINT | uiMessage | The requested action to be performed. Message
|
|
* values below <m DRV_RESERVED> are used for globally defined messages.
|
|
* Message values from <m DRV_RESERVED> to <m DRV_USER> are used for
|
|
* defined driver protocols. Messages above <m DRV_USER> are used
|
|
* for driver specific messages.
|
|
*
|
|
* @parm LPARAM | lParam1 | Data for this message. Defined separately for
|
|
* each message
|
|
*
|
|
* @parm LPARAM | lParam2 | Data for this message. Defined separately for
|
|
* each message
|
|
*
|
|
* @rdesc Defined separately for each message.
|
|
***************************************************************************/
|
|
|
|
LRESULT FAR PASCAL _loadds DriverProc(DWORD dwDriverID, HDRVR hDriver, UINT uiMessage, LPARAM lParam1, LPARAM lParam2)
|
|
{
|
|
PRLEINST pri = dwDriverID != -1 ? (PRLEINST)(UINT)dwDriverID : NULL;
|
|
|
|
switch (uiMessage)
|
|
{
|
|
case DRV_LOAD:
|
|
#ifdef _WIN32
|
|
if (ghModule) {
|
|
// AVI explicitly loads us as well, but does not pass the
|
|
// correct (as known by WINMM) driver handle.
|
|
} else {
|
|
ghModule = (HANDLE) GetDriverModuleHandle(hDriver);
|
|
}
|
|
#endif
|
|
RleLoad();
|
|
return (LRESULT)1L;
|
|
|
|
case DRV_FREE:
|
|
RleFree();
|
|
return (LRESULT)1L;
|
|
|
|
case DRV_OPEN:
|
|
// if being opened with no open struct, then return a non-zero
|
|
// value without actually opening
|
|
|
|
if (lParam2 == 0L)
|
|
return -1l;
|
|
|
|
return (LRESULT)(DWORD)(UINT)RleOpen();
|
|
|
|
case DRV_CLOSE:
|
|
if (pri)
|
|
RleClose(pri);
|
|
|
|
return (LRESULT)1L;
|
|
|
|
/*********************************************************************
|
|
|
|
state messages
|
|
|
|
*********************************************************************/
|
|
|
|
case ICM_GETSTATE:
|
|
return RleGetState(pri, (LPVOID)lParam1, (DWORD)lParam2);
|
|
|
|
case ICM_SETSTATE:
|
|
return RleSetState(pri, (LPVOID)lParam1, (DWORD)lParam2);
|
|
|
|
case ICM_GETINFO:
|
|
return RleGetInfo(pri, (ICINFO FAR *)lParam1, (DWORD)lParam2);
|
|
|
|
case ICM_GETDEFAULTQUALITY:
|
|
if (lParam1)
|
|
{
|
|
*((LPDWORD)lParam1) = QUALITY_DEFAULT;
|
|
return ICERR_OK;
|
|
}
|
|
break;
|
|
|
|
/*********************************************************************
|
|
|
|
compression messages
|
|
|
|
*********************************************************************/
|
|
|
|
case ICM_COMPRESS_QUERY:
|
|
return RleCompressQuery(pri,
|
|
(LPBITMAPINFOHEADER)lParam1,
|
|
(LPBITMAPINFOHEADER)lParam2);
|
|
|
|
case ICM_COMPRESS_BEGIN:
|
|
return RleCompressBegin(pri,
|
|
(LPBITMAPINFOHEADER)lParam1,
|
|
(LPBITMAPINFOHEADER)lParam2);
|
|
|
|
case ICM_COMPRESS_GET_FORMAT:
|
|
return RleCompressGetFormat(pri,
|
|
(LPBITMAPINFOHEADER)lParam1,
|
|
(LPBITMAPINFOHEADER)lParam2);
|
|
|
|
case ICM_COMPRESS_GET_SIZE:
|
|
return RleCompressGetSize(pri,
|
|
(LPBITMAPINFOHEADER)lParam1,
|
|
(LPBITMAPINFOHEADER)lParam2);
|
|
|
|
case ICM_COMPRESS:
|
|
return RleCompress(pri,
|
|
(ICCOMPRESS FAR *)lParam1, (DWORD)lParam2);
|
|
|
|
case ICM_COMPRESS_END:
|
|
return RleCompressEnd(pri);
|
|
|
|
/*********************************************************************
|
|
|
|
decompress messages
|
|
|
|
*********************************************************************/
|
|
|
|
case ICM_DECOMPRESS_QUERY:
|
|
return RleDecompressQuery(pri,
|
|
(LPBITMAPINFOHEADER)lParam1,
|
|
(LPBITMAPINFOHEADER)lParam2);
|
|
|
|
case ICM_DECOMPRESS_BEGIN:
|
|
return RleDecompressBegin(pri,
|
|
(LPBITMAPINFOHEADER)lParam1,
|
|
(LPBITMAPINFOHEADER)lParam2);
|
|
|
|
case ICM_DECOMPRESS_GET_FORMAT:
|
|
return RleDecompressGetFormat(pri,
|
|
(LPBITMAPINFOHEADER)lParam1,
|
|
(LPBITMAPINFOHEADER)lParam2);
|
|
|
|
case ICM_DECOMPRESS:
|
|
return RleDecompress(pri,
|
|
(ICDECOMPRESS FAR *)lParam1, (DWORD)lParam2);
|
|
|
|
case ICM_DECOMPRESS_END:
|
|
return RleDecompressEnd(pri);
|
|
|
|
/*********************************************************************
|
|
|
|
standard driver messages
|
|
|
|
*********************************************************************/
|
|
|
|
case DRV_DISABLE:
|
|
case DRV_ENABLE:
|
|
return (LRESULT)1L;
|
|
|
|
case DRV_INSTALL:
|
|
case DRV_REMOVE:
|
|
return (LRESULT)DRV_OK;
|
|
}
|
|
|
|
if (uiMessage < DRV_USER)
|
|
return DefDriverProc(dwDriverID, hDriver, uiMessage,lParam1,lParam2);
|
|
else
|
|
return ICERR_UNSUPPORTED;
|
|
}
|
|
|
|
/****************************************************************************
|
|
* @doc INTERNAL
|
|
*
|
|
* @api int | LibMain | Library initialization code.
|
|
*
|
|
* @parm HANDLE | hModule | Our module handle.
|
|
*
|
|
* @parm WORD | wHeapSize | The heap size from the .def file.
|
|
*
|
|
* @parm LPSTR | lpCmdLine | The command line.
|
|
*
|
|
* @rdesc Returns 1 if the initialization was successful and 0 otherwise.
|
|
***************************************************************************/
|
|
#ifndef _WIN32
|
|
int NEAR PASCAL LibMain(HMODULE hModule, WORD wHeapSize, LPSTR lpCmdLine)
|
|
{
|
|
ghModule = hModule;
|
|
|
|
return 1;
|
|
}
|
|
#endif
|
|
|
|
#if 0 // NO DLL load proc needed
|
|
// NOTE: ghModule Will be set up on DRV_LOAD call
|
|
#ifdef _WIN32
|
|
|
|
BOOL WINAPI DLLEntryPoint(HINSTANCE hModule, ULONG Reason, LPVOID pv)
|
|
{
|
|
switch (Reason)
|
|
{
|
|
case DLL_PROCESS_ATTACH:
|
|
ghModule = hModule;
|
|
DisableThreadLibraryCalls(hModule);
|
|
break;
|
|
|
|
case DLL_PROCESS_DETACH:
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
#endif
|
|
#endif // if 0
|