186 lines
6.7 KiB
C
186 lines
6.7 KiB
C
|
/****************************************************************************
|
||
|
*
|
||
|
* piondrvr.c
|
||
|
*
|
||
|
* Copyright (c) 1991-1993 Microsoft Corporation. All Rights Reserved.
|
||
|
*
|
||
|
* MCI Device Driver for the Pioneer 4200 Videodisc Player
|
||
|
*
|
||
|
* Main Module - Standard Driver Interface and Message Procedures
|
||
|
*
|
||
|
***************************************************************************/
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <windowsx.h>
|
||
|
#include <mmsystem.h>
|
||
|
#include <mmddk.h>
|
||
|
#include "mcipionr.h"
|
||
|
#include "pioncnfg.h"
|
||
|
|
||
|
#define CONFIG_ID 10000L /* use hiword of dwDriverID to */
|
||
|
/* identify config. opens */
|
||
|
|
||
|
static WORD wTableEntry; /* custom table ID returned */
|
||
|
/* from mciLoadCommandResource() */
|
||
|
|
||
|
/***************************************************************************
|
||
|
* @doc INTERNAL
|
||
|
*
|
||
|
* @api LRESULT | DriverProc | Windows driver entry point. All Windows driver
|
||
|
* control messages and all MCI messages pass through this entry point.
|
||
|
*
|
||
|
* @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 | message | 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 message, LPARAM lParam1, LPARAM lParam2)
|
||
|
{
|
||
|
DWORD dwRes = 0L;
|
||
|
TCHAR aszResource[32];
|
||
|
|
||
|
switch (message) {
|
||
|
|
||
|
case DRV_LOAD:
|
||
|
/* the DRV_LOAD message is received once, when the driver is */
|
||
|
/* first loaded - any one-time initialization code goes here */
|
||
|
|
||
|
/* load the custom command table */
|
||
|
LoadString(hInstance,IDS_COMMANDS,aszResource,sizeof(aszResource));
|
||
|
wTableEntry = mciLoadCommandResource(hInstance, aszResource, 0);
|
||
|
|
||
|
/* return 0L to FAIL the load. */
|
||
|
dwRes = wTableEntry != MCI_NO_COMMAND_TABLE;
|
||
|
break;
|
||
|
|
||
|
case DRV_FREE:
|
||
|
/* the DRV_FREE message is received once when the driver is */
|
||
|
/* unloaded - any final shut down code goes here */
|
||
|
|
||
|
/* free the custom command table */
|
||
|
mciFreeCommandResource(wTableEntry);
|
||
|
|
||
|
dwRes = 1L;
|
||
|
break;
|
||
|
|
||
|
case DRV_OPEN:
|
||
|
/* the DRV_OPEN message is received once for each MCI device open */
|
||
|
|
||
|
/* configuration open case */
|
||
|
if (!lParam2)
|
||
|
dwRes = CONFIG_ID;
|
||
|
/* normal case */
|
||
|
else {
|
||
|
LPMCI_OPEN_DRIVER_PARMS lpOpen =
|
||
|
(LPMCI_OPEN_DRIVER_PARMS)lParam2;
|
||
|
UINT Port;
|
||
|
UINT Rate;
|
||
|
|
||
|
/* associate the channel number with the driver ID */
|
||
|
|
||
|
pionGetComportAndRate((LPTSTR)lpOpen->lpstrParams, &Port, &Rate);
|
||
|
|
||
|
pionSetBaudRate(Port, Rate);
|
||
|
|
||
|
mciSetDriverData(lpOpen->wDeviceID, (DWORD)Port);
|
||
|
|
||
|
/* specify the custom command table and the device type */
|
||
|
lpOpen->wCustomCommandTable = wTableEntry;
|
||
|
lpOpen->wType = MCI_DEVTYPE_VIDEODISC;
|
||
|
|
||
|
/* return the device ID to be used in subsequent */
|
||
|
/* messages or 0 to fail the open */
|
||
|
dwRes = lpOpen->wDeviceID;
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
|
||
|
case DRV_CLOSE:
|
||
|
/* this message is received once for each MCI device close */
|
||
|
|
||
|
dwRes = 1L;
|
||
|
break;
|
||
|
|
||
|
case DRV_ENABLE:
|
||
|
/* the DRV_ENABLE message is received when the driver is loaded */
|
||
|
/* or reloaded and whenever windows is enabled */
|
||
|
|
||
|
dwRes = 1L;
|
||
|
break;
|
||
|
|
||
|
case DRV_DISABLE:
|
||
|
/* the DRV_DISABLE message is received before the driver is */
|
||
|
/* freed and whenever windows is disabled */
|
||
|
|
||
|
dwRes = 1L;
|
||
|
break;
|
||
|
|
||
|
case DRV_QUERYCONFIGURE:
|
||
|
/* the DRV_QUERYCONFIGURE message is used to determine if the */
|
||
|
/* DRV_CONCIGURE message is supported - return 1 to indicate */
|
||
|
/* configuration IS supported. */
|
||
|
|
||
|
dwRes = 1L;
|
||
|
break;
|
||
|
|
||
|
case DRV_CONFIGURE:
|
||
|
/* the DRV_CONFIGURE message instructs the device to perform */
|
||
|
/* device configuration. */
|
||
|
|
||
|
if (lParam2 && lParam1 && (((LPDRVCONFIGINFO)lParam2)->dwDCISize == sizeof(DRVCONFIGINFO)))
|
||
|
dwRes = pionConfig((HWND)lParam1, (LPDRVCONFIGINFO)lParam2);
|
||
|
else
|
||
|
dwRes = DRVCNF_CANCEL;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
/* all other messages are processed here */
|
||
|
|
||
|
/* select messages in the MCI range */
|
||
|
if (!HIWORD(dwDriverID) &&
|
||
|
message >= DRV_MCI_FIRST && message <= DRV_MCI_LAST ||
|
||
|
message >= VDISC_FIRST && message <= VDISC_LAST)
|
||
|
dwRes = mciDriverEntry((WORD)dwDriverID, message,
|
||
|
lParam1, lParam2);
|
||
|
|
||
|
/* other messages get default processing */
|
||
|
else
|
||
|
dwRes = DefDriverProc(dwDriverID, hDriver, message,
|
||
|
lParam1, lParam2);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return (LRESULT)dwRes;
|
||
|
}
|