- 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
This commit is contained in:
Alex Ionescu 2007-01-08 19:40:10 +00:00
parent 30bc8d330f
commit 76de33fe36
6 changed files with 121 additions and 37 deletions

View file

@ -103,6 +103,19 @@ ExTryToAcquireResourceExclusiveLite(
IN PERESOURCE Resource 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 #endif
// //

View file

@ -109,7 +109,7 @@ ObReferenceObjectByName(
); );
NTKERNELAPI NTKERNELAPI
NTSTATUS BOOLEAN
NTAPI NTAPI
ObFindHandleForObject( ObFindHandleForObject(
IN PEPROCESS Process, IN PEPROCESS Process,

View file

@ -41,16 +41,15 @@ ExGetPreviousMode (VOID)
/* /*
* @unimplemented * @unimplemented
*/ */
VOID BOOLEAN
STDCALL NTAPI
ExEnumHandleTable ( ExEnumHandleTable(IN PHANDLE_TABLE HandleTable,
PULONG HandleTable, IN PVOID Callback,
PVOID Callback, IN OUT PVOID Param,
PVOID Param, OUT PHANDLE Handle OPTIONAL)
PHANDLE Handle OPTIONAL
)
{ {
UNIMPLEMENTED; UNIMPLEMENTED;
return FALSE;
} }
/* /*

View file

@ -79,6 +79,12 @@ typedef struct _OBP_CLOSE_HANDLE_CONTEXT
PHANDLE_TABLE HandleTable; PHANDLE_TABLE HandleTable;
KPROCESSOR_MODE AccessMode; KPROCESSOR_MODE AccessMode;
} OBP_CLOSE_HANDLE_CONTEXT, *POBP_CLOSE_HANDLE_CONTEXT; } 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 // Private Temporary Buffer for Lookup Routines

View file

@ -23,6 +23,18 @@ PHANDLE_TABLE ObpKernelHandleTable = NULL;
/* PRIVATE FUNCTIONS *********************************************************/ /* 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 POBJECT_HANDLE_COUNT_ENTRY
NTAPI NTAPI
ObpInsertHandleCount(IN POBJECT_HEADER ObjectHeader) ObpInsertHandleCount(IN POBJECT_HEADER ObjectHeader)
@ -583,7 +595,6 @@ ObpIncrementHandleCount(IN PVOID Object,
!(ObjectHeader->Flags & OB_FLAG_EXCLUSIVE)) !(ObjectHeader->Flags & OB_FLAG_EXCLUSIVE))
{ {
/* Incorrect attempt */ /* Incorrect attempt */
DPRINT1("Failing here\n");
Status = STATUS_INVALID_PARAMETER; Status = STATUS_INVALID_PARAMETER;
goto Quickie; goto Quickie;
} }
@ -827,7 +838,6 @@ ObpIncrementUnnamedHandleCount(IN PVOID Object,
!(ObjectHeader->Flags & OB_FLAG_EXCLUSIVE)) !(ObjectHeader->Flags & OB_FLAG_EXCLUSIVE))
{ {
/* Incorrect attempt */ /* Incorrect attempt */
DPRINT1("failing here\n");
Status = STATUS_INVALID_PARAMETER; Status = STATUS_INVALID_PARAMETER;
goto Quickie; goto Quickie;
} }
@ -2196,15 +2206,75 @@ ObOpenObjectByPointer(IN PVOID Object,
return Status; return Status;
} }
NTSTATUS STDCALL /*++
* @name ObFindHandleForObject
* @implemented NT4
*
* The ObFindHandleForObject routine <FILLMEIN>
*
* @param Process
* <FILLMEIN>.
*
* @param Object
* <FILLMEIN>.
*
* @param ObjectType
* <FILLMEIN>.
*
* @param HandleInformation
* <FILLMEIN>.
*
* @param HandleReturn
* <FILLMEIN>.
*
* @return <FILLMEIN>.
*
* @remarks None.
*
*--*/
BOOLEAN
NTAPI
ObFindHandleForObject(IN PEPROCESS Process, ObFindHandleForObject(IN PEPROCESS Process,
IN PVOID Object, IN PVOID Object,
IN POBJECT_TYPE ObjectType, IN POBJECT_TYPE ObjectType,
IN POBJECT_HANDLE_INFORMATION HandleInformation, IN POBJECT_HANDLE_INFORMATION HandleInformation,
OUT PHANDLE HandleReturn) OUT PHANDLE Handle)
{ {
DPRINT("ObFindHandleForObject is unimplemented!\n"); OBP_FIND_HANDLE_DATA FindData;
return STATUS_UNSUCCESSFUL; 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;
} }
/*++ /*++

View file

@ -299,15 +299,14 @@ IntParseDesktopPath(PEPROCESS Process,
{ {
/* search the process handle table for (inherited) window station /* search the process handle table for (inherited) window station
handles, use a more appropriate one than WinSta0 if possible. */ handles, use a more appropriate one than WinSta0 if possible. */
Status = ObFindHandleForObject(Process, if (!ObFindHandleForObject(Process,
NULL, NULL,
ExWindowStationObjectType, ExWindowStationObjectType,
NULL, NULL,
(PHANDLE)hWinSta); (PHANDLE)hWinSta))
if(!NT_SUCCESS(Status))
{ {
/* we had no luck searching for opened handles, use WinSta0 now */ /* we had no luck searching for opened handles, use WinSta0 now */
RtlInitUnicodeString(&WinSta, L"WinSta0"); RtlInitUnicodeString(&WinSta, L"WinSta0");
} }
} }
@ -315,12 +314,11 @@ IntParseDesktopPath(PEPROCESS Process,
{ {
/* search the process handle table for (inherited) desktop /* search the process handle table for (inherited) desktop
handles, use a more appropriate one than Default if possible. */ handles, use a more appropriate one than Default if possible. */
Status = ObFindHandleForObject(Process, if (!ObFindHandleForObject(Process,
NULL, NULL,
ExDesktopObjectType, ExDesktopObjectType,
NULL, NULL,
(PHANDLE)hDesktop); (PHANDLE)hDesktop))
if(!NT_SUCCESS(Status))
{ {
/* we had no luck searching for opened handles, use Desktop now */ /* we had no luck searching for opened handles, use Desktop now */
RtlInitUnicodeString(&Desktop, L"Default"); RtlInitUnicodeString(&Desktop, L"Default");
@ -479,13 +477,11 @@ IntGetDesktopObjectHandle(PDESKTOP_OBJECT DesktopObject)
ASSERT(DesktopObject); ASSERT(DesktopObject);
Status = ObFindHandleForObject(PsGetCurrentProcess(), if (!ObFindHandleForObject(PsGetCurrentProcess(),
DesktopObject, DesktopObject,
ExDesktopObjectType, ExDesktopObjectType,
NULL, NULL,
(PHANDLE)&Ret); (PHANDLE)&Ret))
if(!NT_SUCCESS(Status))
{ {
Status = ObOpenObjectByPointer(DesktopObject, Status = ObOpenObjectByPointer(DesktopObject,
0, 0,