1 // Copyright © 2015-2017 winapi-rs developers
2 // Licensed under the Apache License, Version 2.0
3 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
4 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
5 // All files in the project carrying such notice may not be copied, modified, or distributed
6 // except according to those terms.
7 //! Defines the process snapshot API
8 use ctypes::c_void;
9 use shared::basetsd::ULONG_PTR;
10 use shared::minwindef::DWORD;
11 use um::winnt::HANDLE;
12 ENUM!{enum PSS_CAPTURE_FLAGS {
13     PSS_CAPTURE_NONE = 0x00000000,
14     PSS_CAPTURE_VA_CLONE = 0x00000001,
15     PSS_CAPTURE_RESERVED_00000002 = 0x00000002,
16     PSS_CAPTURE_HANDLES = 0x00000004,
17     PSS_CAPTURE_HANDLE_NAME_INFORMATION = 0x00000008,
18     PSS_CAPTURE_HANDLE_BASIC_INFORMATION = 0x00000010,
19     PSS_CAPTURE_HANDLE_TYPE_SPECIFIC_INFORMATION = 0x00000020,
20     PSS_CAPTURE_HANDLE_TRACE = 0x00000040,
21     PSS_CAPTURE_THREADS = 0x00000080,
22     PSS_CAPTURE_THREAD_CONTEXT = 0x00000100,
23     PSS_CAPTURE_THREAD_CONTEXT_EXTENDED = 0x00000200,
24     PSS_CAPTURE_RESERVED_00000400 = 0x00000400,
25     PSS_CAPTURE_VA_SPACE = 0x00000800,
26     PSS_CAPTURE_VA_SPACE_SECTION_INFORMATION = 0x00001000,
27     PSS_CREATE_BREAKAWAY_OPTIONAL = 0x04000000,
28     PSS_CREATE_BREAKAWAY = 0x08000000,
29     PSS_CREATE_FORCE_BREAKAWAY = 0x10000000,
30     PSS_CREATE_USE_VM_ALLOCATIONS = 0x20000000,
31     PSS_CREATE_MEASURE_PERFORMANCE = 0x40000000,
32     PSS_CREATE_RELEASE_SECTION = -2147483648i32 as u32,
33 }}
34 ENUM!{enum PSS_QUERY_INFORMATION_CLASS {
35     PSS_QUERY_PROCESS_INFORMATION = 0,
36     PSS_QUERY_VA_CLONE_INFORMATION = 1,
37     PSS_QUERY_AUXILIARY_PAGES_INFORMATION = 2,
38     PSS_QUERY_VA_SPACE_INFORMATION = 3,
39     PSS_QUERY_HANDLE_INFORMATION = 4,
40     PSS_QUERY_THREAD_INFORMATION = 5,
41     PSS_QUERY_HANDLE_TRACE_INFORMATION = 6,
42     PSS_QUERY_PERFORMANCE_COUNTERS = 7,
43 }}
44 ENUM!{enum PSS_WALK_INFORMATION_CLASS {
45     PSS_WALK_AUXILIARY_PAGES = 0,
46     PSS_WALK_VA_SPACE = 1,
47     PSS_WALK_HANDLES = 2,
48     PSS_WALK_THREADS = 3,
49 }}
50 ENUM!{enum PSS_DUPLICATE_FLAGS {
51     PSS_DUPLICATE_NONE = 0x00,
52     PSS_DUPLICATE_CLOSE_SOURCE = 0x01,
53 }}
54 DECLARE_HANDLE!(HPSS, HPSS__);
55 DECLARE_HANDLE!(HPSSWALK, HPSSWALK__);
56 FN!{stdcall pAllocRoutine(
57     Context: *mut c_void,
58     Size: DWORD,
59 ) -> *mut c_void}
60 FN!{stdcall pFreeRoutine(
61     Context: *mut c_void,
62     Address: *mut c_void,
63 ) -> ()}
64 STRUCT!{struct PSS_ALLOCATOR {
65     Context: *mut c_void,
66     AllocRoutine: pAllocRoutine,
67     FreeRoutine: pFreeRoutine,
68 }}
69 extern "system" {
PssCaptureSnapshot( ProcessHandle: HANDLE, CaptureFlags: PSS_CAPTURE_FLAGS, ThreadContextFlags: DWORD, SnapshotHandle: *mut HPSS, ) -> DWORD70     pub fn PssCaptureSnapshot(
71         ProcessHandle: HANDLE,
72         CaptureFlags: PSS_CAPTURE_FLAGS,
73         ThreadContextFlags: DWORD,
74         SnapshotHandle: *mut HPSS,
75     ) -> DWORD;
PssDuplicateSnapshot( SourceProcessHandle: HANDLE, SnapshotHandle: HPSS, TargetProcessHandle: HANDLE, TargetSnapshotHandle: *mut HPSS, Flags: PSS_DUPLICATE_FLAGS, ) -> DWORD76     pub fn PssDuplicateSnapshot(
77         SourceProcessHandle: HANDLE,
78         SnapshotHandle: HPSS,
79         TargetProcessHandle: HANDLE,
80         TargetSnapshotHandle: *mut HPSS,
81         Flags: PSS_DUPLICATE_FLAGS,
82     ) -> DWORD;
PssFreeSnapshot( ProcessHandle: HANDLE, SnapshotHandle: HPSS ) -> DWORD83     pub fn PssFreeSnapshot(
84         ProcessHandle: HANDLE,
85         SnapshotHandle: HPSS
86     ) -> DWORD;
PssQuerySnapshot( SnapshotHandle: HPSS, InformationClass: PSS_QUERY_INFORMATION_CLASS, Buffer: *mut c_void, BufferLength: DWORD, ) -> DWORD87     pub fn PssQuerySnapshot(
88         SnapshotHandle: HPSS,
89         InformationClass: PSS_QUERY_INFORMATION_CLASS,
90         Buffer: *mut c_void,
91         BufferLength: DWORD,
92     ) -> DWORD;
PssWalkMarkerCreate( Allocator: *const PSS_ALLOCATOR, WalkMarkerHandle: *mut HPSSWALK, ) -> DWORD93     pub fn PssWalkMarkerCreate(
94         Allocator: *const PSS_ALLOCATOR,
95         WalkMarkerHandle: *mut HPSSWALK,
96     ) -> DWORD;
PssWalkMarkerFree( WalkMarkerHandle: HPSSWALK ) -> DWORD97     pub fn PssWalkMarkerFree(
98         WalkMarkerHandle: HPSSWALK
99     ) -> DWORD;
PssWalkMarkerGetPosition( WalkMarkerHandle: HPSSWALK, Position: *mut ULONG_PTR ) -> DWORD100     pub fn PssWalkMarkerGetPosition(
101         WalkMarkerHandle: HPSSWALK,
102         Position: *mut ULONG_PTR
103     ) -> DWORD;
104     // pub fn PssWalkMarkerRewind();
105     // pub fn PssWalkMarkerSeek();
PssWalkMarkerSeekToBeginning( WalkMarkerHandle: HPSS ) -> DWORD106     pub fn PssWalkMarkerSeekToBeginning(
107         WalkMarkerHandle: HPSS
108     ) -> DWORD;
PssWalkMarkerSetPosition( WalkMarkerHandle: HPSSWALK, Position: ULONG_PTR ) -> DWORD109     pub fn PssWalkMarkerSetPosition(
110         WalkMarkerHandle: HPSSWALK,
111         Position: ULONG_PTR
112     ) -> DWORD;
113     // pub fn PssWalkMarkerTell();
PssWalkSnapshot( SnapshotHandle: HPSS, InformationClass: PSS_WALK_INFORMATION_CLASS, WalkMarkerHandle: HPSSWALK, Buffer: *mut c_void, BufferLength: DWORD, ) -> DWORD114     pub fn PssWalkSnapshot(
115         SnapshotHandle: HPSS,
116         InformationClass: PSS_WALK_INFORMATION_CLASS,
117         WalkMarkerHandle: HPSSWALK,
118         Buffer: *mut c_void,
119         BufferLength: DWORD,
120     ) -> DWORD;
121 }
122