Skip to main content

ntapi/
nttp.rs

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}}