mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 12:55:43 +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
|
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
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -109,7 +109,7 @@ ObReferenceObjectByName(
|
||||||
);
|
);
|
||||||
|
|
||||||
NTKERNELAPI
|
NTKERNELAPI
|
||||||
NTSTATUS
|
BOOLEAN
|
||||||
NTAPI
|
NTAPI
|
||||||
ObFindHandleForObject(
|
ObFindHandleForObject(
|
||||||
IN PEPROCESS Process,
|
IN PEPROCESS Process,
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*++
|
/*++
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue