Module: wine Branch: master Commit: cdfc45859c299aa629482ee06614c9819346b444 URL: https://source.winehq.org/git/wine.git/?a=commit;h=cdfc45859c299aa629482ee06...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Jun 4 21:34:28 2020 +0200
ntdll: Move the section object functions to the Unix library.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/unix/loader.c | 2 + dlls/ntdll/unix/sync.c | 77 +++++++++++++++++++++++++++++++++ dlls/ntdll/unixlib.h | 7 ++- dlls/ntdll/virtual.c | 108 +---------------------------------------------- 4 files changed, 87 insertions(+), 107 deletions(-)
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index 0e93978993..767cae92b4 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -991,6 +991,7 @@ static struct unix_funcs unix_funcs = NtCreateEvent, NtCreateKeyedEvent, NtCreateMutant, + NtCreateSection, NtCreateSemaphore, NtCreateTimer, NtCurrentTeb, @@ -1005,6 +1006,7 @@ static struct unix_funcs unix_funcs = NtOpenEvent, NtOpenKeyedEvent, NtOpenMutant, + NtOpenSection, NtOpenSemaphore, NtOpenTimer, NtProtectVirtualMemory, diff --git a/dlls/ntdll/unix/sync.c b/dlls/ntdll/unix/sync.c index cea005fefb..c67eb70697 100644 --- a/dlls/ntdll/unix/sync.c +++ b/dlls/ntdll/unix/sync.c @@ -871,3 +871,80 @@ NTSTATUS WINAPI NtReleaseKeyedEvent( HANDLE handle, const void *key, select_op.keyed_event.key = wine_server_client_ptr( key ); return server_wait( &select_op, sizeof(select_op.keyed_event), flags, timeout ); } + + +/*********************************************************************** + * NtCreateSection (NTDLL.@) + */ +NTSTATUS WINAPI NtCreateSection( HANDLE *handle, ACCESS_MASK access, const OBJECT_ATTRIBUTES *attr, + const LARGE_INTEGER *size, ULONG protect, + ULONG sec_flags, HANDLE file ) +{ + NTSTATUS ret; + unsigned int file_access; + data_size_t len; + struct object_attributes *objattr; + + switch (protect & 0xff) + { + case PAGE_READONLY: + case PAGE_EXECUTE_READ: + case PAGE_WRITECOPY: + case PAGE_EXECUTE_WRITECOPY: + file_access = FILE_READ_DATA; + break; + case PAGE_READWRITE: + case PAGE_EXECUTE_READWRITE: + if (sec_flags & SEC_IMAGE) file_access = FILE_READ_DATA; + else file_access = FILE_READ_DATA | FILE_WRITE_DATA; + break; + case PAGE_EXECUTE: + case PAGE_NOACCESS: + file_access = 0; + break; + default: + return STATUS_INVALID_PAGE_PROTECTION; + } + + if ((ret = alloc_object_attributes( attr, &objattr, &len ))) return ret; + + SERVER_START_REQ( create_mapping ) + { + req->access = access; + req->flags = sec_flags; + req->file_handle = wine_server_obj_handle( file ); + req->file_access = file_access; + req->size = size ? size->QuadPart : 0; + wine_server_add_data( req, objattr, len ); + ret = wine_server_call( req ); + *handle = wine_server_ptr_handle( reply->handle ); + } + SERVER_END_REQ; + + RtlFreeHeap( GetProcessHeap(), 0, objattr ); + return ret; +} + + +/*********************************************************************** + * NtOpenSection (NTDLL.@) + */ +NTSTATUS WINAPI NtOpenSection( HANDLE *handle, ACCESS_MASK access, const OBJECT_ATTRIBUTES *attr ) +{ + NTSTATUS ret; + + if ((ret = validate_open_object_attributes( attr ))) return ret; + + SERVER_START_REQ( open_mapping ) + { + req->access = access; + req->attributes = attr->Attributes; + req->rootdir = wine_server_obj_handle( attr->RootDirectory ); + if (attr->ObjectName) + wine_server_add_data( req, attr->ObjectName->Buffer, attr->ObjectName->Length ); + ret = wine_server_call( req ); + *handle = wine_server_ptr_handle( reply->handle ); + } + SERVER_END_REQ; + return ret; +} diff --git a/dlls/ntdll/unixlib.h b/dlls/ntdll/unixlib.h index df8f271383..4e5cec6637 100644 --- a/dlls/ntdll/unixlib.h +++ b/dlls/ntdll/unixlib.h @@ -28,7 +28,7 @@ struct ldt_copy; struct msghdr;
/* increment this when you change the function table */ -#define NTDLL_UNIXLIB_VERSION 26 +#define NTDLL_UNIXLIB_VERSION 27
struct unix_funcs { @@ -45,6 +45,9 @@ struct unix_funcs const OBJECT_ATTRIBUTES *attr, ULONG flags ); NTSTATUS (WINAPI *NtCreateMutant)( HANDLE *handle, ACCESS_MASK access, const OBJECT_ATTRIBUTES *attr, BOOLEAN owned ); + NTSTATUS (WINAPI *NtCreateSection)( HANDLE *handle, ACCESS_MASK access, + const OBJECT_ATTRIBUTES *attr, const LARGE_INTEGER *size, + ULONG protect, ULONG sec_flags, HANDLE file ); NTSTATUS (WINAPI *NtCreateSemaphore)( HANDLE *handle, ACCESS_MASK access, const OBJECT_ATTRIBUTES *attr, LONG initial, LONG max ); NTSTATUS (WINAPI *NtCreateTimer)( HANDLE *handle, ACCESS_MASK access, @@ -72,6 +75,8 @@ struct unix_funcs const OBJECT_ATTRIBUTES *attr ); NTSTATUS (WINAPI *NtOpenMutant)( HANDLE *handle, ACCESS_MASK access, const OBJECT_ATTRIBUTES *attr ); + NTSTATUS (WINAPI *NtOpenSection)( HANDLE *handle, ACCESS_MASK access, + const OBJECT_ATTRIBUTES *attr ); NTSTATUS (WINAPI *NtOpenSemaphore)( HANDLE *handle, ACCESS_MASK access, const OBJECT_ATTRIBUTES *attr ); NTSTATUS (WINAPI *NtOpenTimer)( HANDLE *handle, ACCESS_MASK access, diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c index e277de16fe..6d5c98b58e 100644 --- a/dlls/ntdll/virtual.c +++ b/dlls/ntdll/virtual.c @@ -63,17 +63,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(virtual);
-/* per-page protection flags */ -#define VPROT_READ 0x01 -#define VPROT_WRITE 0x02 -#define VPROT_EXEC 0x04 -#define VPROT_WRITECOPY 0x08 -#define VPROT_GUARD 0x10 -#define VPROT_COMMITTED 0x20 -#define VPROT_WRITEWATCH 0x40 -/* per-mapping protection flags */ -#define VPROT_SYSTEM 0x0200 /* system view (underlying mmap not under our control) */ - static const UINT page_shift = 12; static const UINT_PTR page_mask = 0xfff;
@@ -84,59 +73,6 @@ static SIZE_T signal_stack_align; #define ROUND_SIZE(addr,size) \ (((SIZE_T)(size) + ((UINT_PTR)(addr) & page_mask) + page_mask) & ~page_mask)
-/*********************************************************************** - * get_vprot_flags - * - * Build page protections from Win32 flags. - * - * PARAMS - * protect [I] Win32 protection flags - * - * RETURNS - * Value of page protection flags - */ -static NTSTATUS get_vprot_flags( DWORD protect, unsigned int *vprot, BOOL image ) -{ - switch(protect & 0xff) - { - case PAGE_READONLY: - *vprot = VPROT_READ; - break; - case PAGE_READWRITE: - if (image) - *vprot = VPROT_READ | VPROT_WRITECOPY; - else - *vprot = VPROT_READ | VPROT_WRITE; - break; - case PAGE_WRITECOPY: - *vprot = VPROT_READ | VPROT_WRITECOPY; - break; - case PAGE_EXECUTE: - *vprot = VPROT_EXEC; - break; - case PAGE_EXECUTE_READ: - *vprot = VPROT_EXEC | VPROT_READ; - break; - case PAGE_EXECUTE_READWRITE: - if (image) - *vprot = VPROT_EXEC | VPROT_READ | VPROT_WRITECOPY; - else - *vprot = VPROT_EXEC | VPROT_READ | VPROT_WRITE; - break; - case PAGE_EXECUTE_WRITECOPY: - *vprot = VPROT_EXEC | VPROT_READ | VPROT_WRITECOPY; - break; - case PAGE_NOACCESS: - *vprot = 0; - break; - default: - return STATUS_INVALID_PAGE_PROTECTION; - } - if (protect & PAGE_GUARD) *vprot |= VPROT_GUARD; - return STATUS_SUCCESS; -} - - /********************************************************************** * RtlCreateUserStack (NTDLL.@) */ @@ -270,32 +206,7 @@ NTSTATUS WINAPI NtCreateSection( HANDLE *handle, ACCESS_MASK access, const OBJEC const LARGE_INTEGER *size, ULONG protect, ULONG sec_flags, HANDLE file ) { - NTSTATUS ret; - unsigned int vprot, file_access = 0; - data_size_t len; - struct object_attributes *objattr; - - if ((ret = get_vprot_flags( protect, &vprot, sec_flags & SEC_IMAGE ))) return ret; - if ((ret = alloc_object_attributes( attr, &objattr, &len ))) return ret; - - if (vprot & VPROT_READ) file_access |= FILE_READ_DATA; - if (vprot & VPROT_WRITE) file_access |= FILE_WRITE_DATA; - - SERVER_START_REQ( create_mapping ) - { - req->access = access; - req->flags = sec_flags; - req->file_handle = wine_server_obj_handle( file ); - req->file_access = file_access; - req->size = size ? size->QuadPart : 0; - wine_server_add_data( req, objattr, len ); - ret = wine_server_call( req ); - *handle = wine_server_ptr_handle( reply->handle ); - } - SERVER_END_REQ; - - RtlFreeHeap( GetProcessHeap(), 0, objattr ); - return ret; + return unix_funcs->NtCreateSection( handle, access, attr, size, protect, sec_flags, file ); }
@@ -305,22 +216,7 @@ NTSTATUS WINAPI NtCreateSection( HANDLE *handle, ACCESS_MASK access, const OBJEC */ NTSTATUS WINAPI NtOpenSection( HANDLE *handle, ACCESS_MASK access, const OBJECT_ATTRIBUTES *attr ) { - NTSTATUS ret; - - if ((ret = validate_open_object_attributes( attr ))) return ret; - - SERVER_START_REQ( open_mapping ) - { - req->access = access; - req->attributes = attr->Attributes; - req->rootdir = wine_server_obj_handle( attr->RootDirectory ); - if (attr->ObjectName) - wine_server_add_data( req, attr->ObjectName->Buffer, attr->ObjectName->Length ); - ret = wine_server_call( req ); - *handle = wine_server_ptr_handle( reply->handle ); - } - SERVER_END_REQ; - return ret; + return unix_funcs->NtOpenSection( handle, access, attr ); }