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