1 /* 2 * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved. 3 * Use of this source code is governed by a BSD-style license that can be 4 * found in the LICENSE file. 5 */ 6 7 #ifndef __PROCESS_HANDLES_H__ 8 #define __PROCESS_HANDLES_H__ 9 10 #ifndef UNICODE 11 #define UNICODE 12 #endif 13 14 #include <Python.h> 15 #include <stdio.h> 16 #include <windows.h> 17 #include <strsafe.h> 18 #include <winternl.h> 19 #include <psapi.h> 20 21 22 #ifndef NT_SUCCESS 23 #define NT_SUCCESS(x) ((x) >= 0) 24 #endif 25 26 #define STATUS_INFO_LENGTH_MISMATCH 0xc0000004 27 #define ObjectBasicInformation 0 28 #define ObjectNameInformation 1 29 #define ObjectTypeInformation 2 30 #define HANDLE_TYPE_FILE 28 31 #define NTQO_TIMEOUT 100 32 33 typedef NTSTATUS (NTAPI *_NtQuerySystemInformation)( 34 ULONG SystemInformationClass, 35 PVOID SystemInformation, 36 ULONG SystemInformationLength, 37 PULONG ReturnLength 38 ); 39 40 typedef NTSTATUS (NTAPI *_NtQueryObject)( 41 HANDLE ObjectHandle, 42 ULONG ObjectInformationClass, 43 PVOID ObjectInformation, 44 ULONG ObjectInformationLength, 45 PULONG ReturnLength 46 ); 47 48 // Undocumented FILE_INFORMATION_CLASS: FileNameInformation 49 static const SYSTEM_INFORMATION_CLASS SystemExtendedHandleInformation = (SYSTEM_INFORMATION_CLASS)64; 50 51 typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX 52 { 53 PVOID Object; 54 HANDLE UniqueProcessId; 55 HANDLE HandleValue; 56 ULONG GrantedAccess; 57 USHORT CreatorBackTraceIndex; 58 USHORT ObjectTypeIndex; 59 ULONG HandleAttributes; 60 ULONG Reserved; 61 } SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX, *PSYSTEM_HANDLE_TABLE_ENTRY_INFO_EX; 62 63 typedef struct _SYSTEM_HANDLE_INFORMATION_EX 64 { 65 ULONG_PTR NumberOfHandles; 66 ULONG_PTR Reserved; 67 SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX Handles[1]; 68 } SYSTEM_HANDLE_INFORMATION_EX, *PSYSTEM_HANDLE_INFORMATION_EX; 69 70 typedef enum _POOL_TYPE { 71 NonPagedPool, 72 PagedPool, 73 NonPagedPoolMustSucceed, 74 DontUseThisType, 75 NonPagedPoolCacheAligned, 76 PagedPoolCacheAligned, 77 NonPagedPoolCacheAlignedMustS 78 } POOL_TYPE, *PPOOL_TYPE; 79 80 typedef struct _OBJECT_TYPE_INFORMATION { 81 UNICODE_STRING Name; 82 ULONG TotalNumberOfObjects; 83 ULONG TotalNumberOfHandles; 84 ULONG TotalPagedPoolUsage; 85 ULONG TotalNonPagedPoolUsage; 86 ULONG TotalNamePoolUsage; 87 ULONG TotalHandleTableUsage; 88 ULONG HighWaterNumberOfObjects; 89 ULONG HighWaterNumberOfHandles; 90 ULONG HighWaterPagedPoolUsage; 91 ULONG HighWaterNonPagedPoolUsage; 92 ULONG HighWaterNamePoolUsage; 93 ULONG HighWaterHandleTableUsage; 94 ULONG InvalidAttributes; 95 GENERIC_MAPPING GenericMapping; 96 ULONG ValidAccess; 97 BOOLEAN SecurityRequired; 98 BOOLEAN MaintainHandleCount; 99 USHORT MaintainTypeList; 100 POOL_TYPE PoolType; 101 ULONG PagedPoolUsage; 102 ULONG NonPagedPoolUsage; 103 } OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION; 104 105 PVOID GetLibraryProcAddress(PSTR LibraryName, PSTR ProcName); 106 VOID psutil_get_open_files_init(BOOL threaded); 107 PyObject* psutil_get_open_files(long pid, HANDLE processHandle); 108 PyObject* psutil_get_open_files_ntqueryobject(long dwPid, HANDLE hProcess); 109 PyObject* psutil_get_open_files_getmappedfilename(long dwPid, HANDLE hProcess); 110 DWORD psutil_NtQueryObject(void); 111 void psutil_NtQueryObjectThread(void); 112 113 #endif // __PROCESS_HANDLES_H__ 114