1 /* 2 * Unit tests for module/DLL/library API 3 * 4 * Copyright (c) 2004 Eric Pouech 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 21 #include "precomp.h" 22 23 #include <psapi.h> 24 25 static DWORD (WINAPI *pGetDllDirectoryA)(DWORD,LPSTR); 26 static DWORD (WINAPI *pGetDllDirectoryW)(DWORD,LPWSTR); 27 static BOOL (WINAPI *pSetDllDirectoryA)(LPCSTR); 28 static DLL_DIRECTORY_COOKIE (WINAPI *pAddDllDirectory)(const WCHAR*); 29 static BOOL (WINAPI *pRemoveDllDirectory)(DLL_DIRECTORY_COOKIE); 30 static BOOL (WINAPI *pSetDefaultDllDirectories)(DWORD); 31 static BOOL (WINAPI *pGetModuleHandleExA)(DWORD,LPCSTR,HMODULE*); 32 static BOOL (WINAPI *pGetModuleHandleExW)(DWORD,LPCWSTR,HMODULE*); 33 static BOOL (WINAPI *pK32GetModuleInformation)(HANDLE process, HMODULE module, 34 MODULEINFO *modinfo, DWORD cb); 35 36 static BOOL is_unicode_enabled = TRUE; 37 38 static BOOL cmpStrAW(const char* a, const WCHAR* b, DWORD lenA, DWORD lenB) 39 { 40 WCHAR aw[1024]; 41 42 DWORD len = MultiByteToWideChar( AreFileApisANSI() ? CP_ACP : CP_OEMCP, 0, 43 a, lenA, aw, sizeof(aw) / sizeof(aw[0]) ); 44 if (len != lenB) return FALSE; 45 return memcmp(aw, b, len * sizeof(WCHAR)) == 0; 46 } 47 48 static const struct 49 { 50 IMAGE_DOS_HEADER dos; 51 IMAGE_NT_HEADERS nt; 52 IMAGE_SECTION_HEADER section; 53 } dll_image = 54 { 55 { IMAGE_DOS_SIGNATURE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, { 0 }, 0, 0, { 0 }, 56 sizeof(IMAGE_DOS_HEADER) }, 57 { 58 IMAGE_NT_SIGNATURE, /* Signature */ 59 { 60 #if defined __i386__ 61 IMAGE_FILE_MACHINE_I386, /* Machine */ 62 #elif defined __x86_64__ 63 IMAGE_FILE_MACHINE_AMD64, /* Machine */ 64 #elif defined __powerpc__ 65 IMAGE_FILE_MACHINE_POWERPC, /* Machine */ 66 #elif defined __arm__ 67 IMAGE_FILE_MACHINE_ARMNT, /* Machine */ 68 #elif defined __aarch64__ 69 IMAGE_FILE_MACHINE_ARM64, /* Machine */ 70 #else 71 # error You must specify the machine type 72 #endif 73 1, /* NumberOfSections */ 74 0, /* TimeDateStamp */ 75 0, /* PointerToSymbolTable */ 76 0, /* NumberOfSymbols */ 77 sizeof(IMAGE_OPTIONAL_HEADER), /* SizeOfOptionalHeader */ 78 IMAGE_FILE_EXECUTABLE_IMAGE | IMAGE_FILE_DLL /* Characteristics */ 79 }, 80 { IMAGE_NT_OPTIONAL_HDR_MAGIC, /* Magic */ 81 1, /* MajorLinkerVersion */ 82 0, /* MinorLinkerVersion */ 83 0, /* SizeOfCode */ 84 0, /* SizeOfInitializedData */ 85 0, /* SizeOfUninitializedData */ 86 0, /* AddressOfEntryPoint */ 87 0x1000, /* BaseOfCode */ 88 #ifndef _WIN64 89 0, /* BaseOfData */ 90 #endif 91 0x10000000, /* ImageBase */ 92 0x1000, /* SectionAlignment */ 93 0x1000, /* FileAlignment */ 94 4, /* MajorOperatingSystemVersion */ 95 0, /* MinorOperatingSystemVersion */ 96 1, /* MajorImageVersion */ 97 0, /* MinorImageVersion */ 98 4, /* MajorSubsystemVersion */ 99 0, /* MinorSubsystemVersion */ 100 0, /* Win32VersionValue */ 101 0x2000, /* SizeOfImage */ 102 sizeof(IMAGE_DOS_HEADER) + sizeof(IMAGE_NT_HEADERS), /* SizeOfHeaders */ 103 0, /* CheckSum */ 104 IMAGE_SUBSYSTEM_WINDOWS_CUI, /* Subsystem */ 105 0, /* DllCharacteristics */ 106 0, /* SizeOfStackReserve */ 107 0, /* SizeOfStackCommit */ 108 0, /* SizeOfHeapReserve */ 109 0, /* SizeOfHeapCommit */ 110 0, /* LoaderFlags */ 111 0, /* NumberOfRvaAndSizes */ 112 { { 0 } } /* DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] */ 113 } 114 }, 115 { ".rodata", { 0 }, 0x1000, 0x1000, 0, 0, 0, 0, 0, 116 IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ } 117 }; 118 119 static void create_test_dll( const char *name ) 120 { 121 DWORD dummy; 122 HANDLE handle = CreateFileA( name, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, 0 ); 123 124 ok( handle != INVALID_HANDLE_VALUE, "failed to create file err %u\n", GetLastError() ); 125 WriteFile( handle, &dll_image, sizeof(dll_image), &dummy, NULL ); 126 SetFilePointer( handle, dll_image.nt.OptionalHeader.SizeOfImage, NULL, FILE_BEGIN ); 127 SetEndOfFile( handle ); 128 CloseHandle( handle ); 129 } 130 131 static void testGetModuleFileName(const char* name) 132 { 133 HMODULE hMod; 134 char bufA[MAX_PATH]; 135 WCHAR bufW[MAX_PATH]; 136 DWORD len1A, len1W = 0, len2A, len2W = 0; 137 138 hMod = (name) ? GetModuleHandleA(name) : NULL; 139 140 /* first test, with enough space in buffer */ 141 memset(bufA, '-', sizeof(bufA)); 142 SetLastError(0xdeadbeef); 143 len1A = GetModuleFileNameA(hMod, bufA, sizeof(bufA)); 144 ok(GetLastError() == ERROR_SUCCESS || 145 broken(GetLastError() == 0xdeadbeef), /* <= XP SP3 */ 146 "LastError was not reset: %u\n", GetLastError()); 147 ok(len1A > 0, "Getting module filename for handle %p\n", hMod); 148 149 if (is_unicode_enabled) 150 { 151 memset(bufW, '-', sizeof(bufW)); 152 SetLastError(0xdeadbeef); 153 len1W = GetModuleFileNameW(hMod, bufW, sizeof(bufW) / sizeof(WCHAR)); 154 ok(GetLastError() == ERROR_SUCCESS || 155 broken(GetLastError() == 0xdeadbeef), /* <= XP SP3 */ 156 "LastError was not reset: %u\n", GetLastError()); 157 ok(len1W > 0, "Getting module filename for handle %p\n", hMod); 158 } 159 160 ok(len1A == strlen(bufA), "Unexpected length of GetModuleFilenameA (%d/%d)\n", len1A, lstrlenA(bufA)); 161 162 if (is_unicode_enabled) 163 { 164 ok(len1W == lstrlenW(bufW), "Unexpected length of GetModuleFilenameW (%d/%d)\n", len1W, lstrlenW(bufW)); 165 ok(cmpStrAW(bufA, bufW, len1A, len1W), "Comparing GetModuleFilenameAW results\n"); 166 } 167 168 /* second test with a buffer too small */ 169 memset(bufA, '-', sizeof(bufA)); 170 len2A = GetModuleFileNameA(hMod, bufA, len1A / 2); 171 ok(len2A > 0, "Getting module filename for handle %p\n", hMod); 172 173 if (is_unicode_enabled) 174 { 175 memset(bufW, '-', sizeof(bufW)); 176 len2W = GetModuleFileNameW(hMod, bufW, len1W / 2); 177 ok(len2W > 0, "Getting module filename for handle %p\n", hMod); 178 ok(cmpStrAW(bufA, bufW, len2A, len2W), "Comparing GetModuleFilenameAW results with buffer too small\n" ); 179 ok(len1W / 2 == len2W, "Correct length in GetModuleFilenameW with buffer too small (%d/%d)\n", len1W / 2, len2W); 180 } 181 182 ok(len1A / 2 == len2A || 183 len1A / 2 == len2A + 1, /* Win9x */ 184 "Correct length in GetModuleFilenameA with buffer too small (%d/%d)\n", len1A / 2, len2A); 185 } 186 187 static void testGetModuleFileName_Wrong(void) 188 { 189 char bufA[MAX_PATH]; 190 WCHAR bufW[MAX_PATH]; 191 192 /* test wrong handle */ 193 if (is_unicode_enabled) 194 { 195 bufW[0] = '*'; 196 ok(GetModuleFileNameW((void*)0xffffffff, bufW, sizeof(bufW) / sizeof(WCHAR)) == 0, "Unexpected success in module handle\n"); 197 ok(bufW[0] == '*', "When failing, buffer shouldn't be written to\n"); 198 } 199 200 bufA[0] = '*'; 201 ok(GetModuleFileNameA((void*)0xffffffff, bufA, sizeof(bufA)) == 0, "Unexpected success in module handle\n"); 202 ok(bufA[0] == '*' || 203 bufA[0] == 0 /* Win9x */, 204 "When failing, buffer shouldn't be written to\n"); 205 } 206 207 static void testLoadLibraryA(void) 208 { 209 HMODULE hModule, hModule1; 210 FARPROC fp; 211 212 SetLastError(0xdeadbeef); 213 hModule = LoadLibraryA("kernel32.dll"); 214 ok( hModule != NULL, "kernel32.dll should be loadable\n"); 215 ok( GetLastError() == 0xdeadbeef, "GetLastError should be 0xdeadbeef but is %d\n", GetLastError()); 216 217 fp = GetProcAddress(hModule, "CreateFileA"); 218 ok( fp != NULL, "CreateFileA should be there\n"); 219 ok( GetLastError() == 0xdeadbeef, "GetLastError should be 0xdeadbeef but is %d\n", GetLastError()); 220 221 SetLastError(0xdeadbeef); 222 hModule1 = LoadLibraryA("kernel32 "); 223 /* Only winNT does this */ 224 if (GetLastError() != ERROR_DLL_NOT_FOUND) 225 { 226 ok( hModule1 != NULL, "\"kernel32 \" should be loadable\n"); 227 ok( GetLastError() == 0xdeadbeef, "GetLastError should be 0xdeadbeef but is %d\n", GetLastError()); 228 ok( hModule == hModule1, "Loaded wrong module\n"); 229 FreeLibrary(hModule1); 230 } 231 FreeLibrary(hModule); 232 } 233 234 static void testNestedLoadLibraryA(void) 235 { 236 static const char dllname[] = "shell32.dll"; 237 char path1[MAX_PATH], path2[MAX_PATH]; 238 HMODULE hModule1, hModule2, hModule3; 239 240 /* This is not really a Windows conformance test, but more a Wine 241 * regression test. Wine's builtin dlls can be loaded from multiple paths, 242 * and this test tries to make sure that Wine does not get confused and 243 * really unloads the Unix .so file at the right time. Failure to do so 244 * will result in the dll being unloadable. 245 * This test must be done with a dll that can be unloaded, which means: 246 * - it must not already be loaded 247 * - it must not have a 16-bit counterpart 248 */ 249 GetWindowsDirectoryA(path1, sizeof(path1)); 250 strcat(path1, "\\system\\"); 251 strcat(path1, dllname); 252 hModule1 = LoadLibraryA(path1); 253 if (!hModule1) 254 { 255 /* We must be on Windows NT, so we cannot test */ 256 return; 257 } 258 259 GetWindowsDirectoryA(path2, sizeof(path2)); 260 strcat(path2, "\\system32\\"); 261 strcat(path2, dllname); 262 hModule2 = LoadLibraryA(path2); 263 if (!hModule2) 264 { 265 /* We must be on Windows 9x, so we cannot test */ 266 ok(FreeLibrary(hModule1), "FreeLibrary() failed\n"); 267 return; 268 } 269 270 /* The first LoadLibrary() call may have registered the dll under the 271 * system32 path. So load it, again, under the '...\system\...' path so 272 * Wine does not immediately notice that it is already loaded. 273 */ 274 hModule3 = LoadLibraryA(path1); 275 ok(hModule3 != NULL, "LoadLibrary(%s) failed\n", path1); 276 277 /* Now fully unload the dll */ 278 ok(FreeLibrary(hModule3), "FreeLibrary() failed\n"); 279 ok(FreeLibrary(hModule2), "FreeLibrary() failed\n"); 280 ok(FreeLibrary(hModule1), "FreeLibrary() failed\n"); 281 ok(GetModuleHandleA(dllname) == NULL, "%s was not fully unloaded\n", dllname); 282 283 /* Try to load the dll again, if refcounting is ok, this should work */ 284 hModule1 = LoadLibraryA(path1); 285 ok(hModule1 != NULL, "LoadLibrary(%s) failed\n", path1); 286 if (hModule1 != NULL) 287 ok(FreeLibrary(hModule1), "FreeLibrary() failed\n"); 288 } 289 290 static void testLoadLibraryA_Wrong(void) 291 { 292 HMODULE hModule; 293 294 /* Try to load a nonexistent dll */ 295 SetLastError(0xdeadbeef); 296 hModule = LoadLibraryA("non_ex_pv.dll"); 297 ok( !hModule, "non_ex_pv.dll should be not loadable\n"); 298 ok( GetLastError() == ERROR_MOD_NOT_FOUND || GetLastError() == ERROR_DLL_NOT_FOUND, 299 "Expected ERROR_MOD_NOT_FOUND or ERROR_DLL_NOT_FOUND (win9x), got %d\n", GetLastError()); 300 301 /* Just in case */ 302 FreeLibrary(hModule); 303 } 304 305 static void testGetProcAddress_Wrong(void) 306 { 307 FARPROC fp; 308 309 SetLastError(0xdeadbeef); 310 fp = GetProcAddress(NULL, "non_ex_call"); 311 ok( !fp, "non_ex_call should not be found\n"); 312 ok( GetLastError() == ERROR_PROC_NOT_FOUND || GetLastError() == ERROR_INVALID_HANDLE, 313 "Expected ERROR_PROC_NOT_FOUND or ERROR_INVALID_HANDLE(win9x), got %d\n", GetLastError()); 314 315 SetLastError(0xdeadbeef); 316 fp = GetProcAddress((HMODULE)0xdeadbeef, "non_ex_call"); 317 ok( !fp, "non_ex_call should not be found\n"); 318 ok( GetLastError() == ERROR_MOD_NOT_FOUND || GetLastError() == ERROR_INVALID_HANDLE, 319 "Expected ERROR_MOD_NOT_FOUND or ERROR_INVALID_HANDLE(win9x), got %d\n", GetLastError()); 320 } 321 322 static void testLoadLibraryEx(void) 323 { 324 CHAR path[MAX_PATH]; 325 HMODULE hmodule; 326 HANDLE hfile; 327 BOOL ret; 328 329 hfile = CreateFileA("testfile.dll", GENERIC_READ | GENERIC_WRITE, 330 FILE_SHARE_READ | FILE_SHARE_WRITE, 331 NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 332 ok(hfile != INVALID_HANDLE_VALUE, "Expected a valid file handle\n"); 333 334 /* NULL lpFileName */ 335 if (is_unicode_enabled) 336 { 337 SetLastError(0xdeadbeef); 338 hmodule = LoadLibraryExA(NULL, NULL, 0); 339 ok(hmodule == 0, "Expected 0, got %p\n", hmodule); 340 ok(GetLastError() == ERROR_MOD_NOT_FOUND || 341 GetLastError() == ERROR_INVALID_PARAMETER, /* win9x */ 342 "Expected ERROR_MOD_NOT_FOUND or ERROR_INVALID_PARAMETER, got %d\n", 343 GetLastError()); 344 } 345 else 346 win_skip("NULL filename crashes on WinMe\n"); 347 348 /* empty lpFileName */ 349 SetLastError(0xdeadbeef); 350 hmodule = LoadLibraryExA("", NULL, 0); 351 ok(hmodule == 0, "Expected 0, got %p\n", hmodule); 352 ok(GetLastError() == ERROR_MOD_NOT_FOUND || 353 GetLastError() == ERROR_DLL_NOT_FOUND /* win9x */ || 354 GetLastError() == ERROR_INVALID_PARAMETER /* win8 */, 355 "Expected ERROR_MOD_NOT_FOUND or ERROR_DLL_NOT_FOUND, got %d\n", 356 GetLastError()); 357 358 /* hFile is non-NULL */ 359 SetLastError(0xdeadbeef); 360 hmodule = LoadLibraryExA("testfile.dll", hfile, 0); 361 ok(hmodule == 0, "Expected 0, got %p\n", hmodule); 362 todo_wine 363 { 364 ok(GetLastError() == ERROR_SHARING_VIOLATION || 365 GetLastError() == ERROR_INVALID_PARAMETER || /* win2k3 */ 366 GetLastError() == ERROR_FILE_NOT_FOUND, /* win9x */ 367 "Unexpected last error, got %d\n", GetLastError()); 368 } 369 370 SetLastError(0xdeadbeef); 371 hmodule = LoadLibraryExA("testfile.dll", (HANDLE)0xdeadbeef, 0); 372 ok(hmodule == 0, "Expected 0, got %p\n", hmodule); 373 todo_wine 374 { 375 ok(GetLastError() == ERROR_SHARING_VIOLATION || 376 GetLastError() == ERROR_INVALID_PARAMETER || /* win2k3 */ 377 GetLastError() == ERROR_FILE_NOT_FOUND, /* win9x */ 378 "Unexpected last error, got %d\n", GetLastError()); 379 } 380 381 /* try to open a file that is locked */ 382 SetLastError(0xdeadbeef); 383 hmodule = LoadLibraryExA("testfile.dll", NULL, 0); 384 ok(hmodule == 0, "Expected 0, got %p\n", hmodule); 385 todo_wine 386 { 387 ok(GetLastError() == ERROR_SHARING_VIOLATION || 388 GetLastError() == ERROR_FILE_NOT_FOUND, /* win9x */ 389 "Expected ERROR_SHARING_VIOLATION or ERROR_FILE_NOT_FOUND, got %d\n", 390 GetLastError()); 391 } 392 393 /* lpFileName does not matter */ 394 if (is_unicode_enabled) 395 { 396 SetLastError(0xdeadbeef); 397 hmodule = LoadLibraryExA(NULL, hfile, 0); 398 ok(hmodule == 0, "Expected 0, got %p\n", hmodule); 399 ok(GetLastError() == ERROR_MOD_NOT_FOUND || 400 GetLastError() == ERROR_INVALID_PARAMETER, /* win2k3 */ 401 "Expected ERROR_MOD_NOT_FOUND or ERROR_INVALID_PARAMETER, got %d\n", 402 GetLastError()); 403 } 404 405 CloseHandle(hfile); 406 407 /* load empty file */ 408 SetLastError(0xdeadbeef); 409 hmodule = LoadLibraryExA("testfile.dll", NULL, LOAD_LIBRARY_AS_DATAFILE); 410 ok(hmodule == 0, "Expected 0, got %p\n", hmodule); 411 todo_wine 412 { 413 ok(GetLastError() == ERROR_FILE_INVALID || 414 GetLastError() == ERROR_BAD_FORMAT, /* win9x */ 415 "Expected ERROR_FILE_INVALID or ERROR_BAD_FORMAT, got %d\n", 416 GetLastError()); 417 } 418 419 DeleteFileA("testfile.dll"); 420 421 GetSystemDirectoryA(path, MAX_PATH); 422 if (path[lstrlenA(path) - 1] != '\\') 423 lstrcatA(path, "\\"); 424 lstrcatA(path, "kernel32.dll"); 425 426 /* load kernel32.dll with an absolute path */ 427 SetLastError(0xdeadbeef); 428 hmodule = LoadLibraryExA(path, NULL, LOAD_LIBRARY_AS_DATAFILE); 429 ok(hmodule != 0, "Expected valid module handle\n"); 430 ok(GetLastError() == 0xdeadbeef || 431 GetLastError() == ERROR_SUCCESS, /* win9x */ 432 "Expected 0xdeadbeef or ERROR_SUCCESS, got %d\n", GetLastError()); 433 434 /* try invalid file handle */ 435 SetLastError(0xdeadbeef); 436 hmodule = LoadLibraryExA(path, (HANDLE)0xdeadbeef, 0); 437 if (!hmodule) /* succeeds on xp and older */ 438 ok(GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError()); 439 440 FreeLibrary(hmodule); 441 442 /* load kernel32.dll with no path */ 443 SetLastError(0xdeadbeef); 444 hmodule = LoadLibraryExA("kernel32.dll", NULL, LOAD_LIBRARY_AS_DATAFILE); 445 ok(hmodule != 0, "Expected valid module handle\n"); 446 ok(GetLastError() == 0xdeadbeef || 447 GetLastError() == ERROR_SUCCESS, /* win9x */ 448 "Expected 0xdeadbeef or ERROR_SUCCESS, got %d\n", GetLastError()); 449 450 FreeLibrary(hmodule); 451 452 GetCurrentDirectoryA(MAX_PATH, path); 453 if (path[lstrlenA(path) - 1] != '\\') 454 lstrcatA(path, "\\"); 455 lstrcatA(path, "kernel32.dll"); 456 457 /* load kernel32.dll with an absolute path that does not exist */ 458 SetLastError(0xdeadbeef); 459 hmodule = LoadLibraryExA(path, NULL, LOAD_LIBRARY_AS_DATAFILE); 460 todo_wine 461 { 462 ok(hmodule == 0, "Expected 0, got %p\n", hmodule); 463 } 464 ok(GetLastError() == ERROR_FILE_NOT_FOUND || 465 broken(GetLastError() == ERROR_INVALID_HANDLE), /* nt4 */ 466 "Expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); 467 468 /* Free the loaded dll when it's the first time this dll is loaded 469 in process - First time should pass, second fail */ 470 SetLastError(0xdeadbeef); 471 hmodule = LoadLibraryExA("comctl32.dll", NULL, LOAD_LIBRARY_AS_DATAFILE); 472 ok(hmodule != 0, "Expected valid module handle\n"); 473 474 SetLastError(0xdeadbeef); 475 ret = FreeLibrary(hmodule); 476 ok(ret, "Expected to be able to free the module, failed with %d\n", GetLastError()); 477 SetLastError(0xdeadbeef); 478 ret = FreeLibrary(hmodule); 479 ok(!ret, "Unexpected ability to free the module, failed with %d\n", GetLastError()); 480 481 /* load with full path, name without extension */ 482 GetSystemDirectoryA(path, MAX_PATH); 483 if (path[lstrlenA(path) - 1] != '\\') 484 lstrcatA(path, "\\"); 485 lstrcatA(path, "kernel32"); 486 hmodule = LoadLibraryExA(path, NULL, 0); 487 ok(hmodule != NULL, "got %p\n", hmodule); 488 FreeLibrary(hmodule); 489 490 /* same with alterate search path */ 491 hmodule = LoadLibraryExA(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); 492 ok(hmodule != NULL, "got %p\n", hmodule); 493 FreeLibrary(hmodule); 494 } 495 496 static void test_LoadLibraryEx_search_flags(void) 497 { 498 static const struct 499 { 500 int add_dirs[4]; 501 int dll_dir; 502 int expect; 503 } tests[] = 504 { 505 { { 1, 2, 3 }, 4, 3 }, /* 0 */ 506 { { 1, 3, 2 }, 4, 2 }, 507 { { 3, 1 }, 4, 1 }, 508 { { 5, 6 }, 4, 4 }, 509 { { 5, 2 }, 4, 2 }, 510 { { 0 }, 4, 4 }, /* 5 */ 511 { { 0 }, 0, 0 }, 512 { { 6, 5 }, 5, 0 }, 513 { { 1, 1, 2 }, 0, 2 }, 514 }; 515 char *p, path[MAX_PATH], buf[MAX_PATH]; 516 WCHAR bufW[MAX_PATH]; 517 DLL_DIRECTORY_COOKIE cookies[4]; 518 unsigned int i, j, k; 519 BOOL ret; 520 HMODULE mod; 521 522 if (!pAddDllDirectory || !pSetDllDirectoryA) return; 523 524 GetTempPathA( sizeof(path), path ); 525 GetTempFileNameA( path, "tmp", 0, buf ); 526 DeleteFileA( buf ); 527 ret = CreateDirectoryA( buf, NULL ); 528 ok( ret, "CreateDirectory failed err %u\n", GetLastError() ); 529 p = buf + strlen( buf ); 530 for (i = 1; i <= 6; i++) 531 { 532 sprintf( p, "\\%u", i ); 533 ret = CreateDirectoryA( buf, NULL ); 534 ok( ret, "CreateDirectory failed err %u\n", GetLastError() ); 535 if (i >= 5) continue; /* dirs 5 and 6 are left empty */ 536 sprintf( p, "\\%u\\winetestdll.dll", i ); 537 create_test_dll( buf ); 538 } 539 SetLastError( 0xdeadbeef ); 540 mod = LoadLibraryExA( "winetestdll.dll", 0, LOAD_LIBRARY_SEARCH_APPLICATION_DIR ); 541 ok( !mod, "LoadLibrary succeeded\n" ); 542 ok( GetLastError() == ERROR_MOD_NOT_FOUND, "wrong error %u\n", GetLastError() ); 543 544 SetLastError( 0xdeadbeef ); 545 mod = LoadLibraryExA( "winetestdll.dll", 0, LOAD_LIBRARY_SEARCH_USER_DIRS ); 546 ok( !mod, "LoadLibrary succeeded\n" ); 547 ok( GetLastError() == ERROR_MOD_NOT_FOUND || broken(GetLastError() == ERROR_NOT_ENOUGH_MEMORY), 548 "wrong error %u\n", GetLastError() ); 549 550 SetLastError( 0xdeadbeef ); 551 mod = LoadLibraryExA( "winetestdll.dll", 0, LOAD_LIBRARY_SEARCH_SYSTEM32 ); 552 ok( !mod, "LoadLibrary succeeded\n" ); 553 ok( GetLastError() == ERROR_MOD_NOT_FOUND, "wrong error %u\n", GetLastError() ); 554 555 SetLastError( 0xdeadbeef ); 556 mod = LoadLibraryExA( "winetestdll.dll", 0, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR ); 557 ok( !mod, "LoadLibrary succeeded\n" ); 558 ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() ); 559 560 SetLastError( 0xdeadbeef ); 561 mod = LoadLibraryExA( "winetestdll.dll", 0, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | LOAD_LIBRARY_SEARCH_SYSTEM32 ); 562 ok( !mod, "LoadLibrary succeeded\n" ); 563 ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() ); 564 565 SetLastError( 0xdeadbeef ); 566 mod = LoadLibraryExA( "foo\\winetestdll.dll", 0, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR ); 567 ok( !mod, "LoadLibrary succeeded\n" ); 568 ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() ); 569 570 SetLastError( 0xdeadbeef ); 571 mod = LoadLibraryExA( "\\windows\\winetestdll.dll", 0, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR ); 572 ok( !mod, "LoadLibrary succeeded\n" ); 573 ok( GetLastError() == ERROR_MOD_NOT_FOUND, "wrong error %u\n", GetLastError() ); 574 575 for (j = 0; j < sizeof(tests) / sizeof(tests[0]); j++) 576 { 577 for (k = 0; tests[j].add_dirs[k]; k++) 578 { 579 sprintf( p, "\\%u", tests[j].add_dirs[k] ); 580 MultiByteToWideChar( CP_ACP, 0, buf, -1, bufW, MAX_PATH ); 581 cookies[k] = pAddDllDirectory( bufW ); 582 ok( cookies[k] != NULL, "failed to add %s\n", buf ); 583 } 584 if (tests[j].dll_dir) 585 { 586 sprintf( p, "\\%u", tests[j].dll_dir ); 587 pSetDllDirectoryA( buf ); 588 } 589 else pSetDllDirectoryA( NULL ); 590 591 SetLastError( 0xdeadbeef ); 592 mod = LoadLibraryExA( "winetestdll.dll", 0, LOAD_LIBRARY_SEARCH_USER_DIRS ); 593 if (tests[j].expect) 594 { 595 ok( mod != NULL, "%u: LoadLibrary failed err %u\n", j, GetLastError() ); 596 GetModuleFileNameA( mod, path, MAX_PATH ); 597 sprintf( p, "\\%u\\winetestdll.dll", tests[j].expect ); 598 ok( !lstrcmpiA( path, buf ), "%u: wrong module %s expected %s\n", j, path, buf ); 599 } 600 else 601 { 602 ok( !mod, "%u: LoadLibrary succeeded\n", j ); 603 ok( GetLastError() == ERROR_MOD_NOT_FOUND || broken(GetLastError() == ERROR_NOT_ENOUGH_MEMORY), 604 "%u: wrong error %u\n", j, GetLastError() ); 605 } 606 FreeLibrary( mod ); 607 608 for (k = 0; tests[j].add_dirs[k]; k++) pRemoveDllDirectory( cookies[k] ); 609 } 610 611 for (i = 1; i <= 6; i++) 612 { 613 sprintf( p, "\\%u\\winetestdll.dll", i ); 614 DeleteFileA( buf ); 615 sprintf( p, "\\%u", i ); 616 RemoveDirectoryA( buf ); 617 } 618 *p = 0; 619 RemoveDirectoryA( buf ); 620 } 621 622 static void testGetDllDirectory(void) 623 { 624 CHAR bufferA[MAX_PATH]; 625 WCHAR bufferW[MAX_PATH]; 626 DWORD length, ret; 627 int i; 628 static const char *dll_directories[] = 629 { 630 "", 631 "C:\\Some\\Path", 632 "C:\\Some\\Path\\", 633 "Q:\\A\\Long\\Path with spaces that\\probably\\doesn't exist!", 634 }; 635 const int test_count = sizeof(dll_directories) / sizeof(dll_directories[0]); 636 637 if (!pGetDllDirectoryA || !pGetDllDirectoryW) 638 { 639 win_skip("GetDllDirectory not available\n"); 640 return; 641 } 642 if (!pSetDllDirectoryA) 643 { 644 win_skip("SetDllDirectoryA not available\n"); 645 return; 646 } 647 648 for (i = 0; i < test_count; i++) 649 { 650 length = strlen(dll_directories[i]); 651 if (!pSetDllDirectoryA(dll_directories[i])) 652 { 653 skip("i=%d, SetDllDirectoryA failed\n", i); 654 continue; 655 } 656 657 /* no buffer, determine length */ 658 ret = pGetDllDirectoryA(0, NULL); 659 ok(ret == length + 1, "Expected %u, got %u\n", length + 1, ret); 660 661 ret = pGetDllDirectoryW(0, NULL); 662 ok(ret == length + 1, "Expected %u, got %u\n", length + 1, ret); 663 664 /* buffer of exactly the right size */ 665 bufferA[length] = 'A'; 666 bufferA[length + 1] = 'A'; 667 ret = pGetDllDirectoryA(length + 1, bufferA); 668 ok(ret == length || broken(ret + 1 == length) /* win8 */, 669 "i=%d, Expected %u(+1), got %u\n", i, length, ret); 670 ok(bufferA[length + 1] == 'A', "i=%d, Buffer overflow\n", i); 671 ok(strcmp(bufferA, dll_directories[i]) == 0, "i=%d, Wrong path returned: '%s'\n", i, bufferA); 672 673 bufferW[length] = 'A'; 674 bufferW[length + 1] = 'A'; 675 ret = pGetDllDirectoryW(length + 1, bufferW); 676 ok(ret == length, "i=%d, Expected %u, got %u\n", i, length, ret); 677 ok(bufferW[length + 1] == 'A', "i=%d, Buffer overflow\n", i); 678 ok(cmpStrAW(dll_directories[i], bufferW, length, length), 679 "i=%d, Wrong path returned: %s\n", i, wine_dbgstr_w(bufferW)); 680 681 /* Zero size buffer. The buffer may or may not be terminated depending 682 * on the Windows version and whether the A or W API is called. */ 683 bufferA[0] = 'A'; 684 ret = pGetDllDirectoryA(0, bufferA); 685 ok(ret == length + 1, "i=%d, Expected %u, got %u\n", i, length + 1, ret); 686 687 bufferW[0] = 'A'; 688 ret = pGetDllDirectoryW(0, bufferW); 689 ok(ret == length + 1, "i=%d, Expected %u, got %u\n", i, length + 1, ret); 690 ok(bufferW[0] == 0 || /* XP, 2003 */ 691 broken(bufferW[0] == 'A'), "i=%d, Buffer overflow\n", i); 692 693 /* buffer just one too short */ 694 bufferA[0] = 'A'; 695 ret = pGetDllDirectoryA(length, bufferA); 696 ok(ret == length + 1, "i=%d, Expected %u, got %u\n", i, length + 1, ret); 697 if (length != 0) 698 ok(bufferA[0] == 0, "i=%d, Buffer not null terminated\n", i); 699 700 bufferW[0] = 'A'; 701 ret = pGetDllDirectoryW(length, bufferW); 702 ok(ret == length + 1, "i=%d, Expected %u, got %u\n", i, length + 1, ret); 703 ok(bufferW[0] == 0 || /* XP, 2003 */ 704 broken(bufferW[0] == 'A'), "i=%d, Buffer overflow\n", i); 705 706 if (0) 707 { 708 /* crashes on win8 */ 709 /* no buffer, but too short length */ 710 ret = pGetDllDirectoryA(length, NULL); 711 ok(ret == length + 1, "i=%d, Expected %u, got %u\n", i, length + 1, ret); 712 713 ret = pGetDllDirectoryW(length, NULL); 714 ok(ret == length + 1, "i=%d, Expected %u, got %u\n", i, length + 1, ret); 715 } 716 } 717 718 /* unset whatever we did so following tests won't be affected */ 719 pSetDllDirectoryA(NULL); 720 } 721 722 static void init_pointers(void) 723 { 724 HMODULE hKernel32 = GetModuleHandleA("kernel32.dll"); 725 726 #define MAKEFUNC(f) (p##f = (void*)GetProcAddress(hKernel32, #f)) 727 MAKEFUNC(GetDllDirectoryA); 728 MAKEFUNC(GetDllDirectoryW); 729 MAKEFUNC(SetDllDirectoryA); 730 MAKEFUNC(AddDllDirectory); 731 MAKEFUNC(RemoveDllDirectory); 732 MAKEFUNC(SetDefaultDllDirectories); 733 MAKEFUNC(GetModuleHandleExA); 734 MAKEFUNC(GetModuleHandleExW); 735 MAKEFUNC(K32GetModuleInformation); 736 #undef MAKEFUNC 737 738 /* not all Windows versions export this in kernel32 */ 739 if (!pK32GetModuleInformation) 740 { 741 HMODULE hPsapi = LoadLibraryA("psapi.dll"); 742 if (hPsapi) 743 { 744 pK32GetModuleInformation = (void *)GetProcAddress(hPsapi, "GetModuleInformation"); 745 if (!pK32GetModuleInformation) FreeLibrary(hPsapi); 746 } 747 } 748 749 } 750 751 static void testGetModuleHandleEx(void) 752 { 753 static const WCHAR kernel32W[] = {'k','e','r','n','e','l','3','2',0}; 754 static const WCHAR nosuchmodW[] = {'n','o','s','u','c','h','m','o','d',0}; 755 BOOL ret; 756 DWORD error; 757 HMODULE mod, mod_kernel32; 758 759 if (!pGetModuleHandleExA || !pGetModuleHandleExW) 760 { 761 win_skip( "GetModuleHandleEx not available\n" ); 762 return; 763 } 764 765 SetLastError( 0xdeadbeef ); 766 ret = pGetModuleHandleExA( 0, NULL, NULL ); 767 error = GetLastError(); 768 ok( !ret, "unexpected success\n" ); 769 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error ); 770 771 SetLastError( 0xdeadbeef ); 772 ret = pGetModuleHandleExA( 0, "kernel32", NULL ); 773 error = GetLastError(); 774 ok( !ret, "unexpected success\n" ); 775 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error ); 776 777 SetLastError( 0xdeadbeef ); 778 mod = (HMODULE)0xdeadbeef; 779 ret = pGetModuleHandleExA( 0, "kernel32", &mod ); 780 ok( ret, "unexpected failure %u\n", GetLastError() ); 781 ok( mod != (HMODULE)0xdeadbeef, "got %p\n", mod ); 782 FreeLibrary( mod ); 783 784 SetLastError( 0xdeadbeef ); 785 mod = (HMODULE)0xdeadbeef; 786 ret = pGetModuleHandleExA( 0, "nosuchmod", &mod ); 787 error = GetLastError(); 788 ok( !ret, "unexpected success\n" ); 789 ok( error == ERROR_MOD_NOT_FOUND, "got %u\n", error ); 790 ok( mod == NULL, "got %p\n", mod ); 791 792 SetLastError( 0xdeadbeef ); 793 ret = pGetModuleHandleExW( 0, NULL, NULL ); 794 error = GetLastError(); 795 ok( !ret, "unexpected success\n" ); 796 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error ); 797 798 SetLastError( 0xdeadbeef ); 799 ret = pGetModuleHandleExW( 0, kernel32W, NULL ); 800 error = GetLastError(); 801 ok( !ret, "unexpected success\n" ); 802 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error ); 803 804 SetLastError( 0xdeadbeef ); 805 mod = (HMODULE)0xdeadbeef; 806 ret = pGetModuleHandleExW( 0, kernel32W, &mod ); 807 ok( ret, "unexpected failure %u\n", GetLastError() ); 808 ok( mod != (HMODULE)0xdeadbeef, "got %p\n", mod ); 809 FreeLibrary( mod ); 810 811 SetLastError( 0xdeadbeef ); 812 mod = (HMODULE)0xdeadbeef; 813 ret = pGetModuleHandleExW( 0, nosuchmodW, &mod ); 814 error = GetLastError(); 815 ok( !ret, "unexpected success\n" ); 816 ok( error == ERROR_MOD_NOT_FOUND, "got %u\n", error ); 817 ok( mod == NULL, "got %p\n", mod ); 818 819 SetLastError( 0xdeadbeef ); 820 ret = pGetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, NULL, NULL ); 821 error = GetLastError(); 822 ok( !ret, "unexpected success\n" ); 823 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error ); 824 825 SetLastError( 0xdeadbeef ); 826 ret = pGetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, "kernel32", NULL ); 827 error = GetLastError(); 828 ok( !ret, "unexpected success\n" ); 829 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error ); 830 831 SetLastError( 0xdeadbeef ); 832 mod = (HMODULE)0xdeadbeef; 833 ret = pGetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, "kernel32", &mod ); 834 ok( ret, "unexpected failure %u\n", GetLastError() ); 835 ok( mod != (HMODULE)0xdeadbeef, "got %p\n", mod ); 836 837 SetLastError( 0xdeadbeef ); 838 mod = (HMODULE)0xdeadbeef; 839 ret = pGetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, "nosuchmod", &mod ); 840 error = GetLastError(); 841 ok( !ret, "unexpected success\n" ); 842 ok( error == ERROR_MOD_NOT_FOUND, "got %u\n", error ); 843 ok( mod == NULL, "got %p\n", mod ); 844 845 SetLastError( 0xdeadbeef ); 846 ret = pGetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, NULL, NULL ); 847 error = GetLastError(); 848 ok( !ret, "unexpected success\n" ); 849 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error ); 850 851 SetLastError( 0xdeadbeef ); 852 ret = pGetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, kernel32W, NULL ); 853 error = GetLastError(); 854 ok( !ret, "unexpected success\n" ); 855 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error ); 856 857 SetLastError( 0xdeadbeef ); 858 mod = (HMODULE)0xdeadbeef; 859 ret = pGetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, kernel32W, &mod ); 860 ok( ret, "unexpected failure %u\n", GetLastError() ); 861 ok( mod != (HMODULE)0xdeadbeef, "got %p\n", mod ); 862 863 SetLastError( 0xdeadbeef ); 864 mod = (HMODULE)0xdeadbeef; 865 ret = pGetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, nosuchmodW, &mod ); 866 error = GetLastError(); 867 ok( !ret, "unexpected success\n" ); 868 ok( error == ERROR_MOD_NOT_FOUND, "got %u\n", error ); 869 ok( mod == NULL, "got %p\n", mod ); 870 871 mod_kernel32 = LoadLibraryA( "kernel32" ); 872 873 SetLastError( 0xdeadbeef ); 874 ret = pGetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, NULL, NULL ); 875 error = GetLastError(); 876 ok( !ret, "unexpected success\n" ); 877 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error ); 878 879 SetLastError( 0xdeadbeef ); 880 ret = pGetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCSTR)mod_kernel32, NULL ); 881 error = GetLastError(); 882 ok( !ret, "unexpected success\n" ); 883 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error ); 884 885 SetLastError( 0xdeadbeef ); 886 mod = (HMODULE)0xdeadbeef; 887 ret = pGetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCSTR)mod_kernel32, &mod ); 888 ok( ret, "unexpected failure %u\n", GetLastError() ); 889 ok( mod == mod_kernel32, "got %p\n", mod ); 890 FreeLibrary( mod ); 891 892 SetLastError( 0xdeadbeef ); 893 mod = (HMODULE)0xdeadbeef; 894 ret = pGetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCSTR)0xbeefdead, &mod ); 895 error = GetLastError(); 896 ok( !ret, "unexpected success\n" ); 897 ok( error == ERROR_MOD_NOT_FOUND, "got %u\n", error ); 898 ok( mod == NULL, "got %p\n", mod ); 899 900 SetLastError( 0xdeadbeef ); 901 ret = pGetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, NULL, NULL ); 902 error = GetLastError(); 903 ok( !ret, "unexpected success\n" ); 904 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error ); 905 906 SetLastError( 0xdeadbeef ); 907 ret = pGetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCWSTR)mod_kernel32, NULL ); 908 error = GetLastError(); 909 ok( !ret, "unexpected success\n" ); 910 ok( error == ERROR_INVALID_PARAMETER, "got %u\n", error ); 911 912 SetLastError( 0xdeadbeef ); 913 mod = (HMODULE)0xdeadbeef; 914 ret = pGetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCWSTR)mod_kernel32, &mod ); 915 ok( ret, "unexpected failure %u\n", GetLastError() ); 916 ok( mod == mod_kernel32, "got %p\n", mod ); 917 FreeLibrary( mod ); 918 919 SetLastError( 0xdeadbeef ); 920 mod = (HMODULE)0xdeadbeef; 921 ret = pGetModuleHandleExW( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCWSTR)0xbeefdead, &mod ); 922 error = GetLastError(); 923 ok( !ret, "unexpected success\n" ); 924 ok( error == ERROR_MOD_NOT_FOUND, "got %u\n", error ); 925 ok( mod == NULL, "got %p\n", mod ); 926 927 FreeLibrary( mod_kernel32 ); 928 } 929 930 static void testK32GetModuleInformation(void) 931 { 932 MODULEINFO info; 933 HMODULE mod; 934 BOOL ret; 935 936 if (!pK32GetModuleInformation) 937 { 938 win_skip("K32GetModuleInformation not available\n"); 939 return; 940 } 941 942 mod = GetModuleHandleA(NULL); 943 memset(&info, 0xAA, sizeof(info)); 944 ret = pK32GetModuleInformation(GetCurrentProcess(), mod, &info, sizeof(info)); 945 ok(ret, "K32GetModuleInformation failed for main module\n"); 946 ok(info.lpBaseOfDll == mod, "Wrong info.lpBaseOfDll = %p, expected %p\n", info.lpBaseOfDll, mod); 947 ok(info.EntryPoint != NULL, "Expected nonzero entrypoint\n"); 948 949 mod = GetModuleHandleA("kernel32.dll"); 950 memset(&info, 0xAA, sizeof(info)); 951 ret = pK32GetModuleInformation(GetCurrentProcess(), mod, &info, sizeof(info)); 952 ok(ret, "K32GetModuleInformation failed for kernel32 module\n"); 953 ok(info.lpBaseOfDll == mod, "Wrong info.lpBaseOfDll = %p, expected %p\n", info.lpBaseOfDll, mod); 954 ok(info.EntryPoint != NULL, "Expected nonzero entrypoint\n"); 955 } 956 957 static void test_AddDllDirectory(void) 958 { 959 static const WCHAR tmpW[] = {'t','m','p',0}; 960 static const WCHAR dotW[] = {'.','\\','.',0}; 961 static const WCHAR rootW[] = {'\\',0}; 962 WCHAR path[MAX_PATH], buf[MAX_PATH]; 963 DLL_DIRECTORY_COOKIE cookie; 964 BOOL ret; 965 966 if (!pAddDllDirectory || !pRemoveDllDirectory) 967 { 968 win_skip( "AddDllDirectory not available\n" ); 969 return; 970 } 971 972 buf[0] = '\0'; 973 GetTempPathW( sizeof(path)/sizeof(path[0]), path ); 974 GetTempFileNameW( path, tmpW, 0, buf ); 975 SetLastError( 0xdeadbeef ); 976 cookie = pAddDllDirectory( buf ); 977 ok( cookie != NULL, "AddDllDirectory failed err %u\n", GetLastError() ); 978 SetLastError( 0xdeadbeef ); 979 ret = pRemoveDllDirectory( cookie ); 980 ok( ret, "RemoveDllDirectory failed err %u\n", GetLastError() ); 981 982 DeleteFileW( buf ); 983 SetLastError( 0xdeadbeef ); 984 cookie = pAddDllDirectory( buf ); 985 ok( !cookie, "AddDllDirectory succeeded\n" ); 986 ok( GetLastError() == ERROR_FILE_NOT_FOUND, "wrong error %u\n", GetLastError() ); 987 cookie = pAddDllDirectory( dotW ); 988 ok( !cookie, "AddDllDirectory succeeded\n" ); 989 ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() ); 990 cookie = pAddDllDirectory( rootW ); 991 ok( cookie != NULL, "AddDllDirectory failed err %u\n", GetLastError() ); 992 SetLastError( 0xdeadbeef ); 993 ret = pRemoveDllDirectory( cookie ); 994 ok( ret, "RemoveDllDirectory failed err %u\n", GetLastError() ); 995 GetWindowsDirectoryW( buf, MAX_PATH ); 996 lstrcpyW( buf + 2, tmpW ); 997 cookie = pAddDllDirectory( buf ); 998 ok( !cookie, "AddDllDirectory succeeded\n" ); 999 ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() ); 1000 } 1001 1002 static void test_SetDefaultDllDirectories(void) 1003 { 1004 HMODULE mod; 1005 BOOL ret; 1006 1007 if (!pSetDefaultDllDirectories) 1008 { 1009 win_skip( "SetDefaultDllDirectories not available\n" ); 1010 return; 1011 } 1012 1013 mod = LoadLibraryA( "authz.dll" ); 1014 ok( mod != NULL, "loading authz failed\n" ); 1015 FreeLibrary( mod ); 1016 ret = pSetDefaultDllDirectories( LOAD_LIBRARY_SEARCH_USER_DIRS ); 1017 ok( ret, "SetDefaultDllDirectories failed err %u\n", GetLastError() ); 1018 mod = LoadLibraryA( "authz.dll" ); 1019 todo_wine ok( !mod, "loading authz succeeded\n" ); 1020 FreeLibrary( mod ); 1021 ret = pSetDefaultDllDirectories( LOAD_LIBRARY_SEARCH_SYSTEM32 ); 1022 ok( ret, "SetDefaultDllDirectories failed err %u\n", GetLastError() ); 1023 mod = LoadLibraryA( "authz.dll" ); 1024 ok( mod != NULL, "loading authz failed\n" ); 1025 FreeLibrary( mod ); 1026 mod = LoadLibraryExA( "authz.dll", 0, LOAD_LIBRARY_SEARCH_APPLICATION_DIR ); 1027 todo_wine ok( !mod, "loading authz succeeded\n" ); 1028 FreeLibrary( mod ); 1029 ret = pSetDefaultDllDirectories( LOAD_LIBRARY_SEARCH_APPLICATION_DIR ); 1030 ok( ret, "SetDefaultDllDirectories failed err %u\n", GetLastError() ); 1031 mod = LoadLibraryA( "authz.dll" ); 1032 todo_wine ok( !mod, "loading authz succeeded\n" ); 1033 FreeLibrary( mod ); 1034 ret = pSetDefaultDllDirectories( LOAD_LIBRARY_SEARCH_DEFAULT_DIRS ); 1035 ok( ret, "SetDefaultDllDirectories failed err %u\n", GetLastError() ); 1036 mod = LoadLibraryA( "authz.dll" ); 1037 ok( mod != NULL, "loading authz failed\n" ); 1038 FreeLibrary( mod ); 1039 1040 SetLastError( 0xdeadbeef ); 1041 ret = pSetDefaultDllDirectories( 0 ); 1042 ok( !ret, "SetDefaultDllDirectories succeeded\n" ); 1043 ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() ); 1044 1045 SetLastError( 0xdeadbeef ); 1046 ret = pSetDefaultDllDirectories( 3 ); 1047 ok( !ret, "SetDefaultDllDirectories succeeded\n" ); 1048 ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() ); 1049 1050 SetLastError( 0xdeadbeef ); 1051 ret = pSetDefaultDllDirectories( LOAD_LIBRARY_SEARCH_APPLICATION_DIR | 0x8000 ); 1052 ok( !ret, "SetDefaultDllDirectories succeeded\n" ); 1053 ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() ); 1054 1055 SetLastError( 0xdeadbeef ); 1056 ret = pSetDefaultDllDirectories( LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR ); 1057 ok( !ret || broken(ret) /* win7 */, "SetDefaultDllDirectories succeeded\n" ); 1058 if (!ret) ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() ); 1059 1060 SetLastError( 0xdeadbeef ); 1061 ret = pSetDefaultDllDirectories( LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | LOAD_LIBRARY_SEARCH_USER_DIRS ); 1062 ok( !ret || broken(ret) /* win7 */, "SetDefaultDllDirectories succeeded\n" ); 1063 if (!ret) ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() ); 1064 1065 /* restore some sane defaults */ 1066 pSetDefaultDllDirectories( LOAD_LIBRARY_SEARCH_DEFAULT_DIRS ); 1067 } 1068 1069 START_TEST(module) 1070 { 1071 WCHAR filenameW[MAX_PATH]; 1072 1073 /* Test if we can use GetModuleFileNameW */ 1074 1075 SetLastError(0xdeadbeef); 1076 GetModuleFileNameW(NULL, filenameW, MAX_PATH); 1077 if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) 1078 { 1079 win_skip("GetModuleFileNameW not existing on this platform, skipping W-calls\n"); 1080 is_unicode_enabled = FALSE; 1081 } 1082 1083 init_pointers(); 1084 1085 testGetModuleFileName(NULL); 1086 testGetModuleFileName("kernel32.dll"); 1087 testGetModuleFileName_Wrong(); 1088 1089 testGetDllDirectory(); 1090 1091 testLoadLibraryA(); 1092 testNestedLoadLibraryA(); 1093 testLoadLibraryA_Wrong(); 1094 testGetProcAddress_Wrong(); 1095 testLoadLibraryEx(); 1096 test_LoadLibraryEx_search_flags(); 1097 testGetModuleHandleEx(); 1098 testK32GetModuleInformation(); 1099 test_AddDllDirectory(); 1100 test_SetDefaultDllDirectories(); 1101 } 1102