1 use crate::ntexapi::SYSTEM_MEMORY_LIST_INFORMATION;
2 use crate::ntmmapi::MMPFN_IDENTITY;
3 use winapi::shared::basetsd::{SIZE_T, ULONG_PTR};
4 use winapi::shared::ntdef::{CHAR, LONGLONG, PVOID, ULONG, ULONGLONG, WCHAR};
5 ENUM!{enum PF_BOOT_PHASE_ID {
6     PfKernelInitPhase = 0,
7     PfBootDriverInitPhase = 90,
8     PfSystemDriverInitPhase = 120,
9     PfSessionManagerInitPhase = 150,
10     PfSMRegistryInitPhase = 180,
11     PfVideoInitPhase = 210,
12     PfPostVideoInitPhase = 240,
13     PfBootAcceptedRegistryInitPhase = 270,
14     PfUserShellReadyPhase = 300,
15     PfMaxBootPhaseId = 900,
16 }}
17 ENUM!{enum PF_ENABLE_STATUS {
18     PfSvNotSpecified = 0,
19     PfSvEnabled = 1,
20     PfSvDisabled = 2,
21     PfSvMaxEnableStatus = 3,
22 }}
23 STRUCT!{struct PF_TRACE_LIMITS {
24     MaxNumPages: ULONG,
25     MaxNumSections: ULONG,
26     TimerPeriod: LONGLONG,
27 }}
28 pub type PPF_TRACE_LIMITS = *mut PF_TRACE_LIMITS;
29 STRUCT!{struct PF_SYSTEM_PREFETCH_PARAMETERS {
30     EnableStatus: [PF_ENABLE_STATUS; 2],
31     TraceLimits: [PF_TRACE_LIMITS; 2],
32     MaxNumActiveTraces: ULONG,
33     MaxNumSavedTraces: ULONG,
34     RootDirPath: [WCHAR; 32],
35     HostingApplicationList: [WCHAR; 128],
36 }}
37 pub type PPF_SYSTEM_PREFETCH_PARAMETERS = *mut PF_SYSTEM_PREFETCH_PARAMETERS;
38 pub const PF_BOOT_CONTROL_VERSION: u32 = 1;
39 STRUCT!{struct PF_BOOT_CONTROL {
40     Version: ULONG,
41     DisableBootPrefetching: ULONG,
42 }}
43 pub type PPF_BOOT_CONTROL = *mut PF_BOOT_CONTROL;
44 ENUM!{enum PREFETCHER_INFORMATION_CLASS {
45     PrefetcherRetrieveTrace = 1,
46     PrefetcherSystemParameters = 2,
47     PrefetcherBootPhase = 3,
48     PrefetcherRetrieveBootLoaderTrace = 4,
49     PrefetcherBootControl = 5,
50 }}
51 pub const PREFETCHER_INFORMATION_VERSION: ULONG = 23;
52 pub const PREFETCHER_INFORMATION_MAGIC: ULONG = 0x6b756843;
53 STRUCT!{struct PREFETCHER_INFORMATION {
54     Version: ULONG,
55     Magic: ULONG,
56     PrefetcherInformationClass: PREFETCHER_INFORMATION_CLASS,
57     PrefetcherInformation: PVOID,
58     PrefetcherInformationLength: ULONG,
59 }}
60 pub type PPREFETCHER_INFORMATION = *mut PREFETCHER_INFORMATION;
61 STRUCT!{struct PF_SYSTEM_SUPERFETCH_PARAMETERS {
62     EnabledComponents: ULONG,
63     BootID: ULONG,
64     SavedSectInfoTracesMax: ULONG,
65     SavedPageAccessTracesMax: ULONG,
66     ScenarioPrefetchTimeoutStandby: ULONG,
67     ScenarioPrefetchTimeoutHibernate: ULONG,
68 }}
69 pub type PPF_SYSTEM_SUPERFETCH_PARAMETERS = *mut PF_SYSTEM_SUPERFETCH_PARAMETERS;
70 pub const PF_PFN_PRIO_REQUEST_VERSION: u32 = 1;
71 pub const PF_PFN_PRIO_REQUEST_QUERY_MEMORY_LIST: u32 = 0x1;
72 pub const PF_PFN_PRIO_REQUEST_VALID_FLAGS: u32 = 0x1;
73 STRUCT!{struct PF_PFN_PRIO_REQUEST {
74     Version: ULONG,
75     RequestFlags: ULONG,
76     PfnCount: ULONG_PTR,
77     MemInfo: SYSTEM_MEMORY_LIST_INFORMATION,
78     PageData: [MMPFN_IDENTITY; 256],
79 }}
80 pub type PPF_PFN_PRIO_REQUEST = *mut PF_PFN_PRIO_REQUEST;
81 ENUM!{enum PFS_PRIVATE_PAGE_SOURCE_TYPE {
82     PfsPrivateSourceKernel = 0,
83     PfsPrivateSourceSession = 1,
84     PfsPrivateSourceProcess = 2,
85     PfsPrivateSourceMax = 3,
86 }}
87 UNION!{union PFS_PRIVATE_PAGE_SOURCE_u {
88     SessionId: ULONG,
89     ProcessId: ULONG,
90 }}
91 STRUCT!{struct PFS_PRIVATE_PAGE_SOURCE {
92     Type: PFS_PRIVATE_PAGE_SOURCE_TYPE,
93     u: PFS_PRIVATE_PAGE_SOURCE_u,
94     ImagePathHash: ULONG,
95     UniqueProcessHash: ULONG_PTR,
96 }}
97 UNION!{union PF_PRIVSOURCE_INFO_u {
98     WsSwapPages: ULONG_PTR,
99     SessionPagedPoolPages: ULONG_PTR,
100     StoreSizePages: ULONG_PTR,
101 }}
102 pub type PPFS_PRIVATE_PAGE_SOURCE = *mut PFS_PRIVATE_PAGE_SOURCE;
103 STRUCT!{struct PF_PRIVSOURCE_INFO {
104     DbInfo: PFS_PRIVATE_PAGE_SOURCE,
105     EProcess: PVOID,
106     WsPrivatePages: SIZE_T,
107     TotalPrivatePages: SIZE_T,
108     SessionID: ULONG,
109     ImageName: [CHAR; 16],
110     u: PF_PRIVSOURCE_INFO_u,
111     WsTotalPages: ULONG_PTR,
112     DeepFreezeTimeMs: ULONG,
113     BitFields: ULONG,
114 }}
115 BITFIELD!{PF_PRIVSOURCE_INFO BitFields: ULONG [
116     ModernApp set_ModernApp[0..1],
117     DeepFrozen set_DeepFrozen[1..2],
118     Foreground set_Foreground[2..3],
119     PerProcessStore set_PerProcessStore[3..4],
120     Spare set_Spare[4..32],
121 ]}
122 pub type PPF_PRIVSOURCE_INFO = *mut PF_PRIVSOURCE_INFO;
123 pub const PF_PRIVSOURCE_QUERY_REQUEST_VERSION: u32 = 3;
124 STRUCT!{struct PF_PRIVSOURCE_QUERY_REQUEST {
125     Version: ULONG,
126     Flags: ULONG,
127     InfoCount: ULONG,
128     InfoArray: [PF_PRIVSOURCE_INFO; 1],
129 }}
130 pub type PPF_PRIVSOURCE_QUERY_REQUEST = *mut PF_PRIVSOURCE_QUERY_REQUEST;
131 ENUM!{enum PF_PHASED_SCENARIO_TYPE {
132     PfScenarioTypeNone = 0,
133     PfScenarioTypeStandby = 1,
134     PfScenarioTypeHibernate = 2,
135     PfScenarioTypeFUS = 3,
136     PfScenarioTypeMax = 4,
137 }}
138 pub const PF_SCENARIO_PHASE_INFO_VERSION: u32 = 4;
139 STRUCT!{struct PF_SCENARIO_PHASE_INFO {
140     Version: ULONG,
141     ScenType: PF_PHASED_SCENARIO_TYPE,
142     PhaseId: ULONG,
143     SequenceNumber: ULONG,
144     Flags: ULONG,
145     FUSUserId: ULONG,
146 }}
147 pub type PPF_SCENARIO_PHASE_INFO = *mut PF_SCENARIO_PHASE_INFO;
148 STRUCT!{struct PF_MEMORY_LIST_NODE {
149     Bitfields: ULONGLONG,
150     StandbyLowPageCount: ULONGLONG,
151     StandbyMediumPageCount: ULONGLONG,
152     StandbyHighPageCount: ULONGLONG,
153     FreePageCount: ULONGLONG,
154     ModifiedPageCount: ULONGLONG,
155 }}
156 BITFIELD!{PF_MEMORY_LIST_NODE Bitfields: ULONGLONG [
157     Node set_Node[0..8],
158     Spare set_Spare[8..64],
159 ]}
160 pub type PPF_MEMORY_LIST_NODE = *mut PF_MEMORY_LIST_NODE;
161 pub const PF_MEMORY_LIST_INFO_VERSION: u32 = 1;
162 STRUCT!{struct PF_MEMORY_LIST_INFO {
163     Version: ULONG,
164     Size: ULONG,
165     NodeCount: ULONG,
166     Nodes: [PF_MEMORY_LIST_NODE; 1],
167 }}
168 pub type PPF_MEMORY_LIST_INFO = *mut PF_MEMORY_LIST_INFO;
169 STRUCT!{struct PF_PHYSICAL_MEMORY_RANGE {
170     BasePfn: ULONG_PTR,
171     PageCount: ULONG_PTR,
172 }}
173 pub type PPF_PHYSICAL_MEMORY_RANGE = *mut PF_PHYSICAL_MEMORY_RANGE;
174 pub const PF_PHYSICAL_MEMORY_RANGE_INFO_VERSION: u32 = 1;
175 STRUCT!{struct PF_PHYSICAL_MEMORY_RANGE_INFO {
176     Version: ULONG,
177     RangeCount: ULONG,
178     Ranges: [PF_PHYSICAL_MEMORY_RANGE; 1],
179 }}
180 pub type PPF_PHYSICAL_MEMORY_RANGE_INFO = *mut PF_PHYSICAL_MEMORY_RANGE_INFO;
181 pub const PF_REPURPOSED_BY_PREFETCH_INFO_VERSION: u32 = 1;
182 STRUCT!{struct PF_REPURPOSED_BY_PREFETCH_INFO {
183     Version: ULONG,
184     RepurposedByPrefetch: ULONG,
185 }}
186 pub type PPF_REPURPOSED_BY_PREFETCH_INFO = *mut PF_REPURPOSED_BY_PREFETCH_INFO;
187 ENUM!{enum SUPERFETCH_INFORMATION_CLASS {
188     SuperfetchRetrieveTrace = 1,
189     SuperfetchSystemParameters = 2,
190     SuperfetchLogEvent = 3,
191     SuperfetchGenerateTrace = 4,
192     SuperfetchPrefetch = 5,
193     SuperfetchPfnQuery = 6,
194     SuperfetchPfnSetPriority = 7,
195     SuperfetchPrivSourceQuery = 8,
196     SuperfetchSequenceNumberQuery = 9,
197     SuperfetchScenarioPhase = 10,
198     SuperfetchWorkerPriority = 11,
199     SuperfetchScenarioQuery = 12,
200     SuperfetchScenarioPrefetch = 13,
201     SuperfetchRobustnessControl = 14,
202     SuperfetchTimeControl = 15,
203     SuperfetchMemoryListQuery = 16,
204     SuperfetchMemoryRangesQuery = 17,
205     SuperfetchTracingControl = 18,
206     SuperfetchTrimWhileAgingControl = 19,
207     SuperfetchRepurposedByPrefetch = 20,
208     SuperfetchInformationMax = 21,
209 }}
210 pub const SUPERFETCH_INFORMATION_VERSION: ULONG = 45;
211 pub const SUPERFETCH_INFORMATION_MAGIC: ULONG = 0x6b756843;
212 STRUCT!{struct SUPERFETCH_INFORMATION {
213     Version: ULONG,
214     Magic: ULONG,
215     InfoClass: SUPERFETCH_INFORMATION_CLASS,
216     Data: PVOID,
217     Length: ULONG,
218 }}
219 pub type PSUPERFETCH_INFORMATION = *mut SUPERFETCH_INFORMATION;
220