Jacek Caban : ntoskrnl.exe: Use ObOpenObjectByPointer to get handle for kernel object.
Alexandre Julliard
julliard at winehq.org
Tue Apr 30 15:59:56 CDT 2019
Module: wine
Branch: master
Commit: 332035fb9432a5af74cc944b87d1410efab563d6
URL: https://source.winehq.org/git/wine.git/?a=commit;h=332035fb9432a5af74cc944b87d1410efab563d6
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Apr 30 16:36:48 2019 +0200
ntoskrnl.exe: Use ObOpenObjectByPointer to get handle for kernel object.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntoskrnl.exe/ntoskrnl.c | 23 ++++++-----------------
dlls/ntoskrnl.exe/ntoskrnl_private.h | 1 -
dlls/ntoskrnl.exe/sync.c | 7 ++++---
3 files changed, 10 insertions(+), 21 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index f0dff14..4b6c79d 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -366,20 +366,6 @@ static void ObReferenceObject( void *obj )
LeaveCriticalSection( &obref_cs );
}
-HANDLE kernel_object_handle( void *obj, unsigned int access )
-{
- HANDLE handle = NULL;
- 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 (!wine_server_call( req )) handle = wine_server_ptr_handle( reply->handle );
- }
- SERVER_END_REQ;
- return handle;
-}
-
static const POBJECT_TYPE *known_types[] =
{
&ExEventObjectType,
@@ -1870,9 +1856,12 @@ NTSTATUS WINAPI IoGetDeviceProperty( DEVICE_OBJECT *device, DEVICE_REGISTRY_PROP
OBJECT_NAME_INFORMATION *name = HeapAlloc(GetProcessHeap(), 0, len);
HANDLE handle;
- handle = kernel_object_handle( device, 0 );
- status = NtQueryObject( handle, ObjectNameInformation, name, len, &used_len );
- NtClose( handle );
+ status = ObOpenObjectByPointer( device, OBJ_KERNEL_HANDLE, NULL, 0, NULL, KernelMode, &handle );
+ if (!status)
+ {
+ status = NtQueryObject( handle, ObjectNameInformation, name, len, &used_len );
+ NtClose( handle );
+ }
if (status == STATUS_SUCCESS)
{
/* Ensure room for NULL termination */
diff --git a/dlls/ntoskrnl.exe/ntoskrnl_private.h b/dlls/ntoskrnl.exe/ntoskrnl_private.h
index 295ff73..c2ea91c 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl_private.h
+++ b/dlls/ntoskrnl.exe/ntoskrnl_private.h
@@ -47,7 +47,6 @@ struct _ETHREAD
};
void *alloc_kernel_object( POBJECT_TYPE type, HANDLE handle, SIZE_T size, LONG ref ) DECLSPEC_HIDDEN;
-HANDLE kernel_object_handle( void *obj, unsigned int access ) DECLSPEC_HIDDEN;
NTSTATUS kernel_object_from_handle( HANDLE handle, POBJECT_TYPE type, void **ret ) DECLSPEC_HIDDEN;
extern POBJECT_TYPE ExEventObjectType;
diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c
index 6976b9e..8ea103b 100644
--- a/dlls/ntoskrnl.exe/sync.c
+++ b/dlls/ntoskrnl.exe/sync.c
@@ -29,6 +29,7 @@
#include "winternl.h"
#include "ddk/ntddk.h"
#include "ddk/wdm.h"
+#include "ddk/ntifs.h"
#include "wine/debug.h"
#include "wine/heap.h"
@@ -80,7 +81,7 @@ NTSTATUS WINAPI KeWaitForMultipleObjects(ULONG count, void *pobjs[],
{
if (objs[i]->WaitListHead.Blink == INVALID_HANDLE_VALUE)
{
- handles[i] = kernel_object_handle( objs[i], SYNCHRONIZE );
+ ObOpenObjectByPointer( objs[i], OBJ_KERNEL_HANDLE, NULL, SYNCHRONIZE, NULL, KernelMode, &handles[i] );
continue;
}
@@ -266,7 +267,7 @@ LONG WINAPI KeSetEvent( PRKEVENT event, KPRIORITY increment, BOOLEAN wait )
}
else
{
- if ((handle = kernel_object_handle( event, EVENT_MODIFY_STATE )))
+ if (!ObOpenObjectByPointer( event, OBJ_KERNEL_HANDLE, NULL, EVENT_MODIFY_STATE, NULL, KernelMode, &handle ))
{
NtSetEvent( handle, &ret );
NtClose( handle );
@@ -297,7 +298,7 @@ LONG WINAPI KeResetEvent( PRKEVENT event )
}
else
{
- if ((handle = kernel_object_handle( event, EVENT_MODIFY_STATE )))
+ if (!ObOpenObjectByPointer( event, OBJ_KERNEL_HANDLE, NULL, EVENT_MODIFY_STATE, NULL, KernelMode, &handle ))
{
NtResetEvent( handle, &ret );
NtClose( handle );
More information about the wine-cvs
mailing list