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