1use crate::ntioapi::PIO_STATUS_BLOCK;
2use winapi::shared::ntdef::{HANDLE, LOGICAL, LONG, NTSTATUS, PLARGE_INTEGER, PVOID};
3use winapi::um::winnt::{
4 PRTL_CRITICAL_SECTION, PTP_CALLBACK_ENVIRON, PTP_CALLBACK_INSTANCE, PTP_CLEANUP_GROUP, PTP_IO,
5 PTP_POOL, PTP_POOL_STACK_INFORMATION, PTP_SIMPLE_CALLBACK, PTP_TIMER, PTP_TIMER_CALLBACK,
6 PTP_WAIT, PTP_WAIT_CALLBACK, PTP_WORK, PTP_WORK_CALLBACK,
7};
8#[repr(C)]
9pub struct TP_ALPC([u8; 0]);
10pub type PTP_ALPC = *mut TP_ALPC;
11FN!{stdcall PTP_ALPC_CALLBACK(
12 Instance: PTP_CALLBACK_INSTANCE,
13 Context: PVOID,
14 Alpc: PTP_ALPC,
15) -> ()}
16FN!{stdcall PTP_ALPC_CALLBACK_EX(
17 Instanc: PTP_CALLBACK_INSTANCE,
18 Contex: PVOID,
19 Alp: PTP_ALPC,
20 ApcContext: PVOID,
21) -> ()}
22EXTERN!{extern "system" {
23 fn TpAllocPool(
24 PoolReturn: *mut PTP_POOL,
25 Reserved: PVOID,
26 ) -> NTSTATUS;
27 fn TpReleasePool(
28 Pool: PTP_POOL,
29 );
30 fn TpSetPoolMaxThreads(
31 Pool: PTP_POOL,
32 MaxThreads: LONG,
33 );
34 fn TpSetPoolMinThreads(
35 Pool: PTP_POOL,
36 MinThreads: LONG,
37 ) -> NTSTATUS;
38 fn TpQueryPoolStackInformation(
39 Pool: PTP_POOL,
40 PoolStackInformation: PTP_POOL_STACK_INFORMATION,
41 ) -> NTSTATUS;
42 fn TpSetPoolStackInformation(
43 Pool: PTP_POOL,
44 PoolStackInformation: PTP_POOL_STACK_INFORMATION,
45 ) -> NTSTATUS;
46 fn TpAllocCleanupGroup(
47 CleanupGroupReturn: *mut PTP_CLEANUP_GROUP,
48 ) -> NTSTATUS;
49 fn TpReleaseCleanupGroup(
50 CleanupGroup: PTP_CLEANUP_GROUP,
51 );
52 fn TpReleaseCleanupGroupMembers(
53 CleanupGroup: PTP_CLEANUP_GROUP,
54 CancelPendingCallbacks: LOGICAL,
55 CleanupParameter: PVOID,
56 );
57 fn TpCallbackSetEventOnCompletion(
58 Instance: PTP_CALLBACK_INSTANCE,
59 Event: HANDLE,
60 );
61 fn TpCallbackReleaseSemaphoreOnCompletion(
62 Instance: PTP_CALLBACK_INSTANCE,
63 Semaphore: HANDLE,
64 ReleaseCount: LONG,
65 );
66 fn TpCallbackReleaseMutexOnCompletion(
67 Instance: PTP_CALLBACK_INSTANCE,
68 Mutex: HANDLE,
69 );
70 fn TpCallbackLeaveCriticalSectionOnCompletion(
71 Instance: PTP_CALLBACK_INSTANCE,
72 CriticalSection: PRTL_CRITICAL_SECTION,
73 );
74 fn TpCallbackUnloadDllOnCompletion(
75 Instance: PTP_CALLBACK_INSTANCE,
76 DllHandle: PVOID,
77 );
78 fn TpCallbackMayRunLong(
79 Instance: PTP_CALLBACK_INSTANCE,
80 ) -> NTSTATUS;
81 fn TpDisassociateCallback(
82 Instance: PTP_CALLBACK_INSTANCE,
83 );
84 fn TpSimpleTryPost(
85 Callback: PTP_SIMPLE_CALLBACK,
86 Context: PVOID,
87 CallbackEnviron: PTP_CALLBACK_ENVIRON,
88 ) -> NTSTATUS;
89 fn TpAllocWork(
90 WorkReturn: *mut PTP_WORK,
91 Callback: PTP_WORK_CALLBACK,
92 Context: PVOID,
93 CallbackEnviron: PTP_CALLBACK_ENVIRON,
94 ) -> NTSTATUS;
95 fn TpReleaseWork(
96 Work: PTP_WORK,
97 );
98 fn TpPostWork(
99 Work: PTP_WORK,
100 );
101 fn TpWaitForWork(
102 Work: PTP_WORK,
103 CancelPendingCallbacks: LOGICAL,
104 );
105 fn TpAllocTimer(
106 Timer: *mut PTP_TIMER,
107 Callback: PTP_TIMER_CALLBACK,
108 Context: PVOID,
109 CallbackEnviron: PTP_CALLBACK_ENVIRON,
110 ) -> NTSTATUS;
111 fn TpReleaseTimer(
112 Timer: PTP_TIMER,
113 );
114 fn TpSetTimer(
115 Timer: PTP_TIMER,
116 DueTime: PLARGE_INTEGER,
117 Period: LONG,
118 WindowLength: LONG,
119 );
120 fn TpIsTimerSet(
121 Timer: PTP_TIMER,
122 ) -> LOGICAL;
123 fn TpWaitForTimer(
124 Timer: PTP_TIMER,
125 CancelPendingCallbacks: LOGICAL,
126 );
127 fn TpAllocWait(
128 WaitReturn: *mut PTP_WAIT,
129 Callback: PTP_WAIT_CALLBACK,
130 Context: PVOID,
131 CallbackEnviron: PTP_CALLBACK_ENVIRON,
132 ) -> NTSTATUS;
133 fn TpReleaseWait(
134 Wait: PTP_WAIT,
135 );
136 fn TpSetWait(
137 Wait: PTP_WAIT,
138 Handle: HANDLE,
139 Timeout: PLARGE_INTEGER,
140 );
141 fn TpWaitForWait(
142 Wait: PTP_WAIT,
143 CancelPendingCallbacks: LOGICAL,
144 );
145}}
146FN!{stdcall PTP_IO_CALLBACK(
147 Instance: PTP_CALLBACK_INSTANCE,
148 Context: PVOID,
149 ApcContext: PVOID,
150 IoSB: PIO_STATUS_BLOCK,
151 Io: PTP_IO,
152) -> ()}
153EXTERN!{extern "system" {
154 fn TpAllocIoCompletion(
155 IoReturn: *mut PTP_IO,
156 File: HANDLE,
157 Callback: PTP_IO_CALLBACK,
158 Context: PVOID,
159 CallbackEnviron: PTP_CALLBACK_ENVIRON,
160 ) -> NTSTATUS;
161 fn TpReleaseIoCompletion(
162 Io: PTP_IO,
163 );
164 fn TpStartAsyncIoOperation(
165 Io: PTP_IO,
166 );
167 fn TpCancelAsyncIoOperation(
168 Io: PTP_IO,
169 );
170 fn TpWaitForIoCompletion(
171 Io: PTP_IO,
172 CancelPendingCallbacks: LOGICAL,
173 );
174 fn TpAllocAlpcCompletion(
175 AlpcReturn: *mut PTP_ALPC,
176 AlpcPort: HANDLE,
177 Callback: PTP_ALPC_CALLBACK,
178 Context: PVOID,
179 CallbackEnviron: PTP_CALLBACK_ENVIRON,
180 ) -> NTSTATUS;
181 fn TpAllocAlpcCompletionEx(
182 AlpcReturn: *mut PTP_ALPC,
183 AlpcPort: HANDLE,
184 Callback: PTP_ALPC_CALLBACK_EX,
185 Context: PVOID,
186 CallbackEnviron: PTP_CALLBACK_ENVIRON,
187 ) -> NTSTATUS;
188 fn TpReleaseAlpcCompletion(
189 Alpc: PTP_ALPC,
190 );
191 fn TpWaitForAlpcCompletion(
192 Alpc: PTP_ALPC,
193 );
194}}
195ENUM!{enum TP_TRACE_TYPE {
196 TpTraceThreadPriority = 1,
197 TpTraceThreadAffinity = 2,
198 MaxTpTraceType = 3,
199}}
200EXTERN!{extern "system" {
201 fn TpCaptureCaller(
202 Type: TP_TRACE_TYPE,
203 );
204 fn TpCheckTerminateWorker(
205 Thread: HANDLE,
206 );
207}}