Module: wine Branch: master Commit: bfe3dfb5356d5944e0d9ff9d659eac6c77075bd7 URL: https://source.winehq.org/git/wine.git/?a=commit;h=bfe3dfb5356d5944e0d9ff9d6...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Apr 30 16:36:37 2019 +0200
ntoskrnl.exe: Implement ObOpenObjectByPointer.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntoskrnl.exe/ntoskrnl.c | 34 ++++++++++++++++++++++++++++++++++ dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +- dlls/ntoskrnl.exe/tests/driver.c | 19 +++++++++++++++++-- include/ddk/ntifs.h | 1 + 4 files changed, 53 insertions(+), 3 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index d8756a8..f0dff14 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -511,6 +511,40 @@ POBJECT_TYPE WINAPI ObGetObjectType( void *object ) return header->type; }
+/*********************************************************************** + * ObOpenObjectByPointer (NTOSKRNL.EXE.@) + */ +NTSTATUS WINAPI ObOpenObjectByPointer( void *obj, ULONG attr, ACCESS_STATE *access_state, + ACCESS_MASK access, POBJECT_TYPE type, + KPROCESSOR_MODE mode, HANDLE *handle ) +{ + NTSTATUS status; + + TRACE( "%p %x %p %x %p %d %p\n", obj, attr, access_state, access, type, mode, handle ); + + if (mode != KernelMode) + { + FIXME( "UserMode access not implemented\n" ); + return STATUS_NOT_IMPLEMENTED; + } + + if (attr & ~OBJ_KERNEL_HANDLE) FIXME( "access %x not supported\n", access ); + if (access_state) FIXME( "access_state not implemented\n" ); + + if (type && ObGetObjectType( obj ) != type) return STATUS_OBJECT_TYPE_MISMATCH; + + SERVER_START_REQ( get_kernel_object_handle ) + { + req->manager = wine_server_obj_handle( get_device_manager() ); + req->user_ptr = wine_server_client_ptr( obj ); + req->access = access; + if (!(status = wine_server_call( req ))) + *handle = wine_server_ptr_handle( reply->handle ); + } + SERVER_END_REQ; + return status; +} +
static void *create_file_object( HANDLE handle );
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec index 53070f3..1e46de3 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec +++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec @@ -822,7 +822,7 @@ @ stub ObLogSecurityDescriptor @ stub ObMakeTemporaryObject @ stub ObOpenObjectByName -@ stub ObOpenObjectByPointer +@ stdcall ObOpenObjectByPointer(ptr long ptr long ptr long ptr) @ stdcall ObQueryNameString(ptr ptr long ptr) @ stub ObQueryObjectAuditingByHandle @ stdcall ObReferenceObjectByHandle(long long ptr long ptr ptr) diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c index 4bbaa79..e5d5dd8 100644 --- a/dlls/ntoskrnl.exe/tests/driver.c +++ b/dlls/ntoskrnl.exe/tests/driver.c @@ -773,7 +773,7 @@ static void test_ob_reference(const WCHAR *test_path) { POBJECT_TYPE (WINAPI *pObGetObjectType)(void*); OBJECT_ATTRIBUTES attr = { sizeof(attr) }; - HANDLE event_handle, file_handle, file_handle2, thread_handle; + HANDLE event_handle, file_handle, file_handle2, thread_handle, handle; DISPATCHER_HEADER *header; FILE_OBJECT *file; void *obj1, *obj2; @@ -878,9 +878,24 @@ static void test_ob_reference(const WCHAR *test_path) status = wait_single(header, 0); ok(status == 0 || status == STATUS_TIMEOUT, "got %#x\n", status);
- ObDereferenceObject(obj1); ObDereferenceObject(obj2);
+ status = ObOpenObjectByPointer(obj1, OBJ_KERNEL_HANDLE, NULL, 0, NULL, KernelMode, &handle); + ok(status == STATUS_SUCCESS, "ObOpenObjectByPointer failed: %#x\n", status); + + status = ZwClose(handle); + ok(!status, "ZwClose failed: %#x\n", status); + + status = ObReferenceObjectByHandle(thread_handle, SYNCHRONIZE, *pPsThreadType, KernelMode, &obj2, NULL); + ok(!status, "ObReferenceObjectByHandle failed: %#x\n", status); + ok(obj1 == obj2, "obj1 != obj2\n"); + ObDereferenceObject(obj2); + + status = ObOpenObjectByPointer(obj1, OBJ_KERNEL_HANDLE, NULL, 0, *pIoFileObjectType, KernelMode, &handle); + ok(status == STATUS_OBJECT_TYPE_MISMATCH, "ObOpenObjectByPointer returned: %#x\n", status); + + ObDereferenceObject(obj1); + status = ZwClose(thread_handle); ok(!status, "ZwClose failed: %#x\n", status);
diff --git a/include/ddk/ntifs.h b/include/ddk/ntifs.h index 2c61329..acdd232 100644 --- a/include/ddk/ntifs.h +++ b/include/ddk/ntifs.h @@ -130,6 +130,7 @@ typedef struct _FS_FILTER_CALLBACKS } FS_FILTER_CALLBACKS, *PFS_FILTER_CALLBACKS;
BOOLEAN WINAPI FsRtlIsNameInExpression(PUNICODE_STRING, PUNICODE_STRING, BOOLEAN, PWCH); +NTSTATUS WINAPI ObOpenObjectByPointer(void*,ULONG,PACCESS_STATE,ACCESS_MASK,POBJECT_TYPE,KPROCESSOR_MODE,HANDLE*); NTSTATUS WINAPI ObQueryNameString(PVOID,POBJECT_NAME_INFORMATION,ULONG,PULONG); BOOLEAN WINAPI PsIsSystemThread(PETHREAD); NTSTATUS WINAPI PsLookupProcessByProcessId(HANDLE,PEPROCESS*);