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, §ion, 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, §ion, 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, §ion, 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