Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-cw
Commits
a77d00ea
Commit
a77d00ea
authored
Nov 16, 2006
by
Dmitry Timoshkov
Committed by
Alexandre Julliard
Nov 16, 2006
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
kernel32: Add a basic PE loader test.
parent
134c03b3
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
259 additions
and
0 deletions
+259
-0
Makefile.in
dlls/kernel32/tests/Makefile.in
+1
-0
loader.c
dlls/kernel32/tests/loader.c
+258
-0
No files found.
dlls/kernel32/tests/Makefile.in
View file @
a77d00ea
...
...
@@ -19,6 +19,7 @@ CTESTS = \
format_msg.c
\
generated.c
\
heap.c
\
loader.c
\
locale.c
\
module.c
\
mailslot.c
\
...
...
dlls/kernel32/tests/loader.c
0 → 100644
View file @
a77d00ea
/*
* Unit test suite for the PE loader.
*
* Copyright 2006 Dmitry Timoshkov
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "wine/test.h"
static
const
struct
{
WORD
e_magic
;
/* 00: MZ Header signature */
WORD
unused
[
29
];
DWORD
e_lfanew
;
/* 3c: Offset to extended header */
}
dos_header
=
{
IMAGE_DOS_SIGNATURE
,
{
0
},
sizeof
(
dos_header
)
};
static
IMAGE_NT_HEADERS
nt_header
=
{
IMAGE_NT_SIGNATURE
,
#ifdef __i386__
{
IMAGE_FILE_MACHINE_I386
,
/* Machine */
#else
# error You must specify the machine type
#endif
1
,
/* NumberOfSections */
0
,
/* TimeDateStamp */
0
,
/* PointerToSymbolTable */
0
,
/* NumberOfSymbols */
sizeof
(
IMAGE_OPTIONAL_HEADER
),
/* SizeOfOptionalHeader */
IMAGE_FILE_EXECUTABLE_IMAGE
|
IMAGE_FILE_DLL
/* Characteristics */
},
{
IMAGE_NT_OPTIONAL_HDR_MAGIC
,
/* Magic */
1
,
/* MajorLinkerVersion */
0
,
/* MinorLinkerVersion */
0
,
/* SizeOfCode */
0
,
/* SizeOfInitializedData */
0
,
/* SizeOfUninitializedData */
0
,
/* AddressOfEntryPoint */
0
,
/* BaseOfCode */
0
,
/* BaseOfData */
0x10000000
,
/* ImageBase */
0
,
/* SectionAlignment */
0
,
/* FileAlignment */
4
,
/* MajorOperatingSystemVersion */
0
,
/* MinorOperatingSystemVersion */
1
,
/* MajorImageVersion */
0
,
/* MinorImageVersion */
4
,
/* MajorSubsystemVersion */
0
,
/* MinorSubsystemVersion */
0
,
/* Win32VersionValue */
sizeof
(
dos_header
)
+
sizeof
(
nt_header
)
+
sizeof
(
IMAGE_SECTION_HEADER
)
+
0x1000
,
/* SizeOfImage */
sizeof
(
dos_header
)
+
sizeof
(
nt_header
),
/* SizeOfHeaders */
0
,
/* CheckSum */
IMAGE_SUBSYSTEM_WINDOWS_CUI
,
/* Subsystem */
0
,
/* DllCharacteristics */
0
,
/* SizeOfStackReserve */
0
,
/* SizeOfStackCommit */
0
,
/* SizeOfHeapReserve */
0
,
/* SizeOfHeapCommit */
0
,
/* LoaderFlags */
0
,
/* NumberOfRvaAndSizes */
{
{
0
}
}
/* DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] */
}
};
static
IMAGE_SECTION_HEADER
section
=
{
".rodata"
,
/* Name */
{
0x10
},
/* Misc */
0
,
/* VirtualAddress */
0x10
,
/* SizeOfRawData */
0
,
/* PointerToRawData */
0
,
/* PointerToRelocations */
0
,
/* PointerToLinenumbers */
0
,
/* NumberOfRelocations */
0
,
/* NumberOfLinenumbers */
IMAGE_SCN_CNT_INITIALIZED_DATA
|
IMAGE_SCN_MEM_READ
,
/* Characteristics */
};
START_TEST
(
loader
)
{
static
const
struct
test_data
{
WORD
size_of_optional_header
;
DWORD
section_alignment
,
file_alignment
;
DWORD
size_of_image
,
size_of_headers
;
DWORD
error
;
/* 0 means LoadLibrary should succeed */
}
td
[]
=
{
{
0
,
0
,
0
,
0
,
0
,
ERROR_BAD_EXE_FORMAT
},
{
sizeof
(
IMAGE_OPTIONAL_HEADER
),
0x1000
,
0x1000
,
sizeof
(
dos_header
)
+
sizeof
(
nt_header
)
+
sizeof
(
IMAGE_SECTION_HEADER
)
+
0xe00
,
sizeof
(
dos_header
)
+
sizeof
(
nt_header
)
+
sizeof
(
IMAGE_SECTION_HEADER
),
ERROR_BAD_EXE_FORMAT
/* XP doesn't like too small image size */
},
{
sizeof
(
IMAGE_OPTIONAL_HEADER
),
0x1000
,
0x1000
,
sizeof
(
dos_header
)
+
sizeof
(
nt_header
)
+
sizeof
(
IMAGE_SECTION_HEADER
)
+
0x1000
,
sizeof
(
dos_header
)
+
sizeof
(
nt_header
)
+
sizeof
(
IMAGE_SECTION_HEADER
),
ERROR_SUCCESS
},
{
sizeof
(
IMAGE_OPTIONAL_HEADER
),
0x200
,
0x200
,
sizeof
(
dos_header
)
+
sizeof
(
nt_header
)
+
sizeof
(
IMAGE_SECTION_HEADER
)
+
0x1000
,
sizeof
(
dos_header
)
+
sizeof
(
nt_header
)
+
sizeof
(
IMAGE_SECTION_HEADER
),
ERROR_SUCCESS
},
{
sizeof
(
IMAGE_OPTIONAL_HEADER
),
0x200
,
0x1000
,
sizeof
(
dos_header
)
+
sizeof
(
nt_header
)
+
sizeof
(
IMAGE_SECTION_HEADER
)
+
0x1000
,
sizeof
(
dos_header
)
+
sizeof
(
nt_header
)
+
sizeof
(
IMAGE_SECTION_HEADER
),
ERROR_BAD_EXE_FORMAT
/* XP doesn't like aligments */
},
{
sizeof
(
IMAGE_OPTIONAL_HEADER
),
0x1000
,
0x200
,
sizeof
(
dos_header
)
+
sizeof
(
nt_header
)
+
sizeof
(
IMAGE_SECTION_HEADER
)
+
0x1000
,
sizeof
(
dos_header
)
+
sizeof
(
nt_header
)
+
sizeof
(
IMAGE_SECTION_HEADER
),
ERROR_SUCCESS
},
{
sizeof
(
IMAGE_OPTIONAL_HEADER
),
0x1000
,
0x200
,
sizeof
(
dos_header
)
+
sizeof
(
nt_header
)
+
sizeof
(
IMAGE_SECTION_HEADER
)
+
0x1000
,
0x200
,
ERROR_SUCCESS
}
};
static
const
char
filler
[
0x1000
];
int
i
;
DWORD
dummy
;
HANDLE
hfile
,
hlib
;
SYSTEM_INFO
si
;
char
temp_path
[
MAX_PATH
];
char
dll_name
[
MAX_PATH
];
GetSystemInfo
(
&
si
);
trace
(
"system page size 0x%04x
\n
"
,
si
.
dwPageSize
);
/* prevent displaying of the "Unable to load this DLL" message box */
SetErrorMode
(
SEM_FAILCRITICALERRORS
);
GetTempPath
(
MAX_PATH
,
temp_path
);
GetTempFileName
(
temp_path
,
"ldr"
,
0
,
dll_name
);
for
(
i
=
0
;
i
<
sizeof
(
td
)
/
sizeof
(
td
[
0
]);
i
++
)
{
/*trace("creating %s\n", dll_name);*/
hfile
=
CreateFileA
(
dll_name
,
GENERIC_WRITE
,
0
,
NULL
,
CREATE_ALWAYS
,
0
,
0
);
if
(
hfile
==
INVALID_HANDLE_VALUE
)
{
ok
(
0
,
"could not create %s
\n
"
,
dll_name
);
break
;
}
SetLastError
(
0xdeadbeef
);
ok
(
WriteFile
(
hfile
,
&
dos_header
,
sizeof
(
dos_header
),
&
dummy
,
NULL
),
"WriteFile error %d
\n
"
,
GetLastError
());
nt_header
.
FileHeader
.
SizeOfOptionalHeader
=
td
[
i
].
size_of_optional_header
;
nt_header
.
OptionalHeader
.
SectionAlignment
=
td
[
i
].
section_alignment
;
nt_header
.
OptionalHeader
.
FileAlignment
=
td
[
i
].
file_alignment
;
nt_header
.
OptionalHeader
.
SizeOfImage
=
td
[
i
].
size_of_image
;
nt_header
.
OptionalHeader
.
SizeOfHeaders
=
td
[
i
].
size_of_headers
;
SetLastError
(
0xdeadbeef
);
ok
(
WriteFile
(
hfile
,
&
nt_header
,
sizeof
(
nt_header
),
&
dummy
,
NULL
),
"WriteFile error %d
\n
"
,
GetLastError
());
section
.
VirtualAddress
=
nt_header
.
OptionalHeader
.
SectionAlignment
;
section
.
PointerToRawData
=
nt_header
.
OptionalHeader
.
FileAlignment
;
SetLastError
(
0xdeadbeef
);
ok
(
WriteFile
(
hfile
,
&
section
,
sizeof
(
section
),
&
dummy
,
NULL
),
"WriteFile error %d
\n
"
,
GetLastError
());
SetLastError
(
0xdeadbeef
);
ok
(
WriteFile
(
hfile
,
filler
,
sizeof
(
filler
),
&
dummy
,
NULL
),
"WriteFile error %d
\n
"
,
GetLastError
());
CloseHandle
(
hfile
);
SetLastError
(
0xdeadbeef
);
hlib
=
LoadLibrary
(
dll_name
);
if
(
td
[
i
].
error
==
ERROR_SUCCESS
)
{
MEMORY_BASIC_INFORMATION
info
;
ok
(
hlib
!=
0
,
"%d: LoadLibrary error %d
\n
"
,
i
,
GetLastError
());
SetLastError
(
0xdeadbeef
);
ok
(
VirtualQuery
(
hlib
,
&
info
,
sizeof
(
info
))
==
sizeof
(
info
),
"%d: VirtualQuery error %d
\n
"
,
i
,
GetLastError
());
ok
(
info
.
BaseAddress
==
hlib
,
"%d: %p != %p
\n
"
,
i
,
info
.
BaseAddress
,
hlib
);
ok
(
info
.
AllocationBase
==
hlib
,
"%d: %p != %p
\n
"
,
i
,
info
.
AllocationBase
,
hlib
);
ok
(
info
.
AllocationProtect
==
PAGE_EXECUTE_WRITECOPY
,
"%d: %x != PAGE_EXECUTE_WRITECOPY
\n
"
,
i
,
info
.
AllocationProtect
);
ok
(
info
.
RegionSize
==
0x2000
,
"%d: %lx != 0x2000
\n
"
,
i
,
info
.
RegionSize
);
ok
(
info
.
State
==
MEM_COMMIT
,
"%d: %x != MEM_COMMIT
\n
"
,
i
,
info
.
State
);
if
(
nt_header
.
OptionalHeader
.
SectionAlignment
!=
si
.
dwPageSize
)
ok
(
info
.
Protect
==
PAGE_EXECUTE_WRITECOPY
,
"%d: %x != PAGE_EXECUTE_WRITECOPY
\n
"
,
i
,
info
.
Protect
);
else
ok
(
info
.
Protect
==
PAGE_READONLY
,
"%d: %x != PAGE_READONLY
\n
"
,
i
,
info
.
Protect
);
ok
(
info
.
Type
==
SEC_IMAGE
,
"%d: %x != SEC_IMAGE
\n
"
,
i
,
info
.
Type
);
SetLastError
(
0xdeadbeef
);
ok
(
VirtualQuery
((
char
*
)
hlib
+
info
.
RegionSize
,
&
info
,
sizeof
(
info
))
==
sizeof
(
info
),
"%d: VirtualQuery error %d
\n
"
,
i
,
GetLastError
());
if
(
nt_header
.
OptionalHeader
.
SectionAlignment
==
si
.
dwPageSize
||
nt_header
.
OptionalHeader
.
SectionAlignment
==
nt_header
.
OptionalHeader
.
FileAlignment
)
{
ok
(
info
.
BaseAddress
==
(
char
*
)
hlib
+
0x2000
,
"%d: %p != %p
\n
"
,
i
,
info
.
BaseAddress
,
(
char
*
)
hlib
+
0x2000
);
todo_wine
{
ok
(
info
.
AllocationBase
==
0
,
"%d: %p != 0
\n
"
,
i
,
info
.
AllocationBase
);
}
ok
(
info
.
AllocationProtect
==
0
,
"%d: %x != 0
\n
"
,
i
,
info
.
AllocationProtect
);
/*ok(info.RegionSize == not_practical_value, "%d: %lx != not_practical_value\n", i, info.RegionSize);*/
ok
(
info
.
State
==
MEM_FREE
,
"%d: %x != MEM_FREE
\n
"
,
i
,
info
.
State
);
ok
(
info
.
Type
==
0
,
"%d: %x != 0
\n
"
,
i
,
info
.
Type
);
todo_wine
{
ok
(
info
.
Protect
==
PAGE_NOACCESS
,
"%d: %x != PAGE_NOACCESS
\n
"
,
i
,
info
.
Protect
);
}
}
else
{
ok
(
info
.
Protect
==
PAGE_EXECUTE_WRITECOPY
,
"%d: %x != PAGE_EXECUTE_WRITECOPY
\n
"
,
i
,
info
.
Protect
);
ok
(
info
.
BaseAddress
==
hlib
,
"%d: %p != %p
\n
"
,
i
,
info
.
BaseAddress
,
hlib
);
ok
(
info
.
AllocationBase
==
hlib
,
"%d: %p != %p
\n
"
,
i
,
info
.
AllocationBase
,
hlib
);
ok
(
info
.
AllocationProtect
==
PAGE_EXECUTE_WRITECOPY
,
"%d: %x != PAGE_EXECUTE_WRITECOPY
\n
"
,
i
,
info
.
AllocationProtect
);
ok
(
info
.
RegionSize
==
0x2000
,
"%d: %lx != 0x2000
\n
"
,
i
,
info
.
RegionSize
);
ok
(
info
.
State
==
MEM_COMMIT
,
"%d: %x != MEM_COMMIT
\n
"
,
i
,
info
.
State
);
ok
(
info
.
Protect
==
PAGE_READONLY
,
"%d: %x != PAGE_READONLY
\n
"
,
i
,
info
.
Protect
);
ok
(
info
.
Type
==
SEC_IMAGE
,
"%d: %x != SEC_IMAGE
\n
"
,
i
,
info
.
Type
);
}
SetLastError
(
0xdeadbeef
);
ok
(
FreeLibrary
(
hlib
),
"FreeLibrary error %d
\n
"
,
GetLastError
());
}
else
ok
(
td
[
i
].
error
==
GetLastError
(),
"%d: expected error %d, got %d
\n
"
,
i
,
td
[
i
].
error
,
GetLastError
());
SetLastError
(
0xdeadbeef
);
ok
(
DeleteFile
(
dll_name
),
"DeleteFile error %d
\n
"
,
GetLastError
());
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment