mirror of
https://github.com/reactos/reactos.git
synced 2025-07-10 23:14:13 +00:00
Rename HANDLE_REP to HANDLE_ENTRY.
svn path=/trunk/; revision=10842
This commit is contained in:
parent
b6a00f0a9a
commit
7347219eb4
1 changed files with 81 additions and 74 deletions
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: handle.c,v 1.59 2004/08/20 23:46:21 navaraf Exp $
|
/* $Id: handle.c,v 1.60 2004/09/13 14:43:50 ekohl Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -38,15 +38,15 @@
|
||||||
/*
|
/*
|
||||||
* PURPOSE: Defines a handle
|
* PURPOSE: Defines a handle
|
||||||
*/
|
*/
|
||||||
typedef struct
|
typedef struct _HANDLE_ENTRY
|
||||||
{
|
{
|
||||||
PVOID ObjectBody;
|
PVOID ObjectBody;
|
||||||
ACCESS_MASK GrantedAccess;
|
ACCESS_MASK GrantedAccess;
|
||||||
} HANDLE_REP, *PHANDLE_REP;
|
} HANDLE_ENTRY, *PHANDLE_ENTRY;
|
||||||
|
|
||||||
#define HANDLE_BLOCK_ENTRIES \
|
#define HANDLE_BLOCK_ENTRIES \
|
||||||
(((4 * PAGE_SIZE) - \
|
(((4 * PAGE_SIZE) - \
|
||||||
(sizeof(LIST_ENTRY) + sizeof(ULONG))) / sizeof(HANDLE_REP))
|
(sizeof(LIST_ENTRY) + sizeof(ULONG))) / sizeof(HANDLE_ENTRY))
|
||||||
|
|
||||||
#define OB_HANDLE_FLAG_MASK 0x00000007
|
#define OB_HANDLE_FLAG_MASK 0x00000007
|
||||||
#define OB_HANDLE_FLAG_AUDIT 0x00000004
|
#define OB_HANDLE_FLAG_AUDIT 0x00000004
|
||||||
|
@ -67,7 +67,7 @@ typedef struct
|
||||||
LIST_ENTRY entry;
|
LIST_ENTRY entry;
|
||||||
ULONG allocation_hint;
|
ULONG allocation_hint;
|
||||||
ULONG allocation_count;
|
ULONG allocation_count;
|
||||||
HANDLE_REP handles[HANDLE_BLOCK_ENTRIES];
|
HANDLE_ENTRY handles[HANDLE_BLOCK_ENTRIES];
|
||||||
} HANDLE_BLOCK, *PHANDLE_BLOCK;
|
} HANDLE_BLOCK, *PHANDLE_BLOCK;
|
||||||
|
|
||||||
|
|
||||||
|
@ -78,8 +78,6 @@ typedef struct
|
||||||
/* FUNCTIONS ***************************************************************/
|
/* FUNCTIONS ***************************************************************/
|
||||||
|
|
||||||
|
|
||||||
static PHANDLE_REP
|
|
||||||
ObpGetObjectByHandle(PHANDLE_TABLE HandleTable, HANDLE h, HANDLE_BLOCK **Block)
|
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Get the data structure for a handle
|
* FUNCTION: Get the data structure for a handle
|
||||||
* ARGUMENTS:
|
* ARGUMENTS:
|
||||||
|
@ -88,6 +86,10 @@ ObpGetObjectByHandle(PHANDLE_TABLE HandleTable, HANDLE h, HANDLE_BLOCK **Block)
|
||||||
* ARGUMENTS: A pointer to the information about the handle on success,
|
* ARGUMENTS: A pointer to the information about the handle on success,
|
||||||
* NULL on failure
|
* NULL on failure
|
||||||
*/
|
*/
|
||||||
|
static PHANDLE_ENTRY
|
||||||
|
ObpGetObjectByHandle(PHANDLE_TABLE HandleTable,
|
||||||
|
HANDLE h,
|
||||||
|
HANDLE_BLOCK **Block)
|
||||||
{
|
{
|
||||||
PLIST_ENTRY current;
|
PLIST_ENTRY current;
|
||||||
unsigned int handle = (((unsigned int)h) >> 2) - 1;
|
unsigned int handle = (((unsigned int)h) >> 2) - 1;
|
||||||
|
@ -123,26 +125,26 @@ ObpQueryHandleAttributes(HANDLE Handle,
|
||||||
{
|
{
|
||||||
PEPROCESS Process;
|
PEPROCESS Process;
|
||||||
KIRQL oldIrql;
|
KIRQL oldIrql;
|
||||||
PHANDLE_REP HandleRep;
|
PHANDLE_ENTRY HandleEntry;
|
||||||
|
|
||||||
DPRINT("ObpQueryHandleAttributes(Handle %x)\n", Handle);
|
DPRINT("ObpQueryHandleAttributes(Handle %x)\n", Handle);
|
||||||
|
|
||||||
Process = PsGetCurrentProcess();
|
Process = PsGetCurrentProcess();
|
||||||
|
|
||||||
KeAcquireSpinLock(&Process->HandleTable.ListLock, &oldIrql);
|
KeAcquireSpinLock(&Process->HandleTable.ListLock, &oldIrql);
|
||||||
HandleRep = ObpGetObjectByHandle(&Process->HandleTable,
|
HandleEntry = ObpGetObjectByHandle(&Process->HandleTable,
|
||||||
Handle,
|
Handle,
|
||||||
NULL);
|
NULL);
|
||||||
if (HandleRep == NULL)
|
if (HandleEntry == NULL)
|
||||||
{
|
{
|
||||||
KeReleaseSpinLock(&Process->HandleTable.ListLock, oldIrql);
|
KeReleaseSpinLock(&Process->HandleTable.ListLock, oldIrql);
|
||||||
return STATUS_INVALID_HANDLE;
|
return STATUS_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
HandleInfo->Inherit =
|
HandleInfo->Inherit =
|
||||||
((ULONG_PTR)HandleRep->ObjectBody & OB_HANDLE_FLAG_INHERIT);
|
((ULONG_PTR)HandleEntry->ObjectBody & OB_HANDLE_FLAG_INHERIT);
|
||||||
HandleInfo->ProtectFromClose =
|
HandleInfo->ProtectFromClose =
|
||||||
((ULONG_PTR)HandleRep->ObjectBody & OB_HANDLE_FLAG_PROTECT);
|
((ULONG_PTR)HandleEntry->ObjectBody & OB_HANDLE_FLAG_PROTECT);
|
||||||
|
|
||||||
KeReleaseSpinLock(&Process->HandleTable.ListLock, oldIrql);
|
KeReleaseSpinLock(&Process->HandleTable.ListLock, oldIrql);
|
||||||
|
|
||||||
|
@ -154,33 +156,33 @@ NTSTATUS
|
||||||
ObpSetHandleAttributes(HANDLE Handle,
|
ObpSetHandleAttributes(HANDLE Handle,
|
||||||
POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo)
|
POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo)
|
||||||
{
|
{
|
||||||
|
PHANDLE_ENTRY HandleEntry;
|
||||||
PEPROCESS Process;
|
PEPROCESS Process;
|
||||||
KIRQL oldIrql;
|
KIRQL oldIrql;
|
||||||
PHANDLE_REP HandleRep;
|
|
||||||
|
|
||||||
DPRINT("ObpQueryHandleAttributes(Handle %x)\n", Handle);
|
DPRINT("ObpQueryHandleAttributes(Handle %x)\n", Handle);
|
||||||
|
|
||||||
Process = PsGetCurrentProcess();
|
Process = PsGetCurrentProcess();
|
||||||
|
|
||||||
KeAcquireSpinLock(&Process->HandleTable.ListLock, &oldIrql);
|
KeAcquireSpinLock(&Process->HandleTable.ListLock, &oldIrql);
|
||||||
HandleRep = ObpGetObjectByHandle(&Process->HandleTable,
|
HandleEntry = ObpGetObjectByHandle(&Process->HandleTable,
|
||||||
Handle,
|
Handle,
|
||||||
NULL);
|
NULL);
|
||||||
if (HandleRep == NULL)
|
if (HandleEntry == NULL)
|
||||||
{
|
{
|
||||||
KeReleaseSpinLock(&Process->HandleTable.ListLock, oldIrql);
|
KeReleaseSpinLock(&Process->HandleTable.ListLock, oldIrql);
|
||||||
return STATUS_INVALID_HANDLE;
|
return STATUS_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HandleInfo->Inherit)
|
if (HandleInfo->Inherit)
|
||||||
HandleRep->ObjectBody = (PVOID)((ULONG_PTR)HandleRep->ObjectBody | OB_HANDLE_FLAG_INHERIT);
|
HandleEntry->ObjectBody = (PVOID)((ULONG_PTR)HandleEntry->ObjectBody | OB_HANDLE_FLAG_INHERIT);
|
||||||
else
|
else
|
||||||
HandleRep->ObjectBody = (PVOID)((ULONG_PTR)HandleRep->ObjectBody & ~OB_HANDLE_FLAG_INHERIT);
|
HandleEntry->ObjectBody = (PVOID)((ULONG_PTR)HandleEntry->ObjectBody & ~OB_HANDLE_FLAG_INHERIT);
|
||||||
|
|
||||||
if (HandleInfo->ProtectFromClose)
|
if (HandleInfo->ProtectFromClose)
|
||||||
HandleRep->ObjectBody = (PVOID)((ULONG_PTR)HandleRep->ObjectBody | OB_HANDLE_FLAG_PROTECT);
|
HandleEntry->ObjectBody = (PVOID)((ULONG_PTR)HandleEntry->ObjectBody | OB_HANDLE_FLAG_PROTECT);
|
||||||
else
|
else
|
||||||
HandleRep->ObjectBody = (PVOID)((ULONG_PTR)HandleRep->ObjectBody & ~OB_HANDLE_FLAG_PROTECT);
|
HandleEntry->ObjectBody = (PVOID)((ULONG_PTR)HandleEntry->ObjectBody & ~OB_HANDLE_FLAG_PROTECT);
|
||||||
|
|
||||||
/* FIXME: Do we need to set anything in the object header??? */
|
/* FIXME: Do we need to set anything in the object header??? */
|
||||||
|
|
||||||
|
@ -200,19 +202,20 @@ ObDuplicateObject(PEPROCESS SourceProcess,
|
||||||
ULONG Options)
|
ULONG Options)
|
||||||
{
|
{
|
||||||
KIRQL oldIrql;
|
KIRQL oldIrql;
|
||||||
PHANDLE_REP SourceHandleRep;
|
PHANDLE_ENTRY SourceHandleEntry;
|
||||||
PVOID ObjectBody;
|
PVOID ObjectBody;
|
||||||
|
|
||||||
KeAcquireSpinLock(&SourceProcess->HandleTable.ListLock, &oldIrql);
|
KeAcquireSpinLock(&SourceProcess->HandleTable.ListLock, &oldIrql);
|
||||||
SourceHandleRep = ObpGetObjectByHandle(&SourceProcess->HandleTable,
|
SourceHandleEntry = ObpGetObjectByHandle(&SourceProcess->HandleTable,
|
||||||
SourceHandle,
|
SourceHandle,
|
||||||
NULL);
|
NULL);
|
||||||
if (SourceHandleRep == NULL)
|
if (SourceHandleEntry == NULL)
|
||||||
{
|
{
|
||||||
KeReleaseSpinLock(&SourceProcess->HandleTable.ListLock, oldIrql);
|
KeReleaseSpinLock(&SourceProcess->HandleTable.ListLock, oldIrql);
|
||||||
return(STATUS_INVALID_HANDLE);
|
return STATUS_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
ObjectBody = OB_ENTRY_TO_POINTER(SourceHandleRep->ObjectBody);
|
|
||||||
|
ObjectBody = OB_ENTRY_TO_POINTER(SourceHandleEntry->ObjectBody);
|
||||||
ObReferenceObjectByPointer(ObjectBody,
|
ObReferenceObjectByPointer(ObjectBody,
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -220,7 +223,7 @@ ObDuplicateObject(PEPROCESS SourceProcess,
|
||||||
|
|
||||||
if (Options & DUPLICATE_SAME_ACCESS)
|
if (Options & DUPLICATE_SAME_ACCESS)
|
||||||
{
|
{
|
||||||
DesiredAccess = SourceHandleRep->GrantedAccess;
|
DesiredAccess = SourceHandleEntry->GrantedAccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
KeReleaseSpinLock(&SourceProcess->HandleTable.ListLock, oldIrql);
|
KeReleaseSpinLock(&SourceProcess->HandleTable.ListLock, oldIrql);
|
||||||
|
@ -236,7 +239,8 @@ ObDuplicateObject(PEPROCESS SourceProcess,
|
||||||
}
|
}
|
||||||
|
|
||||||
ObDereferenceObject(ObjectBody);
|
ObDereferenceObject(ObjectBody);
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -277,7 +281,7 @@ NtDuplicateObject (IN HANDLE SourceProcessHandle,
|
||||||
{
|
{
|
||||||
PEPROCESS SourceProcess;
|
PEPROCESS SourceProcess;
|
||||||
PEPROCESS TargetProcess;
|
PEPROCESS TargetProcess;
|
||||||
PHANDLE_REP SourceHandleRep;
|
PHANDLE_ENTRY SourceHandleEntry;
|
||||||
KIRQL oldIrql;
|
KIRQL oldIrql;
|
||||||
PVOID ObjectBody;
|
PVOID ObjectBody;
|
||||||
HANDLE TargetHandle;
|
HANDLE TargetHandle;
|
||||||
|
@ -295,6 +299,7 @@ NtDuplicateObject (IN HANDLE SourceProcessHandle,
|
||||||
{
|
{
|
||||||
return(Status);
|
return(Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ObReferenceObjectByHandle(TargetProcessHandle,
|
Status = ObReferenceObjectByHandle(TargetProcessHandle,
|
||||||
PROCESS_DUP_HANDLE,
|
PROCESS_DUP_HANDLE,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -326,17 +331,17 @@ NtDuplicateObject (IN HANDLE SourceProcessHandle,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
KeAcquireSpinLock(&SourceProcess->HandleTable.ListLock, &oldIrql);
|
KeAcquireSpinLock(&SourceProcess->HandleTable.ListLock, &oldIrql);
|
||||||
SourceHandleRep = ObpGetObjectByHandle(&SourceProcess->HandleTable,
|
SourceHandleEntry = ObpGetObjectByHandle(&SourceProcess->HandleTable,
|
||||||
SourceHandle,
|
SourceHandle,
|
||||||
NULL);
|
NULL);
|
||||||
if (SourceHandleRep == NULL)
|
if (SourceHandleEntry == NULL)
|
||||||
{
|
{
|
||||||
KeReleaseSpinLock(&SourceProcess->HandleTable.ListLock, oldIrql);
|
KeReleaseSpinLock(&SourceProcess->HandleTable.ListLock, oldIrql);
|
||||||
ObDereferenceObject(SourceProcess);
|
ObDereferenceObject(SourceProcess);
|
||||||
ObDereferenceObject(TargetProcess);
|
ObDereferenceObject(TargetProcess);
|
||||||
return(STATUS_INVALID_HANDLE);
|
return(STATUS_INVALID_HANDLE);
|
||||||
}
|
}
|
||||||
ObjectBody = OB_ENTRY_TO_POINTER(SourceHandleRep->ObjectBody);
|
ObjectBody = OB_ENTRY_TO_POINTER(SourceHandleEntry->ObjectBody);
|
||||||
ObReferenceObjectByPointer(ObjectBody,
|
ObReferenceObjectByPointer(ObjectBody,
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -344,11 +349,11 @@ NtDuplicateObject (IN HANDLE SourceProcessHandle,
|
||||||
|
|
||||||
if (Options & DUPLICATE_SAME_ACCESS)
|
if (Options & DUPLICATE_SAME_ACCESS)
|
||||||
{
|
{
|
||||||
DesiredAccess = SourceHandleRep->GrantedAccess;
|
DesiredAccess = SourceHandleEntry->GrantedAccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
KeReleaseSpinLock(&SourceProcess->HandleTable.ListLock, oldIrql);
|
KeReleaseSpinLock(&SourceProcess->HandleTable.ListLock, oldIrql);
|
||||||
if (!((ULONG_PTR)SourceHandleRep->ObjectBody & OB_HANDLE_FLAG_INHERIT))
|
if (!((ULONG_PTR)SourceHandleEntry->ObjectBody & OB_HANDLE_FLAG_INHERIT))
|
||||||
{
|
{
|
||||||
ObDereferenceObject(TargetProcess);
|
ObDereferenceObject(TargetProcess);
|
||||||
ObDereferenceObject(SourceProcess);
|
ObDereferenceObject(SourceProcess);
|
||||||
|
@ -545,7 +550,7 @@ ObDeleteHandle(PEPROCESS Process,
|
||||||
HANDLE Handle,
|
HANDLE Handle,
|
||||||
PVOID *ObjectBody)
|
PVOID *ObjectBody)
|
||||||
{
|
{
|
||||||
PHANDLE_REP Rep;
|
PHANDLE_ENTRY HandleEntry;
|
||||||
PVOID Body;
|
PVOID Body;
|
||||||
KIRQL oldIrql;
|
KIRQL oldIrql;
|
||||||
PHANDLE_TABLE HandleTable;
|
PHANDLE_TABLE HandleTable;
|
||||||
|
@ -558,22 +563,22 @@ ObDeleteHandle(PEPROCESS Process,
|
||||||
|
|
||||||
KeAcquireSpinLock(&HandleTable->ListLock, &oldIrql);
|
KeAcquireSpinLock(&HandleTable->ListLock, &oldIrql);
|
||||||
|
|
||||||
Rep = ObpGetObjectByHandle(HandleTable, Handle, &Block);
|
HandleEntry = ObpGetObjectByHandle(HandleTable, Handle, &Block);
|
||||||
if (Rep == NULL)
|
if (HandleEntry == NULL)
|
||||||
{
|
{
|
||||||
KeReleaseSpinLock(&HandleTable->ListLock, oldIrql);
|
KeReleaseSpinLock(&HandleTable->ListLock, oldIrql);
|
||||||
*ObjectBody = NULL;
|
*ObjectBody = NULL;
|
||||||
return STATUS_INVALID_HANDLE;
|
return STATUS_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ULONG_PTR)Rep->ObjectBody & OB_HANDLE_FLAG_PROTECT)
|
if ((ULONG_PTR)HandleEntry->ObjectBody & OB_HANDLE_FLAG_PROTECT)
|
||||||
{
|
{
|
||||||
KeReleaseSpinLock(&HandleTable->ListLock, oldIrql);
|
KeReleaseSpinLock(&HandleTable->ListLock, oldIrql);
|
||||||
*ObjectBody = NULL;
|
*ObjectBody = NULL;
|
||||||
return STATUS_HANDLE_NOT_CLOSABLE;
|
return STATUS_HANDLE_NOT_CLOSABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Body = OB_ENTRY_TO_POINTER(Rep->ObjectBody);
|
Body = OB_ENTRY_TO_POINTER(HandleEntry->ObjectBody);
|
||||||
DPRINT("ObjectBody %x\n", Body);
|
DPRINT("ObjectBody %x\n", Body);
|
||||||
if (Body == NULL)
|
if (Body == NULL)
|
||||||
{
|
{
|
||||||
|
@ -588,7 +593,7 @@ ObDeleteHandle(PEPROCESS Process,
|
||||||
NULL,
|
NULL,
|
||||||
UserMode);
|
UserMode);
|
||||||
InterlockedDecrement(&Header->HandleCount);
|
InterlockedDecrement(&Header->HandleCount);
|
||||||
Rep->ObjectBody = NULL;
|
HandleEntry->ObjectBody = NULL;
|
||||||
|
|
||||||
Block->allocation_count--;
|
Block->allocation_count--;
|
||||||
Block->allocation_hint = (ULONG_PTR)Handle % HANDLE_BLOCK_ENTRIES;
|
Block->allocation_hint = (ULONG_PTR)Handle % HANDLE_BLOCK_ENTRIES;
|
||||||
|
@ -609,7 +614,8 @@ ObDeleteHandle(PEPROCESS Process,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NTSTATUS ObCreateHandle(PEPROCESS Process,
|
NTSTATUS
|
||||||
|
ObCreateHandle(PEPROCESS Process,
|
||||||
PVOID ObjectBody,
|
PVOID ObjectBody,
|
||||||
ACCESS_MASK GrantedAccess,
|
ACCESS_MASK GrantedAccess,
|
||||||
BOOLEAN Inherit,
|
BOOLEAN Inherit,
|
||||||
|
@ -720,23 +726,23 @@ ObQueryObjectAuditingByHandle(IN HANDLE Handle,
|
||||||
{
|
{
|
||||||
PEPROCESS Process;
|
PEPROCESS Process;
|
||||||
KIRQL oldIrql;
|
KIRQL oldIrql;
|
||||||
PHANDLE_REP HandleRep;
|
PHANDLE_ENTRY HandleEntry;
|
||||||
|
|
||||||
DPRINT("ObQueryObjectAuditingByHandle(Handle %x)\n", Handle);
|
DPRINT("ObQueryObjectAuditingByHandle(Handle %x)\n", Handle);
|
||||||
|
|
||||||
Process = PsGetCurrentProcess();
|
Process = PsGetCurrentProcess();
|
||||||
|
|
||||||
KeAcquireSpinLock(&Process->HandleTable.ListLock, &oldIrql);
|
KeAcquireSpinLock(&Process->HandleTable.ListLock, &oldIrql);
|
||||||
HandleRep = ObpGetObjectByHandle(&Process->HandleTable,
|
HandleEntry = ObpGetObjectByHandle(&Process->HandleTable,
|
||||||
Handle,
|
Handle,
|
||||||
NULL);
|
NULL);
|
||||||
if (HandleRep == NULL)
|
if (HandleEntry == NULL)
|
||||||
{
|
{
|
||||||
KeReleaseSpinLock(&Process->HandleTable.ListLock, oldIrql);
|
KeReleaseSpinLock(&Process->HandleTable.ListLock, oldIrql);
|
||||||
return STATUS_INVALID_HANDLE;
|
return STATUS_INVALID_HANDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
*GenerateOnClose = (BOOLEAN)((ULONG_PTR)HandleRep->ObjectBody | OB_HANDLE_FLAG_AUDIT);
|
*GenerateOnClose = (BOOLEAN)((ULONG_PTR)HandleEntry->ObjectBody | OB_HANDLE_FLAG_AUDIT);
|
||||||
|
|
||||||
KeReleaseSpinLock(&Process->HandleTable.ListLock, oldIrql);
|
KeReleaseSpinLock(&Process->HandleTable.ListLock, oldIrql);
|
||||||
|
|
||||||
|
@ -768,7 +774,7 @@ ObReferenceObjectByHandle(HANDLE Handle,
|
||||||
* RETURNS: Status
|
* RETURNS: Status
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
PHANDLE_REP HandleRep;
|
PHANDLE_ENTRY HandleEntry;
|
||||||
POBJECT_HEADER ObjectHeader;
|
POBJECT_HEADER ObjectHeader;
|
||||||
KIRQL oldIrql;
|
KIRQL oldIrql;
|
||||||
PVOID ObjectBody;
|
PVOID ObjectBody;
|
||||||
|
@ -814,6 +820,7 @@ ObReferenceObjectByHandle(HANDLE Handle,
|
||||||
CHECKPOINT;
|
CHECKPOINT;
|
||||||
return(STATUS_OBJECT_TYPE_MISMATCH);
|
return(STATUS_OBJECT_TYPE_MISMATCH);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Handle == NtCurrentThread() &&
|
if (Handle == NtCurrentThread() &&
|
||||||
(ObjectType == PsThreadType || ObjectType == NULL))
|
(ObjectType == PsThreadType || ObjectType == NULL))
|
||||||
{
|
{
|
||||||
|
@ -844,16 +851,16 @@ ObReferenceObjectByHandle(HANDLE Handle,
|
||||||
|
|
||||||
KeAcquireSpinLock(&PsGetCurrentProcess()->HandleTable.ListLock,
|
KeAcquireSpinLock(&PsGetCurrentProcess()->HandleTable.ListLock,
|
||||||
&oldIrql);
|
&oldIrql);
|
||||||
HandleRep = ObpGetObjectByHandle(&PsGetCurrentProcess()->HandleTable,
|
HandleEntry = ObpGetObjectByHandle(&PsGetCurrentProcess()->HandleTable,
|
||||||
Handle,
|
Handle,
|
||||||
NULL);
|
NULL);
|
||||||
if (HandleRep == NULL || HandleRep->ObjectBody == 0)
|
if (HandleEntry == NULL || HandleEntry->ObjectBody == 0)
|
||||||
{
|
{
|
||||||
KeReleaseSpinLock(&PsGetCurrentProcess()->HandleTable.ListLock,
|
KeReleaseSpinLock(&PsGetCurrentProcess()->HandleTable.ListLock,
|
||||||
oldIrql);
|
oldIrql);
|
||||||
return(STATUS_INVALID_HANDLE);
|
return(STATUS_INVALID_HANDLE);
|
||||||
}
|
}
|
||||||
ObjectBody = OB_ENTRY_TO_POINTER(HandleRep->ObjectBody);
|
ObjectBody = OB_ENTRY_TO_POINTER(HandleEntry->ObjectBody);
|
||||||
DPRINT("ObjectBody %p\n",ObjectBody);
|
DPRINT("ObjectBody %p\n",ObjectBody);
|
||||||
ObjectHeader = BODY_TO_HEADER(ObjectBody);
|
ObjectHeader = BODY_TO_HEADER(ObjectBody);
|
||||||
DPRINT("ObjectHeader->RefCount %lu\n",ObjectHeader->RefCount);
|
DPRINT("ObjectHeader->RefCount %lu\n",ObjectHeader->RefCount);
|
||||||
|
@ -861,8 +868,8 @@ ObReferenceObjectByHandle(HANDLE Handle,
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
UserMode);
|
UserMode);
|
||||||
Attributes = (ULONG_PTR)HandleRep->ObjectBody & OB_HANDLE_FLAG_MASK;
|
Attributes = (ULONG_PTR)HandleEntry->ObjectBody & OB_HANDLE_FLAG_MASK;
|
||||||
GrantedAccess = HandleRep->GrantedAccess;
|
GrantedAccess = HandleEntry->GrantedAccess;
|
||||||
KeReleaseSpinLock(&PsGetCurrentProcess()->HandleTable.ListLock,
|
KeReleaseSpinLock(&PsGetCurrentProcess()->HandleTable.ListLock,
|
||||||
oldIrql);
|
oldIrql);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue