Jacek Caban : server: Allow creating file kernel objects.

Alexandre Julliard julliard at winehq.org
Tue Apr 23 17:39:55 CDT 2019


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Apr 23 16:23:33 2019 +0200

server: Allow creating file kernel objects.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntoskrnl.exe/tests/driver.c |  1 -
 server/file.c                    | 23 +++++++++++++++++------
 2 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
index 9b3a219..030c955 100644
--- a/dlls/ntoskrnl.exe/tests/driver.c
+++ b/dlls/ntoskrnl.exe/tests/driver.c
@@ -847,7 +847,6 @@ static void test_ob_reference(const WCHAR *test_path)
 
     status = ObReferenceObjectByHandle(file_handle2, SYNCHRONIZE, *pIoFileObjectType, KernelMode, &obj2, NULL);
     ok(!status, "ObReferenceObjectByHandle failed: %#x\n", status);
-    todo_wine
     ok(obj1 == obj2, "obj1 != obj2\n");
 
     file = obj1;
diff --git a/server/file.c b/server/file.c
index aae811e..4f34857 100644
--- a/server/file.c
+++ b/server/file.c
@@ -54,11 +54,12 @@
 
 struct file
 {
-    struct object       obj;        /* object header */
-    struct fd          *fd;         /* file descriptor for this file */
-    unsigned int        access;     /* file access (FILE_READ_DATA etc.) */
-    mode_t              mode;       /* file stat.st_mode */
-    uid_t               uid;        /* file stat.st_uid */
+    struct object       obj;            /* object header */
+    struct fd          *fd;             /* file descriptor for this file */
+    unsigned int        access;         /* file access (FILE_READ_DATA etc.) */
+    mode_t              mode;           /* file stat.st_mode */
+    uid_t               uid;            /* file stat.st_uid */
+    struct list         kernel_object;  /* list of kernel object pointers */
 };
 
 static unsigned int generic_file_map_access( unsigned int access );
@@ -70,6 +71,7 @@ static int file_set_sd( struct object *obj, const struct security_descriptor *sd
 static struct object *file_lookup_name( struct object *obj, struct unicode_str *name, unsigned int attr );
 static struct object *file_open_file( struct object *obj, unsigned int access,
                                       unsigned int sharing, unsigned int options );
+static struct list *file_get_kernel_obj_list( struct object *obj );
 static void file_destroy( struct object *obj );
 
 static int file_get_poll_events( struct fd *fd );
@@ -94,7 +96,7 @@ static const struct object_ops file_ops =
     no_link_name,                 /* link_name */
     NULL,                         /* unlink_name */
     file_open_file,               /* open_file */
-    no_kernel_obj_list,           /* get_kernel_obj_list */
+    file_get_kernel_obj_list,     /* get_kernel_obj_list */
     fd_close_handle,              /* close_handle */
     file_destroy                  /* destroy */
 };
@@ -136,6 +138,7 @@ struct file *create_file_for_fd( int fd, unsigned int access, unsigned int shari
 
     file->mode = st.st_mode;
     file->access = default_fd_map_access( &file->obj, access );
+    list_init( &file->kernel_object );
     if (!(file->fd = create_anonymous_fd( &file_fd_ops, fd, &file->obj,
                                           FILE_SYNCHRONOUS_IO_NONALERT )))
     {
@@ -162,6 +165,7 @@ struct file *create_file_for_fd_obj( struct fd *fd, unsigned int access, unsigne
     {
         file->mode = st.st_mode;
         file->access = default_fd_map_access( &file->obj, access );
+        list_init( &file->kernel_object );
         if (!(file->fd = dup_fd_object( fd, access, sharing, FILE_SYNCHRONOUS_IO_NONALERT )))
         {
             release_object( file );
@@ -181,6 +185,7 @@ static struct object *create_file_obj( struct fd *fd, unsigned int access, mode_
     file->mode    = mode;
     file->uid     = ~(uid_t)0;
     file->fd      = fd;
+    list_init( &file->kernel_object );
     grab_object( fd );
     set_fd_user( fd, &file_fd_ops, &file->obj );
     return &file->obj;
@@ -631,6 +636,12 @@ static struct object *file_open_file( struct object *obj, unsigned int access,
     return new_file;
 }
 
+static struct list *file_get_kernel_obj_list( struct object *obj )
+{
+    struct file *file = (struct file *)obj;
+    return &file->kernel_object;
+}
+
 static void file_destroy( struct object *obj )
 {
     struct file *file = (struct file *)obj;




More information about the wine-cvs mailing list