summaryrefslogtreecommitdiff
path: root/src/libw32dll/wine/driver.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libw32dll/wine/driver.c')
-rw-r--r--src/libw32dll/wine/driver.c216
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;
}
-