From 76de33fe36d62005e755b33c689fc5fce8d910e3 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 8 Jan 2007 19:40:10 +0000 Subject: [PATCH] - Implement ObFindHandleForObject and add it to the NDK. However, it depends on ExEnumHandleTable which is still unimplemented. - Fix up prototype of the function (it returns TRUE/FALSE, not NTSTATUS) and fix callers to use it properly. - Also add ExEnumHandleTable to NDK. svn path=/trunk/; revision=25384 --- reactos/include/ndk/exfuncs.h | 13 +++ reactos/include/ndk/obfuncs.h | 2 +- reactos/ntoskrnl/ex/sysinfo.c | 17 ++-- reactos/ntoskrnl/include/internal/ob.h | 6 ++ reactos/ntoskrnl/ob/obhandle.c | 82 +++++++++++++++++-- .../subsystems/win32/win32k/ntuser/desktop.c | 38 ++++----- 6 files changed, 121 insertions(+), 37 deletions(-) diff --git a/reactos/include/ndk/exfuncs.h b/reactos/include/ndk/exfuncs.h index 0a404ed5790..ba795188133 100644 --- a/reactos/include/ndk/exfuncs.h +++ b/reactos/include/ndk/exfuncs.h @@ -103,6 +103,19 @@ ExTryToAcquireResourceExclusiveLite( IN PERESOURCE Resource ); +// +// Handle Table Functions +// +NTKERNELAPI +BOOLEAN +NTAPI +ExEnumHandleTable( + IN PHANDLE_TABLE HandleTable, + IN PVOID Callback, + IN OUT PVOID Param, + OUT PHANDLE Handle OPTIONAL +); + #endif // diff --git a/reactos/include/ndk/obfuncs.h b/reactos/include/ndk/obfuncs.h index 258033b1e37..6e86a599011 100644 --- a/reactos/include/ndk/obfuncs.h +++ b/reactos/include/ndk/obfuncs.h @@ -109,7 +109,7 @@ ObReferenceObjectByName( ); NTKERNELAPI -NTSTATUS +BOOLEAN NTAPI ObFindHandleForObject( IN PEPROCESS Process, diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index ee87bc6ef7b..8f91ef33575 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -41,16 +41,15 @@ ExGetPreviousMode (VOID) /* * @unimplemented */ -VOID -STDCALL -ExEnumHandleTable ( - PULONG HandleTable, - PVOID Callback, - PVOID Param, - PHANDLE Handle OPTIONAL - ) +BOOLEAN +NTAPI +ExEnumHandleTable(IN PHANDLE_TABLE HandleTable, + IN PVOID Callback, + IN OUT PVOID Param, + OUT PHANDLE Handle OPTIONAL) { - UNIMPLEMENTED; + UNIMPLEMENTED; + return FALSE; } /* diff --git a/reactos/ntoskrnl/include/internal/ob.h b/reactos/ntoskrnl/include/internal/ob.h index f8a2f21ccc6..a0ae504476d 100644 --- a/reactos/ntoskrnl/include/internal/ob.h +++ b/reactos/ntoskrnl/include/internal/ob.h @@ -79,6 +79,12 @@ typedef struct _OBP_CLOSE_HANDLE_CONTEXT PHANDLE_TABLE HandleTable; KPROCESSOR_MODE AccessMode; } OBP_CLOSE_HANDLE_CONTEXT, *POBP_CLOSE_HANDLE_CONTEXT; +typedef struct _OBP_FIND_HANDLE_DATA +{ + POBJECT_HEADER ObjectHeader; + POBJECT_TYPE ObjectType; + POBJECT_HANDLE_INFORMATION HandleInformation; +} OBP_FIND_HANDLE_DATA, *POBP_FIND_HANDLE_DATA; // // Private Temporary Buffer for Lookup Routines diff --git a/reactos/ntoskrnl/ob/obhandle.c b/reactos/ntoskrnl/ob/obhandle.c index 635d768c625..c88c59451b1 100644 --- a/reactos/ntoskrnl/ob/obhandle.c +++ b/reactos/ntoskrnl/ob/obhandle.c @@ -23,6 +23,18 @@ PHANDLE_TABLE ObpKernelHandleTable = NULL; /* PRIVATE FUNCTIONS *********************************************************/ +BOOLEAN +NTAPI +ObpEnumFindHandleProcedure(IN PHANDLE_TABLE_ENTRY HandleEntry, + IN HANDLE Handle, + IN PVOID Context) +{ + /* FIXME: TODO */ + DPRINT1("Not yet implemented!\n"); + KEBUGCHECK(0); + return FALSE; +} + POBJECT_HANDLE_COUNT_ENTRY NTAPI ObpInsertHandleCount(IN POBJECT_HEADER ObjectHeader) @@ -583,7 +595,6 @@ ObpIncrementHandleCount(IN PVOID Object, !(ObjectHeader->Flags & OB_FLAG_EXCLUSIVE)) { /* Incorrect attempt */ - DPRINT1("Failing here\n"); Status = STATUS_INVALID_PARAMETER; goto Quickie; } @@ -827,7 +838,6 @@ ObpIncrementUnnamedHandleCount(IN PVOID Object, !(ObjectHeader->Flags & OB_FLAG_EXCLUSIVE)) { /* Incorrect attempt */ - DPRINT1("failing here\n"); Status = STATUS_INVALID_PARAMETER; goto Quickie; } @@ -2196,15 +2206,75 @@ ObOpenObjectByPointer(IN PVOID Object, return Status; } -NTSTATUS STDCALL +/*++ +* @name ObFindHandleForObject +* @implemented NT4 +* +* The ObFindHandleForObject routine +* +* @param Process +* . +* +* @param Object +* . +* +* @param ObjectType +* . +* +* @param HandleInformation +* . +* +* @param HandleReturn +* . +* +* @return . +* +* @remarks None. +* +*--*/ +BOOLEAN +NTAPI ObFindHandleForObject(IN PEPROCESS Process, IN PVOID Object, IN POBJECT_TYPE ObjectType, IN POBJECT_HANDLE_INFORMATION HandleInformation, - OUT PHANDLE HandleReturn) + OUT PHANDLE Handle) { - DPRINT("ObFindHandleForObject is unimplemented!\n"); - return STATUS_UNSUCCESSFUL; + OBP_FIND_HANDLE_DATA FindData; + BOOLEAN Result = FALSE; + + /* Make sure we have an object table */ + if (Process->ObjectTable) + { + /* Check if we have an object */ + if (Object) + { + /* Set its header */ + FindData.ObjectHeader = OBJECT_TO_OBJECT_HEADER(Object); + } + else + { + /* Otherwise, no object to match*/ + FindData.ObjectHeader = NULL; + } + + /* Set other information */ + FindData.ObjectType = ObjectType; + FindData.HandleInformation = HandleInformation; + + /* Enumerate the handle table */ + if (ExEnumHandleTable(Process->ObjectTable, + ObpEnumFindHandleProcedure, + &FindData, + Handle)) + { + /* Set success */ + Result = TRUE; + } + } + + /* Return the result */ + return Result; } /*++ diff --git a/reactos/subsystems/win32/win32k/ntuser/desktop.c b/reactos/subsystems/win32/win32k/ntuser/desktop.c index 8ed84433508..ec23d919b0e 100644 --- a/reactos/subsystems/win32/win32k/ntuser/desktop.c +++ b/reactos/subsystems/win32/win32k/ntuser/desktop.c @@ -299,15 +299,14 @@ IntParseDesktopPath(PEPROCESS Process, { /* search the process handle table for (inherited) window station handles, use a more appropriate one than WinSta0 if possible. */ - Status = ObFindHandleForObject(Process, - NULL, - ExWindowStationObjectType, - NULL, - (PHANDLE)hWinSta); - if(!NT_SUCCESS(Status)) + if (!ObFindHandleForObject(Process, + NULL, + ExWindowStationObjectType, + NULL, + (PHANDLE)hWinSta)) { - /* we had no luck searching for opened handles, use WinSta0 now */ - RtlInitUnicodeString(&WinSta, L"WinSta0"); + /* we had no luck searching for opened handles, use WinSta0 now */ + RtlInitUnicodeString(&WinSta, L"WinSta0"); } } @@ -315,12 +314,11 @@ IntParseDesktopPath(PEPROCESS Process, { /* search the process handle table for (inherited) desktop handles, use a more appropriate one than Default if possible. */ - Status = ObFindHandleForObject(Process, - NULL, - ExDesktopObjectType, - NULL, - (PHANDLE)hDesktop); - if(!NT_SUCCESS(Status)) + if (!ObFindHandleForObject(Process, + NULL, + ExDesktopObjectType, + NULL, + (PHANDLE)hDesktop)) { /* we had no luck searching for opened handles, use Desktop now */ RtlInitUnicodeString(&Desktop, L"Default"); @@ -479,13 +477,11 @@ IntGetDesktopObjectHandle(PDESKTOP_OBJECT DesktopObject) ASSERT(DesktopObject); - Status = ObFindHandleForObject(PsGetCurrentProcess(), - DesktopObject, - ExDesktopObjectType, - NULL, - (PHANDLE)&Ret); - - if(!NT_SUCCESS(Status)) + if (!ObFindHandleForObject(PsGetCurrentProcess(), + DesktopObject, + ExDesktopObjectType, + NULL, + (PHANDLE)&Ret)) { Status = ObOpenObjectByPointer(DesktopObject, 0,