| /* |
| * Copyright (c) 2009, Jay Loden, Giampaolo Rodola'. All rights reserved. |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef __PROCESS_HANDLES_H__ |
| #define __PROCESS_HANDLES_H__ |
| |
| #ifndef UNICODE |
| #define UNICODE |
| #endif |
| |
| #include <Python.h> |
| #include <stdio.h> |
| #include <windows.h> |
| #include <strsafe.h> |
| #include <winternl.h> |
| #include <psapi.h> |
| |
| |
| #ifndef NT_SUCCESS |
| #define NT_SUCCESS(x) ((x) >= 0) |
| #endif |
| |
| #define STATUS_INFO_LENGTH_MISMATCH 0xc0000004 |
| #define ObjectBasicInformation 0 |
| #define ObjectNameInformation 1 |
| #define ObjectTypeInformation 2 |
| #define HANDLE_TYPE_FILE 28 |
| #define NTQO_TIMEOUT 100 |
| |
| typedef NTSTATUS (NTAPI *_NtQuerySystemInformation)( |
| ULONG SystemInformationClass, |
| PVOID SystemInformation, |
| ULONG SystemInformationLength, |
| PULONG ReturnLength |
| ); |
| |
| typedef NTSTATUS (NTAPI *_NtQueryObject)( |
| HANDLE ObjectHandle, |
| ULONG ObjectInformationClass, |
| PVOID ObjectInformation, |
| ULONG ObjectInformationLength, |
| PULONG ReturnLength |
| ); |
| |
| // Undocumented FILE_INFORMATION_CLASS: FileNameInformation |
| static const SYSTEM_INFORMATION_CLASS SystemExtendedHandleInformation = (SYSTEM_INFORMATION_CLASS)64; |
| |
| typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX |
| { |
| PVOID Object; |
| HANDLE UniqueProcessId; |
| HANDLE HandleValue; |
| ULONG GrantedAccess; |
| USHORT CreatorBackTraceIndex; |
| USHORT ObjectTypeIndex; |
| ULONG HandleAttributes; |
| ULONG Reserved; |
| } SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX, *PSYSTEM_HANDLE_TABLE_ENTRY_INFO_EX; |
| |
| typedef struct _SYSTEM_HANDLE_INFORMATION_EX |
| { |
| ULONG_PTR NumberOfHandles; |
| ULONG_PTR Reserved; |
| SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX Handles[1]; |
| } SYSTEM_HANDLE_INFORMATION_EX, *PSYSTEM_HANDLE_INFORMATION_EX; |
| |
| typedef enum _POOL_TYPE { |
| NonPagedPool, |
| PagedPool, |
| NonPagedPoolMustSucceed, |
| DontUseThisType, |
| NonPagedPoolCacheAligned, |
| PagedPoolCacheAligned, |
| NonPagedPoolCacheAlignedMustS |
| } POOL_TYPE, *PPOOL_TYPE; |
| |
| typedef struct _OBJECT_TYPE_INFORMATION { |
| UNICODE_STRING Name; |
| ULONG TotalNumberOfObjects; |
| ULONG TotalNumberOfHandles; |
| ULONG TotalPagedPoolUsage; |
| ULONG TotalNonPagedPoolUsage; |
| ULONG TotalNamePoolUsage; |
| ULONG TotalHandleTableUsage; |
| ULONG HighWaterNumberOfObjects; |
| ULONG HighWaterNumberOfHandles; |
| ULONG HighWaterPagedPoolUsage; |
| ULONG HighWaterNonPagedPoolUsage; |
| ULONG HighWaterNamePoolUsage; |
| ULONG HighWaterHandleTableUsage; |
| ULONG InvalidAttributes; |
| GENERIC_MAPPING GenericMapping; |
| ULONG ValidAccess; |
| BOOLEAN SecurityRequired; |
| BOOLEAN MaintainHandleCount; |
| USHORT MaintainTypeList; |
| POOL_TYPE PoolType; |
| ULONG PagedPoolUsage; |
| ULONG NonPagedPoolUsage; |
| } OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION; |
| |
| PVOID GetLibraryProcAddress(PSTR LibraryName, PSTR ProcName); |
| VOID psutil_get_open_files_init(BOOL threaded); |
| PyObject* psutil_get_open_files(long pid, HANDLE processHandle); |
| PyObject* psutil_get_open_files_ntqueryobject(long dwPid, HANDLE hProcess); |
| PyObject* psutil_get_open_files_getmappedfilename(long dwPid, HANDLE hProcess); |
| DWORD psutil_NtQueryObject(void); |
| void psutil_NtQueryObjectThread(void); |
| |
| #endif // __PROCESS_HANDLES_H__ |