From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/kernelbase/kernelbase.spec | 2 +- dlls/kernelbase/sync.c | 18 ++++++++++++++++++ dlls/kernelbase/tests/process.c | 27 +++++++++++++++++++++++++++ include/winbase.h | 1 + 4 files changed, 47 insertions(+), 1 deletion(-)
diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index feb1fce8f7a..961c2bf45ee 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -1015,7 +1015,7 @@ @ stdcall OpenEventA(long long str) @ stdcall OpenEventW(long long wstr) @ stdcall OpenFileById(long ptr long long ptr long) -# @ stub OpenFileMappingFromApp +@ stdcall OpenFileMappingFromApp(long long wstr) @ stdcall OpenFileMappingW(long long wstr) # @ stub OpenGlobalizationUserSettingsKey @ stdcall OpenMutexW(long long wstr) diff --git a/dlls/kernelbase/sync.c b/dlls/kernelbase/sync.c index 5c4fb76536f..1526db25f33 100644 --- a/dlls/kernelbase/sync.c +++ b/dlls/kernelbase/sync.c @@ -971,6 +971,24 @@ HANDLE WINAPI DECLSPEC_HOTPATCH OpenFileMappingW( DWORD access, BOOL inherit, LP }
+/*********************************************************************** + * OpenFileMappingFromApp (kernelbase.@) + */ +HANDLE WINAPI DECLSPEC_HOTPATCH OpenFileMappingFromApp( ULONG access, BOOL inherit, LPCWSTR name ) +{ + OBJECT_ATTRIBUTES attr; + UNICODE_STRING nameW; + HANDLE ret; + + if (!get_open_object_attributes( &attr, &nameW, inherit, name )) return 0; + + if (access == FILE_MAP_COPY) access = SECTION_MAP_READ; + + if (!set_ntstatus( NtOpenSection( &ret, access, &attr ))) return 0; + return ret; +} + + /*********************************************************************** * Condition variables ***********************************************************************/ diff --git a/dlls/kernelbase/tests/process.c b/dlls/kernelbase/tests/process.c index 62debfb9861..d86dc38afcd 100644 --- a/dlls/kernelbase/tests/process.c +++ b/dlls/kernelbase/tests/process.c @@ -36,6 +36,7 @@ static LPVOID (WINAPI *pMapViewOfFile3)(HANDLE, HANDLE, PVOID, ULONG64 offset, S static LPVOID (WINAPI *pVirtualAlloc2)(HANDLE, void *, SIZE_T, DWORD, DWORD, MEM_EXTENDED_PARAMETER *, ULONG); static LPVOID (WINAPI *pVirtualAlloc2FromApp)(HANDLE, void *, SIZE_T, DWORD, DWORD, MEM_EXTENDED_PARAMETER *, ULONG); static PVOID (WINAPI *pVirtualAllocFromApp)(PVOID, SIZE_T, DWORD, DWORD); +static HANDLE (WINAPI *pOpenFileMappingFromApp)( ULONG, BOOL, LPCWSTR);
static void test_CompareObjectHandles(void) { @@ -324,6 +325,30 @@ static void test_VirtualAlloc2FromApp(void) } }
+static void test_OpenFileMappingFromApp(void) +{ + HANDLE file, mapping; + + if (!pOpenFileMappingFromApp) + { + win_skip("OpenFileMappingFromApp is not available.\n"); + return; + } + + file = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_EXECUTE_READ, 0, 4090, "foo"); + ok(!!file, "Failed to create a mapping.\n"); + + mapping = pOpenFileMappingFromApp(FILE_MAP_READ, FALSE, L"foo"); + ok(!!mapping, "Failed to open a mapping.\n"); + CloseHandle(mapping); + + mapping = pOpenFileMappingFromApp(FILE_MAP_EXECUTE, FALSE, L"foo"); + ok(!!mapping, "Failed to open a mapping.\n"); + CloseHandle(mapping); + + CloseHandle(file); +} + static void init_funcs(void) { HMODULE hmod = GetModuleHandleA("kernelbase.dll"); @@ -331,6 +356,7 @@ static void init_funcs(void) #define X(f) { p##f = (void*)GetProcAddress(hmod, #f); } X(CompareObjectHandles); X(MapViewOfFile3); + X(OpenFileMappingFromApp); X(VirtualAlloc2); X(VirtualAlloc2FromApp); X(VirtualAllocFromApp); @@ -346,4 +372,5 @@ START_TEST(process) test_VirtualAlloc2(); test_VirtualAllocFromApp(); test_VirtualAlloc2FromApp(); + test_OpenFileMappingFromApp(); } diff --git a/include/winbase.h b/include/winbase.h index 0a8409c10e1..83282ec8af5 100644 --- a/include/winbase.h +++ b/include/winbase.h @@ -2537,6 +2537,7 @@ WINBASEAPI HFILE WINAPI OpenFile(LPCSTR,OFSTRUCT*,UINT); WINBASEAPI HANDLE WINAPI OpenFileMappingA(DWORD,BOOL,LPCSTR); WINBASEAPI HANDLE WINAPI OpenFileMappingW(DWORD,BOOL,LPCWSTR); #define OpenFileMapping WINELIB_NAME_AW(OpenFileMapping) +WINBASEAPI HANDLE WINAPI OpenFileMappingFromApp(ULONG,BOOL,LPCWSTR); WINBASEAPI HANDLE WINAPI OpenJobObjectA(DWORD,BOOL,LPCSTR); WINBASEAPI HANDLE WINAPI OpenJobObjectW(DWORD,BOOL,LPCWSTR); #define OpenJobObject WINELIB_NAME_AW(OpenJobObject)
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/kernelbase/kernelbase.spec | 2 +- dlls/kernelbase/sync.c | 10 +++++++- dlls/kernelbase/tests/process.c | 43 +++++++++++++++++++++++++++++++++ include/winbase.h | 1 + 4 files changed, 54 insertions(+), 2 deletions(-)
diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index 961c2bf45ee..0e9f0d7febd 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -190,7 +190,7 @@ @ stdcall CreateFiberEx(long long long ptr ptr) @ stdcall CreateFile2(wstr long long long ptr) @ stdcall CreateFileA(str long long ptr long long long) -# @ stub CreateFileMappingFromApp +@ stdcall CreateFileMappingFromApp(long ptr long int64 wstr) @ stdcall CreateFileMappingNumaW(long ptr long long long wstr long) @ stdcall CreateFileMappingW(long ptr long long long wstr) @ stdcall CreateFileW(wstr long long ptr long long long) diff --git a/dlls/kernelbase/sync.c b/dlls/kernelbase/sync.c index 1526db25f33..60b33af99c3 100644 --- a/dlls/kernelbase/sync.c +++ b/dlls/kernelbase/sync.c @@ -879,7 +879,6 @@ BOOL WINAPI DECLSPEC_HOTPATCH InitializeCriticalSectionEx( CRITICAL_SECTION *cri * File mappings ***********************************************************************/
- /*********************************************************************** * CreateFileMappingW (kernelbase.@) */ @@ -947,6 +946,15 @@ HANDLE WINAPI DECLSPEC_HOTPATCH CreateFileMappingW( HANDLE file, LPSECURITY_ATTR }
+/*********************************************************************** + * CreateFileMappingFromApp (kernelbase.@) + */ +HANDLE WINAPI DECLSPEC_HOTPATCH CreateFileMappingFromApp( HANDLE file, LPSECURITY_ATTRIBUTES sa, ULONG protect, + ULONG64 size, LPCWSTR name ) +{ + return CreateFileMappingW( file, sa, protect, size << 32, size, name ); +} + /*********************************************************************** * OpenFileMappingW (kernelbase.@) */ diff --git a/dlls/kernelbase/tests/process.c b/dlls/kernelbase/tests/process.c index d86dc38afcd..d5dddda0733 100644 --- a/dlls/kernelbase/tests/process.c +++ b/dlls/kernelbase/tests/process.c @@ -30,6 +30,8 @@
#include "wine/test.h"
+static NTSTATUS (WINAPI *pNtQueryObject)(HANDLE,OBJECT_INFORMATION_CLASS,PVOID,ULONG,PULONG); + static BOOL (WINAPI *pCompareObjectHandles)(HANDLE, HANDLE); static LPVOID (WINAPI *pMapViewOfFile3)(HANDLE, HANDLE, PVOID, ULONG64 offset, SIZE_T size, ULONG, ULONG, MEM_EXTENDED_PARAMETER *, ULONG); @@ -37,6 +39,7 @@ static LPVOID (WINAPI *pVirtualAlloc2)(HANDLE, void *, SIZE_T, DWORD, DWORD, MEM static LPVOID (WINAPI *pVirtualAlloc2FromApp)(HANDLE, void *, SIZE_T, DWORD, DWORD, MEM_EXTENDED_PARAMETER *, ULONG); static PVOID (WINAPI *pVirtualAllocFromApp)(PVOID, SIZE_T, DWORD, DWORD); static HANDLE (WINAPI *pOpenFileMappingFromApp)( ULONG, BOOL, LPCWSTR); +static HANDLE (WINAPI *pCreateFileMappingFromApp)(HANDLE, PSECURITY_ATTRIBUTES, ULONG, ULONG64, PCWSTR);
static void test_CompareObjectHandles(void) { @@ -327,7 +330,10 @@ static void test_VirtualAlloc2FromApp(void)
static void test_OpenFileMappingFromApp(void) { + OBJECT_BASIC_INFORMATION info; HANDLE file, mapping; + NTSTATUS status; + ULONG length;
if (!pOpenFileMappingFromApp) { @@ -340,26 +346,62 @@ static void test_OpenFileMappingFromApp(void)
mapping = pOpenFileMappingFromApp(FILE_MAP_READ, FALSE, L"foo"); ok(!!mapping, "Failed to open a mapping.\n"); + status = pNtQueryObject(mapping, ObjectBasicInformation, &info, sizeof(info), &length); + ok(!status, "Failed to get object information.\n"); + ok(info.GrantedAccess == SECTION_MAP_READ, "Unexpected access mask %#lx.\n", info.GrantedAccess); CloseHandle(mapping);
mapping = pOpenFileMappingFromApp(FILE_MAP_EXECUTE, FALSE, L"foo"); ok(!!mapping, "Failed to open a mapping.\n"); + status = pNtQueryObject(mapping, ObjectBasicInformation, &info, sizeof(info), &length); + ok(!status, "Failed to get object information.\n"); + todo_wine + ok(info.GrantedAccess == SECTION_MAP_EXECUTE, "Unexpected access mask %#lx.\n", info.GrantedAccess); CloseHandle(mapping);
CloseHandle(file); }
+static void test_CreateFileMappingFromApp(void) +{ + OBJECT_BASIC_INFORMATION info; + NTSTATUS status; + ULONG length; + HANDLE file; + + if (!pCreateFileMappingFromApp) + { + win_skip("CreateFileMappingFromApp is not available.\n"); + return; + } + + file = pCreateFileMappingFromApp(INVALID_HANDLE_VALUE, NULL, PAGE_EXECUTE_READWRITE, 1024, L"foo"); + ok(!!file || broken(!file) /* Win8 */, "Failed to create a mapping, error %lu.\n", GetLastError()); + if (!file) return; + + status = pNtQueryObject(file, ObjectBasicInformation, &info, sizeof(info), &length); + ok(!status, "Failed to get object information.\n"); + ok(info.GrantedAccess & SECTION_MAP_EXECUTE, "Unexpected access mask %#lx.\n", info.GrantedAccess); + + CloseHandle(file); +} + static void init_funcs(void) { HMODULE hmod = GetModuleHandleA("kernelbase.dll");
#define X(f) { p##f = (void*)GetProcAddress(hmod, #f); } X(CompareObjectHandles); + X(CreateFileMappingFromApp); X(MapViewOfFile3); X(OpenFileMappingFromApp); X(VirtualAlloc2); X(VirtualAlloc2FromApp); X(VirtualAllocFromApp); + + hmod = GetModuleHandleA("ntdll.dll"); + + X(NtQueryObject); #undef X }
@@ -373,4 +415,5 @@ START_TEST(process) test_VirtualAllocFromApp(); test_VirtualAlloc2FromApp(); test_OpenFileMappingFromApp(); + test_CreateFileMappingFromApp(); } diff --git a/include/winbase.h b/include/winbase.h index 83282ec8af5..ff96fc1072f 100644 --- a/include/winbase.h +++ b/include/winbase.h @@ -1876,6 +1876,7 @@ WINBASEAPI HANDLE WINAPI CreateFileW(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBU WINBASEAPI HANDLE WINAPI CreateFileMappingA(HANDLE,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCSTR); WINBASEAPI HANDLE WINAPI CreateFileMappingW(HANDLE,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCWSTR); #define CreateFileMapping WINELIB_NAME_AW(CreateFileMapping) +WINBASEAPI HANDLE WINAPI CreateFileMappingFromApp(HANDLE,PSECURITY_ATTRIBUTES,ULONG,ULONG64,PCWSTR); WINBASEAPI HANDLE WINAPI CreateIoCompletionPort(HANDLE,HANDLE,ULONG_PTR,DWORD); WINBASEAPI HANDLE WINAPI CreateJobObjectA(LPSECURITY_ATTRIBUTES,LPCSTR); WINBASEAPI HANDLE WINAPI CreateJobObjectW(LPSECURITY_ATTRIBUTES,LPCWSTR);
From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/kernelbase/kernelbase.spec | 2 +- dlls/kernelbase/memory.c | 9 ++++++++ dlls/kernelbase/tests/process.c | 37 +++++++++++++++++++++++++++++++++ include/winbase.h | 1 + 4 files changed, 48 insertions(+), 1 deletion(-)
diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index 0e9f0d7febd..c9b8649c800 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -984,7 +984,7 @@ @ stdcall MapViewOfFile3(long long ptr int64 long long long ptr long) @ stdcall MapViewOfFileEx(long long long long long ptr) @ stdcall MapViewOfFileExNuma(long long long long long ptr long) -# @ stub MapViewOfFileFromApp +@ stdcall MapViewOfFileFromApp(long long int64 long) @ stdcall MoveFileExW(wstr wstr long) # @ stub MoveFileWithProgressTransactedW @ stdcall MoveFileWithProgressW(wstr wstr ptr ptr long) diff --git a/dlls/kernelbase/memory.c b/dlls/kernelbase/memory.c index 14d8c4817a5..412d80f5cfd 100644 --- a/dlls/kernelbase/memory.c +++ b/dlls/kernelbase/memory.c @@ -237,6 +237,15 @@ LPVOID WINAPI DECLSPEC_HOTPATCH MapViewOfFileEx( HANDLE handle, DWORD access, DW return addr; }
+ +/*********************************************************************** + * MapViewOfFileFromApp (kernelbase.@) + */ +LPVOID WINAPI DECLSPEC_HOTPATCH MapViewOfFileFromApp( HANDLE handle, ULONG access, ULONG64 offset, SIZE_T size ) +{ + return MapViewOfFile( handle, access, offset << 32, offset, size ); +} + /*********************************************************************** * MapViewOfFile3 (kernelbase.@) */ diff --git a/dlls/kernelbase/tests/process.c b/dlls/kernelbase/tests/process.c index d5dddda0733..ed213f1f7b6 100644 --- a/dlls/kernelbase/tests/process.c +++ b/dlls/kernelbase/tests/process.c @@ -40,6 +40,7 @@ static LPVOID (WINAPI *pVirtualAlloc2FromApp)(HANDLE, void *, SIZE_T, DWORD, DWO static PVOID (WINAPI *pVirtualAllocFromApp)(PVOID, SIZE_T, DWORD, DWORD); static HANDLE (WINAPI *pOpenFileMappingFromApp)( ULONG, BOOL, LPCWSTR); static HANDLE (WINAPI *pCreateFileMappingFromApp)(HANDLE, PSECURITY_ATTRIBUTES, ULONG, ULONG64, PCWSTR); +static LPVOID (WINAPI *pMapViewOfFileFromApp)(HANDLE, ULONG, ULONG64, SIZE_T);
static void test_CompareObjectHandles(void) { @@ -386,6 +387,40 @@ static void test_CreateFileMappingFromApp(void) CloseHandle(file); }
+static void test_MapViewOfFileFromApp(void) +{ + static const char testfile[] = "testfile.xxx"; + HANDLE file, mapping; + void *ptr; + BOOL ret; + + if (!pMapViewOfFileFromApp) + { + win_skip("MapViewOfFileFromApp() is not supported.\n"); + return; + } + + SetLastError(0xdeadbeef); + file = CreateFileA( testfile, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0 ); + ok( file != INVALID_HANDLE_VALUE, "Failed to create a file, error %lu.\n", GetLastError() ); + SetFilePointer( file, 12288, NULL, FILE_BEGIN ); + SetEndOfFile( file ); + + SetLastError(0xdeadbeef); + mapping = CreateFileMappingA( file, NULL, PAGE_READWRITE, 0, 4096, NULL ); + ok( mapping != 0, "Failed to create file mapping, error %lu.\n", GetLastError() ); + + SetLastError(0xdeadbeef); + ptr = pMapViewOfFileFromApp( mapping, PAGE_EXECUTE_READWRITE, 0, 4096 ); + ok( ptr != NULL, "Mapping failed, error %lu.\n", GetLastError() ); + UnmapViewOfFile( ptr ); + + CloseHandle( mapping ); + CloseHandle( file ); + ret = DeleteFileA( testfile ); + ok(ret, "Failed to delete a test file.\n"); +} + static void init_funcs(void) { HMODULE hmod = GetModuleHandleA("kernelbase.dll"); @@ -394,6 +429,7 @@ static void init_funcs(void) X(CompareObjectHandles); X(CreateFileMappingFromApp); X(MapViewOfFile3); + X(MapViewOfFileFromApp); X(OpenFileMappingFromApp); X(VirtualAlloc2); X(VirtualAlloc2FromApp); @@ -416,4 +452,5 @@ START_TEST(process) test_VirtualAlloc2FromApp(); test_OpenFileMappingFromApp(); test_CreateFileMappingFromApp(); + test_MapViewOfFileFromApp(); } diff --git a/include/winbase.h b/include/winbase.h index ff96fc1072f..3cfc4649c7d 100644 --- a/include/winbase.h +++ b/include/winbase.h @@ -2493,6 +2493,7 @@ WINBASEAPI BOOL WINAPI MapUserPhysicalPages(PVOID,ULONG_PTR,PULONG_PTR); WINBASEAPI LPVOID WINAPI MapViewOfFile(HANDLE,DWORD,DWORD,DWORD,SIZE_T); WINBASEAPI LPVOID WINAPI MapViewOfFile3(HANDLE,HANDLE,PVOID,ULONG64,SIZE_T,ULONG,ULONG,MEM_EXTENDED_PARAMETER*,ULONG); WINBASEAPI LPVOID WINAPI MapViewOfFileEx(HANDLE,DWORD,DWORD,DWORD,SIZE_T,LPVOID); +WINBASEAPI LPVOID WINAPI MapViewOfFileFromApp(HANDLE,ULONG,ULONG64,SIZE_T); WINBASEAPI BOOL WINAPI MoveFileA(LPCSTR,LPCSTR); WINBASEAPI BOOL WINAPI MoveFileW(LPCWSTR,LPCWSTR); #define MoveFile WINELIB_NAME_AW(MoveFile)