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