mirror of
https://github.com/reactos/reactos.git
synced 2025-07-28 16:12:04 +00:00
- 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:
parent
30bc8d330f
commit
76de33fe36
6 changed files with 121 additions and 37 deletions
|
@ -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
|
||||
|
||||
//
|
||||
|
|
|
@ -109,7 +109,7 @@ ObReferenceObjectByName(
|
|||
);
|
||||
|
||||
NTKERNELAPI
|
||||
NTSTATUS
|
||||
BOOLEAN
|
||||
NTAPI
|
||||
ObFindHandleForObject(
|
||||
IN PEPROCESS Process,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/*++
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue