summaryrefslogtreecommitdiffstats
path: root/loader/drv.c
diff options
context:
space:
mode:
authordiego <diego@b3059339-0415-0410-9bf9-f77b7e298cf2>2008-06-08 10:43:30 +0000
committerdiego <diego@b3059339-0415-0410-9bf9-f77b7e298cf2>2008-06-08 10:43:30 +0000
commit4b34771463b96153c274db1b91eb425dce50208d (patch)
tree4a8bc86666133bf3308c39ccdbb88afbcebd8fbc /loader/drv.c
parent108fff3efbb63e1160437fdfd8ed6916a9c7c0ca (diff)
downloadmpv-4b34771463b96153c274db1b91eb425dce50208d.tar.bz2
mpv-4b34771463b96153c274db1b91eb425dce50208d.tar.xz
Rename loader/driver.[ch] to loader/drv.[ch], otherwise loader/driver.h can
conflict with the header by the same name in loader/wine/driver.h. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@27031 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'loader/drv.c')
-rw-r--r--loader/drv.c199
1 files changed, 199 insertions, 0 deletions
diff --git a/loader/drv.c b/loader/drv.c
new file mode 100644
index 0000000000..5d4f0dcb93
--- /dev/null
+++ b/loader/drv.c
@@ -0,0 +1,199 @@
+/*
+ * Modified for use with MPlayer, detailed changelog at
+ * http://svn.mplayerhq.hu/mplayer/trunk/
+ */
+
+#include "config.h"
+#include "debug.h"
+
+#include <stdio.h>
+#ifdef HAVE_MALLOC_H
+#include <malloc.h>
+#endif
+#include <stdlib.h>
+#ifdef __FreeBSD__
+#include <sys/time.h>
+#endif
+
+#include "win32.h"
+#include "wine/driver.h"
+#include "wine/pe_image.h"
+#include "wine/winreg.h"
+#include "wine/vfw.h"
+#include "registry.h"
+#ifdef WIN32_LOADER
+#include "ldt_keeper.h"
+#endif
+#include "drv.h"
+#ifndef __MINGW32__
+#include "ext.h"
+#endif
+
+#ifndef WIN32_LOADER
+char* def_path=WIN32_PATH;
+#else
+extern char* def_path;
+#endif
+
+#if 1
+
+/*
+ * 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 is no longer needed
+#define STORE_ALL \
+ __asm__ __volatile__ ( \
+ "push %%ebx\n\t" \
+ "push %%ecx\n\t" \
+ "push %%edx\n\t" \
+ "push %%esi\n\t" \
+ "push %%edi\n\t"::)
+
+#define REST_ALL \
+ __asm__ __volatile__ ( \
+ "pop %%edi\n\t" \
+ "pop %%esi\n\t" \
+ "pop %%edx\n\t" \
+ "pop %%ecx\n\t" \
+ "pop %%ebx\n\t"::)
+#endif
+
+static int needs_free=0;
+void SetCodecPath(const char* path)
+{
+ if(needs_free)free(def_path);
+ if(path==0)
+ {
+ def_path=WIN32_PATH;
+ needs_free=0;
+ return;
+ }
+ def_path = (char*) malloc(strlen(path)+1);
+ strcpy(def_path, path);
+ needs_free=1;
+}
+
+static DWORD dwDrvID = 0;
+
+LRESULT WINAPI SendDriverMessage(HDRVR hDriver, UINT message,
+ LPARAM lParam1, LPARAM lParam2)
+{
+ DRVR* module=(DRVR*)hDriver;
+ int result;
+#ifndef __svr4__
+ char qw[300];
+#endif
+#ifdef DETAILED_OUT
+ printf("SendDriverMessage: driver %X, message %X, arg1 %X, arg2 %X\n", hDriver, message, lParam1, lParam2);
+#endif
+ if (!module || !module->hDriverModule || !module->DriverProc) return -1;
+#ifndef __svr4__
+ __asm__ __volatile__ ("fsave (%0)\n\t": :"r"(&qw));
+#endif
+
+#ifdef WIN32_LOADER
+ Setup_FS_Segment();
+#endif
+
+ STORE_ALL;
+ result=module->DriverProc(module->dwDriverID, hDriver, message, lParam1, lParam2);
+ REST_ALL;
+
+#ifndef __svr4__
+ __asm__ __volatile__ ("frstor (%0)\n\t": :"r"(&qw));
+#endif
+
+#ifdef DETAILED_OUT
+ printf("\t\tResult: %X\n", result);
+#endif
+ return result;
+}
+
+void DrvClose(HDRVR hDriver)
+{
+ if (hDriver)
+ {
+ DRVR* d = (DRVR*)hDriver;
+ if (d->hDriverModule)
+ {
+#ifdef WIN32_LOADER
+ Setup_FS_Segment();
+#endif
+ if (d->DriverProc)
+ {
+ SendDriverMessage(hDriver, DRV_CLOSE, 0, 0);
+ d->dwDriverID = 0;
+ SendDriverMessage(hDriver, DRV_FREE, 0, 0);
+ }
+ FreeLibrary(d->hDriverModule);
+ }
+ free(d);
+ }
+#ifdef WIN32_LOADER
+ CodecRelease();
+#endif
+}
+
+//DrvOpen(LPCSTR lpszDriverName, LPCSTR lpszSectionName, LPARAM lParam2)
+HDRVR DrvOpen(LPARAM lParam2)
+{
+ NPDRVR hDriver;
+ char unknown[0x124];
+ const char* filename = (const char*) ((ICOPEN*) lParam2)->pV1Reserved;
+
+#ifdef WIN32_LOADER
+ Setup_LDT_Keeper();
+#endif
+ printf("Loading codec DLL: '%s'\n",filename);
+
+ hDriver = (NPDRVR) malloc(sizeof(DRVR));
+ if (!hDriver)
+ return (HDRVR) 0;
+ memset((void*)hDriver, 0, sizeof(DRVR));
+
+#ifdef WIN32_LOADER
+ CodecAlloc();
+ Setup_FS_Segment();
+#endif
+
+ hDriver->hDriverModule = LoadLibraryA(filename);
+ if (!hDriver->hDriverModule)
+ {
+ printf("Can't open library %s\n", filename);
+ DrvClose((HDRVR)hDriver);
+ return (HDRVR) 0;
+ }
+
+ hDriver->DriverProc = (DRIVERPROC) GetProcAddress(hDriver->hDriverModule,
+ "DriverProc");
+ if (!hDriver->DriverProc)
+ {
+ printf("Library %s is not a valid VfW/ACM codec\n", filename);
+ DrvClose((HDRVR)hDriver);
+ return (HDRVR) 0;
+ }
+
+ TRACE("DriverProc == %X\n", hDriver->DriverProc);
+ SendDriverMessage((HDRVR)hDriver, DRV_LOAD, 0, 0);
+ TRACE("DRV_LOAD Ok!\n");
+ SendDriverMessage((HDRVR)hDriver, DRV_ENABLE, 0, 0);
+ TRACE("DRV_ENABLE Ok!\n");
+ hDriver->dwDriverID = ++dwDrvID; // generate new id
+
+ // open driver and remmeber proper DriverID
+ hDriver->dwDriverID = SendDriverMessage((HDRVR)hDriver, DRV_OPEN, (LPARAM) unknown, lParam2);
+ TRACE("DRV_OPEN Ok!(%X)\n", hDriver->dwDriverID);
+
+ printf("Loaded DLL driver %s at %x\n", filename, hDriver->hDriverModule);
+ return (HDRVR)hDriver;
+}