Hi Paul, minor comments : > programs/winetest/main.c | 60 > +++++++++++++++++++++++++++++++++++++++++++++- > 1 files changed, 59 insertions(+), 1 deletions(-) > > diff --git a/programs/winetest/main.c b/programs/winetest/main.c > index 74a4307..58e520b 100644 > --- a/programs/winetest/main.c > +++ b/programs/winetest/main.c > @@ -44,6 +44,7 @@ struct wine_test > int subtest_count; > char **subtests; > char *exename; > + char *maindllpath; > }; > > char *tag = NULL; > @@ -61,6 +62,9 @@ static unsigned int nb_filters = 0; > static HMODULE hmscoree; > static HRESULT (WINAPI *pLoadLibraryShim)(LPCWSTR, LPCWSTR, LPVOID, HMODULE > *); > > +/* To store the current PATH setting (related to .NET only provided dlls) > */ > +static char *curpath; > + > /* check if test is being filtered out */ > static BOOL test_filtered_out( LPCSTR module, LPCSTR testname ) > { > @@ -341,6 +345,19 @@ static DWORD wait_process( HANDLE process, DWORD > timeout ) > return WAIT_TIMEOUT; > } > > +static void append_path( const char *path) > +{ > + char *newpath; > + > + newpath = xmalloc(strlen(curpath) + 1 + strlen(path) + 1); > + strcpy(newpath, curpath); > + strcat(newpath, ";"); > + strcat(newpath, path); > + SetEnvironmentVariableA("PATH", newpath); > + > + free(newpath); > +} Perhaps use newpath = strmake( NULL, "%s;%s", curpath, path); I don't know. (I used it in a similar patch that I was making yesterday)
> + > /* Run a command for MS milliseconds. If OUT != NULL, also redirect > stdout to there. > > @@ -446,8 +463,16 @@ get_subtests (const char *tempdir, struct wine_test > *test, LPTSTR res_name) > > extract_test (test, tempdir, res_name); > cmd = strmake (NULL, "%s --list", test->exename); > + if (test->maindllpath) { > + /* We need to add the path (to the main dll) to PATH */ > + append_path(test->maindllpath); > + } > status = run_ex (cmd, subfile, tempdir, 5000); > err = GetLastError(); > + if (test->maindllpath) { > + /* Restore PATH again */ > + SetEnvironmentVariableA("PATH", curpath); > + } > free (cmd); > > if (status == -2) > @@ -538,11 +563,27 @@ extract_test_proc (HMODULE hModule, LPCTSTR lpszType, > strcpy(dllname, lpszName); > *strstr(dllname, testexe) = 0; > > + wine_tests[nr_of_files].maindllpath = NULL; > dll = LoadLibraryExA(dllname, NULL, LOAD_LIBRARY_AS_DATAFILE); > if (!dll && pLoadLibraryShim) > { > MultiByteToWideChar(CP_ACP, 0, dllname, -1, dllnameW, MAX_PATH); > - if (FAILED( pLoadLibraryShim(dllnameW, NULL, NULL, &dll) )) dll = > 0; > + if (FAILED( pLoadLibraryShim(dllnameW, NULL, NULL, &dll) )) > + dll = 0; > + else > + { > + char dllpath[MAX_PATH]; dllpath should be declared at start of the function IMHO. > + > + /* We have a dll that cannot be found through LoadLibraryExA. > This > + * is the case for .NET provided dll's. We will add the > directory > + * where the dll resides to the PATH variable when dealing with > + * the tests for this dll. > + */ > + GetModuleFileNameA(dll, dllpath, MAX_PATH); > + *strrchr(dllpath, '\\') = '\0'; > + wine_tests[nr_of_files].maindllpath = xmalloc(strlen(dllpath) + > 1); > + strcpy(wine_tests[nr_of_files].maindllpath, dllpath); > + } This won't work if test needs more than one dll found through LoadLibraryShim > } > if (!dll) { > xprintf (" %s=dll is missing\n", dllname); > @@ -578,6 +619,12 @@ run_tests (char *logname) > DWORD strsize; > SECURITY_ATTRIBUTES sa; > char tmppath[MAX_PATH], tempdir[MAX_PATH+4]; > + DWORD needed; > + > + /* Get the current PATH only once */ > + needed = GetEnvironmentVariableA("PATH", NULL, 0); > + curpath = xmalloc(needed); > + GetEnvironmentVariable("PATH", curpath, needed); This should be GetEnvironmentVariableA. > > SetErrorMode (SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); > > @@ -684,11 +731,21 @@ run_tests (char *logname) > struct wine_test *test = wine_tests + i; > int j; > > + if (test->maindllpath) { > + /* We need to add the path (to the main dll) to PATH */ > + append_path(test->maindllpath); > + } > + > for (j = 0; j < test->subtest_count; j++) { > report (R_STEP, "Running: %s:%s", test->name, > test->subtests[j]); > run_test (test, test->subtests[j], logfile, tempdir); > } > + > + if (test->maindllpath) { > + /* Restore PATH again */ > + SetEnvironmentVariableA("PATH", curpath); > + } > } > report (R_DELTA, 0, "Running: Done"); > > @@ -697,6 +754,7 @@ run_tests (char *logname) > logfile = 0; > remove_dir (tempdir); > free (wine_tests); > + free (curpath); > > return logname; > } I did a similar patch yesterday but forget to set PATH around run_ex in get_subtests so it didn't work when I tested on my W2K Pro test platform. Thanks for your work -- Nicolas Le Cam