Mercurial > mplayer.hg
annotate loader/driver.c @ 18049:77a3b0d11ca5
Limit the number of entires to the amount that does fit into the chunk.
the function need rewrite as it assumes quite many things that are not guaranteed by the specifications.
author | iive |
---|---|
date | Thu, 06 Apr 2006 20:04:02 +0000 |
parents | f5537cc95b02 |
children | 0783dd397f74 |
rev | line source |
---|---|
15166
f5537cc95b02
Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents:
12655
diff
changeset
|
1 /* |
f5537cc95b02
Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents:
12655
diff
changeset
|
2 * Modified for use with MPlayer, detailed CVS changelog at |
f5537cc95b02
Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents:
12655
diff
changeset
|
3 * http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/ |
f5537cc95b02
Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents:
12655
diff
changeset
|
4 * $Id$ |
f5537cc95b02
Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents:
12655
diff
changeset
|
5 */ |
f5537cc95b02
Mark modified imported files as such to comply with GPL ¡ø2a.
diego
parents:
12655
diff
changeset
|
6 |
7386 | 7 #include "config.h" |
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 int i; | |
152 char unknown[0x124]; | |
153 const char* filename = (const char*) ((ICOPEN*) lParam2)->pV1Reserved; | |
1 | 154 |
7386 | 155 #ifdef MPLAYER |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
156 #ifdef WIN32_LOADER |
236 | 157 Setup_LDT_Keeper(); |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
158 #endif |
7386 | 159 printf("Loading codec DLL: '%s'\n",filename); |
160 #endif | |
236 | 161 |
7386 | 162 hDriver = (NPDRVR) malloc(sizeof(DRVR)); |
163 if (!hDriver) | |
1 | 164 return ((HDRVR) 0); |
7386 | 165 memset((void*)hDriver, 0, sizeof(DRVR)); |
1 | 166 |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
167 #ifdef WIN32_LOADER |
7386 | 168 CodecAlloc(); |
169 Setup_FS_Segment(); | |
9967
b0d1b415320c
cygwin support patch by Sascha Sommer and some fixes by me
alex
parents:
8451
diff
changeset
|
170 #endif |
7386 | 171 |
172 hDriver->hDriverModule = LoadLibraryA(filename); | |
173 if (!hDriver->hDriverModule) | |
174 { | |
175 printf("Can't open library %s\n", filename); | |
176 DrvClose((HDRVR)hDriver); | |
177 return ((HDRVR) 0); | |
1 | 178 } |
179 | |
7386 | 180 hDriver->DriverProc = (DRIVERPROC) GetProcAddress(hDriver->hDriverModule, |
181 "DriverProc"); | |
182 if (!hDriver->DriverProc) | |
1 | 183 { |
7386 | 184 printf("Library %s is not a valid VfW/ACM codec\n", filename); |
185 DrvClose((HDRVR)hDriver); | |
186 return ((HDRVR) 0); | |
1 | 187 } |
188 | |
7386 | 189 TRACE("DriverProc == %X\n", hDriver->DriverProc); |
190 SendDriverMessage((HDRVR)hDriver, DRV_LOAD, 0, 0); | |
191 TRACE("DRV_LOAD Ok!\n"); | |
192 SendDriverMessage((HDRVR)hDriver, DRV_ENABLE, 0, 0); | |
193 TRACE("DRV_ENABLE Ok!\n"); | |
194 hDriver->dwDriverID = ++dwDrvID; // generate new id | |
1 | 195 |
7386 | 196 // open driver and remmeber proper DriverID |
197 hDriver->dwDriverID = SendDriverMessage((HDRVR)hDriver, DRV_OPEN, (LPARAM) unknown, lParam2); | |
198 TRACE("DRV_OPEN Ok!(%X)\n", hDriver->dwDriverID); | |
1 | 199 |
12655 | 200 printf("Loaded DLL driver %s at %x\n", filename, hDriver->hDriverModule); |
7386 | 201 return (HDRVR)hDriver; |
1 | 202 } |