| 1 | /* $Id: driver.cpp,v 1.7 2000-12-03 22:18:17 sandervl Exp $ */
|
|---|
| 2 |
|
|---|
| 3 | /*
|
|---|
| 4 | * Driver multimedia apis
|
|---|
| 5 | *
|
|---|
| 6 | * Copyright 1994 Martin Ayotte
|
|---|
| 7 | * Copyright 1998 Marcus Meissner
|
|---|
| 8 | * Copyright 1998 Patrick Haller
|
|---|
| 9 | * Copyright 1998/1999 Eric Pouech
|
|---|
| 10 | * Copyright 2000 Chris Wohlgemuth
|
|---|
| 11 | *
|
|---|
| 12 | * Project Odin Software License can be found in LICENSE.TXT
|
|---|
| 13 | *
|
|---|
| 14 | */
|
|---|
| 15 |
|
|---|
| 16 |
|
|---|
| 17 | /****************************************************************************
|
|---|
| 18 | * Includes *
|
|---|
| 19 | ****************************************************************************/
|
|---|
| 20 |
|
|---|
| 21 | #include <os2win.h>
|
|---|
| 22 | #include <odinwrap.h>
|
|---|
| 23 | #include <string.h>
|
|---|
| 24 | #include <misc.h>
|
|---|
| 25 | #include <unicode.h>
|
|---|
| 26 |
|
|---|
| 27 | #include "os2timer.h"
|
|---|
| 28 |
|
|---|
| 29 | #define DBG_LOCALLOG DBG_driver
|
|---|
| 30 | #include "dbglocal.h"
|
|---|
| 31 |
|
|---|
| 32 |
|
|---|
| 33 | /* Who said goofy boy ? */
|
|---|
| 34 | #define WINE_DI_MAGIC 0x900F1B01
|
|---|
| 35 |
|
|---|
| 36 | typedef struct tagWINE_DRIVER
|
|---|
| 37 | {
|
|---|
| 38 | DWORD dwMagic;
|
|---|
| 39 | char szAliasName[128];
|
|---|
| 40 | /* as usual LPWINE_DRIVER == hDriver32 */
|
|---|
| 41 | HDRVR16 hDriver16;
|
|---|
| 42 | union {
|
|---|
| 43 | struct {
|
|---|
| 44 | HMODULE16 hModule;
|
|---|
| 45 | DRIVERPROC16 lpDrvProc;
|
|---|
| 46 | } d16;
|
|---|
| 47 | struct {
|
|---|
| 48 | HMODULE hModule;
|
|---|
| 49 | DRIVERPROC lpDrvProc;
|
|---|
| 50 | } d32;
|
|---|
| 51 | } d;
|
|---|
| 52 | DWORD dwDriverID;
|
|---|
| 53 | DWORD dwFlags;
|
|---|
| 54 | struct tagWINE_DRIVER* lpPrevItem;
|
|---|
| 55 | struct tagWINE_DRIVER* lpNextItem;
|
|---|
| 56 | } WINE_DRIVER, *LPWINE_DRIVER;
|
|---|
| 57 |
|
|---|
| 58 | static LPWINE_DRIVER DRIVER_RegisterDriver32(LPCSTR, HMODULE, DRIVERPROC, LPARAM, BOOL);
|
|---|
| 59 |
|
|---|
| 60 | static LPWINE_DRIVER lpDrvItemList = NULL;
|
|---|
| 61 |
|
|---|
| 62 | /* TODO list :
|
|---|
| 63 | * WINE remark: - LoadModule count and clean up is not handled correctly (it's not a
|
|---|
| 64 | * problem as long as FreeLibrary is not working correctly)
|
|---|
| 65 | * - shoudln't the allocations be done on a per process basis ?
|
|---|
| 66 | */
|
|---|
| 67 |
|
|---|
| 68 | static HDRVR DRIVER_OpenDriverA(LPCSTR lpDriverName, LPCSTR lpSectionName, LPARAM lParam) ;
|
|---|
| 69 | static LPWINE_DRIVER DRIVER_FindFromHDrvr(HDRVR hDrvr);
|
|---|
| 70 | static BOOL DRIVER_CloseDriver(LPWINE_DRIVER lpDrv, DWORD lParam1, DWORD lParam2);
|
|---|
| 71 |
|
|---|
| 72 | ODINDEBUGCHANNEL(WINMM-DRIVER)
|
|---|
| 73 |
|
|---|
| 74 |
|
|---|
| 75 | /*****************************************************************************
|
|---|
| 76 | * Sends the specifiedmessage to the installable driver
|
|---|
| 77 | * Parameters: HDRVR hDrvr
|
|---|
| 78 | * UINT msg
|
|---|
| 79 | * LONG lParam1
|
|---|
| 80 | * LONG lParam2
|
|---|
| 81 | * Variables :
|
|---|
| 82 | * @return : API returncode
|
|---|
| 83 | * Remark :
|
|---|
| 84 | * @status : Completely
|
|---|
| 85 | *
|
|---|
| 86 | * @author : Patrick Haller [Tue, 1998/05/05 10:44]
|
|---|
| 87 | * @author : Chris Wohlgemuth [Sun, 2000/11/19]
|
|---|
| 88 | *****************************************************************************/
|
|---|
| 89 |
|
|---|
| 90 | ODINFUNCTION4(LRESULT, SendDriverMessage,
|
|---|
| 91 | HDRVR, hdrvr,
|
|---|
| 92 | UINT, msg,
|
|---|
| 93 | LONG, lParam1,
|
|---|
| 94 | LONG, lParam2)
|
|---|
| 95 | {
|
|---|
| 96 | LPWINE_DRIVER lpDrv;
|
|---|
| 97 | LRESULT retval = 0;
|
|---|
| 98 |
|
|---|
| 99 | dprintf(("Entering SendDriverMessage (%04x, %04X, %08lX, %08lX)\n", hdrvr, msg, lParam1, lParam2));
|
|---|
| 100 |
|
|---|
| 101 | lpDrv = DRIVER_FindFromHDrvr(hdrvr);
|
|---|
| 102 |
|
|---|
| 103 | if (lpDrv != NULL) {
|
|---|
| 104 | if (lpDrv->dwFlags & WINE_GDF_16BIT) {
|
|---|
| 105 | #if 0
|
|---|
| 106 | /*We don't use 16 bit */
|
|---|
| 107 | mapRet = DRIVER_MapMsg32To16(msg, &lParam1, &lParam2);
|
|---|
| 108 | if (mapRet >= 0) {
|
|---|
| 109 | TRACE("Before CallDriverProc proc=%p driverID=%08lx hDrv=%u wMsg=%04x p1=%08lx p2=%08lx\n",
|
|---|
| 110 | lpDrv->d.d16.lpDrvProc, lpDrv->dwDriverID, lpDrv->hDriver16, msg, lParam1, lParam2);
|
|---|
| 111 | retval = DRIVER_CallTo16_long_lwwll((FARPROC16)lpDrv->d.d16.lpDrvProc, lpDrv->dwDriverID,
|
|---|
| 112 | lpDrv->hDriver16, msg, lParam1, lParam2);
|
|---|
| 113 | if (mapRet >= 1) {
|
|---|
| 114 | DRIVER_UnMapMsg32To16(msg, lParam1, lParam2);
|
|---|
| 115 | }
|
|---|
| 116 | } else {
|
|---|
| 117 | retval = 0;
|
|---|
| 118 | }
|
|---|
| 119 | #endif
|
|---|
| 120 | } else {
|
|---|
| 121 |
|
|---|
| 122 | #if 0
|
|---|
| 123 | dprintf(("Before func32 call proc=%p driverID=%08lx hDrv=%u wMsg=%04x p1=%08lx p2=%08lx\n",
|
|---|
| 124 | lpDrv->d.d32.lpDrvProc, lpDrv->dwDriverID, hdrvr, msg, lParam1, lParam2));
|
|---|
| 125 | #endif
|
|---|
| 126 |
|
|---|
| 127 | retval = lpDrv->d.d32.lpDrvProc(lpDrv->dwDriverID, hdrvr, msg, lParam1, lParam2);
|
|---|
| 128 | }
|
|---|
| 129 | } else {
|
|---|
| 130 | dprintf(("Bad driver handle %u\n", hdrvr));
|
|---|
| 131 | }
|
|---|
| 132 |
|
|---|
| 133 | dprintf(("(SendDriverMessage) Driver proc returned retval = %ld (0x%lx)\n", retval, retval));
|
|---|
| 134 |
|
|---|
| 135 | return retval;
|
|---|
| 136 | }
|
|---|
| 137 |
|
|---|
| 138 |
|
|---|
| 139 | /*****************************************************************************
|
|---|
| 140 | * Opens an instance of an installable driver and initializes
|
|---|
| 141 | * the instance using either the driver's default settings or a
|
|---|
| 142 | * driver-specific value.
|
|---|
| 143 | * Parameters: LPCWSTR lpDriverName
|
|---|
| 144 | * LPCWSTR lpSectionName
|
|---|
| 145 | * LONG lParam
|
|---|
| 146 | * Variables :
|
|---|
| 147 | * @return : API returncode
|
|---|
| 148 | * Remark :
|
|---|
| 149 | * @status : Stub
|
|---|
| 150 | *
|
|---|
| 151 | * @author : Patrick Haller [Tue, 1998/05/05 10:44]
|
|---|
| 152 | *****************************************************************************/
|
|---|
| 153 |
|
|---|
| 154 | ODINFUNCTION3(HDRVR, OpenDriver,
|
|---|
| 155 | LPCWSTR, lpDriverName,
|
|---|
| 156 | LPCWSTR, lpSectionName,
|
|---|
| 157 | LONG, lParam)
|
|---|
| 158 | {
|
|---|
| 159 | dprintf(("WINMM: OpenDriver not implemented.\n"));
|
|---|
| 160 | return 0; /* unsuccessful return */
|
|---|
| 161 | }
|
|---|
| 162 |
|
|---|
| 163 |
|
|---|
| 164 | /*****************************************************************************
|
|---|
| 165 | * Opens an instance of an installable driver and initializes
|
|---|
| 166 | * the instance using either the driver's default settings or a
|
|---|
| 167 | * driver-specific value.
|
|---|
| 168 | * Parameters: LPCTSTR lpDriverName
|
|---|
| 169 | * LPCTSTR lpSectionName
|
|---|
| 170 | * LONG lParam
|
|---|
| 171 | * Variables :
|
|---|
| 172 | * @return : API returncode
|
|---|
| 173 | * Remark :
|
|---|
| 174 | * @status : Partially tested
|
|---|
| 175 | *
|
|---|
| 176 | * @author : Patrick Haller [Tue, 1998/05/05 10:44]
|
|---|
| 177 | *****************************************************************************/
|
|---|
| 178 |
|
|---|
| 179 | ODINFUNCTION3(HDRVR, OpenDriverA,
|
|---|
| 180 | LPCSTR, lpDriverName,
|
|---|
| 181 | LPCSTR, lpSectionName,
|
|---|
| 182 | LONG, lParam)
|
|---|
| 183 | {
|
|---|
| 184 | return DRIVER_OpenDriverA(lpDriverName, lpSectionName, lParam);
|
|---|
| 185 | // return 0; /* unsuccessful return */
|
|---|
| 186 | }
|
|---|
| 187 |
|
|---|
| 188 |
|
|---|
| 189 |
|
|---|
| 190 | /*****************************************************************************
|
|---|
| 191 | * Closes an installable driver.
|
|---|
| 192 | * Parameters: HDRVR hDrvr
|
|---|
| 193 | * LONG lParam1
|
|---|
| 194 | * LONG lParam2
|
|---|
| 195 | * Variables :
|
|---|
| 196 | * @return :
|
|---|
| 197 | * Remark :
|
|---|
| 198 | * @status : Partially tested
|
|---|
| 199 | *
|
|---|
| 200 | * @author : Patrick Haller [Tue, 1998/05/05 10:44]
|
|---|
| 201 | *****************************************************************************/
|
|---|
| 202 |
|
|---|
| 203 | ODINFUNCTION3(LRESULT, CloseDriver,
|
|---|
| 204 | HDRVR, hDrvr,
|
|---|
| 205 | LONG, lParam1,
|
|---|
| 206 | LONG, lParam2)
|
|---|
| 207 | {
|
|---|
| 208 | return DRIVER_CloseDriver(DRIVER_FindFromHDrvr(hDrvr), lParam1, lParam2);//return 0; /* unsuccessful return */
|
|---|
| 209 | }
|
|---|
| 210 |
|
|---|
| 211 |
|
|---|
| 212 | /*****************************************************************************
|
|---|
| 213 | * Provides default processing for anymessages not processed by
|
|---|
| 214 | * an installable driver.
|
|---|
| 215 | * Parameters: DWORD dwDriverID
|
|---|
| 216 | * HDRVR hDrvr
|
|---|
| 217 | * UINT msg
|
|---|
| 218 | * LONG lParam1
|
|---|
| 219 | * LONG lParam2
|
|---|
| 220 | * Variables :
|
|---|
| 221 | * @return :
|
|---|
| 222 | * Remark :
|
|---|
| 223 | * @status : Partially
|
|---|
| 224 | *
|
|---|
| 225 | * @author : Patrick Haller [Tue, 1998/05/05 10:44]
|
|---|
| 226 | * @author : Chris Wohlgemuth [Sun, 2000/11/19]
|
|---|
| 227 | *****************************************************************************/
|
|---|
| 228 |
|
|---|
| 229 | ODINFUNCTION5(LRESULT, DefDriverProc,
|
|---|
| 230 | DWORD, dwDriverID,
|
|---|
| 231 | HDRVR, hDrvr,
|
|---|
| 232 | UINT, msg,
|
|---|
| 233 | LONG, lParam1,
|
|---|
| 234 | LONG, lParam2)
|
|---|
| 235 | {
|
|---|
| 236 | switch (msg) {
|
|---|
| 237 | case DRV_LOAD:
|
|---|
| 238 | case DRV_FREE:
|
|---|
| 239 | case DRV_ENABLE:
|
|---|
| 240 | case DRV_DISABLE:
|
|---|
| 241 | // return 1;
|
|---|
| 242 | case DRV_INSTALL:
|
|---|
| 243 | case DRV_REMOVE:
|
|---|
| 244 | // return DRV_SUCCESS;
|
|---|
| 245 | default:
|
|---|
| 246 | return 0; /* unsuccessful return */
|
|---|
| 247 | }
|
|---|
| 248 |
|
|---|
| 249 | }
|
|---|
| 250 |
|
|---|
| 251 |
|
|---|
| 252 | /*****************************************************************************
|
|---|
| 253 | * Parameters: DWORD dwCallback
|
|---|
| 254 | * DWORD dwFlags
|
|---|
| 255 | * HDRVR hDrvr
|
|---|
| 256 | * DWORD msg
|
|---|
| 257 | * DWORD dwUser
|
|---|
| 258 | * DWORD dwParam1
|
|---|
| 259 | * DWORD dwParam2
|
|---|
| 260 | * Variables :
|
|---|
| 261 | * @return :
|
|---|
| 262 | * Remark :
|
|---|
| 263 | * @status : Stub
|
|---|
| 264 | *
|
|---|
| 265 | * @author : Patrick Haller [Tue, 1998/05/05 10:44]
|
|---|
| 266 | *****************************************************************************/
|
|---|
| 267 |
|
|---|
| 268 | ODINFUNCTION7(LRESULT, DriverCallback,
|
|---|
| 269 | DWORD, dwCallback,
|
|---|
| 270 | DWORD, dwFlags,
|
|---|
| 271 | HDRVR, hDrvr,
|
|---|
| 272 | DWORD, msg,
|
|---|
| 273 | DWORD, dwUser,
|
|---|
| 274 | DWORD, dwParam1,
|
|---|
| 275 | DWORD, dwParam2)
|
|---|
| 276 | {
|
|---|
| 277 | dprintf(("WINMM: DriverCallback not implemented.\n"));
|
|---|
| 278 | return FALSE; /* unsuccessful return */
|
|---|
| 279 | }
|
|---|
| 280 |
|
|---|
| 281 |
|
|---|
| 282 | /*****************************************************************************
|
|---|
| 283 | * Purpose : Retrieves the instance handle of the module that contains the
|
|---|
| 284 | * installable driver.
|
|---|
| 285 | * Parameters: HDRVR hDriver
|
|---|
| 286 | * Variables :
|
|---|
| 287 | * @return :
|
|---|
| 288 | * Remark :
|
|---|
| 289 | * @status : Stub
|
|---|
| 290 | *
|
|---|
| 291 | * @author : Patrick Haller [Tue, 1998/05/05 10:44]
|
|---|
| 292 | *****************************************************************************/
|
|---|
| 293 |
|
|---|
| 294 | ODINFUNCTION1(HMODULE, DrvGetModuleHandle,
|
|---|
| 295 | HDRVR, hDriver)
|
|---|
| 296 | {
|
|---|
| 297 | dprintf(("WINMM: DrvGetModuleHandle not implemented.\n"));
|
|---|
| 298 | return 0; /* unsuccessful return */
|
|---|
| 299 | }
|
|---|
| 300 |
|
|---|
| 301 |
|
|---|
| 302 | /*****************************************************************************
|
|---|
| 303 | * Sends the specified message to the installable driver
|
|---|
| 304 | * Parameters: HDRVR hDrvr
|
|---|
| 305 | * UINT msg
|
|---|
| 306 | * LONG lParam1
|
|---|
| 307 | * LONG lParam2
|
|---|
| 308 | * Variables :
|
|---|
| 309 | * @return : API returncode
|
|---|
| 310 | * Remark : Ehm, what's the difference to SendDriverMessage() ?
|
|---|
| 311 | * @status : Stub
|
|---|
| 312 | *
|
|---|
| 313 | * @author : Patrick Haller [Tue, 1998/05/05 10:44]
|
|---|
| 314 | *****************************************************************************/
|
|---|
| 315 |
|
|---|
| 316 | ODINFUNCTION4(LRESULT, DrvSendMessage,
|
|---|
| 317 | HDRVR, hdrvr,
|
|---|
| 318 | UINT, msg,
|
|---|
| 319 | LONG, lParam1,
|
|---|
| 320 | LONG, lParam2)
|
|---|
| 321 | {
|
|---|
| 322 | dprintf(("WINMM: DrvSendMessage not implemented.\n"));
|
|---|
| 323 | return 0; /* unsuccessful return */
|
|---|
| 324 | }
|
|---|
| 325 |
|
|---|
| 326 |
|
|---|
| 327 | /*****************************************************************************
|
|---|
| 328 | * Retrieves the instance handle of the module that contains the
|
|---|
| 329 | * installable driver.
|
|---|
| 330 | * Parameters: HDRVR hDriver
|
|---|
| 331 | * Variables :
|
|---|
| 332 | * @return :
|
|---|
| 333 | * Remark : What's the difference to DrvGetModuleHandle() ?
|
|---|
| 334 | * @status : Completely
|
|---|
| 335 | *
|
|---|
| 336 | * @author : Patrick Haller [Tue, 1998/05/05 10:44]
|
|---|
| 337 | * @author : Chris Wohlgemuth [Sun, 2000/11/19]
|
|---|
| 338 | *****************************************************************************/
|
|---|
| 339 |
|
|---|
| 340 | ODINFUNCTION1(HMODULE, GetDriverModuleHandle,
|
|---|
| 341 | HDRVR, hDriver)
|
|---|
| 342 | {
|
|---|
| 343 | LPWINE_DRIVER lpDrv;
|
|---|
| 344 | HMODULE hModule = 0;
|
|---|
| 345 |
|
|---|
| 346 | #if 0
|
|---|
| 347 | dprintf(("(%04x);\n", hDriver));
|
|---|
| 348 | #endif
|
|---|
| 349 |
|
|---|
| 350 | lpDrv = DRIVER_FindFromHDrvr(hDriver);
|
|---|
| 351 | if (lpDrv != NULL && !(lpDrv->dwFlags & WINE_GDF_16BIT)) {
|
|---|
| 352 | hModule = lpDrv->d.d32.hModule;
|
|---|
| 353 |
|
|---|
| 354 | }
|
|---|
| 355 | #if 0
|
|---|
| 356 | dprintf(("=> %d\n", hModule));
|
|---|
| 357 | #endif
|
|---|
| 358 | return hModule; //return 0; /* unsuccessful return */
|
|---|
| 359 | }
|
|---|
| 360 |
|
|---|
| 361 |
|
|---|
| 362 |
|
|---|
| 363 | /**************************************************************************
|
|---|
| 364 | * GetDriverFlags [WINMM.13]
|
|---|
| 365 | * Parameters: HDRVR hDrvr
|
|---|
| 366 | * Variables :
|
|---|
| 367 | * @return : 0x00000000 if hDrvr is an invalid handle
|
|---|
| 368 | * 0x80000000 if hDrvr is a valid 32 bit driver
|
|---|
| 369 | * Remark :
|
|---|
| 370 | * @status : Completely
|
|---|
| 371 | *
|
|---|
| 372 | * @author : Chris Wohlgemuth [Sun, 2000/11/19] (ported from WINE)
|
|---|
| 373 | */
|
|---|
| 374 | ODINFUNCTION1(DWORD, GetDriverFlags,
|
|---|
| 375 | HDRVR, hDrvr)
|
|---|
| 376 | {
|
|---|
| 377 | LPWINE_DRIVER lpDrv;
|
|---|
| 378 | DWORD ret = 0;
|
|---|
| 379 |
|
|---|
| 380 | //TRACE("(%04x)\n", hDrvr);
|
|---|
| 381 |
|
|---|
| 382 | if ((lpDrv = DRIVER_FindFromHDrvr(hDrvr)) != NULL) {
|
|---|
| 383 | ret = lpDrv->dwFlags;
|
|---|
| 384 | }
|
|---|
| 385 | return ret;
|
|---|
| 386 | }
|
|---|
| 387 |
|
|---|
| 388 |
|
|---|
| 389 | /**************************************************************************/
|
|---|
| 390 | /* Implementation */
|
|---|
| 391 | /**************************************************************************/
|
|---|
| 392 |
|
|---|
| 393 | /**************************************************************************
|
|---|
| 394 | * DRIVER_GetNumberOfModuleRefs [internal]
|
|---|
| 395 | *
|
|---|
| 396 | * Returns the number of open drivers which share the same module.
|
|---|
| 397 | */
|
|---|
| 398 | static WORD DRIVER_GetNumberOfModuleRefs(LPWINE_DRIVER lpNewDrv)
|
|---|
| 399 | {
|
|---|
| 400 | LPWINE_DRIVER lpDrv;
|
|---|
| 401 | WORD count = 0;
|
|---|
| 402 |
|
|---|
| 403 | for (lpDrv = lpDrvItemList; lpDrv; lpDrv = lpDrv->lpNextItem) {
|
|---|
| 404 | if (lpDrv->dwFlags & WINE_GDF_16BIT) {
|
|---|
| 405 | if (lpDrv->d.d16.hModule == lpNewDrv->d.d16.hModule) {
|
|---|
| 406 | count++;
|
|---|
| 407 | }
|
|---|
| 408 | } else {
|
|---|
| 409 | if (lpDrv->d.d32.hModule == lpNewDrv->d.d32.hModule) {
|
|---|
| 410 | count++;
|
|---|
| 411 | }
|
|---|
| 412 | }
|
|---|
| 413 | }
|
|---|
| 414 | return count;
|
|---|
| 415 | }
|
|---|
| 416 |
|
|---|
| 417 |
|
|---|
| 418 | /**************************************************************************
|
|---|
| 419 | * DRIVER_FindFromHDrvr [internal]
|
|---|
| 420 | *
|
|---|
| 421 | * From a hDrvr (being 16 or 32 bits), returns the WINE internal structure.
|
|---|
| 422 | */
|
|---|
| 423 | static LPWINE_DRIVER DRIVER_FindFromHDrvr(HDRVR hDrvr)
|
|---|
| 424 | {
|
|---|
| 425 | if (!IsBadWritePtr((void*)hDrvr, sizeof(WINE_DRIVER)) &&
|
|---|
| 426 | ((LPWINE_DRIVER)hDrvr)->dwMagic == WINE_DI_MAGIC) {
|
|---|
| 427 | return (LPWINE_DRIVER)hDrvr;
|
|---|
| 428 | }
|
|---|
| 429 | return 0;
|
|---|
| 430 | }
|
|---|
| 431 |
|
|---|
| 432 | /**************************************************************************
|
|---|
| 433 | * DRIVER_RemoveFromList [internal]
|
|---|
| 434 | *
|
|---|
| 435 | * Generates all the logic to handle driver closure / deletion
|
|---|
| 436 | * Removes a driver struct to the list of open drivers.
|
|---|
| 437 | *
|
|---|
| 438 | */
|
|---|
| 439 | static BOOL DRIVER_RemoveFromList(LPWINE_DRIVER lpDrv)
|
|---|
| 440 | {
|
|---|
| 441 | lpDrv->dwDriverID = 0;
|
|---|
| 442 | if (DRIVER_GetNumberOfModuleRefs(lpDrv) == 1) {
|
|---|
| 443 | SendDriverMessage((HDRVR)lpDrv, DRV_DISABLE, 0L, 0L);
|
|---|
| 444 | SendDriverMessage((HDRVR)lpDrv, DRV_FREE, 0L, 0L);
|
|---|
| 445 | }
|
|---|
| 446 |
|
|---|
| 447 | if (lpDrv->lpPrevItem)
|
|---|
| 448 | lpDrv->lpPrevItem->lpNextItem = lpDrv->lpNextItem;
|
|---|
| 449 | else
|
|---|
| 450 | lpDrvItemList = lpDrv->lpNextItem;
|
|---|
| 451 | if (lpDrv->lpNextItem)
|
|---|
| 452 | lpDrv->lpNextItem->lpPrevItem = lpDrv->lpPrevItem;
|
|---|
| 453 |
|
|---|
| 454 | return TRUE;
|
|---|
| 455 | }
|
|---|
| 456 |
|
|---|
| 457 | /**************************************************************************
|
|---|
| 458 | * DRIVER_AddToList [internal]
|
|---|
| 459 | *
|
|---|
| 460 | * Adds a driver struct to the list of open drivers.
|
|---|
| 461 | * Generates all the logic to handle driver creation / open.
|
|---|
| 462 | *
|
|---|
| 463 | */
|
|---|
| 464 | static BOOL DRIVER_AddToList(LPWINE_DRIVER lpNewDrv, LPARAM lParam, BOOL bCallFrom32)
|
|---|
| 465 | {
|
|---|
| 466 | lpNewDrv->dwMagic = WINE_DI_MAGIC;
|
|---|
| 467 | /* First driver to be loaded for this module, need to load correctly the module */
|
|---|
| 468 |
|
|---|
| 469 | if (DRIVER_GetNumberOfModuleRefs(lpNewDrv) == 0) {
|
|---|
| 470 | if (SendDriverMessage((HDRVR)lpNewDrv, DRV_LOAD, 0L, 0L) != DRV_SUCCESS) {
|
|---|
| 471 | dprintf(("DRV_LOAD failed on driver 0x%08lx\n", (DWORD)lpNewDrv));
|
|---|
| 472 | return FALSE;
|
|---|
| 473 | }
|
|---|
| 474 | if (SendDriverMessage((HDRVR)lpNewDrv, DRV_ENABLE, 0L, 0L) != DRV_SUCCESS) {
|
|---|
| 475 | dprintf(("DRV_ENABLE failed on driver 0x%08lx\n", (DWORD)lpNewDrv));
|
|---|
| 476 | return FALSE;
|
|---|
| 477 | }
|
|---|
| 478 | }
|
|---|
| 479 |
|
|---|
| 480 | lpNewDrv->lpNextItem = NULL;
|
|---|
| 481 | if (lpDrvItemList == NULL) {
|
|---|
| 482 | lpDrvItemList = lpNewDrv;
|
|---|
| 483 | lpNewDrv->lpPrevItem = NULL;
|
|---|
| 484 | } else {
|
|---|
| 485 | LPWINE_DRIVER lpDrv = lpDrvItemList; /* find end of list */
|
|---|
| 486 | while (lpDrv->lpNextItem != NULL)
|
|---|
| 487 | lpDrv = lpDrv->lpNextItem;
|
|---|
| 488 |
|
|---|
| 489 | lpDrv->lpNextItem = lpNewDrv;
|
|---|
| 490 | lpNewDrv->lpPrevItem = lpDrv;
|
|---|
| 491 | }
|
|---|
| 492 | /* Now just open a new instance of a driver on this module */
|
|---|
| 493 |
|
|---|
| 494 | lpNewDrv->dwDriverID = SendDriverMessage((HDRVR)lpNewDrv, DRV_OPEN, 0L, lParam);
|
|---|
| 495 |
|
|---|
| 496 | if (lpNewDrv->dwDriverID == 0) {
|
|---|
| 497 | dprintf(("DRV_OPEN failed on driver 0x%08lx\n", (DWORD)lpNewDrv));
|
|---|
| 498 | DRIVER_RemoveFromList(lpNewDrv);
|
|---|
| 499 | return FALSE;
|
|---|
| 500 | }
|
|---|
| 501 |
|
|---|
| 502 | return TRUE;
|
|---|
| 503 | }
|
|---|
| 504 |
|
|---|
| 505 | /**************************************************************************
|
|---|
| 506 | * DRIVER_RegisterDriver32 [internal]
|
|---|
| 507 | *
|
|---|
| 508 | * Creates all the WINE internal representations for a 32 bit driver.
|
|---|
| 509 | * The driver is also open by sending the correct messages.
|
|---|
| 510 | *
|
|---|
| 511 | */
|
|---|
| 512 | static LPWINE_DRIVER DRIVER_RegisterDriver32(LPCSTR lpName, HMODULE hModule, DRIVERPROC lpProc,
|
|---|
| 513 | LPARAM lParam, BOOL bCallFrom32)
|
|---|
| 514 | {
|
|---|
| 515 | LPWINE_DRIVER lpDrv;
|
|---|
| 516 |
|
|---|
| 517 | lpDrv = (LPWINE_DRIVER)HeapAlloc(GetProcessHeap(), 0, sizeof(WINE_DRIVER));
|
|---|
| 518 | if (lpDrv != NULL) {
|
|---|
| 519 | lpDrv->dwFlags = WINE_GDF_EXIST;
|
|---|
| 520 | lpDrv->dwDriverID = 0;
|
|---|
| 521 | lpDrv->hDriver16 = 0; /* We don't support 16 bit */
|
|---|
| 522 | lstrcpynA(lpDrv->szAliasName, lpName, sizeof(lpDrv->szAliasName));
|
|---|
| 523 | lpDrv->d.d32.hModule = hModule;
|
|---|
| 524 | lpDrv->d.d32.lpDrvProc = lpProc;
|
|---|
| 525 |
|
|---|
| 526 | if (!DRIVER_AddToList(lpDrv, lParam, bCallFrom32)) {
|
|---|
| 527 | HeapFree(GetProcessHeap(), 0, lpDrv);
|
|---|
| 528 | lpDrv = NULL;
|
|---|
| 529 | }
|
|---|
| 530 |
|
|---|
| 531 | }
|
|---|
| 532 | return lpDrv;
|
|---|
| 533 | }
|
|---|
| 534 |
|
|---|
| 535 | /**************************************************************************
|
|---|
| 536 | * DRIVER_TryOpenDriver32 [internal]
|
|---|
| 537 | *
|
|---|
| 538 | * Tries to load a 32 bit driver whose DLL's (module) name is lpFileName.
|
|---|
| 539 | *
|
|---|
| 540 | */
|
|---|
| 541 | static HDRVR DRIVER_TryOpenDriver32(LPCSTR lpFileName, LPARAM lParam, BOOL bCallFrom32)
|
|---|
| 542 | {
|
|---|
| 543 | LPWINE_DRIVER lpDrv = NULL;
|
|---|
| 544 | LPCSTR lpSFN;
|
|---|
| 545 | HMODULE hModule;
|
|---|
| 546 | DRIVERPROC lpProc;
|
|---|
| 547 |
|
|---|
| 548 | dprintf(("'Entering DRIVER_TryOpenDriver32: %s', %08lX, %d);\n", lpFileName, lParam, bCallFrom32));
|
|---|
| 549 |
|
|---|
| 550 | if (strlen(lpFileName) < 1)
|
|---|
| 551 | return 0;
|
|---|
| 552 |
|
|---|
| 553 | lpSFN = strrchr(lpFileName, '\\');
|
|---|
| 554 | lpSFN = (lpSFN) ? (lpSFN + 1) : lpFileName;
|
|---|
| 555 |
|
|---|
| 556 | if ((hModule = LoadLibraryA(lpFileName)) != 0) {
|
|---|
| 557 | if ((lpProc = (DRIVERPROC)GetProcAddress(hModule, "DriverProc")) != NULL) {
|
|---|
| 558 | lpDrv = DRIVER_RegisterDriver32(lpSFN, hModule, lpProc, lParam, bCallFrom32);
|
|---|
| 559 | } else {
|
|---|
| 560 | FreeLibrary(hModule);
|
|---|
| 561 | lpDrv = 0;
|
|---|
| 562 | dprintf(("DRIVER_TryOpenDriver32: No DriverProc found (line %d)\n",__LINE__));
|
|---|
| 563 | }
|
|---|
| 564 | } else {
|
|---|
| 565 | dprintf(("DRIVER_TryOpenDriver32: Unable to load 32 bit module \"%s\" (line %d)\n", lpFileName,__LINE__));
|
|---|
| 566 | }
|
|---|
| 567 |
|
|---|
| 568 | dprintf(("(DRIVER_TryOpenDriver32) driver handle => %p\n", lpDrv));
|
|---|
| 569 |
|
|---|
| 570 | return (HDRVR)lpDrv;
|
|---|
| 571 | }
|
|---|
| 572 |
|
|---|
| 573 | /**************************************************************************
|
|---|
| 574 | * DRIVER_OpenDriverA [internal]
|
|---|
| 575 | * (0,1,DRV_LOAD ,0 ,0)
|
|---|
| 576 | * (0,1,DRV_ENABLE,0 ,0)
|
|---|
| 577 | * (0,1,DRV_OPEN ,buf[256],0)
|
|---|
| 578 | *
|
|---|
| 579 | */
|
|---|
| 580 | static HDRVR DRIVER_OpenDriverA(LPCSTR lpDriverName, LPCSTR lpSectionName, LPARAM lParam)
|
|---|
| 581 | {
|
|---|
| 582 | HDRVR hDriver = 0;
|
|---|
| 583 | char drvName[128];
|
|---|
| 584 |
|
|---|
| 585 | dprintf(("Entering DRIVER_OpenDriverA: lpDriverName: %s lpSectionName: %s\n",lpDriverName,lpSectionName));
|
|---|
| 586 |
|
|---|
| 587 | if (lpSectionName == NULL) {
|
|---|
| 588 | lstrcpynA(drvName, lpDriverName, sizeof(drvName));
|
|---|
| 589 | hDriver = DRIVER_TryOpenDriver32(lpDriverName, lParam, TRUE);
|
|---|
| 590 | if (!hDriver) {
|
|---|
| 591 | if (GetPrivateProfileStringA("Drivers32", lpDriverName, "", drvName,
|
|---|
| 592 | sizeof(drvName), "SYSTEM.INI")) {
|
|---|
| 593 |
|
|---|
| 594 | hDriver = DRIVER_TryOpenDriver32(drvName, lParam, TRUE);
|
|---|
| 595 | }
|
|---|
| 596 | }
|
|---|
| 597 | } else {/* of if (lpSectionName == NULL) */
|
|---|
| 598 | //dprintf(("driver name %x '%s'\n",drvName,drvName));
|
|---|
| 599 | drvName[0]=0;
|
|---|
| 600 |
|
|---|
| 601 | if (GetPrivateProfileStringA(lpSectionName, lpDriverName, "", drvName,
|
|---|
| 602 | sizeof(drvName)-1, "SYSTEM.INI")) {
|
|---|
| 603 | #if 0
|
|---|
| 604 | dprintf(("driver name %x '%s'\n",drvName,drvName));
|
|---|
| 605 | #endif
|
|---|
| 606 | hDriver = DRIVER_TryOpenDriver32(drvName, lParam, TRUE);
|
|---|
| 607 | }/* GetPrivate... */
|
|---|
| 608 | }
|
|---|
| 609 | if (!hDriver)
|
|---|
| 610 | dprintf(("OpenDriverA: Failed to open driver %s from section %s\n", lpDriverName, lpSectionName));
|
|---|
| 611 |
|
|---|
| 612 | else
|
|---|
| 613 | dprintf(("OpenDriverA success: Driver handle => %08x\n", hDriver));
|
|---|
| 614 |
|
|---|
| 615 | return hDriver;
|
|---|
| 616 | }
|
|---|
| 617 |
|
|---|
| 618 | /**************************************************************************
|
|---|
| 619 | * DRIVER_CloseDriver [internal]
|
|---|
| 620 | *
|
|---|
| 621 | *
|
|---|
| 622 | */
|
|---|
| 623 | static BOOL DRIVER_CloseDriver(LPWINE_DRIVER lpDrv, DWORD lParam1, DWORD lParam2)
|
|---|
| 624 | {
|
|---|
| 625 | if (lpDrv != NULL) {
|
|---|
| 626 | SendDriverMessage((HDRVR)lpDrv, DRV_CLOSE, lParam1, lParam2);
|
|---|
| 627 |
|
|---|
| 628 | if (DRIVER_RemoveFromList(lpDrv)) {
|
|---|
| 629 | HeapFree(GetProcessHeap(), 0, lpDrv);
|
|---|
| 630 | return TRUE;
|
|---|
| 631 | }
|
|---|
| 632 | }
|
|---|
| 633 | dprintf(("Failed to close driver\n"));
|
|---|
| 634 | return FALSE;
|
|---|
| 635 | }
|
|---|
| 636 |
|
|---|
| 637 |
|
|---|
| 638 |
|
|---|
| 639 |
|
|---|
| 640 |
|
|---|
| 641 |
|
|---|
| 642 |
|
|---|
| 643 |
|
|---|
| 644 |
|
|---|
| 645 |
|
|---|
| 646 |
|
|---|
| 647 |
|
|---|