- 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
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
//
);
NTKERNELAPI
-NTSTATUS
+BOOLEAN
NTAPI
ObFindHandleForObject(
IN PEPROCESS Process,
/*
* @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;
}
/*
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
/* 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)
!(ObjectHeader->Flags & OB_FLAG_EXCLUSIVE))
{
/* Incorrect attempt */
- DPRINT1("Failing here\n");
Status = STATUS_INVALID_PARAMETER;
goto Quickie;
}
!(ObjectHeader->Flags & OB_FLAG_EXCLUSIVE))
{
/* Incorrect attempt */
- DPRINT1("failing here\n");
Status = STATUS_INVALID_PARAMETER;
goto Quickie;
}
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;
}
/*++
{
/* 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");
}
}
{
/* 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");
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,