[ros-kernel] System Handle Information Pre Patch ex/sysinfo.c.

James Tabor jimtabor at adsl-64-217-116-74.dsl.hstntx.swbell.net
Thu Apr 29 19:54:23 CEST 2004


Hi all,
This is not complete. In the source tree it does compile with other changes
not listed here.

What I need to know, is Object Header and Body pointers are correct. The stuff
used for getting Object Type and Flags. When I test this, it does return what
I'm asking for, but is it correct?
Thanks,
James


Resources: Gary Nebbett API Ref page 22 & 46 Example 1.2 Listing Open Handles
of a Process, and Undocumented Win 2k Secrets page 407 - 416 Object handles and
types.

/**************/
typedef struct
{
    PVOID ObjectBody;
    ACCESS_MASK GrantedAccess;
} HANDLE_REP, *PHANDLE_REP;

PHANDLE_REP ObpGetObjectByHandle(PHANDLE_TABLE HandleTable, HANDLE h);

#define OB_HANDLE_FLAG_MASK    0x00000007

#define OB_ENTRY_TO_POINTER(Entry) \
   (PVOID)((ULONG_PTR)(Entry) & ~OB_HANDLE_FLAG_MASK)

/* Class 16 - Handle Information */
QSI_DEF(SystemHandleInformation)
{
    ULONG ovlSize=0;
    PEPROCESS Process, syspr;
    unsigned char *pCur;

/* Need the new version of SYSTEM_HANDLE_INFORMATION from w32api*/
    PSYSTEM_HANDLE_INFORMATION Shi
		= (PSYSTEM_HANDLE_INFORMATION) Buffer;

    *ReqSize = sizeof (SYSTEM_HANDLE_INFORMATION);
    /*
     * Check user buffer's size
     */
    if (Size < sizeof (PSYSTEM_HANDLE_INFORMATION))
      {
		return (STATUS_INFO_LENGTH_MISMATCH);
      }
	syspr = PsGetNextProcess(NULL);
	Process = syspr;
	pCur = (unsigned char *)Shi;

	do
	{
           int curSize, Count;
	  PSYSTEM_HANDLE_INFORMATION ShiCur;
	  ShiCur = (PSYSTEM_HANDLE_INFORMATION)pCur;
	  ULONG HandleCount = ObGetObjectHandleCount(Process);

	  curSize = sizeof(SYSTEM_HANDLE_INFORMATION);

           for (Count = 0; HandleCount > 0 ; HandleCount--)
	     {
	      HANDLE h;
	      PHANDLE_REP Rep;
               POBJECT_HEADER ObjectHeader;
               PVOID ObjectBody;

	      h = (HANDLE)((Count + 1) << 2);

               ShiCur->Handle = (USHORT) ((Count +1) << 2);
               ShiCur->ProcessId = Process->UniqueProcessId;

/* un-static in ob/handles.c */
               Rep = ObpGetObjectByHandle(&Process->HandleTable, h);

/* <---- Here! Do we need to check if the handle was closed? ----> */

               ShiCur->Object = ObjectBody = OB_ENTRY_TO_POINTER(Rep->ObjectBody);

               ObjectHeader = BODY_TO_HEADER(ObjectBody);

               ShiCur->GrantedAccess = Rep->GrantedAccess;
               ShiCur->ObjectTypeNumber = (UCHAR) ObjectHeader->Type;
               ShiCur->Flags =
                 (UCHAR) (ObjectHeader->Inherit << 1) | (ObjectHeader->Permanent);

               ObDereferenceObject(ObjectBody);
               pCur = pCur + curSize;
               ovlSize += curSize;

	      if (ovlSize > Size)
	        {
		   *ReqSize = ovlSize;
		   ObDereferenceObject(Process);
		   return (STATUS_INFO_LENGTH_MISMATCH);
	        }

               Count++;
              }

	   Process = PsGetNextProcess(Process);

	   if ((Process == syspr) || (Process == NULL))
	     {
			break;
	     }

	} while ((Process != syspr) && (Process != NULL));

	*ReqSize = ovlSize;
	if (Process != NULL)
	  {
             ObDereferenceObject(Process);
	  }
			
	return (STATUS_SUCCESS);
}


More information about the Ros-kernel mailing list