Mercurial > mplayer.hg
annotate loader/driver.c @ 26107:610397af3388
synced with r26138
author | Gabrov |
---|---|
date | Sat, 01 Mar 2008 12:35:07 +0000 |
parents | b70f5ac9c001 |
children | 0fdf04b07ecb |
rev | line source |
---|---|
15166
f5537cc95b02
Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents:
12655
diff
changeset
|
1 /* |
18783 | 2 * Modified for use with MPlayer, detailed changelog at |
3 * http://svn.mplayerhq.hu/mplayer/trunk/ | |
15166
f5537cc95b02
Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents:
12655
diff
changeset
|
4 */ |
f5537cc95b02
Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents:
12655
diff
changeset
|
5 |
7386 | 6 #include "config.h" |
21261
a2e02e6b6379
Rename config.h --> debug.h and include config.h explicitly.
diego
parents:
18783
diff
changeset
|
7 #include "debug.h" |
7386 | 8 |
1 | 9 #include <stdio.h> |
10 #ifdef HAVE_MALLOC_H | |
11 #include <malloc.h> | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
12 #endif |
1 | 13 #include <stdlib.h> |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
14 #ifdef __FreeBSD__ |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
15 #include <sys/time.h> |
1 | 16 #endif |
17 | |
2068
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
18 #include "win32.h" |
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
19 #include "wine/driver.h" |
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
20 #include "wine/pe_image.h" |
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
21 #include "wine/winreg.h" |
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
22 #include "wine/vfw.h" |
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
23 #include "registry.h" |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
24 #ifdef WIN32_LOADER |
2068
3189c317dfc1
using ldt_keeper instead of setup_fs, includes changed
arpi
parents:
1307
diff
changeset
|
25 #include "ldt_keeper.h" |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
26 #endif |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
27 #include "driver.h" |
9978 | 28 #ifndef __MINGW32__ |
8451 | 29 #include "ext.h" |
9978 | 30 #endif |
1 | 31 |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
32 #ifndef WIN32_LOADER |
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
33 char* def_path=WIN32_PATH; |
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
34 #else |
7386 | 35 extern char* def_path; |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
36 #endif |
1 | 37 |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
38 #if 1 |
7386 | 39 |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
40 /* |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
41 * 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
|
42 * WINAPI/no-WINAPI bustage. |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
43 * |
7386 | 44 * 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
|
45 * 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
|
46 * 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
|
47 * prototype in scope. |
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
48 */ |
7386 | 49 |
50 #define STORE_ALL | |
51 #define REST_ALL | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
52 #else |
7386 | 53 // this asm code is no longer needed |
1 | 54 #define STORE_ALL \ |
7386 | 55 __asm__ __volatile__ ( \ |
1 | 56 "push %%ebx\n\t" \ |
57 "push %%ecx\n\t" \ | |
58 "push %%edx\n\t" \ | |
59 "push %%esi\n\t" \ | |
60 "push %%edi\n\t"::) | |
61 | |
62 #define REST_ALL \ | |
7386 | 63 __asm__ __volatile__ ( \ |
1 | 64 "pop %%edi\n\t" \ |
65 "pop %%esi\n\t" \ | |
66 "pop %%edx\n\t" \ | |
67 "pop %%ecx\n\t" \ | |
68 "pop %%ebx\n\t"::) | |
1307
d8c1b0b38edc
Add prototypes to wine/loader stuff, so that we can catch __stdcall function
jkeil
parents:
340
diff
changeset
|
69 #endif |
1 | 70 |
7386 | 71 static int needs_free=0; |
72 void SetCodecPath(const char* path) | |
73 { | |
74 if(needs_free)free(def_path); | |
75 if(path==0) | |
76 { | |
77 def_path=WIN32_PATH; | |
78 needs_free=0; | |
79 return; | |
80 } | |
81 def_path = (char*) malloc(strlen(path)+1); | |
82 strcpy(def_path, path); | |
83 needs_free=1; | |
84 } | |
1 | 85 |
86 static DWORD dwDrvID = 0; | |
87 | |
7386 | 88 LRESULT WINAPI SendDriverMessage(HDRVR hDriver, UINT message, |
89 LPARAM lParam1, LPARAM lParam2) | |
1 | 90 { |
91 DRVR* module=(DRVR*)hDriver; | |
92 int result; | |
7386 | 93 #ifndef __svr4__ |
94 char qw[300]; | |
95 #endif | |
96 #ifdef DETAILED_OUT | |
1 | 97 printf("SendDriverMessage: driver %X, message %X, arg1 %X, arg2 %X\n", hDriver, message, lParam1, lParam2); |
98 #endif | |
7386 | 99 if (!module || !module->hDriverModule || !module->DriverProc) return -1; |
100 #ifndef __svr4__ | |
101 __asm__ __volatile__ ("fsave (%0)\n\t": :"r"(&qw)); | |
102 #endif | |
103 | |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
104 #ifdef WIN32_LOADER |
7386 | 105 Setup_FS_Segment(); |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
106 #endif |
1 | 107 |
7386 | 108 STORE_ALL; |
109 result=module->DriverProc(module->dwDriverID, hDriver, message, lParam1, lParam2); | |
110 REST_ALL; | |
111 | |
112 #ifndef __svr4__ | |
113 __asm__ __volatile__ ("frstor (%0)\n\t": :"r"(&qw)); | |
114 #endif | |
115 | |
116 #ifdef DETAILED_OUT | |
117 printf("\t\tResult: %X\n", result); | |
118 #endif | |
119 return result; | |
1 | 120 } |
121 | |
7386 | 122 void DrvClose(HDRVR hDriver) |
1 | 123 { |
7386 | 124 if (hDriver) |
125 { | |
126 DRVR* d = (DRVR*)hDriver; | |
127 if (d->hDriverModule) | |
128 { | |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
129 #ifdef WIN32_LOADER |
7386 | 130 Setup_FS_Segment(); |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
131 #endif |
7386 | 132 if (d->DriverProc) |
133 { | |
134 SendDriverMessage(hDriver, DRV_CLOSE, 0, 0); | |
135 d->dwDriverID = 0; | |
136 SendDriverMessage(hDriver, DRV_FREE, 0, 0); | |
137 } | |
138 FreeLibrary(d->hDriverModule); | |
139 } | |
140 free(d); | |
1 | 141 } |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
142 #ifdef WIN32_LOADER |
7386 | 143 CodecRelease(); |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
144 #endif |
1 | 145 } |
146 | |
7386 | 147 //DrvOpen(LPCSTR lpszDriverName, LPCSTR lpszSectionName, LPARAM lParam2) |
148 HDRVR DrvOpen(LPARAM lParam2) | |
1 | 149 { |
7386 | 150 NPDRVR hDriver; |
151 char unknown[0x124]; | |
152 const char* filename = (const char*) ((ICOPEN*) lParam2)->pV1Reserved; | |
1 | 153 |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
154 #ifdef WIN32_LOADER |
236 | 155 Setup_LDT_Keeper(); |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
156 #endif |
7386 | 157 printf("Loading codec DLL: '%s'\n",filename); |
236 | 158 |
7386 | 159 hDriver = (NPDRVR) malloc(sizeof(DRVR)); |
160 if (!hDriver) | |
1 | 161 return ((HDRVR) 0); |
7386 | 162 memset((void*)hDriver, 0, sizeof(DRVR)); |
1 | 163 |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
164 #ifdef WIN32_LOADER |
7386 | 165 CodecAlloc(); |
166 Setup_FS_Segment(); | |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
167 #endif |
7386 | 168 |
169 hDriver->hDriverModule = LoadLibraryA(filename); | |
170 if (!hDriver->hDriverModule) | |
171 { | |
172 printf("Can't open library %s\n", filename); | |
173 DrvClose((HDRVR)hDriver); | |
174 return ((HDRVR) 0); | |
1 | 175 } |
176 | |
7386 | 177 hDriver->DriverProc = (DRIVERPROC) GetProcAddress(hDriver->hDriverModule, |
178 "DriverProc"); | |
179 if (!hDriver->DriverProc) | |
1 | 180 { |
7386 | 181 printf("Library %s is not a valid VfW/ACM codec\n", filename); |
182 DrvClose((HDRVR)hDriver); | |
183 return ((HDRVR) 0); | |
1 | 184 } |
185 | |
7386 | 186 TRACE("DriverProc == %X\n", hDriver->DriverProc); |
187 SendDriverMessage((HDRVR)hDriver, DRV_LOAD, 0, 0); | |
188 TRACE("DRV_LOAD Ok!\n"); | |
189 SendDriverMessage((HDRVR)hDriver, DRV_ENABLE, 0, 0); | |
190 TRACE("DRV_ENABLE Ok!\n"); | |
191 hDriver->dwDriverID = ++dwDrvID; // generate new id | |
1 | 192 |
7386 | 193 // open driver and remmeber proper DriverID |
194 hDriver->dwDriverID = SendDriverMessage((HDRVR)hDriver, DRV_OPEN, (LPARAM) unknown, lParam2); | |
195 TRACE("DRV_OPEN Ok!(%X)\n", hDriver->dwDriverID); | |
1 | 196 |
12655 | 197 printf("Loaded DLL driver %s at %x\n", filename, hDriver->hDriverModule); |
7386 | 198 return (HDRVR)hDriver; |
1 | 199 } |