[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