[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