Mercurial > mplayer.hg
annotate loader/driver.c @ 8744:f3c6f022d6b0
10l ;)
author | colin |
---|---|
date | Fri, 03 Jan 2003 18:33:26 +0000 |
parents | fb88ccbc5ccc |
children | b0d1b415320c |
rev | line source |
---|---|
7386 | 1 #include "config.h" |
2 | |
1 | 3 #include <stdio.h> |
4 #ifdef HAVE_MALLOC_H | |
5 #include <malloc.h> | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
6 #endif |
1 | 7 #include <stdlib.h> |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
8 #ifdef __FreeBSD__ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
9 #include <sys/time.h> |
1 | 10 #endif |
11 | |
2068
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
12 #include "win32.h" |
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
13 #include "wine/driver.h" |
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
14 #include "wine/pe_image.h" |
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
15 #include "wine/winreg.h" |
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
16 #include "wine/vfw.h" |
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
17 #include "registry.h" |
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
18 #include "ldt_keeper.h" |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
19 #include "driver.h" |
8451 | 20 #include "ext.h" |
1 | 21 |
7386 | 22 extern char* def_path; |
1 | 23 |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
24 #if 1 |
7386 | 25 |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
26 /* |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
27 * STORE_ALL/REST_ALL seems like an attempt to workaround problems due to |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
28 * WINAPI/no-WINAPI bustage. |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
29 * |
7386 | 30 * There should be no need for the STORE_ALL/REST_ALL hack once all |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
31 * function definitions agree with their prototypes (WINAPI-wise) and |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
32 * we make sure, that we do not call these functions without a proper |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
33 * prototype in scope. |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
34 */ |
7386 | 35 |
36 #define STORE_ALL | |
37 #define REST_ALL | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
38 #else |
7386 | 39 // this asm code is no longer needed |
1 | 40 #define STORE_ALL \ |
7386 | 41 __asm__ __volatile__ ( \ |
1 | 42 "push %%ebx\n\t" \ |
43 "push %%ecx\n\t" \ | |
44 "push %%edx\n\t" \ | |
45 "push %%esi\n\t" \ | |
46 "push %%edi\n\t"::) | |
47 | |
48 #define REST_ALL \ | |
7386 | 49 __asm__ __volatile__ ( \ |
1 | 50 "pop %%edi\n\t" \ |
51 "pop %%esi\n\t" \ | |
52 "pop %%edx\n\t" \ | |
53 "pop %%ecx\n\t" \ | |
54 "pop %%ebx\n\t"::) | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
55 #endif |
1 | 56 |
7386 | 57 static int needs_free=0; |
58 void SetCodecPath(const char* path) | |
59 { | |
60 if(needs_free)free(def_path); | |
61 if(path==0) | |
62 { | |
63 def_path=WIN32_PATH; | |
64 needs_free=0; | |
65 return; | |
66 } | |
67 def_path = (char*) malloc(strlen(path)+1); | |
68 strcpy(def_path, path); | |
69 needs_free=1; | |
70 } | |
1 | 71 |
72 static DWORD dwDrvID = 0; | |
73 | |
7386 | 74 LRESULT WINAPI SendDriverMessage(HDRVR hDriver, UINT message, |
75 LPARAM lParam1, LPARAM lParam2) | |
1 | 76 { |
77 DRVR* module=(DRVR*)hDriver; | |
78 int result; | |
7386 | 79 #ifndef __svr4__ |
80 char qw[300]; | |
81 #endif | |
82 #ifdef DETAILED_OUT | |
1 | 83 printf("SendDriverMessage: driver %X, message %X, arg1 %X, arg2 %X\n", hDriver, message, lParam1, lParam2); |
84 #endif | |
7386 | 85 if (!module || !module->hDriverModule || !module->DriverProc) return -1; |
86 #ifndef __svr4__ | |
87 __asm__ __volatile__ ("fsave (%0)\n\t": :"r"(&qw)); | |
88 #endif | |
89 | |
90 Setup_FS_Segment(); | |
1 | 91 |
7386 | 92 STORE_ALL; |
93 result=module->DriverProc(module->dwDriverID, hDriver, message, lParam1, lParam2); | |
94 REST_ALL; | |
95 | |
96 #ifndef __svr4__ | |
97 __asm__ __volatile__ ("frstor (%0)\n\t": :"r"(&qw)); | |
98 #endif | |
99 | |
100 #ifdef DETAILED_OUT | |
101 printf("\t\tResult: %X\n", result); | |
102 #endif | |
103 return result; | |
1 | 104 } |
105 | |
7386 | 106 void DrvClose(HDRVR hDriver) |
1 | 107 { |
7386 | 108 if (hDriver) |
109 { | |
110 DRVR* d = (DRVR*)hDriver; | |
111 if (d->hDriverModule) | |
112 { | |
113 Setup_FS_Segment(); | |
114 if (d->DriverProc) | |
115 { | |
116 SendDriverMessage(hDriver, DRV_CLOSE, 0, 0); | |
117 d->dwDriverID = 0; | |
118 SendDriverMessage(hDriver, DRV_FREE, 0, 0); | |
119 } | |
120 FreeLibrary(d->hDriverModule); | |
121 } | |
122 free(d); | |
1 | 123 } |
7386 | 124 CodecRelease(); |
1 | 125 } |
126 | |
7386 | 127 //DrvOpen(LPCSTR lpszDriverName, LPCSTR lpszSectionName, LPARAM lParam2) |
128 HDRVR DrvOpen(LPARAM lParam2) | |
1 | 129 { |
7386 | 130 NPDRVR hDriver; |
131 int i; | |
132 char unknown[0x124]; | |
133 const char* filename = (const char*) ((ICOPEN*) lParam2)->pV1Reserved; | |
1 | 134 |
7386 | 135 #ifdef MPLAYER |
236 | 136 Setup_LDT_Keeper(); |
7386 | 137 printf("Loading codec DLL: '%s'\n",filename); |
138 #endif | |
236 | 139 |
7386 | 140 hDriver = (NPDRVR) malloc(sizeof(DRVR)); |
141 if (!hDriver) | |
1 | 142 return ((HDRVR) 0); |
7386 | 143 memset((void*)hDriver, 0, sizeof(DRVR)); |
1 | 144 |
7386 | 145 CodecAlloc(); |
146 Setup_FS_Segment(); | |
147 | |
148 hDriver->hDriverModule = LoadLibraryA(filename); | |
149 if (!hDriver->hDriverModule) | |
150 { | |
151 printf("Can't open library %s\n", filename); | |
152 DrvClose((HDRVR)hDriver); | |
153 return ((HDRVR) 0); | |
1 | 154 } |
155 | |
7386 | 156 hDriver->DriverProc = (DRIVERPROC) GetProcAddress(hDriver->hDriverModule, |
157 "DriverProc"); | |
158 if (!hDriver->DriverProc) | |
1 | 159 { |
7386 | 160 printf("Library %s is not a valid VfW/ACM codec\n", filename); |
161 DrvClose((HDRVR)hDriver); | |
162 return ((HDRVR) 0); | |
1 | 163 } |
164 | |
7386 | 165 TRACE("DriverProc == %X\n", hDriver->DriverProc); |
166 SendDriverMessage((HDRVR)hDriver, DRV_LOAD, 0, 0); | |
167 TRACE("DRV_LOAD Ok!\n"); | |
168 SendDriverMessage((HDRVR)hDriver, DRV_ENABLE, 0, 0); | |
169 TRACE("DRV_ENABLE Ok!\n"); | |
170 hDriver->dwDriverID = ++dwDrvID; // generate new id | |
1 | 171 |
7386 | 172 // open driver and remmeber proper DriverID |
173 hDriver->dwDriverID = SendDriverMessage((HDRVR)hDriver, DRV_OPEN, (LPARAM) unknown, lParam2); | |
174 TRACE("DRV_OPEN Ok!(%X)\n", hDriver->dwDriverID); | |
1 | 175 |
7386 | 176 printf("Loaded DLL driver %s\n", filename); |
177 return (HDRVR)hDriver; | |
1 | 178 } |