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