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