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