[ros-kernel] FindHandleForObject from air
James Tabor
jimtabor at adsl-64-217-116-74.dsl.hstntx.swbell.net
Tue May 4 20:23:12 CEST 2004
NTSTATUS STDCALL
ObFindHandleForObject(PEPROCESS Process,
POBJECT Object,
POBJECT_TYPE ObjectType,
POBJECT_HANDLE_INFORMATION HandleInformation,
PHANDLE Handle)
{
unsigned int i, Count = 1;
PHANDLE_BLOCK blk;
POBJECT_HEADER Header;
PVOID ObjectBody;
PLIST_ENTRY current;
PHANDLE_TABLE HandleTable;
KIRQL oldIrql;
NTSTATUS Status = STATUS_SUCCESS;
HandleTable = &Process->HandleTable;
KeAcquireSpinLock(&HandleTable->ListLock, &oldIrql);
current = HandleTable->ListHead.Flink;
while (current != &HandleTable->ListHead)
{
blk = CONTAINING_RECORD(current, HANDLE_BLOCK, entry);
for ( i=0; i<HANDLE_BLOCK_ENTRIES; i++)
{
ObjectBody = OB_ENTRY_TO_POINTER(blk->handles[i].ObjectBody);
Header = BODY_TO_HEADER(ObjectBody);
if (ObjectBody != NULL)
{
if (Object != NULL)
{
if (ObjectBody == Object)
{
if (Header->ObjectType != NULL)
{
if (ObjectType != NULL)
{
if (Header->ObjectType == ObjectType)
{
KeReleaseSpinLock(&HandleTable->ListLock, oldIrql);
Handle = (PHANDLE)((Count + i ) << 2);
return Status;
}
else
{
KeReleaseSpinLock(&HandleTable->ListLock, oldIrql);
return (STATUS_OBJECT_TYPE_MISMATCH);
}
}
else
{
KeReleaseSpinLock(&HandleTable->ListLock, oldIrql);
Handle = (PHANDLE)((Count + i ) << 2);
return Status;
}
}
}
}
else if (ObjectType !=NULL)
{
if (Header->ObjectType != NULL)
{
if (Header->ObjectType == ObjectType)
{
KeReleaseSpinLock(&HandleTable->ListLock, oldIrql);
Handle = (PHANDLE)((Count + i ) << 2);
return Status;
}
}
else if (HandleInformation != NULL)
{
/* Inherit and Permanent Test, are they all the same?*/
}
}
}
Count += HANDLE_BLOCK_ENTRIES;
current = current->Flink;
}
KeReleaseSpinLock(&HandleTable->ListLock, oldIrql);
return Status;
}
Not FIN, leave it open for the list,
James
More information about the Ros-kernel
mailing list