Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru --- dlls/kernel32/tests/loader.c | 40 ++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-)
diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c index 5474d54324..4bafd0f634 100644 --- a/dlls/kernel32/tests/loader.c +++ b/dlls/kernel32/tests/loader.c @@ -228,7 +228,7 @@ static DWORD create_test_dll( const IMAGE_DOS_HEADER *dos_header, UINT dos_size, { SetLastError(0xdeadbeef); ret = WriteFile(hfile, &nt_header->OptionalHeader, - min(nt_header->FileHeader.SizeOfOptionalHeader, sizeof(IMAGE_OPTIONAL_HEADER)), + sizeof(IMAGE_OPTIONAL_HEADER), &dummy, NULL); ok(ret, "WriteFile error %d\n", GetLastError()); if (nt_header->FileHeader.SizeOfOptionalHeader > sizeof(IMAGE_OPTIONAL_HEADER)) @@ -244,6 +244,8 @@ static DWORD create_test_dll( const IMAGE_DOS_HEADER *dos_header, UINT dos_size, assert(nt_header->FileHeader.NumberOfSections <= 1); if (nt_header->FileHeader.NumberOfSections) { + SetFilePointer(hfile, dos_size + sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER) + nt_header->FileHeader.SizeOfOptionalHeader, NULL, FILE_BEGIN); + section.SizeOfRawData = 10;
if (nt_header->OptionalHeader.SectionAlignment >= page_size) @@ -268,6 +270,17 @@ static DWORD create_test_dll( const IMAGE_DOS_HEADER *dos_header, UINT dos_size, ret = WriteFile(hfile, section_data, sizeof(section_data), &dummy, NULL); ok(ret, "WriteFile error %d\n", GetLastError()); } + + /* Minimal PE image that Windows7+ is able to load: 268 bytes */ + size = GetFileSize(hfile, NULL); + if (size < 268) + { + file_align = 268 - size; + SetLastError(0xdeadbeef); + ret = WriteFile(hfile, filler, file_align, &dummy, NULL); + ok(ret, "WriteFile error %d\n", GetLastError()); + } + size = GetFileSize(hfile, NULL); CloseHandle(hfile); return size; @@ -417,7 +430,8 @@ static BOOL query_image_section( int id, const char *dll_name, const IMAGE_NT_HE ok( image.LoaderFlags == (cor_header != NULL), "%u: LoaderFlags wrong %08x\n", id, image.LoaderFlags ); ok( image.ImageFileSize == file_size || broken(!image.ImageFileSize), /* winxpsp1 */ "%u: ImageFileSize wrong %08x / %08x\n", id, image.ImageFileSize, file_size ); - ok( image.CheckSum == nt_header->OptionalHeader.CheckSum, "%u: CheckSum wrong %08x / %08x\n", id, + ok( image.CheckSum == nt_header->OptionalHeader.CheckSum || broken(truncated), + "%u: CheckSum wrong %08x / %08x\n", id, image.CheckSum, nt_header->OptionalHeader.CheckSum );
if (nt_header->OptionalHeader.SizeOfCode || nt_header->OptionalHeader.AddressOfEntryPoint) @@ -768,6 +782,7 @@ static void test_Loader(void) /* Mandatory are all fields up to SizeOfHeaders, everything else * is really optional (at least that's true for XP). */ +#if 0 /* 32-bit Windows 8 crashes inside of LoadLibrary */ { sizeof(dos_header), 1, FIELD_OFFSET(IMAGE_OPTIONAL_HEADER, CheckSum), 0x200, 0x200, sizeof(dos_header) + sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER) + FIELD_OFFSET(IMAGE_OPTIONAL_HEADER, CheckSum) + sizeof(IMAGE_SECTION_HEADER) + 0x10, @@ -775,6 +790,7 @@ static void test_Loader(void) { ERROR_SUCCESS, ERROR_BAD_EXE_FORMAT, ERROR_INVALID_ADDRESS, ERROR_NOACCESS } }, +#endif { sizeof(dos_header), 0, FIELD_OFFSET(IMAGE_OPTIONAL_HEADER, CheckSum), 0x200, 0x200, 0xd0, /* beyond of the end of file */ @@ -843,6 +859,14 @@ static void test_Loader(void) 0x40, /* minimal image size that Windows7 accepts */ 0, { ERROR_SUCCESS } + }, + /* the following data mimics the PE image which 8k demos have */ + { 0x04, + 0, 0x08, + 0x04 /* also serves as e_lfanew in the truncated MZ header */, 0x04, + 0x200000, + 0x40, + { ERROR_SUCCESS } } }; int i; @@ -1077,6 +1101,18 @@ static void test_Loader(void) ok(ret, "FreeLibrary error %d\n", GetLastError()); }
+ SetLastError(0xdeadbeef); + ret = DeleteFileA(dll_name); + ok(ret, "DeleteFile error %d\n", GetLastError()); + + nt_header.OptionalHeader.AddressOfEntryPoint = 0x12345678; + file_size = create_test_dll( &dos_header, td[i].size_of_dos_header, &nt_header, dll_name ); + if (!file_size) + { + ok(0, "could not create %s\n", dll_name); + break; + } + query_image_section( i, dll_name, &nt_header, NULL ); } else
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=71265
Your paranoid android.
=== w1064v1809_ja (32 bit report) ===
kernel32: loader.c:3223: Test failed: child process failed to terminate
=== w1064v1809_zh_CN (32 bit report) ===
kernel32: loader.c:3223: Test failed: child process failed to terminate
=== w864 (64 bit report) ===
kernel32: loader.c:710: Test failed: 1208: wrong status c0000130/c000007b
=== w1064v1809 (64 bit report) ===
kernel32: loader.c:706: Test failed: 1428: got test dll but expected fallback loader.c:706: Test failed: 1434: got test dll but expected fallback loader.c:706: Test failed: 1440: got test dll but expected fallback loader.c:706: Test failed: 1447: got test dll but expected fallback loader.c:706: Test failed: 1474: got test dll but expected fallback
=== debiant (32 bit report) ===
kernel32: change.c:320: Test failed: should be ready