Alexandre Julliard : server: Return more specific error status for NE binaries.

Alexandre Julliard julliard at winehq.org
Tue Sep 25 14:56:34 CDT 2018


Module: wine
Branch: master
Commit: 622aeeba6a37fe85f516b9ceeb3f66c9fcc6865f
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=622aeeba6a37fe85f516b9ceeb3f66c9fcc6865f

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Sep 25 16:52:00 2018 +0200

server: Return more specific error status for NE binaries.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/tests/loader.c | 18 ++++++++++++++++++
 server/mapping.c             |  7 +++++--
 server/trace.c               |  1 +
 3 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c
index e7a1a43..bc88c5f 100644
--- a/dlls/kernel32/tests/loader.c
+++ b/dlls/kernel32/tests/loader.c
@@ -972,6 +972,24 @@ static void test_Loader(void)
     nt_header.Signature = IMAGE_OS2_SIGNATURE;
     status = map_image_section( &nt_header, &section, section_data, __LINE__ );
     ok( status == STATUS_INVALID_IMAGE_NE_FORMAT, "NtCreateSection error %08x\n", status );
+    for (i = 0; i < 16; i++)
+    {
+        ((IMAGE_OS2_HEADER *)&nt_header)->ne_exetyp = i;
+        status = map_image_section( &nt_header, &section, section_data, __LINE__ );
+        switch (i)
+        {
+        case 2:
+            ok( status == STATUS_INVALID_IMAGE_WIN_16, "NtCreateSection %u error %08x\n", i, status );
+            break;
+        case 5:
+            ok( status == STATUS_INVALID_IMAGE_PROTECT, "NtCreateSection %u error %08x\n", i, status );
+            break;
+        default:
+            ok( status == STATUS_INVALID_IMAGE_NE_FORMAT, "NtCreateSection %u error %08x\n", i, status );
+            break;
+        }
+    }
+    ((IMAGE_OS2_HEADER *)&nt_header)->ne_exetyp = ((IMAGE_OS2_HEADER *)&nt_header_template)->ne_exetyp;
 
     nt_header.Signature = 0xdeadbeef;
     status = map_image_section( &nt_header, &section, section_data, __LINE__ );
diff --git a/server/mapping.c b/server/mapping.c
index 1ed8c9d..2955766 100644
--- a/server/mapping.c
+++ b/server/mapping.c
@@ -587,8 +587,11 @@ static unsigned int get_image_params( struct mapping *mapping, file_pos_t file_s
     if (size < sizeof(nt)) memset( (char *)&nt + size, 0, sizeof(nt) - size );
     if (nt.Signature != IMAGE_NT_SIGNATURE)
     {
-        if (*(WORD *)&nt.Signature == IMAGE_OS2_SIGNATURE) return STATUS_INVALID_IMAGE_NE_FORMAT;
-        return STATUS_INVALID_IMAGE_PROTECT;
+        IMAGE_OS2_HEADER *os2 = (IMAGE_OS2_HEADER *)&nt;
+        if (os2->ne_magic != IMAGE_OS2_SIGNATURE) return STATUS_INVALID_IMAGE_PROTECT;
+        if (os2->ne_exetyp == 2) return STATUS_INVALID_IMAGE_WIN_16;
+        if (os2->ne_exetyp == 5) return STATUS_INVALID_IMAGE_PROTECT;
+        return STATUS_INVALID_IMAGE_NE_FORMAT;
     }
 
     switch (nt.opt.hdr32.Magic)
diff --git a/server/trace.c b/server/trace.c
index 7b54c4f..5140ab1 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -5480,6 +5480,7 @@ static const struct
     { "INVALID_IMAGE_NE_FORMAT",     STATUS_INVALID_IMAGE_NE_FORMAT },
     { "INVALID_IMAGE_NOT_MZ",        STATUS_INVALID_IMAGE_NOT_MZ },
     { "INVALID_IMAGE_PROTECT",       STATUS_INVALID_IMAGE_PROTECT },
+    { "INVALID_IMAGE_WIN_16",        STATUS_INVALID_IMAGE_WIN_16 },
     { "INVALID_IMAGE_WIN_64",        STATUS_INVALID_IMAGE_WIN_64 },
     { "INVALID_LOCK_SEQUENCE",       STATUS_INVALID_LOCK_SEQUENCE },
     { "INVALID_OWNER",               STATUS_INVALID_OWNER },




More information about the wine-cvs mailing list