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);