/**************************************************************************** * * drvlib.c * * Multimedia kernel driver support library (drvlib) * * Copyright (c) 1993-1995 Microsoft Corporation * * This module contains * * -- the entry point and startup code * -- debug support code * * History * ***************************************************************************/ #include #include #include CRITICAL_SECTION mmDrvCritSec; // Serialize access to device lists #if DBG char ModuleName[MAX_PATH]; #endif #if DBG /* * read profile item from registry */ //#include #define KEYNAMEA "Software\\Microsoft\\Multimedia\\" #define KEYNAME TEXT("Software\\Microsoft\\Multimedia\\") #define KEYNAMEW KEYNAME #define ROOTKEY HKEY_CURRENT_USER UINT mmGetProfileIntA(LPCSTR appname, LPCSTR valuename, INT uDefault); // Now map all instances of GetProfileIntA to mmGetProfileIntA #define GetProfileIntA mmGetProfileIntA static HKEY GetKeyA(LPCSTR appname, BOOL fCreate) { HKEY key = 0; char achName[MAX_PATH]; lstrcpyA(achName, KEYNAMEA); lstrcatA(achName, appname); if ((!fCreate && RegOpenKeyA(ROOTKEY, achName, &key) == ERROR_SUCCESS) || (fCreate && RegCreateKeyA(ROOTKEY, achName, &key) == ERROR_SUCCESS)) { } return(key); } /* * read a UINT from the profile, or return default if * not found. */ UINT mmGetProfileIntA(LPCSTR appname, LPCSTR valuename, INT uDefault) { DWORD dwType; INT value = uDefault; DWORD dwData; int cbData; HKEY key = GetKeyA(appname, FALSE); if (key) { cbData = sizeof(dwData); if (RegQueryValueExA( key, (LPSTR)valuename, NULL, &dwType, (PBYTE) &dwData, &cbData) == ERROR_SUCCESS) { if (dwType == REG_DWORD || dwType == REG_BINARY) { value = (INT)dwData; } else if (dwType == REG_SZ) { value = atoi((LPSTR) &dwData); } } RegCloseKey(key); } return((UINT)value); } #endif // DBG /************************************************************************** @doc EXTERNAL @api BOOL | DllInstanceInit | This procedure is called whenever a process attaches or detaches from the DLL. @parm PVOID | hModule | Handle of the DLL. @parm ULONG | Reason | What the reason for the call is. @parm PCONTEXT | pContext | Some random other information. @rdesc The return value is TRUE if the initialisation completed ok, FALSE if not. **************************************************************************/ BOOL DrvLibInit(HINSTANCE hModule, ULONG Reason, PCONTEXT pContext) { UNREFERENCED_PARAMETER(pContext); if (Reason == DLL_PROCESS_ATTACH) { #if DBG /* ** Cache our dll name for debugging */ { char ModuleFileName[MAX_PATH]; if (GetModuleFileNameA((HMODULE)hModule, ModuleFileName, MAX_PATH) == 0) { mmdrvDebugLevel = 0; } else { char drive[MAX_PATH]; char dir[MAX_PATH]; char ext[MAX_PATH]; // note: we could use the WIN32 API GetFileTitle _splitpath(ModuleFileName, drive, dir, ModuleName, ext); mmdrvDebugLevel = GetProfileIntA("DEBUG", ModuleName, 0); dprintf2 (("Starting, debug level=%d", mmdrvDebugLevel)); } } #endif hInstance = hModule; // // Create our process DLL heap // hHeap = GetProcessHeap(); if (hHeap == NULL) { return FALSE; } DisableThreadLibraryCalls(hModule); InitializeCriticalSection(&mmDrvCritSec); // // Load our device list // if (sndFindDevices() != MMSYSERR_NOERROR) { DeleteCriticalSection(&mmDrvCritSec); return FALSE; } } else { if (Reason == DLL_PROCESS_DETACH) { dprintf2(("Ending")); TerminateMidi(); TerminateWave(); DeleteCriticalSection(&mmDrvCritSec); } } return TRUE; } #if DBG int mmdrvDebugLevel = 0; /*************************************************************************** @doc INTERNAL @api void | mmdrvDbgOut | This function sends output to the current debug output device. @parm LPSTR | lpszFormat | Pointer to a printf style format string. @parm ??? | ... | Args. @rdesc There is no return value. ****************************************************************************/ void mmdrvDbgOut(LPSTR lpszFormat, ...) { char buf[256]; va_list va; OutputDebugStringA(ModuleName); OutputDebugStringA(": "); va_start(va, lpszFormat); vsprintf(buf, lpszFormat, va); va_end(va); OutputDebugStringA(buf); OutputDebugStringA("\n"); } /*************************************************************************** @doc INTERNAL @api void | dDbgAssert | This function prints an assertion message. @parm LPSTR | exp | Pointer to the expression string. @parm LPSTR | file | Pointer to the file name. @parm int | line | The line number. @rdesc There is no return value. ****************************************************************************/ void dDbgAssert(LPSTR exp, LPSTR file, int line) { dprintf1(("Assertion failure:")); dprintf1((" Exp: %s", exp)); dprintf1((" File: %s, line: %d", file, line)); DebugBreak(); } #endif // DBG