mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2024-11-21 16:46:54 -08:00
ntdll-NtQuerySection: Remove patch.
All of these tests are duplicated upstream now, in map_image_section() [kernel32:loader] and test_MapViewOfFile() [kernel32:virtual].
This commit is contained in:
parent
f76a6ab8da
commit
af5ef15dce
@ -1,282 +0,0 @@
|
||||
From c4c562ca31cfd3ce391abae2cc4e94a6bf4da049 Mon Sep 17 00:00:00 2001
|
||||
From: Dmitry Timoshkov <dmitry@baikal.ru>
|
||||
Date: Thu, 16 Oct 2014 23:26:35 +0200
|
||||
Subject: [PATCH] kernel32/tests: Add tests for NtQuerySection. (try 2)
|
||||
|
||||
---
|
||||
dlls/kernel32/tests/virtual.c | 245 ++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 245 insertions(+)
|
||||
|
||||
diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c
|
||||
index f492b2cf9b1..f6ac324c3a7 100644
|
||||
--- a/dlls/kernel32/tests/virtual.c
|
||||
+++ b/dlls/kernel32/tests/virtual.c
|
||||
@@ -55,6 +55,23 @@ static BOOL (WINAPI *pPrefetchVirtualMemory)(HANDLE, ULONG_PTR, PWIN32_MEMORY_R
|
||||
|
||||
/* ############################### */
|
||||
|
||||
+static UINT_PTR page_mask = 0xfff;
|
||||
+#define ROUND_SIZE(addr,size) \
|
||||
+ (((SIZE_T)(size) + ((UINT_PTR)(addr) & page_mask) + page_mask) & ~page_mask)
|
||||
+
|
||||
+static PIMAGE_NT_HEADERS image_nt_header(HMODULE module)
|
||||
+{
|
||||
+ IMAGE_NT_HEADERS *ret = NULL;
|
||||
+ IMAGE_DOS_HEADER *dos = (IMAGE_DOS_HEADER *)module;
|
||||
+
|
||||
+ if (dos->e_magic == IMAGE_DOS_SIGNATURE)
|
||||
+ {
|
||||
+ ret = (IMAGE_NT_HEADERS *)((char *)dos + dos->e_lfanew);
|
||||
+ if (ret->Signature != IMAGE_NT_SIGNATURE) ret = NULL;
|
||||
+ }
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static HANDLE create_target_process(const char *arg)
|
||||
{
|
||||
char **argv;
|
||||
@@ -4246,6 +4263,233 @@ static void test_PrefetchVirtualMemory(void)
|
||||
"PrefetchVirtualMemory unexpected status on 2 page-aligned entries: %ld\n", GetLastError() );
|
||||
}
|
||||
|
||||
+static void test_NtQuerySection(void)
|
||||
+{
|
||||
+ char path[MAX_PATH];
|
||||
+ HANDLE file, mapping;
|
||||
+ void *p;
|
||||
+ NTSTATUS status;
|
||||
+ union
|
||||
+ {
|
||||
+ SECTION_BASIC_INFORMATION basic;
|
||||
+ SECTION_IMAGE_INFORMATION image;
|
||||
+ char buf[1024];
|
||||
+ } info;
|
||||
+ IMAGE_NT_HEADERS *nt;
|
||||
+ SIZE_T ret;
|
||||
+ SIZE_T fsize, image_size;
|
||||
+ SYSTEM_INFO si;
|
||||
+
|
||||
+ if (!pNtQuerySection)
|
||||
+ {
|
||||
+ win_skip("NtQuerySection is not available\n");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ GetSystemInfo(&si);
|
||||
+ page_mask = si.dwPageSize - 1;
|
||||
+
|
||||
+ GetSystemDirectoryA(path, sizeof(path));
|
||||
+ strcat(path, "\\kernel32.dll");
|
||||
+
|
||||
+ SetLastError(0xdeadbef);
|
||||
+ file = CreateFileA(path, GENERIC_READ|GENERIC_EXECUTE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
|
||||
+ ok(file != INVALID_HANDLE_VALUE, "CreateFile error %lu\n", GetLastError());
|
||||
+
|
||||
+ fsize = GetFileSize(file, NULL);
|
||||
+
|
||||
+ SetLastError(0xdeadbef);
|
||||
+ mapping = CreateFileMappingA(file, NULL, PAGE_EXECUTE_READ, 0, 0, NULL);
|
||||
+ /* NT4 and win2k don't support EXEC on file mappings */
|
||||
+ if (!mapping)
|
||||
+ mapping = CreateFileMappingA(file, NULL, PAGE_READONLY, 0, 0, NULL);
|
||||
+ ok(mapping != 0, "CreateFileMapping error %lu\n", GetLastError());
|
||||
+
|
||||
+ status = pNtQuerySection(mapping, SectionBasicInformation, NULL, sizeof(info), &ret);
|
||||
+ ok(status == STATUS_ACCESS_VIOLATION, "expected STATUS_ACCESS_VIOLATION, got %#lx\n", status);
|
||||
+
|
||||
+ status = pNtQuerySection(mapping, SectionBasicInformation, &info, 0, NULL);
|
||||
+ ok(status == STATUS_INFO_LENGTH_MISMATCH, "expected STATUS_INFO_LENGTH_MISMATCH, got %#lx\n", status);
|
||||
+
|
||||
+ status = pNtQuerySection(mapping, SectionBasicInformation, &info, 0, &ret);
|
||||
+ ok(status == STATUS_INFO_LENGTH_MISMATCH, "expected STATUS_INFO_LENGTH_MISMATCH, got %#lx\n", status);
|
||||
+
|
||||
+ memset(&info, 0x55, sizeof(info));
|
||||
+ ret = 0xdeadbeef;
|
||||
+ status = pNtQuerySection(mapping, SectionBasicInformation, &info, sizeof(info), &ret);
|
||||
+ ok(status == STATUS_SUCCESS, "NtQuerySection error %#lx\n", status);
|
||||
+ ok(ret == sizeof(info.basic), "wrong returned size %Iu\n", ret);
|
||||
+ ok(info.basic.BaseAddress == NULL, "expected NULL, got %p\n", info.basic.BaseAddress);
|
||||
+ ok(info.basic.Attributes == SEC_FILE, "expected SEC_FILE, got %#lx\n", info.basic.Attributes);
|
||||
+ ok(info.basic.Size.QuadPart == fsize, "expected %#Ix, got %#lx/%08lx\n", fsize, info.basic.Size.HighPart, info.basic.Size.LowPart);
|
||||
+
|
||||
+ status = pNtQuerySection(mapping, SectionImageInformation, &info, sizeof(info.basic), &ret);
|
||||
+ ok(status == STATUS_INFO_LENGTH_MISMATCH, "expected STATUS_INFO_LENGTH_MISMATCH, got %#lx\n", status);
|
||||
+
|
||||
+ status = pNtQuerySection(mapping, SectionImageInformation, &info, sizeof(info), &ret);
|
||||
+ ok(status == STATUS_SECTION_NOT_IMAGE, "expected STATUS_SECTION_NOT_IMAGE, got %#lx\n", status);
|
||||
+
|
||||
+ SetLastError(0xdeadbef);
|
||||
+ p = MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, 0);
|
||||
+ ok(p != NULL, "MapViewOfFile error %lu\n", GetLastError());
|
||||
+
|
||||
+ nt = image_nt_header(p);
|
||||
+ image_size = ROUND_SIZE(p, nt->OptionalHeader.SizeOfImage);
|
||||
+
|
||||
+ memset(&info, 0x55, sizeof(info));
|
||||
+ ret = 0xdeadbeef;
|
||||
+ status = pNtQuerySection(mapping, SectionBasicInformation, &info, sizeof(info), &ret);
|
||||
+ ok(status == STATUS_SUCCESS, "NtQuerySection error %#lx\n", status);
|
||||
+ ok(ret == sizeof(info.basic), "wrong returned size %Iu\n", ret);
|
||||
+ ok(info.basic.BaseAddress == NULL, "expected NULL, got %p\n", info.basic.BaseAddress);
|
||||
+ ok(info.basic.Attributes == SEC_FILE, "expected SEC_FILE, got %#lx\n", info.basic.Attributes);
|
||||
+ ok(info.basic.Size.QuadPart == fsize, "expected %#Ix, got %#lx/%08lx\n", fsize, info.basic.Size.HighPart, info.basic.Size.LowPart);
|
||||
+
|
||||
+ UnmapViewOfFile(p);
|
||||
+ CloseHandle(mapping);
|
||||
+
|
||||
+ SetLastError(0xdeadbef);
|
||||
+ mapping = CreateFileMappingA(file, NULL, PAGE_EXECUTE_READ|SEC_IMAGE, 0, 0, NULL);
|
||||
+ /* NT4 and win2k don't support EXEC on file mappings */
|
||||
+ if (!mapping)
|
||||
+ mapping = CreateFileMappingA(file, NULL, PAGE_READONLY|SEC_IMAGE, 0, 0, NULL);
|
||||
+ ok(mapping != 0, "CreateFileMapping error %lu\n", GetLastError());
|
||||
+
|
||||
+ memset(&info, 0x55, sizeof(info));
|
||||
+ ret = 0xdeadbeef;
|
||||
+ status = pNtQuerySection(mapping, SectionBasicInformation, &info, sizeof(info), &ret);
|
||||
+ ok(status == STATUS_SUCCESS, "NtQuerySection error %#lx\n", status);
|
||||
+ ok(ret == sizeof(info.basic), "wrong returned size %Iu\n", ret);
|
||||
+ ok(info.basic.BaseAddress == NULL, "expected NULL, got %p\n", info.basic.BaseAddress);
|
||||
+ ok(info.basic.Attributes == (SEC_FILE|SEC_IMAGE), "expected SEC_FILE|SEC_IMAGE, got %#lx\n", info.basic.Attributes);
|
||||
+ ok(info.basic.Size.QuadPart == image_size, "expected %#Ix, got %#lx/%08lx\n", image_size, info.basic.Size.HighPart, info.basic.Size.LowPart);
|
||||
+
|
||||
+ status = pNtQuerySection(mapping, SectionImageInformation, NULL, sizeof(info), &ret);
|
||||
+ ok(status == STATUS_ACCESS_VIOLATION, "expected STATUS_ACCESS_VIOLATION, got %#lx\n", status);
|
||||
+
|
||||
+ status = pNtQuerySection(mapping, SectionImageInformation, &info, 0, NULL);
|
||||
+ ok(status == STATUS_INFO_LENGTH_MISMATCH, "expected STATUS_INFO_LENGTH_MISMATCH, got %#lx\n", status);
|
||||
+
|
||||
+ status = pNtQuerySection(mapping, SectionImageInformation, &info, 0, &ret);
|
||||
+ ok(status == STATUS_INFO_LENGTH_MISMATCH, "expected STATUS_INFO_LENGTH_MISMATCH, got %#lx\n", status);
|
||||
+
|
||||
+ status = pNtQuerySection(mapping, SectionImageInformation, &info, sizeof(info.basic), &ret);
|
||||
+ ok(status == STATUS_INFO_LENGTH_MISMATCH, "expected STATUS_INFO_LENGTH_MISMATCH, got %#lx\n", status);
|
||||
+
|
||||
+ SetLastError(0xdeadbef);
|
||||
+ p = MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, 0);
|
||||
+ ok(p != NULL, "MapViewOfFile error %lu\n", GetLastError());
|
||||
+
|
||||
+ nt = image_nt_header(p);
|
||||
+
|
||||
+ memset(&info, 0x55, sizeof(info));
|
||||
+ ret = 0xdeadbeef;
|
||||
+ status = pNtQuerySection(mapping, SectionImageInformation, &info, sizeof(info), &ret);
|
||||
+ ok(status == STATUS_SUCCESS, "NtQuerySection error %#lx\n", status);
|
||||
+ ok(ret == sizeof(info.image), "wrong returned size %Iu\n", ret);
|
||||
+ ok((ULONG_PTR)info.image.TransferAddress == nt->OptionalHeader.ImageBase + nt->OptionalHeader.AddressOfEntryPoint,
|
||||
+ "expected %#Ix, got %p\n", (SIZE_T)(nt->OptionalHeader.ImageBase + nt->OptionalHeader.AddressOfEntryPoint), info.image.TransferAddress);
|
||||
+ ok(info.image.ZeroBits == 0, "expected 0, got %#lx\n", info.image.ZeroBits);
|
||||
+ ok(info.image.MaximumStackSize == nt->OptionalHeader.SizeOfStackReserve, "expected %#Ix, got %#Ix\n", (SIZE_T)nt->OptionalHeader.SizeOfStackReserve, info.image.MaximumStackSize);
|
||||
+ ok(info.image.CommittedStackSize == nt->OptionalHeader.SizeOfStackCommit, "expected %#Ix, got %#Ix\n", (SIZE_T)nt->OptionalHeader.SizeOfStackCommit, info.image.CommittedStackSize);
|
||||
+ ok(info.image.SubSystemType == nt->OptionalHeader.Subsystem, "expected %#x, got %#lx\n", nt->OptionalHeader.Subsystem, info.image.SubSystemType);
|
||||
+ ok(info.image.MinorSubsystemVersion == nt->OptionalHeader.MinorSubsystemVersion, "expected %#x, got %#x\n", nt->OptionalHeader.MinorSubsystemVersion, info.image.MinorSubsystemVersion);
|
||||
+ ok(info.image.MajorSubsystemVersion == nt->OptionalHeader.MajorSubsystemVersion, "expected %#x, got %#x\n", nt->OptionalHeader.MajorSubsystemVersion, info.image.MajorSubsystemVersion);
|
||||
+ ok(info.image.ImageCharacteristics == nt->FileHeader.Characteristics, "expected %#x, got %#x\n", nt->FileHeader.Characteristics, info.image.ImageCharacteristics);
|
||||
+ ok(info.image.DllCharacteristics == nt->OptionalHeader.DllCharacteristics, "expected %#x, got %#x\n", nt->OptionalHeader.DllCharacteristics, info.image.DllCharacteristics);
|
||||
+ ok(info.image.Machine == nt->FileHeader.Machine, "expected %#x, got %#x\n", nt->FileHeader.Machine, info.image.Machine);
|
||||
+todo_wine
|
||||
+ ok(info.image.ImageContainsCode == TRUE, "expected 1, got %#x\n", info.image.ImageContainsCode);
|
||||
+
|
||||
+ memset(&info, 0x55, sizeof(info));
|
||||
+ ret = 0xdeadbeef;
|
||||
+ status = pNtQuerySection(mapping, SectionBasicInformation, &info, sizeof(info), &ret);
|
||||
+ ok(status == STATUS_SUCCESS, "NtQuerySection error %#lx\n", status);
|
||||
+ ok(ret == sizeof(info.basic), "wrong returned size %Iu\n", ret);
|
||||
+ ok(info.basic.BaseAddress == NULL, "expected NULL, got %p\n", info.basic.BaseAddress);
|
||||
+ ok(info.basic.Attributes == (SEC_FILE|SEC_IMAGE), "expected SEC_FILE|SEC_IMAGE, got %#lx\n", info.basic.Attributes);
|
||||
+ ok(info.basic.Size.QuadPart == image_size, "expected %#Ix, got %#lx/%08lx\n", image_size, info.basic.Size.HighPart, info.basic.Size.LowPart);
|
||||
+
|
||||
+ UnmapViewOfFile(p);
|
||||
+ CloseHandle(mapping);
|
||||
+
|
||||
+ SetLastError(0xdeadbef);
|
||||
+ mapping = CreateFileMappingA(file, NULL, PAGE_READONLY|SEC_COMMIT|SEC_NOCACHE, 0, 0, NULL);
|
||||
+ ok(mapping != 0, "CreateFileMapping error %lu\n", GetLastError());
|
||||
+
|
||||
+ memset(&info, 0x55, sizeof(info));
|
||||
+ ret = 0xdeadbeef;
|
||||
+ status = pNtQuerySection(mapping, SectionBasicInformation, &info, sizeof(info), &ret);
|
||||
+ ok(status == STATUS_SUCCESS, "NtQuerySection error %#lx\n", status);
|
||||
+ ok(ret == sizeof(info.basic), "wrong returned size %Iu\n", ret);
|
||||
+ ok(info.basic.BaseAddress == NULL, "expected NULL, got %p\n", info.basic.BaseAddress);
|
||||
+todo_wine
|
||||
+ ok(info.basic.Attributes == SEC_FILE, "expected SEC_FILE, got %#lx\n", info.basic.Attributes);
|
||||
+ ok(info.basic.Size.QuadPart == fsize, "expected %#Ix, got %#lx/%08lx\n", fsize, info.basic.Size.HighPart, info.basic.Size.LowPart);
|
||||
+
|
||||
+ CloseHandle(mapping);
|
||||
+
|
||||
+ SetLastError(0xdeadbef);
|
||||
+ mapping = CreateFileMappingA(file, NULL, PAGE_READONLY|SEC_RESERVE, 0, 0, NULL);
|
||||
+ ok(mapping != 0, "CreateFileMapping error %lu\n", GetLastError());
|
||||
+
|
||||
+ memset(&info, 0x55, sizeof(info));
|
||||
+ ret = 0xdeadbeef;
|
||||
+ status = pNtQuerySection(mapping, SectionBasicInformation, &info, sizeof(info), &ret);
|
||||
+ ok(status == STATUS_SUCCESS, "NtQuerySection error %#lx\n", status);
|
||||
+ ok(ret == sizeof(info.basic), "wrong returned size %Iu\n", ret);
|
||||
+ ok(info.basic.BaseAddress == NULL, "expected NULL, got %p\n", info.basic.BaseAddress);
|
||||
+ ok(info.basic.Attributes == SEC_FILE, "expected SEC_FILE, got %#lx\n", info.basic.Attributes);
|
||||
+ ok(info.basic.Size.QuadPart == fsize, "expected %#Ix, got %#lx/%08lx\n", fsize, info.basic.Size.HighPart, info.basic.Size.LowPart);
|
||||
+
|
||||
+ CloseHandle(mapping);
|
||||
+ CloseHandle(file);
|
||||
+
|
||||
+ SetLastError(0xdeadbef);
|
||||
+ mapping = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE|SEC_COMMIT, 0, 4096, NULL);
|
||||
+ ok(mapping != 0, "CreateFileMapping error %lu\n", GetLastError());
|
||||
+
|
||||
+ memset(&info, 0x55, sizeof(info));
|
||||
+ ret = 0xdeadbeef;
|
||||
+ status = pNtQuerySection(mapping, SectionBasicInformation, &info, sizeof(info), &ret);
|
||||
+ ok(status == STATUS_SUCCESS, "NtQuerySection error %#lx\n", status);
|
||||
+ ok(ret == sizeof(info.basic), "wrong returned size %Iu\n", ret);
|
||||
+ ok(info.basic.BaseAddress == NULL, "expected NULL, got %p\n", info.basic.BaseAddress);
|
||||
+ ok(info.basic.Attributes == SEC_COMMIT, "expected SEC_COMMIT, got %#lx\n", info.basic.Attributes);
|
||||
+ ok(info.basic.Size.QuadPart == 4096, "expected 4096, got %#lx/%08lx\n", info.basic.Size.HighPart, info.basic.Size.LowPart);
|
||||
+
|
||||
+ SetLastError(0xdeadbef);
|
||||
+ p = MapViewOfFile(mapping, FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, 0);
|
||||
+ ok(p != NULL, "MapViewOfFile error %lu\n", GetLastError());
|
||||
+
|
||||
+ memset(&info, 0x55, sizeof(info));
|
||||
+ ret = 0xdeadbeef;
|
||||
+ status = pNtQuerySection(mapping, SectionBasicInformation, &info, sizeof(info), &ret);
|
||||
+ ok(status == STATUS_SUCCESS, "NtQuerySection error %#lx\n", status);
|
||||
+ ok(ret == sizeof(info.basic), "wrong returned size %Iu\n", ret);
|
||||
+ ok(info.basic.BaseAddress == NULL, "expected NULL, got %p\n", info.basic.BaseAddress);
|
||||
+ ok(info.basic.Attributes == SEC_COMMIT, "expected SEC_COMMIT, got %#lx\n", info.basic.Attributes);
|
||||
+ ok(info.basic.Size.QuadPart == 4096, "expected 4096, got %#lx/%08lx\n", info.basic.Size.HighPart, info.basic.Size.LowPart);
|
||||
+
|
||||
+ UnmapViewOfFile(p);
|
||||
+ CloseHandle(mapping);
|
||||
+
|
||||
+ SetLastError(0xdeadbef);
|
||||
+ mapping = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READONLY|SEC_RESERVE, 0, 4096, NULL);
|
||||
+ ok(mapping != 0, "CreateFileMapping error %lu\n", GetLastError());
|
||||
+
|
||||
+ memset(&info, 0x55, sizeof(info));
|
||||
+ ret = 0xdeadbeef;
|
||||
+ status = pNtQuerySection(mapping, SectionBasicInformation, &info, sizeof(info), &ret);
|
||||
+ ok(status == STATUS_SUCCESS, "NtQuerySection error %#lx\n", status);
|
||||
+ ok(ret == sizeof(info.basic), "wrong returned size %Iu\n", ret);
|
||||
+ ok(info.basic.BaseAddress == NULL, "expected NULL, got %p\n", info.basic.BaseAddress);
|
||||
+ ok(info.basic.Attributes == SEC_RESERVE, "expected SEC_RESERVE, got %#lx\n", info.basic.Attributes);
|
||||
+ ok(info.basic.Size.QuadPart == 4096, "expected 4096, got %#lx/%08lx\n", info.basic.Size.HighPart, info.basic.Size.LowPart);
|
||||
+
|
||||
+ CloseHandle(mapping);
|
||||
+}
|
||||
+
|
||||
START_TEST(virtual)
|
||||
{
|
||||
int argc;
|
||||
@@ -4312,6 +4556,7 @@ START_TEST(virtual)
|
||||
test_shared_memory_ro(FALSE, FILE_MAP_COPY);
|
||||
test_shared_memory_ro(FALSE, FILE_MAP_COPY|FILE_MAP_WRITE);
|
||||
test_mappings();
|
||||
+ test_NtQuerySection();
|
||||
test_CreateFileMapping_protection();
|
||||
test_VirtualAlloc_protection();
|
||||
test_VirtualProtect();
|
||||
--
|
||||
2.35.1
|
||||
|
Loading…
Reference in New Issue
Block a user