windows-nt/Source/XPSP1/NT/base/ntos/ob/obperf.c
2020-09-26 16:20:57 +08:00

137 lines
2.6 KiB
C

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
obperf.c
Abstract:
This module contains ob support routines for performance hooks.
Author:
Stephen Hsiao (shsiao) 11-May-2000
Revision History:
--*/
#include "obp.h"
BOOLEAN
ObPerfDumpHandleEntry (
IN PHANDLE_TABLE_ENTRY ObjectTableEntry,
IN HANDLE HandleId,
IN PVOID EnumParameter
);
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGEWMI, ObPerfDumpHandleEntry)
#pragma alloc_text(PAGEWMI, ObPerfHandleTableWalk)
#endif
BOOLEAN
ObPerfDumpHandleEntry (
IN PHANDLE_TABLE_ENTRY ObjectTableEntry,
IN HANDLE HandleId,
IN PVOID EnumParameter
)
/*++
Routine Description:
This routine checks a HandleTableEntry and see if it a file
Arguments:
ObjectTableEntry - Points to the handle table entry of interest.
HandleId - Supplies the handle.
EnumParameter - The HashTable to be used
Return Value:
FALSE, which tells ExEnumHandleTable to continue iterating through the
handle table.
--*/
{
extern POBJECT_TYPE ObpDirectoryObjectType;
extern POBJECT_TYPE IoFileObjectType;
POBJECT_HEADER ObjectHeader;
PVOID Object;
PPERFINFO_ENTRY_TABLE HashTable = EnumParameter;
ObjectHeader = (POBJECT_HEADER)(((ULONG_PTR)(ObjectTableEntry->Object)) & ~OBJ_HANDLE_ATTRIBUTES);
Object = &ObjectHeader->Body;
if (ObjectHeader->Type == IoFileObjectType) {
//
// File Object
//
PFILE_OBJECT FileObject = (PFILE_OBJECT) Object;
PerfInfoAddToFileHash(HashTable, FileObject);
#if 0
} else if (ObjectHeader->Type == ObpDirectoryObjectType) {
} else if (ObjectHeader->Type == MmSectionObjectType) {
#endif
}
return FALSE;
}
VOID
ObPerfHandleTableWalk (
PEPROCESS Process,
PPERFINFO_ENTRY_TABLE HashTable
)
/*++
Routine Description:
This routine adds files in the handle table to the hash table.
Arguments:
Process - Process to walk through.
If NULL, walk through the ObpKernelHandleTable;
HashTable - HashTable in which to add the file
Return Value:
None.
--*/
{
PHANDLE_TABLE ObjectTable;
if (Process) {
ObjectTable = ObReferenceProcessHandleTable (Process);
if ( !ObjectTable ) {
return ;
}
} else {
//
//
//
ObjectTable = ObpKernelHandleTable;
}
ExEnumHandleTable( ObjectTable,
ObPerfDumpHandleEntry,
(PVOID) HashTable,
(PHANDLE)NULL );
if (Process) {
ObDereferenceProcessHandleTable( Process );
}
}