driver.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:5k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: dde6a1d6ee387a4519d18f03c2e6fa1b73a54ad0 $
  3.  *
  4.  * Copyright 1993, 1994 Martin Ayotte
  5.  * Copyright 1998 Marcus Meissner
  6.  * Copyright 1999 Eric Pouech
  7.  *
  8.  * Originally distributed under LPGL 2.1 (or later) by the Wine project.
  9.  *
  10.  * Modified for use with MPlayer, detailed CVS changelog at
  11.  * http://www.mplayerhq.hu/cgi-bin/cvsweb.cgi/main/
  12.  *
  13.  * File now distributed as part of VLC media player with no modifications.
  14.  *
  15.  * This program is free software; you can redistribute it and/or modify
  16.  * it under the terms of the GNU General Public License as published by
  17.  * the Free Software Foundation; either version 2 of the License, or
  18.  * (at your option) any later version.
  19.  *
  20.  * This program is distributed in the hope that it will be useful,
  21.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23.  * GNU General Public License for more details.
  24.  *
  25.  * You should have received a copy of the GNU General Public License
  26.  * along with this program; if not, write to the Free Software
  27.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  28.  */
  29. #include "config.h"
  30. #include <stdio.h>
  31. #ifdef HAVE_MALLOC_H
  32. #include <malloc.h>
  33. #endif
  34. #include <stdlib.h>
  35. #ifdef __FreeBSD__
  36. #include <sys/time.h>
  37. #endif
  38. #include "win32.h"
  39. #include "wine/driver.h"
  40. #include "wine/pe_image.h"
  41. #include "wine/winreg.h"
  42. #include "wine/vfw.h"
  43. #include "registry.h"
  44. #ifdef WIN32_LOADER
  45. #include "ldt_keeper.h"
  46. #endif
  47. #include "driver.h"
  48. #ifndef __MINGW32__
  49. #include "ext.h"
  50. #endif
  51. #ifndef WIN32_LOADER
  52. char* def_path=WIN32_PATH;
  53. #else
  54. extern char* def_path;
  55. #endif
  56. #if 1
  57. /*
  58.  * STORE_ALL/REST_ALL seems like an attempt to workaround problems due to
  59.  * WINAPI/no-WINAPI bustage.
  60.  *
  61.  * There should be no need for the STORE_ALL/REST_ALL hack once all
  62.  * function definitions agree with their prototypes (WINAPI-wise) and
  63.  * we make sure, that we do not call these functions without a proper
  64.  * prototype in scope.
  65.  */
  66. #define STORE_ALL
  67. #define REST_ALL
  68. #else
  69. // this asm code is no longer needed
  70. #define STORE_ALL 
  71.     __asm__ __volatile__ ( 
  72.     "push %%ebxnt" 
  73.     "push %%ecxnt" 
  74.     "push %%edxnt" 
  75.     "push %%esint" 
  76.     "push %%edint"::)
  77. #define REST_ALL 
  78.     __asm__ __volatile__ ( 
  79.     "pop %%edint" 
  80.     "pop %%esint" 
  81.     "pop %%edxnt" 
  82.     "pop %%ecxnt" 
  83.     "pop %%ebxnt"::)
  84. #endif
  85. static int needs_free=0;
  86. void SetCodecPath(const char* path)
  87. {
  88.     if(needs_free)free(def_path);
  89.     if(path==NULL)
  90.     {
  91. def_path=WIN32_PATH;
  92. needs_free=0;
  93. return;
  94.     }
  95.     def_path = (char*) malloc(strlen(path)+1);
  96.     strcpy(def_path, path);
  97.     needs_free=1;
  98. }
  99. static DWORD dwDrvID = 0;
  100. LRESULT WINAPI SendDriverMessage(HDRVR hDriver, UINT message,
  101.  LPARAM lParam1, LPARAM lParam2)
  102. {
  103.     DRVR* module=(DRVR*)hDriver;
  104.     int result;
  105. #ifndef __svr4__
  106.     char qw[300];
  107. #endif
  108. #ifdef DETAILED_OUT
  109.     printf("SendDriverMessage: driver %X, message %X, arg1 %X, arg2 %Xn", hDriver, message, lParam1, lParam2);
  110. #endif
  111.     if (!module || !module->hDriverModule || !module->DriverProc) return -1;
  112. #ifndef __svr4__
  113.     __asm__ __volatile__ ("fsave (%0)nt": :"r"(&qw));
  114. #endif
  115. #ifdef WIN32_LOADER
  116.     Setup_FS_Segment();
  117. #endif
  118.     STORE_ALL;
  119.     result=module->DriverProc(module->dwDriverID, hDriver, message, lParam1, lParam2);
  120.     REST_ALL;
  121. #ifndef __svr4__
  122.     __asm__ __volatile__ ("frstor (%0)nt": :"r"(&qw));
  123. #endif
  124. #ifdef DETAILED_OUT
  125.     printf("ttResult: %Xn", result);
  126. #endif
  127.     return result;
  128. }
  129. void DrvClose(HDRVR hDriver)
  130. {
  131.     if (hDriver)
  132.     {
  133. DRVR* d = (DRVR*)hDriver;
  134. if (d->hDriverModule)
  135. {
  136. #ifdef WIN32_LOADER
  137.     Setup_FS_Segment();
  138. #endif
  139.     if (d->DriverProc)
  140.     {
  141. SendDriverMessage(hDriver, DRV_CLOSE, 0, 0);
  142. d->dwDriverID = 0;
  143. SendDriverMessage(hDriver, DRV_FREE, 0, 0);
  144.     }
  145.     FreeLibrary(d->hDriverModule);
  146. }
  147. free(d);
  148.     }
  149. #ifdef WIN32_LOADER
  150.     CodecRelease();
  151. #endif
  152. }
  153. //DrvOpen(LPCSTR lpszDriverName, LPCSTR lpszSectionName, LPARAM lParam2)
  154. HDRVR DrvOpen(LPARAM lParam2)
  155. {
  156.     NPDRVR hDriver;
  157.     int i;
  158.     char unknown[0x124];
  159.     const char* filename = (const char*) ((ICOPEN*) lParam2)->pV1Reserved;
  160. #ifdef MPLAYER
  161. #ifdef WIN32_LOADER
  162.     Setup_LDT_Keeper();
  163. #endif
  164.     printf("Loading codec DLL: '%s'n",filename);
  165. #endif
  166.     hDriver = (NPDRVR) malloc(sizeof(DRVR));
  167.     if (!hDriver)
  168. return ((HDRVR) 0);
  169.     memset((void*)hDriver, 0, sizeof(DRVR));
  170. #ifdef WIN32_LOADER
  171.     CodecAlloc();
  172.     Setup_FS_Segment();
  173. #endif
  174.     hDriver->hDriverModule = LoadLibraryA(filename);
  175.     if (!hDriver->hDriverModule)
  176.     {
  177. printf("Can't open library %sn", filename);
  178. DrvClose((HDRVR)hDriver);
  179. return ((HDRVR) 0);
  180.     }
  181.     hDriver->DriverProc = (DRIVERPROC) GetProcAddress(hDriver->hDriverModule,
  182.       "DriverProc");
  183.     if (!hDriver->DriverProc)
  184.     {
  185. printf("Library %s is not a valid VfW/ACM codecn", filename);
  186. DrvClose((HDRVR)hDriver);
  187. return ((HDRVR) 0);
  188.     }
  189.     TRACE("DriverProc == %Xn", 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
  195.     // open driver and remmeber proper DriverID
  196.     hDriver->dwDriverID = SendDriverMessage((HDRVR)hDriver, DRV_OPEN, (LPARAM) unknown, lParam2);
  197.     TRACE("DRV_OPEN Ok!(%X)n", hDriver->dwDriverID);
  198.     printf("Loaded DLL driver %s at %xn", filename, hDriver->hDriverModule);
  199.     return (HDRVR)hDriver;
  200. }