svn path=/trunk/; revision=10842
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
* along with this program; if not, write to the Free Software
* 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
* PROJECT: ReactOS kernel
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
/*
* PURPOSE: Defines a handle
*/
/*
* PURPOSE: Defines a handle
*/
+typedef struct _HANDLE_ENTRY
- PVOID ObjectBody;
- ACCESS_MASK GrantedAccess;
-} HANDLE_REP, *PHANDLE_REP;
+ PVOID ObjectBody;
+ ACCESS_MASK GrantedAccess;
+} HANDLE_ENTRY, *PHANDLE_ENTRY;
#define HANDLE_BLOCK_ENTRIES \
(((4 * PAGE_SIZE) - \
#define HANDLE_BLOCK_ENTRIES \
(((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_AUDIT 0x00000004
#define OB_HANDLE_FLAG_MASK 0x00000007
#define OB_HANDLE_FLAG_AUDIT 0x00000004
LIST_ENTRY entry;
ULONG allocation_hint;
ULONG allocation_count;
LIST_ENTRY entry;
ULONG allocation_hint;
ULONG allocation_count;
- HANDLE_REP handles[HANDLE_BLOCK_ENTRIES];
+ HANDLE_ENTRY handles[HANDLE_BLOCK_ENTRIES];
} HANDLE_BLOCK, *PHANDLE_BLOCK;
} HANDLE_BLOCK, *PHANDLE_BLOCK;
/* FUNCTIONS ***************************************************************/
/* FUNCTIONS ***************************************************************/
-static PHANDLE_REP
-ObpGetObjectByHandle(PHANDLE_TABLE HandleTable, HANDLE h, HANDLE_BLOCK **Block)
/*
* FUNCTION: Get the data structure for a handle
* ARGUMENTS:
/*
* FUNCTION: Get the data structure for a handle
* ARGUMENTS:
* ARGUMENTS: A pointer to the information about the handle on success,
* NULL on failure
*/
* ARGUMENTS: A pointer to the information about the handle on success,
* NULL on failure
*/
+static PHANDLE_ENTRY
+ObpGetObjectByHandle(PHANDLE_TABLE HandleTable,
+ HANDLE h,
+ HANDLE_BLOCK **Block)
{
PLIST_ENTRY current;
unsigned int handle = (((unsigned int)h) >> 2) - 1;
{
PLIST_ENTRY current;
unsigned int handle = (((unsigned int)h) >> 2) - 1;
- unsigned int count=handle/HANDLE_BLOCK_ENTRIES;
+ unsigned int count = handle / HANDLE_BLOCK_ENTRIES;
HANDLE_BLOCK* blk = NULL;
unsigned int i;
HANDLE_BLOCK* blk = NULL;
unsigned int i;
current = HandleTable->ListHead.Flink;
DPRINT("current %x\n",current);
current = HandleTable->ListHead.Flink;
DPRINT("current %x\n",current);
+ for (i = 0; i < count; i++)
{
current = current->Flink;
if (current == (&(HandleTable->ListHead)))
{
current = current->Flink;
if (current == (&(HandleTable->ListHead)))
{
PEPROCESS Process;
KIRQL oldIrql;
{
PEPROCESS Process;
KIRQL oldIrql;
+ PHANDLE_ENTRY HandleEntry;
DPRINT("ObpQueryHandleAttributes(Handle %x)\n", Handle);
Process = PsGetCurrentProcess();
KeAcquireSpinLock(&Process->HandleTable.ListLock, &oldIrql);
DPRINT("ObpQueryHandleAttributes(Handle %x)\n", Handle);
Process = PsGetCurrentProcess();
KeAcquireSpinLock(&Process->HandleTable.ListLock, &oldIrql);
- HandleRep = ObpGetObjectByHandle(&Process->HandleTable,
- Handle,
- NULL);
- if (HandleRep == NULL)
+ HandleEntry = ObpGetObjectByHandle(&Process->HandleTable,
+ Handle,
+ NULL);
+ if (HandleEntry == NULL)
{
KeReleaseSpinLock(&Process->HandleTable.ListLock, oldIrql);
return STATUS_INVALID_HANDLE;
}
HandleInfo->Inherit =
{
KeReleaseSpinLock(&Process->HandleTable.ListLock, oldIrql);
return STATUS_INVALID_HANDLE;
}
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);
ObpSetHandleAttributes(HANDLE Handle,
POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo)
{
ObpSetHandleAttributes(HANDLE Handle,
POBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo)
{
+ PHANDLE_ENTRY HandleEntry;
PEPROCESS Process;
KIRQL oldIrql;
PEPROCESS Process;
KIRQL oldIrql;
DPRINT("ObpQueryHandleAttributes(Handle %x)\n", Handle);
Process = PsGetCurrentProcess();
KeAcquireSpinLock(&Process->HandleTable.ListLock, &oldIrql);
DPRINT("ObpQueryHandleAttributes(Handle %x)\n", Handle);
Process = PsGetCurrentProcess();
KeAcquireSpinLock(&Process->HandleTable.ListLock, &oldIrql);
- HandleRep = ObpGetObjectByHandle(&Process->HandleTable,
- Handle,
- NULL);
- if (HandleRep == NULL)
+ HandleEntry = ObpGetObjectByHandle(&Process->HandleTable,
+ Handle,
+ NULL);
+ if (HandleEntry == NULL)
{
KeReleaseSpinLock(&Process->HandleTable.ListLock, oldIrql);
return STATUS_INVALID_HANDLE;
}
if (HandleInfo->Inherit)
{
KeReleaseSpinLock(&Process->HandleTable.ListLock, oldIrql);
return STATUS_INVALID_HANDLE;
}
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);
- 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);
- 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??? */
PHANDLE TargetHandle,
ACCESS_MASK DesiredAccess,
BOOLEAN InheritHandle,
PHANDLE TargetHandle,
ACCESS_MASK DesiredAccess,
BOOLEAN InheritHandle,
- PHANDLE_REP SourceHandleRep;
+ PHANDLE_ENTRY SourceHandleEntry;
PVOID ObjectBody;
KeAcquireSpinLock(&SourceProcess->HandleTable.ListLock, &oldIrql);
PVOID ObjectBody;
KeAcquireSpinLock(&SourceProcess->HandleTable.ListLock, &oldIrql);
- SourceHandleRep = ObpGetObjectByHandle(&SourceProcess->HandleTable,
- SourceHandle,
- NULL);
- if (SourceHandleRep == NULL)
+ SourceHandleEntry = ObpGetObjectByHandle(&SourceProcess->HandleTable,
+ SourceHandle,
+ 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,
0,
NULL,
ObReferenceObjectByPointer(ObjectBody,
0,
NULL,
if (Options & DUPLICATE_SAME_ACCESS)
{
if (Options & DUPLICATE_SAME_ACCESS)
{
- DesiredAccess = SourceHandleRep->GrantedAccess;
+ DesiredAccess = SourceHandleEntry->GrantedAccess;
KeReleaseSpinLock(&SourceProcess->HandleTable.ListLock, oldIrql);
ObCreateHandle(TargetProcess,
ObjectBody,
KeReleaseSpinLock(&SourceProcess->HandleTable.ListLock, oldIrql);
ObCreateHandle(TargetProcess,
ObjectBody,
{
ZwClose(SourceHandle);
}
{
ZwClose(SourceHandle);
}
ObDereferenceObject(ObjectBody);
ObDereferenceObject(ObjectBody);
- return(STATUS_SUCCESS);
+
+ return STATUS_SUCCESS;
{
PEPROCESS SourceProcess;
PEPROCESS TargetProcess;
{
PEPROCESS SourceProcess;
PEPROCESS TargetProcess;
- PHANDLE_REP SourceHandleRep;
+ PHANDLE_ENTRY SourceHandleEntry;
KIRQL oldIrql;
PVOID ObjectBody;
HANDLE TargetHandle;
KIRQL oldIrql;
PVOID ObjectBody;
HANDLE TargetHandle;
Status = ObReferenceObjectByHandle(TargetProcessHandle,
PROCESS_DUP_HANDLE,
NULL,
Status = ObReferenceObjectByHandle(TargetProcessHandle,
PROCESS_DUP_HANDLE,
NULL,
else
{
KeAcquireSpinLock(&SourceProcess->HandleTable.ListLock, &oldIrql);
else
{
KeAcquireSpinLock(&SourceProcess->HandleTable.ListLock, &oldIrql);
- SourceHandleRep = ObpGetObjectByHandle(&SourceProcess->HandleTable,
- SourceHandle,
- NULL);
- if (SourceHandleRep == NULL)
+ SourceHandleEntry = ObpGetObjectByHandle(&SourceProcess->HandleTable,
+ SourceHandle,
+ NULL);
+ if (SourceHandleEntry == NULL)
{
KeReleaseSpinLock(&SourceProcess->HandleTable.ListLock, oldIrql);
ObDereferenceObject(SourceProcess);
ObDereferenceObject(TargetProcess);
return(STATUS_INVALID_HANDLE);
}
{
KeReleaseSpinLock(&SourceProcess->HandleTable.ListLock, oldIrql);
ObDereferenceObject(SourceProcess);
ObDereferenceObject(TargetProcess);
return(STATUS_INVALID_HANDLE);
}
- ObjectBody = OB_ENTRY_TO_POINTER(SourceHandleRep->ObjectBody);
+ ObjectBody = OB_ENTRY_TO_POINTER(SourceHandleEntry->ObjectBody);
ObReferenceObjectByPointer(ObjectBody,
0,
NULL,
UserMode);
ObReferenceObjectByPointer(ObjectBody,
0,
NULL,
UserMode);
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(SourceProcess);
{
ObDereferenceObject(TargetProcess);
ObDereferenceObject(SourceProcess);
HANDLE Handle,
PVOID *ObjectBody)
{
HANDLE Handle,
PVOID *ObjectBody)
{
+ PHANDLE_ENTRY HandleEntry;
PVOID Body;
KIRQL oldIrql;
PHANDLE_TABLE HandleTable;
PVOID Body;
KIRQL oldIrql;
PHANDLE_TABLE HandleTable;
KeAcquireSpinLock(&HandleTable->ListLock, &oldIrql);
KeAcquireSpinLock(&HandleTable->ListLock, &oldIrql);
- Rep = ObpGetObjectByHandle(HandleTable, Handle, &Block);
- if (Rep == NULL)
+ HandleEntry = ObpGetObjectByHandle(HandleTable, Handle, &Block);
+ if (HandleEntry == NULL)
{
KeReleaseSpinLock(&HandleTable->ListLock, oldIrql);
*ObjectBody = NULL;
return STATUS_INVALID_HANDLE;
}
{
KeReleaseSpinLock(&HandleTable->ListLock, oldIrql);
*ObjectBody = NULL;
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);
*ObjectBody = NULL;
return STATUS_HANDLE_NOT_CLOSABLE;
}
{
KeReleaseSpinLock(&HandleTable->ListLock, oldIrql);
*ObjectBody = NULL;
return STATUS_HANDLE_NOT_CLOSABLE;
}
- Body = OB_ENTRY_TO_POINTER(Rep->ObjectBody);
+ Body = OB_ENTRY_TO_POINTER(HandleEntry->ObjectBody);
DPRINT("ObjectBody %x\n", Body);
if (Body == NULL)
{
DPRINT("ObjectBody %x\n", Body);
if (Body == NULL)
{
NULL,
UserMode);
InterlockedDecrement(&Header->HandleCount);
NULL,
UserMode);
InterlockedDecrement(&Header->HandleCount);
- Rep->ObjectBody = NULL;
+ HandleEntry->ObjectBody = NULL;
Block->allocation_count--;
Block->allocation_hint = (ULONG_PTR)Handle % HANDLE_BLOCK_ENTRIES;
Block->allocation_count--;
Block->allocation_hint = (ULONG_PTR)Handle % HANDLE_BLOCK_ENTRIES;
-NTSTATUS ObCreateHandle(PEPROCESS Process,
- PVOID ObjectBody,
- ACCESS_MASK GrantedAccess,
- BOOLEAN Inherit,
- PHANDLE HandleReturn)
+NTSTATUS
+ObCreateHandle(PEPROCESS Process,
+ PVOID ObjectBody,
+ ACCESS_MASK GrantedAccess,
+ BOOLEAN Inherit,
+ PHANDLE HandleReturn)
/*
* FUNCTION: Add a handle referencing an object
* ARGUMENTS:
/*
* FUNCTION: Add a handle referencing an object
* ARGUMENTS:
{
PEPROCESS Process;
KIRQL oldIrql;
{
PEPROCESS Process;
KIRQL oldIrql;
+ PHANDLE_ENTRY HandleEntry;
DPRINT("ObQueryObjectAuditingByHandle(Handle %x)\n", Handle);
Process = PsGetCurrentProcess();
KeAcquireSpinLock(&Process->HandleTable.ListLock, &oldIrql);
DPRINT("ObQueryObjectAuditingByHandle(Handle %x)\n", Handle);
Process = PsGetCurrentProcess();
KeAcquireSpinLock(&Process->HandleTable.ListLock, &oldIrql);
- HandleRep = ObpGetObjectByHandle(&Process->HandleTable,
- Handle,
- NULL);
- if (HandleRep == NULL)
+ HandleEntry = ObpGetObjectByHandle(&Process->HandleTable,
+ Handle,
+ NULL);
+ if (HandleEntry == NULL)
{
KeReleaseSpinLock(&Process->HandleTable.ListLock, oldIrql);
return STATUS_INVALID_HANDLE;
}
{
KeReleaseSpinLock(&Process->HandleTable.ListLock, oldIrql);
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);
+ PHANDLE_ENTRY HandleEntry;
POBJECT_HEADER ObjectHeader;
KIRQL oldIrql;
PVOID ObjectBody;
POBJECT_HEADER ObjectHeader;
KIRQL oldIrql;
PVOID ObjectBody;
CHECKPOINT;
return(STATUS_OBJECT_TYPE_MISMATCH);
}
CHECKPOINT;
return(STATUS_OBJECT_TYPE_MISMATCH);
}
if (Handle == NtCurrentThread() &&
(ObjectType == PsThreadType || ObjectType == NULL))
{
if (Handle == NtCurrentThread() &&
(ObjectType == PsThreadType || ObjectType == NULL))
{
KeAcquireSpinLock(&PsGetCurrentProcess()->HandleTable.ListLock,
&oldIrql);
KeAcquireSpinLock(&PsGetCurrentProcess()->HandleTable.ListLock,
&oldIrql);
- HandleRep = ObpGetObjectByHandle(&PsGetCurrentProcess()->HandleTable,
- Handle,
- NULL);
- if (HandleRep == NULL || HandleRep->ObjectBody == 0)
+ HandleEntry = ObpGetObjectByHandle(&PsGetCurrentProcess()->HandleTable,
+ Handle,
+ NULL);
+ if (HandleEntry == NULL || HandleEntry->ObjectBody == 0)
{
KeReleaseSpinLock(&PsGetCurrentProcess()->HandleTable.ListLock,
oldIrql);
return(STATUS_INVALID_HANDLE);
}
{
KeReleaseSpinLock(&PsGetCurrentProcess()->HandleTable.ListLock,
oldIrql);
return(STATUS_INVALID_HANDLE);
}
- ObjectBody = OB_ENTRY_TO_POINTER(HandleRep->ObjectBody);
+ ObjectBody = OB_ENTRY_TO_POINTER(HandleEntry->ObjectBody);
DPRINT("ObjectBody %p\n",ObjectBody);
ObjectHeader = BODY_TO_HEADER(ObjectBody);
DPRINT("ObjectHeader->RefCount %lu\n",ObjectHeader->RefCount);
DPRINT("ObjectBody %p\n",ObjectBody);
ObjectHeader = BODY_TO_HEADER(ObjectBody);
DPRINT("ObjectHeader->RefCount %lu\n",ObjectHeader->RefCount);
- Attributes = (ULONG_PTR)HandleRep->ObjectBody & OB_HANDLE_FLAG_MASK;
- GrantedAccess = HandleRep->GrantedAccess;
+ Attributes = (ULONG_PTR)HandleEntry->ObjectBody & OB_HANDLE_FLAG_MASK;
+ GrantedAccess = HandleEntry->GrantedAccess;
KeReleaseSpinLock(&PsGetCurrentProcess()->HandleTable.ListLock,
oldIrql);
KeReleaseSpinLock(&PsGetCurrentProcess()->HandleTable.ListLock,
oldIrql);