331 lines
9.5 KiB
C
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;
|
|
}
|