Alexandre Julliard : ntdll: Move the section object functions to the Unix library.

Alexandre Julliard julliard at winehq.org
Thu Jun 4 16:08:02 CDT 2020


Module: wine
Branch: master
Commit: cdfc45859c299aa629482ee06614c9819346b444
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=cdfc45859c299aa629482ee06614c9819346b444

Author: Alexandre Julliard <julliard at 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 at 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 );
 }
 
 




More information about the wine-cvs mailing list