Dmitry Timoshkov : kernel32/tests: Add a PE test image that resembles format of some of 8k demos.

Alexandre Julliard julliard at winehq.org
Fri Aug 7 10:42:29 CDT 2020


Module: wine
Branch: stable
Commit: f35315e4838034f0e6d509beeb7c75d833cebcfe
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=f35315e4838034f0e6d509beeb7c75d833cebcfe

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Wed May  6 15:16:01 2020 +0800

kernel32/tests: Add a PE test image that resembles format of some of 8k demos.

Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit 1a7dd7cdbe184ff3fdf2781e9a2222872bacee2c)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 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 6f143f5efd..130682b743 100644
--- a/dlls/kernel32/tests/loader.c
+++ b/dlls/kernel32/tests/loader.c
@@ -227,7 +227,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))
@@ -243,6 +243,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)
@@ -267,6 +269,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;
@@ -416,7 +429,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)
@@ -767,6 +781,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,
@@ -774,6 +789,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 */
@@ -842,6 +858,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;
@@ -1076,6 +1100,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




More information about the wine-cvs mailing list