Jacek Caban : ntoskrnl.exe: Implement file object constructor.

Alexandre Julliard julliard at winehq.org
Tue Feb 26 15:13:57 CST 2019


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Feb 26 13:39:57 2019 +0100

ntoskrnl.exe: Implement file object constructor.

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

---

 dlls/ntoskrnl.exe/ntoskrnl.c     | 12 +++++++++++-
 dlls/ntoskrnl.exe/tests/driver.c |  4 ++++
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 1a8a433..010f9f7 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -369,16 +369,26 @@ NTSTATUS WINAPI ObReferenceObjectByHandle( HANDLE handle, ACCESS_MASK access,
 }
 
 
+static void *create_file_object( HANDLE handle );
+
 static const WCHAR file_type_name[] = {'F','i','l','e',0};
 
 static struct _OBJECT_TYPE file_type = {
     file_type_name,
-    NULL,
+    create_file_object,
     free_kernel_object
 };
 
 POBJECT_TYPE IoFileObjectType = &file_type;
 
+static void *create_file_object( HANDLE handle )
+{
+    FILE_OBJECT *file;
+    if (!(file = alloc_kernel_object( IoFileObjectType, sizeof(*file), 0 ))) return NULL;
+    file->Type = 5;  /* MSDN */
+    file->Size = sizeof(*file);
+    return file;
+}
 
 /* transfer result of IRP back to wineserver */
 static NTSTATUS WINAPI dispatch_irp_completion( DEVICE_OBJECT *device, IRP *irp, void *context )
diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c
index aae5839..2fbe493 100644
--- a/dlls/ntoskrnl.exe/tests/driver.c
+++ b/dlls/ntoskrnl.exe/tests/driver.c
@@ -664,6 +664,7 @@ static void test_ob_reference(const WCHAR *test_path)
 {
     OBJECT_ATTRIBUTES attr = { sizeof(attr) };
     HANDLE event_handle, file_handle, file_handle2, thread_handle;
+    FILE_OBJECT *file;
     void *obj1, *obj2;
     UNICODE_STRING pathU;
     IO_STATUS_BLOCK io;
@@ -732,6 +733,9 @@ static void test_ob_reference(const WCHAR *test_path)
     todo_wine
     ok(obj1 == obj2, "obj1 != obj2\n");
 
+    file = obj1;
+    ok(file->Type == 5, "Type = %u\n", file->Type);
+
     ObDereferenceObject(obj1);
     ObDereferenceObject(obj2);
 




More information about the wine-cvs mailing list