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

midi

开发平台:

Unix_Linux

  1.     printf("CreateWindowEx() called okeyn");
  2.     return 1;
  3. }
  4. static int WINAPI expwaveOutGetNumDevs(void)
  5. {
  6.     dbgprintf("waveOutGetNumDevs() => 0n");
  7.     return 0;
  8. }
  9. #endif
  10. /*
  11.  * Returns the number of milliseconds, modulo 2^32, since the start
  12.  * of the wineserver.
  13.  */
  14. static int WINAPI expGetTickCount(void)
  15. {
  16.     static int tcstart = 0;
  17.     struct timeval t;
  18.     int tc;
  19.     gettimeofday( &t, NULL );
  20.     tc = ((t.tv_sec * 1000) + (t.tv_usec / 1000)) - tcstart;
  21.     if (tcstart == 0)
  22.     {
  23. tcstart = 0;
  24.         tc = 0;
  25.     }
  26.     dbgprintf("GetTickCount() => %dn", tc);
  27.     return tc;
  28. }
  29. static int WINAPI expCreateFontA(void)
  30. {
  31.     dbgprintf("CreateFontA() => 0x0n");
  32.     return 1;
  33. }
  34. /* tried to get pvmjpg work in a different way - no success */
  35. static int WINAPI expDrawTextA(int hDC, char* lpString, int nCount,
  36.        LPRECT lpRect, unsigned int uFormat)
  37. {
  38.     dbgprintf("expDrawTextA(%p,...) => 8n", hDC);
  39.     return 8;
  40. }
  41. static int WINAPI expGetPrivateProfileIntA(const char* appname,
  42.    const char* keyname,
  43.    int default_value,
  44.    const char* filename)
  45. {
  46.     int size=255;
  47.     char buffer[256];
  48.     char* fullname;
  49.     int result;
  50.     buffer[255]=0;
  51.     if(!(appname && keyname && filename) )
  52.     {
  53. dbgprintf("GetPrivateProfileIntA('%s', '%s', %d, '%s') => %dn", appname, keyname, default_value, filename, default_value );
  54. return default_value;
  55.     }
  56.     fullname=(char*)malloc(50+strlen(appname)+strlen(keyname)+strlen(filename));
  57.     strcpy(fullname, "Software\IniFileMapping\");
  58.     strcat(fullname, appname);
  59.     strcat(fullname, "\");
  60.     strcat(fullname, keyname);
  61.     strcat(fullname, "\");
  62.     strcat(fullname, filename);
  63.     result=RegQueryValueExA(HKEY_LOCAL_MACHINE, fullname, NULL, NULL, (int*)buffer, &size);
  64.     if((size>=0)&&(size<256))
  65. buffer[size]=0;
  66.     //    printf("GetPrivateProfileIntA(%s, %s, %s) -> %sn", appname, keyname, filename, buffer);
  67.     free(fullname);
  68.     if(result)
  69. result=default_value;
  70.     else
  71. result=atoi(buffer);
  72.     dbgprintf("GetPrivateProfileIntA('%s', '%s', %d, '%s') => %dn", appname, keyname, default_value, filename, result);
  73.     return result;
  74. }
  75. static int WINAPI expGetProfileIntA(const char* appname,
  76.     const char* keyname,
  77.     int default_value)
  78. {
  79.     dbgprintf("GetProfileIntA -> ");
  80.     return expGetPrivateProfileIntA(appname, keyname, default_value, "default");
  81. }
  82. static int WINAPI expGetPrivateProfileStringA(const char* appname,
  83.       const char* keyname,
  84.       const char* def_val,
  85.       char* dest, unsigned int len,
  86.       const char* filename)
  87. {
  88.     int result;
  89.     int size;
  90.     char* fullname;
  91.     dbgprintf("GetPrivateProfileStringA('%s', '%s', def_val '%s', 0x%x, 0x%x, '%s')", appname, keyname, def_val, dest, len, filename );
  92.     if(!(appname && keyname && filename) ) return 0;
  93.     fullname=(char*)malloc(50+strlen(appname)+strlen(keyname)+strlen(filename));
  94.     strcpy(fullname, "Software\IniFileMapping\");
  95.     strcat(fullname, appname);
  96.     strcat(fullname, "\");
  97.     strcat(fullname, keyname);
  98.     strcat(fullname, "\");
  99.     strcat(fullname, filename);
  100.     size=len;
  101.     result=RegQueryValueExA(HKEY_LOCAL_MACHINE, fullname, NULL, NULL, (int*)dest, &size);
  102.     free(fullname);
  103.     if(result)
  104.     {
  105. strncpy(dest, def_val, size);
  106. if (strlen(def_val)< size) size = strlen(def_val);
  107.     }
  108.     dbgprintf(" => %d ( '%s' )n", size, dest);
  109.     return size;
  110. }
  111. static int WINAPI expWritePrivateProfileStringA(const char* appname,
  112. const char* keyname,
  113. const char* string,
  114. const char* filename)
  115. {
  116.     int size=256;
  117.     char* fullname;
  118.     dbgprintf("WritePrivateProfileStringA('%s', '%s', '%s', '%s')", appname, keyname, string, filename );
  119.     if(!(appname && keyname && filename) )
  120.     {
  121. dbgprintf(" => -1n");
  122. return -1;
  123.     }
  124.     fullname=(char*)malloc(50+strlen(appname)+strlen(keyname)+strlen(filename));
  125.     strcpy(fullname, "Software\IniFileMapping\");
  126.     strcat(fullname, appname);
  127.     strcat(fullname, "\");
  128.     strcat(fullname, keyname);
  129.     strcat(fullname, "\");
  130.     strcat(fullname, filename);
  131.     RegSetValueExA(HKEY_LOCAL_MACHINE, fullname, 0, REG_SZ, (int*)string, strlen(string));
  132.     //    printf("RegSetValueExA(%s,%d)n", string, strlen(string));
  133.     //    printf("WritePrivateProfileStringA(%s, %s, %s, %s)n", appname, keyname, string, filename );
  134.     free(fullname);
  135.     dbgprintf(" => 0n");
  136.     return 0;
  137. }
  138. unsigned int _GetPrivateProfileIntA(const char* appname, const char* keyname, INT default_value, const char* filename)
  139. {
  140.     return expGetPrivateProfileIntA(appname, keyname, default_value, filename);
  141. }
  142. int _GetPrivateProfileStringA(const char* appname, const char* keyname,
  143.       const char* def_val, char* dest, unsigned int len, const char* filename)
  144. {
  145.     return expGetPrivateProfileStringA(appname, keyname, def_val, dest, len, filename);
  146. }
  147. int _WritePrivateProfileStringA(const char* appname, const char* keyname,
  148. const char* string, const char* filename)
  149. {
  150.     return expWritePrivateProfileStringA(appname, keyname, string, filename);
  151. }
  152. static int WINAPI expDefDriverProc(int _private, int id, int msg, int arg1, int arg2)
  153. {
  154.     dbgprintf("DefDriverProc(0x%x, 0x%x, 0x%x, 0x%x, 0x%x) => 0n", _private, id, msg, arg1, arg2);
  155.     return 0;
  156. }
  157. static int WINAPI expSizeofResource(int v1, int v2)
  158. {
  159.     int result=SizeofResource(v1, v2);
  160.     dbgprintf("SizeofResource(0x%x, 0x%x) => %dn", v1, v2, result);
  161.     return result;
  162. }
  163. static int WINAPI expGetLastError()
  164. {
  165.     int result=GetLastError();
  166.     dbgprintf("GetLastError() => 0x%xn", result);
  167.     return result;
  168. }
  169. static void WINAPI expSetLastError(int error)
  170. {
  171.     dbgprintf("SetLastError(0x%x)n", error);
  172.     SetLastError(error);
  173. }
  174. static int WINAPI expStringFromGUID2(GUID* guid, char* str, int cbMax)
  175. {
  176.     int result=snprintf(str, cbMax, "%.8x-%.4x-%.4x-%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x",
  177. guid->f1, guid->f2, guid->f3,
  178. (unsigned char)guid->f4[0], (unsigned char)guid->f4[1],
  179. (unsigned char)guid->f4[2], (unsigned char)guid->f4[3],
  180. (unsigned char)guid->f4[4], (unsigned char)guid->f4[5],
  181. (unsigned char)guid->f4[6], (unsigned char)guid->f4[7]);
  182.     dbgprintf("StringFromGUID2(0x%x, 0x%x='%s', %d) => %dn", guid, str, str, cbMax, result);
  183.     return result;
  184. }
  185. static int WINAPI expGetFileVersionInfoSizeA(const char* name, int* lpHandle)
  186. {
  187.     dbgprintf("GetFileVersionInfoSizeA(0x%x='%s', 0x%X) => 0n", name, name, lpHandle);
  188.     return 0;
  189. }
  190. static int WINAPI expIsBadStringPtrW(const short* string, int nchars)
  191. {
  192.     int result;
  193.     if(string==0)result=1; else result=0;
  194.     dbgprintf("IsBadStringPtrW(0x%x, %d) => %d", string, nchars, result);
  195.     if(string)wch_print(string);
  196.     return result;
  197. }
  198. static int WINAPI expIsBadStringPtrA(const char* string, int nchars)
  199. {
  200.     return expIsBadStringPtrW((const short*)string, nchars);
  201. }
  202. static long WINAPI expInterlockedExchangeAdd( long* dest, long incr )
  203. {
  204.     long ret;
  205.     __asm__ __volatile__
  206. (
  207.  "lock; xaddl %0,(%1)"
  208.  : "=r" (ret)
  209.  : "r" (dest), "0" (incr)
  210.  : "memory"
  211. );
  212.     return ret;
  213. }
  214. static long WINAPI expInterlockedCompareExchange( unsigned long* dest, unsigned long exchange, unsigned long comperand)
  215. {
  216.     unsigned long retval = *dest;
  217.     if(*dest == comperand)
  218. *dest = exchange;
  219.     return retval;
  220. }
  221. static long WINAPI expInterlockedIncrement( long* dest )
  222. {
  223.     long result=expInterlockedExchangeAdd( dest, 1 ) + 1;
  224.     dbgprintf("InterlockedIncrement(0x%x => %d) => %dn", dest, *dest, result);
  225.     return result;
  226. }
  227. static long WINAPI expInterlockedDecrement( long* dest )
  228. {
  229.     long result=expInterlockedExchangeAdd( dest, -1 ) - 1;
  230.     dbgprintf("InterlockedDecrement(0x%x => %d) => %dn", dest, *dest, result);
  231.     return result;
  232. }
  233. static void WINAPI expOutputDebugStringA( const char* string )
  234. {
  235.     dbgprintf("OutputDebugStringA(0x%x='%s')n", string);
  236.     fprintf(stderr, "DEBUG: %sn", string);
  237. }
  238. static int WINAPI expGetDC(int hwnd)
  239. {
  240.     dbgprintf("GetDC(0x%x) => 1n", hwnd);
  241.     return 1;
  242. }
  243. static int WINAPI expReleaseDC(int hwnd, int hdc)
  244. {
  245.     dbgprintf("ReleaseDC(0x%x, 0x%x) => 1n", hwnd, hdc);
  246.     return 1;
  247. }
  248. static int WINAPI expGetDesktopWindow()
  249. {
  250.     dbgprintf("GetDesktopWindow() => 0n");
  251.     return 0;
  252. }
  253. static int cursor[100];
  254. static int WINAPI expLoadCursorA(int handle,LPCSTR name)
  255. {
  256.     dbgprintf("LoadCursorA(%d, 0x%x='%s') => 0x%xn", handle, name, (int)&cursor[0]);
  257.     return (int)&cursor[0];
  258. }
  259. static int WINAPI expSetCursor(void *cursor)
  260. {
  261.     dbgprintf("SetCursor(0x%x) => 0x%xn", cursor, cursor);
  262.     return (int)cursor;
  263. }
  264. static int WINAPI expGetCursorPos(void *cursor)
  265. {
  266.     dbgprintf("GetCursorPos(0x%x) => 0x%xn", cursor, cursor);
  267.     return 1;
  268. }
  269. #ifdef QTX
  270. static int show_cursor = 0;
  271. static int WINAPI expShowCursor(int show)
  272. {
  273.     dbgprintf("ShowCursor(%d) => %dn", show, show);
  274.     if (show)
  275. show_cursor++;
  276.     else
  277. show_cursor--;
  278.     return show_cursor;
  279. }
  280. #endif
  281. static int WINAPI expRegisterWindowMessageA(char *message)
  282. {
  283.     dbgprintf("RegisterWindowMessageA(%s)n", message);
  284.     return 1;
  285. }
  286. static int WINAPI expGetProcessVersion(int pid)
  287. {
  288.     dbgprintf("GetProcessVersion(%d)n", pid);
  289.     return 1;
  290. }
  291. static int WINAPI expGetCurrentThread(void)
  292. {
  293. #warning FIXME!
  294.     dbgprintf("GetCurrentThread() => %xn", 0xcfcf9898);
  295.     return 0xcfcf9898;
  296. }
  297. static int WINAPI expGetOEMCP(void)
  298. {
  299.     dbgprintf("GetOEMCP()n");
  300.     return 1;
  301. }
  302. static int WINAPI expGetCPInfo(int cp,void *info)
  303. {
  304.     dbgprintf("GetCPInfo()n");
  305.     return 0;
  306. }
  307. #ifdef QTX
  308. #define SM_CXSCREEN 0
  309. #define SM_CYSCREEN 1
  310. #define SM_XVIRTUALSCREEN 76
  311. #define SM_YVIRTUALSCREEN 77
  312. #define SM_CXVIRTUALSCREEN  78
  313. #define SM_CYVIRTUALSCREEN 79
  314. #define SM_CMONITORS 80
  315. #endif
  316. static int WINAPI expGetSystemMetrics(int index)
  317. {
  318.     dbgprintf("GetSystemMetrics(%d)n", index);
  319. #ifdef QTX
  320.     switch(index)
  321.     {
  322. case SM_XVIRTUALSCREEN:
  323. case SM_YVIRTUALSCREEN:
  324.     return 0;
  325. case SM_CXSCREEN:
  326. case SM_CXVIRTUALSCREEN:
  327.     return PSEUDO_SCREEN_WIDTH;
  328. case SM_CYSCREEN:
  329. case SM_CYVIRTUALSCREEN:
  330.     return PSEUDO_SCREEN_HEIGHT;
  331. case SM_CMONITORS:
  332.     return 1;
  333.     }
  334. #endif
  335.     return 1;
  336. }
  337. static int WINAPI expGetSysColor(int index)
  338. {
  339.     dbgprintf("GetSysColor(%d) => 1n", index);
  340.     return 1;
  341. }
  342. static int WINAPI expGetSysColorBrush(int index)
  343. {
  344.     dbgprintf("GetSysColorBrush(%d)n", index);
  345.     return 1;
  346. }
  347. static int WINAPI expGetSystemPaletteEntries(int hdc, int iStartIndex, int nEntries, void* lppe)
  348. {
  349.     dbgprintf("GetSystemPaletteEntries(0x%x, 0x%x, 0x%x, 0x%x) => 0n",
  350.       hdc, iStartIndex, nEntries, lppe);
  351.     return 0;
  352. }
  353. /*
  354.  typedef struct _TIME_ZONE_INFORMATION {
  355.  long Bias;
  356.  char StandardName[32];
  357.  SYSTEMTIME StandardDate;
  358.  long StandardBias;
  359.  char DaylightName[32];
  360.  SYSTEMTIME DaylightDate;
  361.  long DaylightBias;
  362.  } TIME_ZONE_INFORMATION, *LPTIME_ZONE_INFORMATION;
  363.  */
  364. static int WINAPI expGetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation)
  365. {
  366.     const short name[]={'C', 'e', 'n', 't', 'r', 'a', 'l', ' ', 'S', 't', 'a',
  367.     'n', 'd', 'a', 'r', 'd', ' ', 'T', 'i', 'm', 'e', 0};
  368.     const short pname[]={'C', 'e', 'n', 't', 'r', 'a', 'l', ' ', 'D', 'a', 'y',
  369.     'l', 'i', 'g', 'h', 't', ' ', 'T', 'i', 'm', 'e', 0};
  370.     dbgprintf("GetTimeZoneInformation(0x%x) => TIME_ZONE_ID_STANDARDn");
  371.     memset(lpTimeZoneInformation, 0, sizeof(TIME_ZONE_INFORMATION));
  372.     lpTimeZoneInformation->Bias=360;//GMT-6
  373.     memcpy(lpTimeZoneInformation->StandardName, name, sizeof(name));
  374.     lpTimeZoneInformation->StandardDate.wMonth=10;
  375.     lpTimeZoneInformation->StandardDate.wDay=5;
  376.     lpTimeZoneInformation->StandardDate.wHour=2;
  377.     lpTimeZoneInformation->StandardBias=0;
  378.     memcpy(lpTimeZoneInformation->DaylightName, pname, sizeof(pname));
  379.     lpTimeZoneInformation->DaylightDate.wMonth=4;
  380.     lpTimeZoneInformation->DaylightDate.wDay=1;
  381.     lpTimeZoneInformation->DaylightDate.wHour=2;
  382.     lpTimeZoneInformation->DaylightBias=-60;
  383.     return TIME_ZONE_ID_STANDARD;
  384. }
  385. static void WINAPI expGetLocalTime(SYSTEMTIME* systime)
  386. {
  387.     time_t local_time;
  388.     struct tm *local_tm;
  389.     struct timeval tv;
  390.     dbgprintf("GetLocalTime(0x%x)n");
  391.     gettimeofday(&tv, NULL);
  392.     local_time=tv.tv_sec;
  393.     local_tm=localtime(&local_time);
  394.     systime->wYear = local_tm->tm_year + 1900;
  395.     systime->wMonth = local_tm->tm_mon + 1;
  396.     systime->wDayOfWeek = local_tm->tm_wday;
  397.     systime->wDay = local_tm->tm_mday;
  398.     systime->wHour = local_tm->tm_hour;
  399.     systime->wMinute = local_tm->tm_min;
  400.     systime->wSecond = local_tm->tm_sec;
  401.     systime->wMilliseconds = (tv.tv_usec / 1000) % 1000;
  402.     dbgprintf("  Year: %dn  Month: %dn  Day of week: %dn"
  403.       "  Day: %dn  Hour: %dn  Minute: %dn  Second:  %dn"
  404.       "  Milliseconds: %dn",
  405.       systime->wYear, systime->wMonth, systime->wDayOfWeek, systime->wDay,
  406.       systime->wHour, systime->wMinute, systime->wSecond, systime->wMilliseconds);
  407. }
  408. static int WINAPI expGetSystemTime(SYSTEMTIME* systime)
  409. {
  410.     time_t local_time;
  411.     struct tm *local_tm;
  412.     struct timeval tv;
  413.     dbgprintf("GetSystemTime(0x%x)n", systime);
  414.     gettimeofday(&tv, NULL);
  415.     local_time=tv.tv_sec;
  416.     local_tm=gmtime(&local_time);
  417.     systime->wYear = local_tm->tm_year + 1900;
  418.     systime->wMonth = local_tm->tm_mon + 1;
  419.     systime->wDayOfWeek = local_tm->tm_wday;
  420.     systime->wDay = local_tm->tm_mday;
  421.     systime->wHour = local_tm->tm_hour;
  422.     systime->wMinute = local_tm->tm_min;
  423.     systime->wSecond = local_tm->tm_sec;
  424.     systime->wMilliseconds = (tv.tv_usec / 1000) % 1000;
  425.     dbgprintf("  Year: %dn  Month: %dn  Day of week: %dn"
  426.       "  Day: %dn  Hour: %dn  Minute: %dn  Second:  %dn"
  427.       "  Milliseconds: %dn",
  428.       systime->wYear, systime->wMonth, systime->wDayOfWeek, systime->wDay,
  429.       systime->wHour, systime->wMinute, systime->wSecond, systime->wMilliseconds);
  430.     return 0;
  431. }
  432. #define SECS_1601_TO_1970  ((369 * 365 + 89) * 86400ULL)
  433. static void WINAPI expGetSystemTimeAsFileTime(FILETIME* systime)
  434. {
  435.     struct tm *local_tm;
  436.     struct timeval tv;
  437.     unsigned long long secs;
  438.     dbgprintf("GetSystemTime(0x%x)n", systime);
  439.     gettimeofday(&tv, NULL);
  440.     secs = (tv.tv_sec + SECS_1601_TO_1970) * 10000000;
  441.     secs += tv.tv_usec * 10;
  442.     systime->dwLowDateTime = secs & 0xffffffff;
  443.     systime->dwHighDateTime = (secs >> 32);
  444. }
  445. static int WINAPI expGetEnvironmentVariableA(const char* name, char* field, int size)
  446. {
  447.     char *p;
  448.     //    printf("%s %x %xn", name, field, size);
  449.     if(field)field[0]=0;
  450.     /*
  451.      p = getenv(name);
  452.      if (p) strncpy(field,p,size);
  453.      */
  454.     if (strcmp(name,"__MSVCRT_HEAP_SELECT")==0)
  455. strcpy(field,"__GLOBAL_HEAP_SELECTED,1");
  456.     dbgprintf("GetEnvironmentVariableA(0x%x='%s', 0x%x, %d) => %dn", name, name, field, size, strlen(field));
  457.     return strlen(field);
  458. }
  459. static int WINAPI expSetEnvironmentVariableA(const char *name, const char *value)
  460. {
  461.     dbgprintf("SetEnvironmentVariableA(%s, %s)n", name, value);
  462.     return 0;
  463. }
  464. static void* WINAPI expCoTaskMemAlloc(ULONG cb)
  465. {
  466.     return my_mreq(cb, 0);
  467. }
  468. static void WINAPI expCoTaskMemFree(void* cb)
  469. {
  470.     my_release(cb);
  471. }
  472. void* CoTaskMemAlloc(unsigned long cb)
  473. {
  474.     return expCoTaskMemAlloc(cb);
  475. }
  476. void CoTaskMemFree(void* cb)
  477. {
  478.     expCoTaskMemFree(cb);
  479. }
  480. struct COM_OBJECT_INFO
  481. {
  482.     GUID clsid;
  483.     long (*GetClassObject) (GUID* clsid, const GUID* iid, void** ppv);
  484. };
  485. static struct COM_OBJECT_INFO* com_object_table=0;
  486. static int com_object_size=0;
  487. int RegisterComClass(const GUID* clsid, GETCLASSOBJECT gcs)
  488. {
  489.     if(!clsid || !gcs)
  490. return -1;
  491.     com_object_table=realloc(com_object_table, sizeof(struct COM_OBJECT_INFO)*(++com_object_size));
  492.     com_object_table[com_object_size-1].clsid=*clsid;
  493.     com_object_table[com_object_size-1].GetClassObject=gcs;
  494.     return 0;
  495. }
  496. int UnregisterComClass(const GUID* clsid, GETCLASSOBJECT gcs)
  497. {
  498.     int found = 0;
  499.     int i = 0;
  500.     if(!clsid || !gcs)
  501. return -1;
  502.     if (com_object_table == 0)
  503. printf("Warning: UnregisterComClass() called without any registered classn");
  504.     while (i < com_object_size)
  505.     {
  506. if (found && i > 0)
  507. {
  508.     memcpy(&com_object_table[i - 1].clsid,
  509.    &com_object_table[i].clsid, sizeof(GUID));
  510.     com_object_table[i - 1].GetClassObject =
  511. com_object_table[i].GetClassObject;
  512. }
  513. else if (memcmp(&com_object_table[i].clsid, clsid, sizeof(GUID)) == 0
  514.  && com_object_table[i].GetClassObject == gcs)
  515. {
  516.     found++;
  517. }
  518. i++;
  519.     }
  520.     if (found)
  521.     {
  522. if (--com_object_size == 0)
  523. {
  524.     free(com_object_table);
  525.     com_object_table = 0;
  526. }
  527.     }
  528.     return 0;
  529. }
  530. const GUID IID_IUnknown =
  531. {
  532.     0x00000000, 0x0000, 0x0000,
  533.     {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}
  534. };
  535. const GUID IID_IClassFactory =
  536. {
  537.     0x00000001, 0x0000, 0x0000,
  538.     {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}
  539. };
  540. static long WINAPI expCoCreateInstance(GUID* rclsid, struct IUnknown* pUnkOuter,
  541.        long dwClsContext, const GUID* riid, void** ppv)
  542. {
  543.     int i;
  544.     struct COM_OBJECT_INFO* ci=0;
  545.     for(i=0; i<com_object_size; i++)
  546. if(!memcmp(rclsid, &com_object_table[i].clsid, sizeof(GUID)))
  547.     ci=&com_object_table[i];
  548.     if(!ci)return REGDB_E_CLASSNOTREG;
  549.     // in 'real' world we should mess with IClassFactory here
  550.     i=ci->GetClassObject(rclsid, riid, ppv);
  551.     return i;
  552. }
  553. long CoCreateInstance(GUID* rclsid, struct IUnknown* pUnkOuter,
  554.       long dwClsContext, const GUID* riid, void** ppv)
  555. {
  556.     return expCoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv);
  557. }
  558. static int WINAPI expIsRectEmpty(CONST RECT *lprc)
  559. {
  560.     int r = 0;
  561.     int w,h;
  562. //trapbug();
  563.     if (lprc)
  564.     {
  565. w = lprc->right - lprc->left;
  566. h = lprc->bottom - lprc->top;
  567. if (w <= 0 || h <= 0)
  568.     r = 1;
  569.     }
  570.     else
  571. r = 1;
  572.     dbgprintf("IsRectEmpty(%p) => %sn", lprc, (r) ? "TRUE" : "FALSE");
  573.     //printf("Rect: left: %d, top: %d, right: %d, bottom: %dn", lprc->left, lprc->top, lprc->right, lprc->bottom);
  574. //    return 0; // wmv9?
  575.     return r; // TM20
  576. }
  577. static int _adjust_fdiv=0; //what's this? - used to adjust division
  578. static unsigned int WINAPI expGetTempPathA(unsigned int len, char* path)
  579. {
  580.     dbgprintf("GetTempPathA(%d, 0x%x)", len, path);
  581.     if(len<5)
  582.     {
  583. dbgprintf(" => 0n");
  584. return 0;
  585.     }
  586.     strcpy(path, "/tmp");
  587.     dbgprintf(" => 5 ( '/tmp' )n");
  588.     return 5;
  589. }
  590. /*
  591.  FYI:
  592.  typedef struct
  593.  {
  594.  DWORD     dwFileAttributes;
  595.  FILETIME  ftCreationTime;
  596.  FILETIME  ftLastAccessTime;
  597.  FILETIME  ftLastWriteTime;
  598.  DWORD     nFileSizeHigh;
  599.  DWORD     nFileSizeLow;
  600.  DWORD     dwReserved0;
  601.  DWORD     dwReserved1;
  602.  CHAR      cFileName[260];
  603.  CHAR      cAlternateFileName[14];
  604.  } WIN32_FIND_DATAA, *LPWIN32_FIND_DATAA;
  605.  */
  606. static DIR* qtx_dir=NULL;
  607. static WIN_BOOL WINAPI expFindNextFileA(HANDLE h,LPWIN32_FIND_DATAA lpfd)
  608. {
  609. #ifdef QTX
  610.     dbgprintf("FindNextFileA(0x%x, 0x%x) => 0n", h, lpfd);
  611.     if(h==FILE_HANDLE_quicktimeqtx){
  612. struct dirent* d;
  613. if(!qtx_dir) return 0;
  614. while((d=readdir(qtx_dir))){
  615.     char* x=strrchr(d->d_name,'.');
  616.     if(!x) continue;
  617.     if(strcmp(x,".qtx")) continue;
  618.     strcpy(lpfd->cFileName,d->d_name);
  619. //     sprintf(lpfd->cAlternateFileName,"%-8s.qtx",d->d_name);
  620.     strcpy(lpfd->cAlternateFileName,"foobar.qtx");
  621.     printf("### FindNext: %sn",lpfd->cFileName);
  622.     return 1;
  623. }
  624. closedir(qtx_dir); qtx_dir=NULL;
  625. return 0;
  626.     }
  627. #endif
  628.     return 0;
  629. }
  630. static HANDLE WINAPI expFindFirstFileA(LPCSTR s, LPWIN32_FIND_DATAA lpfd)
  631. {
  632.     dbgprintf("FindFirstFileA(0x%x='%s', 0x%x) => 0n", s, s, lpfd);
  633. //    printf("n### FindFirstFileA('%s')...n",s);
  634. #ifdef QTX
  635.     if(strstr(s, "quicktime\*.QTX")){
  636. dbgprintf("FindFirstFileA(0x%x='%s', 0x%x) => QTXn", s, s, lpfd);
  637. printf("n### Searching for QuickTime plugins (*.qtx) at %s...n",def_path);
  638. qtx_dir=opendir(def_path);
  639. if(!qtx_dir) return (HANDLE)-1;
  640. memset(lpfd,0,sizeof(*lpfd));
  641. if(expFindNextFileA(FILE_HANDLE_quicktimeqtx,lpfd))
  642.     return FILE_HANDLE_quicktimeqtx;
  643. printf("loader: Couldn't find the QuickTime plugins (.qtx files) at %sn",def_path);
  644. return (HANDLE)-1;
  645.     }
  646. #if 0
  647.     if(strstr(s, "QuickTime.qts")){
  648. dbgprintf("FindFirstFileA(0x%x='%s', 0x%x) => QTSn", s, s, lpfd);
  649. // if(!strcmp(s,"C:\windows\QuickTime.qts\QuickTime.qts\*.QTX"))
  650. //     return (HANDLE)-1;
  651. strcpy(lpfd->cFileName, "QuickTime.qts");
  652. strcpy(lpfd->cAlternateFileName, "QuickT~1.qts");
  653. return FILE_HANDLE_quicktimeqts;
  654.     }
  655. #endif
  656. #endif
  657.     if(strstr(s, "*.vwp")){
  658. // hack for VoxWare codec plugins:
  659. strcpy(lpfd->cFileName, "msms001.vwp");
  660. strcpy(lpfd->cAlternateFileName, "msms001.vwp");
  661. return (HANDLE)0;
  662.     }
  663.     // return 'file not found'
  664.     return (HANDLE)-1;
  665. }
  666. static WIN_BOOL WINAPI expFindClose(HANDLE h)
  667. {
  668.     dbgprintf("FindClose(0x%x) => 0n", h);
  669. #ifdef QTX
  670. //    if(h==FILE_HANDLE_quicktimeqtx && qtx_dir){
  671. // closedir(qtx_dir);
  672. // qtx_dir=NULL;
  673. //    }
  674. #endif
  675.     return 0;
  676. }
  677. static UINT WINAPI expSetErrorMode(UINT i)
  678. {
  679.     dbgprintf("SetErrorMode(%d) => 0n", i);
  680.     return 0;
  681. }
  682. static UINT WINAPI expGetWindowsDirectoryA(LPSTR s,UINT c)
  683. {
  684.     char windir[]="c:\windows";
  685.     int result;
  686.     strncpy(s, windir, c);
  687.     result=1+((c<strlen(windir))?c:strlen(windir));
  688.     dbgprintf("GetWindowsDirectoryA(0x%x, %d) => %dn", s, c, result);
  689.     return result;
  690. }
  691. #ifdef QTX
  692. static UINT WINAPI expGetCurrentDirectoryA(UINT c, LPSTR s)
  693. {
  694.     char curdir[]="c:\";
  695.     int result;
  696.     strncpy(s, curdir, c);
  697.     result=1+((c<strlen(curdir))?c:strlen(curdir));
  698.     dbgprintf("GetCurrentDirectoryA(0x%x, %d) => %dn", s, c, result);
  699.     return result;
  700. }
  701. static int WINAPI expSetCurrentDirectoryA(const char *pathname)
  702. {
  703.     dbgprintf("SetCurrentDirectoryA(0x%x = %s) => 1n", pathname, pathname);
  704. #if 0
  705.     if (strrchr(pathname, '\'))
  706. chdir(strcat(strrchr(pathname, '\')+1, '/'));
  707.     else
  708. chdir(pathname);
  709. #endif
  710.     return 1;
  711. }
  712. static int WINAPI expCreateDirectoryA(const char *pathname, void *sa)
  713. {
  714.     dbgprintf("CreateDirectory(0x%x = %s, 0x%x) => 1n",
  715. pathname, pathname, sa);
  716. #if 0
  717.     p = strrchr(pathname, '\')+1;
  718.     strcpy(&buf[0], p); /* should be strncpy */
  719.     if (!strlen(p))
  720.     {
  721. buf[0] = '.';
  722. buf[1] = 0;
  723.     }
  724. #if 0    
  725.     if (strrchr(pathname, '\'))
  726. mkdir(strcat(strrchr(pathname, '\')+1, '/'), 666);
  727.     else
  728. mkdir(pathname, 666);
  729. #endif
  730.     mkdir(&buf);
  731. #endif
  732.     return 1;
  733. }
  734. #endif
  735. static WIN_BOOL  WINAPI expDeleteFileA(LPCSTR s)
  736. {
  737.     dbgprintf("DeleteFileA(0x%x='%s') => 0n", s, s);
  738.     return 0;
  739. }
  740. static WIN_BOOL  WINAPI expFileTimeToLocalFileTime(const FILETIME* cpf, LPFILETIME pf)
  741. {
  742.     dbgprintf("FileTimeToLocalFileTime(0x%x, 0x%x) => 0n", cpf, pf);
  743.     return 0;
  744. }
  745. static UINT WINAPI expGetTempFileNameA(LPCSTR cs1,LPCSTR cs2,UINT i,LPSTR ps)
  746. {
  747.     char mask[16]="/tmp/AP_XXXXXX";
  748.     int result;
  749.     dbgprintf("GetTempFileNameA(0x%x='%s', 0x%x='%s', %d, 0x%x)", cs1, cs1, cs2, cs2, i, ps);
  750.     if(i && i<10)
  751.     {
  752. dbgprintf(" => -1n");
  753. return -1;
  754.     }
  755.     result=mkstemp(mask);
  756.     sprintf(ps, "AP%d", result);
  757.     dbgprintf(" => %dn", strlen(ps));
  758.     return strlen(ps);
  759. }
  760. //
  761. // This func might need proper implementation if we want AngelPotion codec.
  762. // They try to open APmpeg4v1.apl with it.
  763. // DLL will close opened file with CloseHandle().
  764. //
  765. static HANDLE WINAPI expCreateFileA(LPCSTR cs1,DWORD i1,DWORD i2,
  766.     LPSECURITY_ATTRIBUTES p1, DWORD i3,DWORD i4,HANDLE i5)
  767. {
  768.     dbgprintf("CreateFileA(0x%x='%s', %d, %d, 0x%x, %d, %d, 0x%x)n", cs1, cs1, i1,
  769.       i2, p1, i3, i4, i5);
  770.     if((!cs1) || (strlen(cs1)<2))return -1;
  771. #ifdef QTX
  772.     if(strstr(cs1, "QuickTime.qts"))
  773.     {
  774. int result;
  775. char* tmp=(char*)malloc(strlen(def_path)+50);
  776. strcpy(tmp, def_path);
  777. strcat(tmp, "/");
  778. strcat(tmp, "QuickTime.qts");
  779. result=open(tmp, O_RDONLY);
  780. free(tmp);
  781. return result;
  782.     }
  783.     if(strstr(cs1, ".qtx"))
  784.     {
  785. int result;
  786. char* tmp=(char*)malloc(strlen(def_path)+250);
  787. char* x=strrchr(cs1,'\');
  788. sprintf(tmp,"%s/%s",def_path,x?(x+1):cs1);
  789. // printf("### Open: %s -> %sn",cs1,tmp);
  790. result=open(tmp, O_RDONLY);
  791. free(tmp);
  792. return result;
  793.     }
  794. #endif
  795.     if(strncmp(cs1, "AP", 2) == 0)
  796.     {
  797. int result;
  798. char* tmp=(char*)malloc(strlen(def_path)+50);
  799. strcpy(tmp, def_path);
  800. strcat(tmp, "/");
  801. strcat(tmp, "APmpg4v1.apl");
  802. result=open(tmp, O_RDONLY);
  803. free(tmp);
  804. return result;
  805.     }
  806.     if (strstr(cs1, "vp3"))
  807.     {
  808. int r;
  809. int flg = 0;
  810. char* tmp=(char*)malloc(20 + strlen(cs1));
  811. strcpy(tmp, "/tmp/");
  812. strcat(tmp, cs1);
  813. r = 4;
  814. while (tmp[r])
  815. {
  816.     if (tmp[r] == ':' || tmp[r] == '\')
  817. tmp[r] = '_';
  818.     r++;
  819. }
  820. if (GENERIC_READ & i1)
  821.     flg |= O_RDONLY;
  822. else if (GENERIC_WRITE & i1)
  823. {
  824.     flg |= O_WRONLY;
  825.     printf("Warning: openning filename %s  %d (flags; 0x%x) for writen", tmp, r, flg);
  826. }
  827. r=open(tmp, flg);
  828. free(tmp);
  829. return r;
  830.     }
  831.     // Needed by wnvplay1.dll
  832.     if (strstr(cs1, "WINNOV.bmp"))
  833.     {
  834. int r;
  835. r=open("/dev/null", 0);
  836. return r;
  837.     }
  838. #if 0
  839.     /* we need this for some virtualdub filters */
  840.     {
  841. int r;
  842. int flg = 0;
  843. if (GENERIC_READ & i1)
  844.     flg |= O_RDONLY;
  845. else if (GENERIC_WRITE & i1)
  846. {
  847.     flg |= O_WRONLY;
  848.     printf("Warning: openning filename %s  %d (flags; 0x%x) for writen", cs1, r, flg);
  849. }
  850. r=open(cs1, flg);
  851. return r;
  852.     }
  853. #endif
  854.     return atoi(cs1+2);
  855. }
  856. static UINT WINAPI expGetSystemDirectoryA(
  857.   char* lpBuffer,  // address of buffer for system directory
  858.   UINT uSize        // size of directory buffer
  859. ){
  860.     dbgprintf("GetSystemDirectoryA(%p,%d)n", lpBuffer,uSize);
  861.     if(!lpBuffer) strcpy(lpBuffer,".");
  862.     return 1;
  863. }
  864. /*
  865. static char sysdir[]=".";
  866. static LPCSTR WINAPI expGetSystemDirectoryA()
  867. {
  868.     dbgprintf("GetSystemDirectoryA() => 0x%x='%s'n", sysdir, sysdir);
  869.     return sysdir;
  870. }
  871. */
  872. static DWORD WINAPI expGetFullPathNameA
  873. (
  874. LPCTSTR lpFileName,
  875. DWORD nBufferLength,
  876. LPTSTR lpBuffer,
  877. LPTSTR lpFilePart
  878. ){
  879.     if(!lpFileName) return 0;
  880.     dbgprintf("GetFullPathNameA('%s',%d,%p,%p)n",lpFileName,nBufferLength,
  881. lpBuffer, lpFilePart);
  882. #if 0
  883. #ifdef QTX
  884.     strcpy(lpFilePart, "Quick123.qts");
  885. #else
  886.     strcpy(lpFilePart, lpFileName);
  887. #endif
  888. #else
  889.     if (strrchr(lpFileName, '\'))
  890. lpFilePart = strrchr(lpFileName, '\');
  891.     else
  892. lpFilePart = (LPTSTR)lpFileName;
  893. #endif
  894.     strcpy(lpBuffer, lpFileName);
  895. //    strncpy(lpBuffer, lpFileName, rindex(lpFileName, '\')-lpFileName);
  896.     return strlen(lpBuffer);
  897. }
  898. static DWORD WINAPI expGetShortPathNameA
  899. (
  900.         LPCSTR longpath,
  901.         LPSTR shortpath,
  902.         DWORD shortlen
  903. ){
  904.     if(!longpath) return 0;
  905.     dbgprintf("GetShortPathNameA('%s',%p,%d)n",longpath,shortpath,shortlen);
  906.     strcpy(shortpath,longpath);
  907.     return strlen(shortpath);
  908. }
  909. static WIN_BOOL WINAPI expReadFile(HANDLE h,LPVOID pv,DWORD size,LPDWORD rd,LPOVERLAPPED unused)
  910. {
  911.     int result;
  912.     dbgprintf("ReadFile(%d, 0x%x, %d -> 0x%x)n", h, pv, size, rd);
  913.     result=read(h, pv, size);
  914.     if(rd)*rd=result;
  915.     if(!result)return 0;
  916.     return 1;
  917. }
  918. static WIN_BOOL WINAPI expWriteFile(HANDLE h,LPCVOID pv,DWORD size,LPDWORD wr,LPOVERLAPPED unused)
  919. {
  920.     int result;
  921.     dbgprintf("WriteFile(%d, 0x%x, %d -> 0x%x)n", h, pv, size, wr);
  922.     if(h==1234)h=1;
  923.     result=write(h, pv, size);
  924.     if(wr)*wr=result;
  925.     if(!result)return 0;
  926.     return 1;
  927. }
  928. static DWORD  WINAPI expSetFilePointer(HANDLE h, LONG val, LPLONG ext, DWORD whence)
  929. {
  930.     int wh;
  931.     dbgprintf("SetFilePointer(%d, 0x%x, 0x%x = %d, %d)n", h, val, ext, *ext, whence);
  932.     //why would DLL want temporary file with >2Gb size?
  933.     switch(whence)
  934.     {
  935.     case FILE_BEGIN:
  936. wh=SEEK_SET;break;
  937.     case FILE_END:
  938. wh=SEEK_END;break;
  939.     case FILE_CURRENT:
  940. wh=SEEK_CUR;break;
  941.     default:
  942. return -1;
  943.     }
  944. #ifdef QTX
  945.     if (val == 0 && ext != 0)
  946. val = val&(*ext);
  947. #endif
  948.     return lseek(h, val, wh);
  949. }
  950. static HDRVR WINAPI expOpenDriverA(LPCSTR szDriverName, LPCSTR szSectionName,
  951.    LPARAM lParam2)
  952. {
  953.     dbgprintf("OpenDriverA(0x%x='%s', 0x%x='%s', 0x%x) => -1n", szDriverName,  szDriverName, szSectionName, szSectionName, lParam2);
  954.     return -1;
  955. }
  956. static HDRVR WINAPI expOpenDriver(LPCSTR szDriverName, LPCSTR szSectionName,
  957.   LPARAM lParam2)
  958. {
  959.     dbgprintf("OpenDriver(0x%x='%s', 0x%x='%s', 0x%x) => -1n", szDriverName, szDriverName, szSectionName, szSectionName, lParam2);
  960.     return -1;
  961. }
  962. static WIN_BOOL WINAPI expGetProcessAffinityMask(HANDLE hProcess,
  963.  LPDWORD lpProcessAffinityMask,
  964.  LPDWORD lpSystemAffinityMask)
  965. {
  966.     dbgprintf("GetProcessAffinityMask(0x%x, 0x%x, 0x%x) => 1n",
  967.       hProcess, lpProcessAffinityMask, lpSystemAffinityMask);
  968.     if(lpProcessAffinityMask)*lpProcessAffinityMask=1;
  969.     if(lpSystemAffinityMask)*lpSystemAffinityMask=1;
  970.     return 1;
  971. }
  972. static int WINAPI expMulDiv(int nNumber, int nNumerator, int nDenominator)
  973. {
  974.     static const long long max_int=0x7FFFFFFFLL;
  975.     static const long long min_int=-0x80000000LL;
  976.     long long tmp=(long long)nNumber*(long long)nNumerator;
  977.     dbgprintf("expMulDiv %d * %d / %dn", nNumber, nNumerator, nDenominator);
  978.     if(!nDenominator)return 1;
  979.     tmp/=nDenominator;
  980.     if(tmp<min_int) return 1;
  981.     if(tmp>max_int) return 1;
  982.     return (int)tmp;
  983. }
  984. static LONG WINAPI explstrcmpiA(const char* str1, const char* str2)
  985. {
  986.     LONG result=strcasecmp(str1, str2);
  987.     dbgprintf("strcmpi(0x%x='%s', 0x%x='%s') => %dn", str1, str1, str2, str2, result);
  988.     return result;
  989. }
  990. static LONG WINAPI explstrlenA(const char* str1)
  991. {
  992.     LONG result=strlen(str1);
  993.     dbgprintf("strlen(0x%x='%.50s') => %dn", str1, str1, result);
  994.     return result;
  995. }
  996. static LONG WINAPI explstrcpyA(char* str1, const char* str2)
  997. {
  998.     int result= (int) strcpy(str1, str2);
  999.     dbgprintf("strcpy(0x%.50x, 0x%.50x='%.50s') => %dn", str1, str2, str2, result);
  1000.     return result;
  1001. }
  1002. static LONG WINAPI explstrcpynA(char* str1, const char* str2,int len)
  1003. {
  1004.     int result;
  1005.     if (strlen(str2)>len)
  1006. result = (int) strncpy(str1, str2,len);
  1007.     else
  1008. result = (int) strcpy(str1,str2);
  1009.     dbgprintf("strncpy(0x%x, 0x%x='%s' len %d strlen %d) => %xn", str1, str2, str2,len, strlen(str2),result);
  1010.     return result;
  1011. }
  1012. static LONG WINAPI explstrcatA(char* str1, const char* str2)
  1013. {
  1014.     int result= (int) strcat(str1, str2);
  1015.     dbgprintf("strcat(0x%x, 0x%x='%s') => %dn", str1, str2, str2, result);
  1016.     return result;
  1017. }
  1018. static LONG WINAPI expInterlockedExchange(long *dest, long l)
  1019. {
  1020.     long retval = *dest;
  1021.     *dest = l;
  1022.     return retval;
  1023. }
  1024. static void WINAPI expInitCommonControls(void)
  1025. {
  1026.     dbgprintf("InitCommonControls called!n");
  1027.     return;
  1028. }
  1029. #ifdef QTX
  1030. /* needed by QuickTime.qts */
  1031. static HWND WINAPI expCreateUpDownControl (DWORD style, INT x, INT y, INT cx, INT cy,
  1032.       HWND parent, INT id, HINSTANCE inst,
  1033.               HWND buddy, INT maxVal, INT minVal, INT curVal)
  1034. {
  1035.     dbgprintf("CreateUpDownControl(...)n");
  1036.     return 0;
  1037. }
  1038. #endif
  1039. /* alex: implement this call! needed for 3ivx */
  1040. static HRESULT WINAPI expCoCreateFreeThreadedMarshaler(void *pUnkOuter, void **ppUnkInner)
  1041. {
  1042.     dbgprintf("CoCreateFreeThreadedMarshaler(%p, %p) called!n",
  1043.    pUnkOuter, ppUnkInner);
  1044. //    return 0;
  1045.     return ERROR_CALL_NOT_IMPLEMENTED;
  1046. }
  1047. static int WINAPI expDuplicateHandle(HANDLE hSourceProcessHandle,  // handle to source process
  1048.      HANDLE hSourceHandle,         // handle to duplicate
  1049.      HANDLE hTargetProcessHandle,  // handle to target process
  1050.      HANDLE* lpTargetHandle,      // duplicate handle
  1051.      DWORD dwDesiredAccess,        // requested access
  1052.      int bInheritHandle,          // handle inheritance option
  1053.      DWORD dwOptions               // optional actions
  1054.     )
  1055. {
  1056.     dbgprintf("DuplicateHandle(%p, %p, %p, %p, 0x%x, %d, %d) calledn",
  1057.       hSourceProcessHandle, hSourceHandle, hTargetProcessHandle,
  1058.       lpTargetHandle, dwDesiredAccess, bInheritHandle, dwOptions);
  1059.     *lpTargetHandle = hSourceHandle;
  1060.     return 1;
  1061. }
  1062. // required by PIM1 codec (used by win98 PCTV Studio capture sw)
  1063. static HRESULT WINAPI expCoInitialize(
  1064.       LPVOID lpReserved /* [in] pointer to win32 malloc interface
  1065.       (obsolete, should be NULL) */
  1066.      )
  1067. {
  1068.     /*
  1069.      * Just delegate to the newer method.
  1070.      */
  1071.     return 0; //CoInitializeEx(lpReserved, COINIT_APARTMENTTHREADED);
  1072. }
  1073. static DWORD WINAPI expSetThreadAffinityMask
  1074. (
  1075.         HANDLE hThread,
  1076.         DWORD dwThreadAffinityMask
  1077. ){
  1078.     return 0;
  1079. };
  1080. /*
  1081.  * no WINAPI functions - CDECL
  1082.  */
  1083. static void* expmalloc(int size)
  1084. {
  1085.     //printf("malloc");
  1086.     //    return malloc(size);
  1087.     void* result=my_mreq(size,0);
  1088.     dbgprintf("malloc(0x%x) => 0x%xn", size,result);
  1089.     if(result==0)
  1090. printf("WARNING: malloc() failedn");
  1091.     return result;
  1092. }
  1093. static void expfree(void* mem)
  1094. {
  1095.     //    return free(mem);
  1096.     dbgprintf("free(%p)n", mem);
  1097.     my_release(mem);
  1098. }
  1099. /* needed by atrac3.acm */
  1100. static void *expcalloc(int num, int size)
  1101. {
  1102.     void* result=my_mreq(num*size,1);
  1103.     dbgprintf("calloc(%d,%d) => %pn", num,size,result);
  1104.     if(result==0)
  1105. printf("WARNING: calloc() failedn");
  1106.     return result;
  1107. }
  1108. static void* expnew(int size)
  1109. {
  1110.     //    printf("NEW:: Call from address %08xn STACK DUMP:n", *(-1+(int*)&size));
  1111.     //    printf("%08x %08x %08x %08xn",
  1112.     //    size, *(1+(int*)&size),
  1113.     //    *(2+(int*)&size),*(3+(int*)&size));
  1114.     void* result;
  1115.     assert(size >= 0);
  1116.     result=my_mreq(size,0);
  1117.     dbgprintf("new(%d) => %pn", size, result);
  1118.     if (result==0)
  1119. printf("WARNING: new() failedn");
  1120.     return result;
  1121. }
  1122. static int expdelete(void* memory)
  1123. {
  1124.     dbgprintf("delete(%p)n", memory);
  1125.     my_release(memory);
  1126.     return 0;
  1127. }
  1128. /*
  1129.  * local definition - we need only the last two members at this point
  1130.  * otherwice we would have to introduce here GUIDs and some more types..
  1131.  */
  1132. typedef struct __attribute__((__packed__))
  1133. {
  1134.     char hay[0x3C];
  1135.     void* pbUnknown; //0x3C
  1136.     unsigned long cbFormat; //0x40
  1137.     char* pbFormat; //0x44
  1138. } MY_MEDIA_TYPE;
  1139. static HRESULT WINAPI expMoCopyMediaType(MY_MEDIA_TYPE* dest, const MY_MEDIA_TYPE* src)
  1140. {
  1141.     if (!dest || !src)
  1142. return E_POINTER;
  1143.     memcpy(dest, src, sizeof(MY_MEDIA_TYPE));
  1144.     if (dest->cbFormat)
  1145.     {
  1146. dest->pbFormat = (char*) my_mreq(dest->cbFormat, 0);
  1147. if (!dest->pbFormat)
  1148.             return E_OUTOFMEMORY;
  1149. memcpy(dest->pbFormat, src->pbFormat, dest->cbFormat);
  1150.     }
  1151.     return S_OK;
  1152. }
  1153. static HRESULT WINAPI expMoInitMediaType(MY_MEDIA_TYPE* dest, DWORD cbFormat)
  1154. {
  1155.     if (!dest)
  1156.         return E_POINTER;
  1157.     dest->pbUnknown = NULL;
  1158.     dest->cbFormat = cbFormat;
  1159.     if (cbFormat)
  1160.     {
  1161. dest->pbFormat = (char*) my_mreq(cbFormat, 0);
  1162. if (!dest->pbFormat)
  1163.             return E_OUTOFMEMORY;
  1164.     }
  1165.     else 
  1166.     {
  1167.     dest->pbFormat=NULL;
  1168.     }
  1169.     return S_OK;
  1170. }
  1171. static HRESULT WINAPI expMoCreateMediaType(MY_MEDIA_TYPE** dest, DWORD cbFormat)
  1172. {
  1173.     if (!dest)
  1174. return E_POINTER;
  1175.     *dest = my_mreq(sizeof(MY_MEDIA_TYPE), 0);
  1176.     return expMoInitMediaType(*dest, cbFormat);
  1177. }
  1178. static HRESULT WINAPI expMoDuplicateMediaType(MY_MEDIA_TYPE** dest, const void* src)
  1179. {
  1180.     if (!dest)
  1181. return E_POINTER;
  1182.     *dest = my_mreq(sizeof(MY_MEDIA_TYPE), 0);
  1183.     return expMoCopyMediaType(*dest, src);
  1184. }
  1185. static HRESULT WINAPI expMoFreeMediaType(MY_MEDIA_TYPE* dest)
  1186. {
  1187.     if (!dest)
  1188. return E_POINTER;
  1189.     if (dest->pbFormat)
  1190.     {
  1191. my_release(dest->pbFormat);
  1192. dest->pbFormat = 0;
  1193.         dest->cbFormat = 0;
  1194.     }
  1195.     return S_OK;
  1196. }
  1197. static HRESULT WINAPI expMoDeleteMediaType(MY_MEDIA_TYPE* dest)
  1198. {
  1199.     if (!dest)
  1200. return E_POINTER;
  1201.     expMoFreeMediaType(dest);
  1202.     my_release(dest);
  1203.     return S_OK;
  1204. }
  1205. static int exp_snprintf( char *str, int size, const char *format, ... )
  1206. {
  1207.       int x;
  1208.       va_list va;
  1209.       va_start(va, format);
  1210.       x=snprintf(str,size,format,va);
  1211.       dbgprintf("_snprintf( 0x%x, %d, %s, ... ) => %dn",str,size,format,x);
  1212.       va_end(va);
  1213.       return x;
  1214. }
  1215. #if 0
  1216. static int exp_initterm(int v1, int v2)
  1217. {
  1218.     dbgprintf("_initterm(0x%x, 0x%x) => 0n", v1, v2);
  1219.     return 0;
  1220. }
  1221. #else
  1222. /* merged from wine - 2002.04.21 */
  1223. typedef void (*_INITTERMFUNC)();
  1224. static int exp_initterm(_INITTERMFUNC *start, _INITTERMFUNC *end)
  1225. {
  1226.     dbgprintf("_initterm(0x%x, 0x%x) %pn", start, end, *start);
  1227.     while (start < end)
  1228.     {
  1229. if (*start)
  1230. {
  1231.     //printf("call _initfunc: from: %p %dn", *start);
  1232.     // ok this trick with push/pop is necessary as otherwice
  1233.     // edi/esi registers are being trashed
  1234.     void* p = *start;
  1235.     __asm__ __volatile__
  1236. (
  1237.  "pushl %%ebx nt"
  1238.  "pushl %%ecx nt"
  1239.  "pushl %%edx nt"
  1240.  "pushl %%edi nt"
  1241.  "pushl %%esi nt"
  1242.  "call  *%%eax nt"
  1243.  "popl  %%esi nt"
  1244.  "popl  %%edi nt"
  1245.  "popl  %%edx nt"
  1246.  "popl  %%ecx nt"
  1247.  "popl  %%ebx nt"
  1248.  :
  1249.  : "a"(p)
  1250.  : "memory"
  1251. );
  1252.             //printf("done  %p  %d:%dn", end);
  1253. }
  1254. start++;
  1255.     }
  1256.     return 0;
  1257. }
  1258. #endif
  1259. static void* exp__dllonexit()
  1260. {
  1261.     // FIXME extract from WINE
  1262.     return NULL;
  1263. }
  1264. static int expwsprintfA(char* string, const char* format, ...)
  1265. {
  1266.     va_list va;
  1267.     int result;
  1268.     va_start(va, format);
  1269.     result = vsprintf(string, format, va);
  1270.     dbgprintf("wsprintfA(0x%x, '%s', ...) => %dn", string, format, result);
  1271.     va_end(va);
  1272.     return result;
  1273. }
  1274. static int expsprintf(char* str, const char* format, ...)
  1275. {
  1276.     va_list args;
  1277.     int r;
  1278.     dbgprintf("sprintf(0x%x, %s)n", str, format);
  1279.     va_start(args, format);
  1280.     r = vsprintf(str, format, args);
  1281.     va_end(args);
  1282.     return r;
  1283. }
  1284. static int expsscanf(const char* str, const char* format, ...)
  1285. {
  1286.     va_list args;
  1287.     int r;
  1288.     dbgprintf("sscanf(%s, %s)n", str, format);
  1289.     va_start(args, format);
  1290.     r = vsscanf(str, format, args);
  1291.     va_end(args);
  1292.     return r;
  1293. }
  1294. static void* expfopen(const char* path, const char* mode)
  1295. {
  1296.     printf("fopen: "%s"  mode:%sn", path, mode);
  1297.     //return fopen(path, mode);
  1298.     return fdopen(0, mode); // everything on screen
  1299. }
  1300. static int expfprintf(void* stream, const char* format, ...)
  1301. {
  1302.     va_list args;
  1303.     int r = 0;
  1304.     dbgprintf("fprintf(%p, %s, ...)n", stream, format);
  1305. #if 1
  1306.     va_start(args, format);
  1307.     r = vfprintf((FILE*) stream, format, args);
  1308.     va_end(args);
  1309. #endif
  1310.     return r;
  1311. }
  1312. static int expprintf(const char* format, ...)
  1313. {
  1314.     va_list args;
  1315.     int r;
  1316.     dbgprintf("printf(%s, ...)n", format);
  1317.     va_start(args, format);
  1318.     r = vprintf(format, args);
  1319.     va_end(args);
  1320.     return r;
  1321. }
  1322. static char* expgetenv(const char* varname)
  1323. {
  1324.     char* v = getenv(varname);
  1325.     dbgprintf("getenv(%s) => %sn", varname, v);
  1326.     return v;
  1327. }
  1328. static void* expwcscpy(WCHAR* dst, const WCHAR* src)
  1329. {
  1330.     WCHAR* p = dst;
  1331.     while ((*p++ = *src++))
  1332. ;
  1333.     return dst;
  1334. }
  1335. static char* expstrrchr(char* string, int value)
  1336. {
  1337.     char* result=strrchr(string, value);
  1338.     if(result)
  1339. dbgprintf("strrchr(0x%x='%s', %d) => 0x%x='%s'", string, string, value, result, result);
  1340.     else
  1341. dbgprintf("strrchr(0x%x='%s', %d) => 0", string, string, value);
  1342.     return result;
  1343. }
  1344. static char* expstrchr(char* string, int value)
  1345. {
  1346.     char* result=strchr(string, value);
  1347.     if(result)
  1348. dbgprintf("strchr(0x%x='%s', %d) => 0x%x='%s'", string, string, value, result, result);
  1349.     else
  1350. dbgprintf("strchr(0x%x='%s', %d) => 0", string, string, value);
  1351.     return result;
  1352. }
  1353. static int expstrlen(char* str)
  1354. {
  1355.     int result=strlen(str);
  1356.     dbgprintf("strlen(0x%x='%s') => %dn", str, str, result);
  1357.     return result;
  1358. }
  1359. static char* expstrcpy(char* str1, const char* str2)
  1360. {
  1361.     char* result= strcpy(str1, str2);
  1362.     dbgprintf("strcpy(0x%x, 0x%x='%s') => %pn", str1, str2, str2, result);
  1363.     return result;
  1364. }
  1365. static char* expstrncpy(char* str1, const char* str2, size_t count)
  1366. {
  1367.     char* result= strncpy(str1, str2, count);
  1368.     dbgprintf("strncpy(0x%x, 0x%x='%s', %d) => %pn", str1, str2, str2, count, result);
  1369.     return result;
  1370. }
  1371. static int expstrcmp(const char* str1, const char* str2)
  1372. {
  1373.     int result=strcmp(str1, str2);
  1374.     dbgprintf("strcmp(0x%x='%s', 0x%x='%s') => %dn", str1, str1, str2, str2, result);
  1375.     return result;
  1376. }
  1377. static int expstrncmp(const char* str1, const char* str2,int x)
  1378. {
  1379.     int result=strncmp(str1, str2,x);
  1380.     dbgprintf("strcmp(0x%x='%s', 0x%x='%s') => %dn", str1, str1, str2, str2, result);
  1381.     return result;
  1382. }
  1383. static char* expstrcat(char* str1, const char* str2)
  1384. {
  1385.     char* result = strcat(str1, str2);
  1386.     dbgprintf("strcat(0x%x='%s', 0x%x='%s') => %pn", str1, str1, str2, str2, result);
  1387.     return result;
  1388. }
  1389. static char* exp_strdup(const char* str1)
  1390. {
  1391.     int l = strlen(str1);
  1392.     char* result = (char*) my_mreq(l + 1,0);
  1393.     if (result)
  1394. strcpy(result, str1);
  1395.     dbgprintf("_strdup(0x%x='%s') => %pn", str1, str1, result);
  1396.     return result;
  1397. }
  1398. static int expisalnum(int c)
  1399. {
  1400.     int result= (int) isalnum(c);
  1401.     dbgprintf("isalnum(0x%x='%c' => %dn", c, c, result);
  1402.     return result;
  1403. }
  1404. static int expisspace(int c)
  1405. {
  1406.     int result= (int) isspace(c);
  1407.     dbgprintf("isspace(0x%x='%c' => %dn", c, c, result);
  1408.     return result;
  1409. }
  1410. static int expisalpha(int c)
  1411. {
  1412.     int result= (int) isalpha(c);
  1413.     dbgprintf("isalpha(0x%x='%c' => %dn", c, c, result);
  1414.     return result;
  1415. }
  1416. static int expisdigit(int c)
  1417. {
  1418.     int result= (int) isdigit(c);
  1419.     dbgprintf("isdigit(0x%x='%c' => %dn", c, c, result);
  1420.     return result;
  1421. }
  1422. static void* expmemmove(void* dest, void* src, int n)
  1423. {
  1424.     void* result = memmove(dest, src, n);
  1425.     dbgprintf("memmove(0x%x, 0x%x, %d) => %pn", dest, src, n, result);
  1426.     return result;
  1427. }
  1428. static int expmemcmp(void* dest, void* src, int n)
  1429. {
  1430.     int result = memcmp(dest, src, n);
  1431.     dbgprintf("memcmp(0x%x, 0x%x, %d) => %dn", dest, src, n, result);
  1432.     return result;
  1433. }
  1434. static void* expmemcpy(void* dest, void* src, int n)
  1435. {
  1436.     void *result = memcpy(dest, src, n);
  1437.     dbgprintf("memcpy(0x%x, 0x%x, %d) => %pn", dest, src, n, result);
  1438.     return result;
  1439. }
  1440. static void* expmemset(void* dest, int c, size_t n)
  1441. {
  1442.     void *result = memset(dest, c, n);
  1443.     dbgprintf("memset(0x%x, %d, %d) => %pn", dest, c, n, result);
  1444.     return result;
  1445. }
  1446. static time_t exptime(time_t* t)
  1447. {
  1448.     time_t result = time(t);
  1449.     dbgprintf("time(0x%x) => %dn", t, result);
  1450.     return result;
  1451. }
  1452. static int exprand(void)
  1453. {
  1454.     return rand();
  1455. }
  1456. static void expsrand(int seed)
  1457. {
  1458.     srand(seed);
  1459. }
  1460. #if 1
  1461. // preferred compilation with  -O2 -ffast-math !
  1462. static double explog10(double x)
  1463. {
  1464.     /*printf("Log10 %f => %f    0x%Lxn", x, log10(x), *((int64_t*)&x));*/
  1465.     return log10(x);
  1466. }
  1467. static double expcos(double x)
  1468. {
  1469.     /*printf("Cos %f => %f  0x%Lxn", x, cos(x), *((int64_t*)&x));*/
  1470.     return cos(x);
  1471. }
  1472. /* doens't work */
  1473. static long exp_ftol_wrong(double x)
  1474. {
  1475.     return (long) x;
  1476. }
  1477. #else
  1478. static void explog10(void)
  1479. {
  1480.     __asm__ __volatile__
  1481. (
  1482.  "fldl 8(%esp) nt"
  1483.  "fldln2 nt"
  1484.  "fxch %st(1) nt"
  1485.  "fyl2x nt"
  1486. );
  1487. }
  1488. static void expcos(void)
  1489. {
  1490.     __asm__ __volatile__
  1491. (
  1492.  "fldl 8(%esp) nt"
  1493.  "fcos nt"
  1494. );
  1495. }
  1496. #endif
  1497. // this seem to be the only how to make this function working properly
  1498. // ok - I've spent tremendous amount of time (many many many hours
  1499. // of debuging fixing & testing - it's almost unimaginable - kabi
  1500. // _ftol - operated on the float value which is already on the FPU stack
  1501. static void exp_ftol(void)
  1502. {
  1503.     __asm__ __volatile__
  1504. (
  1505.  "sub $12, %esp nt"
  1506.  "fstcw   -2(%ebp) nt"
  1507.  "wait nt"
  1508.  "movw   -2(%ebp), %ax nt"
  1509.  "orb  $0x0C, %ah nt"
  1510.  "movw    %ax, -4(%ebp) nt"
  1511.  "fldcw   -4(%ebp) nt"
  1512.  "fistpl -12(%ebp) nt"
  1513.  "fldcw   -2(%ebp) nt"
  1514.  "movl  -12(%ebp), %eax nt"
  1515.  //Note: gcc 3.03 does not do the following op if it
  1516.  //      knows that ebp=esp
  1517.  "movl %ebp, %esp       nt"
  1518. );
  1519. }
  1520. #define FPU_DOUBLES(var1,var2) double var1,var2; 
  1521.   __asm__ __volatile__( "fstpl %0;fwait" : "=m" (var2) : ); 
  1522.   __asm__ __volatile__( "fstpl %0;fwait" : "=m" (var1) : )
  1523. static double exp_CIpow(void)
  1524. {
  1525.     FPU_DOUBLES(x,y);
  1526.     dbgprintf("_CIpow(%lf, %lf)n", x, y);
  1527.     return pow(x, y);
  1528. }
  1529. static double exppow(double x, double y)
  1530. {
  1531.     /*printf("Pow %f  %f    0x%Lx  0x%Lx  => %fn", x, y, *((int64_t*)&x), *((int64_t*)&y), pow(x, y));*/
  1532.     return pow(x, y);
  1533. }
  1534. static double expldexp(double x, int expo)
  1535. {
  1536.     /*printf("Cos %f => %f  0x%Lxn", x, cos(x), *((int64_t*)&x));*/
  1537.     return ldexp(x, expo);
  1538. }
  1539. static double expfrexp(double x, int* expo)
  1540. {
  1541.     /*printf("Cos %f => %f  0x%Lxn", x, cos(x), *((int64_t*)&x));*/
  1542.     return frexp(x, expo);
  1543. }
  1544. static int exp_stricmp(const char* s1, const char* s2)
  1545. {
  1546.     return strcasecmp(s1, s2);
  1547. }
  1548. /* from declaration taken from Wine sources - this fountion seems to be
  1549.  * undocumented in any M$ doc */
  1550. static int exp_setjmp3(void* jmpbuf, int x)
  1551. {
  1552.     //dbgprintf("!!!!UNIMPLEMENTED: setjmp3(%p, %d) => 0n", jmpbuf, x);
  1553.     //return 0;
  1554.     __asm__ __volatile__
  1555. (
  1556.  //"mov 4(%%esp), %%edx nt"
  1557.  "mov (%%esp), %%eax   nt"
  1558.  "mov %%eax, (%%edx) nt" // store ebp
  1559.  //"mov %%ebp, (%%edx) nt"
  1560.  "mov %%ebx, 4(%%edx) nt"
  1561.  "mov %%edi, 8(%%edx) nt"
  1562.  "mov %%esi, 12(%%edx) nt"
  1563.  "mov %%esp, 16(%%edx) nt"
  1564.  "mov 4(%%esp), %%eax nt"
  1565.  "mov %%eax, 20(%%edx) nt"
  1566.  "movl $0x56433230, 32(%%edx) nt" // VC20 ??
  1567.  "movl $0, 36(%%edx) nt"
  1568.  : // output
  1569.  : "d"(jmpbuf) // input
  1570.  : "eax"
  1571. );
  1572. #if 1
  1573.     __asm__ __volatile__
  1574. (
  1575.  "mov %%fs:0, %%eax nt" // unsure
  1576.  "mov %%eax, 24(%%edx) nt"
  1577.  "cmp $0xffffffff, %%eax nt"
  1578.  "jnz l1                nt"
  1579.  "mov %%eax, 28(%%edx) nt"
  1580.  "l1:                   nt"
  1581.  :
  1582.  :
  1583.  : "eax"
  1584. );
  1585. #endif
  1586. return 0;
  1587. }
  1588. static DWORD WINAPI expGetCurrentProcessId(void)
  1589. {
  1590.     dbgprintf("GetCurrentProcessId(void) => %dn", getpid());
  1591.     return getpid(); //(DWORD)NtCurrentTeb()->pid;
  1592. }
  1593. typedef struct {
  1594.     UINT wPeriodMin;
  1595.     UINT wPeriodMax;
  1596. } TIMECAPS, *LPTIMECAPS;
  1597. static MMRESULT WINAPI exptimeGetDevCaps(LPTIMECAPS lpCaps, UINT wSize)
  1598. {
  1599.     dbgprintf("timeGetDevCaps(%p, %u) !n", lpCaps, wSize);
  1600.     lpCaps->wPeriodMin = 1;
  1601.     lpCaps->wPeriodMax = 65535;
  1602.     return 0;
  1603. }
  1604. static MMRESULT WINAPI exptimeBeginPeriod(UINT wPeriod)
  1605. {
  1606.     dbgprintf("timeBeginPeriod(%u) !n", wPeriod);
  1607.     if (wPeriod < 1 || wPeriod > 65535) return 96+1; //TIMERR_NOCANDO;
  1608.     return 0;
  1609. }
  1610. #ifdef QTX
  1611. static MMRESULT WINAPI exptimeEndPeriod(UINT wPeriod)
  1612. {
  1613.     dbgprintf("timeEndPeriod(%u) !n", wPeriod);
  1614.     if (wPeriod < 1 || wPeriod > 65535) return 96+1; //TIMERR_NOCANDO;
  1615.     return 0;
  1616. }
  1617. #endif
  1618. static void WINAPI expGlobalMemoryStatus(
  1619.             LPMEMORYSTATUS lpmem
  1620. ) {
  1621.     static MEMORYSTATUS cached_memstatus;
  1622.     static int cache_lastchecked = 0;
  1623.     SYSTEM_INFO si;
  1624.     FILE *f;
  1625.     if (time(NULL)==cache_lastchecked) {
  1626. memcpy(lpmem,&cached_memstatus,sizeof(MEMORYSTATUS));
  1627. return;
  1628.     }
  1629. #if 1
  1630.     f = fopen( "/proc/meminfo", "r" );
  1631.     if (f)
  1632.     {
  1633.         char buffer[256];
  1634.         int total, used, free, shared, buffers, cached;
  1635.         lpmem->dwLength = sizeof(MEMORYSTATUS);
  1636.         lpmem->dwTotalPhys = lpmem->dwAvailPhys = 0;
  1637.         lpmem->dwTotalPageFile = lpmem->dwAvailPageFile = 0;
  1638.         while (fgets( buffer, sizeof(buffer), f ))
  1639.         {
  1640.     /* old style /proc/meminfo ... */
  1641.             if (sscanf( buffer, "Mem: %d %d %d %d %d %d", &total, &used, &free, &shared, &buffers, &cached ))
  1642.             {
  1643.                 lpmem->dwTotalPhys += total;
  1644.                 lpmem->dwAvailPhys += free + buffers + cached;
  1645.             }
  1646.             if (sscanf( buffer, "Swap: %d %d %d", &total, &used, &free ))
  1647.             {
  1648.                 lpmem->dwTotalPageFile += total;
  1649.                 lpmem->dwAvailPageFile += free;
  1650.             }
  1651.     /* new style /proc/meminfo ... */
  1652.     if (sscanf(buffer, "MemTotal: %d", &total))
  1653.      lpmem->dwTotalPhys = total*1024;
  1654.     if (sscanf(buffer, "MemFree: %d", &free))
  1655.      lpmem->dwAvailPhys = free*1024;
  1656.     if (sscanf(buffer, "SwapTotal: %d", &total))
  1657.         lpmem->dwTotalPageFile = total*1024;
  1658.     if (sscanf(buffer, "SwapFree: %d", &free))
  1659.         lpmem->dwAvailPageFile = free*1024;
  1660.     if (sscanf(buffer, "Buffers: %d", &buffers))
  1661.         lpmem->dwAvailPhys += buffers*1024;
  1662.     if (sscanf(buffer, "Cached: %d", &cached))
  1663.         lpmem->dwAvailPhys += cached*1024;
  1664.         }
  1665.         fclose( f );
  1666.         if (lpmem->dwTotalPhys)
  1667.         {
  1668.             DWORD TotalPhysical = lpmem->dwTotalPhys+lpmem->dwTotalPageFile;
  1669.             DWORD AvailPhysical = lpmem->dwAvailPhys+lpmem->dwAvailPageFile;
  1670.             lpmem->dwMemoryLoad = (TotalPhysical-AvailPhysical)
  1671.                                       / (TotalPhysical / 100);
  1672.         }
  1673.     } else
  1674. #endif
  1675.     {
  1676. /* FIXME: should do something for other systems */
  1677. lpmem->dwMemoryLoad    = 0;
  1678. lpmem->dwTotalPhys     = 16*1024*1024;
  1679. lpmem->dwAvailPhys     = 16*1024*1024;
  1680. lpmem->dwTotalPageFile = 16*1024*1024;
  1681. lpmem->dwAvailPageFile = 16*1024*1024;
  1682.     }
  1683.     expGetSystemInfo(&si);
  1684.     lpmem->dwTotalVirtual  = si.lpMaximumApplicationAddress-si.lpMinimumApplicationAddress;
  1685.     /* FIXME: we should track down all the already allocated VM pages and substract them, for now arbitrarily remove 64KB so that it matches NT */
  1686.     lpmem->dwAvailVirtual  = lpmem->dwTotalVirtual-64*1024;
  1687.     memcpy(&cached_memstatus,lpmem,sizeof(MEMORYSTATUS));
  1688.     cache_lastchecked = time(NULL);
  1689.     /* it appears some memory display programs want to divide by these values */
  1690.     if(lpmem->dwTotalPageFile==0)
  1691.         lpmem->dwTotalPageFile++;
  1692.     if(lpmem->dwAvailPageFile==0)
  1693.         lpmem->dwAvailPageFile++;
  1694. }
  1695. /**********************************************************************
  1696.  * SetThreadPriority [KERNEL32.@]  Sets priority for thread.
  1697.  *
  1698.  * RETURNS
  1699.  *    Success: TRUE
  1700.  *    Failure: FALSE
  1701.  */
  1702. static WIN_BOOL WINAPI expSetThreadPriority(
  1703.     HANDLE hthread, /* [in] Handle to thread */
  1704.     INT priority)   /* [in] Thread priority level */
  1705. {
  1706.     dbgprintf("SetThreadPriority(%p,%d)n",hthread,priority);
  1707.     return TRUE;
  1708. }
  1709. static void WINAPI expExitProcess( DWORD status )
  1710. {
  1711.     printf("EXIT - code %ldn",status);
  1712.     exit(status);
  1713. }
  1714. static INT WINAPI expMessageBoxA(HWND hWnd, LPCSTR text, LPCSTR title, UINT type){
  1715.     printf("MSGBOX '%s' '%s' (%d)n",text,title,type);
  1716. #ifdef QTX
  1717.     if (type == MB_ICONHAND && !strlen(text) && !strlen(title))
  1718. return IDIGNORE;
  1719. #endif
  1720.     return IDOK;
  1721. }
  1722. /* these are needed for mss1 */
  1723. /* defined in stubs.s */
  1724. void exp_EH_prolog(void);
  1725. #include <netinet/in.h>
  1726. static WINAPI inline unsigned long int exphtonl(unsigned long int hostlong)
  1727. {
  1728. //    dbgprintf("htonl(%x) => %xn", hostlong, htonl(hostlong));
  1729.     return htonl(hostlong);
  1730. }
  1731. static WINAPI inline unsigned long int expntohl(unsigned long int netlong)
  1732. {
  1733. //    dbgprintf("ntohl(%x) => %xn", netlong, ntohl(netlong));
  1734.     return ntohl(netlong);
  1735. }
  1736. static void WINAPI expVariantInit(void* p)
  1737. {
  1738.     printf("InitCommonControls called!n");
  1739.     return;
  1740. }
  1741. static int WINAPI expRegisterClassA(const void/*WNDCLASSA*/ *wc)
  1742. {
  1743.     dbgprintf("RegisterClassA(%p) => random idn", wc);
  1744.     return time(NULL); /* be precise ! */
  1745. }
  1746. static int WINAPI expUnregisterClassA(const char *className, HINSTANCE hInstance)
  1747. {
  1748.     dbgprintf("UnregisterClassA(%s, %p) => 0n", className, hInstance);
  1749.     return 0;
  1750. }
  1751. #ifdef QTX
  1752. /* should be fixed bcs it's not fully strlen equivalent */
  1753. static int expSysStringByteLen(void *str)
  1754. {
  1755.     dbgprintf("SysStringByteLen(%p) => %dn", str, strlen(str));
  1756.     return strlen(str);
  1757. }
  1758. static int expDirectDrawCreate(void)
  1759. {
  1760.     dbgprintf("DirectDrawCreate(...) => NULLn");
  1761.     return 0;
  1762. }
  1763. #if 1
  1764. typedef struct tagPALETTEENTRY { 
  1765.     BYTE peRed; 
  1766.     BYTE peGreen; 
  1767.     BYTE peBlue; 
  1768.     BYTE peFlags; 
  1769. } PALETTEENTRY; 
  1770. /* reversed the first 2 entries */
  1771. typedef struct tagLOGPALETTE { 
  1772.     WORD         palNumEntries; 
  1773.     WORD         palVersion; 
  1774.     PALETTEENTRY palPalEntry[1]; 
  1775. } LOGPALETTE; 
  1776. static HPALETTE WINAPI expCreatePalette(CONST LOGPALETTE *lpgpl)
  1777. {
  1778.     HPALETTE test;
  1779.     int i;
  1780.     
  1781.     dbgprintf("CreatePalette(%x) => NULLn", lpgpl);
  1782.     i = sizeof(LOGPALETTE)+((lpgpl->palNumEntries-1)*sizeof(PALETTEENTRY));
  1783.     test = (HPALETTE)malloc(i);
  1784.     memcpy((void *)test, lpgpl, i);
  1785.     return test;
  1786. }
  1787. #else
  1788. static int expCreatePalette(void)
  1789. {
  1790.     dbgprintf("CreatePalette(...) => NULLn");
  1791.     return NULL;
  1792. }
  1793. #endif
  1794. static int WINAPI expGetClientRect(HWND win, RECT *r)
  1795. {
  1796.     dbgprintf("GetClientRect(0x%x, 0x%x) => 1n", win, r);
  1797.     r->right = PSEUDO_SCREEN_WIDTH;
  1798.     r->left = 0;
  1799.     r->bottom = PSEUDO_SCREEN_HEIGHT;
  1800.     r->top = 0;
  1801.     return 1;
  1802. }
  1803. #if 0
  1804. typedef struct tagPOINT { 
  1805.     LONG x; 
  1806.     LONG y; 
  1807. } POINT, *PPOINT; 
  1808. #endif
  1809. static int WINAPI expClientToScreen(HWND win, POINT *p)
  1810. {
  1811.     dbgprintf("ClientToScreen(0x%x, 0x%x = %d,%d) => 1n", win, p, p->x, p->y);
  1812.     p->x = 0;
  1813.     p->y = 0;
  1814.     return 1;
  1815. }
  1816. #endif
  1817. /* for m3jpeg */
  1818. static int WINAPI expSetThreadIdealProcessor(HANDLE thread, int proc)
  1819. {
  1820.     dbgprintf("SetThreadIdealProcessor(0x%x, %x) => 0n", thread, proc);
  1821.     return 0;
  1822. }
  1823. static int WINAPI expMessageBeep(int type)
  1824. {
  1825.     dbgprintf("MessageBeep(%d) => 1n", type);
  1826.     return 1;
  1827. }
  1828. static int WINAPI expDialogBoxParamA(void *inst, const char *name,
  1829.     HWND parent, void *dialog_func, void *init_param)
  1830. {
  1831.     dbgprintf("DialogBoxParamA(0x%x, 0x%x = %s, 0x%x, 0x%x, 0x%x) => 0x42424242n",
  1832. inst, name, name, parent, dialog_func, init_param);
  1833.     return 0x42424242;
  1834. }
  1835. /* needed by imagepower mjpeg2k */
  1836. static void *exprealloc(void *ptr, size_t size)
  1837. {
  1838.     dbgprintf("realloc(0x%x, %x)n", ptr, size);
  1839.     if (!ptr)
  1840. return my_mreq(size,0);
  1841.     else
  1842. return my_realloc(ptr, size);        
  1843. }
  1844. /* Fake GetOpenFileNameA from comdlg32.dll for ViVD codec */
  1845. static WIN_BOOL WINAPI expGetOpenFileNameA(/*LPOPENFILENAMEA*/ void* lpfn)
  1846. {
  1847.     return 1;
  1848. }
  1849. static double expfloor(double x)
  1850. {
  1851.     dbgprintf("floor(%lf)n", x);
  1852.     return floor(x);
  1853. }
  1854. #define FPU_DOUBLE(var) double var; 
  1855.   __asm__ __volatile__( "fstpl %0;fwait" : "=m" (var) : )
  1856. static double exp_CIcos(void)
  1857. {
  1858.     FPU_DOUBLE(x);
  1859.     dbgprintf("_CIcos(%lf)n", x);
  1860.     return cos(x);
  1861. }
  1862. static double exp_CIsin(void)
  1863. {
  1864.     FPU_DOUBLE(x);
  1865.     dbgprintf("_CIsin(%lf)n", x);
  1866.     return sin(x);
  1867. }
  1868. struct exports
  1869. {
  1870.     char name[64];
  1871.     int id;
  1872.     void* func;
  1873. };
  1874. struct libs
  1875. {
  1876.     char name[64];
  1877.     int length;
  1878.     struct exports* exps;
  1879. };
  1880. #define FF(X,Y) 
  1881.     {#X, Y, (void*)exp##X},
  1882. struct exports exp_kernel32[]=
  1883. {
  1884.     FF(GetVolumeInformationA,-1)
  1885.     FF(GetDriveTypeA,-1)
  1886.     FF(GetLogicalDriveStringsA,-1)
  1887.     FF(IsBadWritePtr, 357)
  1888.     FF(IsBadReadPtr, 354)
  1889.     FF(IsBadStringPtrW, -1)
  1890.     FF(IsBadStringPtrA, -1)
  1891.     FF(DisableThreadLibraryCalls, -1)
  1892.     FF(CreateThread, -1)
  1893.     FF(CreateEventA, -1)
  1894.     FF(SetEvent, -1)
  1895.     FF(ResetEvent, -1)
  1896.     FF(WaitForSingleObject, -1)
  1897. #ifdef QTX
  1898.     FF(WaitForMultipleObjects, -1)
  1899.     FF(ExitThread, -1)
  1900.     FF(CreateMutexA,-1)
  1901.     FF(ReleaseMutex,-1)
  1902. #endif
  1903.     FF(GetSystemInfo, -1)
  1904.     FF(GetVersion, 332)
  1905.     FF(HeapCreate, 461)
  1906.     FF(HeapAlloc, -1)
  1907.     FF(HeapDestroy, -1)
  1908.     FF(HeapFree, -1)
  1909.     FF(HeapSize, -1)
  1910.     FF(HeapReAlloc,-1)
  1911.     FF(GetProcessHeap, -1)
  1912.     FF(VirtualAlloc, -1)
  1913.     FF(VirtualFree, -1)
  1914.     FF(InitializeCriticalSection, -1)
  1915.     FF(EnterCriticalSection, -1)
  1916.     FF(LeaveCriticalSection, -1)
  1917.     FF(DeleteCriticalSection, -1)
  1918.     FF(TlsAlloc, -1)
  1919.     FF(TlsFree, -1)
  1920.     FF(TlsGetValue, -1)
  1921.     FF(TlsSetValue, -1)
  1922.     FF(GetCurrentThreadId, -1)
  1923.     FF(GetCurrentProcess, -1)
  1924.     FF(LocalAlloc, -1)
  1925.     FF(LocalReAlloc,-1)
  1926.     FF(LocalLock, -1)
  1927.     FF(GlobalAlloc, -1)
  1928.     FF(GlobalReAlloc, -1)
  1929.     FF(GlobalLock, -1)
  1930.     FF(GlobalSize, -1)
  1931.     FF(MultiByteToWideChar, 427)
  1932.     FF(WideCharToMultiByte, -1)
  1933.     FF(GetVersionExA, -1)
  1934.     FF(CreateSemaphoreA, -1)
  1935.     FF(QueryPerformanceCounter, -1)
  1936.     FF(QueryPerformanceFrequency, -1)
  1937.     FF(LocalHandle, -1)
  1938.     FF(LocalUnlock, -1)
  1939.     FF(LocalFree, -1)
  1940.     FF(GlobalHandle, -1)
  1941.     FF(GlobalUnlock, -1)
  1942.     FF(GlobalFree, -1)
  1943.     FF(LoadResource, -1)
  1944.     FF(ReleaseSemaphore, -1)
  1945.     FF(FindResourceA, -1)
  1946.     FF(LockResource, -1)
  1947.     FF(FreeResource, -1)
  1948.     FF(SizeofResource, -1)
  1949.     FF(CloseHandle, -1)
  1950.     FF(GetCommandLineA, -1)
  1951.     FF(GetEnvironmentStringsW, -1)
  1952.     FF(FreeEnvironmentStringsW, -1)
  1953.     FF(FreeEnvironmentStringsA, -1)
  1954.     FF(GetEnvironmentStrings, -1)
  1955.     FF(GetStartupInfoA, -1)
  1956.     FF(GetStdHandle, -1)
  1957.     FF(GetFileType, -1)
  1958. #ifdef QTX
  1959.     FF(GetFileAttributesA, -1)
  1960. #endif
  1961.     FF(SetHandleCount, -1)
  1962.     FF(GetACP, -1)
  1963.     FF(GetModuleFileNameA, -1)
  1964.     FF(SetUnhandledExceptionFilter, -1)
  1965.     FF(LoadLibraryA, -1)
  1966.     FF(GetProcAddress, -1)
  1967.     FF(FreeLibrary, -1)
  1968.     FF(CreateFileMappingA, -1)
  1969.     FF(OpenFileMappingA, -1)
  1970.     FF(MapViewOfFile, -1)
  1971.     FF(UnmapViewOfFile, -1)
  1972.     FF(Sleep, -1)
  1973.     FF(GetModuleHandleA, -1)
  1974.     FF(GetProfileIntA, -1)
  1975.     FF(GetPrivateProfileIntA, -1)
  1976.     FF(GetPrivateProfileStringA, -1)
  1977.     FF(WritePrivateProfileStringA, -1)
  1978.     FF(GetLastError, -1)
  1979.     FF(SetLastError, -1)
  1980.     FF(InterlockedIncrement, -1)
  1981.     FF(InterlockedDecrement, -1)
  1982.     FF(GetTimeZoneInformation, -1)
  1983.     FF(OutputDebugStringA, -1)
  1984.     FF(GetLocalTime, -1)
  1985.     FF(GetSystemTime, -1)
  1986.     FF(GetSystemTimeAsFileTime, -1)
  1987.     FF(GetEnvironmentVariableA, -1)
  1988.     FF(SetEnvironmentVariableA, -1)
  1989.     FF(RtlZeroMemory,-1)
  1990.     FF(RtlMoveMemory,-1)
  1991.     FF(RtlFillMemory,-1)
  1992.     FF(GetTempPathA,-1)
  1993.     FF(FindFirstFileA,-1)
  1994.     FF(FindNextFileA,-1)
  1995.     FF(FindClose,-1)
  1996.     FF(FileTimeToLocalFileTime,-1)
  1997.     FF(DeleteFileA,-1)
  1998.     FF(ReadFile,-1)
  1999.     FF(WriteFile,-1)
  2000.     FF(SetFilePointer,-1)
  2001.     FF(GetTempFileNameA,-1)
  2002.     FF(CreateFileA,-1)
  2003.     FF(GetSystemDirectoryA,-1)
  2004.     FF(GetWindowsDirectoryA,-1)
  2005. #ifdef QTX
  2006.     FF(GetCurrentDirectoryA,-1)
  2007.     FF(SetCurrentDirectoryA,-1)
  2008.     FF(CreateDirectoryA,-1)
  2009. #endif
  2010.     FF(GetShortPathNameA,-1)
  2011.     FF(GetFullPathNameA,-1)
  2012.     FF(SetErrorMode, -1)
  2013.     FF(IsProcessorFeaturePresent, -1)
  2014.     FF(GetProcessAffinityMask, -1)
  2015.     FF(InterlockedExchange, -1)
  2016.     FF(InterlockedCompareExchange, -1)
  2017.     FF(MulDiv, -1)
  2018.     FF(lstrcmpiA, -1)
  2019.     FF(lstrlenA, -1)
  2020.     FF(lstrcpyA, -1)
  2021.     FF(lstrcatA, -1)
  2022.     FF(lstrcpynA,-1)
  2023.     FF(GetProcessVersion,-1)
  2024.     FF(GetCurrentThread,-1)
  2025.     FF(GetOEMCP,-1)
  2026.     FF(GetCPInfo,-1)
  2027.     FF(DuplicateHandle,-1)
  2028.     FF(GetTickCount, -1)
  2029.     FF(SetThreadAffinityMask,-1)
  2030.     FF(GetCurrentProcessId,-1)
  2031.     FF(GlobalMemoryStatus,-1)
  2032.     FF(SetThreadPriority,-1)
  2033.     FF(ExitProcess,-1)
  2034.     {"LoadLibraryExA", -1, (void*)&LoadLibraryExA},
  2035.     FF(SetThreadIdealProcessor,-1)
  2036. };
  2037. struct exports exp_msvcrt[]={
  2038.     FF(malloc, -1)
  2039.     FF(_initterm, -1)
  2040.     FF(__dllonexit, -1)
  2041.     FF(_snprintf,-1)
  2042.     FF(free, -1)
  2043.     {"??3@YAXPAX@Z", -1, expdelete},
  2044.     {"??2@YAPAXI@Z", -1, expnew},
  2045.     {"_adjust_fdiv", -1, (void*)&_adjust_fdiv},
  2046.     FF(strrchr, -1)
  2047.     FF(strchr, -1)
  2048.     FF(strlen, -1)
  2049.     FF(strcpy, -1)
  2050.     FF(strncpy, -1)
  2051.     FF(wcscpy, -1)
  2052.     FF(strcmp, -1)
  2053.     FF(strncmp, -1)
  2054.     FF(strcat, -1)
  2055.     FF(_stricmp,-1)
  2056.     FF(_strdup,-1)
  2057.     FF(_setjmp3,-1)
  2058.     FF(isalnum, -1)
  2059.     FF(isspace, -1)
  2060.     FF(isalpha, -1)
  2061.     FF(isdigit, -1)
  2062.     FF(memmove, -1)
  2063.     FF(memcmp, -1)
  2064.     FF(memset, -1)
  2065.     FF(memcpy, -1)
  2066.     FF(time, -1)
  2067.     FF(rand, -1)
  2068.     FF(srand, -1)
  2069.     FF(log10, -1)
  2070.     FF(pow, -1)
  2071.     FF(cos, -1)
  2072.     FF(_ftol,-1)
  2073.     FF(_CIpow,-1)
  2074.     FF(_CIcos,-1)
  2075.     FF(_CIsin,-1)
  2076.     FF(ldexp,-1)
  2077.     FF(frexp,-1)
  2078.     FF(sprintf,-1)
  2079.     FF(sscanf,-1)
  2080.     FF(fopen,-1)
  2081.     FF(fprintf,-1)
  2082.     FF(printf,-1)
  2083.     FF(getenv,-1)
  2084.     FF(floor,-1)
  2085. /* needed by frapsvid.dll */
  2086.     {"strstr",-1,(char *)&strstr},
  2087.     {"qsort",-1,(void *)&qsort},
  2088. #ifdef MPLAYER
  2089.     FF(_EH_prolog,-1)
  2090. #endif
  2091.     FF(calloc,-1)
  2092.     {"ceil",-1,(void*)&ceil},
  2093. /* needed by imagepower mjpeg2k */
  2094.     {"clock",-1,(void*)&clock},
  2095.     {"memchr",-1,(void*)&memchr},
  2096.     {"vfprintf",-1,(void*)&vfprintf},
  2097. //    {"realloc",-1,(void*)&realloc},
  2098.     FF(realloc,-1)
  2099.     {"puts",-1,(void*)&puts}
  2100. };
  2101. struct exports exp_winmm[]={
  2102.     FF(GetDriverModuleHandle, -1)
  2103.     FF(timeGetTime, -1)
  2104.     FF(DefDriverProc, -1)
  2105.     FF(OpenDriverA, -1)
  2106.     FF(OpenDriver, -1)
  2107.     FF(timeGetDevCaps, -1)
  2108.     FF(timeBeginPeriod, -1)
  2109. #ifdef QTX
  2110.     FF(timeEndPeriod, -1)
  2111.     FF(waveOutGetNumDevs, -1)
  2112. #endif
  2113. };
  2114. struct exports exp_user32[]={
  2115.     FF(LoadIconA,-1)
  2116.     FF(LoadStringA, -1)
  2117.     FF(wsprintfA, -1)
  2118.     FF(GetDC, -1)
  2119.     FF(GetDesktopWindow, -1)
  2120.     FF(ReleaseDC, -1)
  2121.     FF(IsRectEmpty, -1)
  2122.     FF(LoadCursorA,-1)
  2123.     FF(SetCursor,-1)
  2124.     FF(GetCursorPos,-1)
  2125. #ifdef QTX
  2126.     FF(ShowCursor,-1)
  2127. #endif
  2128.     FF(RegisterWindowMessageA,-1)
  2129.     FF(GetSystemMetrics,-1)
  2130.     FF(GetSysColor,-1)
  2131.     FF(GetSysColorBrush,-1)
  2132.     FF(GetWindowDC, -1)
  2133.     FF(DrawTextA, -1)
  2134.     FF(MessageBoxA, -1)
  2135.     FF(RegisterClassA, -1)
  2136.     FF(UnregisterClassA, -1)
  2137. #ifdef QTX
  2138.     FF(GetWindowRect, -1)
  2139.     FF(MonitorFromWindow, -1)
  2140.     FF(MonitorFromRect, -1)
  2141.     FF(MonitorFromPoint, -1)
  2142.     FF(EnumDisplayMonitors, -1)
  2143.     FF(GetMonitorInfoA, -1)
  2144.     FF(EnumDisplayDevicesA, -1)
  2145.     FF(GetClientRect, -1)
  2146.     FF(ClientToScreen, -1)
  2147.     FF(IsWindowVisible, -1)
  2148.     FF(GetActiveWindow, -1)
  2149.     FF(GetClassNameA, -1)
  2150.     FF(GetClassInfoA, -1)
  2151.     FF(GetWindowLongA, -1)
  2152.     FF(EnumWindows, -1)
  2153.     FF(GetWindowThreadProcessId, -1)
  2154.     FF(CreateWindowExA, -1)
  2155. #endif
  2156.     FF(MessageBeep, -1)
  2157.     FF(DialogBoxParamA, -1)
  2158. };
  2159. struct exports exp_advapi32[]={
  2160.     FF(RegCloseKey, -1)
  2161.     FF(RegCreateKeyA, -1)
  2162.     FF(RegCreateKeyExA, -1)
  2163.     FF(RegEnumKeyExA, -1)
  2164.     FF(RegEnumValueA, -1)
  2165.     FF(RegOpenKeyA, -1)
  2166.     FF(RegOpenKeyExA, -1)
  2167.     FF(RegQueryValueExA, -1)
  2168.     FF(RegSetValueExA, -1)
  2169.     FF(RegQueryInfoKeyA, -1)
  2170. };
  2171. struct exports exp_gdi32[]={
  2172.     FF(CreateCompatibleDC, -1)
  2173.     FF(CreateFontA, -1)
  2174.     FF(DeleteDC, -1)
  2175.     FF(DeleteObject, -1)
  2176.     FF(GetDeviceCaps, -1)
  2177.     FF(GetSystemPaletteEntries, -1)
  2178. #ifdef QTX
  2179.     FF(CreatePalette, -1)
  2180.     FF(GetObjectA, -1)
  2181.     FF(CreateRectRgn, -1)
  2182. #endif
  2183. };
  2184. struct exports exp_version[]={
  2185.     FF(GetFileVersionInfoSizeA, -1)
  2186. };
  2187. struct exports exp_ole32[]={
  2188.     FF(CoCreateFreeThreadedMarshaler,-1)
  2189.     FF(CoCreateInstance, -1)
  2190.     FF(CoInitialize, -1)
  2191.     FF(CoTaskMemAlloc, -1)
  2192.     FF(CoTaskMemFree, -1)
  2193.     FF(StringFromGUID2, -1)
  2194. };
  2195. // do we really need crtdll ???
  2196. // msvcrt is the correct place probably...
  2197. struct exports exp_crtdll[]={
  2198.     FF(memcpy, -1)
  2199.     FF(wcscpy, -1)
  2200. };
  2201. struct exports exp_comctl32[]={
  2202.     FF(StringFromGUID2, -1)
  2203.     FF(InitCommonControls, 17)
  2204. #ifdef QTX
  2205.     FF(CreateUpDownControl, 16)
  2206. #endif
  2207. };
  2208. struct exports exp_wsock32[]={
  2209.     FF(htonl,8)
  2210.     FF(ntohl,14)
  2211. };
  2212. struct exports exp_msdmo[]={
  2213.     FF(memcpy, -1) // just test
  2214.     FF(MoCopyMediaType, -1)
  2215.     FF(MoCreateMediaType, -1)
  2216.     FF(MoDeleteMediaType, -1)
  2217.     FF(MoDuplicateMediaType, -1)
  2218.     FF(MoFreeMediaType, -1)
  2219.     FF(MoInitMediaType, -1)
  2220. };
  2221. struct exports exp_oleaut32[]={
  2222.     FF(VariantInit, 8)
  2223. #ifdef QTX
  2224.     FF(SysStringByteLen, 149)
  2225. #endif
  2226. };
  2227. /*  realplayer8:
  2228. DLL Name: PNCRT.dll
  2229. vma:  Hint/Ord Member-Name
  2230. 22ff4   615  free
  2231. 2302e   250  _ftol
  2232. 22fea   666  malloc
  2233. 2303e   609  fprintf
  2234. 2305e   167  _adjust_fdiv
  2235. 23052   280  _initterm
  2236. 22ffc   176  _beginthreadex
  2237. 23036   284  _iob
  2238. 2300e    85  __CxxFrameHandler
  2239. 23022   411  _purecall
  2240. */
  2241. #ifdef REALPLAYER
  2242. struct exports exp_pncrt[]={
  2243.     FF(malloc, -1) // just test
  2244.     FF(free, -1) // just test
  2245.     FF(fprintf, -1) // just test
  2246.     {"_adjust_fdiv", -1, (void*)&_adjust_fdiv},
  2247.     FF(_ftol,-1)
  2248.     FF(_initterm, -1)
  2249.     {"??3@YAXPAX@Z", -1, expdelete},
  2250.     {"??2@YAPAXI@Z", -1, expnew},
  2251.     FF(__dllonexit, -1)
  2252.     FF(strncpy, -1)
  2253.     FF(_CIpow,-1)
  2254.     FF(calloc,-1)
  2255.     FF(memmove, -1)
  2256. };
  2257. #endif
  2258. #ifdef QTX
  2259. struct exports exp_ddraw[]={
  2260.     FF(DirectDrawCreate, -1)
  2261. };
  2262. #endif
  2263. struct exports exp_comdlg32[]={
  2264.     FF(GetOpenFileNameA, -1)
  2265. };
  2266. #define LL(X) 
  2267.     {#X".dll", sizeof(exp_##X)/sizeof(struct exports), exp_##X},
  2268. struct libs libraries[]={
  2269.     LL(kernel32)
  2270.     LL(msvcrt)
  2271.     LL(winmm)
  2272.     LL(user32)
  2273.     LL(advapi32)
  2274.     LL(gdi32)
  2275.     LL(version)
  2276.     LL(ole32)
  2277.     LL(oleaut32)
  2278.     LL(crtdll)
  2279.     LL(comctl32)
  2280.     LL(wsock32)
  2281.     LL(msdmo)
  2282. #ifdef REALPLAYER
  2283.     LL(pncrt)
  2284. #endif
  2285. #ifdef QTX
  2286.     LL(ddraw)
  2287. #endif
  2288.     LL(comdlg32)
  2289. };
  2290. static void ext_stubs(void)
  2291. {
  2292.     // expects:
  2293.     //  ax  position index
  2294.     //  cx  address of printf function
  2295. #if 1
  2296.     __asm__ __volatile__
  2297. (
  2298.          "push %%edx nt"
  2299.  "movl $0xdeadbeef, %%eax nt"
  2300.  "movl $0xdeadbeef, %%edx nt"
  2301.  "shl $5, %%eax nt" // ax * 32
  2302.  "addl $0xdeadbeef, %%eax nt" // overwrite export_names
  2303.  "pushl %%eax nt"
  2304.  "pushl $0xdeadbeef    nt"                   // overwrite called_unk
  2305.  "call *%%edx nt"                   // printf (via dx)
  2306.  "addl $8, %%esp nt"
  2307.  "xorl %%eax, %%eax nt"
  2308.  "pop %%edx             nt"
  2309.  :
  2310.  :
  2311.  : "eax"
  2312. );
  2313. #else
  2314.     __asm__ __volatile__
  2315. (
  2316.          "push %%edx nt"
  2317.  "movl $0, %%eax nt"
  2318.  "movl $0, %%edx nt"
  2319.  "shl $5, %%eax nt" // ax * 32
  2320.  "addl %0, %%eax nt"
  2321.  "pushl %%eax nt"
  2322.  "pushl %1 nt"
  2323.  "call *%%edx nt"                   // printf (via dx)
  2324.  "addl $8, %%esp nt"
  2325.  "xorl %%eax, %%eax nt"
  2326.  "pop %%edx nt"
  2327.  ::"m"(*export_names), "m"(*called_unk)
  2328. : "memory", "edx", "eax"
  2329. );
  2330. #endif
  2331. }
  2332. //static void add_stub(int pos)
  2333. extern int unk_exp1;
  2334. static int pos=0;
  2335. static char extcode[20000];// place for 200 unresolved exports
  2336. static const char* called_unk = "Called unk_%sn";
  2337. static void* add_stub(void)
  2338. {
  2339.     // generated code in runtime!
  2340.     char* answ = (char*)extcode+pos*0x30;
  2341. #if 0
  2342.     memcpy(answ, &unk_exp1, 0x64);
  2343.     *(int*)(answ+9)=pos;
  2344.     *(int*)(answ+47)-=((int)answ-(int)&unk_exp1);
  2345. #endif
  2346.     memcpy(answ, ext_stubs, 0x2f); // 0x2c is current size
  2347.     //answ[4] = 0xb8; // movl $0, eax  (0xb8 0x00000000)
  2348.     *((int*) (answ + 5)) = pos;
  2349.     //answ[9] = 0xba; // movl $0, edx  (0xba 0x00000000)
  2350.     *((long*) (answ + 10)) = (long)printf;
  2351.     //answ[17] = 0x05; // addl $0, eax  (0x05 0x00000000)
  2352.     *((long*) (answ + 18)) = (long)export_names;
  2353.     //answ[23] = 0x68; // pushl $0  (0x68 0x00000000)
  2354.     *((long*) (answ + 24)) = (long)called_unk;
  2355.     pos++;
  2356.     return (void*)answ;
  2357. }
  2358. void* LookupExternal(const char* library, int ordinal)
  2359. {
  2360.     int i,j;
  2361.     if(library==0)
  2362.     {
  2363. printf("ERROR: library=0n");
  2364. return (void*)ext_unknown;
  2365.     }
  2366.     //    printf("%x %xn", &unk_exp1, &unk_exp2);
  2367.     dbgprintf("External func %s:%dn", library, ordinal);
  2368.     for(i=0; i<sizeof(libraries)/sizeof(struct libs); i++)
  2369.     {
  2370. if(strcasecmp(library, libraries[i].name))
  2371.     continue;
  2372. for(j=0; j<libraries[i].length; j++)
  2373. {
  2374.     if(ordinal!=libraries[i].exps[j].id)
  2375. continue;
  2376.     //printf("Hit: 0x%pn", libraries[i].exps[j].func);
  2377.     return libraries[i].exps[j].func;
  2378. }
  2379.     }
  2380. #ifndef LOADLIB_TRY_NATIVE
  2381.   /* hack for truespeech and vssh264*/
  2382.   if (!strcmp(library, "tsd32.dll") || !strcmp(library,"vssh264dec.dll") || !strcmp(library,"LCMW2.dll") || !strcmp(library,"VDODEC32.dll"))
  2383. #endif
  2384.     /* ok, this is a hack, and a big memory leak. should be fixed. - alex */
  2385.     {
  2386. int hand;
  2387. WINE_MODREF *wm;
  2388. void *func;
  2389. hand = LoadLibraryA(library);
  2390. if (!hand)
  2391.     goto no_dll;
  2392. wm = MODULE32_LookupHMODULE(hand);
  2393. if (!wm)
  2394. {
  2395.     FreeLibrary(hand);
  2396.     goto no_dll;
  2397. }
  2398. func = PE_FindExportedFunction(wm, (LPCSTR) ordinal, 0);
  2399. if (!func)
  2400. {
  2401.     printf("No such ordinal in external dlln");
  2402.     FreeLibrary((int)hand);
  2403.     goto no_dll;
  2404. }
  2405. printf("External dll loaded (offset: 0x%x, func: %p)n",
  2406.        hand, func);
  2407. return func;
  2408.     }
  2409. no_dll:
  2410.     if(pos>150)return 0;
  2411.     sprintf(export_names[pos], "%s:%d", library, ordinal);
  2412.     return add_stub();
  2413. }
  2414. void* LookupExternalByName(const char* library, const char* name)
  2415. {
  2416.     char* answ;
  2417.     int i,j;
  2418.     //   return (void*)ext_unknown;
  2419.     if(library==0)
  2420.     {
  2421. printf("ERROR: library=0n");
  2422. return (void*)ext_unknown;
  2423.     }
  2424.     if(name==0)
  2425.     {
  2426. printf("ERROR: name=0n");
  2427. return (void*)ext_unknown;
  2428.     }
  2429.     dbgprintf("External func %s:%sn", library, name);
  2430.     for(i=0; i<sizeof(libraries)/sizeof(struct libs); i++)
  2431.     {
  2432. if(strcasecmp(library, libraries[i].name))
  2433.     continue;
  2434. for(j=0; j<libraries[i].length; j++)
  2435. {
  2436.     if(strcmp(name, libraries[i].exps[j].name))
  2437. continue;
  2438.     //     printf("Hit: 0x%08Xn", libraries[i].exps[j].func);
  2439.     return libraries[i].exps[j].func;
  2440. }
  2441.     }
  2442. #ifndef LOADLIB_TRY_NATIVE
  2443.   /* hack for vss h264 */
  2444.   if (!strcmp(library,"vssh264core.dll"))
  2445. #endif
  2446.     /* ok, this is a hack, and a big memory leak. should be fixed. - alex */
  2447.     {
  2448. int hand;
  2449. WINE_MODREF *wm;
  2450. void *func;
  2451. hand = LoadLibraryA(library);
  2452. if (!hand)
  2453.     goto no_dll_byname;
  2454. wm = MODULE32_LookupHMODULE(hand);
  2455. if (!wm)
  2456. {
  2457.     FreeLibrary(hand);
  2458.     goto no_dll_byname;
  2459. }
  2460. func = PE_FindExportedFunction(wm, name, 0);
  2461. if (!func)
  2462. {
  2463.     printf("No such name in external dlln");
  2464.     FreeLibrary((int)hand);
  2465.     goto no_dll_byname;
  2466. }
  2467. printf("External dll loaded (offset: 0x%x, func: %p)n",
  2468.        hand, func);
  2469. return func;
  2470.     }
  2471. no_dll_byname:
  2472.     if(pos>150)return 0;// to many symbols
  2473.     strcpy(export_names[pos], name);
  2474.     return add_stub();
  2475. }
  2476. void my_garbagecollection(void)
  2477. {
  2478. #ifdef GARBAGE
  2479.     int unfree = 0, unfreecnt = 0;
  2480.     int max_fatal = 8;
  2481.     free_registry();
  2482.     while (last_alloc)
  2483.     {
  2484. alloc_header* mem = last_alloc + 1;
  2485. unfree += my_size(mem);
  2486. unfreecnt++;
  2487. if (my_release(mem) != 0)
  2488.     // avoid endless loop when memory is trashed
  2489.     if (--max_fatal < 0)
  2490. break;
  2491.     }
  2492.     dbgprintf("Total Unfree %d bytes cnt %d [%p,%d]n",unfree, unfreecnt, last_alloc, alccnt);
  2493. #endif
  2494.     g_tls = NULL;
  2495.     list = NULL;
  2496. }