windows-nt/Source/XPSP1/NT/drivers/wdm/audio/legacy/wdmaud.drv/drvproc.c
2020-09-26 16:20:57 +08:00

331 lines
9.5 KiB
C

/****************************************************************************
*
* drvproc.c
*
* Generic WDM Audio driver message dispatch routines
*
* Copyright (C) Microsoft Corporation, 1997 - 1999 All Rights Reserved.
*
* History
* 5-12-97 - Noel Cross (NoelC)
*
***************************************************************************/
#include "wdmdrv.h"
volatile BYTE cPendingOpens = 0 ;
volatile BYTE fExiting = 0 ;
#ifdef DEBUG
//UINT uiDebugLevel = DL_WARNING ; // debug level
static TCHAR STR_DRIVER[] = TEXT("wdmaud") ;
static TCHAR STR_MMDEBUG[] = TEXT("uidebuglevel") ;
#endif
LRESULT _loadds CALLBACK DriverProc
(
DWORD id,
HDRVR hDriver,
WORD msg,
LPARAM lParam1,
LPARAM lParam2
)
{
LPDEVICEINFO lpDeviceInfo;
//DWORD dwCallback16;
switch (msg)
{
case DRV_LOAD:
//
// Sent to the driver when it is loaded. Always the first
// message received by a driver.
//
// dwDriverID is 0L.
// lParam1 is 0L.
// lParam2 is 0L.
//
// Return 0L to fail the load.
//
// DefDriverProc will return NON-ZERO so we don't have to
// handle DRV_LOAD
//
DPF(DL_TRACE|FA_DRV, ("DRV_LOAD") ) ;
return 1L ;
case DRV_FREE:
//
// Sent to the driver when it is about to be discarded. This
// will always be the last message received by a driver before
// it is freed.
//
// dwDriverID is 0L.
// lParam1 is 0L.
// lParam2 is 0L.
//
// Return value is ignored.
//
DPF(DL_TRACE|FA_DRV, ("DRV_FREE") ) ;
return 1L ;
case DRV_OPEN:
//
// Sent to the driver when it is opened.
//
// dwDriverID is 0L.
//
// lParam1 is a far pointer to a zero-terminated string
// containing the name used to open the driver.
//
// lParam2 is passed through from the drvOpen call.
//
// Return 0L to fail the open.
//
// DefDriverProc will return ZERO so we do have to
// handle the DRV_OPEN message.
//
DPF(DL_TRACE|FA_DRV, ("DRV_OPEN") ) ;
return 1L ;
case DRV_CLOSE:
//
// Sent to the driver when it is closed. Drivers are unloaded
// when the close count reaches zero.
//
// dwDriverID is the driver identifier returned from the
// corresponding DRV_OPEN.
//
// lParam1 is passed through from the drvOpen call.
//
// lParam2 is passed through from the drvOpen call.
//
// Return 0L to fail the close.
//
// DefDriverProc will return ZERO so we do have to
// handle the DRV_CLOSE message.
//
DPF(DL_TRACE|FA_DRV, ("DRV_CLOSE") ) ;
return 1L ;
case DRV_ENABLE:
//
// Sent to the driver when the driver is loaded or reloaded
// and whenever Windows is enabled. Drivers should only
// hook interrupts or expect ANY part of the driver to be in
// memory between enable and disable messages
//
// dwDriverID is 0L.
// lParam1 is 0L.
// lParam2 is 0L.
//
// Return value is ignored.
//
DPF(DL_TRACE|FA_DRV, ("DRV_ENABLE") ) ;
if (!DrvInit())
return 0L ; // error
//
// Make sure that we don't take the critical section
// in wdmaudIoControl
//
lpDeviceInfo = GlobalAllocDeviceInfo(L"BogusDeviceString");
if( lpDeviceInfo )
{
lpDeviceInfo->OpenDone = 0;
lpDeviceInfo->DeviceType = AuxDevice;
wdmaudIoControl(lpDeviceInfo,
0,
NULL,
IOCTL_WDMAUD_INIT);
GlobalFreeDeviceInfo(lpDeviceInfo);
return 1L;
} else
return 0L;
case DRV_DISABLE:
//
// Sent to the driver before the driver is freed.
// and whenever Windows is disabled
//
// dwDriverID is 0L.
// lParam1 is 0L.
// lParam2 is 0L.
//
// Return value is ignored.
//
DPF(DL_TRACE|FA_DRV, ("DRV_DISABLE") ) ;
//
// Make sure that we don't take the critical section
// in wdmaudIoControl
//
lpDeviceInfo = GlobalAllocDeviceInfo(L"BogusDeviceString");
if( lpDeviceInfo )
{
lpDeviceInfo->OpenDone = 0;
lpDeviceInfo->DeviceType = AuxDevice;
wdmaudIoControl(lpDeviceInfo,
0,
NULL,
IOCTL_WDMAUD_EXIT);
DrvEnd() ;
GlobalFreeDeviceInfo(lpDeviceInfo);
return 1L ;
} else {
return 0L;
}
#ifndef UNDER_NT
case DRV_EXITSESSION:
//
// Sent to the driver when windows is exiting
//
DPF(DL_TRACE|FA_DRV, ("DRV_EXITSESSION") ) ;
fExiting = 1;
while (cPendingOpens != 0)
{
Yield();
}
return 1L ;
#endif
case DRV_QUERYCONFIGURE:
//
// Sent to the driver so that applications can
// determine whether the driver supports custom
// configuration. The driver should return a
// non-zero value to indicate that configuration
// is supported.
//
// For WDM drivers the settings dialog will be completely
// tied to the Device Manager. The individual drivers will
// have to register a property page that will be invoked
// when the user changes the device settings via the Device
// Manager.
//
// dwDriverID is the value returned from the DRV_OPEN
// call that must have succeeded before this message
// was sent.
//
// lParam1 is passed from the app and is undefined.
// lParam2 is passed from the app and is undefined.
//
// Return 0L to indicate configuration NOT supported.
//
DPF(DL_TRACE|FA_DRV, ("DRV_QUERYCONFIGURE") ) ;
return 0L ;
case DRV_CONFIGURE:
//
// Sent to the driver so that it can display a custom
// configuration dialog box.
//
// lParam1 is passed from the app. and should contain
// the parent window handle in the loword.
// lParam2 is passed from the app and is undefined.
//
// Return value is REBOOT, OK, RESTART.
//
DPF(DL_TRACE|FA_DRV, ("DRV_CONFIGURE") ) ;
return 0L ;
case DRV_INSTALL:
//
// TODO: Should wdmaud.sys be added here so that I
// don't have to reboot?
//
DPF(DL_TRACE|FA_DRV, ("DRV_INSTALL") ) ;
return DRV_OK ; // Install OK, Don't reboot
case DRV_REMOVE:
DPF(DL_TRACE|FA_DRV, ("DRV_REMOVE") ) ;
return 0 ;
//
// TODO: Handle ACPI power management messages.
//
// Do I need to handle this case or is it
// completely covered by the kernel mode driver?
//
}
return DefDriverProc( id, hDriver, msg, lParam1, lParam2 ) ;
} // DriverProc()
/**************************************************************************
@doc EXTERNAL
@api BOOL | LibMain | Entry point for 16-bit driver.
@rdesc The return value is TRUE if the initialisation completed ok,
FALSE if not.
**************************************************************************/
BOOL FAR PASCAL LibMain
(
HANDLE hInstance,
WORD wHeapSize,
LPSTR lpszCmdLine
)
{
#ifdef DEBUG
// get debug level - default should be DL_WARNING not DL_ERROR
uiDebugLevel = GetProfileInt( STR_MMDEBUG, STR_DRIVER, DL_ERROR );
#endif
#ifdef HTTP
DPF(DL_WARNING|FA_ALL, ("************************************************************") );
DPF(DL_WARNING|FA_ALL, ("* uiDebugLevel=%08X controls the debug output. To change",uiDebugLevel) );
DPF(DL_WARNING|FA_ALL, ("* edit uiDebugLevel like: e uidebuglevel and set to ") );
DPF(DL_WARNING|FA_ALL, ("* 0 - show only fatal error messages and asserts ") );
DPF(DL_WARNING|FA_ALL, ("* 1 (Default) - Also show non-fatal errors and return codes ") );
DPF(DL_WARNING|FA_ALL, ("* 2 - Also show trace messages ") );
DPF(DL_WARNING|FA_ALL, ("* 4 - Show Every message ") );
DPF(DL_WARNING|FA_ALL, ("* See http:\\\\debugtips\\msgs\\wdmaud.htm for more info ") );
DPF(DL_WARNING|FA_ALL, ("************************************************************") );
#else
DPF(DL_TRACE|FA_ALL, ("************************************************************") );
DPF(DL_TRACE|FA_ALL, ("* uiDebugLevel=%08X controls the debug output. To change",uiDebugLevel) );
DPF(DL_TRACE|FA_ALL, ("* edit uiDebugLevel like: e uidebuglevel and set to ") );
DPF(DL_TRACE|FA_ALL, ("* 0 - show only fatal error messages and asserts ") );
DPF(DL_TRACE|FA_ALL, ("* 1 (Default) - Also show non-fatal errors and return codes ") );
DPF(DL_TRACE|FA_ALL, ("* 2 - Also show trace messages ") );
DPF(DL_TRACE|FA_ALL, ("* 4 - Show Every message ") );
DPF(DL_TRACE|FA_ALL, ("************************************************************") );
#endif
return TRUE;
}