config.c 96 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617
  1. /*
  2. * Configuration parameters shared between Wine server and clients
  3. *
  4. * Copyright 2002 Alexandre Julliard
  5. *
  6. * This library is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * This library is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with this library; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  19. */
  20. #include "config.h"
  21. #include "wine/port.h"
  22. #include <stdio.h>
  23. #include <stdarg.h>
  24. #include <stdlib.h>
  25. #include <string.h>
  26. #include <errno.h>
  27. #include <sys/stat.h>
  28. #ifdef HAVE_UNISTD_H
  29. # include <unistd.h>
  30. #endif
  31. #ifdef HAVE_PWD_H
  32. #include <pwd.h>
  33. #endif
  34. #ifdef __APPLE__
  35. #include <crt_externs.h>
  36. #include <spawn.h>
  37. #ifndef _POSIX_SPAWN_DISABLE_ASLR
  38. #define _POSIX_SPAWN_DISABLE_ASLR 0x0100
  39. #endif
  40. #endif
  41. #include "wine/library.h"
  42. static const char server_config_dir[] = "/.wine"; /* config dir relative to $HOME */
  43. static const char server_root_prefix[] = "/tmp/.wine"; /* prefix for server root dir */
  44. static const char server_dir_prefix[] = "/server-"; /* prefix for server dir */
  45. static char *bindir;
  46. static char *dlldir;
  47. static char *datadir;
  48. static char *config_dir;
  49. static char *server_dir;
  50. static char *build_dir;
  51. static char *user_name;
  52. static char *argv0_name;
  53. static char *wineserver64;
  54. #ifdef __GNUC__
  55. static void fatal_error( const char *err, ... ) __attribute__((noreturn,format(printf,1,2)));
  56. static void fatal_perror( const char *err, ... ) __attribute__((noreturn,format(printf,1,2)));
  57. #endif
  58. #if defined(__linux__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
  59. static const char exe_link[] = "/proc/self/exe";
  60. #elif defined (__FreeBSD__) || defined(__DragonFly__)
  61. static const char exe_link[] = "/proc/curproc/file";
  62. #else
  63. static const char exe_link[] = "";
  64. #endif
  65. /* die on a fatal error */
  66. static void fatal_error( const char *err, ... )
  67. {
  68. va_list args;
  69. va_start( args, err );
  70. fprintf( stderr, "wine: " );
  71. vfprintf( stderr, err, args );
  72. va_end( args );
  73. exit(1);
  74. }
  75. /* die on a fatal error */
  76. static void fatal_perror( const char *err, ... )
  77. {
  78. va_list args;
  79. va_start( args, err );
  80. fprintf( stderr, "wine: " );
  81. vfprintf( stderr, err, args );
  82. perror( " " );
  83. va_end( args );
  84. exit(1);
  85. }
  86. /* malloc wrapper */
  87. static void *xmalloc( size_t size )
  88. {
  89. void *res;
  90. if (!size) size = 1;
  91. if (!(res = malloc( size ))) fatal_error( "virtual memory exhausted\n");
  92. return res;
  93. }
  94. /* strdup wrapper */
  95. static char *xstrdup( const char *str )
  96. {
  97. size_t len = strlen(str) + 1;
  98. char *res = xmalloc( len );
  99. memcpy( res, str, len );
  100. return res;
  101. }
  102. /* check if a string ends in a given substring */
  103. static inline int strendswith( const char* str, const char* end )
  104. {
  105. size_t len = strlen( str );
  106. size_t tail = strlen( end );
  107. return len >= tail && !strcmp( str + len - tail, end );
  108. }
  109. /* remove all trailing slashes from a path name */
  110. static inline void remove_trailing_slashes( char *path )
  111. {
  112. int len = strlen( path );
  113. while (len > 1 && path[len-1] == '/') path[--len] = 0;
  114. }
  115. /* build a path from the specified dir and name */
  116. static char *build_path( const char *dir, const char *name )
  117. {
  118. size_t len = strlen(dir);
  119. char *ret = xmalloc( len + strlen(name) + 2 );
  120. memcpy( ret, dir, len );
  121. if (len && ret[len-1] != '/') ret[len++] = '/';
  122. strcpy( ret + len, name );
  123. return ret;
  124. }
  125. /* return the directory that contains the library at run-time */
  126. static char *get_runtime_libdir(void)
  127. {
  128. #ifdef HAVE_DLADDR
  129. Dl_info info;
  130. char *libdir;
  131. if (dladdr( get_runtime_libdir, &info ) && info.dli_fname[0] == '/')
  132. {
  133. const char *p = strrchr( info.dli_fname, '/' );
  134. unsigned int len = p - info.dli_fname;
  135. if (!len) len++; /* include initial slash */
  136. libdir = xmalloc( len + 1 );
  137. memcpy( libdir, info.dli_fname, len );
  138. libdir[len] = 0;
  139. return libdir;
  140. }
  141. #endif /* HAVE_DLADDR */
  142. return NULL;
  143. }
  144. /* read a symlink and return its directory */
  145. static char *symlink_dirname( const char *name )
  146. {
  147. char *p, *fullpath = realpath( name, NULL );
  148. if (fullpath)
  149. {
  150. p = strrchr( fullpath, '/' );
  151. if (p == fullpath) p++;
  152. if (p) *p = 0;
  153. }
  154. return fullpath;
  155. }
  156. /* return the directory that contains the main exe at run-time */
  157. static char *get_runtime_exedir(void)
  158. {
  159. if (exe_link[0]) return symlink_dirname( exe_link );
  160. return NULL;
  161. }
  162. /* return the base directory from argv0 */
  163. static char *get_runtime_argvdir( const char *argv0 )
  164. {
  165. char *p, *bindir, *cwd;
  166. int len, size;
  167. if (!(p = strrchr( argv0, '/' ))) return NULL;
  168. len = p - argv0;
  169. if (!len) len++; /* include leading slash */
  170. if (argv0[0] == '/') /* absolute path */
  171. {
  172. bindir = xmalloc( len + 1 );
  173. memcpy( bindir, argv0, len );
  174. bindir[len] = 0;
  175. }
  176. else
  177. {
  178. /* relative path, make it absolute */
  179. for (size = 256 + len; ; size *= 2)
  180. {
  181. if (!(cwd = malloc( size ))) return NULL;
  182. if (getcwd( cwd, size - len ))
  183. {
  184. bindir = cwd;
  185. cwd += strlen(cwd);
  186. *cwd++ = '/';
  187. memcpy( cwd, argv0, len );
  188. cwd[len] = 0;
  189. break;
  190. }
  191. free( cwd );
  192. if (errno != ERANGE) return NULL;
  193. }
  194. }
  195. return bindir;
  196. }
  197. /* initialize the server directory value */
  198. static void init_server_dir( dev_t dev, ino_t ino )
  199. {
  200. char *p, *root;
  201. #ifdef __ANDROID__ /* there's no /tmp dir on Android */
  202. root = build_path( config_dir, ".wineserver" );
  203. #else
  204. root = xmalloc( sizeof(server_root_prefix) + 12 );
  205. sprintf( root, "%s-%u", server_root_prefix, getuid() );
  206. #endif
  207. server_dir = xmalloc( strlen(root) + sizeof(server_dir_prefix) + 2*sizeof(dev) + 2*sizeof(ino) + 2 );
  208. strcpy( server_dir, root );
  209. strcat( server_dir, server_dir_prefix );
  210. p = server_dir + strlen(server_dir);
  211. if (dev != (unsigned long)dev)
  212. p += sprintf( p, "%lx%08lx-", (unsigned long)((unsigned long long)dev >> 32), (unsigned long)dev );
  213. else
  214. p += sprintf( p, "%lx-", (unsigned long)dev );
  215. if (ino != (unsigned long)ino)
  216. sprintf( p, "%lx%08lx", (unsigned long)((unsigned long long)ino >> 32), (unsigned long)ino );
  217. else
  218. sprintf( p, "%lx", (unsigned long)ino );
  219. free( root );
  220. }
  221. /* retrieve the default dll dir */
  222. const char *get_dlldir( const char **default_dlldir )
  223. {
  224. *default_dlldir = DLLDIR;
  225. return dlldir;
  226. }
  227. /* initialize all the paths values */
  228. static void init_paths(void)
  229. {
  230. struct stat st;
  231. const char *home = getenv( "HOME" );
  232. const char *user = NULL;
  233. const char *prefix = getenv( "WINEPREFIX" );
  234. char uid_str[32];
  235. struct passwd *pwd = getpwuid( getuid() );
  236. if (pwd)
  237. {
  238. user = pwd->pw_name;
  239. if (!home) home = pwd->pw_dir;
  240. }
  241. if (!user)
  242. {
  243. sprintf( uid_str, "%lu", (unsigned long)getuid() );
  244. user = uid_str;
  245. }
  246. user_name = xstrdup( user );
  247. /* build config_dir */
  248. if (prefix)
  249. {
  250. config_dir = xstrdup( prefix );
  251. remove_trailing_slashes( config_dir );
  252. if (config_dir[0] != '/')
  253. fatal_error( "invalid directory %s in WINEPREFIX: not an absolute path\n", prefix );
  254. if (stat( config_dir, &st ) == -1)
  255. {
  256. if (errno == ENOENT) return; /* will be created later on */
  257. fatal_perror( "cannot open %s as specified in WINEPREFIX", config_dir );
  258. }
  259. }
  260. else
  261. {
  262. if (!home) fatal_error( "could not determine your home directory\n" );
  263. if (home[0] != '/') fatal_error( "your home directory %s is not an absolute path\n", home );
  264. config_dir = xmalloc( strlen(home) + sizeof(server_config_dir) );
  265. strcpy( config_dir, home );
  266. remove_trailing_slashes( config_dir );
  267. strcat( config_dir, server_config_dir );
  268. if (stat( config_dir, &st ) == -1)
  269. {
  270. if (errno == ENOENT) return; /* will be created later on */
  271. fatal_perror( "cannot open %s", config_dir );
  272. }
  273. }
  274. if (!S_ISDIR(st.st_mode)) fatal_error( "%s is not a directory\n", config_dir );
  275. if (st.st_uid != getuid()) fatal_error( "%s is not owned by you\n", config_dir );
  276. init_server_dir( st.st_dev, st.st_ino );
  277. }
  278. /* check if bindir is valid by checking for wineserver */
  279. static int is_valid_bindir( const char *bindir )
  280. {
  281. struct stat st;
  282. char *path = build_path( bindir, "wineserver" );
  283. int ret = (stat( path, &st ) != -1);
  284. free( path );
  285. return ret;
  286. }
  287. /* check if dlldir is valid by checking for ntdll */
  288. static int is_valid_dlldir( const char *dlldir )
  289. {
  290. struct stat st;
  291. char *path = build_path( dlldir, "ntdll.dll.so" );
  292. int ret = (stat( path, &st ) != -1);
  293. free( path );
  294. return ret;
  295. }
  296. /* check if basedir is a valid build dir by checking for wineserver and ntdll */
  297. /* helper for running_from_build_dir */
  298. static inline int is_valid_build_dir( char *basedir, int baselen )
  299. {
  300. struct stat st;
  301. strcpy( basedir + baselen, "/server/wineserver" );
  302. if (stat( basedir, &st ) == -1) return 0; /* no wineserver found */
  303. /* check for ntdll too to make sure */
  304. strcpy( basedir + baselen, "/dlls/ntdll/ntdll.dll.so" );
  305. if (stat( basedir, &st ) == -1) return 0; /* no ntdll found */
  306. basedir[baselen] = 0;
  307. return 1;
  308. }
  309. /* check if we are running from the build directory */
  310. static char *running_from_build_dir( const char *basedir )
  311. {
  312. const char *p;
  313. char *path;
  314. /* remove last component from basedir */
  315. p = basedir + strlen(basedir) - 1;
  316. while (p > basedir && *p == '/') p--;
  317. while (p > basedir && *p != '/') p--;
  318. if (p == basedir) return NULL;
  319. path = xmalloc( p - basedir + sizeof("/dlls/ntdll/ntdll.dll.so") );
  320. memcpy( path, basedir, p - basedir );
  321. if (!is_valid_build_dir( path, p - basedir ))
  322. {
  323. /* remove another component */
  324. while (p > basedir && *p == '/') p--;
  325. while (p > basedir && *p != '/') p--;
  326. if (p == basedir || !is_valid_build_dir( path, p - basedir ))
  327. {
  328. free( path );
  329. return NULL;
  330. }
  331. }
  332. return path;
  333. }
  334. /* try to set the specified directory as bindir, or set build_dir if it's inside the build directory */
  335. static int set_bindir( char *dir )
  336. {
  337. if (!dir) return 0;
  338. if (is_valid_bindir( dir ))
  339. {
  340. bindir = dir;
  341. dlldir = build_path( bindir, BIN_TO_DLLDIR );
  342. }
  343. else
  344. {
  345. build_dir = running_from_build_dir( dir );
  346. free( dir );
  347. }
  348. return bindir || build_dir;
  349. }
  350. /* try to set the specified directory as dlldir, or set build_dir if it's inside the build directory */
  351. static int set_dlldir( char *libdir )
  352. {
  353. char *path;
  354. if (!libdir) return 0;
  355. path = build_path( libdir, LIB_TO_DLLDIR );
  356. if (is_valid_dlldir( path ))
  357. {
  358. dlldir = path;
  359. bindir = build_path( libdir, LIB_TO_BINDIR );
  360. }
  361. else
  362. {
  363. build_dir = running_from_build_dir( libdir );
  364. free( path );
  365. }
  366. free( libdir );
  367. return dlldir || build_dir;
  368. }
  369. /* initialize the argv0 path */
  370. void wine_init_argv0_path( const char *argv0 )
  371. {
  372. const char *basename, *wineloader;
  373. if (!(basename = strrchr( argv0, '/' ))) basename = argv0;
  374. else basename++;
  375. if (set_bindir( get_runtime_exedir() )) goto done;
  376. if (set_dlldir( get_runtime_libdir() )) goto done;
  377. if (set_bindir( get_runtime_argvdir( argv0 ))) goto done;
  378. if ((wineloader = getenv( "WINELOADER" ))) set_bindir( get_runtime_argvdir( wineloader ));
  379. done:
  380. if (build_dir)
  381. {
  382. argv0_name = build_path( "loader/", basename );
  383. if (sizeof(int) == sizeof(void *))
  384. {
  385. char *loader, *linkname = build_path( build_dir, "loader/wine64" );
  386. if ((loader = symlink_dirname( linkname )))
  387. {
  388. wineserver64 = build_path( loader, "../server/wineserver" );
  389. free( loader );
  390. }
  391. free( linkname );
  392. }
  393. }
  394. else
  395. {
  396. if (bindir) datadir = build_path( bindir, BIN_TO_DATADIR );
  397. argv0_name = xstrdup( basename );
  398. }
  399. }
  400. /* return the configuration directory ($WINEPREFIX or $HOME/.wine) */
  401. const char *wine_get_config_dir(void)
  402. {
  403. if (!config_dir) init_paths();
  404. return config_dir;
  405. }
  406. /* retrieve the wine data dir */
  407. const char *wine_get_data_dir(void)
  408. {
  409. return datadir;
  410. }
  411. /* retrieve the wine build dir (if we are running from there) */
  412. const char *wine_get_build_dir(void)
  413. {
  414. return build_dir;
  415. }
  416. const char *wine_libs[] = {
  417. #ifdef SONAME_LIBCAIRO
  418. SONAME_LIBCAIRO,
  419. #endif
  420. #ifdef SONAME_LIBCAPI20
  421. SONAME_LIBCAPI20,
  422. #endif
  423. #ifdef SONAME_LIBCUPS
  424. SONAME_LIBCUPS,
  425. #endif
  426. #ifdef SONAME_LIBCURSES
  427. SONAME_LIBCURSES,
  428. #endif
  429. #ifdef SONAME_LIBDBUS_1
  430. SONAME_LIBDBUS_1,
  431. #endif
  432. #ifdef SONAME_LIBFONTCONFIG
  433. SONAME_LIBFONTCONFIG,
  434. #endif
  435. #ifdef SONAME_LIBFREETYPE
  436. SONAME_LIBFREETYPE,
  437. #endif
  438. #ifdef SONAME_LIBGL
  439. SONAME_LIBGL,
  440. #endif
  441. #ifdef SONAME_LIBGNUTLS
  442. SONAME_LIBGNUTLS,
  443. #endif
  444. #ifdef SONAME_LIBGOBJECT_2_0
  445. SONAME_LIBGOBJECT_2_0,
  446. #endif
  447. #ifdef SONAME_LIBGSM
  448. SONAME_LIBGSM,
  449. #endif
  450. #ifdef SONAME_LIBGTK_3
  451. SONAME_LIBGTK_3,
  452. #endif
  453. #ifdef SONAME_LIBHAL
  454. SONAME_LIBHAL,
  455. #endif
  456. #ifdef SONAME_LIBJPEG
  457. SONAME_LIBJPEG,
  458. #endif
  459. #ifdef SONAME_LIBNCURSES
  460. SONAME_LIBNCURSES,
  461. #endif
  462. #ifdef SONAME_LIBNETAPI
  463. SONAME_LIBNETAPI,
  464. #endif
  465. #ifdef SONAME_LIBODBC
  466. SONAME_LIBODBC,
  467. #endif
  468. #ifdef SONAME_LIBOSMESA
  469. SONAME_LIBOSMESA,
  470. #endif
  471. #ifdef SONAME_LIBPCAP
  472. SONAME_LIBPCAP,
  473. #endif
  474. #ifdef SONAME_LIBPNG
  475. SONAME_LIBPNG,
  476. #endif
  477. #ifdef SONAME_LIBSANE
  478. SONAME_LIBSANE,
  479. #endif
  480. #ifdef SONAME_LIBTIFF
  481. SONAME_LIBTIFF,
  482. #endif
  483. #ifdef SONAME_LIBTXC_DXTN
  484. SONAME_LIBTXC_DXTN,
  485. #endif
  486. #ifdef SONAME_LIBV4L1
  487. SONAME_LIBV4L1,
  488. #endif
  489. #ifdef SONAME_LIBVA
  490. SONAME_LIBVA,
  491. #endif
  492. #ifdef SONAME_LIBVA_DRM
  493. SONAME_LIBVA_DRM,
  494. #endif
  495. #ifdef SONAME_LIBVA_X11
  496. SONAME_LIBVA_X11,
  497. #endif
  498. #ifdef SONAME_LIBX11
  499. SONAME_LIBX11,
  500. #endif
  501. #ifdef SONAME_LIBX11_XCB
  502. SONAME_LIBX11_XCB,
  503. #endif
  504. #ifdef SONAME_LIBXCOMPOSITE
  505. SONAME_LIBXCOMPOSITE,
  506. #endif
  507. #ifdef SONAME_LIBXCURSOR
  508. SONAME_LIBXCURSOR,
  509. #endif
  510. #ifdef SONAME_LIBXEXT
  511. SONAME_LIBXEXT,
  512. #endif
  513. #ifdef SONAME_LIBXI
  514. SONAME_LIBXI,
  515. #endif
  516. #ifdef SONAME_LIBXINERAMA
  517. SONAME_LIBXINERAMA,
  518. #endif
  519. #ifdef SONAME_LIBXRANDR
  520. SONAME_LIBXRANDR,
  521. #endif
  522. #ifdef SONAME_LIBXRENDER
  523. SONAME_LIBXRENDER,
  524. #endif
  525. #ifdef SONAME_LIBXSLT
  526. SONAME_LIBXSLT,
  527. #endif
  528. #ifdef SONAME_LIBXXF86VM
  529. SONAME_LIBXXF86VM,
  530. #endif
  531. NULL
  532. };
  533. /* return the list of shared libs used by wine */
  534. const char **wine_get_libs(void)
  535. {
  536. return &wine_libs[0];
  537. }
  538. /* return the full name of the server directory (the one containing the socket) */
  539. const char *wine_get_server_dir(void)
  540. {
  541. if (!server_dir)
  542. {
  543. if (!config_dir) init_paths();
  544. else
  545. {
  546. struct stat st;
  547. if (stat( config_dir, &st ) == -1)
  548. {
  549. if (errno != ENOENT) fatal_error( "cannot stat %s\n", config_dir );
  550. return NULL; /* will have to try again once config_dir has been created */
  551. }
  552. init_server_dir( st.st_dev, st.st_ino );
  553. }
  554. }
  555. return server_dir;
  556. }
  557. /* return the current user name */
  558. const char *wine_get_user_name(void)
  559. {
  560. if (!user_name) init_paths();
  561. return user_name;
  562. }
  563. /* return the standard version string */
  564. const char *wine_get_version(void)
  565. {
  566. return PACKAGE_VERSION;
  567. }
  568. static const struct
  569. {
  570. const char *author;
  571. const char *subject;
  572. int revision;
  573. }
  574. wine_patch_data[] =
  575. {
  576. { "Alexander E. Patrakov", "dsound: Add a linear resampler for use with a large number of mixing buffers.", 2 },
  577. { "Alex Henrie", "include: Add RtlIpv6StringToAddress(Ex)[AW].", 1 },
  578. { "Alex Henrie", "iphlpapi: Implement ParseNetworkString for IPv6 addresses and services.", 1 },
  579. { "Alex Henrie", "mountmgr.sys: Do a device check before returning a default serial port name.", 1 },
  580. { "Alex Henrie", "ntdll: Add semi-stub for RtlIpv6AddressToString(Ex)A.", 1 },
  581. { "Alex Henrie", "ntdll: Implement RtlIpv6AddressToString(Ex)W.", 1 },
  582. { "Alex Henrie", "ntdll: Implement RtlIpv6StringToAddress(Ex)[AW].", 1 },
  583. { "Alex Henrie", "winemenubuilder: Blacklist desktop integration for certain associations.", 1 },
  584. { "Alistair Leslie-Hughes", "d3dx9: Implement D3DXComputeTangent.", 1 },
  585. { "Alistair Leslie-Hughes", "ddraw: Allow writing to vtable for surface and palette.", 1 },
  586. { "Alistair Leslie-Hughes", "dinput: Allow mapping of controls based of Genre type.", 1 },
  587. { "Alistair Leslie-Hughes", "dinput: Dont allow Fixed actions to be changed.", 1 },
  588. { "Alistair Leslie-Hughes", "dinput: Improved tracing of Semantic value.", 1 },
  589. { "Alistair Leslie-Hughes", "directmanipulation: Create DirectManipulationManager/DirectManipulationSharedManager objects.", 1 },
  590. { "Alistair Leslie-Hughes", "directmanipulation: Fake success from IDirectManipulationViewport2 ActivateConfiguration.", 1 },
  591. { "Alistair Leslie-Hughes", "directmanipulation: Fake success in some functions.", 1 },
  592. { "Alistair Leslie-Hughes", "directmanipulation: Implement IDirectManipulationCompositor SetUpdateManager.", 1 },
  593. { "Alistair Leslie-Hughes", "directmanipulation: Implement IDirectManipulationManager2 CreateViewport.", 1 },
  594. { "Alistair Leslie-Hughes", "directmanipulation: Implement IDirectManipulationManager2 GetUpdateManager.", 1 },
  595. { "Alistair Leslie-Hughes", "directmanipulation: Implement IDirectManipulationViewport2 GetPrimaryContent.", 1 },
  596. { "Alistair Leslie-Hughes", "directmanipulation: New dll.", 1 },
  597. { "Alistair Leslie-Hughes", "directmanipulation: Support DCompManipulationCompositor interface.", 1 },
  598. { "Alistair Leslie-Hughes", "directmanipulation: Support IDirectManipulationContent in IDirectManipulationPrimaryContent interface.", 1 },
  599. { "Alistair Leslie-Hughes", "directmanipulation: Supprot IDirectManipulationFrameInfoProvider interface in IDirectManipulationCompositor.", 1 },
  600. { "Alistair Leslie-Hughes", "directmanipulation/tests: Initial tests.", 1 },
  601. { "Alistair Leslie-Hughes", "dsdmo: Add IDirectSoundFXChorus support.", 1 },
  602. { "Alistair Leslie-Hughes", "dsdmo: Add IDirectSoundFXCompressor support.", 1 },
  603. { "Alistair Leslie-Hughes", "dsdmo: Add IDirectSoundFXDistortion support.", 1 },
  604. { "Alistair Leslie-Hughes", "dsdmo: Add IDirectSoundFXEcho support.", 1 },
  605. { "Alistair Leslie-Hughes", "dsdmo: Add IDirectSoundFXFlanger support.", 1 },
  606. { "Alistair Leslie-Hughes", "dsdmo: Add IDirectSoundFXGargle support.", 1 },
  607. { "Alistair Leslie-Hughes", "dsdmo: Add IDirectSoundFXI3DL2Reverb support.", 1 },
  608. { "Alistair Leslie-Hughes", "dsdmo: Add IDirectSoundFXParamEq support.", 1 },
  609. { "Alistair Leslie-Hughes", "dsdmo: Add IDirectSoundFXWavesReverb support.", 1 },
  610. { "Alistair Leslie-Hughes", "dsdmo: Implement IDirectSoundFXChorus SetAllParameters.", 1 },
  611. { "Alistair Leslie-Hughes", "dsdmo: Implement IDirectSoundFXCompressor SetAllParameters.", 1 },
  612. { "Alistair Leslie-Hughes", "dsdmo: Implement IDirectSoundFXDistortion SetAllParameters.", 1 },
  613. { "Alistair Leslie-Hughes", "dsdmo: Implement IDirectSoundFXEcho GetAllParameters.", 1 },
  614. { "Alistair Leslie-Hughes", "dsdmo: Implement IDirectSoundFXEcho SetAllParameters.", 1 },
  615. { "Alistair Leslie-Hughes", "dsdmo: Implement IDirectSoundFXFlanger SetAllParameters.", 1 },
  616. { "Alistair Leslie-Hughes", "dsdmo: Implement IDirectSoundFXGargle GetAllParameters.", 1 },
  617. { "Alistair Leslie-Hughes", "dsdmo: Implement IDirectSoundFXGargle SetAllParameters.", 1 },
  618. { "Alistair Leslie-Hughes", "dsdmo: Implement IDirectSoundFXI3DL2Reverb SetAllParameters.", 1 },
  619. { "Alistair Leslie-Hughes", "dsdmo: Implement IDirectSoundFXParamEq SetAllParameters.", 1 },
  620. { "Alistair Leslie-Hughes", "dsdmo: Implemnet IDirectSoundFXChorus GetAllParameters.", 1 },
  621. { "Alistair Leslie-Hughes", "dsdmo: Implemnet IDirectSoundFXCompressor GetAllParameters.", 1 },
  622. { "Alistair Leslie-Hughes", "dsdmo: Implemnet IDirectSoundFXDistortion GetAllParameters.", 1 },
  623. { "Alistair Leslie-Hughes", "dsdmo: Implemnet IDirectSoundFXFlanger GetAllParameters.", 1 },
  624. { "Alistair Leslie-Hughes", "dsdmo: Implemnet IDirectSoundFXI3DL2Reverb GetAllParameters.", 1 },
  625. { "Alistair Leslie-Hughes", "dsdmo: Implemnet IDirectSoundFXParamEq GetAllParameters.", 1 },
  626. { "Alistair Leslie-Hughes", "dsound: IDirectSoundBuffer8 GetObjectInPath loops for the requested interface.", 1 },
  627. { "Alistair Leslie-Hughes", "include: Add XACT defines.", 1 },
  628. { "Alistair Leslie-Hughes", "include: Add XACTENGINE_* error codes.", 1 },
  629. { "Alistair Leslie-Hughes", "include: Add XACTNOTIFICATIONTYPE_* values.", 1 },
  630. { "Alistair Leslie-Hughes", "loader: Add Keyboard Layouts registry enteries.", 1 },
  631. { "Alistair Leslie-Hughes", "msctf: Added ITfActiveLanguageProfileNotifySink support in ITfSource.", 1 },
  632. { "Alistair Leslie-Hughes", "mshtml: Improve IOleInPlaceActiveObject TranslateAccelerator.", 1 },
  633. { "Alistair Leslie-Hughes", "oleaut32: Implement semi-stub for CreateTypeLib.", 1 },
  634. { "Alistair Leslie-Hughes", "Revert \"dxva2: Build with msvcrt.\".", 1 },
  635. { "Alistair Leslie-Hughes", "shlwapi: Support ./ in UrlCanonicalize.", 1 },
  636. { "Alistair Leslie-Hughes", "user32: Improve GetKeyboardLayoutList.", 1 },
  637. { "Alistair Leslie-Hughes", "user32/msgbox: Support WM_COPY Message.", 1 },
  638. { "Alistair Leslie-Hughes", "user32/msgbox: Use a windows hook to trap Ctrl+C.", 1 },
  639. { "Alistair Leslie-Hughes", "uuid: Add directmanipulation.h.", 1 },
  640. { "Alistair Leslie-Hughes", "windowscodecs: Avoid implicit cast of interface pointer.", 1 },
  641. { "Alistair Leslie-Hughes", "windowscodecs/tests: Add IWICBitmapEncoderInfo test.", 1 },
  642. { "Alistair Leslie-Hughes", "winex11.drv: Support multiplex categories WTI_DSCTXS and WTI_DDCTXS.", 1 },
  643. { "Alistair Leslie-Hughes", "winex11: Handle negative orAltitude values.", 1 },
  644. { "Alistair Leslie-Hughes", "winex11: Specify a default vulkan driver if one not found at build time.", 1 },
  645. { "Alistair Leslie-Hughes", "winex11: Support WTI_STATUS in WTInfo.", 1 },
  646. { "Alistair Leslie-Hughes", "winmm: Use _lopen instead of OpenFile.", 1 },
  647. { "Alistair Leslie-Hughes", "wintab32: Set lcSysExtX/Y for the first index of WTI_DDCTXS.", 1 },
  648. { "Alistair Leslie-Hughes", "wintrust: Add parameter check in WTHelperGetProvCertFromChain.", 1 },
  649. { "Alistair Leslie-Hughes", "xaudio2_7: Always return S_OK in IXACT34Cue Destroy.", 1 },
  650. { "Alistair Leslie-Hughes", "xaudio2_7: Correct callback to windows function.", 1 },
  651. { "Alistair Leslie-Hughes", "xaudio2_7: Dont cast interface pointers.", 1 },
  652. { "Alistair Leslie-Hughes", "xaudio2_7: Initial IXACT3Engine tests.", 1 },
  653. { "Alistair Leslie-Hughes", "xaudio2_7: IXACT3Engine CreateSoundBank return correct HRESULT values.", 1 },
  654. { "Alistair Leslie-Hughes", "xaudio2_7: IXACT3Engine Initialize return valid error code.", 1 },
  655. { "Alistair Leslie-Hughes", "xaudio2_7: Support older XACT3Engine interfaces.", 1 },
  656. { "Alistair Leslie-Hughes", "xaudio2_7/tests: Add more tests.", 1 },
  657. { "Alistair Leslie-Hughes", "xaudio2_7: Trace FAudio version being used.", 1 },
  658. { "Alistair Leslie-Hughes", "xaudio2_7: Unwrap structure based of it's type.", 1 },
  659. { "André Hentschel", "ntdll: Support ISOLATIONAWARE_MANIFEST_RESOURCE_ID range.", 1 },
  660. { "André Hentschel", "wpcap: Load libpcap dynamically.", 1 },
  661. { "Andrej Shadura", "comctl32: Fixed rebar behaviour when there's capture and no drag.", 1 },
  662. { "Andrew Church", "dinput: Allow reconnecting to disconnected joysticks.", 1 },
  663. { "Andrew Church", "dinput: Allow remapping of joystick buttons.", 1 },
  664. { "Andrew D'Addesio", "ddraw: Return correct devices based off requested DirectX version.", 1 },
  665. { "Andrew Eikum", "winepulse: Account for PA devices that fall way behind.", 1 },
  666. { "Andrew Eikum", "winepulse: Don't fake being one period behind in GetPosition.", 1 },
  667. { "Andrew Eikum", "winepulse: Don't rely on pulseaudio callbacks for timing.", 1 },
  668. { "Andrew Eikum", "winepulse: Fix local buffer offset wrapping.", 1 },
  669. { "Andrew Eikum", "winepulse: Fix up recording.", 1 },
  670. { "Andrew Eikum", "winepulse: Update last time on underrun.", 1 },
  671. { "Andrew Wesie", "ntdll: Add stub for NtQuerySystemInformation(SystemModuleInformationEx).", 1 },
  672. { "Andrew Wesie", "ntdll: Refactor RtlCreateUserThread into NtCreateThreadEx.", 1 },
  673. { "Andrew Wesie", "ntdll: Return ntdll.dll as the first entry for SystemModuleInformation.", 1 },
  674. { "Andrew Wesie", "ntdll/tests: Test updating TickCount in user_shared_data.", 1 },
  675. { "Andrew Wesie", "ntdll: Use NtContinue to continue execution after exceptions.", 1 },
  676. { "Andrew Wesie", "wined3d: Use glReadPixels for RT texture download.", 1 },
  677. { "Andrey Gusev", "d3dx9_*: Add D3DXSHProjectCubeMap stub.", 1 },
  678. { "Austin English", "user32: Added LoadKeyboardLayoutEx stub.", 1 },
  679. { "Bernhard Reiter", "imagehlp: Implement parts of BindImageEx to make freezing Python scripts work.", 1 },
  680. { "Bruno Jesus", "dinput: Recalculated Axis after deadzone change.", 1 },
  681. { "Charles Davis", "crypt32: Skip unknown item when decoding a CMS certificate.", 1 },
  682. { "Christian Costa", "d3dx9_36: Add format description for X8L8V8U8 for format conversions.", 1 },
  683. { "Christian Costa", "d3dx9_36: Add semi-stub for D3DXOptimizeVertices.", 1 },
  684. { "Christian Costa", "d3dx9_36: Add support for FOURCC surface to save_dds_surface_to_memory.", 1 },
  685. { "Christian Costa", "d3dx9_36: Filter out D3DCompile warning messages that are not present with D3DCompileShader.", 4 },
  686. { "Christian Costa", "d3dx9_36: Implement D3DXDisassembleShader.", 2 },
  687. { "Christian Costa", "d3dx9_36: Implement ID3DXSkinInfoImpl_UpdateSkinnedMesh.", 1 },
  688. { "Christian Costa", "d3dx9_36: Improve D3DXSaveTextureToFile to save simple texture to dds file.", 1 },
  689. { "Christian Costa", "d3dx9_36: No need to fail if we don't support vertices reordering in D3DXMESHOPT_ATTRSORT.", 1 },
  690. { "Christian Costa", "d3dx9_36/tests: Add additional tests for special cases.", 1 },
  691. { "Christian Costa", "d3dx9_36/tests: Remove useless \\n within some ok messages.", 1 },
  692. { "Christian Costa", "d3dx9: Return D3DFMT_A8R8G8B8 in D3DXGetImageInfoFromFileInMemory for 32 bpp BMP with alpha.", 1 },
  693. { "Christian Costa", "ddraw: Silence noisy FIXME about unimplemented D3DPROCESSVERTICES_UPDATEEXTENTS.", 1 },
  694. { "Christian Costa", "ntoskrnl.exe: Implement MmMapLockedPages and MmUnmapLockedPages.", 1 },
  695. { "Christian Costa", "shdocvw: Check precisely ParseURLFromOutsideSourceX returned values in tests and make code clearer about that.", 3 },
  696. { "Christian Costa", "wined3d: Print FIXME only once in surface_cpu_blt.", 1 },
  697. { "Daniel Jelinski", "wine.inf: Add registry keys for Windows Performance Library.", 1 },
  698. { "Daniel Wendt", "gdi32: Fix for rotated Arc, ArcTo, Chord and Pie drawing problem.", 1 },
  699. { "Daniel Wendt", "gdi32: Fix for rotated ellipse.", 1 },
  700. { "David Torok", "ntdll: Stub NtQueryInformationThread(ThreadHideFromDebugger).", 1 },
  701. { "David Torok", "user32: AddInternalGetWindowIcon stub.", 1 },
  702. { "Derek Lesho", "bcrypt: Implement BCRYPT_KDF_HASH.", 1 },
  703. { "Derek Lesho", "bcrypt: Implement BCryptSecretAgreement with libgcrypt.", 1 },
  704. { "Derek Lesho", "user32: Add support for RIDEV_NOLEGACY flag in RegisterRawInputDevices.", 1 },
  705. { "Derek Lesho", "winex11.drv: Add support for absolute RawMotion events.", 1 },
  706. { "Dmitry Timoshkov", "comctl32: Bump version to 6.0.", 1 },
  707. { "Dmitry Timoshkov", "comdlg32: Postpone setting ofn->lpstrFileTitle to work around an application bug.", 1 },
  708. { "Dmitry Timoshkov", "cryptext: Implement CryptExtOpenCER.", 1 },
  709. { "Dmitry Timoshkov", "gdiplus: Add support for more image color formats.", 1 },
  710. { "Dmitry Timoshkov", "gdiplus: Change multiplications by additions in the x/y scaler loops.", 1 },
  711. { "Dmitry Timoshkov", "gdiplus: Change the order of x/y loops in the scaler.", 1 },
  712. { "Dmitry Timoshkov", "gdiplus: Prefer using pre-multiplied ARGB data in the scaler.", 1 },
  713. { "Dmitry Timoshkov", "gdiplus: Remove ceilf/floorf calls from bilinear scaler.", 2 },
  714. { "Dmitry Timoshkov", "gdiplus/tests: Add some tests for loading TIFF images in various color formats.", 1 },
  715. { "Dmitry Timoshkov", "include: Make stdole32.idl a public component.", 1 },
  716. { "Dmitry Timoshkov", "kernel32: Implement K32GetMappedFileName.", 2 },
  717. { "Dmitry Timoshkov", "kernel32: On process entry store PEB address in %ebx.", 1 },
  718. { "Dmitry Timoshkov", "kernel32/tests: Add a PE test image that resembles format of some of 8k demos.", 1 },
  719. { "Dmitry Timoshkov", "kernel32/tests: Add tests for NtQuerySection.", 2 },
  720. { "Dmitry Timoshkov", "libs/wine: Allow to modify reserved LDT entries.", 1 },
  721. { "Dmitry Timoshkov", "ntdll: If PE image size is larger than the backed file size then treat file as removable.", 1 },
  722. { "Dmitry Timoshkov", "ntdll: Implement NtQueryVirtualMemory(MemorySectionName).", 3 },
  723. { "Dmitry Timoshkov", "ntdll: Implement NtSetLdtEntries.", 1 },
  724. { "Dmitry Timoshkov", "ntdll/tests: Add tests for NtQueryVirtualMemory(MemorySectionName).", 1 },
  725. { "Dmitry Timoshkov", "ole32: Add a check for hglobal pointer to GetHGlobalFromStream.", 1 },
  726. { "Dmitry Timoshkov", "ole32: Add a wrapper for memory block managed by HGLOBAL based IStream.", 1 },
  727. { "Dmitry Timoshkov", "ole32: Allow moving a being reallocated block of memory managed by HGLOBAL based IStream.", 1 },
  728. { "Dmitry Timoshkov", "ole32/tests: Add a bunch of tests for HGLOBAL based IStream::Clone.", 1 },
  729. { "Dmitry Timoshkov", "oleaut32: Add support for decoding SLTG function help strings.", 1 },
  730. { "Dmitry Timoshkov", "oleaut32: Add support for decoding SLTG variable help strings.", 1 },
  731. { "Dmitry Timoshkov", "oleaut32: Add support for loading and saving EMF to IPicture interface.", 1 },
  732. { "Dmitry Timoshkov", "oleaut32: Do not reimplement OleLoadPicture in OleLoadPicturePath.", 1 },
  733. { "Dmitry Timoshkov", "oleaut32: Factor out stream creation from OleLoadPicturePath.", 1 },
  734. { "Dmitry Timoshkov", "oleaut32: Fix logic for deciding whether type description follows the name.", 2 },
  735. { "Dmitry Timoshkov", "oleaut32: Implement a better stub for IPicture::SaveAsFile.", 1 },
  736. { "Dmitry Timoshkov", "oleaut32: Implement decoding of SLTG help strings.", 1 },
  737. { "Dmitry Timoshkov", "oleaut32: Implement OleLoadPictureFile.", 2 },
  738. { "Dmitry Timoshkov", "oleaut32: Make OleLoadPicture load DIBs using WIC decoder.", 1 },
  739. { "Dmitry Timoshkov", "oleaut32: OleLoadPicture should create a DIB section for a being loaded bitmap.", 3 },
  740. { "Dmitry Timoshkov", "oleaut32/tests: Add some tests for loading and saving EMF using IPicture interface.", 1 },
  741. { "Dmitry Timoshkov", "riched20/tests: Add a test to see what richedit class flavours should be available.", 1 },
  742. { "Dmitry Timoshkov", "server: Add support for a layered window region.", 3 },
  743. { "Dmitry Timoshkov", "server: All fields up to CheckSum are mandatory regardless of SizeOfOptionalHeader value.", 1 },
  744. { "Dmitry Timoshkov", "setupapi: Fix parameters of SPFILENOTIFY_FILEINCABINET handler.", 1 },
  745. { "Dmitry Timoshkov", "setupapi/tests: Add more tests for SPFILENOTIFY_FILEINCABINET handler.", 1 },
  746. { "Dmitry Timoshkov", "shell32: Add more Tango icons to the IE toolbar.", 1 },
  747. { "Dmitry Timoshkov", "shell32: Add toolbar bitmaps compatible with IE6.", 1 },
  748. { "Dmitry Timoshkov", "user32: Add a workaround for Windows 3.1 apps which call LoadImage(LR_LOADFROMFILE) with a resource id.", 2 },
  749. { "Dmitry Timoshkov", "user32: Before asking a WM to activate a window make sure that the window is in foreground and not minimized.", 1 },
  750. { "Dmitry Timoshkov", "user32: Do not initialize dialog info for every window passed to DefDlgProc.", 1 },
  751. { "Dmitry Timoshkov", "user32: Fix return value of ScrollWindowEx for invisible windows.", 1 },
  752. { "Dmitry Timoshkov", "user32: MessageBox should be topmost when MB_SYSTEMMODAL style is set.", 1 },
  753. { "Dmitry Timoshkov", "user32/tests: Add a bunch of tests for DM_SETDEFID/DM_GETDEFID handling by a DefDlgProc.", 1 },
  754. { "Dmitry Timoshkov", "user32/tests: Add some tests to see when MessageBox gains WS_EX_TOPMOST style.", 1 },
  755. { "Dmitry Timoshkov", "user32: Try harder to find a target for mouse messages.", 1 },
  756. { "Dmitry Timoshkov", "user32: Use root dialog for DM_SETDEFID/DM_GETDEFID in DefDlgProc.", 1 },
  757. { "Dmitry Timoshkov", "uxtheme: Protect CloseThemeData() from invalid input.", 1 },
  758. { "Dmitry Timoshkov", "widl: Add initial implementation of SLTG typelib generator.", 1 },
  759. { "Dmitry Timoshkov", "widl: Add support for function parameter flags to SLTG typelib generator.", 1 },
  760. { "Dmitry Timoshkov", "widl: Add support for inherited interfaces to SLTG typelib generator.", 1 },
  761. { "Dmitry Timoshkov", "widl: Add support for interfaces to SLTG typelib generator.", 1 },
  762. { "Dmitry Timoshkov", "widl: Add support for recursive type references to SLTG typelib generator.", 1 },
  763. { "Dmitry Timoshkov", "widl: Add support for structures.", 1 },
  764. { "Dmitry Timoshkov", "widl: Add support for VT_USERDEFINED to SLTG typelib generator.", 1 },
  765. { "Dmitry Timoshkov", "widl: Add support for VT_VOID and VT_VARIANT to SLTG typelib generator.", 1 },
  766. { "Dmitry Timoshkov", "widl: Avoid relying on side effects when marking function index as the last one.", 1 },
  767. { "Dmitry Timoshkov", "widl: Calculate size of instance for structures.", 1 },
  768. { "Dmitry Timoshkov", "widl: Create library block index right after the CompObj one.", 1 },
  769. { "Dmitry Timoshkov", "widl: Factor out SLTG tail initialization.", 1 },
  770. { "Dmitry Timoshkov", "widl: Fix generation of resources containing an old typelib.", 1 },
  771. { "Dmitry Timoshkov", "widl: Make automatic dispid generation scheme better match what midl does.", 1 },
  772. { "Dmitry Timoshkov", "widl: Minor/cosmetic clean up.", 1 },
  773. { "Dmitry Timoshkov", "widl: More accurately report variable descriptions data size.", 1 },
  774. { "Dmitry Timoshkov", "widl: Properly align name table entries.", 1 },
  775. { "Dmitry Timoshkov", "widl: Set the lowest bit in the param name to indicate whether type description follows the name.", 1 },
  776. { "Dmitry Timoshkov", "widl: Write correct syskind by SLTG typelib generator.", 1 },
  777. { "Dmitry Timoshkov", "widl: Write correct typekind to the SLTG typeinfo block.", 1 },
  778. { "Dmitry Timoshkov", "widl: Write SLTG blocks according to the index order.", 1 },
  779. { "Dmitry Timoshkov", "windowscodecs: Add initial implementation of the GIF encoder.", 1 },
  780. { "Dmitry Timoshkov", "windowscodecs: Add registration of the GIF encoder.", 1 },
  781. { "Dmitry Timoshkov", "windowscodecs: Add some tests for various TIFF color formats.", 1 },
  782. { "Dmitry Timoshkov", "windowscodecs: Add support for 128bppRGBAFloat format to TIFF decoder.", 1 },
  783. { "Dmitry Timoshkov", "windowscodecs: Add support for 12bpp RGB format to TIFF decoder.", 1 },
  784. { "Dmitry Timoshkov", "windowscodecs: Add support for 16bppGray and 32bppGrayFloat formats to TIFF decoder.", 1 },
  785. { "Dmitry Timoshkov", "windowscodecs: Add support for 16bpp RGBA format to TIFF decoder.", 1 },
  786. { "Dmitry Timoshkov", "windowscodecs: Add support for 32bppCMYK and 64bppCMYK formats to TIFF decoder.", 1 },
  787. { "Dmitry Timoshkov", "windowscodecs: Add support for 3bps RGB format to TIFF decoder.", 1 },
  788. { "Dmitry Timoshkov", "windowscodecs: Add support for 4bpp RGBA format to TIFF decoder.", 1 },
  789. { "Dmitry Timoshkov", "windowscodecs: Better follow the GIF spec and don't specify the local color table size if there is no local palette.", 1 },
  790. { "Dmitry Timoshkov", "windowscodecs: Correctly indicate that the global info was written even without the global palette.", 1 },
  791. { "Dmitry Timoshkov", "windowscodecs: Fix IWICBitmapDecoder::CopyPalette for a not initialized case in the GIF decoder.", 1 },
  792. { "Dmitry Timoshkov", "windowscodecs: Initialize empty property bag in GIF encoder's CreateNewFrame implementation.", 1 },
  793. { "Dmitry Timoshkov", "windowscodecs/tests: Add the tests for GIF encoder and decoder.", 1 },
  794. { "Dmitry Timoshkov", "windowscodecs: Tolerate partial reads in the IFD metadata loader.", 1 },
  795. { "Dmitry Timoshkov", "wine.inf: Add 'Counters' to the perflib key as an alias for 'Counter'.", 1 },
  796. { "Dmitry Timoshkov", "wineps.drv: Add support for GETFACENAME and DOWNLOADFACE escapes.", 1 },
  797. { "Dmitry Timoshkov", "winex11.drv: Add support for _NET_ACTIVE_WINDOW.", 2 },
  798. { "Dmitry Timoshkov", "winex11.drv: Don't add MWM_DECOR_BORDER to windows without a caption.", 1 },
  799. { "Dmitry Timoshkov", "winex11.drv: Don't use MWM_DECOR_RESIZEH, window resizing is controlled by MWM_FUNC_RESIZE.", 1 },
  800. { "Dmitry Timoshkov", "winex11.drv: Send WM_WINDOWPOSCHANGING/WM_WINDOWPOSCHANGED messages to a being deactivated topmost window.", 1 },
  801. { "Dmitry Timoshkov", "winex11: Fix handling of window attributes for WS_EX_LAYERED | WS_EX_COMPOSITED.", 1 },
  802. { "Enrico Horn", "winex11.drv: Handle missing thread data in X11DRV_get_ic.", 1 },
  803. { "Erich E. Hoover", "dsound: Add stub support for DSPROPSETID_EAX20_BufferProperties.", 1 },
  804. { "Erich E. Hoover", "dsound: Add stub support for DSPROPSETID_EAX20_ListenerProperties.", 1 },
  805. { "Erich E. Hoover", "fonts: Add WenQuanYi Micro Hei as a Microsoft Yahei replacement.", 1 },
  806. { "Erich E. Hoover", "kernel32: Advertise junction point support.", 1 },
  807. { "Erich E. Hoover", "kernel32: Implement CreateSymbolicLink[A|W] with ntdll reparse points.", 1 },
  808. { "Erich E. Hoover", "kernel32,ntdll: Add support for deleting junction points with RemoveDirectory.", 1 },
  809. { "Erich E. Hoover", "kernel32: Set error code when attempting to delete file symlinks as directories.", 1 },
  810. { "Erich E. Hoover", "libport: Add support for FreeBSD style extended attributes.", 1 },
  811. { "Erich E. Hoover", "libport: Add support for Mac OS X style extended attributes.", 1 },
  812. { "Erich E. Hoover", "ntdll: Add a test for junction point advertisement.", 1 },
  813. { "Erich E. Hoover", "ntdll: Add support for absolute symlink creation.", 1 },
  814. { "Erich E. Hoover", "ntdll: Add support for deleting junction points.", 1 },
  815. { "Erich E. Hoover", "ntdll: Add support for deleting symlinks.", 1 },
  816. { "Erich E. Hoover", "ntdll: Add support for file symlinks.", 1 },
  817. { "Erich E. Hoover", "ntdll: Add support for junction point creation.", 1 },
  818. { "Erich E. Hoover", "ntdll: Add support for reading absolute symlinks.", 1 },
  819. { "Erich E. Hoover", "ntdll: Add support for reading junction points.", 1 },
  820. { "Erich E. Hoover", "ntdll: Add support for reading relative symlinks.", 1 },
  821. { "Erich E. Hoover", "ntdll: Add support for relative symlink creation.", 1 },
  822. { "Erich E. Hoover", "ntdll: Allow creation of dangling reparse points to non-existent paths.", 1 },
  823. { "Erich E. Hoover", "ntdll: Always report symbolic links as containing zero bytes.", 1 },
  824. { "Erich E. Hoover", "ntdll: Correctly report file symbolic links as files.", 1 },
  825. { "Erich E. Hoover", "ntdll: Find dangling symlinks quickly.", 1 },
  826. { "Erich E. Hoover", "ntdll: Implement retrieving DOS attributes in NtQuery[Full]AttributesFile and NtQueryDirectoryFile.", 1 },
  827. { "Erich E. Hoover", "ntdll: Implement retrieving DOS attributes in NtQueryInformationFile.", 1 },
  828. { "Erich E. Hoover", "ntdll: Implement storing DOS attributes in NtCreateFile.", 1 },
  829. { "Erich E. Hoover", "ntdll: Implement storing DOS attributes in NtSetInformationFile.", 1 },
  830. { "Erich E. Hoover", "ntdll: Perform the Unix-style hidden file check within the unified file info grabbing routine.", 1 },
  831. { "Erich E. Hoover", "server: Convert return of file security masks with generic access mappings.", 7 },
  832. { "Erich E. Hoover", "server: Inherit security attributes from parent directories on creation.", 7 },
  833. { "Erich E. Hoover", "server: Properly handle file symlink deletion.", 1 },
  834. { "Erich E. Hoover", "server: Retrieve file security attributes with extended file attributes.", 7 },
  835. { "Erich E. Hoover", "server: Store file security attributes with extended file attributes.", 8 },
  836. { "Erich E. Hoover", "server: Unify the retrieval of security attributes for files and directories.", 7 },
  837. { "Erich E. Hoover", "server: Unify the storage of security attributes for files and directories.", 7 },
  838. { "Erich E. Hoover", "strmbase: Fix MediaSeekingPassThru_GetPositions return when the pins are unconnected.", 1 },
  839. { "Erich E. Hoover", "ws2_32: Add support for TF_DISCONNECT to TransmitFile.", 1 },
  840. { "Erich E. Hoover", "ws2_32: Add support for TF_REUSE_SOCKET to TransmitFile.", 1 },
  841. { "Erich Hoover", "pdh: Support the 'Processor' object string.", 1 },
  842. { "Ethan Lee", "include: Add xact3.idl.", 1 },
  843. { "Ethan Lee", "xaudio2: Add support for xactengine3.", 1 },
  844. { "Felix Yan", "winex11.drv: Update a candidate window's position with over-the-spot style.", 2 },
  845. { "Gabriel Ivăncescu", "ntdll/server: Mark drive_c as case-insensitive when created.", 1 },
  846. { "Gabriel Ivăncescu", "shell32/iconcache: Generate icons from available icons if some icon sizes failed to load.", 1 },
  847. { "Gabriel Ivăncescu", "user32/focus: Prevent a recursive loop with the activation messages.", 1 },
  848. { "Gabriel Ivăncescu", "user32/tests: Test a recursive activation loop on WM_ACTIVATE.", 1 },
  849. { "Gabriel Ivăncescu", "winex11.drv/mouse: Use root-relative coordinates for events, if possible.", 1 },
  850. { "Gabriel Ivăncescu", "winex11.drv/window: Query the X server for the actual rect of the window before unmapping it.", 1 },
  851. { "Gijs Vermeulen", "imm32: Only generate 'WM_IME_SETCONTEXT' message if window has focus.", 1 },
  852. { "Hao Peng", "winecfg: Double click in dlls list to edit item's overides.", 3 },
  853. { "Henri Verbeet", "wined3d: Dont set DDSCAPS_FLIP for gdi renderer.", 1 },
  854. { "Hermès BÉLUSCA-MAÏTO", "shlwapi: Fix the return value of SHAddDataBlock.", 1 },
  855. { "Hirofumi Katayama", "user32: Implement TileWindows.", 1 },
  856. { "Ivan Akulinchev", "uxtheme: Initial implementation of GTK backend.", 1 },
  857. { "Jactry Zeng", "riched20: Fix ME_RunOfsFromCharOfs() when nCharOfs > strlen().", 1 },
  858. { "Jactry Zeng", "riched20: Stub for ITextPara interface and implement ITextRange::GetPara.", 1 },
  859. { "James Coonradt", "user32: Improve FlashWindowEx message and return value.", 1 },
  860. { "Jarkko Korpi", "ntoskrnl.exe: Add IoGetDeviceAttachmentBaseRef stub.", 1 },
  861. { "Jarkko Korpi", "wined3d: Also check for 'Brian Paul' to detect Mesa gl_vendor.", 1 },
  862. { "Jason Edmeades", "cmd: Ftype failed to clear file associations.", 1 },
  863. { "Jason Edmeades", "cmd: Support for launching programs based on file association.", 1 },
  864. { "Jeremy White", "winemapi: Directly use xdg-email if available, enabling file attachments.", 1 },
  865. { "Jetro Jormalainen", "dinput: Allow empty Joystick mappings.", 1 },
  866. { "Jetro Jormalainen", "dinput: Load users Joystick mappings.", 1 },
  867. { "Jetro Jormalainen", "dinput: Support username in Config dialog.", 1 },
  868. { "Jianqiu Zhang", "ntdll: Add support for FileFsFullSizeInformation class in NtQueryVolumeInformationFile.", 2 },
  869. { "Joakim Hernberg", "wineserver: Draft to implement priority levels through POSIX scheduling policies on linux.", 1 },
  870. { "Johannes Specht", "d3d11: Implement ClearUnorderedAccessViewFloat for deferred contexts.", 1 },
  871. { "Johannes Specht", "d3d11: Implement ClearUnorderedAccessViewUint for deferred contexts.", 1 },
  872. { "Johannes Specht", "d3d11: Implement CopyResource for deferred contexts.", 1 },
  873. { "Johannes Specht", "d3d11: Implement CopyStructureCount for deferred contexts.", 1 },
  874. { "Johannes Specht", "d3d11: Implement CopySubresourceRegion for deferred contexts.", 1 },
  875. { "Johannes Specht", "d3d11: Implement DispatchIndirect for deferred contexts.", 1 },
  876. { "Johannes Specht", "d3d11: Implement DrawAuto for deferred contexts.", 1 },
  877. { "Johannes Specht", "d3d11: Implement DrawIndexedInstancedIndirect for deferred contexts.", 1 },
  878. { "Johannes Specht", "d3d11: Implement DrawInstanced for deferred contexts.", 1 },
  879. { "Johannes Specht", "d3d11: Implement DrawInstancedIndirect for deferred contexts.", 1 },
  880. { "Johannes Specht", "d3d11: Implement GenerateMips for deferred contexts.", 1 },
  881. { "Johannes Specht", "d3d11: Implement OMSetRenderTargetsAndUnorderedAccessViews for deferred contexts.", 1 },
  882. { "Johannes Specht", "d3d11: Implement ResolveSubresource for deferred contexts.", 1 },
  883. { "Johannes Specht", "d3d11: Implement RsSetScissorRects for deferred contexts.", 1 },
  884. { "Johannes Specht", "d3d11: Implement SetPredication for deferred contexts.", 1 },
  885. { "Johannes Specht", "d3d11: Implement SetResourceMinLOD for deferred contexts.", 1 },
  886. { "Johannes Specht", "d3d11: Implement SOSetTargets for deferred contexts.", 1 },
  887. { "Jordan Galby", "winex11.drv: Accumulate mouse movement to avoid rounding losses.", 1 },
  888. { "katahiromz", "user32: Implement CascadeWindows.", 1 },
  889. { "Ken Thomases", "winex11: Match keyboard in Unicode.", 1 },
  890. { "Kimmo Myllyvirta", "d3d11: Add stub deferred rendering context.", 1 },
  891. { "Kimmo Myllyvirta", "d3d11: Correctly align map info buffer.", 1 },
  892. { "Kimmo Myllyvirta", "d3d11: Implement Begin and End for deferred contexts.", 1 },
  893. { "Kimmo Myllyvirta", "d3d11: Implement CSSetSamplers for deferred contexts.", 1 },
  894. { "Kimmo Myllyvirta", "d3d11: Implement CSSetShaderResources for deferred contexts.", 1 },
  895. { "Kimmo Myllyvirta", "d3d11: Implement GSSetConstantBuffers for deferred contexts.", 1 },
  896. { "Kimmo Myllyvirta", "d3d11: Implement GSSetSamplers for deferred contexts.", 1 },
  897. { "Kimmo Myllyvirta", "d3d11: Implement GSSetShader for deferred contexts.", 1 },
  898. { "Kimmo Myllyvirta", "d3d11: Implement GSSetShaderResources for deferred contexts.", 1 },
  899. { "Kimmo Myllyvirta", "d3d11: Implement HSSetSamplers for deferred contexts.", 1 },
  900. { "Kimmo Myllyvirta", "d3d11: Implement HSSetShaderResources for deferred contexts.", 1 },
  901. { "Kimmo Myllyvirta", "d3d11: Implement VSSetSamplers for deferred contexts.", 1 },
  902. { "Kimmo Myllyvirta", "d3d11: Implement VSSetShaderResources for deferred contexts.", 1 },
  903. { "Kimmo Myllyvirta", "user32: ShowWindow should not send message when window is already visible.", 1 },
  904. { "Louis Lenders", "dwmapi: Add initial tests.", 1 },
  905. { "Louis Lenders", "shell32: Improve semi-stub SHGetStockIconInfo, try find existing iconhandle.", 1 },
  906. { "Louis Lenders", "tasklist.exe: Add minimal functionality.", 1 },
  907. { "Lucian Poston", "dwrite: Test GetMetrics with custom fontcollection.", 1 },
  908. { "Lucian Poston", "dwrite: Test IDWriteTextFormat with nonexistent font.", 1 },
  909. { "Lucian Poston", "dwrite: Use font fallback when mapping characters.", 1 },
  910. { "Lucian Poston", "dwrite: Use MapCharacters for dummy line metrics.", 1 },
  911. { "Lucian Poston", "dwrite: Use MapCharacters for non-visual characters.", 1 },
  912. { "Mark Harmstone", "dsound: Add delay line EAX functions.", 1 },
  913. { "Mark Harmstone", "dsound: Add EAX init and free stubs.", 1 },
  914. { "Mark Harmstone", "dsound: Add EAX presets.", 1 },
  915. { "Mark Harmstone", "dsound: Add EAX propset stubs.", 1 },
  916. { "Mark Harmstone", "dsound: Add EAX v1 constants and structs.", 1 },
  917. { "Mark Harmstone", "dsound: Add EAX VerbPass stub.", 1 },
  918. { "Mark Harmstone", "dsound: Allocate EAX delay lines.", 1 },
  919. { "Mark Harmstone", "dsound: Feed data through EAX function.", 1 },
  920. { "Mark Harmstone", "dsound: Implement EAX decorrelator.", 1 },
  921. { "Mark Harmstone", "dsound: Implement EAX early reflections.", 1 },
  922. { "Mark Harmstone", "dsound: Implement EAX late all-pass filter.", 1 },
  923. { "Mark Harmstone", "dsound: Implement EAX late reverb.", 1 },
  924. { "Mark Harmstone", "dsound: Implement EAX lowpass filter.", 1 },
  925. { "Mark Harmstone", "dsound: Report that we support EAX.", 1 },
  926. { "Mark Harmstone", "dsound: Support getting and setting EAX buffer properties.", 1 },
  927. { "Mark Harmstone", "dsound: Support getting and setting EAX properties.", 1 },
  928. { "Mark Harmstone", "winecfg: Add checkbox to enable/disable EAX support.", 1 },
  929. { "Mark Harmstone", "winepulse: Expose audio devices directly to programs.", 1 },
  930. { "Mark Harmstone", "winepulse: Fetch actual program name if possible.", 1 },
  931. { "Mark Harmstone", "winepulse: Fix segfault in pulse_rd_loop.", 1 },
  932. { "Mark Harmstone", "winepulse: Implement GetPropValue.", 1 },
  933. { "Mark Harmstone", "winepulse: Return PKEY_AudioEndpoint_PhysicalSpeakers device prop.", 1 },
  934. { "Mark Jansen", "kernel32/tests: Add tests for job object accounting.", 1 },
  935. { "Mark Jansen", "msi: Do not sign extend after multiplying.", 1 },
  936. { "Mark Jansen", "shlwapi: Implement AssocGetPerceivedType.", 2 },
  937. { "Mark Jansen", "shlwapi/tests: Add tests for AssocGetPerceivedType.", 1 },
  938. { "Mark Jansen", "version: Test for VerQueryValueA.", 2 },
  939. { "Martin Storsjo", "configure: Avoid clobbering x18 on arm64 within wine.", 1 },
  940. { "Martin Storsjo", "ntdll: Always restore TEB to x18 on aarch 64 on return from calls to builtins.", 1 },
  941. { "Mathieu Comandon", "esync: Add note about file limits not being raised when using systemd.", 1 },
  942. { "Matt Durgavich", "ws2_32: Proper WSACleanup implementation using wineserver function.", 2 },
  943. { "Michael Müller", "aclui: Add basic ACE viewer.", 1 },
  944. { "Michael Müller", "Add licenses for fonts as separate files.", 1 },
  945. { "Michael Müller", "advapi32: Fix error code when calling LsaOpenPolicy for non existing remote machine.", 1 },
  946. { "Michael Müller", "advapi32: Implement CreateRestrictedToken.", 1 },
  947. { "Michael Müller", "advapi32/tests: Add test for perflib registry key.", 1 },
  948. { "Michael Müller", "advapi32/tests: Extend security label / token integrity tests.", 1 },
  949. { "Michael Müller", "advapi32: Use TRACE for LsaOpenPolicy/LsaClose.", 1 },
  950. { "Michael Müller", "comctl32: Preserve custom colors between subitems.", 2 },
  951. { "Michael Müller", "d3d11: Implement ClearDepthStencilView for deferred contexts.", 1 },
  952. { "Michael Müller", "d3d11: Implement ClearRenderTargetView for deferred contexts.", 1 },
  953. { "Michael Müller", "d3d11: Implement CSSetConstantBuffers for deferred contexts.", 1 },
  954. { "Michael Müller", "d3d11: Implement CSSetShader for deferred contexts.", 1 },
  955. { "Michael Müller", "d3d11: Implement CSSetUnorderedAccessViews for deferred contexts.", 1 },
  956. { "Michael Müller", "d3d11: Implement d3d11_deferred_context_UpdateSubresource.", 1 },
  957. { "Michael Müller", "d3d11: Implement Dispatch for deferred contexts.", 1 },
  958. { "Michael Müller", "d3d11: Implement Draw for deferred contexts.", 1 },
  959. { "Michael Müller", "d3d11: Implement restoring of state after executing a command list.", 1 },
  960. { "Michael Müller", "d3d11: Initial implementation for deferred contexts.", 1 },
  961. { "Michael Müller", "d3d9/tests: Check MaxVertexBlendMatrixIndex capability.", 1 },
  962. { "Michael Müller", "d3d9/tests: Test normal calculation when indexed vertex blending is enabled.", 1 },
  963. { "Michael Müller", "ddraw: Allow size and format conversions in IDirect3DTexture2::Load.", 1 },
  964. { "Michael Müller", "ddraw: Create rendering targets in video memory if possible.", 1 },
  965. { "Michael Müller", "ddraw: Don't set HWTRANSFORMANDLIGHT flag on d3d7 RGB device.", 1 },
  966. { "Michael Müller", "ddraw: Implement DDENUMSURFACES_CANBECREATED flag in ddraw7_EnumSurfaces.", 1 },
  967. { "Michael Müller", "ddraw: Remove const from ddraw1_vtbl and ddraw_surface1_vtbl.", 1 },
  968. { "Michael Müller", "ddraw: Set dwZBufferBitDepth in ddraw7_GetCaps.", 1 },
  969. { "Michael Müller", "ddraw/tests: Add more tests for IDirect3DTexture2::Load.", 1 },
  970. { "Michael Müller", "ddraw/tests: Add more tests for IDirectDraw7::EnumSurfaces.", 1 },
  971. { "Michael Müller", "dxdiagn: Calling GetChildContainer with an empty string on a leaf container returns the object itself.", 1 },
  972. { "Michael Müller", "dxdiagn: Enumerate DirectSound devices and add some basic properties.", 1 },
  973. { "Michael Müller", "dxgkrnl.sys: Add stub driver.", 1 },
  974. { "Michael Müller", "dxgmms1.sys: Add stub driver.", 1 },
  975. { "Michael Müller", "dxva2: Add DRM mode for vaapi.", 1 },
  976. { "Michael Müller", "dxva2: Always destroy buffers when calling vaRenderPicture.", 1 },
  977. { "Michael Müller", "dxva2: Fill h264 luma and chroma weights / offsets with default values in case they are not specified.", 1 },
  978. { "Michael Müller", "dxva2: Implement h264 decoder.", 1 },
  979. { "Michael Müller", "dxva2: Implement stubbed DirectX Software VideoProcessor interface.", 1 },
  980. { "Michael Müller", "dxva2: Implement stubbed interfaces for IDirectXVideo{Acceleration,Decoder,Processor}Service.", 1 },
  981. { "Michael Müller", "dxva2: Initial implementation of MPEG2 decoder using vaapi backend.", 1 },
  982. { "Michael Müller", "dxva2: Only declare debug channels when they are actually used.", 1 },
  983. { "Michael Müller", "dxva2/tests: Add tests for dxva2 decoder.", 1 },
  984. { "Michael Müller", "explorer: Create CurrentControlSet\\Control\\Video registry key as non-volatile.", 1 },
  985. { "Michael Müller", "ext-ms-win-appmodel-usercontext-l1-1-0: Add dll and add stub for UserContextExtInitialize.", 1 },
  986. { "Michael Müller", "ext-ms-win-xaml-pal-l1-1-0: Add dll and add stub for XamlBehaviorEnabled.", 1 },
  987. { "Michael Müller", "ext-ms-win-xaml-pal-l1-1-0: Add stub for GetThemeServices.", 1 },
  988. { "Michael Müller", "fsutil: Add fsutil program with support for creating hard links.", 1 },
  989. { "Michael Müller", "iertutil: Add dll and add stub for ordinal 811.", 1 },
  990. { "Michael Müller", "include: Update LDR_MODULE to more recent windows versions.", 1 },
  991. { "Michael Müller", "inseng: Implement CIF reader and download functions.", 1 },
  992. { "Michael Müller", "kernel32: Add stub for SetThreadIdealProcessorEx.", 1 },
  993. { "Michael Müller", "kernel32: Add support for progress callback in CopyFileEx.", 1 },
  994. { "Michael Müller", "kernel32: Implement some processor group functions.", 1 },
  995. { "Michael Müller", "kernel32: Make K32GetPerformanceInfo faster.", 1 },
  996. { "Michael Müller", "kernel32: Strip invalid characters from mask in FindFirstFileExW.", 1 },
  997. { "Michael Müller", "kernel32/tests: Add basic tests for fake dlls.", 1 },
  998. { "Michael Müller", "kernel32/tests: Add tests for FindFirstFileA with invalid characters.", 1 },
  999. { "Michael Müller", "krnl386.exe16: Emulate GDT and LDT access.", 1 },
  1000. { "Michael Müller", "krnl386.exe16: Really translate all invalid console handles into usable DOS handles.", 1 },
  1001. { "Michael Müller", "libs/wine: Use same file alignment for fake and builtin DLLs.", 1 },
  1002. { "Michael Müller", "libwine: Add process specific debug channels.", 1 },
  1003. { "Michael Müller", "loader: Add commandline option --check-libs.", 1 },
  1004. { "Michael Müller", "loader: Print library paths for --check-libs on Mac OS X.", 1 },
  1005. { "Michael Müller", "mmsystem.dll16: Refcount midihdr to work around buggy application which unprepares buffer during a callback.", 1 },
  1006. { "Michael Müller", "mmsystem.dll16: Translate MidiIn messages.", 1 },
  1007. { "Michael Müller", "mountmgr.sys: Write usable device paths into HKLM\\SYSTEM\\MountedDevices.", 1 },
  1008. { "Michael Müller", "mscoree: Implement semi-stub for _CorValidateImage.", 1 },
  1009. { "Michael Müller", "ntdll: Add dummy apiset to PEB.", 1 },
  1010. { "Michael Müller", "ntdll: Add function to create new tokens for elevation purposes.", 1 },
  1011. { "Michael Müller", "ntdll: Add stub for NtContinue.", 1 },
  1012. { "Michael Müller", "ntdll: Allow special characters in pipe names.", 1 },
  1013. { "Michael Müller", "ntdll: Catch windows int 0x2e syscall on i386.", 1 },
  1014. { "Michael Müller", "ntdll: Create thread to update user_shared_data time values when necessary.", 1 },
  1015. { "Michael Müller", "ntdll: Fill out thread times in process enumeration.", 1 },
  1016. { "Michael Müller", "ntdll: Fill process kernel and user time.", 1 },
  1017. { "Michael Müller", "ntdll: Fill process virtual memory counters in NtQuerySystemInformation.", 1 },
  1018. { "Michael Müller", "ntdll: Fix holes in ELF mappings.", 2 },
  1019. { "Michael Müller", "ntdll: Implement HashLinks field in LDR module data.", 1 },
  1020. { "Michael Müller", "ntdll: Implement NtFilterToken.", 1 },
  1021. { "Michael Müller", "ntdll: Implement ObjectTypesInformation in NtQueryObject.", 1 },
  1022. { "Michael Müller", "ntdll: Implement opening files through nt device paths.", 1 },
  1023. { "Michael Müller", "ntdll: Implement process token elevation through manifests.", 1 },
  1024. { "Michael Müller", "ntdll: Implement SystemExtendedHandleInformation in NtQuerySystemInformation.", 1 },
  1025. { "Michael Müller", "ntdll: Mimic object type behavior for different windows versions.", 1 },
  1026. { "Michael Müller", "ntdll: Move NtProtectVirtualMemory and NtCreateSection to separate pages on x86.", 2 },
  1027. { "Michael Müller", "ntdll: Properly handle PAGE_WRITECOPY protection.", 5 },
  1028. { "Michael Müller", "ntdll: Set correct thread creation time for SystemProcessInformation in NtQuerySystemInformation.", 1 },
  1029. { "Michael Müller", "ntdll: Set object type for System(Extended)HandleInformation in NtQuerySystemInformation.", 1 },
  1030. { "Michael Müller", "ntdll: Set process start time.", 1 },
  1031. { "Michael Müller", "ntdll: Set TypeIndex for ObjectTypeInformation in NtQueryObject.", 1 },
  1032. { "Michael Müller", "ntdll: Setup a temporary signal handler during process startup to handle page faults.", 2 },
  1033. { "Michael Müller", "ntdll/tests: Add basic tests for RtlQueryPackageIdentity.", 1 },
  1034. { "Michael Müller", "ntdll: Use HashLinks when searching for a dll using the basename.", 1 },
  1035. { "Michael Müller", "nvapi: Add NvAPI_GetPhysicalGPUsFromLogicalGPU.", 1 },
  1036. { "Michael Müller", "nvapi: Add stub for EnumNvidiaDisplayHandle.", 1 },
  1037. { "Michael Müller", "nvapi: Add stub for NvAPI_D3D9_RegisterResource.", 1 },
  1038. { "Michael Müller", "nvapi: Add stub for NvAPI_D3D_GetCurrentSLIState.", 1 },
  1039. { "Michael Müller", "nvapi: Add stub for NvAPI_D3D_GetObjectHandleForResource.", 1 },
  1040. { "Michael Müller", "nvapi: Add stub for NvAPI_DISP_GetGDIPrimaryDisplayId.", 1 },
  1041. { "Michael Müller", "nvapi: Add stub for NvAPI_EnumPhysicalGPUs.", 1 },
  1042. { "Michael Müller", "nvapi: Add stub for NvAPI_GetLogicalGPUFromDisplay.", 1 },
  1043. { "Michael Müller", "nvapi: Add stub for NvAPI_GPU_GetGpuCoreCount.", 1 },
  1044. { "Michael Müller", "nvapi: Add stub for NvAPI_SYS_GetDriverAndBranchVersion.", 1 },
  1045. { "Michael Müller", "nvapi: Add stub for NvAPI_Unload.", 1 },
  1046. { "Michael Müller", "nvapi: Add stubs for NvAPI_EnumLogicalGPUs and undocumented equivalent.", 1 },
  1047. { "Michael Müller", "nvapi: Add stubs for NvAPI_GPU_GetFullName.", 1 },
  1048. { "Michael Müller", "nvapi: Explicity return NULL for 0x33c7358c and 0x593e8644.", 1 },
  1049. { "Michael Müller", "nvapi: First implementation.", 1 },
  1050. { "Michael Müller", "nvapi: Implement NvAPI_D3D11_CreateDevice and NvAPI_D3D11_CreateDeviceAndSwapChain.", 1 },
  1051. { "Michael Müller", "nvapi: Implement NvAPI_D3D11_SetDepthBoundsTest.", 2 },
  1052. { "Michael Müller", "nvapi: Implement NvAPI_GPU_Get{Physical,Virtual}FrameBufferSize.", 1 },
  1053. { "Michael Müller", "nvapi: Improve NvAPI_D3D_GetCurrentSLIState.", 1 },
  1054. { "Michael Müller", "nvapi/tests: Use structure to list imports.", 1 },
  1055. { "Michael Müller", "nvcuda: Add semi stub for cuD3D10GetDevice.", 1 },
  1056. { "Michael Müller", "nvcuda: Emulate two d3d9 initialization functions.", 1 },
  1057. { "Michael Müller", "nvcuda: First implementation.", 2 },
  1058. { "Michael Müller", "nvcuda: Properly wrap undocumented 'ContextStorage' interface and add tests.", 1 },
  1059. { "Michael Müller", "nvcuda: Search for dylib library on Mac OS X.", 1 },
  1060. { "Michael Müller", "nvcuvid: First implementation.", 2 },
  1061. { "Michael Müller", "nvencodeapi: Add debian specific paths to native library.", 1 },
  1062. { "Michael Müller", "nvencodeapi: Add support for version 6.0.", 1 },
  1063. { "Michael Müller", "nvencodeapi: First implementation.", 1 },
  1064. { "Michael Müller", "opengl32: Treat invalid pixel types as PFD_TYPE_RGBA in wglChoosePixelFormat.", 1 },
  1065. { "Michael Müller", "programs/runas: Basic implementation for starting processes with a different trustlevel.", 1 },
  1066. { "Michael Müller", "programs/winedbg: Print process arguments in info threads.", 1 },
  1067. { "Michael Müller", "programs/winedevice: Load some common drivers and fix ldr order.", 1 },
  1068. { "Michael Müller", "server: Correctly assign security labels for tokens.", 1 },
  1069. { "Michael Müller", "server: Correctly treat zero access mask in duplicate_token wineserver call.", 1 },
  1070. { "Michael Müller", "server: Implement support for creating processes using a token.", 1 },
  1071. { "Michael Müller", "server: Implement support for global and local shared memory blocks based on memfd.", 1 },
  1072. { "Michael Müller", "server: Implement token elevation information.", 1 },
  1073. { "Michael Müller", "server: Implement token integrity level.", 1 },
  1074. { "Michael Müller", "server: Register types during startup.", 1 },
  1075. { "Michael Müller", "server: Rename ObjectType to Type.", 1 },
  1076. { "Michael Müller", "setupapi: Ignore deletion of added files in SetupAddToDiskSpaceList.", 1 },
  1077. { "Michael Müller", "setupapi: Implement SetupAddInstallSectionToDiskSpaceList.", 1 },
  1078. { "Michael Müller", "setupapi: ImplementSetupAddSectionToDiskSpaceList.", 1 },
  1079. { "Michael Müller", "setupapi: Implement SetupAddToDiskSpaceList.", 1 },
  1080. { "Michael Müller", "setupapi: Implement SetupQueryDrivesInDiskSpaceList.", 1 },
  1081. { "Michael Müller", "setupapi: Rewrite DiskSpaceList logic using lists.", 1 },
  1082. { "Michael Müller", "shell32: Add parameter to ISFHelper::DeleteItems to allow deleting files without confirmation.", 1 },
  1083. { "Michael Müller", "shell32: Add security property tab.", 1 },
  1084. { "Michael Müller", "shell32: Add support for setting/getting PREFERREDDROPEFFECT in IDataObject.", 1 },
  1085. { "Michael Müller", "shell32: Correct indentation in shfileop.c.", 1 },
  1086. { "Michael Müller", "shell32: Do not use unixfs for devices without mountpoint.", 1 },
  1087. { "Michael Müller", "shell32: Fix copying of files when using a context menu.", 1 },
  1088. { "Michael Müller", "shell32: Implement file operation progress dialog.", 1 },
  1089. { "Michael Müller", "shell32: Implement insert/paste for item context menus.", 1 },
  1090. { "Michael Müller", "shell32: Implement NewMenu with new folder item.", 1 },
  1091. { "Michael Müller", "shell32: Implement process elevation using runas verb.", 1 },
  1092. { "Michael Müller", "shell32: Pass FILE_INFORMATION into SHNotify* functions.", 1 },
  1093. { "Michael Müller", "shell32: Recognize cut/copy/paste string verbs in item menu context menu.", 1 },
  1094. { "Michael Müller", "shell32: Remove source files when using cut in the context menu.", 1 },
  1095. { "Michael Müller", "shell32: Set return value correctly in DoPaste.", 1 },
  1096. { "Michael Müller", "shell32: Set SFGAO_HASSUBFOLDER correctly for normal shellfolders.", 1 },
  1097. { "Michael Müller", "shell32: Set SFGAO_HASSUBFOLDER correctly for unixfs.", 1 },
  1098. { "Michael Müller", "shell32: Show animation during SHFileOperation.", 1 },
  1099. { "Michael Müller", "tools/winebuild: Add syscall thunks for 64 bit.", 1 },
  1100. { "Michael Müller", "uiautomationcore: Add dll and stub some functions.", 1 },
  1101. { "Michael Müller", "user32: Allow changing the tablet / media center status via wine registry key.", 1 },
  1102. { "Michael Müller", "user32: Decrease minimum SetTimer interval to 5 ms.", 2 },
  1103. { "Michael Müller", "user32: Fix calculation of listbox size when horizontal scrollbar is present.", 1 },
  1104. { "Michael Müller", "user32: Get rid of wineserver call for GetLastInputInfo.", 1 },
  1105. { "Michael Müller", "user32: Start explorer.exe using limited rights.", 1 },
  1106. { "Michael Müller", "uxtheme: Reset FPU flags before calling GTK3 functions.", 1 },
  1107. { "Michael Müller", "win32k.sys: Add stub driver.", 1 },
  1108. { "Michael Müller", "wineboot: Add some generic hardware in HKEY_DYN_DATA\\Config Manager\\Enum.", 1 },
  1109. { "Michael Müller", "wineboot: Initialize proxy settings registry key.", 1 },
  1110. { "Michael Müller", "winebuild: Add stub functions in fake dlls.", 1 },
  1111. { "Michael Müller", "winebuild: Add syscall thunks in fake dlls.", 1 },
  1112. { "Michael Müller", "winebuild: Fix size of relocation information in fake dlls.", 1 },
  1113. { "Michael Müller", "winebuild: Generate syscall thunks for ntdll exports.", 1 },
  1114. { "Michael Müller", "winebuild: Try to make sure RVA matches between fake and builtin DLLs.", 1 },
  1115. { "Michael Müller", "winebuild: Use multipass label system to generate fake dlls.", 1 },
  1116. { "Michael Müller", "winecfg: Add option to enable/disable GTK3 theming.", 1 },
  1117. { "Michael Müller", "winecfg: Add staging tab for CSMT.", 1 },
  1118. { "Michael Müller", "winecfg: Show unmounted devices and allow changing the device value.", 1 },
  1119. { "Michael Müller", "wined3d: Add wined3d_resource_map_info function.", 1 },
  1120. { "Michael Müller", "wined3d: Improve wined3d_cs_emit_update_sub_resource.", 1 },
  1121. { "Michael Müller", "wined3d: Use real values for memory accounting on NVIDIA cards.", 1 },
  1122. { "Michael Müller", "wine.inf: Add 'New' context menu handler entry for directories.", 1 },
  1123. { "Michael Müller", "wine.inf.in: Add invalid dummy certificate to CA certificate store.", 1 },
  1124. { "Michael Müller", "winex11.drv: Allow to select default display frequency in registry key.", 1 },
  1125. { "Michael Müller", "winex11.drv: Indicate direct rendering through OpenGL extension.", 1 },
  1126. { "Michael Müller", "winex11.drv: Only warn about used contexts in wglShareLists.", 1 },
  1127. { "Michael Müller", "wininet: Replacing header fields should fail if they do not exist yet.", 1 },
  1128. { "Michael Müller", "wininet: Strip filename if no path is set in cookie.", 1 },
  1129. { "Michael Müller", "wininet/tests: Add more tests for cookies.", 1 },
  1130. { "Michael Müller", "wininet/tests: Check cookie behaviour when overriding host.", 1 },
  1131. { "Michael Müller", "wininet/tests: Test auth credential reusage with host override.", 1 },
  1132. { "Michael Müller", "winmm: Delay import ole32 msacm32 to workaround bug when loading multiple winmm versions.", 1 },
  1133. { "Michael Müller", "winmm: Do not crash in Win 9X mode when an invalid device ptr is passed to MCI_OPEN.", 1 },
  1134. { "Nakarin Khankham", "opencl: Add OpenCL 1.0 function pointer loader.", 1 },
  1135. { "Nakarin Khankham", "opencl: Add OpenCL 1.1 implementation.", 1 },
  1136. { "Nakarin Khankham", "opencl: Add OpenCL 1.2 implementation.", 1 },
  1137. { "Nakarin Khankham", "opencl: Expose all extensions list to wine.", 1 },
  1138. { "Nakarin Khankham", "opencl: Use function pointer instead of call the function directly.", 1 },
  1139. { "Olivier F. R. Dierick", "kernel32: Implement GetSystemDEPPolicy().", 1 },
  1140. { "Olivier F. R. Dierick", "kernel32: Implement SetProcessDEPPolicy().", 1 },
  1141. { "Olivier F. R. Dierick", "kernel32: Make system DEP policy affect GetProcessDEPPolicy().", 1 },
  1142. { "Ondrej Kraus", "winex11.drv: Fix main Russian keyboard layout.", 1 },
  1143. { "Paul Gofman", "d3d11/tests: Add a basic test for drawing with deferred context.", 1 },
  1144. { "Paul Gofman", "d3d9: Support SWVP vertex shader float constants limits.", 1 },
  1145. { "Paul Gofman", "d3d9/tests: Add test for indexed vertex blending.", 1 },
  1146. { "Paul Gofman", "ddraw: Allow setting texture without DDSCAPS_TEXTURE for software device.", 1 },
  1147. { "Paul Gofman", "libs/wine: Add functions for managing free area list.", 1 },
  1148. { "Paul Gofman", "ntdll: Call NtOpenFile through syscall thunk.", 1 },
  1149. { "Paul Gofman", "ntdll: Force bottom up allocation order for 64 bit arch unless top down is requested.", 1 },
  1150. { "Paul Gofman", "ntdll: Increase step after failed map attempt in try_map_free_area().", 1 },
  1151. { "Paul Gofman", "ntdll: Permanently exclude natively mapped areas from free areas list.", 1 },
  1152. { "Paul Gofman", "ntdll: Stop search on mmap() error in try_map_free_area().", 1 },
  1153. { "Paul Gofman", "ntdll: Support x86_64 syscall emulation.", 1 },
  1154. { "Paul Gofman", "ntdll: Use free area list for virtual memory allocation.", 1 },
  1155. { "Paul Gofman", "ntdll: Use MAP_FIXED_NOREPLACE flag in try_map_free_area() if available.", 1 },
  1156. { "Paul Gofman", "wined3d: Add a setting to workaround 0 * inf problem in shader models 1-3.", 1 },
  1157. { "Paul Gofman", "wined3d: Allow higher world matrix states.", 1 },
  1158. { "Paul Gofman", "wined3d: Report actual vertex shader float constants limit for SWVP device.", 1 },
  1159. { "Paul Gofman", "wined3d: Support indexed vertex blending.", 1 },
  1160. { "Paul Gofman", "wined3d: Support SWVP mode vertex shaders.", 1 },
  1161. { "Paul Gofman", "wined3d: Support SWVP vertex shader constants limit in state tracking.", 1 },
  1162. { "Paul Gofman", "wined3d: Use UBO for vertex shader float constants if supported.", 1 },
  1163. { "Philippe Valembois", "winex11: Fix more key translation.", 1 },
  1164. { "Qian Hong", "atl: Implement AtlAxDialogBox[A,W].", 1 },
  1165. { "Qian Hong", "ntdll: Add fake data implementation for ProcessQuotaLimits class.", 1 },
  1166. { "Qian Hong", "ntdll: Improve invalid paramater handling in NtAccessCheck.", 1 },
  1167. { "Qian Hong", "ntdll: Initialize mod_name to zero.", 1 },
  1168. { "Qian Hong", "ntdll: Set EOF on file which has a memory mapping should fail.", 1 },
  1169. { "Qian Hong", "ntdll/tests: Added tests for open behaviour on readonly files.", 1 },
  1170. { "Qian Hong", "ntdll/tests: Added tests to set disposition on file which is mapped to memory.", 1 },
  1171. { "Qian Hong", "server: Do not allow to set disposition on file which has a file mapping.", 1 },
  1172. { "Rémi Bernon", "dinput8: Add support for dinput devices that use raw input interface.", 1 },
  1173. { "Rémi Bernon", "dinput8/tests: Add test for DISCL_EXCLUSIVE flag interaction with rawinput.", 1 },
  1174. { "Rémi Bernon", "dinput8: Use raw input interface for dinput8 mouse device.", 1 },
  1175. { "Rémi Bernon", "dinput: Set correct rawinput flags for DISCL_EXCLUSIVE.", 1 },
  1176. { "Rémi Bernon", "dinput: Set RIDEV_INPUTSINK flag only when DISCL_BACKGROUND is requested.", 1 },
  1177. { "Rémi Bernon", "hidclass.sys: Send input message to server when HID report is received.", 1 },
  1178. { "Rémi Bernon", "server: Add HID input message type to send_hardware_message request.", 1 },
  1179. { "Rémi Bernon", "server: Add process argument to find_rawinput_device.", 1 },
  1180. { "Rémi Bernon", "server: Add send_hardware_message flags for rawinput translation.", 1 },
  1181. { "Rémi Bernon", "server: Allow extra data for hardware_msg_data message.", 1 },
  1182. { "Rémi Bernon", "server: Also update the key state if RIDEV_NOLEGACY is used.", 1 },
  1183. { "Rémi Bernon", "server: Broadcast rawinput message if request flag is SEND_HWMSG_RAWINPUT.", 1 },
  1184. { "Rémi Bernon", "server: Update desktop cursor pos even if RIDEV_NOLEGACY flag is set.", 1 },
  1185. { "Rémi Bernon", "user32: Add __wine_send_input flags to hint raw input translation.", 1 },
  1186. { "Rémi Bernon", "user32: Implement GetRegisteredRawInputDevices.", 1 },
  1187. { "Rémi Bernon", "user32: Implement WM_INPUT/RIM_TYPEHID message handling.", 1 },
  1188. { "Rémi Bernon", "user32/tests: Add rawinput test for ClipCursor interactions.", 1 },
  1189. { "Rémi Bernon", "user32/tests: Add rawinput test for cross-process interactions.", 1 },
  1190. { "Rémi Bernon", "user32/tests: Add rawinput test for cross-thread interactions.", 1 },
  1191. { "Rémi Bernon", "winex11.drv: Advertise XInput2 version 2.1 support.", 1 },
  1192. { "Rémi Bernon", "winex11.drv: Keep track of pointer and device button mappings.", 1 },
  1193. { "Rémi Bernon", "winex11.drv: Listen to RawMotion and RawButton* events in the desktop thread.", 1 },
  1194. { "Rémi Bernon", "winex11.drv: Send relative RawMotion events unprocessed.", 1 },
  1195. { "Ryan S. Northrup (RyNo)", "user32: Semi-stub GetMouseMovePointsEx.", 2 },
  1196. { "Sebastian Lackner", "advapi32/tests: Add ACL inheritance tests for creating subdirectories with NtCreateFile.", 1 },
  1197. { "Sebastian Lackner", "advapi32/tests: Add tests for ACL inheritance in CreateDirectoryA.", 1 },
  1198. { "Sebastian Lackner", "advapi: Trigger write watches before passing userdata pointer to read syscall.", 1 },
  1199. { "Sebastian Lackner", "configure: Also add the absolute RPATH when linking against libwine.", 1 },
  1200. { "Sebastian Lackner", "d2d1: Avoid implicit cast of interface pointer.", 1 },
  1201. { "Sebastian Lackner", "d3d11: Avoid implicit cast of interface pointer.", 1 },
  1202. { "Sebastian Lackner", "d3d8: Avoid implicit cast of interface pointer.", 1 },
  1203. { "Sebastian Lackner", "d3d9: Avoid implicit cast of interface pointer.", 1 },
  1204. { "Sebastian Lackner", "d3dx9_36: Improve stub for ID3DXEffectImpl_CloneEffect.", 1 },
  1205. { "Sebastian Lackner", "d3dx9_36/tests: Add initial tests for D3DXDisassembleShader.", 1 },
  1206. { "Sebastian Lackner", "dbghelp: Always check for debug symbols in BINDIR.", 1 },
  1207. { "Sebastian Lackner", "ddraw: Avoid implicit cast of interface pointer.", 1 },
  1208. { "Sebastian Lackner", "dsound: Allow disabling of EAX support in the registry.", 1 },
  1209. { "Sebastian Lackner", "dsound: Apply filters before sound is multiplied to speakers.", 1 },
  1210. { "Sebastian Lackner", "dsound: Various improvements to EAX support.", 1 },
  1211. { "Sebastian Lackner", "dwrite: Avoid implicit cast of interface pointer.", 1 },
  1212. { "Sebastian Lackner", "dxva2: Implement semi-stub for Direct3DDeviceManager9 interface.", 1 },
  1213. { "Sebastian Lackner", "fonts: Add Liberation Mono as an Courier New replacement.", 1 },
  1214. { "Sebastian Lackner", "fonts: Add Liberation Serif as an Times New Roman replacement.", 1 },
  1215. { "Sebastian Lackner", "gdi32: Perform lazy initialization of fonts to improve startup performance.", 1 },
  1216. { "Sebastian Lackner", "include: Add cuda.h.", 1 },
  1217. { "Sebastian Lackner", "include: Always define hton/ntoh macros.", 1 },
  1218. { "Sebastian Lackner", "include: Check element type in CONTAINING_RECORD and similar macros.", 1 },
  1219. { "Sebastian Lackner", "include: Move interlocked_inc/dec to port.h.", 1 },
  1220. { "Sebastian Lackner", "iphlpapi: Fallback to system ping when ICMP permissions are not present.", 1 },
  1221. { "Sebastian Lackner", "kernel32: Add winediag message to show warning, that this isn't vanilla wine.", 1 },
  1222. { "Sebastian Lackner", "kernel32: Always start debugger on WinSta0.", 1 },
  1223. { "Sebastian Lackner", "krnl386.exe16: Do not abuse WOW32Reserved field for 16-bit stack address.", 1 },
  1224. { "Sebastian Lackner", "loader: Add commandline option --patches to show the patch list.", 1 },
  1225. { "Sebastian Lackner", "msvcrt: Calculate sinh/cosh/exp/pow with higher precision.", 2 },
  1226. { "Sebastian Lackner", "msxml3: Avoid implicit cast of interface pointer.", 1 },
  1227. { "Sebastian Lackner", "ntdll: Add back SS segment prefixes in set_full_cpu_context.", 1 },
  1228. { "Sebastian Lackner", "ntdll: Add helper function to delete free blocks.", 1 },
  1229. { "Sebastian Lackner", "ntdll: Add inline versions of RtlEnterCriticalSection / RtlLeaveCriticalSections.", 1 },
  1230. { "Sebastian Lackner", "ntdll: Add semi-stub for FileFsVolumeInformation information class.", 1 },
  1231. { "Sebastian Lackner", "ntdll: Add semi-stub for TokenLinkedToken info class.", 1 },
  1232. { "Sebastian Lackner", "ntdll: Add special handling for \\SystemRoot to satisfy MSYS2 case-insensitive system check.", 1 },
  1233. { "Sebastian Lackner", "ntdll: Add support for hiding wine version information from applications.", 1 },
  1234. { "Sebastian Lackner", "ntdll: Allow to query section names from other processes.", 2 },
  1235. { "Sebastian Lackner", "ntdll: Always store SAMBA_XATTR_DOS_ATTRIB when path could be interpreted as hidden.", 1 },
  1236. { "Sebastian Lackner", "ntdll: Do not allow to deallocate thread stack for current thread.", 1 },
  1237. { "Sebastian Lackner", "ntdll: Fix race-condition when threads are killed during shutdown.", 1 },
  1238. { "Sebastian Lackner", "ntdll: Fix return value for missing ACTIVATION_CONTEXT_SECTION_ASSEMBLY_INFORMATION key.", 1 },
  1239. { "Sebastian Lackner", "ntdll: Implement virtual_map_shared_memory.", 1 },
  1240. { "Sebastian Lackner", "ntdll: Improve heap allocation performance.", 2 },
  1241. { "Sebastian Lackner", "ntdll: Improve stub of NtQueryEaFile.", 1 },
  1242. { "Sebastian Lackner", "ntdll: Move code to update user shared data into a separate function.", 1 },
  1243. { "Sebastian Lackner", "ntdll: Only enable wineserver shared memory communication when a special environment variable is set.", 1 },
  1244. { "Sebastian Lackner", "ntdll: OutputDebugString should throw the exception a second time, if a debugger is attached.", 1 },
  1245. { "Sebastian Lackner", "ntdll: Resolve drive symlinks before returning section name.", 1 },
  1246. { "Sebastian Lackner", "ntdll: Return buffer filled with random values from SystemInterruptInformation.", 1 },
  1247. { "Sebastian Lackner", "ntdll: Return correct values in GetThreadTimes() for all threads.", 1 },
  1248. { "Sebastian Lackner", "ntdll: Return fake device type when systemroot is located on virtual disk.", 1 },
  1249. { "Sebastian Lackner", "ntdll: Return STATUS_INVALID_DEVICE_REQUEST when trying to call NtReadFile on directory.", 1 },
  1250. { "Sebastian Lackner", "ntdll: Reuse old async fileio structures if possible.", 1 },
  1251. { "Sebastian Lackner", "ntdll/tests: Add test to ensure section name is full path.", 1 },
  1252. { "Sebastian Lackner", "ntdll: Trigger write watches before passing userdata pointer to wait_reply.", 1 },
  1253. { "Sebastian Lackner", "ntdll: Use fast CS functions for heap locking.", 1 },
  1254. { "Sebastian Lackner", "ntdll: Use fast CS functions for threadpool locking.", 1 },
  1255. { "Sebastian Lackner", "ntoskrnl: Update USER_SHARED_DATA before accessing memory.", 1 },
  1256. { "Sebastian Lackner", "nvcuda: Add stub dll.", 1 },
  1257. { "Sebastian Lackner", "nvcuda: Add support for CUDA 7.0.", 1 },
  1258. { "Sebastian Lackner", "nvcuda: Implement cuModuleLoad wrapper function.", 1 },
  1259. { "Sebastian Lackner", "nvcuda: Implement new functions added in CUDA 6.5.", 1 },
  1260. { "Sebastian Lackner", "nvcuda: Properly wrap stream callbacks by forwarding them to a worker thread.", 1 },
  1261. { "Sebastian Lackner", "ole32: Improve thread-safety of HGLOBALStreamImpl_Read.", 1 },
  1262. { "Sebastian Lackner", "ole32: Improve thread-safety of HGLOBALStreamImpl_Write.", 1 },
  1263. { "Sebastian Lackner", "ole32: Set DebugInfo->Spare[0] for handle_wrapper lock.", 1 },
  1264. { "Sebastian Lackner", "oleaut32: Avoid implicit cast of interface pointer.", 1 },
  1265. { "Sebastian Lackner", "oleaut32: Implement SaveAsFile for PICTYPE_ENHMETAFILE.", 1 },
  1266. { "Sebastian Lackner", "packager: Prefer native version.", 1 },
  1267. { "Sebastian Lackner", "riched20: Silence repeated FIXMEs triggered by Adobe Reader.", 1 },
  1268. { "Sebastian Lackner", "rpcrt4: Avoid implicit cast of interface pointer.", 1 },
  1269. { "Sebastian Lackner", "server: Add a helper function set_sd_from_token_internal to merge two security descriptors.", 1 },
  1270. { "Sebastian Lackner", "server: Allow multiple registry notifications for the same key.", 1 },
  1271. { "Sebastian Lackner", "server: Allow to open files without any permission bits.", 2 },
  1272. { "Sebastian Lackner", "server: Assign random name when no name was passed to create_winstation.", 1 },
  1273. { "Sebastian Lackner", "server: Do not signal violently terminated threads until they are really gone.", 1 },
  1274. { "Sebastian Lackner", "server: FILE_WRITE_ATTRIBUTES should succeed for readonly files.", 1 },
  1275. { "Sebastian Lackner", "server: Fix handling of GetMessage after previous PeekMessage call.", 3 },
  1276. { "Sebastian Lackner", "server: Growing files which are mapped to memory should still work.", 1 },
  1277. { "Sebastian Lackner", "server: Implement locking and synchronization of keystate buffer.", 3 },
  1278. { "Sebastian Lackner", "server: Improve mapping of DACL to file permissions.", 1 },
  1279. { "Sebastian Lackner", "server: Improve STATUS_CANNOT_DELETE checks for directory case.", 1 },
  1280. { "Sebastian Lackner", "server: Introduce a helper function to update the thread_input key state.", 1 },
  1281. { "Sebastian Lackner", "server: Introduce a new alloc_handle object callback.", 2 },
  1282. { "Sebastian Lackner", "server: Introduce refcounting for registry notifications.", 1 },
  1283. { "Sebastian Lackner", "server: Store a list of associated queues for each thread input.", 1 },
  1284. { "Sebastian Lackner", "server: Temporarily store the full security descriptor for file objects.", 1 },
  1285. { "Sebastian Lackner", "server: Track desktop handle count more correctly.", 1 },
  1286. { "Sebastian Lackner", "server: Use all group attributes in create_token.", 1 },
  1287. { "Sebastian Lackner", "server: When creating new directories temporarily give read-permissions until they are opened.", 1 },
  1288. { "Sebastian Lackner", "setupapi: Fix CabinetName passed to SPFILENOTIFY_CABINETINFO handler.", 1 },
  1289. { "Sebastian Lackner", "setupapi/tests: Add tests for cabinet name passed to SPFILENOTIFY_FILEEXTRACTED.", 1 },
  1290. { "Sebastian Lackner", "shlwapi/tests: Add additional tests for UrlCombine and UrlCanonicalize.", 1 },
  1291. { "Sebastian Lackner", "shlwapi: UrlCombineW workaround for relative paths.", 1 },
  1292. { "Sebastian Lackner", "stdole32.tlb: Compile typelib with --oldtlb.", 1 },
  1293. { "Sebastian Lackner", "user32: Avoid unnecessary wineserver calls in PeekMessage/GetMessage.", 1 },
  1294. { "Sebastian Lackner", "user32: Call UpdateWindow() during DIALOG_CreateIndirect.", 1 },
  1295. { "Sebastian Lackner", "user32: Fix handling of invert_y in DrawTextExW.", 1 },
  1296. { "Sebastian Lackner", "user32: Get rid of wineserver call for GetActiveWindow, GetFocus, GetCapture.", 1 },
  1297. { "Sebastian Lackner", "user32: Get rid of wineserver call for GetInputState.", 1 },
  1298. { "Sebastian Lackner", "user32: Refresh MDI menus when DefMDIChildProc(WM_SETTEXT) is called.", 1 },
  1299. { "Sebastian Lackner", "user32/tests: Add tests for clicking through layered window.", 1 },
  1300. { "Sebastian Lackner", "user32/tests: Add tests for DC region.", 1 },
  1301. { "Sebastian Lackner", "user32/tests: Add tests for window region of layered windows.", 1 },
  1302. { "Sebastian Lackner", "uxtheme: Correctly render buttons with GTK >= 3.14.0.", 1 },
  1303. { "Sebastian Lackner", "uxtheme: Fix some incorrect error codes.", 1 },
  1304. { "Sebastian Lackner", "vbscript: Avoid implicit cast of interface pointer.", 1 },
  1305. { "Sebastian Lackner", "widl: Add --oldtlb switch in usage message.", 1 },
  1306. { "Sebastian Lackner", "wineboot: Assign a drive serial number during prefix creation/update.", 1 },
  1307. { "Sebastian Lackner", "wineboot: Init system32/drivers/etc/{host,networks,protocol,services}.", 1 },
  1308. { "Sebastian Lackner", "winecfg: Add checkbox to enable/disable HideWineExports registry key.", 1 },
  1309. { "Sebastian Lackner", "winecfg: Add checkbox to enable/disable vaapi GPU decoder.", 1 },
  1310. { "Sebastian Lackner", "winelib: Append '(Staging)' at the end of the version string.", 1 },
  1311. { "Sebastian Lackner", "winemenubuilder: Create desktop shortcuts with absolute wine path.", 1 },
  1312. { "Sebastian Lackner", "winepulse.drv: Use a separate mainloop and ctx for pulse_test_connect.", 1 },
  1313. { "Sebastian Lackner", "winex11: Enable/disable windows when they are (un)mapped by foreign applications.", 1 },
  1314. { "Sebastian Lackner", "winex11: Fix alpha blending in X11DRV_UpdateLayeredWindow.", 1 },
  1315. { "Sebastian Lackner", "winex11: Implement X11DRV_FLUSH_GDI_DISPLAY ExtEscape command.", 1 },
  1316. { "Sebastian Lackner", "ws2_32: Divide values returned by SO_RCVBUF and SO_SNDBUF getsockopt options by two.", 1 },
  1317. { "Sebastian Lackner", "ws2_32: Fix handling of empty string in WS_getaddrinfo.", 1 },
  1318. { "Sebastian Lackner", "ws2_32: Implement returning the proper time with SO_CONNECT_TIME.", 1 },
  1319. { "Sebastian Lackner", "ws2_32: Invalidate client-side file descriptor cache in WSACleanup.", 1 },
  1320. { "Sebastian Lackner", "ws2_32: Reuse old async ws2_async_io structures if possible.", 1 },
  1321. { "Sebastian Lackner", "wsdapi: Avoid implicit cast of interface pointer.", 1 },
  1322. { "Sebastian Lackner", "wtsapi32: Partial implementation of WTSEnumerateProcessesW.", 1 },
  1323. { "Stanislav Zhukov", "wined3d: Implement WINED3DFMT_B8G8R8X8_UNORM to WINED3DFMT_L8_UNORM conversion.", 1 },
  1324. { "Steve Melenchuk", "d3d11: Allow NULL pointer for initial count in d3d11_deferred_context_CSSetUnorderedAccessViews.", 1 },
  1325. { "Torsten Kurbad", "fonts: Add Liberation Sans as an Arial replacement.", 2 },
  1326. { "Zebediah Figura", "configure: Check for sys/eventfd.h, ppoll(), and shm_open().", 1 },
  1327. { "Zebediah Figura", "esync: Add a README.", 1 },
  1328. { "Zebediah Figura", "esync: Update README.", 1 },
  1329. { "Zebediah Figura", "esync: Update README.", 1 },
  1330. { "Zebediah Figura", "esync: Update README.", 1 },
  1331. { "Zebediah Figura", "esync: Update README.", 1 },
  1332. { "Zebediah Figura", "kernel32/tests: Add some event tests.", 1 },
  1333. { "Zebediah Figura", "kernel32/tests: Add some mutex tests.", 1 },
  1334. { "Zebediah Figura", "kernel32/tests: Add some semaphore tests.", 1 },
  1335. { "Zebediah Figura", "kernel32/tests: Add some tests for wait timeouts.", 1 },
  1336. { "Zebediah Figura", "kernel32/tests: Mark some existing tests as failing under esync.", 1 },
  1337. { "Zebediah Figura", "kernel32/tests: Zigzag test.", 1 },
  1338. { "Zebediah Figura", "makefiles: Only apply non-include-path EXTRAINCL flags to C sources.", 1 },
  1339. { "Zebediah Figura", "ntdll: Add a stub implementation of Wow64Transition.", 1 },
  1340. { "Zebediah Figura", "ntdll: Add stub for NtQuerySystemInformation(SystemExtendedProcessInformation).", 1 },
  1341. { "Zebediah Figura", "ntdll: Avoid fstatat().", 1 },
  1342. { "Zebediah Figura", "ntdll: Avoid server_select() when waiting for critical sections.", 1 },
  1343. { "Zebediah Figura", "ntdll: Cache the esync struct itself instead of a pointer to it.", 1 },
  1344. { "Zebediah Figura", "ntdll: Check the APC fd first.", 1 },
  1345. { "Zebediah Figura", "ntdll: Close esync objects.", 1 },
  1346. { "Zebediah Figura", "ntdll: Correctly allocate the esync handle cache.", 1 },
  1347. { "Zebediah Figura", "ntdll: Create esync objects for events.", 1 },
  1348. { "Zebediah Figura", "ntdll: Create esync objects for mutexes.", 1 },
  1349. { "Zebediah Figura", "ntdll: Create eventfd-based objects for semaphores.", 1 },
  1350. { "Zebediah Figura", "ntdll: Don't call LdrQueryProcessModuleInformation in NtQuerySystemInformation(SystemModuleInformation).", 1 },
  1351. { "Zebediah Figura", "ntdll/esync: Lock accessing the shm_addrs array.", 1 },
  1352. { "Zebediah Figura", "ntdll: Fix a couple of misplaced global variables.", 1 },
  1353. { "Zebediah Figura", "ntdll: Fix a missing break statement.", 1 },
  1354. { "Zebediah Figura", "ntdll: Fix growing the shm_addrs array.", 1 },
  1355. { "Zebediah Figura", "ntdll: Get rid of the per-event spinlock for auto-reset events.", 1 },
  1356. { "Zebediah Figura", "ntdll: Go through the server if necessary when performing event/semaphore/mutex ops.", 1 },
  1357. { "Zebediah Figura", "ntdll: Handle unaligned condition variables when using futexes.", 1 },
  1358. { "Zebediah Figura", "ntdll: Handle unaligned SRW locks when using futexes.", 1 },
  1359. { "Zebediah Figura", "ntdll: Handle unaligned SRW locks when using keyed events.", 1 },
  1360. { "Zebediah Figura", "ntdll: Ignore pseudo-handles.", 1 },
  1361. { "Zebediah Figura", "ntdll: Implement NtOpenEvent().", 1 },
  1362. { "Zebediah Figura", "ntdll: Implement NtOpenMutant().", 1 },
  1363. { "Zebediah Figura", "ntdll: Implement NtPulseEvent().", 1 },
  1364. { "Zebediah Figura", "ntdll: Implement NtQueryEvent().", 1 },
  1365. { "Zebediah Figura", "ntdll: Implement NtQueryMutant().", 1 },
  1366. { "Zebediah Figura", "ntdll: Implement NtQuerySemaphore().", 1 },
  1367. { "Zebediah Figura", "ntdll: Implement NtReleaseMutant().", 1 },
  1368. { "Zebediah Figura", "ntdll: Implement NtReleaseSemaphore().", 1 },
  1369. { "Zebediah Figura", "ntdll: Implement NtResetEvent().", 1 },
  1370. { "Zebediah Figura", "ntdll: Implement NtSetEvent().", 1 },
  1371. { "Zebediah Figura", "ntdll: Implement NtSignalAndWaitForSingleObject().", 1 },
  1372. { "Zebediah Figura", "ntdll: Implement wait-all.", 1 },
  1373. { "Zebediah Figura", "ntdll: Implement waiting on esync objects.", 1 },
  1374. { "Zebediah Figura", "ntdll: Implement waiting on events.", 1 },
  1375. { "Zebediah Figura", "ntdll: Implement waiting on mutexes.", 1 },
  1376. { "Zebediah Figura", "ntdll: Let the server know when we are doing a message wait.", 1 },
  1377. { "Zebediah Figura", "ntdll: Lock creating and opening objects with volatile state.", 1 },
  1378. { "Zebediah Figura", "ntdll: Record the current count of a semaphore locally.", 1 },
  1379. { "Zebediah Figura", "ntdll: Report SegDs to be identical to SegSs on x86_64.", 1 },
  1380. { "Zebediah Figura", "ntdll, server: Abandon esync mutexes on thread exit.", 1 },
  1381. { "Zebediah Figura", "ntdll, server: Abort if esync is enabled for the server but not the client, and vice versa.", 1 },
  1382. { "Zebediah Figura", "ntdll, server: Allow DuplicateHandle() to succeed by implementing esync_get_esync_fd().", 1 },
  1383. { "Zebediah Figura", "ntdll, server: Check the value of WINEESYNC instead of just the presence.", 1 },
  1384. { "Zebediah Figura", "ntdll, server: Implement NtOpenSemaphore().", 1 },
  1385. { "Zebediah Figura", "ntdll, server: Implement waiting on server-bound objects.", 1 },
  1386. { "Zebediah Figura", "ntdll, server: Initialize the shared memory portion on the server side.", 1 },
  1387. { "Zebediah Figura", "ntdll, server: Revert to old implementation of hung queue detection.", 1 },
  1388. { "Zebediah Figura", "ntdll, server: Specify EFD_SEMAPHORE on the server side.", 1 },
  1389. { "Zebediah Figura", "ntdll: Store an event's signaled state internally.", 1 },
  1390. { "Zebediah Figura", "ntdll: Store esync objects locally.", 1 },
  1391. { "Zebediah Figura", "ntdll: Try again if poll() returns EINTR.", 1 },
  1392. { "Zebediah Figura", "ntdll: Try to avoid poll() for uncontended objects.", 1 },
  1393. { "Zebediah Figura", "ntdll: Use shared memory segments to store semaphore and mutex state.", 1 },
  1394. { "Zebediah Figura", "ntdll, wineandroid.drv, winemac.drv, winex11.drv: Store the thread's queue fd in ntdll.", 1 },
  1395. { "Zebediah Figura", "ntdll: Yield during PulseEvent().", 1 },
  1396. { "Zebediah Figura", "Revert \"uxtheme: Build with msvcrt.\".", 1 },
  1397. { "Zebediah Figura", "rpcrt4: Avoid closing the server thread handle while it is being waited on.", 1 },
  1398. { "Zebediah Figura", "server: Add an object operation to grab the esync file descriptor.", 1 },
  1399. { "Zebediah Figura", "server: Add a request to get the eventfd file descriptor associated with a waitable handle.", 1 },
  1400. { "Zebediah Figura", "server: Allocate shared memory segments for semaphores and mutexes.", 1 },
  1401. { "Zebediah Figura", "server: Allow (re)setting esync events on the server side.", 1 },
  1402. { "Zebediah Figura", "server: Alter conditions in is_queue_hung().", 1 },
  1403. { "Zebediah Figura", "server: Alter conditions in is_queue_hung(), again.", 1 },
  1404. { "Zebediah Figura", "server: Create esync file descriptors for true file objects and use them for directory change notifications.", 1 },
  1405. { "Zebediah Figura", "server: Create eventfd descriptors for console_input_events objects.", 1 },
  1406. { "Zebediah Figura", "server: Create eventfd descriptors for device manager objects.", 1 },
  1407. { "Zebediah Figura", "server: Create eventfd descriptors for pseudo-fd objects and use them for named pipes.", 1 },
  1408. { "Zebediah Figura", "server: Create eventfd descriptors for timers.", 1 },
  1409. { "Zebediah Figura", "server: Create eventfd file descriptors for event objects.", 1 },
  1410. { "Zebediah Figura", "server: Create eventfd file descriptors for message queues.", 1 },
  1411. { "Zebediah Figura", "server: Create eventfd file descriptors for process objects.", 1 },
  1412. { "Zebediah Figura", "server: Create eventfd file descriptors for thread objects.", 1 },
  1413. { "Zebediah Figura", "server: Create server objects for eventfd-based synchronization objects.", 1 },
  1414. { "Zebediah Figura", "server: Don't check for a hung queue when sending low-level hooks.", 1 },
  1415. { "Zebediah Figura", "server: Implement esync_map_access().", 1 },
  1416. { "Zebediah Figura", "server, ntdll: Also store the esync type in the server.", 1 },
  1417. { "Zebediah Figura", "server, ntdll: Also wait on the queue fd when waiting for driver events.", 1 },
  1418. { "Zebediah Figura", "server, ntdll: Implement alertable waits.", 1 },
  1419. { "Zebediah Figura", "server, ntdll: Pass the shared memory index back from get_esync_fd.", 1 },
  1420. { "Zebediah Figura", "server: Only signal the APC fd for user APCs.", 1 },
  1421. { "Zebediah Figura", "server: Update the shared memory state when (re)setting an event.", 1 },
  1422. { "Zebediah Figura", "user32: Remove hooks that time out.", 1 },
  1423. { "Zebediah Figura", "=?UTF-8?q?server:=20Try=20to=20remove=20a=20pre?= =?UTF-8?q?=C3=ABxisting=20shm=20file.?=.", 1 },
  1424. { "Zebediah Figura", "wow64cpu: Add stub dll.", 1 },
  1425. { "Zhenbo Li", "mshtml: Add IHTMLLocation::hash property's getter implementation.", 1 },
  1426. { "Zhenbo Li", "shell32: Fix SHFileOperation(FO_MOVE) for creating subdirectories.", 1 },
  1427. { "Zhiyi Zhang", "user32: Send a WM_ACTIVATE message after restoring a minimized window.", 1 },
  1428. { "Zhiyi Zhang", "winepulse.drv: Fix getting the same timing info.", 1 },
  1429. { NULL, NULL, 0 }
  1430. };
  1431. /* return the applied non-standard patches */
  1432. const void *wine_get_patches(void)
  1433. {
  1434. return &wine_patch_data[0];
  1435. }
  1436. /* return the build id string */
  1437. const char *wine_get_build_id(void)
  1438. {
  1439. extern const char wine_build[];
  1440. return wine_build;
  1441. }
  1442. /* exec a binary using the preloader if requested; helper for wine_exec_wine_binary */
  1443. static void preloader_exec( char **argv, int use_preloader )
  1444. {
  1445. if (use_preloader)
  1446. {
  1447. static const char preloader[] = "wine-preloader";
  1448. static const char preloader64[] = "wine64-preloader";
  1449. char *p, *full_name;
  1450. char **last_arg = argv, **new_argv;
  1451. if (!(p = strrchr( argv[0], '/' ))) p = argv[0];
  1452. else p++;
  1453. full_name = xmalloc( p - argv[0] + sizeof(preloader64) );
  1454. memcpy( full_name, argv[0], p - argv[0] );
  1455. if (strendswith( p, "64" ))
  1456. memcpy( full_name + (p - argv[0]), preloader64, sizeof(preloader64) );
  1457. else
  1458. memcpy( full_name + (p - argv[0]), preloader, sizeof(preloader) );
  1459. /* make a copy of argv */
  1460. while (*last_arg) last_arg++;
  1461. new_argv = xmalloc( (last_arg - argv + 2) * sizeof(*argv) );
  1462. memcpy( new_argv + 1, argv, (last_arg - argv + 1) * sizeof(*argv) );
  1463. new_argv[0] = full_name;
  1464. #ifdef __APPLE__
  1465. {
  1466. posix_spawnattr_t attr;
  1467. posix_spawnattr_init( &attr );
  1468. posix_spawnattr_setflags( &attr, POSIX_SPAWN_SETEXEC | _POSIX_SPAWN_DISABLE_ASLR );
  1469. posix_spawn( NULL, full_name, NULL, &attr, new_argv, *_NSGetEnviron() );
  1470. posix_spawnattr_destroy( &attr );
  1471. }
  1472. #endif
  1473. execv( full_name, new_argv );
  1474. free( new_argv );
  1475. free( full_name );
  1476. }
  1477. execv( argv[0], argv );
  1478. }
  1479. /* exec a wine internal binary (either the wine loader or the wine server) */
  1480. void wine_exec_wine_binary( const char *name, char **argv, const char *env_var )
  1481. {
  1482. const char *path, *pos, *ptr;
  1483. int use_preloader;
  1484. if (!name) name = argv0_name; /* no name means default loader */
  1485. #if defined(linux) || defined(__APPLE__)
  1486. use_preloader = !strendswith( name, "wineserver" );
  1487. #else
  1488. use_preloader = 0;
  1489. #endif
  1490. if ((ptr = strrchr( name, '/' )))
  1491. {
  1492. /* if we are in build dir and name contains a path, try that */
  1493. if (build_dir)
  1494. {
  1495. if (wineserver64 && !strcmp( name, "server/wineserver" ))
  1496. argv[0] = xstrdup( wineserver64 );
  1497. else
  1498. argv[0] = build_path( build_dir, name );
  1499. preloader_exec( argv, use_preloader );
  1500. free( argv[0] );
  1501. }
  1502. name = ptr + 1; /* get rid of path */
  1503. }
  1504. /* first, bin directory from the current libdir or argv0 */
  1505. if (bindir)
  1506. {
  1507. argv[0] = build_path( bindir, name );
  1508. preloader_exec( argv, use_preloader );
  1509. free( argv[0] );
  1510. }
  1511. /* then specified environment variable */
  1512. if (env_var)
  1513. {
  1514. argv[0] = (char *)env_var;
  1515. preloader_exec( argv, use_preloader );
  1516. }
  1517. /* now search in the Unix path */
  1518. if ((path = getenv( "PATH" )))
  1519. {
  1520. argv[0] = xmalloc( strlen(path) + strlen(name) + 2 );
  1521. pos = path;
  1522. for (;;)
  1523. {
  1524. while (*pos == ':') pos++;
  1525. if (!*pos) break;
  1526. if (!(ptr = strchr( pos, ':' ))) ptr = pos + strlen(pos);
  1527. memcpy( argv[0], pos, ptr - pos );
  1528. strcpy( argv[0] + (ptr - pos), "/" );
  1529. strcat( argv[0] + (ptr - pos), name );
  1530. preloader_exec( argv, use_preloader );
  1531. pos = ptr;
  1532. }
  1533. free( argv[0] );
  1534. }
  1535. /* and finally try BINDIR */
  1536. argv[0] = build_path( BINDIR, name );
  1537. preloader_exec( argv, use_preloader );
  1538. free( argv[0] );
  1539. }