|
|
/*
init.c initialisation for MSVIDEO.DLL
Copyright (c) Microsoft Corporation 1992. All rights reserved
*/
#include <windows.h>
#include <win32.h>
#include <verinfo.h> // to get rup and MMVERSION
#include "mmsystem.h"
#include "msviddrv.h"
#include <vfw.h>
#include "msvideoi.h"
#ifdef _WIN32
#include "profile.h"
#endif
#include "debug.h"
/*
* we have to allow the compman dll to perform load and unload * processing - among other things, it has a critsec that needs to * be initialised and freed */ #ifdef _WIN32
extern BOOL WINAPI ICDllEntryPoint(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved); #else
extern BOOL FAR PASCAL ICDllEntryPoint(DWORD dwReason, HINSTANCE hinstDLL, WORD wDS, WORD wHeapSize, DWORD dwReserved1, WORD wReserved2); #endif
//
//
//
#ifndef _WIN32
extern void FAR PASCAL videoCleanup(HTASK hTask); #else
#define videoCleanup(hTask) // Nothing to do for 32 bit code
#endif
extern void FAR PASCAL DrawDibCleanup(HTASK hTask); extern void FAR PASCAL ICCleanup(HTASK hTask);
//--------------------------------------------------------------------------;
//
//
// -- == DLL Initialization entry points == --
//
//
//--------------------------------------------------------------------------;
/*****************************************************************************
* Variables * ****************************************************************************/
HINSTANCE ghInst; // our module handle
BOOL gfIsRTL;
// dont change this without changing DRAWDIB\PROFDISP.C & MSVIDEO.RC
#define IDS_ISRTL 4003
#ifdef _WIN32
/*****************************************************************************
* @doc INTERNAL VIDEO * * DLLEntryPoint - Standard 32-bit DLL entry point. * ****************************************************************************/
BOOL WINAPI DLLEntryPoint ( HINSTANCE hInstance, ULONG Reason, LPVOID pv) { BOOL fReturn = TRUE;
switch (Reason) { TCHAR ach[2];
case DLL_PROCESS_ATTACH: DbgInitialize(TRUE);
ghInst = hInstance; LoadString(ghInst, IDS_ISRTL, ach, sizeof(ach)/sizeof(TCHAR)); gfIsRTL = ach[0] == TEXT('1');
DisableThreadLibraryCalls(hInstance);
fReturn = ICDllEntryPoint(hInstance, Reason, pv);
break;
case DLL_PROCESS_DETACH: DrawDibCleanup(NULL);
ICCleanup(NULL);
ICDllEntryPoint(hInstance, Reason, pv);
videoCleanup(NULL);
CloseKeys();
break;
//case DLL_THREAD_DETACH:
// break;
//case DLL_THREAD_ATTACH:
// break;
}
return TRUE; }
#else
//--------------------------------------------------------------------------;
//
// BOOL DllEntryPoint
//
// Description:
// This is a special 16-bit entry point called by the Chicago kernel
// for thunk initialization and cleanup. It is called on each usage
// increment or decrement. Do not call GetModuleUsage within this
// function as it is undefined whether the usage is updated before
// or after this DllEntryPoint is called.
//
// Arguments:
// DWORD dwReason:
// 1 - attach (usage increment)
// 0 - detach (usage decrement)
//
// HINSTANCE hinst:
//
// WORD wDS:
//
// WORD wHeapSize:
//
// DWORD dwReserved1:
//
// WORD wReserved2:
//
// Return (BOOL):
//
// Notes:
// DAYTONA 16-bit builds (ie, WOW):
// We call this function from LibEntry.asm. Daytona WOW does not
// call this function directly. Since we only call it from
// LibEntry and WEP, cUsage just bounces between 0 and 1.
//
// CHICAGO 16-bit builds:
// The Chicago kernel calls this directly for every usage increment
// and decrement. cUsage will track the usages and init or terminate
// appropriately.
//
// History:
// 07/07/94 [frankye]
//
//--------------------------------------------------------------------------;
BOOL FAR PASCAL _export DllEntryPoint ( DWORD dwReason, HINSTANCE hInstance, WORD wDS, WORD wHeapSize, DWORD dwReserved1, WORD wReserved2 ) { static UINT cUsage = 0;
switch (dwReason) { case 1: { //
// Usage increment
//
cUsage++;
ASSERT( 0 != cUsage ); if (1 == cUsage) { TCHAR ach[2]; DbgInitialize(TRUE); ghInst = hInstance; LoadString(ghInst, IDS_ISRTL, ach, sizeof(ach)/sizeof(TCHAR)); gfIsRTL = ach[0] == TEXT('1'); } //
// Call ICProcessAttach on _every_ usage increment. On Chicago,
// the ICM stuff needs to be aware of all processes that load
// and free this dll. The only way to do this is to allow it to
// look at stuff on every usage delta.
//
ICProcessAttach();
return TRUE; } case 0: { //
// Usage decrement
//
ASSERT( 0 != cUsage ); cUsage--;
if (0 == cUsage) { DrawDibCleanup(NULL); ICCleanup(NULL); } //
// Call ICProcessDetach on _every_ usage increment. On Chicago,
// the ICM stuff needs to be aware of all processes that load
// and free this dll. The only way to do this is to allow it to
// look at stuff on every usage delta.
//
ICProcessDetach(); if (0 == cUsage) { videoCleanup(NULL); }
return TRUE; }
} return TRUE; }
#endif
//--------------------------------------------------------------------------;
//
//
//
//
//--------------------------------------------------------------------------;
/*****************************************************************************
* @doc EXTERNAL VIDEO * * @api DWORD | VideoForWindowsVersion | This function returns the version * of the Microsoft Video for Windows software. * * @rdesc Returns a DWORD version, the hiword is the product version the * loword is the minor revision. * * @comm currently returns 0x010A00## (1.10.00.##) ## is the internal build * number. * ****************************************************************************/ #if 0
#ifdef rup
#define MSVIDEO_VERSION (0x01000000l+rup) // 1.00.00.##
#else
#define MSVIDEO_VERSION (0x01000000l) // 1.00.00.00
#endif
#else
#define MSVIDEO_VERSION (0x0L+(((DWORD)MMVERSION)<<24)+(((DWORD)MMREVISION)<<16)+((DWORD)MMRELEASE))
#endif
DWORD FAR PASCAL VideoForWindowsVersion(void) { return MSVIDEO_VERSION; }
|