Release 980503
[wine/multimedia.git] / windows / driver.c
bloba051bd9b267486e24a837998d65b06aa34627b3d
1 /*
2 * Wine Drivers functions
4 * Copyright 1994 Martin Ayotte
5 */
7 #include <stdio.h>
8 #include "windows.h"
9 #include "win.h"
10 #include "callback.h"
11 #include "driver.h"
12 #include "module.h"
13 #include "debug.h"
15 LPDRIVERITEM lpDrvItemList = NULL;
17 void LoadStartupDrivers(void)
19 HDRVR16 hDrv;
20 char str[256];
21 LPSTR ptr;
23 if (GetPrivateProfileString32A( "drivers", NULL, "", str, sizeof(str),
24 "SYSTEM.INI" ) < 2)
26 fprintf( stderr,
27 "LoadStartupDrivers // can't find drivers section in system.ini\n" );
28 return;
31 ptr = str;
32 while (lstrlen32A( ptr ) != 0)
34 TRACE(driver, "str='%s'\n", ptr );
35 hDrv = OpenDriver( ptr, "drivers", 0L );
36 TRACE(driver, "hDrv=%04x\n", hDrv );
37 ptr += lstrlen32A(ptr) + 1;
39 TRACE(driver, "end of list !\n" );
41 return;
44 /**************************************************************************
45 * SendDriverMessage [USER.251]
47 LRESULT WINAPI SendDriverMessage(HDRVR16 hDriver, UINT16 msg, LPARAM lParam1,
48 LPARAM lParam2)
50 LPDRIVERITEM lpdrv;
51 LRESULT retval;
53 TRACE(driver, "(%04x, %04X, %08lX, %08lX)\n",
54 hDriver, msg, lParam1, lParam2 );
56 lpdrv = (LPDRIVERITEM)GlobalLock16( hDriver );
57 if (lpdrv == NULL || lpdrv->dis.hDriver != hDriver)
59 GlobalUnlock16( hDriver );
60 return 0;
63 retval = Callbacks->CallDriverProc( lpdrv->lpDrvProc, 0L /* FIXME */,
64 hDriver, msg, lParam1, lParam2 );
66 TRACE(driver, "retval = %ld\n", retval );
68 GlobalUnlock16( hDriver );
69 return retval;
72 /**************************************************************************
73 * OpenDriver [USER.252]
75 HDRVR16 WINAPI OpenDriver(LPSTR lpDriverName, LPSTR lpSectionName, LPARAM lParam)
77 HDRVR16 hDrvr;
78 LPDRIVERITEM lpdrv, lpnewdrv;
79 char DrvName[128];
80 WORD ordinal;
82 TRACE(driver,"('%s', '%s', %08lX);\n",
83 lpDriverName, lpSectionName, lParam );
85 if (lpSectionName == NULL) lpSectionName = "drivers";
86 GetPrivateProfileString32A( lpSectionName, lpDriverName, "", DrvName,
87 sizeof(DrvName), "SYSTEM.INI" );
88 TRACE(driver,"DrvName='%s'\n", DrvName );
89 if (lstrlen32A(DrvName) < 1) return 0;
91 lpdrv = lpDrvItemList;
92 while (lpdrv) /* XXX find it... like this? */
94 if (!lstrcmpi32A( lpDriverName, lpdrv->dis.szAliasName ))
96 lpdrv->count++;
97 SendDriverMessage( lpdrv->dis.hDriver, DRV_OPEN, 0L, lParam );
98 return lpdrv->dis.hDriver;
100 lpdrv = lpdrv->lpNextItem;
103 lpdrv = lpDrvItemList; /* find end of list */
104 if (lpdrv != NULL)
105 while (lpdrv->lpNextItem != NULL)
106 lpdrv = lpdrv->lpNextItem;
108 hDrvr = GlobalAlloc16( GMEM_MOVEABLE, sizeof(DRIVERITEM) );
109 lpnewdrv = (LPDRIVERITEM)GlobalLock16( hDrvr );
110 if (lpnewdrv == NULL) return 0;
111 lpnewdrv->dis.length = sizeof( DRIVERINFOSTRUCT16 );
112 lpnewdrv->dis.hModule = LoadModule16( DrvName, (LPVOID)-1 );
113 if (!lpnewdrv->dis.hModule)
115 GlobalUnlock16( hDrvr );
116 GlobalFree16( hDrvr );
117 return 0;
119 lpnewdrv->dis.hDriver = hDrvr;
120 lstrcpy32A( lpnewdrv->dis.szAliasName, lpDriverName );
121 lpnewdrv->count = 1;
122 ordinal = NE_GetOrdinal( lpnewdrv->dis.hModule, "DRIVERPROC" );
123 if (!ordinal ||
124 !(lpnewdrv->lpDrvProc = (DRIVERPROC16)NE_GetEntryPoint(
125 lpnewdrv->dis.hModule, ordinal )))
127 FreeModule16( lpnewdrv->dis.hModule );
128 GlobalUnlock16( hDrvr );
129 GlobalFree16( hDrvr );
130 return 0;
133 lpnewdrv->lpNextItem = NULL;
134 if (lpDrvItemList == NULL)
136 lpDrvItemList = lpnewdrv;
137 lpnewdrv->lpPrevItem = NULL;
139 else
141 lpdrv->lpNextItem = lpnewdrv;
142 lpnewdrv->lpPrevItem = lpdrv;
145 SendDriverMessage( hDrvr, DRV_LOAD, 0L, lParam );
146 SendDriverMessage( hDrvr, DRV_ENABLE, 0L, lParam );
147 SendDriverMessage( hDrvr, DRV_OPEN, 0L, lParam );
149 TRACE(driver, "hDrvr=%04x loaded !\n", hDrvr );
150 return hDrvr;
153 /**************************************************************************
154 * CloseDriver [USER.253]
156 LRESULT WINAPI CloseDriver(HDRVR16 hDrvr, LPARAM lParam1, LPARAM lParam2)
158 LPDRIVERITEM lpdrv;
160 TRACE(driver, "(%04x, %08lX, %08lX);\n",
161 hDrvr, lParam1, lParam2 );
163 lpdrv = (LPDRIVERITEM)GlobalLock16( hDrvr );
164 if (lpdrv != NULL && lpdrv->dis.hDriver == hDrvr)
166 SendDriverMessage( hDrvr, DRV_CLOSE, lParam1, lParam2 );
167 if (--lpdrv->count == 0)
169 SendDriverMessage( hDrvr, DRV_DISABLE, lParam1, lParam2 );
170 SendDriverMessage( hDrvr, DRV_FREE, lParam1, lParam2 );
172 if (lpdrv->lpPrevItem)
173 lpdrv->lpPrevItem->lpNextItem = lpdrv->lpNextItem;
174 else
175 lpDrvItemList = lpdrv->lpNextItem;
176 if (lpdrv->lpNextItem)
177 lpdrv->lpNextItem->lpPrevItem = lpdrv->lpPrevItem;
179 FreeModule16( lpdrv->dis.hModule );
180 GlobalUnlock16( hDrvr );
181 GlobalFree16( hDrvr );
184 TRACE(driver, "hDrvr=%04x closed !\n",
185 hDrvr );
186 return TRUE;
188 return FALSE;
191 /**************************************************************************
192 * GetDriverModuleHandle [USER.254]
194 HMODULE16 WINAPI GetDriverModuleHandle(HDRVR16 hDrvr)
196 LPDRIVERITEM lpdrv;
197 HMODULE16 hModule = 0;
199 TRACE(driver, "(%04x);\n", hDrvr);
201 lpdrv = (LPDRIVERITEM)GlobalLock16( hDrvr );
202 if (lpdrv != NULL && lpdrv->dis.hDriver == hDrvr)
204 hModule = lpdrv->dis.hModule;
205 GlobalUnlock16( hDrvr );
207 return hModule;
210 /**************************************************************************
211 * DefDriverProc [USER.255]
213 LRESULT WINAPI DefDriverProc(DWORD dwDevID, HDRVR16 hDriv, UINT16 wMsg,
214 LPARAM lParam1, LPARAM lParam2)
216 switch(wMsg)
218 case DRV_LOAD:
219 return (LRESULT)0L;
220 case DRV_FREE:
221 return (LRESULT)0L;
222 case DRV_OPEN:
223 return (LRESULT)0L;
224 case DRV_CLOSE:
225 return (LRESULT)0L;
226 case DRV_ENABLE:
227 return (LRESULT)0L;
228 case DRV_DISABLE:
229 return (LRESULT)0L;
230 case DRV_QUERYCONFIGURE:
231 return (LRESULT)0L;
233 case DRV_CONFIGURE:
234 MessageBox16( 0, "Driver isn't configurable !", "Wine Driver", MB_OK );
235 return (LRESULT)0L;
237 case DRV_INSTALL:
238 return (LRESULT)DRVCNF_RESTART;
240 case DRV_REMOVE:
241 return (LRESULT)DRVCNF_RESTART;
243 default:
244 return (LRESULT)0L;
248 /**************************************************************************
249 * GetDriverInfo [USER.256]
251 BOOL16 WINAPI GetDriverInfo(HDRVR16 hDrvr, LPDRIVERINFOSTRUCT16 lpDrvInfo)
253 LPDRIVERITEM lpdrv;
255 TRACE(driver, "(%04x, %p);\n", hDrvr, lpDrvInfo );
257 if (lpDrvInfo == NULL) return FALSE;
259 lpdrv = (LPDRIVERITEM)GlobalLock16( hDrvr );
260 if (lpdrv == NULL) return FALSE;
261 memcpy( lpDrvInfo, &lpdrv->dis, sizeof(DRIVERINFOSTRUCT16) );
262 GlobalUnlock16( hDrvr );
264 return TRUE;
267 /**************************************************************************
268 * GetNextDriver [USER.257]
270 HDRVR16 WINAPI GetNextDriver(HDRVR16 hDrvr, DWORD dwFlags)
272 LPDRIVERITEM lpdrv;
273 HDRVR16 hRetDrv = 0;
275 TRACE(driver, "(%04x, %08lX);\n", hDrvr, dwFlags );
277 if (hDrvr == 0)
279 if (lpDrvItemList == NULL)
281 TRACE(driver, "drivers list empty !\n");
282 LoadStartupDrivers();
283 if (lpDrvItemList == NULL) return 0;
285 TRACE(driver,"return first %04x !\n",
286 lpDrvItemList->dis.hDriver );
287 return lpDrvItemList->dis.hDriver;
290 lpdrv = (LPDRIVERITEM)GlobalLock16( hDrvr );
291 if (lpdrv != NULL)
293 if (dwFlags & GND_REVERSE)
295 if (lpdrv->lpPrevItem)
296 hRetDrv = lpdrv->lpPrevItem->dis.hDriver;
298 else
300 if (lpdrv->lpNextItem)
301 hRetDrv = lpdrv->lpNextItem->dis.hDriver;
303 GlobalUnlock16( hDrvr );
306 TRACE(driver, "return %04x !\n", hRetDrv );
307 return hRetDrv;