Rename HANDLE_REP to HANDLE_ENTRY.

svn path=/trunk/; revision=10842
This commit is contained in:
Eric Kohl 2004-09-13 14:43:50 +00:00
parent b6a00f0a9a
commit 7347219eb4

View file

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