- 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
);
//
// Handle Table Functions
//
NTKERNELAPI
BOOLEAN
NTAPI
ExEnumHandleTable(
IN PHANDLE_TABLE HandleTable,
IN PVOID Callback,
IN OUT PVOID Param,
OUT PHANDLE Handle OPTIONAL
);
#endif
//

View file

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

View file

@ -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;
}
/*

View file

@ -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

View file

@ -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 <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,
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;
}
/*++

View file

@ -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,