diff options
Diffstat (limited to 'src/libw32dll/wine/driver.c')
-rw-r--r-- | src/libw32dll/wine/driver.c | 216 |
1 files changed, 126 insertions, 90 deletions
diff --git a/src/libw32dll/wine/driver.c b/src/libw32dll/wine/driver.c index 08f5f745c..4a67fb343 100644 --- a/src/libw32dll/wine/driver.c +++ b/src/libw32dll/wine/driver.c @@ -1,27 +1,44 @@ #include "config.h" -#include <stdio.h> - -#ifdef HAVE_MALLOC_H -#include <malloc.h> -#else -#include <stdlib.h> -#endif #include "driver.h" #include "pe_image.h" #include "winreg.h" #include "vfw.h" -#include "win32.h" #include "registry.h" +#include "ldt_keeper.h" +#include "ext.h" +#include "win32.h" +#include "driver.h" +#include "debugtools.h" -#ifdef __FreeBSD__ -#include <sys/time.h> +#include <stdio.h> +#include <stdlib.h> +#ifdef HAVE_MALLOC_H +#include <malloc.h> #endif +// #define DETAILED_OUT + +char* win32_codec_name=NULL; // must be set before calling DrvOpen() !!! +char* win32_def_path =NULL; // must be set before calling DrvOpen() !!! + #if 1 -#define STORE_ALL /**/ -#define REST_ALL /**/ + +/* + * STORE_ALL/REST_ALL seems like an attempt to workaround problems due to + * WINAPI/no-WINAPI bustage. + * + * There should be no need for the STORE_ALL/REST_ALL hack once all + * function definitions agree with their prototypes (WINAPI-wise) and + * we make sure, that we do not call these functions without a proper + * prototype in scope. + */ + +#define STORE_ALL +#define REST_ALL #else +// this asm code doesn't work - why ??? +// kabi@i.am #define STORE_ALL \ __asm__ ( \ "push %%ebx\n\t" \ @@ -39,17 +56,14 @@ "pop %%ebx\n\t"::) #endif - - static DWORD dwDrvID = 0; - LRESULT WINAPI SendDriverMessage( HDRVR hDriver, UINT message, - LPARAM lParam1, LPARAM lParam2 ) + LPARAM lParam1, LPARAM lParam2 ) { DRVR* module=(DRVR*)hDriver; int result; -#ifdef DETAILED_OUT +#ifdef DETAILED_OUT printf("SendDriverMessage: driver %X, message %X, arg1 %X, arg2 %X\n", hDriver, message, lParam1, lParam2); #endif if(module==0)return -1; @@ -58,112 +72,134 @@ LRESULT WINAPI SendDriverMessage( HDRVR hDriver, UINT message, STORE_ALL; result=module->DriverProc(module->dwDriverID,1,message,lParam1,lParam2); REST_ALL; -#ifdef DETAILED_OUT +#ifdef DETAILED_OUT printf("\t\tResult: %X\n", result); -#endif +#endif return result; -} +} -static NPDRVR DrvAlloc(HDRVR*lpDriver, LPUINT lpDrvResult) +static NPDRVR DrvAlloc(HDRVR* lpDriver, LPUINT lpDrvResult) { - NPDRVR npDriver; /* allocate and lock handle */ + *lpDrvResult = MMSYSERR_INVALPARAM; if (lpDriver) { - if ( (*lpDriver = (HDRVR) malloc(sizeof(DRVR))) ) - { - if ((npDriver = (NPDRVR) *lpDriver)) - { - *lpDrvResult = MMSYSERR_NOERROR; - return (npDriver); - } - free((NPDRVR)*lpDriver); - } - return (*lpDrvResult = MMSYSERR_NOMEM, (NPDRVR) 0); + if ((*lpDriver = (HDRVR) malloc(sizeof(DRVR))) != 0 ) + { + memset((void*)*lpDriver, 0, sizeof(DRVR)); + *lpDrvResult = MMSYSERR_NOERROR; + return (NPDRVR) *lpDriver; + } + *lpDrvResult = MMSYSERR_NOMEM; } - return (*lpDrvResult = MMSYSERR_INVALPARAM, (NPDRVR) 0); + return (NPDRVR) 0; +} + +static int needs_free=0; +void SetCodecPath(const char* path) +{ + if(needs_free)free(win32_def_path); + if(path==0) + { + win32_def_path=WIN32_PATH; + needs_free=0; + return; + } + win32_def_path=malloc(strlen(path)+1); + strcpy(win32_def_path, path); + needs_free=1; } - static void DrvFree(HDRVR hDriver) { - if(hDriver) - if(((DRVR*)hDriver)->hDriverModule) - if(((DRVR*)hDriver)->DriverProc) - (((DRVR*)hDriver)->DriverProc)(((DRVR*)hDriver)->dwDriverID, hDriver, DRV_CLOSE, 0, 0); - if(hDriver) { - if(((DRVR*)hDriver)->hDriverModule) - if(((DRVR*)hDriver)->DriverProc) - (((DRVR*)hDriver)->DriverProc)(0, hDriver, DRV_FREE, 0, 0); - FreeLibrary(((DRVR*)hDriver)->hDriverModule); - free((NPDRVR)hDriver); - return; + int i; + + Setup_FS_Segment(); + + if (hDriver) + { + if (((DRVR*)hDriver)->hDriverModule) + { + if (((DRVR*)hDriver)->DriverProc) + { + (((DRVR*)hDriver)->DriverProc)(((DRVR*)hDriver)->dwDriverID, hDriver, DRV_CLOSE, 0, 0); + (((DRVR*)hDriver)->DriverProc)(0, hDriver, DRV_FREE, 0, 0); + } + FreeLibrary(((DRVR*)hDriver)->hDriverModule); + } + free((NPDRVR)hDriver); } + return; } void DrvClose(HDRVR hdrvr) { DrvFree(hdrvr); + CodecRelease(); } -char* win32_codec_name=NULL; // must be set before calling DrvOpen() !!! -char* win32_def_path =NULL; // must be set before calling DrvOpen() !!! - -HDRVR -DrvOpen(LPARAM lParam2) +//DrvOpen(LPCSTR lpszDriverName, LPCSTR lpszSectionName, LPARAM lParam2) +HDRVR DrvOpen(LPARAM lParam2) { - // ICOPEN *icopen=(ICOPEN*)lParam2; UINT uDrvResult; HDRVR hDriver; NPDRVR npDriver; - char unknown[0x24]; -// char* codec_name=icopen->fccHandler; + char unknown[0x124]; + const char* filename = win32_codec_name; - if (!(npDriver = DrvAlloc(&hDriver, &uDrvResult))) - return ((HDRVR) 0); + npDriver = DrvAlloc(&hDriver, &uDrvResult); + if (!npDriver) + return (HDRVR) 0; - if (!(npDriver->hDriverModule = expLoadLibraryA(win32_codec_name))) { - printf("Can't open library %s\n", win32_codec_name); - DrvFree(hDriver); - return ((HDRVR) 0); + if (uDrvResult) + { + DrvFree(hDriver); + return (HDRVR) 0; } - - if (!(npDriver->DriverProc = (DRIVERPROC) - GetProcAddress(npDriver->hDriverModule, "DriverProc"))) { - printf("Library %s is not a valid codec\n", win32_codec_name); - FreeLibrary(npDriver->hDriverModule); - DrvFree(hDriver); - return ((HDRVR) 0); + + npDriver->hDriverModule = LoadLibraryA(filename); + + if (!npDriver->hDriverModule) + { + printf("Can't open library %s\n", filename); + DrvFree(hDriver); + return ((HDRVR) 0); } - //TRACE("DriverProc == %X\n", npDriver->DriverProc); - npDriver->dwDriverID = ++dwDrvID; + npDriver->DriverProc = (DRIVERPROC) GetProcAddress(npDriver->hDriverModule, + "DriverProc"); + if (!npDriver->DriverProc) + { + printf("Library %s is not a valid VfW/ACM codec\n", filename); + DrvFree(hDriver); + return ((HDRVR) 0); + } - STORE_ALL; - (npDriver->DriverProc)(0, hDriver, DRV_LOAD, 0, 0); - REST_ALL; - //TRACE("DRV_LOAD Ok!\n"); - STORE_ALL; - (npDriver->DriverProc)(0, hDriver, DRV_ENABLE, 0, 0); - REST_ALL; - //TRACE("DRV_ENABLE Ok!\n"); + TRACE("DriverProc == %X\n", npDriver->DriverProc); + npDriver->dwDriverID = ++dwDrvID; + + printf("Loaded DLL driver %s\n", filename); + + Setup_FS_Segment(); - // open driver STORE_ALL; - npDriver->dwDriverID=(npDriver->DriverProc)(npDriver->dwDriverID, hDriver, DRV_OPEN, - (LPARAM) (LPSTR) unknown, lParam2); + (npDriver->DriverProc)(0, hDriver, DRV_LOAD, 0, 0); + REST_ALL; + TRACE("DRV_LOAD Ok!\n"); + STORE_ALL; + (npDriver->DriverProc)(0, hDriver, DRV_ENABLE, 0, 0); + REST_ALL; + TRACE("DRV_ENABLE Ok!\n"); + + // open driver + STORE_ALL; + npDriver->dwDriverID=(npDriver->DriverProc)(npDriver->dwDriverID, hDriver, + DRV_OPEN, (LPARAM) (LPSTR) unknown, + lParam2); REST_ALL; - //TRACE("DRV_OPEN Ok!(%X)\n", npDriver->dwDriverID); + TRACE("DRV_OPEN Ok!(%X)\n", npDriver->dwDriverID); - if (uDrvResult) - { - DrvFree(hDriver); - hDriver = (HDRVR) 0; - } - - printf("Successfully loaded codec %s\n",win32_codec_name); - - return (hDriver); + CodecAlloc(); + return hDriver; } - |