[XDK][PSDK][DDK] Share more Se types between winnt and ntddk/ntifs/wdm. Also add...
[reactos.git] / reactos / include / ddk / wdm.h
1 /*
2 * wdm.h
3 *
4 * Windows NT WDM Driver Developer Kit
5 *
6 * This file is part of the ReactOS DDK package.
7 *
8 * Contributors:
9 * Amine Khaldi (amine.khaldi@reactos.org)
10 * Timo Kreuzer (timo.kreuzer@reactos.org)
11 *
12 * THIS SOFTWARE IS NOT COPYRIGHTED
13 *
14 * This source code is offered for use in the public domain. You may
15 * use, modify or distribute it freely.
16 *
17 * This code is distributed in the hope that it will be useful but
18 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
19 * DISCLAIMED. This includes but is not limited to warranties of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 *
22 */
23 #pragma once
24
25 #ifndef _WDMDDK_
26 #define _WDMDDK_
27
28 #define WDM_MAJORVERSION 0x06
29 #define WDM_MINORVERSION 0x00
30
31 /* Included via ntddk.h? */
32 #ifndef _NTDDK_
33 #define _NTDDK_
34 #define _WDM_INCLUDED_
35 #define _DDK_DRIVER_
36 #define NO_INTERLOCKED_INTRINSICS
37 #endif /* _NTDDK_ */
38
39 /* Dependencies */
40 #define NT_INCLUDED
41 #include <excpt.h>
42 #include <ntdef.h>
43 #include <ntstatus.h>
44 #include <kernelspecs.h>
45 #include <ntiologc.h>
46 #include <suppress.h>
47
48 #ifndef GUID_DEFINED
49 #include <guiddef.h>
50 #endif
51
52 #ifdef _MAC
53 #ifndef _INC_STRING
54 #include <string.h>
55 #endif /* _INC_STRING */
56 #else
57 #include <string.h>
58 #endif /* _MAC */
59
60 #ifndef _KTMTYPES_
61 typedef GUID UOW, *PUOW;
62 #endif
63
64 typedef GUID *PGUID;
65
66 #if (NTDDI_VERSION >= NTDDI_WINXP)
67 #include <dpfilter.h>
68 #endif
69
70 #include "intrin.h"
71
72 __internal_kernel_driver
73 __drv_Mode_impl(WDM_INCLUDED)
74
75 #ifdef __cplusplus
76 extern "C" {
77 #endif
78
79
80 #if !defined(_NTHALDLL_) && !defined(_BLDR_)
81 #define NTHALAPI DECLSPEC_IMPORT
82 #else
83 #define NTHALAPI
84 #endif
85
86 /* For ReactOS */
87 #if !defined(_NTOSKRNL_) && !defined(_BLDR_) && !defined(_NTSYSTEM_)
88 #define NTKERNELAPI DECLSPEC_IMPORT
89 #else
90 #define NTKERNELAPI
91 #ifndef _NTSYSTEM_
92 #define _NTSYSTEM_
93 #endif
94 #endif
95
96 #if defined(_X86_) && !defined(_NTHAL_)
97 #define _DECL_HAL_KE_IMPORT DECLSPEC_IMPORT
98 #elif defined(_X86_)
99 #define _DECL_HAL_KE_IMPORT
100 #else
101 #define _DECL_HAL_KE_IMPORT NTKERNELAPI
102 #endif
103
104 #if defined(_WIN64)
105 #define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
106 #else
107 #define POINTER_ALIGNMENT
108 #endif
109
110 /* Helper macro to enable gcc's extension. */
111 #ifndef __GNU_EXTENSION
112 #ifdef __GNUC__
113 #define __GNU_EXTENSION __extension__
114 #else
115 #define __GNU_EXTENSION
116 #endif
117 #endif
118
119 #if defined(_MSC_VER)
120
121 /* Disable some warnings */
122 #pragma warning(disable:4115) /* Named type definition in parentheses */
123 #pragma warning(disable:4201) /* Nameless unions and structs */
124 #pragma warning(disable:4214) /* Bit fields of other types than int */
125 #pragma warning(disable:4820) /* Padding added, due to alignment requirement */
126
127 /* Indicate if #pragma alloc_text() is supported */
128 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
129 #define ALLOC_PRAGMA 1
130 #endif
131
132 /* Indicate if #pragma data_seg() is supported */
133 #if defined(_M_IX86) || defined(_M_AMD64)
134 #define ALLOC_DATA_PRAGMA 1
135 #endif
136
137 #endif /* _MSC_VER */
138
139 /* These macros are used to create aliases for imported data. We need to do
140 this to have declarations that are compatible with MS DDK */
141 #ifdef _M_IX86
142 #define __SYMBOL(_Name) "_"#_Name
143 #define __IMPORTSYMBOL(_Name) "__imp__"#_Name
144 #define __IMPORTNAME(_Name) __imp__##_Name
145 #else
146 #define __SYMBOL(_Name) #_Name
147 #define __IMPORTSYMBOL(_Name) "__imp_"#_Name
148 #define __IMPORTNAME(_Name) __imp_##_Name
149 #endif
150 #ifdef _MSC_VER
151 #define __CREATE_NTOS_DATA_IMPORT_ALIAS(_Name) \
152 __pragma(comment(linker, "/alternatename:"__SYMBOL(_Name) "=" __IMPORTSYMBOL(_Name)))
153 #else /* !_MSC_VER */
154 #ifndef __STRINGIFY
155 #define __STRINGIFY(_exp) #_exp
156 #endif
157 #define _Pragma_redefine_extname(_Name, _Target) _Pragma(__STRINGIFY(redefine_extname _Name _Target))
158 #define __CREATE_NTOS_DATA_IMPORT_ALIAS(_Name) \
159 _Pragma_redefine_extname(_Name,__IMPORTNAME(_Name))
160 #endif
161
162 #if defined(_WIN64)
163 #if !defined(USE_DMA_MACROS) && !defined(_NTHAL_)
164 #define USE_DMA_MACROS
165 #endif
166 #if !defined(NO_LEGACY_DRIVERS) && !defined(__REACTOS__)
167 #define NO_LEGACY_DRIVERS
168 #endif
169 #endif /* defined(_WIN64) */
170
171 /* Forward declarations */
172 struct _IRP;
173 struct _MDL;
174 struct _KAPC;
175 struct _KDPC;
176 struct _FILE_OBJECT;
177 struct _DMA_ADAPTER;
178 struct _DEVICE_OBJECT;
179 struct _DRIVER_OBJECT;
180 struct _IO_STATUS_BLOCK;
181 struct _DEVICE_DESCRIPTION;
182 struct _SCATTER_GATHER_LIST;
183 struct _DRIVE_LAYOUT_INFORMATION;
184 struct _COMPRESSED_DATA_INFO;
185 struct _IO_RESOURCE_DESCRIPTOR;
186
187 /* Structures not exposed to drivers */
188 typedef struct _OBJECT_TYPE *POBJECT_TYPE;
189 typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
190 typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
191 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
192 typedef struct _EPROCESS *PEPROCESS;
193 typedef struct _ETHREAD *PETHREAD;
194 typedef struct _IO_TIMER *PIO_TIMER;
195 typedef struct _KINTERRUPT *PKINTERRUPT;
196 typedef struct _KPROCESS *PKPROCESS;
197 typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
198 typedef struct _CONTEXT *PCONTEXT;
199
200 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_)
201 typedef struct _DMA_ADAPTER *PADAPTER_OBJECT;
202 #elif defined(_WDM_INCLUDED_)
203 typedef struct _DMA_ADAPTER *PADAPTER_OBJECT;
204 #else
205 typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT;
206 #endif
207
208 #ifndef DEFINE_GUIDEX
209 #ifdef _MSC_VER
210 #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name
211 #else
212 #define DEFINE_GUIDEX(name) EXTERN_C const GUID name
213 #endif
214 #endif /* DEFINE_GUIDEX */
215
216 #ifndef STATICGUIDOF
217 #define STATICGUIDOF(guid) STATIC_##guid
218 #endif
219
220 /* GUID Comparison */
221 #ifndef __IID_ALIGNED__
222 #define __IID_ALIGNED__
223 #ifdef __cplusplus
224 inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2)
225 {
226 return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) &&
227 (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) );
228 }
229 #else
230 #define IsEqualGUIDAligned(guid1, guid2) \
231 ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \
232 (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) )
233 #endif /* __cplusplus */
234 #endif /* !__IID_ALIGNED__ */
235
236
237 /******************************************************************************
238 * INTERLOCKED Functions *
239 ******************************************************************************/
240
241 #define BitScanForward _BitScanForward
242 #define BitScanReverse _BitScanReverse
243 #define BitTest _bittest
244 #define BitTestAndComplement _bittestandcomplement
245 #define BitTestAndSet _bittestandset
246 #define BitTestAndReset _bittestandreset
247 #ifdef _WIN64
248 #define BitScanForward64 _BitScanForward64
249 #define BitScanReverse64 _BitScanReverse64
250 #define BitTest64 _bittest64
251 #define BitTestAndComplement64 _bittestandcomplement64
252 #define BitTestAndSet64 _bittestandset64
253 #define BitTestAndReset64 _bittestandreset64
254 #endif /* _WIN64 */
255
256 #if defined(_M_ARM) || defined(_M_IA64)
257 #define __ACQ_(x) x##_acq
258 #define __REL_(x) x##_rel
259 #define __NF_(x) x##_nf
260 #else
261 #define __ACQ_(x) x
262 #define __REL_(x) x
263 #define __NF_(x) x
264 #endif
265
266 #define InterlockedBitTestAndSet _interlockedbittestandset
267 #define InterlockedBitTestAndSetAcquire __ACQ_(_interlockedbittestandset)
268 #define InterlockedBitTestAndSetRelease __REL_(_interlockedbittestandset)
269 #define InterlockedBitTestAndSetNoFence __NF_(_interlockedbittestandset)
270
271 #define InterlockedBitTestAndReset _interlockedbittestandreset
272 #define InterlockedBitTestAndResetAcquire __ACQ_(_interlockedbittestandreset)
273 #define InterlockedBitTestAndResetRelease __REL_(_interlockedbittestandreset)
274 #define InterlockedBitTestAndResetNoFence __NF_(_interlockedbittestandreset)
275
276 #ifdef _WIN64
277 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
278 #define InterlockedBitTestAndSet64Acquire __ACQ_(_interlockedbittestandset64)
279 #define InterlockedBitTestAndSet64Release __REL_(_interlockedbittestandset64)
280 #define InterlockedBitTestAndSet64NoFence __NF_(_interlockedbittestandset64)
281
282 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
283 #define InterlockedBitTestAndReset64Acquire __ACQ_(_interlockedbittestandreset64)
284 #define InterlockedBitTestAndReset64Release __REL_(_interlockedbittestandreset64)
285 #define InterlockedBitTestAndReset64NoFence __NF_(_interlockedbittestandreset64)
286 #endif /* _WIN64 */
287
288 #define InterlockedAdd _InterlockedAdd
289 #define InterlockedAddAcquire __ACQ_(_InterlockedAdd)
290 #define InterlockedAddRelease __REL_(_InterlockedAdd)
291 #define InterlockedAddNoFence __NF_(_InterlockedAdd)
292
293 #define InterlockedAdd64 _InterlockedAdd64
294 #define InterlockedAddAcquire64 __ACQ_(_InterlockedAdd64)
295 #define InterlockedAddRelease64 __REL_(_InterlockedAdd64)
296 #define InterlockedAddNoFence64 __NF_(_InterlockedAdd64)
297
298 #define InterlockedAnd _InterlockedAnd
299 #define InterlockedAndAcquire __ACQ_(_InterlockedAnd)
300 #define InterlockedAndRelease __REL_(_InterlockedAnd)
301 #define InterlockedAndNoFence __NF_(_InterlockedAnd)
302
303 #define InterlockedAnd8 _InterlockedAnd8
304 #ifdef _M_ARM
305 #define InterlockedAndAcquire8 _InterlockedAnd8_acq
306 #define InterlockedAndRelease8 _InterlockedAnd8_rel
307 #define InterlockedAndNoFence8 _InterlockedAnd8_nf
308 #elif defined(_M_IA64)
309 #define InterlockedAnd8Acquire _InterlockedAnd8_acq
310 #define InterlockedAnd8Release _InterlockedAnd8_rel
311 #endif // _M_ARM
312
313 #define InterlockedAnd16 _InterlockedAnd16
314 #ifdef _M_ARM
315 #define InterlockedAndAcquire16 _InterlockedAnd16_acq
316 #define InterlockedAndRelease16 _InterlockedAnd16_rel
317 #define InterlockedAndNoFence16 _InterlockedAnd16_nf
318 #elif defined(_M_IA64)
319 #define InterlockedAnd16Acquire _InterlockedAnd16_acq
320 #define InterlockedAnd16Release _InterlockedAnd16_rel
321 #endif // _M_ARM
322
323 #define InterlockedAnd64 _InterlockedAnd64
324 #ifdef _M_ARM
325 #define InterlockedAndAcquire64 __ACQ_(_InterlockedAnd64)
326 #define InterlockedAndRelease64 __REL_(_InterlockedAnd64)
327 #define InterlockedAndNoFence64 __NF_(_InterlockedAnd64)
328 #else // _M_ARM
329 #define InterlockedAnd64Acquire __ACQ_(_InterlockedAnd64)
330 #define InterlockedAnd64Release __REL_(_InterlockedAnd64)
331 #define InterlockedAnd64NoFence __NF_(_InterlockedAnd64)
332 #endif // _M_ARM
333
334 #ifdef _WIN64
335 #define InterlockedAndAffinity InterlockedAnd64
336 #else
337 #define InterlockedAndAffinity InterlockedAnd
338 #endif // _WIN64
339
340 #define InterlockedCompareExchange _InterlockedCompareExchange
341 #define InterlockedCompareExchangeAcquire __ACQ_(_InterlockedCompareExchange)
342 #define InterlockedCompareExchangeRelease __REL_(_InterlockedCompareExchange)
343 #define InterlockedCompareExchangeNoFence __NF_(_InterlockedCompareExchange)
344
345 #define InterlockedCompareExchange16 _InterlockedCompareExchange16
346 #define InterlockedCompareExchangeAcquire16 __ACQ_(_InterlockedCompareExchange16)
347 #define InterlockedCompareExchangeRelease16 __REL_(_InterlockedCompareExchange16)
348 #define InterlockedCompareExchangeNoFence16 __NF_(_InterlockedCompareExchange16)
349
350 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
351 #define InterlockedCompareExchangeAcquire64 __ACQ_(_InterlockedCompareExchange64)
352 #define InterlockedCompareExchangeRelease64 __REL_(_InterlockedCompareExchange64)
353 #define InterlockedCompareExchangeNoFence64 __NF_(_InterlockedCompareExchange64)
354
355 #ifdef _WIN64
356 #define InterlockedCompareExchange128 _InterlockedCompareExchange128
357 #endif // _WIN64
358
359 #ifdef _M_IA64
360 #define InterlockedCompare64Exchange128 _InterlockedCompare64Exchange128
361 #define InterlockedCompare64ExchangeAcquire128 _InterlockedCompare64Exchange128_acq
362 #define InterlockedCompare64ExchangeRelease128 _InterlockedCompare64Exchange128_rel
363 #endif // _M_IA64
364
365 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
366 #define InterlockedCompareExchangePointerAcquire __ACQ_(_InterlockedCompareExchangePointer)
367 #define InterlockedCompareExchangePointerRelease __REL_(_InterlockedCompareExchangePointer)
368 #define InterlockedCompareExchangePointerNoFence __NF_(_InterlockedCompareExchangePointer)
369
370 #define InterlockedDecrement _InterlockedDecrement
371 #define InterlockedDecrementAcquire __ACQ_(_InterlockedDecrement)
372 #define InterlockedDecrementRelease __REL_(_InterlockedDecrement)
373 #define InterlockedDecrementNoFence __NF_(_InterlockedDecrement)
374
375 #define InterlockedDecrement16 _InterlockedDecrement16
376 #define InterlockedDecrementAcquire16 __ACQ_(_InterlockedDecrement16)
377 #define InterlockedDecrementRelease16 __REL_(_InterlockedDecrement16)
378 #define InterlockedDecrementNoFence16 __NF_(_InterlockedDecrement16)
379
380 #define InterlockedDecrement64 _InterlockedDecrement64
381 #define InterlockedDecrementAcquire64 __ACQ_(_InterlockedDecrement64)
382 #define InterlockedDecrementRelease64 __REL_(_InterlockedDecrement64)
383 #define InterlockedDecrementNoFence64 __NF_(_InterlockedDecrement64)
384
385 #ifdef _WIN64
386 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONG64 *)a)
387 #define InterlockedDecrementSizeTNoFence(a) InterlockedDecrementNoFence64((LONG64 *)a)
388 #else
389 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
390 #define InterlockedDecrementSizeTNoFence(a) InterlockedDecrementNoFence((LONG *)a)
391 #endif // _WIN64
392
393 #define InterlockedExchange _InterlockedExchange
394 #define InterlockedExchangeAcquire __ACQ_(_InterlockedExchange)
395 /* No release here */
396 #define InterlockedExchangeNoFence __NF_(_InterlockedExchange)
397
398 #if (_MSC_VER >= 1600)
399 #define InterlockedExchange8 _InterlockedExchange8
400 #endif // (_MSC_VER >= 1600)
401
402 #define InterlockedExchange16 _InterlockedExchange16
403 /* No release here */
404 #define InterlockedExchangeAcquire16 __ACQ_(_InterlockedExchange16)
405 #define InterlockedExchangeNoFence16 __NF_(_InterlockedExchange16)
406
407 #define InterlockedExchange64 _InterlockedExchange64
408 #define InterlockedExchangeAcquire64 __ACQ_(_InterlockedExchange64)
409 /* No release here */
410 #define InterlockedExchangeNoFence64 __NF_(_InterlockedExchange64)
411
412 #define InterlockedExchangePointer _InterlockedExchangePointer
413 #define InterlockedExchangePointerAcquire __ACQ_(_InterlockedExchangePointer)
414 /* No release here */
415 #define InterlockedExchangePointerNoFence __NF_(_InterlockedExchangePointer)
416
417 #define InterlockedExchangeAdd _InterlockedExchangeAdd
418 #define InterlockedExchangeAddAcquire __ACQ_(_InterlockedExchangeAdd)
419 #define InterlockedExchangeAddRelease __REL_(_InterlockedExchangeAdd)
420 #define InterlockedExchangeAddNoFence __NF_(_InterlockedExchangeAdd)
421
422 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
423 #define InterlockedExchangeAddAcquire64 __ACQ_(_InterlockedExchangeAdd64)
424 #define InterlockedExchangeAddRelease64 __REL_(_InterlockedExchangeAdd64)
425 #define InterlockedExchangeAddNoFence64 __NF_(_InterlockedExchangeAdd64)
426
427 #ifdef _WIN64
428 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONG64 *)a, b)
429 #define InterlockedExchangeAddSizeTAcquire(a, b) InterlockedExchangeAddAcquire64((LONG64 *)a, b)
430 #define InterlockedExchangeAddSizeTNoFence(a, b) InterlockedExchangeAddNoFence64((LONG64 *)a, b)
431 #else
432 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
433 #define InterlockedExchangeAddSizeTAcquire(a, b) InterlockedExchangeAddAcquire((LONG *)a, b)
434 #define InterlockedExchangeAddSizeTNoFence(a, b) InterlockedExchangeAddNoFence((LONG *)a, b)
435 #endif // _WIN64
436
437 #define InterlockedIncrement _InterlockedIncrement
438 #define InterlockedIncrementAcquire __ACQ_(_InterlockedIncrement)
439 #define InterlockedIncrementRelease __REL_(_InterlockedIncrement)
440 #define InterlockedIncrementNoFence __NF_(_InterlockedIncrement)
441
442 #define InterlockedIncrement16 _InterlockedIncrement16
443 #define InterlockedIncrementAcquire16 __ACQ_(_InterlockedIncrement16)
444 #define InterlockedIncrementRelease16 __REL_(_InterlockedIncrement16)
445 #define InterlockedIncrementNoFence16 __NF_(_InterlockedIncrement16)
446
447 #define InterlockedIncrement64 _InterlockedIncrement64
448 #define InterlockedIncrementAcquire64 __ACQ_(_InterlockedIncrement64)
449 #define InterlockedIncrementRelease64 __REL_(_InterlockedIncrement64)
450 #define InterlockedIncrementNoFence64 __NF_(_InterlockedIncrement64)
451
452 #ifdef _WIN64
453 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONG64 *)a)
454 #define InterlockedIncrementSizeTNoFence(a) InterlockedIncrementNoFence64((LONG64 *)a)
455 #else
456 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
457 #define InterlockedIncrementSizeTNoFence(a) InterlockedIncrementNoFence((LONG *)a)
458 #endif // _WIN64
459
460 #define InterlockedOr _InterlockedOr
461 #define InterlockedOrAcquire __ACQ_(_InterlockedOr)
462 #define InterlockedOrRelease __REL_(_InterlockedOr)
463 #define InterlockedOrNoFence __NF_(_InterlockedOr)
464
465 #define InterlockedOr8 _InterlockedOr8
466 #ifdef _M_ARM
467 #define InterlockedOrAcquire8 _InterlockedOr8_acq
468 #define InterlockedOrRelease8 _InterlockedOr8_rel
469 #define InterlockedOrNoFence8 _InterlockedOr8_nf
470 #elif defined(_M_IA64)
471 #define InterlockedOr8Acquire _InterlockedOr8_acq
472 #define InterlockedOr8Release _InterlockedOr8_rel
473 #endif // _M_ARM
474
475 #define InterlockedOr16 _InterlockedOr16
476 #ifdef _M_ARM
477 #define InterlockedOrAcquire16 _InterlockedOr16_acq
478 #define InterlockedOrRelease16 _InterlockedOr16_rel
479 #define InterlockedOrNoFence16 _InterlockedOr16_nf
480 #elif defined(_M_IA64)
481 #define InterlockedOr16Acquire _InterlockedOr16_acq
482 #define InterlockedOr16Release _InterlockedOr16_rel
483 #endif // _M_ARM
484
485 #define InterlockedOr64 _InterlockedOr64
486 #ifdef _M_ARM
487 #define InterlockedOrAcquire64 _InterlockedOr64_acq
488 #define InterlockedOrRelease64 _InterlockedOr64_rel
489 #define InterlockedOrNoFence64 _InterlockedOr64_nf
490 #elif defined(_M_IA64) || defined(_M_AMD64)
491 #define InterlockedOr64Acquire __ACQ_(_InterlockedOr64)
492 #define InterlockedOr64Release __REL_(_InterlockedOr64)
493 #define InterlockedOr64NoFence __NF_(_InterlockedOr64)
494 #endif // _M_ARM
495
496 #ifdef _WIN64
497 #define InterlockedOrAffinity InterlockedOr64
498 #else
499 #define InterlockedOrAffinity InterlockedOr
500 #endif // _WIN64
501
502 #define InterlockedXor _InterlockedXor
503 #define InterlockedXorAcquire __ACQ_(_InterlockedXor)
504 #define InterlockedXorRelease __REL_(_InterlockedXor)
505 #define InterlockedXorNoFence __NF_(_InterlockedXor)
506
507 #define InterlockedXor8 _InterlockedXor8
508 #ifdef _M_ARM
509 #define InterlockedXorAcquire8 _InterlockedXor8_acq
510 #define InterlockedXorRelease8 _InterlockedXor8_rel
511 #define InterlockedXorNoFence8 _InterlockedXor8_nf
512 #elif defined(_M_IA64)
513 #define InterlockedXor8Acquire _InterlockedXor8_acq
514 #define InterlockedXor8Release _InterlockedXor8_rel
515 #endif /* _M_ARM */
516
517 #define InterlockedXor16 _InterlockedXor16
518 #ifdef _M_ARM
519 #define InterlockedXorAcquire16 _InterlockedXor16_acq
520 #define InterlockedXorRelease16 _InterlockedXor16_rel
521 #define InterlockedXorNoFence16 _InterlockedXor16_nf
522 #elif defined(_M_IA64)
523 #define InterlockedXor16Acquire _InterlockedXor16_acq
524 #define InterlockedXor16Release _InterlockedXor16_rel
525 #endif /* _M_ARM */
526
527 #define InterlockedXor64 _InterlockedXor64
528 #ifdef _M_ARM
529 #define InterlockedXorAcquire64 _InterlockedXor64_acq
530 #define InterlockedXorRelease64 _InterlockedXor64_rel
531 #define InterlockedXorNoFence64 _InterlockedXor64_nf
532 #elif defined(_M_IA64) || defined(_M_AMD64)
533 #define InterlockedXor64Acquire __ACQ_(_InterlockedXor64)
534 #define InterlockedXor64Release __REL_(_InterlockedXor64)
535 #define InterlockedXor64NoFence __NF_(_InterlockedXor64)
536 #endif /* _M_ARM */
537
538 #ifdef _M_IX86
539
540 FORCEINLINE
541 LONG64
542 _InterlockedExchange64(
543 _Inout_ _Interlocked_operand_ volatile LONG64 *Target,
544 _In_ LONG64 Value)
545 {
546 LONG64 Old, Prev;
547 for (Old = *Target; ; Old = Prev)
548 {
549 Prev = _InterlockedCompareExchange64(Target, Value, Old);
550 if (Prev == Old)
551 return Prev;
552 }
553 }
554
555 FORCEINLINE
556 LONG64
557 _InterlockedAdd64(
558 _Inout_ _Interlocked_operand_ volatile LONG64 *Target,
559 _In_ LONG64 Value)
560 {
561 LONG64 Old, Prev, New;
562 for (Old = *Target; ; Old = Prev)
563 {
564 New = Old + Value;
565 Prev = _InterlockedCompareExchange64(Target, New, Old);
566 if (Prev == Old)
567 return New;
568 }
569 }
570
571 FORCEINLINE
572 LONG64
573 _InterlockedExchangeAdd64 (
574 _Inout_ _Interlocked_operand_ volatile LONG64 *Target,
575 _In_ LONG64 Value
576 )
577 {
578 LONG64 Old, Prev, New;
579 for (Old = *Target; ; Old = Prev)
580 {
581 New = Old + Value;
582 Prev = _InterlockedCompareExchange64(Target, New, Old);
583 if (Prev == Old)
584 return Prev;
585 }
586 }
587
588 FORCEINLINE
589 LONG64
590 _InterlockedAnd64(
591 _Inout_ _Interlocked_operand_ volatile LONG64 *Target,
592 _In_ LONG64 Value)
593 {
594 LONG64 Old, Prev, New;
595 for (Old = *Target; ; Old = Prev)
596 {
597 New = Old & Value;
598 Prev = _InterlockedCompareExchange64(Target, New, Old);
599 if (Prev == Old)
600 return New;
601 }
602 }
603
604 FORCEINLINE
605 LONG64
606 _InterlockedOr64(
607 _Inout_ _Interlocked_operand_ volatile LONG64 *Target,
608 _In_ LONG64 Value)
609 {
610 LONG64 Old, Prev, New;
611 for (Old = *Target; ; Old = Prev)
612 {
613 New = Old | Value;
614 Prev = _InterlockedCompareExchange64(Target, New, Old);
615 if (Prev == Old)
616 return New;
617 }
618 }
619
620 FORCEINLINE
621 LONG64
622 _InterlockedXor64(
623 _Inout_ _Interlocked_operand_ volatile LONG64 *Target,
624 _In_ LONG64 Value)
625 {
626 LONG64 Old, Prev, New;
627 for (Old = *Target; ; Old = Prev)
628 {
629 New = Old ^ Value;
630 Prev = _InterlockedCompareExchange64(Target, New, Old);
631 if (Prev == Old)
632 return New;
633 }
634 }
635
636 FORCEINLINE
637 LONG64
638 _InterlockedIncrement64(
639 _Inout_ _Interlocked_operand_ volatile LONG64 *Target)
640 {
641 return _InterlockedAdd64(Target, 1);
642 }
643
644 FORCEINLINE
645 LONG64
646 _InterlockedDecrement64(
647 _Inout_ _Interlocked_operand_ volatile LONG64 *Target)
648 {
649 return _InterlockedAdd64(Target, -1);
650 }
651
652 #undef _InterlockedExchangePointer
653 #define _InterlockedExchangePointer _InlineInterlockedExchangePointer
654 FORCEINLINE
655 _Ret_writes_(_Inexpressible_(Unknown))
656 PVOID
657 _InterlockedExchangePointer(
658 _Inout_ _At_(*Destination, _Pre_writable_byte_size_(_Inexpressible_(Unknown))
659 _Post_writable_byte_size_(_Inexpressible_(Unknown)))
660 _Interlocked_operand_ volatile PVOID *Destination,
661 _In_opt_ PVOID Value)
662 {
663 return (PVOID)InterlockedExchange((volatile long *)Destination, (long)Value);
664 }
665
666 #undef _InterlockedCompareExchangePointer
667 #define _InterlockedCompareExchangePointer _InlineInterlockedCompareExchangePointer
668 FORCEINLINE
669 _Ret_writes_(_Inexpressible_(Unknown))
670 PVOID
671 _InterlockedCompareExchangePointer(
672 _Inout_ _At_(*Destination, _Pre_writable_byte_size_(_Inexpressible_(Unknown))
673 _Post_writable_byte_size_(_Inexpressible_(Unknown)))
674 _Interlocked_operand_ volatile PVOID *Destination,
675 _In_opt_ PVOID ExChange,
676 _In_opt_ PVOID Comperand)
677 {
678 return (PVOID)InterlockedCompareExchange((volatile long *)Destination,
679 (long)ExChange,
680 (long)Comperand);
681 }
682
683 #endif /* _M_IX86 */
684
685 #ifdef _M_AMD64
686
687 FORCEINLINE
688 LONG64
689 _InterlockedAdd64(
690 _Inout_ _Interlocked_operand_ volatile LONG64 *Target,
691 _In_ LONG64 Value)
692
693 {
694 return _InterlockedExchangeAdd64(Target, Value) + Value;
695 }
696
697 #endif /* _M_AMD64 */
698
699 #ifdef _M_IA64
700
701 #undef _InterlockedBitTestAndSet
702 #define _InterlockedBitTestAndSet InterlockedBitTestAndSet_Inline
703 FORCEINLINE
704 BOOLEAN
705 _InterlockedBitTestAndSet(
706 _Inout_ _Interlocked_operand_ volatile LONG *Target,
707 _In_ LONG Bit)
708 {
709 ULONG Mask = 1 << (Bit & 31);
710 return (BOOLEAN)((InterlockedOr(&Target[Bit / 32], Mask) & Mask) != 0);
711 }
712
713 #undef _InterlockedBitTestAndReset
714 #define _InterlockedBitTestAndReset InterlockedBitTestAndReset_Inline
715 FORCEINLINE
716 BOOLEAN
717 _InterlockedBitTestAndReset(
718 _Inout_ _Interlocked_operand_ volatile LONG *Target,
719 _In_ LONG Bit)
720 {
721 ULONG Mask = 1 << (Bit & 31);
722 return (BOOLEAN)((InterlockedAnd(&Target[Bit / 32], ~Mask) & Mask) != 0);
723 }
724
725 #undef _InterlockedBitTestAndSet64
726 #define _InterlockedBitTestAndSet64 InterlockedBitTestAndSet64_Inline
727 FORCEINLINE
728 BOOLEAN
729 _InterlockedBitTestAndSet64(
730 _Inout_ _Interlocked_operand_ volatile LONG64 *Target,
731 _In_ LONG64 Bit)
732 {
733 ULONG64 Mask = 1LL << (Bit & 63);
734 return (BOOLEAN)((InterlockedOr64(&Target[Bit / 64], Mask) & Mask) != 0);
735 }
736
737 #undef _InterlockedBitTestAndReset64
738 #define _InterlockedBitTestAndReset64 InterlockedBitTestAndReset64_Inline
739 FORCEINLINE
740 BOOLEAN
741 _InterlockedBitTestAndReset64(
742 _Inout_ _Interlocked_operand_ volatile LONG64 *Target,
743 _In_ LONG64 Bit)
744 {
745 ULONG64 Mask = 1LL << (Bit & 63);
746 return (BOOLEAN)((InterlockedAnd64(&Target[Bit / 64], ~Mask) & Mask) != 0);
747 }
748
749 #undef _InterlockedBitTestAndComplement
750 #define _InterlockedBitTestAndComplement InterlockedBitTestAndComplement_Inline
751 FORCEINLINE
752 BOOLEAN
753 _InterlockedBitTestAndComplement(
754 _Inout_ _Interlocked_operand_ volatile LONG *Target,
755 _In_ LONG Bit)
756 {
757 ULONG Mask = 1 << (Bit & 31);
758 return (BOOLEAN)((InterlockedXor(&Target[Bit / 32], Mask) & Mask) != 0);
759 }
760
761 #undef _InterlockedBitTestAndComplement64
762 #define _InterlockedBitTestAndComplement64 InterlockedBitTestAndComplement64_Inline
763 FORCEINLINE
764 BOOLEAN
765 _InterlockedBitTestAndComplement64(
766 _Inout_ _Interlocked_operand_ volatile LONG64 *Target,
767 _In_ LONG64 Bit)
768 {
769 ULONG64 Mask = 1LL << (Bit & 63);
770 return (BOOLEAN)((InterlockedXor64(&Target[Bit / 64], Mask) & Mask) != 0);
771 }
772
773 #endif /* M_IA64 */
774
775 /******************************************************************************
776 * Runtime Library Types *
777 ******************************************************************************/
778
779 #define RTL_REGISTRY_ABSOLUTE 0
780 #define RTL_REGISTRY_SERVICES 1
781 #define RTL_REGISTRY_CONTROL 2
782 #define RTL_REGISTRY_WINDOWS_NT 3
783 #define RTL_REGISTRY_DEVICEMAP 4
784 #define RTL_REGISTRY_USER 5
785 #define RTL_REGISTRY_MAXIMUM 6
786 #define RTL_REGISTRY_HANDLE 0x40000000
787 #define RTL_REGISTRY_OPTIONAL 0x80000000
788
789 /* RTL_QUERY_REGISTRY_TABLE.Flags */
790 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
791 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
792 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
793 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
794 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
795 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
796 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
797
798 #define HASH_STRING_ALGORITHM_DEFAULT 0
799 #define HASH_STRING_ALGORITHM_X65599 1
800 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
801
802 typedef struct _RTL_BITMAP {
803 ULONG SizeOfBitMap;
804 PULONG Buffer;
805 } RTL_BITMAP, *PRTL_BITMAP;
806
807 typedef struct _RTL_BITMAP_RUN {
808 ULONG StartingIndex;
809 ULONG NumberOfBits;
810 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
811
812 _Function_class_(RTL_QUERY_REGISTRY_ROUTINE)
813 _IRQL_requires_max_(PASSIVE_LEVEL)
814 _IRQL_requires_same_
815 typedef NTSTATUS
816 (NTAPI *PRTL_QUERY_REGISTRY_ROUTINE)(
817 _In_z_ PWSTR ValueName,
818 _In_ ULONG ValueType,
819 _In_reads_bytes_opt_(ValueLength) PVOID ValueData,
820 _In_ ULONG ValueLength,
821 _In_opt_ PVOID Context,
822 _In_opt_ PVOID EntryContext);
823
824 typedef struct _RTL_QUERY_REGISTRY_TABLE {
825 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
826 ULONG Flags;
827 PCWSTR Name;
828 PVOID EntryContext;
829 ULONG DefaultType;
830 PVOID DefaultData;
831 ULONG DefaultLength;
832 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
833
834 typedef struct _TIME_FIELDS {
835 CSHORT Year;
836 CSHORT Month;
837 CSHORT Day;
838 CSHORT Hour;
839 CSHORT Minute;
840 CSHORT Second;
841 CSHORT Milliseconds;
842 CSHORT Weekday;
843 } TIME_FIELDS, *PTIME_FIELDS;
844
845 /* Slist Header */
846 #ifndef _SLIST_HEADER_
847 #define _SLIST_HEADER_
848
849 #if defined(_WIN64)
850
851 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY {
852 struct _SLIST_ENTRY *Next;
853 } SLIST_ENTRY, *PSLIST_ENTRY;
854
855 typedef struct _SLIST_ENTRY32 {
856 ULONG Next;
857 } SLIST_ENTRY32, *PSLIST_ENTRY32;
858
859 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
860 _ANONYMOUS_STRUCT struct {
861 ULONGLONG Alignment;
862 ULONGLONG Region;
863 } DUMMYSTRUCTNAME;
864 struct {
865 ULONGLONG Depth:16;
866 ULONGLONG Sequence:9;
867 ULONGLONG NextEntry:39;
868 ULONGLONG HeaderType:1;
869 ULONGLONG Init:1;
870 ULONGLONG Reserved:59;
871 ULONGLONG Region:3;
872 } Header8;
873 struct {
874 ULONGLONG Depth:16;
875 ULONGLONG Sequence:48;
876 ULONGLONG HeaderType:1;
877 ULONGLONG Init:1;
878 ULONGLONG Reserved:2;
879 ULONGLONG NextEntry:60;
880 } Header16;
881 struct {
882 ULONGLONG Depth:16;
883 ULONGLONG Sequence:48;
884 ULONGLONG HeaderType:1;
885 ULONGLONG Reserved:3;
886 ULONGLONG NextEntry:60;
887 } HeaderX64;
888 } SLIST_HEADER, *PSLIST_HEADER;
889
890 typedef union _SLIST_HEADER32 {
891 ULONGLONG Alignment;
892 _ANONYMOUS_STRUCT struct {
893 SLIST_ENTRY32 Next;
894 USHORT Depth;
895 USHORT Sequence;
896 } DUMMYSTRUCTNAME;
897 } SLIST_HEADER32, *PSLIST_HEADER32;
898
899 #else
900
901 #define SLIST_ENTRY SINGLE_LIST_ENTRY
902 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
903 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
904
905 typedef SLIST_ENTRY SLIST_ENTRY32, *PSLIST_ENTRY32;
906
907 typedef union _SLIST_HEADER {
908 ULONGLONG Alignment;
909 _ANONYMOUS_STRUCT struct {
910 SLIST_ENTRY Next;
911 USHORT Depth;
912 USHORT Sequence;
913 } DUMMYSTRUCTNAME;
914 } SLIST_HEADER, *PSLIST_HEADER;
915
916 typedef SLIST_HEADER SLIST_HEADER32, *PSLIST_HEADER32;
917
918 #endif /* defined(_WIN64) */
919
920 #endif /* _SLIST_HEADER_ */
921
922 /* Exception record flags */
923 #define EXCEPTION_NONCONTINUABLE 0x01
924 #define EXCEPTION_UNWINDING 0x02
925 #define EXCEPTION_EXIT_UNWIND 0x04
926 #define EXCEPTION_STACK_INVALID 0x08
927 #define EXCEPTION_NESTED_CALL 0x10
928 #define EXCEPTION_TARGET_UNWIND 0x20
929 #define EXCEPTION_COLLIDED_UNWIND 0x40
930 #define EXCEPTION_UNWIND (EXCEPTION_UNWINDING | EXCEPTION_EXIT_UNWIND | \
931 EXCEPTION_TARGET_UNWIND | EXCEPTION_COLLIDED_UNWIND)
932
933 #define IS_UNWINDING(Flag) ((Flag & EXCEPTION_UNWIND) != 0)
934 #define IS_DISPATCHING(Flag) ((Flag & EXCEPTION_UNWIND) == 0)
935 #define IS_TARGET_UNWIND(Flag) (Flag & EXCEPTION_TARGET_UNWIND)
936
937 #define EXCEPTION_MAXIMUM_PARAMETERS 15
938
939 /* Exception records */
940 typedef struct _EXCEPTION_RECORD {
941 NTSTATUS ExceptionCode;
942 ULONG ExceptionFlags;
943 struct _EXCEPTION_RECORD *ExceptionRecord;
944 PVOID ExceptionAddress;
945 ULONG NumberParameters;
946 ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
947 } EXCEPTION_RECORD, *PEXCEPTION_RECORD;
948
949 typedef struct _EXCEPTION_RECORD32 {
950 NTSTATUS ExceptionCode;
951 ULONG ExceptionFlags;
952 ULONG ExceptionRecord;
953 ULONG ExceptionAddress;
954 ULONG NumberParameters;
955 ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
956 } EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
957
958 typedef struct _EXCEPTION_RECORD64 {
959 NTSTATUS ExceptionCode;
960 ULONG ExceptionFlags;
961 ULONG64 ExceptionRecord;
962 ULONG64 ExceptionAddress;
963 ULONG NumberParameters;
964 ULONG __unusedAlignment;
965 ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
966 } EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
967
968 typedef struct _EXCEPTION_POINTERS {
969 PEXCEPTION_RECORD ExceptionRecord;
970 PCONTEXT ContextRecord;
971 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
972
973 #ifdef _NTSYSTEM_
974 extern BOOLEAN NlsMbCodePageTag;
975 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
976 extern BOOLEAN NlsMbOemCodePageTag;
977 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
978 #else
979 __CREATE_NTOS_DATA_IMPORT_ALIAS(NlsMbCodePageTag)
980 extern BOOLEAN *NlsMbCodePageTag;
981 #define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
982 __CREATE_NTOS_DATA_IMPORT_ALIAS(NlsMbOemCodePageTag)
983 extern BOOLEAN *NlsMbOemCodePageTag;
984 #define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
985 #endif
986
987 #define SHORT_LEAST_SIGNIFICANT_BIT 0
988 #define SHORT_MOST_SIGNIFICANT_BIT 1
989
990 #define LONG_LEAST_SIGNIFICANT_BIT 0
991 #define LONG_3RD_MOST_SIGNIFICANT_BIT 1
992 #define LONG_2ND_MOST_SIGNIFICANT_BIT 2
993 #define LONG_MOST_SIGNIFICANT_BIT 3
994
995 #define RTLVERLIB_DDI(x) Wdmlib##x
996
997 typedef BOOLEAN
998 (*PFN_RTL_IS_NTDDI_VERSION_AVAILABLE)(
999 _In_ ULONG Version);
1000
1001 typedef BOOLEAN
1002 (*PFN_RTL_IS_SERVICE_PACK_VERSION_INSTALLED)(
1003 _In_ ULONG Version);
1004
1005 typedef struct _OSVERSIONINFOA {
1006 ULONG dwOSVersionInfoSize;
1007 ULONG dwMajorVersion;
1008 ULONG dwMinorVersion;
1009 ULONG dwBuildNumber;
1010 ULONG dwPlatformId;
1011 CHAR szCSDVersion[128];
1012 } OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
1013
1014 typedef struct _OSVERSIONINFOW {
1015 ULONG dwOSVersionInfoSize;
1016 ULONG dwMajorVersion;
1017 ULONG dwMinorVersion;
1018 ULONG dwBuildNumber;
1019 ULONG dwPlatformId;
1020 WCHAR szCSDVersion[128];
1021 } OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
1022
1023 typedef struct _OSVERSIONINFOEXA {
1024 ULONG dwOSVersionInfoSize;
1025 ULONG dwMajorVersion;
1026 ULONG dwMinorVersion;
1027 ULONG dwBuildNumber;
1028 ULONG dwPlatformId;
1029 CHAR szCSDVersion[128];
1030 USHORT wServicePackMajor;
1031 USHORT wServicePackMinor;
1032 USHORT wSuiteMask;
1033 UCHAR wProductType;
1034 UCHAR wReserved;
1035 } OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
1036
1037 typedef struct _OSVERSIONINFOEXW {
1038 ULONG dwOSVersionInfoSize;
1039 ULONG dwMajorVersion;
1040 ULONG dwMinorVersion;
1041 ULONG dwBuildNumber;
1042 ULONG dwPlatformId;
1043 WCHAR szCSDVersion[128];
1044 USHORT wServicePackMajor;
1045 USHORT wServicePackMinor;
1046 USHORT wSuiteMask;
1047 UCHAR wProductType;
1048 UCHAR wReserved;
1049 } OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
1050
1051 #ifdef UNICODE
1052 typedef OSVERSIONINFOEXW OSVERSIONINFOEX;
1053 typedef POSVERSIONINFOEXW POSVERSIONINFOEX;
1054 typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;
1055 typedef OSVERSIONINFOW OSVERSIONINFO;
1056 typedef POSVERSIONINFOW POSVERSIONINFO;
1057 typedef LPOSVERSIONINFOW LPOSVERSIONINFO;
1058 #else
1059 typedef OSVERSIONINFOEXA OSVERSIONINFOEX;
1060 typedef POSVERSIONINFOEXA POSVERSIONINFOEX;
1061 typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX;
1062 typedef OSVERSIONINFOA OSVERSIONINFO;
1063 typedef POSVERSIONINFOA POSVERSIONINFO;
1064 typedef LPOSVERSIONINFOA LPOSVERSIONINFO;
1065 #endif /* UNICODE */
1066
1067 /******************************************************************************
1068 * Kernel Types *
1069 ******************************************************************************/
1070
1071 typedef UCHAR KIRQL, *PKIRQL;
1072 typedef CCHAR KPROCESSOR_MODE;
1073 typedef LONG KPRIORITY;
1074
1075 typedef enum _MODE {
1076 KernelMode,
1077 UserMode,
1078 MaximumMode
1079 } MODE;
1080
1081 #define CACHE_FULLY_ASSOCIATIVE 0xFF
1082 #define MAXIMUM_SUSPEND_COUNT MAXCHAR
1083
1084 #define EVENT_QUERY_STATE (0x0001)
1085 #define EVENT_MODIFY_STATE (0x0002)
1086 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
1087
1088 #define LTP_PC_SMT 0x1
1089
1090 #if (NTDDI_VERSION < NTDDI_WIN7) || defined(_X86_) || !defined(NT_PROCESSOR_GROUPS)
1091 #define SINGLE_GROUP_LEGACY_API 1
1092 #endif
1093
1094 #define SEMAPHORE_QUERY_STATE (0x0001)
1095 #define SEMAPHORE_MODIFY_STATE (0x0002)
1096 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
1097
1098 typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP {
1099 RelationProcessorCore,
1100 RelationNumaNode,
1101 RelationCache,
1102 RelationProcessorPackage,
1103 RelationGroup,
1104 RelationAll = 0xffff
1105 } LOGICAL_PROCESSOR_RELATIONSHIP;
1106
1107 typedef enum _PROCESSOR_CACHE_TYPE {
1108 CacheUnified,
1109 CacheInstruction,
1110 CacheData,
1111 CacheTrace
1112 } PROCESSOR_CACHE_TYPE;
1113
1114 typedef struct _CACHE_DESCRIPTOR {
1115 UCHAR Level;
1116 UCHAR Associativity;
1117 USHORT LineSize;
1118 ULONG Size;
1119 PROCESSOR_CACHE_TYPE Type;
1120 } CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR;
1121
1122 typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION {
1123 ULONG_PTR ProcessorMask;
1124 LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
1125 _ANONYMOUS_UNION union {
1126 struct {
1127 UCHAR Flags;
1128 } ProcessorCore;
1129 struct {
1130 ULONG NodeNumber;
1131 } NumaNode;
1132 CACHE_DESCRIPTOR Cache;
1133 ULONGLONG Reserved[2];
1134 } DUMMYUNIONNAME;
1135 } SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION;
1136
1137 typedef struct _PROCESSOR_RELATIONSHIP {
1138 UCHAR Flags;
1139 UCHAR Reserved[21];
1140 USHORT GroupCount;
1141 _Field_size_(GroupCount) GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY];
1142 } PROCESSOR_RELATIONSHIP, *PPROCESSOR_RELATIONSHIP;
1143
1144 typedef struct _NUMA_NODE_RELATIONSHIP {
1145 ULONG NodeNumber;
1146 UCHAR Reserved[20];
1147 GROUP_AFFINITY GroupMask;
1148 } NUMA_NODE_RELATIONSHIP, *PNUMA_NODE_RELATIONSHIP;
1149
1150 typedef struct _CACHE_RELATIONSHIP {
1151 UCHAR Level;
1152 UCHAR Associativity;
1153 USHORT LineSize;
1154 ULONG CacheSize;
1155 PROCESSOR_CACHE_TYPE Type;
1156 UCHAR Reserved[20];
1157 GROUP_AFFINITY GroupMask;
1158 } CACHE_RELATIONSHIP, *PCACHE_RELATIONSHIP;
1159
1160 typedef struct _PROCESSOR_GROUP_INFO {
1161 UCHAR MaximumProcessorCount;
1162 UCHAR ActiveProcessorCount;
1163 UCHAR Reserved[38];
1164 KAFFINITY ActiveProcessorMask;
1165 } PROCESSOR_GROUP_INFO, *PPROCESSOR_GROUP_INFO;
1166
1167 typedef struct _GROUP_RELATIONSHIP {
1168 USHORT MaximumGroupCount;
1169 USHORT ActiveGroupCount;
1170 UCHAR Reserved[20];
1171 PROCESSOR_GROUP_INFO GroupInfo[ANYSIZE_ARRAY];
1172 } GROUP_RELATIONSHIP, *PGROUP_RELATIONSHIP;
1173
1174 typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX {
1175 LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
1176 ULONG Size;
1177 _ANONYMOUS_UNION union {
1178 PROCESSOR_RELATIONSHIP Processor;
1179 NUMA_NODE_RELATIONSHIP NumaNode;
1180 CACHE_RELATIONSHIP Cache;
1181 GROUP_RELATIONSHIP Group;
1182 } DUMMYUNIONNAME;
1183 } SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX;;
1184
1185 /* Processor features */
1186 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
1187 #define PF_FLOATING_POINT_EMULATED 1
1188 #define PF_COMPARE_EXCHANGE_DOUBLE 2
1189 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
1190 #define PF_PPC_MOVEMEM_64BIT_OK 4
1191 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
1192 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
1193 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
1194 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
1195 #define PF_PAE_ENABLED 9
1196 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
1197 #define PF_SSE_DAZ_MODE_AVAILABLE 11
1198 #define PF_NX_ENABLED 12
1199 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
1200 #define PF_COMPARE_EXCHANGE128 14
1201 #define PF_COMPARE64_EXCHANGE128 15
1202 #define PF_CHANNELS_ENABLED 16
1203 #define PF_XSAVE_ENABLED 17
1204 #define PF_ARM_VFP_32_REGISTERS_AVAILABLE 18
1205 #define PF_ARM_NEON_INSTRUCTIONS_AVAILABLE 19
1206 #define PF_SECOND_LEVEL_ADDRESS_TRANSLATION 20
1207 #define PF_VIRT_FIRMWARE_ENABLED 21
1208 #define PF_RDWRFSGSBASE_AVAILABLE 22
1209 #define PF_FASTFAIL_AVAILABLE 23
1210 #define PF_ARM_DIVIDE_INSTRUCTION_AVAILABLE 24
1211 #define PF_ARM_64BIT_LOADSTORE_ATOMIC 25
1212 #define PF_ARM_EXTERNAL_CACHE_AVAILABLE 26
1213 #define PF_ARM_FMAC_INSTRUCTIONS_AVAILABLE 27
1214 #define PF_RDRAND_INSTRUCTION_AVAILABLE 28
1215 #define PF_ARM_V8_INSTRUCTIONS_AVAILABLE 29
1216 #define PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE 30
1217 #define PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE 31
1218
1219 #define MAXIMUM_WAIT_OBJECTS 64
1220
1221 #define ASSERT_APC(Object) NT_ASSERT((Object)->Type == ApcObject)
1222
1223 #define ASSERT_DPC(Object) \
1224 ASSERT(((Object)->Type == 0) || \
1225 ((Object)->Type == DpcObject) || \
1226 ((Object)->Type == ThreadedDpcObject))
1227
1228 #define ASSERT_GATE(object) \
1229 NT_ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
1230 (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
1231
1232 #define ASSERT_DEVICE_QUEUE(Object) \
1233 NT_ASSERT((Object)->Type == DeviceQueueObject)
1234
1235 #define ASSERT_TIMER(E) \
1236 NT_ASSERT(((E)->Header.Type == TimerNotificationObject) || \
1237 ((E)->Header.Type == TimerSynchronizationObject))
1238
1239 #define ASSERT_MUTANT(E) \
1240 NT_ASSERT((E)->Header.Type == MutantObject)
1241
1242 #define ASSERT_SEMAPHORE(E) \
1243 NT_ASSERT((E)->Header.Type == SemaphoreObject)
1244
1245 #define ASSERT_EVENT(E) \
1246 NT_ASSERT(((E)->Header.Type == NotificationEvent) || \
1247 ((E)->Header.Type == SynchronizationEvent))
1248
1249 #define DPC_NORMAL 0
1250 #define DPC_THREADED 1
1251
1252 #define GM_LOCK_BIT 0x1
1253 #define GM_LOCK_BIT_V 0x0
1254 #define GM_LOCK_WAITER_WOKEN 0x2
1255 #define GM_LOCK_WAITER_INC 0x4
1256
1257 #define LOCK_QUEUE_WAIT_BIT 0
1258 #define LOCK_QUEUE_OWNER_BIT 1
1259
1260 #define LOCK_QUEUE_WAIT 1
1261 #define LOCK_QUEUE_OWNER 2
1262 #define LOCK_QUEUE_TIMER_LOCK_SHIFT 4
1263 #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
1264
1265 #define PROCESSOR_FEATURE_MAX 64
1266
1267 #define DBG_STATUS_CONTROL_C 1
1268 #define DBG_STATUS_SYSRQ 2
1269 #define DBG_STATUS_BUGCHECK_FIRST 3
1270 #define DBG_STATUS_BUGCHECK_SECOND 4
1271 #define DBG_STATUS_FATAL 5
1272 #define DBG_STATUS_DEBUG_CONTROL 6
1273 #define DBG_STATUS_WORKER 7
1274
1275 #if defined(_WIN64)
1276 #define MAXIMUM_PROC_PER_GROUP 64
1277 #else
1278 #define MAXIMUM_PROC_PER_GROUP 32
1279 #endif
1280 #define MAXIMUM_PROCESSORS MAXIMUM_PROC_PER_GROUP
1281
1282 #define EXCEPTION_DIVIDED_BY_ZERO 0
1283 #define EXCEPTION_DEBUG 1
1284 #define EXCEPTION_NMI 2
1285 #define EXCEPTION_INT3 3
1286 #define EXCEPTION_BOUND_CHECK 5
1287 #define EXCEPTION_INVALID_OPCODE 6
1288 #define EXCEPTION_NPX_NOT_AVAILABLE 7
1289 #define EXCEPTION_DOUBLE_FAULT 8
1290 #define EXCEPTION_NPX_OVERRUN 9
1291 #define EXCEPTION_INVALID_TSS 0x0A
1292 #define EXCEPTION_SEGMENT_NOT_PRESENT 0x0B
1293 #define EXCEPTION_STACK_FAULT 0x0C
1294 #define EXCEPTION_GP_FAULT 0x0D
1295 #define EXCEPTION_RESERVED_TRAP 0x0F
1296 #define EXCEPTION_NPX_ERROR 0x010
1297 #define EXCEPTION_ALIGNMENT_CHECK 0x011
1298
1299 typedef enum _KBUGCHECK_CALLBACK_REASON {
1300 KbCallbackInvalid,
1301 KbCallbackReserved1,
1302 KbCallbackSecondaryDumpData,
1303 KbCallbackDumpIo,
1304 KbCallbackAddPages
1305 } KBUGCHECK_CALLBACK_REASON;
1306
1307 struct _KBUGCHECK_REASON_CALLBACK_RECORD;
1308
1309 _Function_class_(KBUGCHECK_REASON_CALLBACK_ROUTINE)
1310 _IRQL_requires_same_
1311 typedef VOID
1312 (NTAPI KBUGCHECK_REASON_CALLBACK_ROUTINE)(
1313 _In_ KBUGCHECK_CALLBACK_REASON Reason,
1314 _In_ struct _KBUGCHECK_REASON_CALLBACK_RECORD *Record,
1315 _Inout_ PVOID ReasonSpecificData,
1316 _In_ ULONG ReasonSpecificDataLength);
1317 typedef KBUGCHECK_REASON_CALLBACK_ROUTINE *PKBUGCHECK_REASON_CALLBACK_ROUTINE;
1318
1319 typedef struct _KBUGCHECK_ADD_PAGES {
1320 _Inout_ PVOID Context;
1321 _Inout_ ULONG Flags;
1322 _In_ ULONG BugCheckCode;
1323 _Out_ ULONG_PTR Address;
1324 _Out_ ULONG_PTR Count;
1325 } KBUGCHECK_ADD_PAGES, *PKBUGCHECK_ADD_PAGES;
1326
1327 typedef struct _KBUGCHECK_SECONDARY_DUMP_DATA {
1328 _In_ PVOID InBuffer;
1329 _In_ ULONG InBufferLength;
1330 _In_ ULONG MaximumAllowed;
1331 _Out_ GUID Guid;
1332 _Out_ PVOID OutBuffer;
1333 _Out_ ULONG OutBufferLength;
1334 } KBUGCHECK_SECONDARY_DUMP_DATA, *PKBUGCHECK_SECONDARY_DUMP_DATA;
1335
1336 typedef enum _KBUGCHECK_DUMP_IO_TYPE {
1337 KbDumpIoInvalid,
1338 KbDumpIoHeader,
1339 KbDumpIoBody,
1340 KbDumpIoSecondaryData,
1341 KbDumpIoComplete
1342 } KBUGCHECK_DUMP_IO_TYPE;
1343
1344 typedef struct _KBUGCHECK_DUMP_IO {
1345 _In_ ULONG64 Offset;
1346 _In_ PVOID Buffer;
1347 _In_ ULONG BufferLength;
1348 _In_ KBUGCHECK_DUMP_IO_TYPE Type;
1349 } KBUGCHECK_DUMP_IO, *PKBUGCHECK_DUMP_IO;
1350
1351 #define KB_ADD_PAGES_FLAG_VIRTUAL_ADDRESS 0x00000001UL
1352 #define KB_ADD_PAGES_FLAG_PHYSICAL_ADDRESS 0x00000002UL
1353 #define KB_ADD_PAGES_FLAG_ADDITIONAL_RANGES_EXIST 0x80000000UL
1354
1355 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD {
1356 LIST_ENTRY Entry;
1357 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine;
1358 PUCHAR Component;
1359 ULONG_PTR Checksum;
1360 KBUGCHECK_CALLBACK_REASON Reason;
1361 UCHAR State;
1362 } KBUGCHECK_REASON_CALLBACK_RECORD, *PKBUGCHECK_REASON_CALLBACK_RECORD;
1363
1364 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
1365 BufferEmpty,
1366 BufferInserted,
1367 BufferStarted,
1368 BufferFinished,
1369 BufferIncomplete
1370 } KBUGCHECK_BUFFER_DUMP_STATE;
1371
1372 _Function_class_(KBUGCHECK_CALLBACK_ROUTINE)
1373 _IRQL_requires_same_
1374 typedef VOID
1375 (NTAPI KBUGCHECK_CALLBACK_ROUTINE)(
1376 IN PVOID Buffer,
1377 IN ULONG Length);
1378 typedef KBUGCHECK_CALLBACK_ROUTINE *PKBUGCHECK_CALLBACK_ROUTINE;
1379
1380 typedef struct _KBUGCHECK_CALLBACK_RECORD {
1381 LIST_ENTRY Entry;
1382 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
1383 _Field_size_bytes_opt_(Length) PVOID Buffer;
1384 ULONG Length;
1385 PUCHAR Component;
1386 ULONG_PTR Checksum;
1387 UCHAR State;
1388 } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
1389
1390 _Function_class_(NMI_CALLBACK)
1391 _IRQL_requires_same_
1392 typedef BOOLEAN
1393 (NTAPI NMI_CALLBACK)(
1394 _In_opt_ PVOID Context,
1395 _In_ BOOLEAN Handled);
1396 typedef NMI_CALLBACK *PNMI_CALLBACK;
1397
1398 typedef enum _KE_PROCESSOR_CHANGE_NOTIFY_STATE {
1399 KeProcessorAddStartNotify = 0,
1400 KeProcessorAddCompleteNotify,
1401 KeProcessorAddFailureNotify
1402 } KE_PROCESSOR_CHANGE_NOTIFY_STATE;
1403
1404 typedef struct _KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT {
1405 KE_PROCESSOR_CHANGE_NOTIFY_STATE State;
1406 ULONG NtNumber;
1407 NTSTATUS Status;
1408 #if (NTDDI_VERSION >= NTDDI_WIN7)
1409 PROCESSOR_NUMBER ProcNumber;
1410 #endif
1411 } KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT, *PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT;
1412
1413 _IRQL_requires_same_
1414 _Function_class_(PROCESSOR_CALLBACK_FUNCTION)
1415 typedef VOID
1416 (NTAPI PROCESSOR_CALLBACK_FUNCTION)(
1417 _In_ PVOID CallbackContext,
1418 _In_ PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext,
1419 _Inout_ PNTSTATUS OperationStatus);
1420 typedef PROCESSOR_CALLBACK_FUNCTION *PPROCESSOR_CALLBACK_FUNCTION;
1421
1422 #define KE_PROCESSOR_CHANGE_ADD_EXISTING 1
1423
1424 #define INVALID_PROCESSOR_INDEX 0xffffffff
1425
1426 typedef enum _KINTERRUPT_POLARITY {
1427 InterruptPolarityUnknown,
1428 InterruptActiveHigh,
1429 InterruptActiveLow
1430 } KINTERRUPT_POLARITY, *PKINTERRUPT_POLARITY;
1431
1432 typedef enum _KPROFILE_SOURCE {
1433 ProfileTime,
1434 ProfileAlignmentFixup,
1435 ProfileTotalIssues,
1436 ProfilePipelineDry,
1437 ProfileLoadInstructions,
1438 ProfilePipelineFrozen,
1439 ProfileBranchInstructions,
1440 ProfileTotalNonissues,
1441 ProfileDcacheMisses,
1442 ProfileIcacheMisses,
1443 ProfileCacheMisses,
1444 ProfileBranchMispredictions,
1445 ProfileStoreInstructions,
1446 ProfileFpInstructions,
1447 ProfileIntegerInstructions,
1448 Profile2Issue,
1449 Profile3Issue,
1450 Profile4Issue,
1451 ProfileSpecialInstructions,
1452 ProfileTotalCycles,
1453 ProfileIcacheIssues,
1454 ProfileDcacheAccesses,
1455 ProfileMemoryBarrierCycles,
1456 ProfileLoadLinkedIssues,
1457 ProfileMaximum
1458 } KPROFILE_SOURCE;
1459
1460 typedef enum _KWAIT_REASON {
1461 Executive,
1462 FreePage,
1463 PageIn,
1464 PoolAllocation,
1465 DelayExecution,
1466 Suspended,
1467 UserRequest,
1468 WrExecutive,
1469 WrFreePage,
1470 WrPageIn,
1471 WrPoolAllocation,
1472 WrDelayExecution,
1473 WrSuspended,
1474 WrUserRequest,
1475 WrEventPair,
1476 WrQueue,
1477 WrLpcReceive,
1478 WrLpcReply,
1479 WrVirtualMemory,
1480 WrPageOut,
1481 WrRendezvous,
1482 WrKeyedEvent,
1483 WrTerminated,
1484 WrProcessInSwap,
1485 WrCpuRateControl,
1486 WrCalloutStack,
1487 WrKernel,
1488 WrResource,
1489 WrPushLock,
1490 WrMutex,
1491 WrQuantumEnd,
1492 WrDispatchInt,
1493 WrPreempted,
1494 WrYieldExecution,
1495 WrFastMutex,
1496 WrGuardedMutex,
1497 WrRundown,
1498 MaximumWaitReason
1499 } KWAIT_REASON;
1500
1501 typedef struct _KWAIT_BLOCK {
1502 LIST_ENTRY WaitListEntry;
1503 struct _KTHREAD *Thread;
1504 PVOID Object;
1505 struct _KWAIT_BLOCK *NextWaitBlock;
1506 USHORT WaitKey;
1507 UCHAR WaitType;
1508 #if (NTDDI_VERSION >= NTDDI_WIN7)
1509 volatile UCHAR BlockState;
1510 #else
1511 UCHAR SpareByte;
1512 #endif
1513 #if defined(_WIN64)
1514 LONG SpareLong;
1515 #endif
1516 } KWAIT_BLOCK, *PKWAIT_BLOCK, *PRKWAIT_BLOCK;
1517
1518 typedef enum _KINTERRUPT_MODE {
1519 LevelSensitive,
1520 Latched
1521 } KINTERRUPT_MODE;
1522
1523 #define THREAD_WAIT_OBJECTS 3
1524
1525 _IRQL_requires_same_
1526 _Function_class_(KSTART_ROUTINE)
1527 typedef VOID
1528 (NTAPI KSTART_ROUTINE)(
1529 _In_ PVOID StartContext);
1530 typedef KSTART_ROUTINE *PKSTART_ROUTINE;
1531
1532 typedef VOID
1533 (NTAPI *PKINTERRUPT_ROUTINE)(
1534 VOID);
1535
1536 _Function_class_(KSERVICE_ROUTINE)
1537 _IRQL_requires_(HIGH_LEVEL)
1538 _IRQL_requires_same_
1539 typedef BOOLEAN
1540 (NTAPI KSERVICE_ROUTINE)(
1541 _In_ struct _KINTERRUPT *Interrupt,
1542 _In_ PVOID ServiceContext);
1543 typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE;
1544
1545 _Function_class_(KMESSAGE_SERVICE_ROUTINE)
1546 _IRQL_requires_same_
1547 typedef BOOLEAN
1548 (NTAPI KMESSAGE_SERVICE_ROUTINE)(
1549 _In_ struct _KINTERRUPT *Interrupt,
1550 _In_ PVOID ServiceContext,
1551 _In_ ULONG MessageID);
1552 typedef KMESSAGE_SERVICE_ROUTINE *PKMESSAGE_SERVICE_ROUTINE;
1553
1554 typedef enum _KD_OPTION {
1555 KD_OPTION_SET_BLOCK_ENABLE,
1556 } KD_OPTION;
1557
1558 #ifdef _NTSYSTEM_
1559 typedef VOID
1560 (NTAPI *PKNORMAL_ROUTINE)(
1561 IN PVOID NormalContext OPTIONAL,
1562 IN PVOID SystemArgument1 OPTIONAL,
1563 IN PVOID SystemArgument2 OPTIONAL);
1564
1565 typedef VOID
1566 (NTAPI *PKRUNDOWN_ROUTINE)(
1567 IN struct _KAPC *Apc);
1568
1569 typedef VOID
1570 (NTAPI *PKKERNEL_ROUTINE)(
1571 IN struct _KAPC *Apc,
1572 IN OUT PKNORMAL_ROUTINE *NormalRoutine OPTIONAL,
1573 IN OUT PVOID *NormalContext OPTIONAL,
1574 IN OUT PVOID *SystemArgument1 OPTIONAL,
1575 IN OUT PVOID *SystemArgument2 OPTIONAL);
1576 #endif
1577
1578 typedef struct _KAPC {
1579 UCHAR Type;
1580 UCHAR SpareByte0;
1581 UCHAR Size;
1582 UCHAR SpareByte1;
1583 ULONG SpareLong0;
1584 struct _KTHREAD *Thread;
1585 LIST_ENTRY ApcListEntry;
1586 #ifdef _NTSYSTEM_
1587 PKKERNEL_ROUTINE KernelRoutine;
1588 PKRUNDOWN_ROUTINE RundownRoutine;
1589 PKNORMAL_ROUTINE NormalRoutine;
1590 #else
1591 PVOID Reserved[3];
1592 #endif
1593 PVOID NormalContext;
1594 PVOID SystemArgument1;
1595 PVOID SystemArgument2;
1596 CCHAR ApcStateIndex;
1597 KPROCESSOR_MODE ApcMode;
1598 BOOLEAN Inserted;
1599 } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;
1600
1601 #define KAPC_OFFSET_TO_SPARE_BYTE0 FIELD_OFFSET(KAPC, SpareByte0)
1602 #define KAPC_OFFSET_TO_SPARE_BYTE1 FIELD_OFFSET(KAPC, SpareByte1)
1603 #define KAPC_OFFSET_TO_SPARE_LONG FIELD_OFFSET(KAPC, SpareLong0)
1604 #define KAPC_OFFSET_TO_SYSTEMARGUMENT1 FIELD_OFFSET(KAPC, SystemArgument1)
1605 #define KAPC_OFFSET_TO_SYSTEMARGUMENT2 FIELD_OFFSET(KAPC, SystemArgument2)
1606 #define KAPC_OFFSET_TO_APCSTATEINDEX FIELD_OFFSET(KAPC, ApcStateIndex)
1607 #define KAPC_ACTUAL_LENGTH (FIELD_OFFSET(KAPC, Inserted) + sizeof(BOOLEAN))
1608
1609 typedef struct _KDEVICE_QUEUE_ENTRY {
1610 LIST_ENTRY DeviceListEntry;
1611 ULONG SortKey;
1612 BOOLEAN Inserted;
1613 } KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY,
1614 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
1615
1616 typedef PVOID PKIPI_CONTEXT;
1617
1618 typedef VOID
1619 (NTAPI *PKIPI_WORKER)(
1620 IN OUT PKIPI_CONTEXT PacketContext,
1621 IN PVOID Parameter1 OPTIONAL,
1622 IN PVOID Parameter2 OPTIONAL,
1623 IN PVOID Parameter3 OPTIONAL);
1624
1625 typedef struct _KIPI_COUNTS {
1626 ULONG Freeze;
1627 ULONG Packet;
1628 ULONG DPC;
1629 ULONG APC;
1630 ULONG FlushSingleTb;
1631 ULONG FlushMultipleTb;
1632 ULONG FlushEntireTb;
1633 ULONG GenericCall;
1634 ULONG ChangeColor;
1635 ULONG SweepDcache;
1636 ULONG SweepIcache;
1637 ULONG SweepIcacheRange;
1638 ULONG FlushIoBuffers;
1639 ULONG GratuitousDPC;
1640 } KIPI_COUNTS, *PKIPI_COUNTS;
1641
1642 _IRQL_requires_same_
1643 _Function_class_(KIPI_BROADCAST_WORKER)
1644 _IRQL_requires_(IPI_LEVEL)
1645 typedef ULONG_PTR
1646 (NTAPI KIPI_BROADCAST_WORKER)(
1647 _In_ ULONG_PTR Argument);
1648 typedef KIPI_BROADCAST_WORKER *PKIPI_BROADCAST_WORKER;
1649
1650 typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
1651
1652 typedef struct _KSPIN_LOCK_QUEUE {
1653 struct _KSPIN_LOCK_QUEUE *volatile Next;
1654 PKSPIN_LOCK volatile Lock;
1655 } KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;
1656
1657 typedef struct _KLOCK_QUEUE_HANDLE {
1658 KSPIN_LOCK_QUEUE LockQueue;
1659 KIRQL OldIrql;
1660 } KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;
1661
1662 #if defined(_AMD64_)
1663
1664 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER;
1665
1666 #define LockQueueDispatcherLock 0
1667 #define LockQueueExpansionLock 1
1668 #define LockQueuePfnLock 2
1669 #define LockQueueSystemSpaceLock 3
1670 #define LockQueueVacbLock 4
1671 #define LockQueueMasterLock 5
1672 #define LockQueueNonPagedPoolLock 6
1673 #define LockQueueIoCancelLock 7
1674 #define LockQueueWorkQueueLock 8
1675 #define LockQueueIoVpbLock 9
1676 #define LockQueueIoDatabaseLock 10
1677 #define LockQueueIoCompletionLock 11
1678 #define LockQueueNtfsStructLock 12
1679 #define LockQueueAfdWorkQueueLock 13
1680 #define LockQueueBcbLock 14
1681 #define LockQueueMmNonPagedPoolLock 15
1682 #define LockQueueUnusedSpare16 16
1683 #define LockQueueTimerTableLock 17
1684 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
1685
1686 #else
1687
1688 typedef enum _KSPIN_LOCK_QUEUE_NUMBER {
1689 LockQueueDispatcherLock,
1690 LockQueueExpansionLock,
1691 LockQueuePfnLock,
1692 LockQueueSystemSpaceLock,
1693 LockQueueVacbLock,
1694 LockQueueMasterLock,
1695 LockQueueNonPagedPoolLock,
1696 LockQueueIoCancelLock,
1697 LockQueueWorkQueueLock,
1698 LockQueueIoVpbLock,
1699 LockQueueIoDatabaseLock,
1700 LockQueueIoCompletionLock,
1701 LockQueueNtfsStructLock,
1702 LockQueueAfdWorkQueueLock,
1703 LockQueueBcbLock,
1704 LockQueueMmNonPagedPoolLock,
1705 LockQueueUnusedSpare16,
1706 LockQueueTimerTableLock,
1707 LockQueueMaximumLock = LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS
1708 } KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER;
1709
1710 #endif /* defined(_AMD64_) */
1711
1712 _Function_class_(KDEFERRED_ROUTINE)
1713 _IRQL_requires_(DISPATCH_LEVEL)
1714 _IRQL_requires_same_
1715 typedef VOID
1716 (NTAPI KDEFERRED_ROUTINE)(
1717 _In_ struct _KDPC *Dpc,
1718 _In_opt_ PVOID DeferredContext,
1719 _In_opt_ PVOID SystemArgument1,
1720 _In_opt_ PVOID SystemArgument2);
1721 typedef KDEFERRED_ROUTINE *PKDEFERRED_ROUTINE;
1722
1723 typedef enum _KDPC_IMPORTANCE {
1724 LowImportance,
1725 MediumImportance,
1726 HighImportance,
1727 MediumHighImportance
1728 } KDPC_IMPORTANCE;
1729
1730 typedef struct _KDPC {
1731 UCHAR Type;
1732 UCHAR Importance;
1733 volatile USHORT Number;
1734 LIST_ENTRY DpcListEntry;
1735 PKDEFERRED_ROUTINE DeferredRoutine;
1736 PVOID DeferredContext;
1737 PVOID SystemArgument1;
1738 PVOID SystemArgument2;
1739 volatile PVOID DpcData;
1740 } KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;
1741
1742 typedef struct _KDPC_WATCHDOG_INFORMATION {
1743 ULONG DpcTimeLimit;
1744 ULONG DpcTimeCount;
1745 ULONG DpcWatchdogLimit;
1746 ULONG DpcWatchdogCount;
1747 ULONG Reserved;
1748 } KDPC_WATCHDOG_INFORMATION, *PKDPC_WATCHDOG_INFORMATION;
1749
1750 typedef struct _KDEVICE_QUEUE {
1751 CSHORT Type;
1752 CSHORT Size;
1753 LIST_ENTRY DeviceListHead;
1754 KSPIN_LOCK Lock;
1755 # if defined(_AMD64_)
1756 _ANONYMOUS_UNION union {
1757 BOOLEAN Busy;
1758 _ANONYMOUS_STRUCT struct {
1759 LONG64 Reserved:8;
1760 LONG64 Hint:56;
1761 } DUMMYSTRUCTNAME;
1762 } DUMMYUNIONNAME;
1763 # else
1764 BOOLEAN Busy;
1765 # endif
1766 } KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
1767
1768 #define TIMER_EXPIRED_INDEX_BITS 6
1769 #define TIMER_PROCESSOR_INDEX_BITS 5
1770
1771 typedef struct _DISPATCHER_HEADER {
1772 _ANONYMOUS_UNION union {
1773 _ANONYMOUS_STRUCT struct {
1774 UCHAR Type;
1775 _ANONYMOUS_UNION union {
1776 _ANONYMOUS_UNION union {
1777 UCHAR TimerControlFlags;
1778 _ANONYMOUS_STRUCT struct {
1779 UCHAR Absolute:1;
1780 UCHAR Coalescable:1;
1781 UCHAR KeepShifting:1;
1782 UCHAR EncodedTolerableDelay:5;
1783 } DUMMYSTRUCTNAME;
1784 } DUMMYUNIONNAME;
1785 UCHAR Abandoned;
1786 #if (NTDDI_VERSION < NTDDI_WIN7)
1787 UCHAR NpxIrql;
1788 #endif
1789 BOOLEAN Signalling;
1790 } DUMMYUNIONNAME;
1791 _ANONYMOUS_UNION union {
1792 _ANONYMOUS_UNION union {
1793 UCHAR ThreadControlFlags;
1794 _ANONYMOUS_STRUCT struct {
1795 UCHAR CpuThrottled:1;
1796 UCHAR CycleProfiling:1;
1797 UCHAR CounterProfiling:1;
1798 UCHAR Reserved:5;
1799 } DUMMYSTRUCTNAME;
1800 } DUMMYUNIONNAME;
1801 UCHAR Size;
1802 UCHAR Hand;
1803 } DUMMYUNIONNAME2;
1804 _ANONYMOUS_UNION union {
1805 #if (NTDDI_VERSION >= NTDDI_WIN7)
1806 _ANONYMOUS_UNION union {
1807 UCHAR TimerMiscFlags;
1808 _ANONYMOUS_STRUCT struct {
1809 #if !defined(_X86_)
1810 UCHAR Index:TIMER_EXPIRED_INDEX_BITS;
1811 #else
1812 UCHAR Index:1;
1813 UCHAR Processor:TIMER_PROCESSOR_INDEX_BITS;
1814 #endif
1815 UCHAR Inserted:1;
1816 volatile UCHAR Expired:1;
1817 } DUMMYSTRUCTNAME;
1818 } DUMMYUNIONNAME;
1819 #else
1820 /* Pre Win7 compatibility fix to latest WDK */
1821 UCHAR Inserted;
1822 #endif
1823 _ANONYMOUS_UNION union {
1824 BOOLEAN DebugActive;
1825 _ANONYMOUS_STRUCT struct {
1826 BOOLEAN ActiveDR7:1;
1827 BOOLEAN Instrumented:1;
1828 BOOLEAN Reserved2:4;
1829 BOOLEAN UmsScheduled:1;
1830 BOOLEAN UmsPrimary:1;
1831 } DUMMYSTRUCTNAME;
1832 } DUMMYUNIONNAME; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
1833 BOOLEAN DpcActive;
1834 } DUMMYUNIONNAME3;
1835 } DUMMYSTRUCTNAME;
1836 volatile LONG Lock;
1837 } DUMMYUNIONNAME;
1838 LONG SignalState;
1839 LIST_ENTRY WaitListHead;
1840 } DISPATCHER_HEADER, *PDISPATCHER_HEADER;
1841
1842 typedef struct _KEVENT {
1843 DISPATCHER_HEADER Header;
1844 } KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
1845
1846 typedef struct _KSEMAPHORE {
1847 DISPATCHER_HEADER Header;
1848 LONG Limit;
1849 } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
1850
1851 #define KSEMAPHORE_ACTUAL_LENGTH (FIELD_OFFSET(KSEMAPHORE, Limit) + sizeof(LONG))
1852
1853 typedef struct _KGATE {
1854 DISPATCHER_HEADER Header;
1855 } KGATE, *PKGATE, *RESTRICTED_POINTER PRKGATE;
1856
1857 typedef struct _KGUARDED_MUTEX {
1858 volatile LONG Count;
1859 PKTHREAD Owner;
1860 ULONG Contention;
1861 KGATE Gate;
1862 _ANONYMOUS_UNION union {
1863 _ANONYMOUS_STRUCT struct {
1864 SHORT KernelApcDisable;
1865 SHORT SpecialApcDisable;
1866 } DUMMYSTRUCTNAME;
1867 ULONG CombinedApcDisable;
1868 } DUMMYUNIONNAME;
1869 } KGUARDED_MUTEX, *PKGUARDED_MUTEX;
1870
1871 typedef struct _KMUTANT {
1872 DISPATCHER_HEADER Header;
1873 LIST_ENTRY MutantListEntry;
1874 struct _KTHREAD *RESTRICTED_POINTER OwnerThread;
1875 BOOLEAN Abandoned;
1876 UCHAR ApcDisable;
1877 } KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;
1878
1879 #define TIMER_TABLE_SIZE 512
1880 #define TIMER_TABLE_SHIFT 9
1881
1882 typedef struct _KTIMER {
1883 DISPATCHER_HEADER Header;
1884 ULARGE_INTEGER DueTime;
1885 LIST_ENTRY TimerListEntry;
1886 struct _KDPC *Dpc;
1887 #if (NTDDI_VERSION >= NTDDI_WIN7) && !defined(_X86_)
1888 ULONG Processor;
1889 #endif
1890 ULONG Period;
1891 } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
1892
1893 typedef enum _LOCK_OPERATION {
1894 IoReadAccess,
1895 IoWriteAccess,
1896 IoModifyAccess
1897 } LOCK_OPERATION;
1898
1899 #define KTIMER_ACTUAL_LENGTH (FIELD_OFFSET(KTIMER, Period) + sizeof(LONG))
1900
1901 _Function_class_(KSYNCHRONIZE_ROUTINE)
1902 _IRQL_requires_same_
1903 typedef BOOLEAN
1904 (NTAPI KSYNCHRONIZE_ROUTINE)(
1905 _In_ PVOID SynchronizeContext);
1906 typedef KSYNCHRONIZE_ROUTINE *PKSYNCHRONIZE_ROUTINE;
1907
1908 typedef enum _POOL_TYPE {
1909 NonPagedPool,
1910 PagedPool,
1911 NonPagedPoolMustSucceed,
1912 DontUseThisType,
1913 NonPagedPoolCacheAligned,
1914 PagedPoolCacheAligned,
1915 NonPagedPoolCacheAlignedMustS,
1916 MaxPoolType,
1917 NonPagedPoolSession = 32,
1918 PagedPoolSession,
1919 NonPagedPoolMustSucceedSession,
1920 DontUseThisTypeSession,
1921 NonPagedPoolCacheAlignedSession,
1922 PagedPoolCacheAlignedSession,
1923 NonPagedPoolCacheAlignedMustSSession
1924 } POOL_TYPE;
1925
1926 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE {
1927 StandardDesign,
1928 NEC98x86,
1929 EndAlternatives
1930 } ALTERNATIVE_ARCHITECTURE_TYPE;
1931
1932 #ifndef _X86_
1933
1934 #ifndef IsNEC_98
1935 #define IsNEC_98 (FALSE)
1936 #endif
1937
1938 #ifndef IsNotNEC_98
1939 #define IsNotNEC_98 (TRUE)
1940 #endif
1941
1942 #ifndef SetNEC_98
1943 #define SetNEC_98
1944 #endif
1945
1946 #ifndef SetNotNEC_98
1947 #define SetNotNEC_98
1948 #endif
1949
1950 #endif
1951
1952 typedef struct _KSYSTEM_TIME {
1953 ULONG LowPart;
1954 LONG High1Time;
1955 LONG High2Time;
1956 } KSYSTEM_TIME, *PKSYSTEM_TIME;
1957
1958 typedef struct DECLSPEC_ALIGN(16) _M128A {
1959 ULONGLONG Low;
1960 LONGLONG High;
1961 } M128A, *PM128A;
1962
1963 typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT {
1964 USHORT ControlWord;
1965 USHORT StatusWord;
1966 UCHAR TagWord;
1967 UCHAR Reserved1;
1968 USHORT ErrorOpcode;
1969 ULONG ErrorOffset;
1970 USHORT ErrorSelector;
1971 USHORT Reserved2;
1972 ULONG DataOffset;
1973 USHORT DataSelector;
1974 USHORT Reserved3;
1975 ULONG MxCsr;
1976 ULONG MxCsr_Mask;
1977 M128A FloatRegisters[8];
1978 #if defined(_WIN64)
1979 M128A XmmRegisters[16];
1980 UCHAR Reserved4[96];
1981 #else
1982 M128A XmmRegisters[8];
1983 UCHAR Reserved4[192];
1984 ULONG StackControl[7];
1985 ULONG Cr0NpxState;
1986 #endif
1987 } XSAVE_FORMAT, *PXSAVE_FORMAT;
1988
1989 typedef struct DECLSPEC_ALIGN(8) _XSAVE_AREA_HEADER {
1990 ULONG64 Mask;
1991 ULONG64 Reserved[7];
1992 } XSAVE_AREA_HEADER, *PXSAVE_AREA_HEADER;
1993
1994 typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA {
1995 XSAVE_FORMAT LegacyState;
1996 XSAVE_AREA_HEADER Header;
1997 } XSAVE_AREA, *PXSAVE_AREA;
1998
1999 typedef struct _XSTATE_CONTEXT {
2000 ULONG64 Mask;
2001 ULONG Length;
2002 ULONG Reserved1;
2003 _Field_size_bytes_opt_(Length) PXSAVE_AREA Area;
2004 #if defined(_X86_)
2005 ULONG Reserved2;
2006 #endif
2007 PVOID Buffer;
2008 #if defined(_X86_)
2009 ULONG Reserved3;
2010 #endif
2011 } XSTATE_CONTEXT, *PXSTATE_CONTEXT;
2012
2013 typedef struct _XSTATE_SAVE {
2014 #if defined(_AMD64_)
2015 struct _XSTATE_SAVE* Prev;
2016 struct _KTHREAD* Thread;
2017 UCHAR Level;
2018 XSTATE_CONTEXT XStateContext;
2019 #elif defined(_IA64_) || defined(_ARM_)
2020 ULONG Dummy;
2021 #elif defined(_X86_)
2022 _ANONYMOUS_UNION union {
2023 _ANONYMOUS_STRUCT struct {
2024 LONG64 Reserved1;
2025 ULONG Reserved2;
2026 struct _XSTATE_SAVE* Prev;
2027 PXSAVE_AREA Reserved3;
2028 struct _KTHREAD* Thread;
2029 PVOID Reserved4;
2030 UCHAR Level;
2031 } DUMMYSTRUCTNAME;
2032 XSTATE_CONTEXT XStateContext;
2033 } DUMMYUNIONNAME;
2034 #endif
2035 } XSTATE_SAVE, *PXSTATE_SAVE;
2036
2037 #ifdef _X86_
2038
2039 #define MAXIMUM_SUPPORTED_EXTENSION 512
2040
2041 #if !defined(__midl) && !defined(MIDL_PASS)
2042 C_ASSERT(sizeof(XSAVE_FORMAT) == MAXIMUM_SUPPORTED_EXTENSION);
2043 #endif
2044
2045 #endif /* _X86_ */
2046
2047 #define XSAVE_ALIGN 64
2048 #define MINIMAL_XSTATE_AREA_LENGTH sizeof(XSAVE_AREA)
2049
2050 #if !defined(__midl) && !defined(MIDL_PASS)
2051 C_ASSERT((sizeof(XSAVE_FORMAT) & (XSAVE_ALIGN - 1)) == 0);
2052 C_ASSERT((FIELD_OFFSET(XSAVE_AREA, Header) & (XSAVE_ALIGN - 1)) == 0);
2053 C_ASSERT(MINIMAL_XSTATE_AREA_LENGTH == 512 + 64);
2054 #endif
2055
2056 typedef struct _CONTEXT_CHUNK {
2057 LONG Offset;
2058 ULONG Length;
2059 } CONTEXT_CHUNK, *PCONTEXT_CHUNK;
2060
2061 typedef struct _CONTEXT_EX {
2062 CONTEXT_CHUNK All;
2063 CONTEXT_CHUNK Legacy;
2064 CONTEXT_CHUNK XState;
2065 } CONTEXT_EX, *PCONTEXT_EX;
2066
2067 #define CONTEXT_EX_LENGTH ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN)
2068
2069 #if (NTDDI_VERSION >= NTDDI_VISTA)
2070 extern NTSYSAPI volatile CCHAR KeNumberProcessors;
2071 #elif (NTDDI_VERSION >= NTDDI_WINXP)
2072 extern NTSYSAPI CCHAR KeNumberProcessors;
2073 #else
2074 __CREATE_NTOS_DATA_IMPORT_ALIAS(KeNumberProcessors)
2075 extern PCCHAR KeNumberProcessors;
2076 #endif
2077
2078
2079 /******************************************************************************
2080 * Memory manager Types *
2081 ******************************************************************************/
2082
2083 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2084 typedef ULONG NODE_REQUIREMENT;
2085 #define MM_ANY_NODE_OK 0x80000000
2086 #endif
2087
2088 #define MM_DONT_ZERO_ALLOCATION 0x00000001
2089 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002
2090 #define MM_ALLOCATE_FULLY_REQUIRED 0x00000004
2091 #define MM_ALLOCATE_NO_WAIT 0x00000008
2092 #define MM_ALLOCATE_PREFER_CONTIGUOUS 0x00000010
2093 #define MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS 0x00000020
2094
2095 #define MDL_MAPPED_TO_SYSTEM_VA 0x0001
2096 #define MDL_PAGES_LOCKED 0x0002
2097 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
2098 #define MDL_ALLOCATED_FIXED_SIZE 0x0008
2099 #define MDL_PARTIAL 0x0010
2100 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
2101 #define MDL_IO_PAGE_READ 0x0040
2102 #define MDL_WRITE_OPERATION 0x0080
2103 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
2104 #define MDL_FREE_EXTRA_PTES 0x0200
2105 #define MDL_DESCRIBES_AWE 0x0400
2106 #define MDL_IO_SPACE 0x0800
2107 #define MDL_NETWORK_HEADER 0x1000
2108 #define MDL_MAPPING_CAN_FAIL 0x2000
2109 #define MDL_ALLOCATED_MUST_SUCCEED 0x4000
2110 #define MDL_INTERNAL 0x8000
2111
2112 #define MDL_MAPPING_FLAGS (MDL_MAPPED_TO_SYSTEM_VA | \
2113 MDL_PAGES_LOCKED | \
2114 MDL_SOURCE_IS_NONPAGED_POOL | \
2115 MDL_PARTIAL_HAS_BEEN_MAPPED | \
2116 MDL_PARENT_MAPPED_SYSTEM_VA | \
2117 MDL_SYSTEM_VA | \
2118 MDL_IO_SPACE)
2119
2120 #define FLUSH_MULTIPLE_MAXIMUM 32
2121
2122 /* Section access rights */
2123 #define SECTION_QUERY 0x0001
2124 #define SECTION_MAP_WRITE 0x0002
2125 #define SECTION_MAP_READ 0x0004
2126 #define SECTION_MAP_EXECUTE 0x0008
2127 #define SECTION_EXTEND_SIZE 0x0010
2128 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
2129
2130 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY| \
2131 SECTION_MAP_WRITE | \
2132 SECTION_MAP_READ | \
2133 SECTION_MAP_EXECUTE | \
2134 SECTION_EXTEND_SIZE)
2135
2136 #define SESSION_QUERY_ACCESS 0x0001
2137 #define SESSION_MODIFY_ACCESS 0x0002
2138
2139 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
2140 SESSION_QUERY_ACCESS | \
2141 SESSION_MODIFY_ACCESS)
2142
2143 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
2144
2145 #define PAGE_NOACCESS 0x01
2146 #define PAGE_READONLY 0x02
2147 #define PAGE_READWRITE 0x04
2148 #define PAGE_WRITECOPY 0x08
2149 #define PAGE_EXECUTE 0x10
2150 #define PAGE_EXECUTE_READ 0x20
2151 #define PAGE_EXECUTE_READWRITE 0x40
2152 #define PAGE_EXECUTE_WRITECOPY 0x80
2153 #define PAGE_GUARD 0x100
2154 #define PAGE_NOCACHE 0x200
2155 #define PAGE_WRITECOMBINE 0x400
2156
2157 #define MEM_COMMIT 0x1000
2158 #define MEM_RESERVE 0x2000
2159 #define MEM_DECOMMIT 0x4000
2160 #define MEM_RELEASE 0x8000
2161 #define MEM_FREE 0x10000
2162 #define MEM_PRIVATE 0x20000
2163 #define MEM_MAPPED 0x40000
2164 #define MEM_RESET 0x80000
2165 #define MEM_TOP_DOWN 0x100000
2166 #define MEM_LARGE_PAGES 0x20000000
2167 #define MEM_4MB_PAGES 0x80000000
2168
2169 #define SEC_RESERVE 0x4000000
2170 #define SEC_COMMIT 0x8000000
2171 #define SEC_LARGE_PAGES 0x80000000
2172
2173 /* Section map options */
2174 typedef enum _SECTION_INHERIT {
2175 ViewShare = 1,
2176 ViewUnmap = 2
2177 } SECTION_INHERIT;
2178
2179 typedef ULONG PFN_COUNT;
2180 typedef LONG_PTR SPFN_NUMBER, *PSPFN_NUMBER;
2181 typedef ULONG_PTR PFN_NUMBER, *PPFN_NUMBER;
2182
2183 _Struct_size_bytes_(_Inexpressible_(sizeof(struct _MDL) +
2184 (ByteOffset + ByteCount + PAGE_SIZE-1) / PAGE_SIZE * sizeof(PFN_NUMBER)))
2185 typedef struct _MDL {
2186 struct _MDL *Next;
2187 CSHORT Size;
2188 CSHORT MdlFlags;
2189 struct _EPROCESS *Process;
2190 PVOID MappedSystemVa;
2191 PVOID StartVa;
2192 ULONG ByteCount;
2193 ULONG ByteOffset;
2194 } MDL, *PMDL;
2195 #if (_MSC_VER >= 1600)
2196 typedef _Readable_bytes_(_Inexpressible_(polymorphism)) MDL *PMDLX;
2197 #else
2198 typedef MDL *PMDLX;
2199 #endif
2200
2201 typedef enum _MEMORY_CACHING_TYPE_ORIG {
2202 MmFrameBufferCached = 2
2203 } MEMORY_CACHING_TYPE_ORIG;
2204
2205 typedef enum _MEMORY_CACHING_TYPE {
2206 MmNonCached = FALSE,
2207 MmCached = TRUE,
2208 MmWriteCombined = MmFrameBufferCached,
2209 MmHardwareCoherentCached,
2210 MmNonCachedUnordered,
2211 MmUSWCCached,
2212 MmMaximumCacheType
2213 } MEMORY_CACHING_TYPE;
2214
2215 typedef enum _MM_PAGE_PRIORITY {
2216 LowPagePriority,
2217 NormalPagePriority = 16,
2218 HighPagePriority = 32
2219 } MM_PAGE_PRIORITY;
2220
2221 typedef enum _MM_SYSTEM_SIZE {
2222 MmSmallSystem,
2223 MmMediumSystem,
2224 MmLargeSystem
2225 } MM_SYSTEMSIZE;
2226
2227 #ifndef _NTSYSTEM_
2228 __CREATE_NTOS_DATA_IMPORT_ALIAS(Mm64BitPhysicalAddress)
2229 extern PBOOLEAN Mm64BitPhysicalAddress;
2230 #endif
2231 extern NTKERNELAPI PVOID MmBadPointer;
2232
2233
2234 /******************************************************************************
2235 * Executive Types *
2236 ******************************************************************************/
2237 #define EX_RUNDOWN_ACTIVE 0x1
2238 #define EX_RUNDOWN_COUNT_SHIFT 0x1
2239 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
2240
2241 typedef struct _FAST_MUTEX {
2242 volatile LONG Count;
2243 PKTHREAD Owner;
2244 ULONG Contention;
2245 KEVENT Event;
2246 ULONG OldIrql;
2247 } FAST_MUTEX, *PFAST_MUTEX;
2248
2249 typedef enum _SUITE_TYPE {
2250 SmallBusiness,
2251 Enterprise,
2252 BackOffice,
2253 CommunicationServer,
2254 TerminalServer,
2255 SmallBusinessRestricted,
2256 EmbeddedNT,
2257 DataCenter,
2258 SingleUserTS,
2259 Personal,
2260 Blade,
2261 EmbeddedRestricted,
2262 SecurityAppliance,
2263 StorageServer,
2264 ComputeServer,
2265 WHServer,
2266 MaxSuiteType
2267 } SUITE_TYPE;
2268
2269 typedef enum _EX_POOL_PRIORITY {
2270 LowPoolPriority,
2271 LowPoolPrioritySpecialPoolOverrun = 8,
2272 LowPoolPrioritySpecialPoolUnderrun = 9,
2273 NormalPoolPriority = 16,
2274 NormalPoolPrioritySpecialPoolOverrun = 24,
2275 NormalPoolPrioritySpecialPoolUnderrun = 25,
2276 HighPoolPriority = 32,
2277 HighPoolPrioritySpecialPoolOverrun = 40,
2278 HighPoolPrioritySpecialPoolUnderrun = 41
2279 } EX_POOL_PRIORITY;
2280
2281 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
2282 #define LOOKASIDE_ALIGN
2283 #else
2284 #define LOOKASIDE_ALIGN DECLSPEC_CACHEALIGN
2285 #endif
2286
2287 typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;
2288
2289 _IRQL_requires_same_
2290 _Function_class_(ALLOCATE_FUNCTION)
2291 typedef PVOID
2292 (NTAPI *PALLOCATE_FUNCTION)(
2293 _In_ POOL_TYPE PoolType,
2294 _In_ SIZE_T NumberOfBytes,
2295 _In_ ULONG Tag);
2296
2297 _IRQL_requires_same_
2298 _Function_class_(ALLOCATE_FUNCTION_EX)
2299 typedef PVOID
2300 (NTAPI *PALLOCATE_FUNCTION_EX)(
2301 _In_ POOL_TYPE PoolType,
2302 _In_ SIZE_T NumberOfBytes,
2303 _In_ ULONG Tag,
2304 _Inout_ PLOOKASIDE_LIST_EX Lookaside);
2305
2306 _IRQL_requires_same_
2307 _Function_class_(FREE_FUNCTION)
2308 typedef VOID
2309 (NTAPI *PFREE_FUNCTION)(
2310 _In_ PVOID Buffer);
2311
2312 _IRQL_requires_same_
2313 _Function_class_(FREE_FUNCTION_EX)
2314 typedef VOID
2315 (NTAPI *PFREE_FUNCTION_EX)(
2316 _In_ PVOID Buffer,
2317 _Inout_ PLOOKASIDE_LIST_EX Lookaside);
2318
2319 _IRQL_requires_same_
2320 _Function_class_(CALLBACK_FUNCTION)
2321 typedef VOID
2322 (NTAPI CALLBACK_FUNCTION)(
2323 _In_opt_ PVOID CallbackContext,
2324 _In_opt_ PVOID Argument1,
2325 _In_opt_ PVOID Argument2);
2326 typedef CALLBACK_FUNCTION *PCALLBACK_FUNCTION;
2327
2328 #define GENERAL_LOOKASIDE_LAYOUT \
2329 _ANONYMOUS_UNION union { \
2330 SLIST_HEADER ListHead; \
2331 SINGLE_LIST_ENTRY SingleListHead; \
2332 } DUMMYUNIONNAME; \
2333 USHORT Depth; \
2334 USHORT MaximumDepth; \
2335 ULONG TotalAllocates; \
2336 _ANONYMOUS_UNION union { \
2337 ULONG AllocateMisses; \
2338 ULONG AllocateHits; \
2339 } DUMMYUNIONNAME2; \
2340 ULONG TotalFrees; \
2341 _ANONYMOUS_UNION union { \
2342 ULONG FreeMisses; \
2343 ULONG FreeHits; \
2344 } DUMMYUNIONNAME3; \
2345 POOL_TYPE Type; \
2346 ULONG Tag; \
2347 ULONG Size; \
2348 _ANONYMOUS_UNION union { \
2349 PALLOCATE_FUNCTION_EX AllocateEx; \
2350 PALLOCATE_FUNCTION Allocate; \
2351 } DUMMYUNIONNAME4; \
2352 _ANONYMOUS_UNION union { \
2353 PFREE_FUNCTION_EX FreeEx; \
2354 PFREE_FUNCTION Free; \
2355 } DUMMYUNIONNAME5; \
2356 LIST_ENTRY ListEntry; \
2357 ULONG LastTotalAllocates; \
2358 _ANONYMOUS_UNION union { \
2359 ULONG LastAllocateMisses; \
2360 ULONG LastAllocateHits; \
2361 } DUMMYUNIONNAME6; \
2362 ULONG Future[2];
2363
2364 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE {
2365 GENERAL_LOOKASIDE_LAYOUT
2366 } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
2367
2368 typedef struct _GENERAL_LOOKASIDE_POOL {
2369 GENERAL_LOOKASIDE_LAYOUT
2370 } GENERAL_LOOKASIDE_POOL, *PGENERAL_LOOKASIDE_POOL;
2371
2372 #define LOOKASIDE_CHECK(f) \
2373 C_ASSERT(FIELD_OFFSET(GENERAL_LOOKASIDE,f) == FIELD_OFFSET(GENERAL_LOOKASIDE_POOL,f))
2374
2375 LOOKASIDE_CHECK(TotalFrees);
2376 LOOKASIDE_CHECK(Tag);
2377 LOOKASIDE_CHECK(Future);
2378
2379 typedef struct LOOKASIDE_ALIGN _PAGED_LOOKASIDE_LIST {
2380 GENERAL_LOOKASIDE L;
2381 #if !defined(_AMD64_) && !defined(_IA64_)
2382 FAST_MUTEX Lock__ObsoleteButDoNotDelete;
2383 #endif
2384 } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
2385
2386 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST {
2387 GENERAL_LOOKASIDE L;
2388 #if !defined(_AMD64_) && !defined(_IA64_)
2389 KSPIN_LOCK Lock__ObsoleteButDoNotDelete;
2390 #endif
2391 } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
2392
2393 #define LOOKASIDE_MINIMUM_BLOCK_SIZE (RTL_SIZEOF_THROUGH_FIELD (SLIST_ENTRY, Next))
2394
2395 typedef struct _LOOKASIDE_LIST_EX {
2396 GENERAL_LOOKASIDE_POOL L;
2397 } LOOKASIDE_LIST_EX;
2398
2399 #if (NTDDI_VERSION >= NTDDI_VISTA)
2400
2401 #define EX_LOOKASIDE_LIST_EX_FLAGS_RAISE_ON_FAIL 0x00000001UL
2402 #define EX_LOOKASIDE_LIST_EX_FLAGS_FAIL_NO_RAISE 0x00000002UL
2403
2404 #define EX_MAXIMUM_LOOKASIDE_DEPTH_BASE 256
2405 #define EX_MAXIMUM_LOOKASIDE_DEPTH_LIMIT 1024
2406
2407 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
2408
2409 typedef struct _EX_RUNDOWN_REF {
2410 _ANONYMOUS_UNION union {
2411 volatile ULONG_PTR Count;
2412 volatile PVOID Ptr;
2413 } DUMMYUNIONNAME;
2414 } EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
2415
2416 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE;
2417
2418 typedef enum _WORK_QUEUE_TYPE {
2419 CriticalWorkQueue,
2420 DelayedWorkQueue,
2421 HyperCriticalWorkQueue,
2422 MaximumWorkQueue
2423 } WORK_QUEUE_TYPE;
2424
2425 _IRQL_requires_same_
2426 _Function_class_(WORKER_THREAD_ROUTINE)
2427 typedef VOID
2428 (NTAPI WORKER_THREAD_ROUTINE)(
2429 _In_ PVOID Parameter);
2430 typedef WORKER_THREAD_ROUTINE *PWORKER_THREAD_ROUTINE;
2431
2432 typedef struct _WORK_QUEUE_ITEM {
2433 LIST_ENTRY List;
2434 PWORKER_THREAD_ROUTINE WorkerRoutine;
2435 volatile PVOID Parameter;
2436 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
2437
2438 typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD;
2439
2440 typedef struct _OWNER_ENTRY {
2441 ERESOURCE_THREAD OwnerThread;
2442 _ANONYMOUS_UNION union {
2443 _ANONYMOUS_STRUCT struct {
2444 ULONG IoPriorityBoosted:1;
2445 ULONG OwnerReferenced:1;
2446 ULONG OwnerCount:30;
2447 } DUMMYSTRUCTNAME;
2448 ULONG TableSize;
2449 } DUMMYUNIONNAME;
2450 } OWNER_ENTRY, *POWNER_ENTRY;
2451
2452 typedef struct _ERESOURCE {
2453 LIST_ENTRY SystemResourcesList;
2454 POWNER_ENTRY OwnerTable;
2455 SHORT ActiveCount;
2456 USHORT Flag;
2457 volatile PKSEMAPHORE SharedWaiters;
2458 volatile PKEVENT ExclusiveWaiters;
2459 OWNER_ENTRY OwnerEntry;
2460 ULONG ActiveEntries;
2461 ULONG ContentionCount;
2462 ULONG NumberOfSharedWaiters;
2463 ULONG NumberOfExclusiveWaiters;
2464 #if defined(_WIN64)
2465 PVOID Reserved2;
2466 #endif
2467 _ANONYMOUS_UNION union {
2468 PVOID Address;
2469 ULONG_PTR CreatorBackTraceIndex;
2470 } DUMMYUNIONNAME;
2471 KSPIN_LOCK SpinLock;
2472 } ERESOURCE, *PERESOURCE;
2473
2474 /* ERESOURCE.Flag */
2475 #define ResourceNeverExclusive 0x0010
2476 #define ResourceReleaseByOtherThread 0x0020
2477 #define ResourceOwnedExclusive 0x0080
2478
2479 #define RESOURCE_HASH_TABLE_SIZE 64
2480
2481 typedef struct _RESOURCE_HASH_ENTRY {
2482 LIST_ENTRY ListEntry;
2483 PVOID Address;
2484 ULONG ContentionCount;
2485 ULONG Number;
2486 } RESOURCE_HASH_ENTRY, *PRESOURCE_HASH_ENTRY;
2487
2488 typedef struct _RESOURCE_PERFORMANCE_DATA {
2489 ULONG ActiveResourceCount;
2490 ULONG TotalResourceCount;
2491 ULONG ExclusiveAcquire;
2492 ULONG SharedFirstLevel;
2493 ULONG SharedSecondLevel;
2494 ULONG StarveFirstLevel;
2495 ULONG StarveSecondLevel;
2496 ULONG WaitForExclusive;
2497 ULONG OwnerTableExpands;
2498 ULONG MaximumTableExpand;
2499 LIST_ENTRY HashTable[RESOURCE_HASH_TABLE_SIZE];
2500 } RESOURCE_PERFORMANCE_DATA, *PRESOURCE_PERFORMANCE_DATA;
2501
2502 /* Global debug flag */
2503 #if DEVL
2504 extern NTKERNELAPI ULONG NtGlobalFlag;
2505 #define IF_NTOS_DEBUG(FlagName) if (NtGlobalFlag & (FLG_##FlagName))
2506 #else
2507 #define IF_NTOS_DEBUG(FlagName) if(FALSE)
2508 #endif
2509
2510 /******************************************************************************
2511 * Security Manager Types *
2512 ******************************************************************************/
2513
2514 /* Simple types */
2515 typedef PVOID PSECURITY_DESCRIPTOR;
2516 typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;
2517 typedef ULONG ACCESS_MASK, *PACCESS_MASK;
2518
2519 typedef PVOID PACCESS_TOKEN;
2520 typedef PVOID PSID;
2521
2522 #define DELETE 0x00010000L
2523 #define READ_CONTROL 0x00020000L
2524 #define WRITE_DAC 0x00040000L
2525 #define WRITE_OWNER 0x00080000L
2526 #define SYNCHRONIZE 0x00100000L
2527 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
2528 #define STANDARD_RIGHTS_READ READ_CONTROL
2529 #define STANDARD_RIGHTS_WRITE READ_CONTROL
2530 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
2531 #define STANDARD_RIGHTS_ALL 0x001F0000L
2532 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
2533 #define ACCESS_SYSTEM_SECURITY 0x01000000L
2534 #define MAXIMUM_ALLOWED 0x02000000L
2535 #define GENERIC_READ 0x80000000L
2536 #define GENERIC_WRITE 0x40000000L
2537 #define GENERIC_EXECUTE 0x20000000L
2538 #define GENERIC_ALL 0x10000000L
2539
2540 typedef struct _GENERIC_MAPPING {
2541 ACCESS_MASK GenericRead;
2542 ACCESS_MASK GenericWrite;
2543 ACCESS_MASK GenericExecute;
2544 ACCESS_MASK GenericAll;
2545 } GENERIC_MAPPING, *PGENERIC_MAPPING;
2546
2547 #define ACL_REVISION 2
2548 #define ACL_REVISION_DS 4
2549
2550 #define ACL_REVISION1 1
2551 #define ACL_REVISION2 2
2552 #define ACL_REVISION3 3
2553 #define ACL_REVISION4 4
2554 #define MIN_ACL_REVISION ACL_REVISION2
2555 #define MAX_ACL_REVISION ACL_REVISION4
2556
2557 typedef struct _ACL {
2558 UCHAR AclRevision;
2559 UCHAR Sbz1;
2560 USHORT AclSize;
2561 USHORT AceCount;
2562 USHORT Sbz2;
2563 } ACL, *PACL;
2564
2565 /* Current security descriptor revision value */
2566 #define SECURITY_DESCRIPTOR_REVISION (1)
2567 #define SECURITY_DESCRIPTOR_REVISION1 (1)
2568
2569 /* Privilege attributes */
2570 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
2571 #define SE_PRIVILEGE_ENABLED (0x00000002L)
2572 #define SE_PRIVILEGE_REMOVED (0X00000004L)
2573 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
2574
2575 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
2576 SE_PRIVILEGE_ENABLED | \
2577 SE_PRIVILEGE_REMOVED | \
2578 SE_PRIVILEGE_USED_FOR_ACCESS)
2579
2580 #include <pshpack4.h>
2581 typedef struct _LUID_AND_ATTRIBUTES {
2582 LUID Luid;
2583 ULONG Attributes;
2584 } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
2585 #include <poppack.h>
2586
2587 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
2588 typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
2589
2590 /* Privilege sets */
2591 #define PRIVILEGE_SET_ALL_NECESSARY (1)
2592
2593 typedef struct _PRIVILEGE_SET {
2594 ULONG PrivilegeCount;
2595 ULONG Control;
2596 LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
2597 } PRIVILEGE_SET, *PPRIVILEGE_SET;
2598
2599 typedef enum _SECURITY_IMPERSONATION_LEVEL {
2600 SecurityAnonymous,
2601 SecurityIdentification,
2602 SecurityImpersonation,
2603 SecurityDelegation
2604 } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
2605
2606 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
2607 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
2608 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
2609 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
2610
2611 #define SECURITY_DYNAMIC_TRACKING (TRUE)
2612 #define SECURITY_STATIC_TRACKING (FALSE)
2613
2614 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE;
2615
2616 typedef struct _SECURITY_QUALITY_OF_SERVICE {
2617 ULONG Length;
2618 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
2619 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
2620 BOOLEAN EffectiveOnly;
2621 } SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
2622
2623 typedef struct _SE_IMPERSONATION_STATE {
2624 PACCESS_TOKEN Token;
2625 BOOLEAN CopyOnOpen;
2626 BOOLEAN EffectiveOnly;
2627 SECURITY_IMPERSONATION_LEVEL Level;
2628 } SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
2629
2630
2631 #define OWNER_SECURITY_INFORMATION (0x00000001L)
2632 #define GROUP_SECURITY_INFORMATION (0x00000002L)
2633 #define DACL_SECURITY_INFORMATION (0x00000004L)
2634 #define SACL_SECURITY_INFORMATION (0x00000008L)
2635 #define LABEL_SECURITY_INFORMATION (0x00000010L)
2636
2637 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
2638 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
2639 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
2640 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
2641
2642
2643 typedef enum _SECURITY_OPERATION_CODE {
2644 SetSecurityDescriptor,
2645 QuerySecurityDescriptor,
2646 DeleteSecurityDescriptor,
2647 AssignSecurityDescriptor
2648 } SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
2649
2650 #define INITIAL_PRIVILEGE_COUNT 3
2651
2652 typedef struct _INITIAL_PRIVILEGE_SET {
2653 ULONG PrivilegeCount;
2654 ULONG Control;
2655 LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT];
2656 } INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
2657
2658 #define SE_MIN_WELL_KNOWN_PRIVILEGE 2
2659 #define SE_CREATE_TOKEN_PRIVILEGE 2
2660 #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3
2661 #define SE_LOCK_MEMORY_PRIVILEGE 4
2662 #define SE_INCREASE_QUOTA_PRIVILEGE 5
2663 #define SE_MACHINE_ACCOUNT_PRIVILEGE 6
2664 #define SE_TCB_PRIVILEGE 7
2665 #define SE_SECURITY_PRIVILEGE 8
2666 #define SE_TAKE_OWNERSHIP_PRIVILEGE 9
2667 #define SE_LOAD_DRIVER_PRIVILEGE 10
2668 #define SE_SYSTEM_PROFILE_PRIVILEGE 11
2669 #define SE_SYSTEMTIME_PRIVILEGE 12
2670 #define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13
2671 #define SE_INC_BASE_PRIORITY_PRIVILEGE 14
2672 #define SE_CREATE_PAGEFILE_PRIVILEGE 15
2673 #define SE_CREATE_PERMANENT_PRIVILEGE 16
2674 #define SE_BACKUP_PRIVILEGE 17
2675 #define SE_RESTORE_PRIVILEGE 18
2676 #define SE_SHUTDOWN_PRIVILEGE 19
2677 #define SE_DEBUG_PRIVILEGE 20
2678 #define SE_AUDIT_PRIVILEGE 21
2679 #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22
2680 #define SE_CHANGE_NOTIFY_PRIVILEGE 23
2681 #define SE_REMOTE_SHUTDOWN_PRIVILEGE 24
2682 #define SE_UNDOCK_PRIVILEGE 25
2683 #define SE_SYNC_AGENT_PRIVILEGE 26
2684 #define SE_ENABLE_DELEGATION_PRIVILEGE 27
2685 #define SE_MANAGE_VOLUME_PRIVILEGE 28
2686 #define SE_IMPERSONATE_PRIVILEGE 29
2687 #define SE_CREATE_GLOBAL_PRIVILEGE 30
2688 #define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE 31
2689 #define SE_RELABEL_PRIVILEGE 32
2690 #define SE_INC_WORKING_SET_PRIVILEGE 33
2691 #define SE_TIME_ZONE_PRIVILEGE 34
2692 #define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE 35
2693 #define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
2694
2695 typedef struct _SECURITY_SUBJECT_CONTEXT {
2696 PACCESS_TOKEN ClientToken;
2697 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
2698 PACCESS_TOKEN PrimaryToken;
2699 PVOID ProcessAuditId;
2700 } SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
2701
2702 typedef struct _ACCESS_STATE {
2703 LUID OperationID;
2704 BOOLEAN SecurityEvaluated;
2705 BOOLEAN GenerateAudit;
2706 BOOLEAN GenerateOnClose;
2707 BOOLEAN PrivilegesAllocated;
2708 ULONG Flags;
2709 ACCESS_MASK RemainingDesiredAccess;
2710 ACCESS_MASK PreviouslyGrantedAccess;
2711 ACCESS_MASK OriginalDesiredAccess;
2712 SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
2713 PSECURITY_DESCRIPTOR SecurityDescriptor;
2714 PVOID AuxData;
2715 union {
2716 INITIAL_PRIVILEGE_SET InitialPrivilegeSet;
2717 PRIVILEGE_SET PrivilegeSet;
2718 } Privileges;
2719 BOOLEAN AuditPrivileges;
2720 UNICODE_STRING ObjectName;
2721 UNICODE_STRING ObjectTypeName;
2722 } ACCESS_STATE, *PACCESS_STATE;
2723
2724 typedef VOID
2725 (NTAPI *PNTFS_DEREF_EXPORTED_SECURITY_DESCRIPTOR)(
2726 _In_ PVOID Vcb,
2727 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor);
2728
2729 #ifndef _NTLSA_IFS_
2730
2731 #ifndef _NTLSA_AUDIT_
2732 #define _NTLSA_AUDIT_
2733
2734 #define SE_MAX_AUDIT_PARAMETERS 32
2735 #define SE_MAX_GENERIC_AUDIT_PARAMETERS 28
2736
2737 #define SE_ADT_OBJECT_ONLY 0x1
2738
2739 #define SE_ADT_PARAMETERS_SELF_RELATIVE 0x00000001
2740 #define SE_ADT_PARAMETERS_SEND_TO_LSA 0x00000002
2741 #define SE_ADT_PARAMETER_EXTENSIBLE_AUDIT 0x00000004
2742 #define SE_ADT_PARAMETER_GENERIC_AUDIT 0x00000008
2743 #define SE_ADT_PARAMETER_WRITE_SYNCHRONOUS 0x00000010
2744
2745 #define LSAP_SE_ADT_PARAMETER_ARRAY_TRUE_SIZE(Parameters) \
2746 ( sizeof(SE_ADT_PARAMETER_ARRAY) - sizeof(SE_ADT_PARAMETER_ARRAY_ENTRY) * \
2747 (SE_MAX_AUDIT_PARAMETERS - Parameters->ParameterCount) )
2748
2749 typedef enum _SE_ADT_PARAMETER_TYPE {
2750 SeAdtParmTypeNone = 0,
2751 SeAdtParmTypeString,
2752 SeAdtParmTypeFileSpec,
2753 SeAdtParmTypeUlong,
2754 SeAdtParmTypeSid,
2755 SeAdtParmTypeLogonId,
2756 SeAdtParmTypeNoLogonId,
2757 SeAdtParmTypeAccessMask,
2758 SeAdtParmTypePrivs,
2759 SeAdtParmTypeObjectTypes,
2760 SeAdtParmTypeHexUlong,
2761 SeAdtParmTypePtr,
2762 SeAdtParmTypeTime,
2763 SeAdtParmTypeGuid,
2764 SeAdtParmTypeLuid,
2765 SeAdtParmTypeHexInt64,
2766 SeAdtParmTypeStringList,
2767 SeAdtParmTypeSidList,
2768 SeAdtParmTypeDuration,
2769 SeAdtParmTypeUserAccountControl,
2770 SeAdtParmTypeNoUac,
2771 SeAdtParmTypeMessage,
2772 SeAdtParmTypeDateTime,
2773 SeAdtParmTypeSockAddr,
2774 SeAdtParmTypeSD,
2775 SeAdtParmTypeLogonHours,
2776 SeAdtParmTypeLogonIdNoSid,
2777 SeAdtParmTypeUlongNoConv,
2778 SeAdtParmTypeSockAddrNoPort,
2779 SeAdtParmTypeAccessReason
2780 } SE_ADT_PARAMETER_TYPE, *PSE_ADT_PARAMETER_TYPE;
2781
2782 typedef struct _SE_ADT_OBJECT_TYPE {
2783 GUID ObjectType;
2784 USHORT Flags;
2785 USHORT Level;
2786 ACCESS_MASK AccessMask;
2787 } SE_ADT_OBJECT_TYPE, *PSE_ADT_OBJECT_TYPE;
2788
2789 typedef struct _SE_ADT_PARAMETER_ARRAY_ENTRY {
2790 SE_ADT_PARAMETER_TYPE Type;
2791 ULONG Length;
2792 ULONG_PTR Data[2];
2793 PVOID Address;
2794 } SE_ADT_PARAMETER_ARRAY_ENTRY, *PSE_ADT_PARAMETER_ARRAY_ENTRY;
2795
2796 typedef struct _SE_ADT_ACCESS_REASON {
2797 ACCESS_MASK AccessMask;
2798 ULONG AccessReasons[32];
2799 ULONG ObjectTypeIndex;
2800 ULONG AccessGranted;
2801 PSECURITY_DESCRIPTOR SecurityDescriptor;
2802 } SE_ADT_ACCESS_REASON, *PSE_ADT_ACCESS_REASON;
2803
2804 typedef struct _SE_ADT_PARAMETER_ARRAY {
2805 ULONG CategoryId;
2806 ULONG AuditId;
2807 ULONG ParameterCount;
2808 ULONG Length;
2809 USHORT FlatSubCategoryId;
2810 USHORT Type;
2811 ULONG Flags;
2812 SE_ADT_PARAMETER_ARRAY_ENTRY Parameters[ SE_MAX_AUDIT_PARAMETERS ];
2813 } SE_ADT_PARAMETER_ARRAY, *PSE_ADT_PARAMETER_ARRAY;
2814
2815 #endif /* !_NTLSA_AUDIT_ */
2816 #endif /* !_NTLSA_IFS_ */
2817 /******************************************************************************
2818 * Power Management Support Types *
2819 ******************************************************************************/
2820
2821 #ifndef _PO_DDK_
2822 #define _PO_DDK_
2823
2824 #define PO_CB_SYSTEM_POWER_POLICY 0
2825 #define PO_CB_AC_STATUS 1
2826 #define PO_CB_BUTTON_COLLISION 2
2827 #define PO_CB_SYSTEM_STATE_LOCK 3
2828 #define PO_CB_LID_SWITCH_STATE 4
2829 #define PO_CB_PROCESSOR_POWER_POLICY 5
2830
2831 /* Power States/Levels */
2832 typedef enum _SYSTEM_POWER_STATE {
2833 PowerSystemUnspecified = 0,
2834 PowerSystemWorking,
2835 PowerSystemSleeping1,
2836 PowerSystemSleeping2,
2837 PowerSystemSleeping3,
2838 PowerSystemHibernate,
2839 PowerSystemShutdown,
2840 PowerSystemMaximum
2841 } SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
2842
2843 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
2844
2845 typedef enum _POWER_INFORMATION_LEVEL {
2846 SystemPowerPolicyAc,
2847 SystemPowerPolicyDc,
2848 VerifySystemPolicyAc,
2849 VerifySystemPolicyDc,
2850 SystemPowerCapabilities,
2851 SystemBatteryState,
2852 SystemPowerStateHandler,
2853 ProcessorStateHandler,
2854 SystemPowerPolicyCurrent,
2855 AdministratorPowerPolicy,
2856 SystemReserveHiberFile,
2857 ProcessorInformation,
2858 SystemPowerInformation,
2859 ProcessorStateHandler2,
2860 LastWakeTime,
2861 LastSleepTime,
2862 SystemExecutionState,
2863 SystemPowerStateNotifyHandler,
2864 ProcessorPowerPolicyAc,
2865 ProcessorPowerPolicyDc,
2866 VerifyProcessorPowerPolicyAc,
2867 VerifyProcessorPowerPolicyDc,
2868 ProcessorPowerPolicyCurrent,
2869 SystemPowerStateLogging,
2870 SystemPowerLoggingEntry,
2871 SetPowerSettingValue,
2872 NotifyUserPowerSetting,
2873 PowerInformationLevelUnused0,
2874 PowerInformationLevelUnused1,
2875 SystemVideoState,
2876 TraceApplicationPowerMessage,
2877 TraceApplicationPowerMessageEnd,
2878 ProcessorPerfStates,
2879 ProcessorIdleStates,
2880 ProcessorCap,
2881 SystemWakeSource,
2882 SystemHiberFileInformation,
2883 TraceServicePowerMessage,
2884 ProcessorLoad,
2885 PowerShutdownNotification,
2886 MonitorCapabilities,
2887 SessionPowerInit,
2888 SessionDisplayState,
2889 PowerRequestCreate,
2890 PowerRequestAction,
2891 GetPowerRequestList,
2892 ProcessorInformationEx,
2893 NotifyUserModeLegacyPowerEvent,
2894 GroupPark,
2895 ProcessorIdleDomains,
2896 WakeTimerList,
2897 SystemHiberFileSize,
2898 PowerInformationLevelMaximum
2899 } POWER_INFORMATION_LEVEL;
2900
2901 typedef enum {
2902 PowerActionNone = 0,
2903 PowerActionReserved,
2904 PowerActionSleep,
2905 PowerActionHibernate,
2906 PowerActionShutdown,
2907 PowerActionShutdownReset,
2908 PowerActionShutdownOff,
2909 PowerActionWarmEject
2910 } POWER_ACTION, *PPOWER_ACTION;
2911
2912 typedef enum _DEVICE_POWER_STATE {
2913 PowerDeviceUnspecified = 0,
2914 PowerDeviceD0,
2915 PowerDeviceD1,
2916 PowerDeviceD2,
2917 PowerDeviceD3,
2918 PowerDeviceMaximum
2919 } DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
2920
2921 typedef enum _MONITOR_DISPLAY_STATE {
2922 PowerMonitorOff = 0,
2923 PowerMonitorOn,
2924 PowerMonitorDim
2925 } MONITOR_DISPLAY_STATE, *PMONITOR_DISPLAY_STATE;
2926
2927 typedef union _POWER_STATE {
2928 SYSTEM_POWER_STATE SystemState;
2929 DEVICE_POWER_STATE DeviceState;
2930 } POWER_STATE, *PPOWER_STATE;
2931
2932 typedef enum _POWER_STATE_TYPE {
2933 SystemPowerState = 0,
2934 DevicePowerState
2935 } POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
2936
2937 #if (NTDDI_VERSION >= NTDDI_VISTA)
2938 typedef struct _SYSTEM_POWER_STATE_CONTEXT {
2939 _ANONYMOUS_UNION union {
2940 _ANONYMOUS_STRUCT struct {
2941 ULONG Reserved1:8;
2942 ULONG TargetSystemState:4;
2943 ULONG EffectiveSystemState:4;
2944 ULONG CurrentSystemState:4;
2945 ULONG IgnoreHibernationPath:1;
2946 ULONG PseudoTransition:1;
2947 ULONG Reserved2:10;
2948 } DUMMYSTRUCTNAME;
2949 ULONG ContextAsUlong;
2950 } DUMMYUNIONNAME;
2951 } SYSTEM_POWER_STATE_CONTEXT, *PSYSTEM_POWER_STATE_CONTEXT;
2952 #endif
2953
2954 #if (NTDDI_VERSION >= NTDDI_WIN7)
2955 typedef struct _COUNTED_REASON_CONTEXT {
2956 ULONG Version;
2957 ULONG Flags;
2958 _ANONYMOUS_UNION union {
2959 _ANONYMOUS_STRUCT struct {
2960 UNICODE_STRING ResourceFileName;
2961 USHORT ResourceReasonId;
2962 ULONG StringCount;
2963 PUNICODE_STRING ReasonStrings;
2964 } DUMMYSTRUCTNAME;
2965 UNICODE_STRING SimpleString;
2966 } DUMMYUNIONNAME;
2967 } COUNTED_REASON_CONTEXT, *PCOUNTED_REASON_CONTEXT;
2968 #endif
2969
2970 #define IOCTL_QUERY_DEVICE_POWER_STATE \
2971 CTL_CODE(FILE_DEVICE_BATTERY, 0x0, METHOD_BUFFERED, FILE_READ_ACCESS)
2972
2973 #define IOCTL_SET_DEVICE_WAKE \
2974 CTL_CODE(FILE_DEVICE_BATTERY, 0x1, METHOD_BUFFERED, FILE_WRITE_ACCESS)
2975
2976 #define IOCTL_CANCEL_DEVICE_WAKE \
2977 CTL_CODE(FILE_DEVICE_BATTERY, 0x2, METHOD_BUFFERED, FILE_WRITE_ACCESS)
2978
2979 #define ES_SYSTEM_REQUIRED 0x00000001
2980 #define ES_DISPLAY_REQUIRED 0x00000002
2981 #define ES_USER_PRESENT 0x00000004
2982 #define ES_CONTINUOUS 0x80000000
2983
2984 typedef ULONG EXECUTION_STATE, *PEXECUTION_STATE;
2985
2986 typedef enum {
2987 LT_DONT_CARE,
2988 LT_LOWEST_LATENCY
2989 } LATENCY_TIME;
2990
2991 #if (_WIN32_WINNT >= _WIN32_WINNT_WIN7)
2992 #define DIAGNOSTIC_REASON_VERSION 0
2993 #define DIAGNOSTIC_REASON_SIMPLE_STRING 0x00000001
2994 #define DIAGNOSTIC_REASON_DETAILED_STRING 0x00000002
2995 #define DIAGNOSTIC_REASON_NOT_SPECIFIED 0x80000000
2996 #define DIAGNOSTIC_REASON_INVALID_FLAGS (~0x80000003)
2997 #endif
2998
2999 #define POWER_REQUEST_CONTEXT_VERSION 0
3000 #define POWER_REQUEST_CONTEXT_SIMPLE_STRING 0x00000001
3001 #define POWER_REQUEST_CONTEXT_DETAILED_STRING 0x00000002
3002
3003 #define PowerRequestMaximum 3
3004
3005 typedef enum _POWER_REQUEST_TYPE {
3006 PowerRequestDisplayRequired,
3007 PowerRequestSystemRequired,
3008 PowerRequestAwayModeRequired
3009 } POWER_REQUEST_TYPE, *PPOWER_REQUEST_TYPE;
3010
3011 #if (NTDDI_VERSION >= NTDDI_WINXP)
3012
3013 #define PDCAP_D0_SUPPORTED 0x00000001
3014 #define PDCAP_D1_SUPPORTED 0x00000002
3015 #define PDCAP_D2_SUPPORTED 0x00000004
3016 #define PDCAP_D3_SUPPORTED 0x00000008
3017 #define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010
3018 #define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020
3019 #define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040
3020 #define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080
3021 #define PDCAP_WARM_EJECT_SUPPORTED 0x00000100
3022
3023 typedef struct CM_Power_Data_s {
3024 ULONG PD_Size;
3025 DEVICE_POWER_STATE PD_MostRecentPowerState;
3026 ULONG PD_Capabilities;
3027 ULONG PD_D1Latency;
3028 ULONG PD_D2Latency;
3029 ULONG PD_D3Latency;
3030 DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum];
3031 SYSTEM_POWER_STATE PD_DeepestSystemWake;
3032 } CM_POWER_DATA, *PCM_POWER_DATA;
3033
3034 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
3035
3036 typedef enum _SYSTEM_POWER_CONDITION {
3037 PoAc,
3038 PoDc,
3039 PoHot,
3040 PoConditionMaximum
3041 } SYSTEM_POWER_CONDITION;
3042
3043 typedef struct _SET_POWER_SETTING_VALUE {
3044 ULONG Version;
3045 GUID Guid;
3046 SYSTEM_POWER_CONDITION PowerCondition;
3047 ULONG DataLength;
3048 UCHAR Data[ANYSIZE_ARRAY];
3049 } SET_POWER_SETTING_VALUE, *PSET_POWER_SETTING_VALUE;
3050
3051 #define POWER_SETTING_VALUE_VERSION (0x1)
3052
3053 typedef struct _NOTIFY_USER_POWER_SETTING {
3054 GUID Guid;
3055 } NOTIFY_USER_POWER_SETTING, *PNOTIFY_USER_POWER_SETTING;
3056
3057 typedef struct _APPLICATIONLAUNCH_SETTING_VALUE {
3058 LARGE_INTEGER ActivationTime;
3059 ULONG Flags;
3060 ULONG ButtonInstanceID;
3061 } APPLICATIONLAUNCH_SETTING_VALUE, *PAPPLICATIONLAUNCH_SETTING_VALUE;
3062
3063 typedef enum _POWER_PLATFORM_ROLE {
3064 PlatformRoleUnspecified = 0,
3065 PlatformRoleDesktop,
3066 PlatformRoleMobile,
3067 PlatformRoleWorkstation,
3068 PlatformRoleEnterpriseServer,
3069 PlatformRoleSOHOServer,
3070 PlatformRoleAppliancePC,
3071 PlatformRolePerformanceServer,
3072 PlatformRoleMaximum
3073 } POWER_PLATFORM_ROLE;
3074
3075 #if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_)
3076 typedef struct {
3077 ULONG Granularity;
3078 ULONG Capacity;
3079 } BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE;
3080 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) */
3081
3082 #endif /* !_PO_DDK_ */
3083
3084 #define CORE_PARKING_POLICY_CHANGE_IDEAL 0
3085 #define CORE_PARKING_POLICY_CHANGE_SINGLE 1
3086 #define CORE_PARKING_POLICY_CHANGE_ROCKET 2
3087 #define CORE_PARKING_POLICY_CHANGE_MAX CORE_PARKING_POLICY_CHANGE_ROCKET
3088
3089 DEFINE_GUID(GUID_MAX_POWER_SAVINGS, 0xA1841308, 0x3541, 0x4FAB, 0xBC, 0x81, 0xF7, 0x15, 0x56, 0xF2, 0x0B, 0x4A);
3090 DEFINE_GUID(GUID_MIN_POWER_SAVINGS, 0x8C5E7FDA, 0xE8BF, 0x4A96, 0x9A, 0x85, 0xA6, 0xE2, 0x3A, 0x8C, 0x63, 0x5C);
3091 DEFINE_GUID(GUID_TYPICAL_POWER_SAVINGS, 0x381B4222, 0xF694, 0x41F0, 0x96, 0x85, 0xFF, 0x5B, 0xB2, 0x60, 0xDF, 0x2E);
3092 DEFINE_GUID(NO_SUBGROUP_GUID, 0xFEA3413E, 0x7E05, 0x4911, 0x9A, 0x71, 0x70, 0x03, 0x31, 0xF1, 0xC2, 0x94);
3093 DEFINE_GUID(ALL_POWERSCHEMES_GUID, 0x68A1E95E, 0x13EA, 0x41E1, 0x80, 0x11, 0x0C, 0x49, 0x6C, 0xA4, 0x90, 0xB0);
3094 DEFINE_GUID(GUID_POWERSCHEME_PERSONALITY, 0x245D8541, 0x3943, 0x4422, 0xB0, 0x25, 0x13, 0xA7, 0x84, 0xF6, 0x79, 0xB7);
3095 DEFINE_GUID(GUID_ACTIVE_POWERSCHEME, 0x31F9F286, 0x5084, 0x42FE, 0xB7, 0x20, 0x2B, 0x02, 0x64, 0x99, 0x37, 0x63);
3096 DEFINE_GUID(GUID_VIDEO_SUBGROUP, 0x7516B95F, 0xF776, 0x4464, 0x8C, 0x53, 0x06, 0x16, 0x7F, 0x40, 0xCC, 0x99);
3097 DEFINE_GUID(GUID_VIDEO_POWERDOWN_TIMEOUT, 0x3C0BC021, 0xC8A8, 0x4E07, 0xA9, 0x73, 0x6B, 0x14, 0xCB, 0xCB, 0x2B, 0x7E);
3098 DEFINE_GUID(GUID_VIDEO_ANNOYANCE_TIMEOUT, 0x82DBCF2D, 0xCD67, 0x40C5, 0xBF, 0xDC, 0x9F, 0x1A, 0x5C, 0xCD, 0x46, 0x63);
3099 DEFINE_GUID(GUID_VIDEO_ADAPTIVE_PERCENT_INCREASE, 0xEED904DF, 0xB142, 0x4183, 0xB1, 0x0B, 0x5A, 0x11, 0x97, 0xA3, 0x78, 0x64);
3100 DEFINE_GUID(GUID_VIDEO_DIM_TIMEOUT, 0x17aaa29b, 0x8b43, 0x4b94, 0xaa, 0xfe, 0x35, 0xf6, 0x4d, 0xaa, 0xf1, 0xee);
3101 DEFINE_GUID(GUID_VIDEO_ADAPTIVE_POWERDOWN, 0x90959D22, 0xD6A1, 0x49B9, 0xAF, 0x93, 0xBC, 0xE8, 0x85, 0xAD, 0x33, 0x5B);
3102 DEFINE_GUID(GUID_MONITOR_POWER_ON, 0x02731015, 0x4510, 0x4526, 0x99, 0xE6, 0xE5, 0xA1, 0x7E, 0xBD, 0x1A, 0xEA);
3103 DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_BRIGHTNESS, 0xaded5e82L, 0xb909, 0x4619, 0x99, 0x49, 0xf5, 0xd7, 0x1d, 0xac, 0x0b, 0xcb);
3104 DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_DIM_BRIGHTNESS, 0xf1fbfde2, 0xa960, 0x4165, 0x9f, 0x88, 0x50, 0x66, 0x79, 0x11, 0xce, 0x96);
3105 DEFINE_GUID(GUID_VIDEO_CURRENT_MONITOR_BRIGHTNESS, 0x8ffee2c6, 0x2d01, 0x46be, 0xad, 0xb9, 0x39, 0x8a, 0xdd, 0xc5, 0xb4, 0xff);
3106 DEFINE_GUID(GUID_VIDEO_ADAPTIVE_DISPLAY_BRIGHTNESS, 0xFBD9AA66, 0x9553, 0x4097, 0xBA, 0x44, 0xED, 0x6E, 0x9D, 0x65, 0xEA, 0xB8);
3107 DEFINE_GUID(GUID_SESSION_DISPLAY_STATE, 0x73A5E93A, 0x5BB1, 0x4F93, 0x89, 0x5B, 0xDB, 0xD0, 0xDA, 0x85, 0x59, 0x67);
3108 DEFINE_GUID(GUID_CONSOLE_DISPLAY_STATE, 0x6fe69556, 0x704a, 0x47a0, 0x8f, 0x24, 0xc2, 0x8d, 0x93, 0x6f, 0xda, 0x47);
3109 DEFINE_GUID(GUID_ALLOW_DISPLAY_REQUIRED, 0xA9CEB8DA, 0xCD46, 0x44FB, 0xA9, 0x8B, 0x02, 0xAF, 0x69, 0xDE, 0x46, 0x23);
3110 DEFINE_GUID(GUID_DISK_SUBGROUP, 0x0012EE47, 0x9041, 0x4B5D, 0x9B, 0x77, 0x53, 0x5F, 0xBA, 0x8B, 0x14, 0x42);
3111 DEFINE_GUID(GUID_DISK_POWERDOWN_TIMEOUT, 0x6738E2C4, 0xE8A5, 0x4A42, 0xB1, 0x6A, 0xE0, 0x40, 0xE7, 0x69, 0x75, 0x6E);
3112 DEFINE_GUID(GUID_DISK_BURST_IGNORE_THRESHOLD, 0x80e3c60e, 0xbb94, 0x4ad8, 0xbb, 0xe0, 0x0d, 0x31, 0x95, 0xef, 0xc6, 0x63);
3113 DEFINE_GUID(GUID_DISK_ADAPTIVE_POWERDOWN, 0x396A32E1, 0x499A, 0x40B2, 0x91, 0x24, 0xA9, 0x6A, 0xFE, 0x70, 0x76, 0x67);
3114 DEFINE_GUID(GUID_SLEEP_SUBGROUP, 0x238C9FA8, 0x0AAD, 0x41ED, 0x83, 0xF4, 0x97, 0xBE, 0x24, 0x2C, 0x8F, 0x20);
3115 DEFINE_GUID(GUID_SLEEP_IDLE_THRESHOLD, 0x81cd32e0, 0x7833, 0x44f3, 0x87, 0x37, 0x70, 0x81, 0xf3, 0x8d, 0x1f, 0x70);
3116 DEFINE_GUID(GUID_STANDBY_TIMEOUT, 0x29F6C1DB, 0x86DA, 0x48C5, 0x9F, 0xDB, 0xF2, 0xB6, 0x7B, 0x1F, 0x44, 0xDA);
3117 DEFINE_GUID(GUID_UNATTEND_SLEEP_TIMEOUT, 0x7bc4a2f9, 0xd8fc, 0x4469, 0xb0, 0x7b, 0x33, 0xeb, 0x78, 0x5a, 0xac, 0xa0);
3118 DEFINE_GUID(GUID_HIBERNATE_TIMEOUT, 0x9D7815A6, 0x7EE4, 0x497E, 0x88, 0x88, 0x51, 0x5A, 0x05, 0xF0, 0x23, 0x64);
3119 DEFINE_GUID(GUID_HIBERNATE_FASTS4_POLICY, 0x94AC6D29, 0x73CE, 0x41A6, 0x80, 0x9F, 0x63, 0x63, 0xBA, 0x21, 0xB4, 0x7E);
3120 DEFINE_GUID(GUID_CRITICAL_POWER_TRANSITION, 0xB7A27025, 0xE569, 0x46c2, 0xA5, 0x04, 0x2B, 0x96, 0xCA, 0xD2, 0x25, 0xA1);
3121 DEFINE_GUID(GUID_SYSTEM_AWAYMODE, 0x98A7F580, 0x01F7, 0x48AA, 0x9C, 0x0F, 0x44, 0x35, 0x2C, 0x29, 0xE5, 0xC0);
3122 DEFINE_GUID(GUID_ALLOW_AWAYMODE, 0x25dfa149, 0x5dd1, 0x4736, 0xb5, 0xab, 0xe8, 0xa3, 0x7b, 0x5b, 0x81, 0x87);
3123 DEFINE_GUID(GUID_ALLOW_STANDBY_STATES, 0xabfc2519, 0x3608, 0x4c2a, 0x94, 0xea, 0x17, 0x1b, 0x0e, 0xd5, 0x46, 0xab);
3124 DEFINE_GUID(GUID_ALLOW_RTC_WAKE, 0xBD3B718A, 0x0680, 0x4D9D, 0x8A, 0xB2, 0xE1, 0xD2, 0xB4, 0xAC, 0x80, 0x6D);
3125 DEFINE_GUID(GUID_ALLOW_SYSTEM_REQUIRED, 0xA4B195F5, 0x8225, 0x47D8, 0x80, 0x12, 0x9D, 0x41, 0x36, 0x97, 0x86, 0xE2);
3126 DEFINE_GUID(GUID_SYSTEM_BUTTON_SUBGROUP, 0x4F971E89, 0xEEBD, 0x4455, 0xA8, 0xDE, 0x9E, 0x59, 0x04, 0x0E, 0x73, 0x47);
3127 DEFINE_GUID(GUID_POWERBUTTON_ACTION, 0x7648EFA3, 0xDD9C, 0x4E3E, 0xB5, 0x66, 0x50, 0xF9, 0x29, 0x38, 0x62, 0x80);
3128 DEFINE_GUID(GUID_POWERBUTTON_ACTION_FLAGS, 0x857E7FAC, 0x034B, 0x4704, 0xAB, 0xB1, 0xBC, 0xA5, 0x4A, 0xA3, 0x14, 0x78);
3129 DEFINE_GUID(GUID_SLEEPBUTTON_ACTION, 0x96996BC0, 0xAD50, 0x47EC, 0x92, 0x3B, 0x6F, 0x41, 0x87, 0x4D, 0xD9, 0xEB);
3130 DEFINE_GUID(GUID_SLEEPBUTTON_ACTION_FLAGS, 0x2A160AB1, 0xB69D, 0x4743, 0xB7, 0x18, 0xBF, 0x14, 0x41, 0xD5, 0xE4, 0x93);
3131 DEFINE_GUID(GUID_USERINTERFACEBUTTON_ACTION, 0xA7066653, 0x8D6C, 0x40A8, 0x91, 0x0E, 0xA1, 0xF5, 0x4B, 0x84, 0xC7, 0xE5);
3132 DEFINE_GUID(GUID_LIDCLOSE_ACTION, 0x5CA83367, 0x6E45, 0x459F, 0xA2, 0x7B, 0x47, 0x6B, 0x1D, 0x01, 0xC9, 0x36);
3133 DEFINE_GUID(GUID_LIDCLOSE_ACTION_FLAGS, 0x97E969AC, 0x0D6C, 0x4D08, 0x92, 0x7C, 0xD7, 0xBD, 0x7A, 0xD7, 0x85, 0x7B);
3134 DEFINE_GUID(GUID_LIDOPEN_POWERSTATE, 0x99FF10E7, 0x23B1, 0x4C07, 0xA9, 0xD1, 0x5C, 0x32, 0x06, 0xD7, 0x41, 0xB4);
3135 DEFINE_GUID(GUID_BATTERY_SUBGROUP, 0xE73A048D, 0xBF27, 0x4F12, 0x97, 0x31, 0x8B, 0x20, 0x76, 0xE8, 0x89, 0x1F);
3136 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_0, 0x637EA02F, 0xBBCB, 0x4015, 0x8E, 0x2C, 0xA1, 0xC7, 0xB9, 0xC0, 0xB5, 0x46);
3137 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_0, 0x9A66D8D7, 0x4FF7, 0x4EF9, 0xB5, 0xA2, 0x5A, 0x32, 0x6C, 0xA2, 0xA4, 0x69);
3138 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_0, 0x5dbb7c9f, 0x38e9, 0x40d2, 0x97, 0x49, 0x4f, 0x8a, 0x0e, 0x9f, 0x64, 0x0f);
3139 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_1, 0xD8742DCB, 0x3E6A, 0x4B3C, 0xB3, 0xFE, 0x37, 0x46, 0x23, 0xCD, 0xCF, 0x06);
3140 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_1, 0x8183BA9A, 0xE910, 0x48DA, 0x87, 0x69, 0x14, 0xAE, 0x6D, 0xC1, 0x17, 0x0A);
3141 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_1, 0xbcded951, 0x187b, 0x4d05, 0xbc, 0xcc, 0xf7, 0xe5, 0x19, 0x60, 0xc2, 0x58);
3142 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_2, 0x421CBA38, 0x1A8E, 0x4881, 0xAC, 0x89, 0xE3, 0x3A, 0x8B, 0x04, 0xEC, 0xE4);
3143 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_2, 0x07A07CA2, 0xADAF, 0x40D7, 0xB0, 0x77, 0x53, 0x3A, 0xAD, 0xED, 0x1B, 0xFA);
3144 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_2, 0x7fd2f0c4, 0xfeb7, 0x4da3, 0x81, 0x17, 0xe3, 0xfb, 0xed, 0xc4, 0x65, 0x82);
3145 DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_3, 0x80472613, 0x9780, 0x455E, 0xB3, 0x08, 0x72, 0xD3, 0x00, 0x3C, 0xF2, 0xF8);
3146 DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_3, 0x58AFD5A6, 0xC2DD, 0x47D2, 0x9F, 0xBF, 0xEF, 0x70, 0xCC, 0x5C, 0x59, 0x65);
3147 DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_3, 0x73613ccf, 0xdbfa, 0x4279, 0x83, 0x56, 0x49, 0x35, 0xf6, 0xbf, 0x62, 0xf3);
3148 DEFINE_GUID(GUID_PROCESSOR_SETTINGS_SUBGROUP, 0x54533251, 0x82BE, 0x4824, 0x96, 0xC1, 0x47, 0xB6, 0x0B, 0x74, 0x0D, 0x00);
3149 DEFINE_GUID(GUID_PROCESSOR_THROTTLE_POLICY, 0x57027304, 0x4AF6, 0x4104, 0x92, 0x60, 0xE3, 0xD9, 0x52, 0x48, 0xFC, 0x36);
3150 DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MAXIMUM, 0xBC5038F7, 0x23E0, 0x4960, 0x96, 0xDA, 0x33, 0xAB, 0xAF, 0x59, 0x35, 0xEC);
3151 DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MINIMUM, 0x893DEE8E, 0x2BEF, 0x41E0, 0x89, 0xC6, 0xB5, 0x5D, 0x09, 0x29, 0x96, 0x4C);
3152 DEFINE_GUID(GUID_PROCESSOR_ALLOW_THROTTLING, 0x3b04d4fd, 0x1cc7, 0x4f23, 0xab, 0x1c, 0xd1, 0x33, 0x78, 0x19, 0xc4, 0xbb);
3153 DEFINE_GUID(GUID_PROCESSOR_IDLESTATE_POLICY, 0x68f262a7, 0xf621, 0x4069, 0xb9, 0xa5, 0x48, 0x74, 0x16, 0x9b, 0xe2, 0x3c);
3154 DEFINE_GUID(GUID_PROCESSOR_PERFSTATE_POLICY, 0xBBDC3814, 0x18E9, 0x4463, 0x8A, 0x55, 0xD1, 0x97, 0x32, 0x7C, 0x45, 0xC0);
3155 DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_THRESHOLD, 0x06cadf0e, 0x64ed, 0x448a, 0x89, 0x27, 0xce, 0x7b, 0xf9, 0x0e, 0xb3, 0x5d);
3156 DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_THRESHOLD, 0x12a0ab44, 0xfe28, 0x4fa9, 0xb3, 0xbd, 0x4b, 0x64, 0xf4, 0x49, 0x60, 0xa6);
3157 DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_POLICY, 0x465e1f50, 0xb610, 0x473a, 0xab, 0x58, 0x0, 0xd1, 0x7, 0x7d, 0xc4, 0x18);
3158 DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_POLICY, 0x40fbefc7, 0x2e9d, 0x4d25, 0xa1, 0x85, 0xc, 0xfd, 0x85, 0x74, 0xba, 0xc6);
3159 DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_TIME, 0x984cf492, 0x3bed, 0x4488, 0xa8, 0xf9, 0x42, 0x86, 0xc9, 0x7b, 0xf5, 0xaa);
3160 DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_TIME, 0xd8edeb9b, 0x95cf, 0x4f95, 0xa7, 0x3c, 0xb0, 0x61, 0x97, 0x36, 0x93, 0xc8);
3161 DEFINE_GUID(GUID_PROCESSOR_PERF_TIME_CHECK, 0x4d2b0152, 0x7d5c, 0x498b, 0x88, 0xe2, 0x34, 0x34, 0x53, 0x92, 0xa2, 0xc5);
3162 DEFINE_GUID(GUID_PROCESSOR_PERF_BOOST_POLICY, 0x45bcc044, 0xd885, 0x43e2, 0x86, 0x5, 0xee, 0xe, 0xc6, 0xe9, 0x6b, 0x59);
3163 DEFINE_GUID(GUID_PROCESSOR_IDLE_ALLOW_SCALING, 0x6c2993b0, 0x8f48, 0x481f, 0xbc, 0xc6, 0x0, 0xdd, 0x27, 0x42, 0xaa, 0x6);
3164 DEFINE_GUID(GUID_PROCESSOR_IDLE_DISABLE, 0x5d76a2ca, 0xe8c0, 0x402f, 0xa1, 0x33, 0x21, 0x58, 0x49, 0x2d, 0x58, 0xad);
3165 DEFINE_GUID(GUID_PROCESSOR_IDLE_TIME_CHECK, 0xc4581c31, 0x89ab, 0x4597, 0x8e, 0x2b, 0x9c, 0x9c, 0xab, 0x44, 0xe, 0x6b);
3166 DEFINE_GUID(GUID_PROCESSOR_IDLE_DEMOTE_THRESHOLD, 0x4b92d758, 0x5a24, 0x4851, 0xa4, 0x70, 0x81, 0x5d, 0x78, 0xae, 0xe1, 0x19);
3167 DEFINE_GUID(GUID_PROCESSOR_IDLE_PROMOTE_THRESHOLD, 0x7b224883, 0xb3cc, 0x4d79, 0x81, 0x9f, 0x83, 0x74, 0x15, 0x2c, 0xbe, 0x7c);
3168 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_THRESHOLD, 0xdf142941, 0x20f3, 0x4edf, 0x9a, 0x4a, 0x9c, 0x83, 0xd3, 0xd7, 0x17, 0xd1);
3169 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_THRESHOLD, 0x68dd2f27, 0xa4ce, 0x4e11, 0x84, 0x87, 0x37, 0x94, 0xe4, 0x13, 0x5d, 0xfa);
3170 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_POLICY, 0xc7be0679, 0x2817, 0x4d69, 0x9d, 0x02, 0x51, 0x9a, 0x53, 0x7e, 0xd0, 0xc6);
3171 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_POLICY, 0x71021b41, 0xc749, 0x4d21, 0xbe, 0x74, 0xa0, 0x0f, 0x33, 0x5d, 0x58, 0x2b);
3172 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_MAX_CORES, 0xea062031, 0x0e34, 0x4ff1, 0x9b, 0x6d, 0xeb, 0x10, 0x59, 0x33, 0x40, 0x28);
3173 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_MIN_CORES, 0x0cc5b647, 0xc1df, 0x4637, 0x89, 0x1a, 0xde, 0xc3, 0x5c, 0x31, 0x85, 0x83);
3174 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_TIME, 0x2ddd5a84, 0x5a71, 0x437e, 0x91, 0x2a, 0xdb, 0x0b, 0x8c, 0x78, 0x87, 0x32);
3175 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_TIME, 0xdfd10d17, 0xd5eb, 0x45dd, 0x87, 0x7a, 0x9a, 0x34, 0xdd, 0xd1, 0x5c, 0x82);
3176 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_HISTORY_DECREASE_FACTOR, 0x8f7b45e3, 0xc393, 0x480a, 0x87, 0x8c, 0xf6, 0x7a, 0xc3, 0xd0, 0x70, 0x82);
3177 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_HISTORY_THRESHOLD, 0x5b33697b, 0xe89d, 0x4d38, 0xaa, 0x46, 0x9e, 0x7d, 0xfb, 0x7c, 0xd2, 0xf9);
3178 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_AFFINITY_WEIGHTING, 0xe70867f1, 0xfa2f, 0x4f4e, 0xae, 0xa1, 0x4d, 0x8a, 0x0b, 0xa2, 0x3b, 0x20);
3179 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_HISTORY_DECREASE_FACTOR, 0x1299023c, 0xbc28, 0x4f0a, 0x81, 0xec, 0xd3, 0x29, 0x5a, 0x8d, 0x81, 0x5d);
3180 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_HISTORY_THRESHOLD, 0x9ac18e92, 0xaa3c, 0x4e27, 0xb3, 0x07, 0x01, 0xae, 0x37, 0x30, 0x71, 0x29);
3181 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_WEIGHTING, 0x8809c2d8, 0xb155, 0x42d4, 0xbc, 0xda, 0x0d, 0x34, 0x56, 0x51, 0xb1, 0xdb);
3182 DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_OVER_UTILIZATION_THRESHOLD, 0x943c8cb6, 0x6f93, 0x4227, 0xad, 0x87, 0xe9, 0xa3, 0xfe, 0xec, 0x08, 0xd1);
3183 DEFINE_GUID(GUID_PROCESSOR_PARKING_CORE_OVERRIDE, 0xa55612aa, 0xf624, 0x42c6, 0xa4, 0x43, 0x73, 0x97, 0xd0, 0x64, 0xc0, 0x4f);
3184 DEFINE_GUID(GUID_PROCESSOR_PARKING_PERF_STATE, 0x447235c7, 0x6a8d, 0x4cc0, 0x8e, 0x24, 0x9e, 0xaf, 0x70, 0xb9, 0x6e, 0x2b);
3185 DEFINE_GUID(GUID_PROCESSOR_PERF_HISTORY, 0x7d24baa7, 0x0b84, 0x480f, 0x84, 0x0c, 0x1b, 0x07, 0x43, 0xc0, 0x0f, 0x5f);
3186 DEFINE_GUID(GUID_SYSTEM_COOLING_POLICY, 0x94D3A615, 0xA899, 0x4AC5, 0xAE, 0x2B, 0xE4, 0xD8, 0xF6, 0x34, 0x36, 0x7F);
3187 DEFINE_GUID(GUID_LOCK_CONSOLE_ON_WAKE, 0x0E796BDB, 0x100D, 0x47D6, 0xA2, 0xD5, 0xF7, 0xD2, 0xDA, 0xA5, 0x1F, 0x51);
3188 DEFINE_GUID(GUID_DEVICE_IDLE_POLICY, 0x4faab71a, 0x92e5, 0x4726, 0xb5, 0x31, 0x22, 0x45, 0x59, 0x67, 0x2d, 0x19);
3189 DEFINE_GUID(GUID_ACDC_POWER_SOURCE, 0x5D3E9A59, 0xE9D5, 0x4B00, 0xA6, 0xBD, 0xFF, 0x34, 0xFF, 0x51, 0x65, 0x48);
3190 DEFINE_GUID(GUID_LIDSWITCH_STATE_CHANGE, 0xBA3E0F4D, 0xB817, 0x4094, 0xA2, 0xD1, 0xD5, 0x63, 0x79, 0xE6, 0xA0, 0xF3);
3191 DEFINE_GUID(GUID_BATTERY_PERCENTAGE_REMAINING, 0xA7AD8041, 0xB45A, 0x4CAE, 0x87, 0xA3, 0xEE, 0xCB, 0xB4, 0x68, 0xA9, 0xE1);
3192 DEFINE_GUID(GUID_IDLE_BACKGROUND_TASK, 0x515C31D8, 0xF734, 0x163D, 0xA0, 0xFD, 0x11, 0xA0, 0x8C, 0x91, 0xE8, 0xF1);
3193 DEFINE_GUID(GUID_BACKGROUND_TASK_NOTIFICATION, 0xCF23F240, 0x2A54, 0x48D8, 0xB1, 0x14, 0xDE, 0x15, 0x18, 0xFF, 0x05, 0x2E);
3194 DEFINE_GUID(GUID_APPLAUNCH_BUTTON, 0x1A689231, 0x7399, 0x4E9A, 0x8F, 0x99, 0xB7, 0x1F, 0x99, 0x9D, 0xB3, 0xFA);
3195 DEFINE_GUID(GUID_PCIEXPRESS_SETTINGS_SUBGROUP, 0x501a4d13, 0x42af,0x4429, 0x9f, 0xd1, 0xa8, 0x21, 0x8c, 0x26, 0x8e, 0x20);
3196 DEFINE_GUID(GUID_PCIEXPRESS_ASPM_POLICY, 0xee12f906, 0xd277, 0x404b, 0xb6, 0xda, 0xe5, 0xfa, 0x1a, 0x57, 0x6d, 0xf5);
3197 DEFINE_GUID(GUID_ENABLE_SWITCH_FORCED_SHUTDOWN, 0x833a6b62, 0xdfa4, 0x46d1, 0x82, 0xf8, 0xe0, 0x9e, 0x34, 0xd0, 0x29, 0xd6);
3198
3199 #define PERFSTATE_POLICY_CHANGE_IDEAL 0
3200 #define PERFSTATE_POLICY_CHANGE_SINGLE 1
3201 #define PERFSTATE_POLICY_CHANGE_ROCKET 2
3202 #define PERFSTATE_POLICY_CHANGE_MAX PERFSTATE_POLICY_CHANGE_ROCKET
3203
3204 #define PROCESSOR_PERF_BOOST_POLICY_DISABLED 0
3205 #define PROCESSOR_PERF_BOOST_POLICY_MAX 100
3206
3207 #define POWER_DEVICE_IDLE_POLICY_PERFORMANCE 0
3208 #define POWER_DEVICE_IDLE_POLICY_CONSERVATIVE 1
3209
3210 _Function_class_(REQUEST_POWER_COMPLETE)
3211 _IRQL_requires_same_
3212 typedef VOID
3213 (NTAPI REQUEST_POWER_COMPLETE)(
3214 _In_ struct _DEVICE_OBJECT *DeviceObject,
3215 _In_ UCHAR MinorFunction,
3216 _In_ POWER_STATE PowerState,
3217 _In_opt_ PVOID Context,
3218 _In_ struct _IO_STATUS_BLOCK *IoStatus);
3219 typedef REQUEST_POWER_COMPLETE *PREQUEST_POWER_COMPLETE;
3220
3221 _Function_class_(POWER_SETTING_CALLBACK)
3222 _IRQL_requires_same_
3223 typedef NTSTATUS
3224 (NTAPI POWER_SETTING_CALLBACK)(
3225 _In_ LPCGUID SettingGuid,
3226 _In_reads_bytes_(ValueLength) PVOID Value,
3227 _In_ ULONG ValueLength,
3228 _Inout_opt_ PVOID Context);
3229 typedef POWER_SETTING_CALLBACK *PPOWER_SETTING_CALLBACK;
3230
3231 /******************************************************************************
3232 * Configuration Manager Types *
3233 ******************************************************************************/
3234
3235 /* Resource list definitions */
3236 typedef int CM_RESOURCE_TYPE;
3237
3238 #define CmResourceTypeNull 0
3239 #define CmResourceTypePort 1
3240 #define CmResourceTypeInterrupt 2
3241 #define CmResourceTypeMemory 3
3242 #define CmResourceTypeDma 4
3243 #define CmResourceTypeDeviceSpecific 5
3244 #define CmResourceTypeBusNumber 6
3245 #define CmResourceTypeNonArbitrated 128
3246 #define CmResourceTypeConfigData 128
3247 #define CmResourceTypeDevicePrivate 129
3248 #define CmResourceTypePcCardConfig 130
3249 #define CmResourceTypeMfCardConfig 131
3250
3251 /* KEY_VALUE_Xxx.Type */
3252 #define REG_NONE 0
3253 #define REG_SZ 1
3254 #define REG_EXPAND_SZ 2
3255 #define REG_BINARY 3
3256 #define REG_DWORD 4
3257 #define REG_DWORD_LITTLE_ENDIAN 4
3258 #define REG_DWORD_BIG_ENDIAN 5
3259 #define REG_LINK 6
3260 #define REG_MULTI_SZ 7
3261 #define REG_RESOURCE_LIST 8
3262 #define REG_FULL_RESOURCE_DESCRIPTOR 9
3263 #define REG_RESOURCE_REQUIREMENTS_LIST 10
3264 #define REG_QWORD 11
3265 #define REG_QWORD_LITTLE_ENDIAN 11
3266
3267 /* Registry Access Rights */
3268 #define KEY_QUERY_VALUE (0x0001)
3269 #define KEY_SET_VALUE (0x0002)
3270 #define KEY_CREATE_SUB_KEY (0x0004)
3271 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
3272 #define KEY_NOTIFY (0x0010)
3273 #define KEY_CREATE_LINK (0x0020)
3274 #define KEY_WOW64_32KEY (0x0200)
3275 #define KEY_WOW64_64KEY (0x0100)
3276 #define KEY_WOW64_RES (0x0300)
3277
3278 #define KEY_READ ((STANDARD_RIGHTS_READ |\
3279 KEY_QUERY_VALUE |\
3280 KEY_ENUMERATE_SUB_KEYS |\
3281 KEY_NOTIFY) \
3282 & \
3283 (~SYNCHRONIZE))
3284
3285 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
3286 KEY_SET_VALUE |\
3287 KEY_CREATE_SUB_KEY) \
3288 & \
3289 (~SYNCHRONIZE))
3290
3291 #define KEY_EXECUTE ((KEY_READ) \
3292 & \
3293 (~SYNCHRONIZE))
3294
3295 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
3296 KEY_QUERY_VALUE |\
3297 KEY_SET_VALUE |\
3298 KEY_CREATE_SUB_KEY |\
3299 KEY_ENUMERATE_SUB_KEYS |\
3300 KEY_NOTIFY |\
3301 KEY_CREATE_LINK) \
3302 & \
3303 (~SYNCHRONIZE))
3304
3305 /* Registry Open/Create Options */
3306 #define REG_OPTION_RESERVED (0x00000000L)
3307 #define REG_OPTION_NON_VOLATILE (0x00000000L)
3308 #define REG_OPTION_VOLATILE (0x00000001L)
3309 #define REG_OPTION_CREATE_LINK (0x00000002L)
3310 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
3311 #define REG_OPTION_OPEN_LINK (0x00000008L)
3312
3313 #define REG_LEGAL_OPTION \
3314 (REG_OPTION_RESERVED |\
3315 REG_OPTION_NON_VOLATILE |\
3316 REG_OPTION_VOLATILE |\
3317 REG_OPTION_CREATE_LINK |\
3318 REG_OPTION_BACKUP_RESTORE |\
3319 REG_OPTION_OPEN_LINK)
3320
3321 #define REG_OPEN_LEGAL_OPTION \
3322 (REG_OPTION_RESERVED |\
3323 REG_OPTION_BACKUP_RESTORE |\
3324 REG_OPTION_OPEN_LINK)
3325
3326 #define REG_STANDARD_FORMAT 1
3327 #define REG_LATEST_FORMAT 2
3328 #define REG_NO_COMPRESSION 4
3329
3330 /* Key creation/open disposition */
3331 #define REG_CREATED_NEW_KEY (0x00000001L)
3332 #define REG_OPENED_EXISTING_KEY (0x00000002L)
3333
3334 /* Key restore & hive load flags */
3335 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
3336 #define REG_REFRESH_HIVE (0x00000002L)
3337 #define REG_NO_LAZY_FLUSH (0x00000004L)
3338 #define REG_FORCE_RESTORE (0x00000008L)
3339 #define REG_APP_HIVE (0x00000010L)
3340 #define REG_PROCESS_PRIVATE (0x00000020L)
3341 #define REG_START_JOURNAL (0x00000040L)
3342 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
3343 #define REG_HIVE_NO_RM (0x00000100L)
3344 #define REG_HIVE_SINGLE_LOG (0x00000200L)
3345 #define REG_BOOT_HIVE (0x00000400L)
3346
3347 /* Unload Flags */
3348 #define REG_FORCE_UNLOAD 1
3349
3350 /* Notify Filter Values */
3351 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
3352 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
3353 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
3354 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
3355
3356 #define REG_LEGAL_CHANGE_FILTER \
3357 (REG_NOTIFY_CHANGE_NAME |\
3358 REG_NOTIFY_CHANGE_ATTRIBUTES |\
3359 REG_NOTIFY_CHANGE_LAST_SET |\
3360 REG_NOTIFY_CHANGE_SECURITY)
3361
3362 #include <pshpack4.h>
3363 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
3364 UCHAR Type;
3365 UCHAR ShareDisposition;
3366 USHORT Flags;
3367 union {
3368 struct {
3369 PHYSICAL_ADDRESS Start;
3370 ULONG Length;
3371 } Generic;
3372 struct {
3373 PHYSICAL_ADDRESS Start;
3374 ULONG Length;
3375 } Port;
3376 struct {
3377 #if defined(NT_PROCESSOR_GROUPS)
3378 USHORT Level;
3379 USHORT Group;
3380 #else
3381 ULONG Level;
3382 #endif
3383 ULONG Vector;
3384 KAFFINITY Affinity;
3385 } Interrupt;
3386 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
3387 struct {
3388 _ANONYMOUS_UNION union {
3389 struct {
3390 #if defined(NT_PROCESSOR_GROUPS)
3391 USHORT Group;
3392 #else
3393 USHORT Reserved;
3394 #endif
3395 USHORT MessageCount;
3396 ULONG Vector;
3397 KAFFINITY Affinity;
3398 } Raw;
3399 struct {
3400 #if defined(NT_PROCESSOR_GROUPS)
3401 USHORT Level;
3402 USHORT Group;
3403 #else
3404 ULONG Level;
3405 #endif
3406 ULONG Vector;
3407 KAFFINITY Affinity;
3408 } Translated;
3409 } DUMMYUNIONNAME;
3410 } MessageInterrupt;
3411 #endif
3412 struct {
3413 PHYSICAL_ADDRESS Start;
3414 ULONG Length;
3415 } Memory;
3416 struct {
3417 ULONG Channel;
3418 ULONG Port;
3419 ULONG Reserved1;
3420 } Dma;
3421 struct {
3422 ULONG Data[3];
3423 } DevicePrivate;
3424 struct {
3425 ULONG Start;
3426 ULONG Length;
3427 ULONG Reserved;
3428 } BusNumber;
3429 struct {
3430 ULONG DataSize;
3431 ULONG Reserved1;
3432 ULONG Reserved2;
3433 } DeviceSpecificData;
3434 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
3435 struct {
3436 PHYSICAL_ADDRESS Start;
3437 ULONG Length40;
3438 } Memory40;
3439 struct {
3440 PHYSICAL_ADDRESS Start;
3441 ULONG Length48;
3442 } Memory48;
3443 struct {
3444 PHYSICAL_ADDRESS Start;
3445 ULONG Length64;
3446 } Memory64;
3447 #endif
3448 } u;
3449 } CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
3450 #include <poppack.h>
3451
3452 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
3453 #define CmResourceTypeNull 0
3454 #define CmResourceTypePort 1
3455 #define CmResourceTypeInterrupt 2
3456 #define CmResourceTypeMemory 3
3457 #define CmResourceTypeDma 4
3458 #define CmResourceTypeDeviceSpecific 5
3459 #define CmResourceTypeBusNumber 6
3460 #define CmResourceTypeMemoryLarge 7
3461 #define CmResourceTypeNonArbitrated 128
3462 #define CmResourceTypeConfigData 128
3463 #define CmResourceTypeDevicePrivate 129
3464 #define CmResourceTypePcCardConfig 130
3465 #define CmResourceTypeMfCardConfig 131
3466
3467 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
3468 typedef enum _CM_SHARE_DISPOSITION {
3469 CmResourceShareUndetermined = 0,
3470 CmResourceShareDeviceExclusive,
3471 CmResourceShareDriverExclusive,
3472 CmResourceShareShared
3473 } CM_SHARE_DISPOSITION;
3474
3475 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
3476 #define CM_RESOURCE_PORT_MEMORY 0x0000
3477 #define CM_RESOURCE_PORT_IO 0x0001
3478 #define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004
3479 #define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008
3480 #define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010
3481 #define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020
3482 #define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040
3483 #define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080
3484 #define CM_RESOURCE_PORT_BAR 0x0100
3485
3486 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
3487 #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
3488 #define CM_RESOURCE_INTERRUPT_LATCHED 0x0001
3489 #define CM_RESOURCE_INTERRUPT_MESSAGE 0x0002
3490 #define CM_RESOURCE_INTERRUPT_POLICY_INCLUDED 0x0004
3491
3492 #define CM_RESOURCE_INTERRUPT_LEVEL_LATCHED_BITS 0x0001
3493
3494 #define CM_RESOURCE_INTERRUPT_MESSAGE_TOKEN ((ULONG)-2)
3495
3496 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
3497 #define CM_RESOURCE_MEMORY_READ_WRITE 0x0000
3498 #define CM_RESOURCE_MEMORY_READ_ONLY 0x0001
3499 #define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002
3500 #define CM_RESOURCE_MEMORY_WRITEABILITY_MASK 0x0003
3501 #define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004
3502 #define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008
3503 #define CM_RESOURCE_MEMORY_24 0x0010
3504 #define CM_RESOURCE_MEMORY_CACHEABLE 0x0020
3505 #define CM_RESOURCE_MEMORY_WINDOW_DECODE 0x0040
3506 #define CM_RESOURCE_MEMORY_BAR 0x0080
3507 #define CM_RESOURCE_MEMORY_COMPAT_FOR_INACCESSIBLE_RANGE 0x0100
3508
3509 #define CM_RESOURCE_MEMORY_LARGE 0x0E00
3510 #define CM_RESOURCE_MEMORY_LARGE_40 0x0200
3511 #define CM_RESOURCE_MEMORY_LARGE_48 0x0400
3512 #define CM_RESOURCE_MEMORY_LARGE_64 0x0800
3513
3514 #define CM_RESOURCE_MEMORY_LARGE_40_MAXLEN 0x000000FFFFFFFF00
3515 #define CM_RESOURCE_MEMORY_LARGE_48_MAXLEN 0x0000FFFFFFFF0000
3516 #define CM_RESOURCE_MEMORY_LARGE_64_MAXLEN 0xFFFFFFFF00000000
3517
3518 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
3519 #define CM_RESOURCE_DMA_8 0x0000
3520 #define CM_RESOURCE_DMA_16 0x0001
3521 #define CM_RESOURCE_DMA_32 0x0002
3522 #define CM_RESOURCE_DMA_8_AND_16 0x0004
3523 #define CM_RESOURCE_DMA_BUS_MASTER 0x0008
3524 #define CM_RESOURCE_DMA_TYPE_A 0x0010
3525 #define CM_RESOURCE_DMA_TYPE_B 0x0020
3526 #define CM_RESOURCE_DMA_TYPE_F 0x0040
3527
3528 typedef struct _DEVICE_FLAGS {
3529 ULONG Failed:1;
3530 ULONG ReadOnly:1;
3531 ULONG Removable:1;
3532 ULONG ConsoleIn:1;
3533 ULONG ConsoleOut:1;
3534 ULONG Input:1;
3535 ULONG Output:1;
3536 } DEVICE_FLAGS, *PDEVICE_FLAGS;
3537
3538 typedef enum _INTERFACE_TYPE {
3539 InterfaceTypeUndefined = -1,
3540 Internal,
3541 Isa,
3542 Eisa,
3543 MicroChannel,
3544 TurboChannel,
3545 PCIBus,
3546 VMEBus,
3547 NuBus,
3548 PCMCIABus,
3549 CBus,
3550 MPIBus,
3551 MPSABus,
3552 ProcessorInternal,
3553 InternalPowerBus,
3554 PNPISABus,
3555 PNPBus,
3556 Vmcs,
3557 MaximumInterfaceType
3558 } INTERFACE_TYPE, *PINTERFACE_TYPE;
3559
3560 typedef struct _CM_COMPONENT_INFORMATION {
3561 DEVICE_FLAGS Flags;
3562 ULONG Version;
3563 ULONG Key;
3564 KAFFINITY AffinityMask;
3565 } CM_COMPONENT_INFORMATION, *PCM_COMPONENT_INFORMATION;
3566
3567 typedef struct _CM_ROM_BLOCK {
3568 ULONG Address;
3569 ULONG Size;
3570 } CM_ROM_BLOCK, *PCM_ROM_BLOCK;
3571
3572 typedef struct _CM_PARTIAL_RESOURCE_LIST {
3573 USHORT Version;
3574 USHORT Revision;
3575 ULONG Count;
3576 CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
3577 } CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
3578
3579 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
3580 INTERFACE_TYPE InterfaceType;
3581 ULONG BusNumber;
3582 CM_PARTIAL_RESOURCE_LIST PartialResourceList;
3583 } CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
3584
3585 typedef struct _CM_RESOURCE_LIST {
3586 ULONG Count;
3587 CM_FULL_RESOURCE_DESCRIPTOR List[1];
3588 } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
3589
3590 typedef struct _PNP_BUS_INFORMATION {
3591 GUID BusTypeGuid;
3592 INTERFACE_TYPE LegacyBusType;
3593 ULONG BusNumber;
3594 } PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;
3595
3596 #include <pshpack1.h>
3597
3598 typedef struct _CM_INT13_DRIVE_PARAMETER {
3599 USHORT DriveSelect;
3600 ULONG MaxCylinders;
3601 USHORT SectorsPerTrack;
3602 USHORT MaxHeads;
3603 USHORT NumberDrives;
3604 } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
3605
3606 typedef struct _CM_MCA_POS_DATA {
3607 USHORT AdapterId;
3608 UCHAR PosData1;
3609 UCHAR PosData2;
3610 UCHAR PosData3;
3611 UCHAR PosData4;
3612 } CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
3613
3614 typedef struct _CM_PNP_BIOS_DEVICE_NODE {
3615 USHORT Size;
3616 UCHAR Node;
3617 ULONG ProductId;
3618 UCHAR DeviceType[3];
3619 USHORT DeviceAttributes;
3620 } CM_PNP_BIOS_DEVICE_NODE,*PCM_PNP_BIOS_DEVICE_NODE;
3621
3622 typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK {
3623 UCHAR Signature[4];
3624 UCHAR Revision;
3625 UCHAR Length;
3626 USHORT ControlField;
3627 UCHAR Checksum;
3628 ULONG EventFlagAddress;
3629 USHORT RealModeEntryOffset;
3630 USHORT RealModeEntrySegment;
3631 USHORT ProtectedModeEntryOffset;
3632 ULONG ProtectedModeCodeBaseAddress;
3633 ULONG OemDeviceId;
3634 USHORT RealModeDataBaseAddress;
3635 ULONG ProtectedModeDataBaseAddress;
3636 } CM_PNP_BIOS_INSTALLATION_CHECK, *PCM_PNP_BIOS_INSTALLATION_CHECK;
3637
3638 #include <poppack.h>
3639
3640 typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA {
3641 ULONG BytesPerSector;
3642 ULONG NumberOfCylinders;
3643 ULONG SectorsPerTrack;
3644 ULONG NumberOfHeads;
3645 } CM_DISK_GEOMETRY_DEVICE_DATA, *PCM_DISK_GEOMETRY_DEVICE_DATA;
3646
3647 typedef struct _CM_KEYBOARD_DEVICE_DATA {
3648 USHORT Version;
3649 USHORT Revision;
3650 UCHAR Type;
3651 UCHAR Subtype;
3652 USHORT KeyboardFlags;
3653 } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
3654
3655 typedef struct _CM_SCSI_DEVICE_DATA {
3656 USHORT Version;
3657 USHORT Revision;
3658 UCHAR HostIdentifier;
3659 } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
3660
3661 typedef struct _CM_VIDEO_DEVICE_DATA {
3662 USHORT Version;
3663 USHORT Revision;
3664 ULONG VideoClock;
3665 } CM_VIDEO_DEVICE_DATA, *PCM_VIDEO_DEVICE_DATA;
3666
3667 typedef struct _CM_SONIC_DEVICE_DATA {
3668 USHORT Version;
3669 USHORT Revision;
3670 USHORT DataConfigurationRegister;
3671 UCHAR EthernetAddress[8];
3672 } CM_SONIC_DEVICE_DATA, *PCM_SONIC_DEVICE_DATA;
3673
3674 typedef struct _CM_SERIAL_DEVICE_DATA {
3675 USHORT Version;
3676 USHORT Revision;
3677 ULONG BaudClock;
3678 } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
3679
3680 typedef struct _CM_MONITOR_DEVICE_DATA {
3681 USHORT Version;
3682 USHORT Revision;
3683 USHORT HorizontalScreenSize;
3684 USHORT VerticalScreenSize;
3685 USHORT HorizontalResolution;
3686 USHORT VerticalResolution;
3687 USHORT HorizontalDisplayTimeLow;
3688 USHORT HorizontalDisplayTime;
3689 USHORT HorizontalDisplayTimeHigh;
3690 USHORT HorizontalBackPorchLow;
3691 USHORT HorizontalBackPorch;
3692 USHORT HorizontalBackPorchHigh;
3693 USHORT HorizontalFrontPorchLow;
3694 USHORT HorizontalFrontPorch;
3695 USHORT HorizontalFrontPorchHigh;
3696 USHORT HorizontalSyncLow;
3697 USHORT HorizontalSync;
3698 USHORT HorizontalSyncHigh;
3699 USHORT VerticalBackPorchLow;
3700 USHORT VerticalBackPorch;
3701 USHORT VerticalBackPorchHigh;
3702 USHORT VerticalFrontPorchLow;
3703 USHORT VerticalFrontPorch;
3704 USHORT VerticalFrontPorchHigh;
3705 USHORT VerticalSyncLow;
3706 USHORT VerticalSync;
3707 USHORT VerticalSyncHigh;
3708 } CM_MONITOR_DEVICE_DATA, *PCM_MONITOR_DEVICE_DATA;
3709
3710 typedef struct _CM_FLOPPY_DEVICE_DATA {
3711 USHORT Version;
3712 USHORT Revision;
3713 CHAR Size[8];
3714 ULONG MaxDensity;
3715 ULONG MountDensity;
3716 UCHAR StepRateHeadUnloadTime;
3717 UCHAR HeadLoadTime;
3718 UCHAR MotorOffTime;
3719 UCHAR SectorLengthCode;
3720 UCHAR SectorPerTrack;
3721 UCHAR ReadWriteGapLength;
3722 UCHAR DataTransferLength;
3723 UCHAR FormatGapLength;
3724 UCHAR FormatFillCharacter;
3725 UCHAR HeadSettleTime;
3726 UCHAR MotorSettleTime;
3727 UCHAR MaximumTrackValue;
3728 UCHAR DataTransferRate;
3729 } CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA;
3730
3731 typedef enum _KEY_INFORMATION_CLASS {
3732 KeyBasicInformation,
3733 KeyNodeInformation,
3734 KeyFullInformation,
3735 KeyNameInformation,
3736 KeyCachedInformation,
3737 KeyFlagsInformation,
3738 KeyVirtualizationInformation,
3739 KeyHandleTagsInformation,
3740 MaxKeyInfoClass
3741 } KEY_INFORMATION_CLASS;
3742
3743 typedef struct _KEY_BASIC_INFORMATION {
3744 LARGE_INTEGER LastWriteTime;
3745 ULONG TitleIndex;
3746 ULONG NameLength;
3747 WCHAR Name[1];
3748 } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
3749
3750 typedef struct _KEY_CONTROL_FLAGS_INFORMATION {
3751 ULONG ControlFlags;
3752 } KEY_CONTROL_FLAGS_INFORMATION, *PKEY_CONTROL_FLAGS_INFORMATION;
3753
3754 typedef struct _KEY_FULL_INFORMATION {
3755 LARGE_INTEGER LastWriteTime;
3756 ULONG TitleIndex;
3757 ULONG ClassOffset;
3758 ULONG ClassLength;
3759 ULONG SubKeys;
3760 ULONG MaxNameLen;
3761 ULONG MaxClassLen;
3762 ULONG Values;
3763 ULONG MaxValueNameLen;
3764 ULONG MaxValueDataLen;
3765 WCHAR Class[1];
3766 } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
3767
3768 typedef struct _KEY_HANDLE_TAGS_INFORMATION {
3769 ULONG HandleTags;
3770 } KEY_HANDLE_TAGS_INFORMATION, *PKEY_HANDLE_TAGS_INFORMATION;
3771
3772 typedef struct _KEY_NODE_INFORMATION {
3773 LARGE_INTEGER LastWriteTime;
3774 ULONG TitleIndex;
3775 ULONG ClassOffset;
3776 ULONG ClassLength;
3777 ULONG NameLength;
3778 WCHAR Name[1];
3779 } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
3780
3781 typedef enum _KEY_SET_INFORMATION_CLASS {
3782 KeyWriteTimeInformation,
3783 KeyWow64FlagsInformation,
3784 KeyControlFlagsInformation,
3785 KeySetVirtualizationInformation,
3786 KeySetDebugInformation,
3787 KeySetHandleTagsInformation,
3788 MaxKeySetInfoClass
3789 } KEY_SET_INFORMATION_CLASS;
3790
3791 typedef struct _KEY_SET_VIRTUALIZATION_INFORMATION {
3792 ULONG VirtualTarget:1;
3793 ULONG VirtualStore:1;
3794 ULONG VirtualSource:1;
3795 ULONG Reserved:29;
3796 } KEY_SET_VIRTUALIZATION_INFORMATION, *PKEY_SET_VIRTUALIZATION_INFORMATION;
3797
3798 typedef struct _KEY_VALUE_BASIC_INFORMATION {
3799 ULONG TitleIndex;
3800 ULONG Type;
3801 ULONG NameLength;
3802 WCHAR Name[1];
3803 } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
3804
3805 typedef struct _KEY_VALUE_FULL_INFORMATION {
3806 ULONG TitleIndex;
3807 ULONG Type;
3808 ULONG DataOffset;
3809 ULONG DataLength;
3810 ULONG NameLength;
3811 WCHAR Name[1];
3812 } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
3813
3814 typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
3815 ULONG TitleIndex;
3816 ULONG Type;
3817 ULONG DataLength;
3818 _Field_size_bytes_(DataLength) UCHAR Data[1];
3819 } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
3820
3821 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
3822 ULONG Type;
3823 ULONG DataLength;
3824 _Field_size_bytes_(DataLength) UCHAR Data[1];
3825 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
3826
3827 typedef struct _KEY_VALUE_ENTRY {
3828 PUNICODE_STRING ValueName;
3829 ULONG DataLength;
3830 ULONG DataOffset;
3831 ULONG Type;
3832 } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
3833
3834 typedef enum _KEY_VALUE_INFORMATION_CLASS {
3835 KeyValueBasicInformation,
3836 KeyValueFullInformation,
3837 KeyValuePartialInformation,
3838 KeyValueFullInformationAlign64,
3839 KeyValuePartialInformationAlign64
3840 } KEY_VALUE_INFORMATION_CLASS;
3841
3842 typedef struct _KEY_WOW64_FLAGS_INFORMATION {
3843 ULONG UserFlags;
3844 } KEY_WOW64_FLAGS_INFORMATION, *PKEY_WOW64_FLAGS_INFORMATION;
3845
3846 typedef struct _KEY_WRITE_TIME_INFORMATION {
3847 LARGE_INTEGER LastWriteTime;
3848 } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;
3849
3850 #if (NTDDI_VERSION < NTDDI_VISTA)
3851 typedef struct _KEY_USER_FLAGS_INFORMATION {
3852 ULONG UserFlags;
3853 } KEY_USER_FLAGS_INFORMATION, *PKEY_USER_FLAGS_INFORMATION;
3854 #endif
3855
3856 typedef enum _REG_NOTIFY_CLASS {
3857 RegNtDeleteKey,
3858 RegNtPreDeleteKey = RegNtDeleteKey,
3859 RegNtSetValueKey,
3860 RegNtPreSetValueKey = RegNtSetValueKey,
3861 RegNtDeleteValueKey,
3862 RegNtPreDeleteValueKey = RegNtDeleteValueKey,
3863 RegNtSetInformationKey,
3864 RegNtPreSetInformationKey = RegNtSetInformationKey,
3865 RegNtRenameKey,
3866 RegNtPreRenameKey = RegNtRenameKey,
3867 RegNtEnumerateKey,
3868 RegNtPreEnumerateKey = RegNtEnumerateKey,
3869 RegNtEnumerateValueKey,
3870 RegNtPreEnumerateValueKey = RegNtEnumerateValueKey,
3871 RegNtQueryKey,
3872 RegNtPreQueryKey = RegNtQueryKey,
3873 RegNtQueryValueKey,
3874 RegNtPreQueryValueKey = RegNtQueryValueKey,
3875 RegNtQueryMultipleValueKey,
3876 RegNtPreQueryMultipleValueKey = RegNtQueryMultipleValueKey,
3877 RegNtPreCreateKey,
3878 RegNtPostCreateKey,
3879 RegNtPreOpenKey,
3880 RegNtPostOpenKey,
3881 RegNtKeyHandleClose,
3882 RegNtPreKeyHandleClose = RegNtKeyHandleClose,
3883 RegNtPostDeleteKey,
3884 RegNtPostSetValueKey,
3885 RegNtPostDeleteValueKey,
3886 RegNtPostSetInformationKey,
3887 RegNtPostRenameKey,
3888 RegNtPostEnumerateKey,
3889 RegNtPostEnumerateValueKey,
3890 RegNtPostQueryKey,
3891 RegNtPostQueryValueKey,
3892 RegNtPostQueryMultipleValueKey,
3893 RegNtPostKeyHandleClose,
3894 RegNtPreCreateKeyEx,
3895 RegNtPostCreateKeyEx,
3896 RegNtPreOpenKeyEx,
3897 RegNtPostOpenKeyEx,
3898 RegNtPreFlushKey,
3899 RegNtPostFlushKey,
3900 RegNtPreLoadKey,
3901 RegNtPostLoadKey,
3902 RegNtPreUnLoadKey,
3903 RegNtPostUnLoadKey,
3904 RegNtPreQueryKeySecurity,
3905 RegNtPostQueryKeySecurity,
3906 RegNtPreSetKeySecurity,
3907 RegNtPostSetKeySecurity,
3908 RegNtCallbackObjectContextCleanup,
3909 RegNtPreRestoreKey,
3910 RegNtPostRestoreKey,
3911 RegNtPreSaveKey,
3912 RegNtPostSaveKey,
3913 RegNtPreReplaceKey,
3914 RegNtPostReplaceKey,
3915 MaxRegNtNotifyClass
3916 } REG_NOTIFY_CLASS, *PREG_NOTIFY_CLASS;
3917
3918 _IRQL_requires_same_
3919 _Function_class_(EX_CALLBACK_FUNCTION)
3920 typedef NTSTATUS
3921 (NTAPI EX_CALLBACK_FUNCTION)(
3922 _In_ PVOID CallbackContext,
3923 _In_opt_ PVOID Argument1,
3924 _In_opt_ PVOID Argument2);
3925 typedef EX_CALLBACK_FUNCTION *PEX_CALLBACK_FUNCTION;
3926
3927 typedef struct _REG_DELETE_KEY_INFORMATION {
3928 PVOID Object;
3929 PVOID CallContext;
3930 PVOID ObjectContext;
3931 PVOID Reserved;
3932 } REG_DELETE_KEY_INFORMATION, *PREG_DELETE_KEY_INFORMATION
3933 #if (NTDDI_VERSION >= NTDDI_VISTA)
3934 , REG_FLUSH_KEY_INFORMATION, *PREG_FLUSH_KEY_INFORMATION
3935 #endif
3936 ;
3937
3938 typedef struct _REG_SET_VALUE_KEY_INFORMATION {
3939 PVOID Object;
3940 PUNICODE_STRING ValueName;
3941 ULONG TitleIndex;
3942 ULONG Type;
3943 PVOID Data;
3944 ULONG DataSize;
3945 PVOID CallContext;
3946 PVOID ObjectContext;
3947 PVOID Reserved;
3948 } REG_SET_VALUE_KEY_INFORMATION, *PREG_SET_VALUE_KEY_INFORMATION;
3949
3950 typedef struct _REG_DELETE_VALUE_KEY_INFORMATION {
3951 PVOID Object;
3952 PUNICODE_STRING ValueName;
3953 PVOID CallContext;
3954 PVOID ObjectContext;
3955 PVOID Reserved;
3956 } REG_DELETE_VALUE_KEY_INFORMATION, *PREG_DELETE_VALUE_KEY_INFORMATION;
3957
3958 typedef struct _REG_SET_INFORMATION_KEY_INFORMATION {
3959 PVOID Object;
3960 KEY_SET_INFORMATION_CLASS KeySetInformationClass;
3961 PVOID KeySetInformation;
3962 ULONG KeySetInformationLength;
3963 PVOID CallContext;
3964 PVOID ObjectContext;
3965 PVOID Reserved;
3966 } REG_SET_INFORMATION_KEY_INFORMATION, *PREG_SET_INFORMATION_KEY_INFORMATION;
3967
3968 typedef struct _REG_ENUMERATE_KEY_INFORMATION {
3969 PVOID Object;
3970 ULONG Index;
3971 KEY_INFORMATION_CLASS KeyInformationClass;
3972 PVOID KeyInformation;
3973 ULONG Length;
3974 PULONG ResultLength;
3975 PVOID CallContext;
3976 PVOID ObjectContext;
3977 PVOID Reserved;
3978 } REG_ENUMERATE_KEY_INFORMATION, *PREG_ENUMERATE_KEY_INFORMATION;
3979
3980 typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION {
3981 PVOID Object;
3982 ULONG Index;
3983 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
3984 PVOID KeyValueInformation;
3985 ULONG Length;
3986 PULONG ResultLength;
3987 PVOID CallContext;
3988 PVOID ObjectContext;
3989 PVOID Reserved;
3990 } REG_ENUMERATE_VALUE_KEY_INFORMATION, *PREG_ENUMERATE_VALUE_KEY_INFORMATION;
3991
3992 typedef struct _REG_QUERY_KEY_INFORMATION {
3993 PVOID Object;
3994 KEY_INFORMATION_CLASS KeyInformationClass;
3995 PVOID KeyInformation;
3996 ULONG Length;
3997 PULONG ResultLength;
3998 PVOID CallContext;
3999 PVOID ObjectContext;
4000 PVOID Reserved;
4001 } REG_QUERY_KEY_INFORMATION, *PREG_QUERY_KEY_INFORMATION;
4002
4003 typedef struct _REG_QUERY_VALUE_KEY_INFORMATION {
4004 PVOID Object;
4005 PUNICODE_STRING ValueName;
4006 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
4007 PVOID KeyValueInformation;
4008 ULONG Length;
4009 PULONG ResultLength;
4010 PVOID CallContext;
4011 PVOID ObjectContext;
4012 PVOID Reserved;
4013 } REG_QUERY_VALUE_KEY_INFORMATION, *PREG_QUERY_VALUE_KEY_INFORMATION;
4014
4015 typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION {
4016 PVOID Object;
4017 PKEY_VALUE_ENTRY ValueEntries;
4018 ULONG EntryCount;
4019 PVOID ValueBuffer;
4020 PULONG BufferLength;
4021 PULONG RequiredBufferLength;
4022 PVOID CallContext;
4023 PVOID ObjectContext;
4024 PVOID Reserved;
4025 } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION;
4026
4027 typedef struct _REG_RENAME_KEY_INFORMATION {
4028 PVOID Object;
4029 PUNICODE_STRING NewName;
4030 PVOID CallContext;
4031 PVOID ObjectContext;
4032 PVOID Reserved;
4033 } REG_RENAME_KEY_INFORMATION, *PREG_RENAME_KEY_INFORMATION;
4034
4035 typedef struct _REG_CREATE_KEY_INFORMATION {
4036 PUNICODE_STRING CompleteName;
4037 PVOID RootObject;
4038 PVOID ObjectType;
4039 ULONG CreateOptions;
4040 PUNICODE_STRING Class;
4041 PVOID SecurityDescriptor;
4042 PVOID SecurityQualityOfService;
4043 ACCESS_MASK DesiredAccess;
4044 ACCESS_MASK GrantedAccess;
4045 PULONG Disposition;
4046 PVOID *ResultObject;
4047 PVOID CallContext;
4048 PVOID RootObjectContext;
4049 PVOID Transaction;
4050 PVOID Reserved;
4051 } REG_CREATE_KEY_INFORMATION, REG_OPEN_KEY_INFORMATION,*PREG_CREATE_KEY_INFORMATION, *PREG_OPEN_KEY_INFORMATION;
4052
4053 typedef struct _REG_CREATE_KEY_INFORMATION_V1 {
4054 PUNICODE_STRING CompleteName;
4055 PVOID RootObject;
4056 PVOID ObjectType;
4057 ULONG Options;
4058 PUNICODE_STRING Class;
4059 PVOID SecurityDescriptor;
4060 PVOID SecurityQualityOfService;
4061 ACCESS_MASK DesiredAccess;
4062 ACCESS_MASK GrantedAccess;
4063 PULONG Disposition;
4064 PVOID *ResultObject;
4065 PVOID CallContext;
4066 PVOID RootObjectContext;
4067 PVOID Transaction;
4068 ULONG_PTR Version;
4069 PUNICODE_STRING RemainingName;
4070 ULONG Wow64Flags;
4071 ULONG Attributes;
4072 KPROCESSOR_MODE CheckAccessMode;
4073 } REG_CREATE_KEY_INFORMATION_V1, REG_OPEN_KEY_INFORMATION_V1,*PREG_CREATE_KEY_INFORMATION_V1, *PREG_OPEN_KEY_INFORMATION_V1;
4074
4075 typedef struct _REG_PRE_CREATE_KEY_INFORMATION {
4076 PUNICODE_STRING CompleteName;
4077 } REG_PRE_CREATE_KEY_INFORMATION, REG_PRE_OPEN_KEY_INFORMATION,*PREG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;;
4078
4079 typedef struct _REG_POST_CREATE_KEY_INFORMATION {
4080 PUNICODE_STRING CompleteName;
4081 PVOID Object;
4082 NTSTATUS Status;
4083 } REG_POST_CREATE_KEY_INFORMATION,REG_POST_OPEN_KEY_INFORMATION, *PREG_POST_CREATE_KEY_INFORMATION, *PREG_POST_OPEN_KEY_INFORMATION;
4084
4085 typedef struct _REG_POST_OPERATION_INFORMATION {
4086 PVOID Object;
4087 NTSTATUS Status;
4088 PVOID PreInformation;
4089 NTSTATUS ReturnStatus;
4090 PVOID CallContext;
4091 PVOID ObjectContext;
4092 PVOID Reserved;
4093 } REG_POST_OPERATION_INFORMATION,*PREG_POST_OPERATION_INFORMATION;
4094
4095 typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION {
4096 PVOID Object;
4097 PVOID CallContext;
4098 PVOID ObjectContext;
4099 PVOID Reserved;
4100 } REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION;
4101
4102 #if (NTDDI_VERSION >= NTDDI_VISTA)
4103
4104 typedef struct _REG_LOAD_KEY_INFORMATION {
4105 PVOID Object;
4106 PUNICODE_STRING KeyName;
4107 PUNICODE_STRING SourceFile;
4108 ULONG Flags;
4109 PVOID TrustClassObject;
4110 PVOID UserEvent;
4111 ACCESS_MASK DesiredAccess;
4112 PHANDLE RootHandle;
4113 PVOID CallContext;
4114 PVOID ObjectContext;
4115 PVOID Reserved;
4116 } REG_LOAD_KEY_INFORMATION, *PREG_LOAD_KEY_INFORMATION;
4117
4118 typedef struct _REG_UNLOAD_KEY_INFORMATION {
4119 PVOID Object;
4120 PVOID UserEvent;
4121 PVOID CallContext;
4122 PVOID ObjectContext;
4123 PVOID Reserved;
4124 } REG_UNLOAD_KEY_INFORMATION, *PREG_UNLOAD_KEY_INFORMATION;
4125
4126 typedef struct _REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION {
4127 PVOID Object;
4128 PVOID ObjectContext;
4129 PVOID Reserved;
4130 } REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION, *PREG_CALLBACK_CONTEXT_CLEANUP_INFORMATION;
4131
4132 typedef struct _REG_QUERY_KEY_SECURITY_INFORMATION {
4133 PVOID Object;
4134 PSECURITY_INFORMATION SecurityInformation;
4135 PSECURITY_DESCRIPTOR SecurityDescriptor;
4136 PULONG Length;
4137 PVOID CallContext;
4138 PVOID ObjectContext;
4139 PVOID Reserved;
4140 } REG_QUERY_KEY_SECURITY_INFORMATION, *PREG_QUERY_KEY_SECURITY_INFORMATION;
4141
4142 typedef struct _REG_SET_KEY_SECURITY_INFORMATION {
4143 PVOID Object;
4144 PSECURITY_INFORMATION SecurityInformation;
4145 PSECURITY_DESCRIPTOR SecurityDescriptor;
4146 PVOID CallContext;
4147 PVOID ObjectContext;
4148 PVOID Reserved;
4149 } REG_SET_KEY_SECURITY_INFORMATION, *PREG_SET_KEY_SECURITY_INFORMATION;
4150
4151 typedef struct _REG_RESTORE_KEY_INFORMATION {
4152 PVOID Object;
4153 HANDLE FileHandle;
4154 ULONG Flags;
4155 PVOID CallContext;
4156 PVOID ObjectContext;
4157 PVOID Reserved;
4158 } REG_RESTORE_KEY_INFORMATION, *PREG_RESTORE_KEY_INFORMATION;
4159
4160 typedef struct _REG_SAVE_KEY_INFORMATION {
4161 PVOID Object;
4162 HANDLE FileHandle;
4163 ULONG Format;
4164 PVOID CallContext;
4165 PVOID ObjectContext;
4166 PVOID Reserved;
4167 } REG_SAVE_KEY_INFORMATION, *PREG_SAVE_KEY_INFORMATION;
4168
4169 typedef struct _REG_REPLACE_KEY_INFORMATION {
4170 PVOID Object;
4171 PUNICODE_STRING OldFileName;
4172 PUNICODE_STRING NewFileName;
4173 PVOID CallContext;
4174 PVOID ObjectContext;
4175 PVOID Reserved;
4176 } REG_REPLACE_KEY_INFORMATION, *PREG_REPLACE_KEY_INFORMATION;
4177
4178 #endif /* NTDDI_VERSION >= NTDDI_VISTA */
4179
4180 #define SERVICE_KERNEL_DRIVER 0x00000001
4181 #define SERVICE_FILE_SYSTEM_DRIVER 0x00000002
4182 #define SERVICE_ADAPTER 0x00000004
4183 #define SERVICE_RECOGNIZER_DRIVER 0x00000008
4184
4185 #define SERVICE_DRIVER (SERVICE_KERNEL_DRIVER | \
4186 SERVICE_FILE_SYSTEM_DRIVER | \
4187 SERVICE_RECOGNIZER_DRIVER)
4188
4189 #define SERVICE_WIN32_OWN_PROCESS 0x00000010
4190 #define SERVICE_WIN32_SHARE_PROCESS 0x00000020
4191 #define SERVICE_WIN32 (SERVICE_WIN32_OWN_PROCESS | \
4192 SERVICE_WIN32_SHARE_PROCESS)
4193
4194 #define SERVICE_INTERACTIVE_PROCESS 0x00000100
4195
4196 #define SERVICE_TYPE_ALL (SERVICE_WIN32 | \
4197 SERVICE_ADAPTER | \
4198 SERVICE_DRIVER | \
4199 SERVICE_INTERACTIVE_PROCESS)
4200
4201 /* Service Start Types */
4202 #define SERVICE_BOOT_START 0x00000000
4203 #define SERVICE_SYSTEM_START 0x00000001
4204 #define SERVICE_AUTO_START 0x00000002
4205 #define SERVICE_DEMAND_START 0x00000003
4206 #define SERVICE_DISABLED 0x00000004
4207
4208 #define SERVICE_ERROR_IGNORE 0x00000000
4209 #define SERVICE_ERROR_NORMAL 0x00000001
4210 #define SERVICE_ERROR_SEVERE 0x00000002
4211 #define SERVICE_ERROR_CRITICAL 0x00000003
4212
4213 typedef enum _CM_SERVICE_NODE_TYPE {
4214 DriverType = SERVICE_KERNEL_DRIVER,
4215 FileSystemType = SERVICE_FILE_SYSTEM_DRIVER,
4216 Win32ServiceOwnProcess = SERVICE_WIN32_OWN_PROCESS,
4217 Win32ServiceShareProcess = SERVICE_WIN32_SHARE_PROCESS,
4218 AdapterType = SERVICE_ADAPTER,
4219 RecognizerType = SERVICE_RECOGNIZER_DRIVER
4220 } SERVICE_NODE_TYPE;
4221
4222 typedef enum _CM_SERVICE_LOAD_TYPE {
4223 BootLoad = SERVICE_BOOT_START,
4224 SystemLoad = SERVICE_SYSTEM_START,
4225 AutoLoad = SERVICE_AUTO_START,
4226 DemandLoad = SERVICE_DEMAND_START,
4227 DisableLoad = SERVICE_DISABLED
4228 } SERVICE_LOAD_TYPE;
4229
4230 typedef enum _CM_ERROR_CONTROL_TYPE {
4231 IgnoreError = SERVICE_ERROR_IGNORE,
4232 NormalError = SERVICE_ERROR_NORMAL,
4233 SevereError = SERVICE_ERROR_SEVERE,
4234 CriticalError = SERVICE_ERROR_CRITICAL
4235 } SERVICE_ERROR_TYPE;
4236
4237 #define CM_SERVICE_NETWORK_BOOT_LOAD 0x00000001
4238 #define CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD 0x00000002
4239 #define CM_SERVICE_USB_DISK_BOOT_LOAD 0x00000004
4240
4241 #define CM_SERVICE_VALID_PROMOTION_MASK (CM_SERVICE_NETWORK_BOOT_LOAD | \
4242 CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD | \
4243 CM_SERVICE_USB_DISK_BOOT_LOAD)
4244
4245 /******************************************************************************
4246 * I/O Manager Types *
4247 ******************************************************************************/
4248
4249
4250 #define STATUS_CONTINUE_COMPLETION STATUS_SUCCESS
4251
4252 #define CONNECT_FULLY_SPECIFIED 0x1
4253 #define CONNECT_LINE_BASED 0x2
4254 #define CONNECT_MESSAGE_BASED 0x3
4255 #define CONNECT_FULLY_SPECIFIED_GROUP 0x4
4256 #define CONNECT_CURRENT_VERSION 0x4
4257
4258 #define POOL_COLD_ALLOCATION 256
4259 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8
4260 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16
4261
4262 #define IO_TYPE_ADAPTER 1
4263 #define IO_TYPE_CONTROLLER 2
4264 #define IO_TYPE_DEVICE 3
4265 #define IO_TYPE_DRIVER 4
4266 #define IO_TYPE_FILE 5
4267 #define IO_TYPE_IRP 6
4268 #define IO_TYPE_MASTER_ADAPTER 7
4269 #define IO_TYPE_OPEN_PACKET 8
4270 #define IO_TYPE_TIMER 9
4271 #define IO_TYPE_VPB 10
4272 #define IO_TYPE_ERROR_LOG 11
4273 #define IO_TYPE_ERROR_MESSAGE 12
4274 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
4275
4276 #define IO_TYPE_CSQ_IRP_CONTEXT 1
4277 #define IO_TYPE_CSQ 2
4278 #define IO_TYPE_CSQ_EX 3
4279
4280 /* IO_RESOURCE_DESCRIPTOR.Option */
4281 #define IO_RESOURCE_PREFERRED 0x01
4282 #define IO_RESOURCE_DEFAULT 0x02
4283 #define IO_RESOURCE_ALTERNATIVE 0x08
4284
4285 #define FILE_DEVICE_BEEP 0x00000001
4286 #define FILE_DEVICE_CD_ROM 0x00000002
4287 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
4288 #define FILE_DEVICE_CONTROLLER 0x00000004
4289 #define FILE_DEVICE_DATALINK 0x00000005
4290 #define FILE_DEVICE_DFS 0x00000006
4291 #define FILE_DEVICE_DISK 0x00000007
4292 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
4293 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
4294 #define FILE_DEVICE_INPORT_PORT 0x0000000a
4295 #define FILE_DEVICE_KEYBOARD 0x0000000b
4296 #define FILE_DEVICE_MAILSLOT 0x0000000c
4297 #define FILE_DEVICE_MIDI_IN 0x0000000d
4298 #define FILE_DEVICE_MIDI_OUT 0x0000000e
4299 #define FILE_DEVICE_MOUSE 0x0000000f
4300 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
4301 #define FILE_DEVICE_NAMED_PIPE 0x00000011
4302 #define FILE_DEVICE_NETWORK 0x00000012
4303 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
4304 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
4305 #define FILE_DEVICE_NULL 0x00000015
4306 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
4307 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
4308 #define FILE_DEVICE_PRINTER 0x00000018
4309 #define FILE_DEVICE_SCANNER 0x00000019
4310 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
4311 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
4312 #define FILE_DEVICE_SCREEN 0x0000001c
4313 #define FILE_DEVICE_SOUND 0x0000001d
4314 #define FILE_DEVICE_STREAMS 0x0000001e
4315 #define FILE_DEVICE_TAPE 0x0000001f
4316 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
4317 #define FILE_DEVICE_TRANSPORT 0x00000021
4318 #define FILE_DEVICE_UNKNOWN 0x00000022
4319 #define FILE_DEVICE_VIDEO 0x00000023
4320 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
4321 #define FILE_DEVICE_WAVE_IN 0x00000025
4322 #define FILE_DEVICE_WAVE_OUT 0x00000026
4323 #define FILE_DEVICE_8042_PORT 0x00000027
4324 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
4325 #define FILE_DEVICE_BATTERY 0x00000029
4326 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
4327 #define FILE_DEVICE_MODEM 0x0000002b
4328 #define FILE_DEVICE_VDM 0x0000002c
4329 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
4330 #define FILE_DEVICE_SMB 0x0000002e
4331 #define FILE_DEVICE_KS 0x0000002f
4332 #define FILE_DEVICE_CHANGER 0x00000030
4333 #define FILE_DEVICE_SMARTCARD 0x00000031
4334 #define FILE_DEVICE_ACPI 0x00000032
4335 #define FILE_DEVICE_DVD 0x00000033
4336 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
4337 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
4338 #define FILE_DEVICE_DFS_VOLUME 0x00000036
4339 #define FILE_DEVICE_SERENUM 0x00000037
4340 #define FILE_DEVICE_TERMSRV 0x00000038
4341 #define FILE_DEVICE_KSEC 0x00000039
4342 #define FILE_DEVICE_FIPS 0x0000003A
4343 #define FILE_DEVICE_INFINIBAND 0x0000003B
4344 #define FILE_DEVICE_VMBUS 0x0000003E
4345 #define FILE_DEVICE_CRYPT_PROVIDER 0x0000003F
4346 #define FILE_DEVICE_WPD 0x00000040
4347 #define FILE_DEVICE_BLUETOOTH 0x00000041
4348 #define FILE_DEVICE_MT_COMPOSITE 0x00000042
4349 #define FILE_DEVICE_MT_TRANSPORT 0x00000043
4350 #define FILE_DEVICE_BIOMETRIC 0x00000044
4351 #define FILE_DEVICE_PMI 0x00000045
4352
4353 #if defined(NT_PROCESSOR_GROUPS)
4354
4355 typedef USHORT IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
4356
4357 typedef enum _IRQ_DEVICE_POLICY_USHORT {
4358 IrqPolicyMachineDefault = 0,
4359 IrqPolicyAllCloseProcessors = 1,
4360 IrqPolicyOneCloseProcessor = 2,
4361 IrqPolicyAllProcessorsInMachine = 3,
4362 IrqPolicyAllProcessorsInGroup = 3,
4363 IrqPolicySpecifiedProcessors = 4,
4364 IrqPolicySpreadMessagesAcrossAllProcessors = 5};
4365
4366 #else /* defined(NT_PROCESSOR_GROUPS) */
4367
4368 typedef enum _IRQ_DEVICE_POLICY {
4369 IrqPolicyMachineDefault = 0,
4370 IrqPolicyAllCloseProcessors,
4371 IrqPolicyOneCloseProcessor,
4372 IrqPolicyAllProcessorsInMachine,
4373 IrqPolicySpecifiedProcessors,
4374 IrqPolicySpreadMessagesAcrossAllProcessors
4375 } IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
4376
4377 #endif
4378
4379 typedef enum _IRQ_PRIORITY {
4380 IrqPriorityUndefined = 0,
4381 IrqPriorityLow,
4382 IrqPriorityNormal,
4383 IrqPriorityHigh
4384 } IRQ_PRIORITY, *PIRQ_PRIORITY;
4385
4386 typedef enum _IRQ_GROUP_POLICY {
4387 GroupAffinityAllGroupZero = 0,
4388 GroupAffinityDontCare
4389 } IRQ_GROUP_POLICY, *PIRQ_GROUP_POLICY;
4390
4391 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
4392
4393 typedef struct _OBJECT_HANDLE_INFORMATION {
4394 ULONG HandleAttributes;
4395 ACCESS_MASK GrantedAccess;
4396 } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
4397
4398 typedef struct _CLIENT_ID {
4399 HANDLE UniqueProcess;
4400 HANDLE UniqueThread;
4401 } CLIENT_ID, *PCLIENT_ID;
4402
4403 typedef struct _VPB {
4404 CSHORT Type;
4405 CSHORT Size;
4406 USHORT Flags;
4407 USHORT VolumeLabelLength;
4408 struct _DEVICE_OBJECT *DeviceObject;
4409 struct _DEVICE_OBJECT *RealDevice;
4410 ULONG SerialNumber;
4411 ULONG ReferenceCount;
4412 WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
4413 } VPB, *PVPB;
4414
4415 typedef enum _IO_ALLOCATION_ACTION {
4416 KeepObject = 1,
4417 DeallocateObject,
4418 DeallocateObjectKeepRegisters
4419 } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
4420
4421 _Function_class_(DRIVER_CONTROL)
4422 _IRQL_requires_same_
4423 typedef IO_ALLOCATION_ACTION
4424 (NTAPI DRIVER_CONTROL)(
4425 _In_ struct _DEVICE_OBJECT *DeviceObject,
4426 _Inout_ struct _IRP *Irp,
4427 _In_ PVOID MapRegisterBase,
4428 _In_ PVOID Context);
4429 typedef DRIVER_CONTROL *PDRIVER_CONTROL;
4430
4431 typedef struct _WAIT_CONTEXT_BLOCK {
4432 KDEVICE_QUEUE_ENTRY WaitQueueEntry;
4433 PDRIVER_CONTROL DeviceRoutine;
4434 PVOID DeviceContext;
4435 ULONG NumberOfMapRegisters;
4436 PVOID DeviceObject;
4437 PVOID CurrentIrp;
4438 PKDPC BufferChainingDpc;
4439 } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
4440
4441 /* DEVICE_OBJECT.Flags */
4442 #define DO_VERIFY_VOLUME 0x00000002
4443 #define DO_BUFFERED_IO 0x00000004
4444 #define DO_EXCLUSIVE 0x00000008
4445 #define DO_DIRECT_IO 0x00000010
4446 #define DO_MAP_IO_BUFFER 0x00000020
4447 #define DO_DEVICE_INITIALIZING 0x00000080
4448 #define DO_SHUTDOWN_REGISTERED 0x00000800
4449 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
4450 #define DO_POWER_PAGABLE 0x00002000
4451 #define DO_POWER_INRUSH 0x00004000
4452
4453 /* DEVICE_OBJECT.Characteristics */
4454 #define FILE_REMOVABLE_MEDIA 0x00000001
4455 #define FILE_READ_ONLY_DEVICE 0x00000002
4456 #define FILE_FLOPPY_DISKETTE 0x00000004
4457 #define FILE_WRITE_ONCE_MEDIA 0x00000008
4458 #define FILE_REMOTE_DEVICE 0x00000010
4459 #define FILE_DEVICE_IS_MOUNTED 0x00000020
4460 #define FILE_VIRTUAL_VOLUME 0x00000040
4461 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
4462 #define FILE_DEVICE_SECURE_OPEN 0x00000100
4463 #define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800
4464 #define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000
4465 #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
4466
4467 /* DEVICE_OBJECT.AlignmentRequirement */
4468 #define FILE_BYTE_ALIGNMENT 0x00000000
4469 #define FILE_WORD_ALIGNMENT 0x00000001
4470 #define FILE_LONG_ALIGNMENT 0x00000003
4471 #define FILE_QUAD_ALIGNMENT 0x00000007
4472 #define FILE_OCTA_ALIGNMENT 0x0000000f
4473 #define FILE_32_BYTE_ALIGNMENT 0x0000001f
4474 #define FILE_64_BYTE_ALIGNMENT 0x0000003f
4475 #define FILE_128_BYTE_ALIGNMENT 0x0000007f
4476 #define FILE_256_BYTE_ALIGNMENT 0x000000ff
4477 #define FILE_512_BYTE_ALIGNMENT 0x000001ff
4478
4479 /* DEVICE_OBJECT.DeviceType */
4480 #define DEVICE_TYPE ULONG
4481
4482 typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _DEVICE_OBJECT {
4483 CSHORT Type;
4484 USHORT Size;
4485 LONG ReferenceCount;
4486 struct _DRIVER_OBJECT *DriverObject;
4487 struct _DEVICE_OBJECT *NextDevice;
4488 struct _DEVICE_OBJECT *AttachedDevice;
4489 struct _IRP *CurrentIrp;
4490 PIO_TIMER Timer;
4491 ULONG Flags;
4492 ULONG Characteristics;
4493 volatile PVPB Vpb;
4494 PVOID DeviceExtension;
4495 DEVICE_TYPE DeviceType;
4496 CCHAR StackSize;
4497 union {
4498 LIST_ENTRY ListEntry;
4499 WAIT_CONTEXT_BLOCK Wcb;
4500 } Queue;
4501 ULONG AlignmentRequirement;
4502 KDEVICE_QUEUE DeviceQueue;
4503 KDPC Dpc;
4504 ULONG ActiveThreadCount;
4505 PSECURITY_DESCRIPTOR SecurityDescriptor;
4506 KEVENT DeviceLock;
4507 USHORT SectorSize;
4508 USHORT Spare1;
4509 struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
4510 PVOID Reserved;
4511 } DEVICE_OBJECT, *PDEVICE_OBJECT;
4512
4513 typedef enum _IO_SESSION_STATE {
4514 IoSessionStateCreated = 1,
4515 IoSessionStateInitialized,
4516 IoSessionStateConnected,
4517 IoSessionStateDisconnected,
4518 IoSessionStateDisconnectedLoggedOn,
4519 IoSessionStateLoggedOn,
4520 IoSessionStateLoggedOff,
4521 IoSessionStateTerminated,
4522 IoSessionStateMax
4523 } IO_SESSION_STATE, *PIO_SESSION_STATE;
4524
4525 typedef enum _IO_COMPLETION_ROUTINE_RESULT {
4526 ContinueCompletion = STATUS_CONTINUE_COMPLETION,
4527 StopCompletion = STATUS_MORE_PROCESSING_REQUIRED
4528 } IO_COMPLETION_ROUTINE_RESULT, *PIO_COMPLETION_ROUTINE_RESULT;
4529
4530 typedef struct _IO_INTERRUPT_MESSAGE_INFO_ENTRY {
4531 PHYSICAL_ADDRESS MessageAddress;
4532 KAFFINITY TargetProcessorSet;
4533 PKINTERRUPT InterruptObject;
4534 ULONG MessageData;
4535 ULONG Vector;
4536 KIRQL Irql;
4537 KINTERRUPT_MODE Mode;
4538 KINTERRUPT_POLARITY Polarity;
4539 } IO_INTERRUPT_MESSAGE_INFO_ENTRY, *PIO_INTERRUPT_MESSAGE_INFO_ENTRY;
4540
4541 typedef struct _IO_INTERRUPT_MESSAGE_INFO {
4542 KIRQL UnifiedIrql;
4543 ULONG MessageCount;
4544 IO_INTERRUPT_MESSAGE_INFO_ENTRY MessageInfo[1];
4545 } IO_INTERRUPT_MESSAGE_INFO, *PIO_INTERRUPT_MESSAGE_INFO;
4546
4547 typedef struct _IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS {
4548 _In_ PDEVICE_OBJECT PhysicalDeviceObject;
4549 _Out_ PKINTERRUPT *InterruptObject;
4550 _In_ PKSERVICE_ROUTINE ServiceRoutine;
4551 _In_ PVOID ServiceContext;
4552 _In_opt_ PKSPIN_LOCK SpinLock;
4553 _In_ KIRQL SynchronizeIrql;
4554 _In_ BOOLEAN FloatingSave;
4555 _In_ BOOLEAN ShareVector;
4556 _In_ ULONG Vector;
4557 _In_ KIRQL Irql;
4558 _In_ KINTERRUPT_MODE InterruptMode;
4559 _In_ KAFFINITY ProcessorEnableMask;
4560 _In_ USHORT Group;
4561 } IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS, *PIO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS;
4562
4563 typedef struct _IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS {
4564 _In_ PDEVICE_OBJECT PhysicalDeviceObject;
4565 _Out_ PKINTERRUPT *InterruptObject;
4566 _In_ PKSERVICE_ROUTINE ServiceRoutine;
4567 _In_ PVOID ServiceContext;
4568 _In_opt_ PKSPIN_LOCK SpinLock;
4569 _In_opt_ KIRQL SynchronizeIrql;
4570 _In_ BOOLEAN FloatingSave;
4571 } IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS;
4572
4573 typedef struct _IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS {
4574 _In_ PDEVICE_OBJECT PhysicalDeviceObject;
4575 union {
4576 _Out_ PVOID *Generic;
4577 _Out_ PIO_INTERRUPT_MESSAGE_INFO *InterruptMessageTable;
4578 _Out_ PKINTERRUPT *InterruptObject;
4579 } ConnectionContext;
4580 _In_ PKMESSAGE_SERVICE_ROUTINE MessageServiceRoutine;
4581 _In_ PVOID ServiceContext;
4582 _In_opt_ PKSPIN_LOCK SpinLock;
4583 _In_opt_ KIRQL SynchronizeIrql;
4584 _In_ BOOLEAN FloatingSave;
4585 _In_opt_ PKSERVICE_ROUTINE FallBackServiceRoutine;
4586 } IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS;
4587
4588 typedef struct _IO_CONNECT_INTERRUPT_PARAMETERS {
4589 _Inout_ ULONG Version;
4590 _ANONYMOUS_UNION union {
4591 IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS FullySpecified;
4592 IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS LineBased;
4593 IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS MessageBased;
4594 } DUMMYUNIONNAME;
4595 } IO_CONNECT_INTERRUPT_PARAMETERS, *PIO_CONNECT_INTERRUPT_PARAMETERS;
4596
4597 typedef struct _IO_DISCONNECT_INTERRUPT_PARAMETERS {
4598 _In_ ULONG Version;
4599 union {
4600 _In_ PVOID Generic;
4601 _In_ PKINTERRUPT InterruptObject;
4602 _In_ PIO_INTERRUPT_MESSAGE_INFO InterruptMessageTable;
4603 } ConnectionContext;
4604 } IO_DISCONNECT_INTERRUPT_PARAMETERS, *PIO_DISCONNECT_INTERRUPT_PARAMETERS;
4605
4606 typedef enum _IO_ACCESS_TYPE {
4607 ReadAccess,
4608 WriteAccess,
4609 ModifyAccess
4610 } IO_ACCESS_TYPE;
4611
4612 typedef enum _IO_ACCESS_MODE {
4613 SequentialAccess,
4614 RandomAccess
4615 } IO_ACCESS_MODE;
4616
4617 typedef enum _IO_CONTAINER_NOTIFICATION_CLASS {
4618 IoSessionStateNotification,
4619 IoMaxContainerNotificationClass
4620 } IO_CONTAINER_NOTIFICATION_CLASS;
4621
4622 typedef struct _IO_SESSION_STATE_NOTIFICATION {
4623 ULONG Size;
4624 ULONG Flags;
4625 PVOID IoObject;
4626 ULONG EventMask;
4627 PVOID Context;
4628 } IO_SESSION_STATE_NOTIFICATION, *PIO_SESSION_STATE_NOTIFICATION;
4629
4630 typedef enum _IO_CONTAINER_INFORMATION_CLASS {
4631 IoSessionStateInformation,
4632 IoMaxContainerInformationClass
4633 } IO_CONTAINER_INFORMATION_CLASS;
4634
4635 typedef struct _IO_SESSION_STATE_INFORMATION {
4636 ULONG SessionId;
4637 IO_SESSION_STATE SessionState;
4638 BOOLEAN LocalSession;
4639 } IO_SESSION_STATE_INFORMATION, *PIO_SESSION_STATE_INFORMATION;
4640
4641 #if (NTDDI_VERSION >= NTDDI_WIN7)
4642
4643 typedef NTSTATUS
4644 (NTAPI *PIO_CONTAINER_NOTIFICATION_FUNCTION)(
4645 VOID);
4646
4647 typedef NTSTATUS
4648 (NTAPI IO_SESSION_NOTIFICATION_FUNCTION)(
4649 _In_ PVOID SessionObject,
4650 _In_ PVOID IoObject,
4651 _In_ ULONG Event,
4652 _In_ PVOID Context,
4653 _In_reads_bytes_opt_(PayloadLength) PVOID NotificationPayload,
4654 _In_ ULONG PayloadLength);
4655
4656 typedef IO_SESSION_NOTIFICATION_FUNCTION *PIO_SESSION_NOTIFICATION_FUNCTION;
4657
4658 #endif
4659
4660 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
4661
4662 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
4663 BOOLEAN Removed;
4664 BOOLEAN Reserved[3];
4665 volatile LONG IoCount;
4666 KEVENT RemoveEvent;
4667 } IO_REMOVE_LOCK_COMMON_BLOCK;
4668
4669 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
4670 LONG Signature;
4671 LONG HighWatermark;
4672 LONGLONG MaxLockedTicks;
4673 LONG AllocateTag;
4674 LIST_ENTRY LockList;
4675 KSPIN_LOCK Spin;
4676 volatile LONG LowMemoryCount;
4677 ULONG Reserved1[4];
4678 PVOID Reserved2;
4679 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
4680 } IO_REMOVE_LOCK_DBG_BLOCK;
4681
4682 typedef struct _IO_REMOVE_LOCK {
4683 IO_REMOVE_LOCK_COMMON_BLOCK Common;
4684 #if DBG
4685 IO_REMOVE_LOCK_DBG_BLOCK Dbg;
4686 #endif
4687 } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
4688
4689 typedef struct _IO_WORKITEM *PIO_WORKITEM;
4690
4691 _Function_class_(IO_WORKITEM_ROUTINE)
4692 _IRQL_requires_(PASSIVE_LEVEL)
4693 _IRQL_requires_same_
4694 typedef VOID
4695 (NTAPI IO_WORKITEM_ROUTINE)(
4696 _In_ PDEVICE_OBJECT DeviceObject,
4697 _In_opt_ PVOID Context);
4698 typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE;
4699
4700 typedef VOID
4701 (NTAPI IO_WORKITEM_ROUTINE_EX)(
4702 _In_ PVOID IoObject,
4703 _In_opt_ PVOID Context,
4704 _In_ PIO_WORKITEM IoWorkItem);
4705 typedef IO_WORKITEM_ROUTINE_EX *PIO_WORKITEM_ROUTINE_EX;
4706
4707 typedef struct _SHARE_ACCESS {
4708 ULONG OpenCount;
4709 ULONG Readers;
4710 ULONG Writers;
4711 ULONG Deleters;
4712 ULONG SharedRead;
4713 ULONG SharedWrite;
4714 ULONG SharedDelete;
4715 } SHARE_ACCESS, *PSHARE_ACCESS;
4716
4717 /* While MS WDK uses inheritance in C++, we cannot do this with gcc, as
4718 inheritance, even from a struct renders the type non-POD. So we use
4719 this hack */
4720 #define PCI_COMMON_HEADER_LAYOUT \
4721 USHORT VendorID; \
4722 USHORT DeviceID; \
4723 USHORT Command; \
4724 USHORT Status; \
4725 UCHAR RevisionID; \
4726 UCHAR ProgIf; \
4727 UCHAR SubClass; \
4728 UCHAR BaseClass; \
4729 UCHAR CacheLineSize; \
4730 UCHAR LatencyTimer; \
4731 UCHAR HeaderType; \
4732 UCHAR BIST; \
4733 union { \
4734 struct _PCI_HEADER_TYPE_0 { \
4735 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; \
4736 ULONG CIS; \
4737 USHORT SubVendorID; \
4738 USHORT SubSystemID; \
4739 ULONG ROMBaseAddress; \
4740 UCHAR CapabilitiesPtr; \
4741 UCHAR Reserved1[3]; \
4742 ULONG Reserved2; \
4743 UCHAR InterruptLine; \
4744 UCHAR InterruptPin; \
4745 UCHAR MinimumGrant; \
4746 UCHAR MaximumLatency; \
4747 } type0; \
4748 struct _PCI_HEADER_TYPE_1 { \
4749 ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; \
4750 UCHAR PrimaryBus; \
4751 UCHAR SecondaryBus; \
4752 UCHAR SubordinateBus; \
4753 UCHAR SecondaryLatency; \
4754 UCHAR IOBase; \
4755 UCHAR IOLimit; \
4756 USHORT SecondaryStatus; \
4757 USHORT MemoryBase; \
4758 USHORT MemoryLimit; \
4759 USHORT PrefetchBase; \
4760 USHORT PrefetchLimit; \
4761 ULONG PrefetchBaseUpper32; \
4762 ULONG PrefetchLimitUpper32; \
4763 USHORT IOBaseUpper16; \
4764 USHORT IOLimitUpper16; \
4765 UCHAR CapabilitiesPtr; \
4766 UCHAR Reserved1[3]; \
4767 ULONG ROMBaseAddress; \
4768 UCHAR InterruptLine; \
4769 UCHAR InterruptPin; \
4770 USHORT BridgeControl; \
4771 } type1; \
4772 struct _PCI_HEADER_TYPE_2 { \
4773 ULONG SocketRegistersBaseAddress; \
4774 UCHAR CapabilitiesPtr; \
4775 UCHAR Reserved; \
4776 USHORT SecondaryStatus; \
4777 UCHAR PrimaryBus; \
4778 UCHAR SecondaryBus; \
4779 UCHAR SubordinateBus; \
4780 UCHAR SecondaryLatency; \
4781 struct { \
4782 ULONG Base; \
4783 ULONG Limit; \
4784 } Range[PCI_TYPE2_ADDRESSES-1]; \
4785 UCHAR InterruptLine; \
4786 UCHAR InterruptPin; \
4787 USHORT BridgeControl; \
4788 } type2; \
4789 } u;
4790
4791 typedef enum _CREATE_FILE_TYPE {
4792 CreateFileTypeNone,
4793 CreateFileTypeNamedPipe,
4794 CreateFileTypeMailslot
4795 } CREATE_FILE_TYPE;
4796
4797 #define IO_FORCE_ACCESS_CHECK 0x001
4798 #define IO_NO_PARAMETER_CHECKING 0x100
4799
4800 #define IO_REPARSE 0x0
4801 #define IO_REMOUNT 0x1
4802
4803 typedef struct _IO_STATUS_BLOCK {
4804 _ANONYMOUS_UNION union {
4805 NTSTATUS Status;
4806 PVOID Pointer;
4807 } DUMMYUNIONNAME;
4808 ULONG_PTR Information;
4809 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
4810
4811 #if defined(_WIN64)
4812 typedef struct _IO_STATUS_BLOCK32 {
4813 NTSTATUS Status;
4814 ULONG Information;
4815 } IO_STATUS_BLOCK32, *PIO_STATUS_BLOCK32;
4816 #endif
4817
4818 typedef VOID
4819 (NTAPI *PIO_APC_ROUTINE)(
4820 _In_ PVOID ApcContext,
4821 _In_ PIO_STATUS_BLOCK IoStatusBlock,
4822 _In_ ULONG Reserved);
4823
4824 #define PIO_APC_ROUTINE_DEFINED
4825
4826 typedef enum _IO_SESSION_EVENT {
4827 IoSessionEventIgnore = 0,
4828 IoSessionEventCreated,
4829 IoSessionEventTerminated,
4830 IoSessionEventConnected,
4831 IoSessionEventDisconnected,
4832 IoSessionEventLogon,
4833 IoSessionEventLogoff,
4834 IoSessionEventMax
4835 } IO_SESSION_EVENT, *PIO_SESSION_EVENT;
4836
4837 #define IO_SESSION_STATE_ALL_EVENTS 0xffffffff
4838 #define IO_SESSION_STATE_CREATION_EVENT 0x00000001
4839 #define IO_SESSION_STATE_TERMINATION_EVENT 0x00000002
4840 #define IO_SESSION_STATE_CONNECT_EVENT 0x00000004
4841 #define IO_SESSION_STATE_DISCONNECT_EVENT 0x00000008
4842 #define IO_SESSION_STATE_LOGON_EVENT 0x00000010
4843 #define IO_SESSION_STATE_LOGOFF_EVENT 0x00000020
4844
4845 #define IO_SESSION_STATE_VALID_EVENT_MASK 0x0000003f
4846
4847 #define IO_SESSION_MAX_PAYLOAD_SIZE 256L
4848
4849 typedef struct _IO_SESSION_CONNECT_INFO {
4850 ULONG SessionId;
4851 BOOLEAN LocalSession;
4852 } IO_SESSION_CONNECT_INFO, *PIO_SESSION_CONNECT_INFO;
4853
4854 #define EVENT_INCREMENT 1
4855 #define IO_NO_INCREMENT 0
4856 #define IO_CD_ROM_INCREMENT 1
4857 #define IO_DISK_INCREMENT 1
4858 #define IO_KEYBOARD_INCREMENT 6
4859 #define IO_MAILSLOT_INCREMENT 2
4860 #define IO_MOUSE_INCREMENT 6
4861 #define IO_NAMED_PIPE_INCREMENT 2
4862 #define IO_NETWORK_INCREMENT 2
4863 #define IO_PARALLEL_INCREMENT 1
4864 #define IO_SERIAL_INCREMENT 2
4865 #define IO_SOUND_INCREMENT 8
4866 #define IO_VIDEO_INCREMENT 1
4867 #define SEMAPHORE_INCREMENT 1
4868
4869 #define MM_MAXIMUM_DISK_IO_SIZE (0x10000)
4870
4871 typedef struct _BOOTDISK_INFORMATION {
4872 LONGLONG BootPartitionOffset;
4873 LONGLONG SystemPartitionOffset;
4874 ULONG BootDeviceSignature;
4875 ULONG SystemDeviceSignature;
4876 } BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
4877
4878 typedef struct _BOOTDISK_INFORMATION_EX {
4879 LONGLONG BootPartitionOffset;
4880 LONGLONG SystemPartitionOffset;
4881 ULONG BootDeviceSignature;
4882 ULONG SystemDeviceSignature;
4883 GUID BootDeviceGuid;
4884 GUID SystemDeviceGuid;
4885 BOOLEAN BootDeviceIsGpt;
4886 BOOLEAN SystemDeviceIsGpt;
4887 } BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
4888
4889 #if (NTDDI_VERSION >= NTDDI_WIN7)
4890
4891 typedef struct _LOADER_PARTITION_INFORMATION_EX {
4892 ULONG PartitionStyle;
4893 ULONG PartitionNumber;
4894 _ANONYMOUS_UNION union {
4895 ULONG Signature;
4896 GUID DeviceId;
4897 } DUMMYUNIONNAME;
4898 ULONG Flags;
4899 } LOADER_PARTITION_INFORMATION_EX, *PLOADER_PARTITION_INFORMATION_EX;
4900
4901 typedef struct _BOOTDISK_INFORMATION_LITE {
4902 ULONG NumberEntries;
4903 LOADER_PARTITION_INFORMATION_EX Entries[1];
4904 } BOOTDISK_INFORMATION_LITE, *PBOOTDISK_INFORMATION_LITE;
4905
4906 #else
4907
4908 #if (NTDDI_VERSION >= NTDDI_VISTA)
4909 typedef struct _BOOTDISK_INFORMATION_LITE {
4910 ULONG BootDeviceSignature;
4911 ULONG SystemDeviceSignature;
4912 GUID BootDeviceGuid;
4913 GUID SystemDeviceGuid;
4914 BOOLEAN BootDeviceIsGpt;
4915 BOOLEAN SystemDeviceIsGpt;
4916 } BOOTDISK_INFORMATION_LITE, *PBOOTDISK_INFORMATION_LITE;
4917 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
4918
4919 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
4920
4921 #include <pshpack1.h>
4922
4923 typedef struct _EISA_MEMORY_TYPE {
4924 UCHAR ReadWrite:1;
4925 UCHAR Cached:1;
4926 UCHAR Reserved0:1;
4927 UCHAR Type:2;
4928 UCHAR Shared:1;
4929 UCHAR Reserved1:1;
4930 UCHAR MoreEntries:1;
4931 } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
4932
4933 typedef struct _EISA_MEMORY_CONFIGURATION {
4934 EISA_MEMORY_TYPE ConfigurationByte;
4935 UCHAR DataSize;
4936 USHORT AddressLowWord;
4937 UCHAR AddressHighByte;
4938 USHORT MemorySize;
4939 } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
4940
4941 typedef struct _EISA_IRQ_DESCRIPTOR {
4942 UCHAR Interrupt:4;
4943 UCHAR Reserved:1;
4944 UCHAR LevelTriggered:1;
4945 UCHAR Shared:1;
4946 UCHAR MoreEntries:1;
4947 } EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
4948
4949 typedef struct _EISA_IRQ_CONFIGURATION {
4950 EISA_IRQ_DESCRIPTOR ConfigurationByte;
4951 UCHAR Reserved;
4952 } EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
4953
4954 typedef struct _DMA_CONFIGURATION_BYTE0 {
4955 UCHAR Channel:3;
4956 UCHAR Reserved:3;
4957 UCHAR Shared:1;
4958 UCHAR MoreEntries:1;
4959 } DMA_CONFIGURATION_BYTE0;
4960
4961 typedef struct _DMA_CONFIGURATION_BYTE1 {
4962 UCHAR Reserved0:2;
4963 UCHAR TransferSize:2;
4964 UCHAR Timing:2;
4965 UCHAR Reserved1:2;
4966 } DMA_CONFIGURATION_BYTE1;
4967
4968 typedef struct _EISA_DMA_CONFIGURATION {
4969 DMA_CONFIGURATION_BYTE0 ConfigurationByte0;
4970 DMA_CONFIGURATION_BYTE1 ConfigurationByte1;
4971 } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
4972
4973 typedef struct _EISA_PORT_DESCRIPTOR {
4974 UCHAR NumberPorts:5;
4975 UCHAR Reserved:1;
4976 UCHAR Shared:1;
4977 UCHAR MoreEntries:1;
4978 } EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
4979
4980 typedef struct _EISA_PORT_CONFIGURATION {
4981 EISA_PORT_DESCRIPTOR Configuration;
4982 USHORT PortAddress;
4983 } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
4984
4985 typedef struct _CM_EISA_SLOT_INFORMATION {
4986 UCHAR ReturnCode;
4987 UCHAR ReturnFlags;
4988 UCHAR MajorRevision;
4989 UCHAR MinorRevision;
4990 USHORT Checksum;
4991 UCHAR NumberFunctions;
4992 UCHAR FunctionInformation;
4993 ULONG CompressedId;
4994 } CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
4995
4996 typedef struct _CM_EISA_FUNCTION_INFORMATION {
4997 ULONG CompressedId;
4998 UCHAR IdSlotFlags1;
4999 UCHAR IdSlotFlags2;
5000 UCHAR MinorRevision;
5001 UCHAR MajorRevision;
5002 UCHAR Selections[26];
5003 UCHAR FunctionFlags;
5004 UCHAR TypeString[80];
5005 EISA_MEMORY_CONFIGURATION EisaMemory[9];
5006 EISA_IRQ_CONFIGURATION EisaIrq[7];
5007 EISA_DMA_CONFIGURATION EisaDma[4];
5008 EISA_PORT_CONFIGURATION EisaPort[20];
5009 UCHAR InitializationData[60];
5010 } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
5011
5012 #include <poppack.h>
5013
5014 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
5015
5016 #define EISA_FUNCTION_ENABLED 0x80
5017 #define EISA_FREE_FORM_DATA 0x40
5018 #define EISA_HAS_PORT_INIT_ENTRY 0x20
5019 #define EISA_HAS_PORT_RANGE 0x10
5020 #define EISA_HAS_DMA_ENTRY 0x08
5021 #define EISA_HAS_IRQ_ENTRY 0x04
5022 #define EISA_HAS_MEMORY_ENTRY 0x02
5023 #define EISA_HAS_TYPE_ENTRY 0x01
5024 #define EISA_HAS_INFORMATION \
5025 (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
5026 + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
5027
5028 #define EISA_MORE_ENTRIES 0x80
5029 #define EISA_SYSTEM_MEMORY 0x00
5030 #define EISA_MEMORY_TYPE_RAM 0x01
5031
5032 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
5033
5034 #define EISA_INVALID_SLOT 0x80
5035 #define EISA_INVALID_FUNCTION 0x81
5036 #define EISA_INVALID_CONFIGURATION 0x82
5037 #define EISA_EMPTY_SLOT 0x83
5038 #define EISA_INVALID_BIOS_CALL 0x86
5039
5040 /*
5041 ** Plug and Play structures
5042 */
5043
5044 typedef VOID
5045 (NTAPI *PINTERFACE_REFERENCE)(
5046 PVOID Context);
5047
5048 typedef VOID
5049 (NTAPI *PINTERFACE_DEREFERENCE)(
5050 PVOID Context);
5051
5052 _Function_class_(TRANSLATE_BUS_ADDRESS)
5053 _IRQL_requires_same_
5054 typedef BOOLEAN
5055 (NTAPI TRANSLATE_BUS_ADDRESS)(
5056 _Inout_opt_ PVOID Context,
5057 _In_ PHYSICAL_ADDRESS BusAddress,
5058 _In_ ULONG Length,
5059 _Out_ PULONG AddressSpace,
5060 _Out_ PPHYSICAL_ADDRESS TranslatedAddress);
5061 typedef TRANSLATE_BUS_ADDRESS *PTRANSLATE_BUS_ADDRESS;
5062
5063 _Function_class_(GET_DMA_ADAPTER)
5064 _IRQL_requires_same_
5065 typedef struct _DMA_ADAPTER*
5066 (NTAPI GET_DMA_ADAPTER)(
5067 _Inout_opt_ PVOID Context,
5068 _In_ struct _DEVICE_DESCRIPTION *DeviceDescriptor,
5069 _Out_ PULONG NumberOfMapRegisters);
5070 typedef GET_DMA_ADAPTER *PGET_DMA_ADAPTER;
5071
5072 _Function_class_(GET_SET_DEVICE_DATA)
5073 _IRQL_requires_same_
5074 typedef ULONG
5075 (NTAPI GET_SET_DEVICE_DATA)(
5076 _Inout_opt_ PVOID Context,
5077 _In_ ULONG DataType,
5078 _Inout_updates_bytes_(Length) PVOID Buffer,
5079 _In_ ULONG Offset,
5080 _In_ ULONG Length);
5081 typedef GET_SET_DEVICE_DATA *PGET_SET_DEVICE_DATA;
5082
5083 typedef enum _DEVICE_INSTALL_STATE {
5084 InstallStateInstalled,
5085 InstallStateNeedsReinstall,
5086 InstallStateFailedInstall,
5087 InstallStateFinishInstall
5088 } DEVICE_INSTALL_STATE, *PDEVICE_INSTALL_STATE;
5089
5090 typedef struct _LEGACY_BUS_INFORMATION {
5091 GUID BusTypeGuid;
5092 INTERFACE_TYPE LegacyBusType;
5093 ULONG BusNumber;
5094 } LEGACY_BUS_INFORMATION, *PLEGACY_BUS_INFORMATION;
5095
5096 typedef enum _DEVICE_REMOVAL_POLICY {
5097 RemovalPolicyExpectNoRemoval = 1,
5098 RemovalPolicyExpectOrderlyRemoval = 2,
5099 RemovalPolicyExpectSurpriseRemoval = 3
5100 } DEVICE_REMOVAL_POLICY, *PDEVICE_REMOVAL_POLICY;
5101
5102 typedef VOID
5103 (NTAPI *PREENUMERATE_SELF)(
5104 _In_ PVOID Context);
5105
5106 typedef struct _REENUMERATE_SELF_INTERFACE_STANDARD {
5107 USHORT Size;
5108 USHORT Version;
5109 PVOID Context;
5110 PINTERFACE_REFERENCE InterfaceReference;
5111 PINTERFACE_DEREFERENCE InterfaceDereference;
5112 PREENUMERATE_SELF SurpriseRemoveAndReenumerateSelf;
5113 } REENUMERATE_SELF_INTERFACE_STANDARD, *PREENUMERATE_SELF_INTERFACE_STANDARD;
5114
5115 typedef VOID
5116 (NTAPI *PIO_DEVICE_EJECT_CALLBACK)(
5117 _In_ NTSTATUS Status,
5118 _Inout_opt_ PVOID Context);
5119
5120 #define PCI_DEVICE_PRESENT_INTERFACE_VERSION 1
5121
5122 /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
5123 #define PCI_USE_SUBSYSTEM_IDS 0x00000001
5124 #define PCI_USE_REVISION 0x00000002
5125 #define PCI_USE_VENDEV_IDS 0x00000004
5126 #define PCI_USE_CLASS_SUBCLASS 0x00000008
5127 #define PCI_USE_PROGIF 0x00000010
5128 #define PCI_USE_LOCAL_BUS 0x00000020
5129 #define PCI_USE_LOCAL_DEVICE 0x00000040
5130
5131 typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS {
5132 ULONG Size;
5133 ULONG Flags;
5134 USHORT VendorID;
5135 USHORT DeviceID;
5136 UCHAR RevisionID;
5137 USHORT SubVendorID;
5138 USHORT SubSystemID;
5139 UCHAR BaseClass;
5140 UCHAR SubClass;
5141 UCHAR ProgIf;
5142 } PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS;
5143
5144 _IRQL_requires_max_(PASSIVE_LEVEL)
5145 _Must_inspect_result_
5146 typedef BOOLEAN
5147 (NTAPI PCI_IS_DEVICE_PRESENT)(
5148 _In_ USHORT VendorID,
5149 _In_ USHORT DeviceID,
5150 _In_ UCHAR RevisionID,
5151 _In_ USHORT SubVendorID,
5152 _In_ USHORT SubSystemID,
5153 _In_ ULONG Flags);
5154 typedef PCI_IS_DEVICE_PRESENT *PPCI_IS_DEVICE_PRESENT;
5155
5156 _IRQL_requires_max_(PASSIVE_LEVEL)
5157 _Must_inspect_result_
5158 typedef BOOLEAN
5159 (NTAPI PCI_IS_DEVICE_PRESENT_EX)(
5160 _In_ PVOID Context,
5161 _In_ PPCI_DEVICE_PRESENCE_PARAMETERS Parameters);
5162 typedef PCI_IS_DEVICE_PRESENT_EX *PPCI_IS_DEVICE_PRESENT_EX;
5163
5164 typedef struct _BUS_INTERFACE_STANDARD {
5165 USHORT Size;
5166 USHORT Version;
5167 PVOID Context;
5168 PINTERFACE_REFERENCE InterfaceReference;
5169 PINTERFACE_DEREFERENCE InterfaceDereference;
5170 PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
5171 PGET_DMA_ADAPTER GetDmaAdapter;
5172 PGET_SET_DEVICE_DATA SetBusData;
5173 PGET_SET_DEVICE_DATA GetBusData;
5174 } BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
5175
5176 typedef struct _PCI_DEVICE_PRESENT_INTERFACE {
5177 USHORT Size;
5178 USHORT Version;
5179 PVOID Context;
5180 PINTERFACE_REFERENCE InterfaceReference;
5181 PINTERFACE_DEREFERENCE InterfaceDereference;
5182 PPCI_IS_DEVICE_PRESENT IsDevicePresent;
5183 PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx;
5184 } PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE;
5185
5186 _Struct_size_bytes_(Size)
5187 typedef struct _DEVICE_CAPABILITIES {
5188 _Field_range_(==, sizeof(struct _DEVICE_CAPABILITIES)) USHORT Size;
5189 USHORT Version;
5190 ULONG DeviceD1:1;
5191 ULONG DeviceD2:1;
5192 ULONG LockSupported:1;
5193 ULONG EjectSupported:1;
5194 ULONG Removable:1;
5195 ULONG DockDevice:1;
5196 ULONG UniqueID:1;
5197 ULONG SilentInstall:1;
5198 ULONG RawDeviceOK:1;
5199 ULONG SurpriseRemovalOK:1;
5200 ULONG WakeFromD0:1;
5201 ULONG WakeFromD1:1;
5202 ULONG WakeFromD2:1;
5203 ULONG WakeFromD3:1;
5204 ULONG HardwareDisabled:1;
5205 ULONG NonDynamic:1;
5206 ULONG WarmEjectSupported:1;
5207 ULONG NoDisplayInUI:1;
5208 ULONG Reserved:14;
5209 ULONG Address;
5210 ULONG UINumber;
5211 DEVICE_POWER_STATE DeviceState[PowerSystemMaximum];
5212 SYSTEM_POWER_STATE SystemWake;
5213 DEVICE_POWER_STATE DeviceWake;
5214 ULONG D1Latency;
5215 ULONG D2Latency;
5216 ULONG D3Latency;
5217 } DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
5218
5219 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
5220 USHORT Version;
5221 USHORT Size;
5222 GUID Event;
5223 GUID InterfaceClassGuid;
5224 PUNICODE_STRING SymbolicLinkName;
5225 } DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
5226
5227 typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
5228 USHORT Version;
5229 USHORT Size;
5230 GUID Event;
5231 } HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
5232
5233 #undef INTERFACE
5234
5235 typedef struct _INTERFACE {
5236 USHORT Size;
5237 USHORT Version;
5238 PVOID Context;
5239 PINTERFACE_REFERENCE InterfaceReference;
5240 PINTERFACE_DEREFERENCE InterfaceDereference;
5241 } INTERFACE, *PINTERFACE;
5242
5243 typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
5244 USHORT Version;
5245 USHORT Size;
5246 GUID Event;
5247 } PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
5248
5249 typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
5250
5251 /* PNP_DEVICE_STATE */
5252
5253 #define PNP_DEVICE_DISABLED 0x00000001
5254 #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
5255 #define PNP_DEVICE_FAILED 0x00000004
5256 #define PNP_DEVICE_REMOVED 0x00000008
5257 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
5258 #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
5259
5260 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
5261 USHORT Version;
5262 USHORT Size;
5263 GUID Event;
5264 struct _FILE_OBJECT *FileObject;
5265 LONG NameBufferOffset;
5266 UCHAR CustomDataBuffer[1];
5267 } TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
5268
5269 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
5270 USHORT Version;
5271 USHORT Size;
5272 GUID Event;
5273 struct _FILE_OBJECT *FileObject;
5274 } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
5275
5276 #if (NTDDI_VERSION >= NTDDI_VISTA)
5277 #include <devpropdef.h>
5278 #define PLUGPLAY_PROPERTY_PERSISTENT 0x00000001
5279 #endif
5280
5281 #define PNP_REPLACE_NO_MAP MAXLONGLONG
5282
5283 _Must_inspect_result_
5284 typedef NTSTATUS
5285 (NTAPI *PREPLACE_MAP_MEMORY)(
5286 _In_ PHYSICAL_ADDRESS TargetPhysicalAddress,
5287 _In_ PHYSICAL_ADDRESS SparePhysicalAddress,
5288 _Inout_ PLARGE_INTEGER NumberOfBytes,
5289 _Outptr_ PVOID *TargetAddress,
5290 _Outptr_ PVOID *SpareAddress);
5291
5292 typedef struct _PNP_REPLACE_MEMORY_LIST {
5293 ULONG AllocatedCount;
5294 ULONG Count;
5295 ULONGLONG TotalLength;
5296 struct {
5297 PHYSICAL_ADDRESS Address;
5298 ULONGLONG Length;
5299 } Ranges[ANYSIZE_ARRAY];
5300 } PNP_REPLACE_MEMORY_LIST, *PPNP_REPLACE_MEMORY_LIST;
5301
5302 typedef struct _PNP_REPLACE_PROCESSOR_LIST {
5303 PKAFFINITY Affinity;
5304 _Field_range_(<=, MAXIMUM_GROUPS) ULONG GroupCount;
5305 ULONG AllocatedCount;
5306 ULONG Count;
5307 ULONG ApicIds[ANYSIZE_ARRAY];
5308 } PNP_REPLACE_PROCESSOR_LIST, *PPNP_REPLACE_PROCESSOR_LIST;
5309
5310 typedef struct _PNP_REPLACE_PROCESSOR_LIST_V1 {
5311 KAFFINITY AffinityMask;
5312 ULONG AllocatedCount;
5313 ULONG Count;
5314 ULONG ApicIds[ANYSIZE_ARRAY];
5315 } PNP_REPLACE_PROCESSOR_LIST_V1, *PPNP_REPLACE_PROCESSOR_LIST_V1;
5316
5317 #define PNP_REPLACE_PARAMETERS_VERSION 2
5318
5319 typedef struct _PNP_REPLACE_PARAMETERS {
5320 ULONG Size;
5321 ULONG Version;
5322 ULONG64 Target;
5323 ULONG64 Spare;
5324 PPNP_REPLACE_PROCESSOR_LIST TargetProcessors;
5325 PPNP_REPLACE_PROCESSOR_LIST SpareProcessors;
5326 PPNP_REPLACE_MEMORY_LIST TargetMemory;
5327 PPNP_REPLACE_MEMORY_LIST SpareMemory;
5328 PREPLACE_MAP_MEMORY MapMemory;
5329 } PNP_REPLACE_PARAMETERS, *PPNP_REPLACE_PARAMETERS;
5330
5331 typedef VOID
5332 (NTAPI *PREPLACE_UNLOAD)(
5333 VOID);
5334
5335 _Must_inspect_result_
5336 typedef NTSTATUS
5337 (NTAPI *PREPLACE_BEGIN)(
5338 _In_ PPNP_REPLACE_PARAMETERS Parameters,
5339 _Outptr_ PVOID *Context);
5340
5341 _Must_inspect_result_
5342 typedef NTSTATUS
5343 (NTAPI *PREPLACE_END)(
5344 _In_ PVOID Context);
5345
5346 _Must_inspect_result_
5347 typedef NTSTATUS
5348 (NTAPI *PREPLACE_MIRROR_PHYSICAL_MEMORY)(
5349 _In_ PVOID Context,
5350 _In_ PHYSICAL_ADDRESS PhysicalAddress,
5351 _In_ LARGE_INTEGER ByteCount);
5352
5353 _Must_inspect_result_
5354 typedef NTSTATUS
5355 (NTAPI *PREPLACE_SET_PROCESSOR_ID)(
5356 _In_ PVOID Context,
5357 _In_ ULONG ApicId,
5358 _In_ BOOLEAN Target);
5359
5360 _Must_inspect_result_
5361 typedef NTSTATUS
5362 (NTAPI *PREPLACE_SWAP)(
5363 _In_ PVOID Context);
5364
5365 _Must_inspect_result_
5366 typedef NTSTATUS
5367 (NTAPI *PREPLACE_INITIATE_HARDWARE_MIRROR)(
5368 _In_ PVOID Context);
5369
5370 _Must_inspect_result_
5371 typedef NTSTATUS
5372 (NTAPI *PREPLACE_MIRROR_PLATFORM_MEMORY)(
5373 _In_ PVOID Context);
5374
5375 _Must_inspect_result_
5376 typedef NTSTATUS
5377 (NTAPI *PREPLACE_GET_MEMORY_DESTINATION)(
5378 _In_ PVOID Context,
5379 _In_ PHYSICAL_ADDRESS SourceAddress,
5380 _Out_ PPHYSICAL_ADDRESS DestinationAddress);
5381
5382 _Must_inspect_result_
5383 typedef NTSTATUS
5384 (NTAPI *PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE)(
5385 _In_ PVOID Context,
5386 _In_ BOOLEAN Enable);
5387
5388 #define PNP_REPLACE_DRIVER_INTERFACE_VERSION 1
5389 #define PNP_REPLACE_DRIVER_INTERFACE_MINIMUM_SIZE \
5390 FIELD_OFFSET(PNP_REPLACE_DRIVER_INTERFACE, InitiateHardwareMirror)
5391
5392 #define PNP_REPLACE_MEMORY_SUPPORTED 0x0001
5393 #define PNP_REPLACE_PROCESSOR_SUPPORTED 0x0002
5394 #define PNP_REPLACE_HARDWARE_MEMORY_MIRRORING 0x0004
5395 #define PNP_REPLACE_HARDWARE_PAGE_COPY 0x0008
5396 #define PNP_REPLACE_HARDWARE_QUIESCE 0x0010
5397
5398 typedef struct _PNP_REPLACE_DRIVER_INTERFACE {
5399 ULONG Size;
5400 ULONG Version;
5401 ULONG Flags;
5402 PREPLACE_UNLOAD Unload;
5403 PREPLACE_BEGIN BeginReplace;
5404 PREPLACE_END EndReplace;
5405 PREPLACE_MIRROR_PHYSICAL_MEMORY MirrorPhysicalMemory;
5406 PREPLACE_SET_PROCESSOR_ID SetProcessorId;
5407 PREPLACE_SWAP Swap;
5408 PREPLACE_INITIATE_HARDWARE_MIRROR InitiateHardwareMirror;
5409 PREPLACE_MIRROR_PLATFORM_MEMORY MirrorPlatformMemory;
5410 PREPLACE_GET_MEMORY_DESTINATION GetMemoryDestination;
5411 PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE EnableDisableHardwareQuiesce;
5412 } PNP_REPLACE_DRIVER_INTERFACE, *PPNP_REPLACE_DRIVER_INTERFACE;
5413
5414 _Must_inspect_result_
5415 typedef NTSTATUS
5416 (NTAPI *PREPLACE_DRIVER_INIT)(
5417 _Inout_ PPNP_REPLACE_DRIVER_INTERFACE Interface,
5418 _In_ PVOID Unused);
5419
5420 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
5421 DeviceUsageTypeUndefined,
5422 DeviceUsageTypePaging,
5423 DeviceUsageTypeHibernation,
5424 DeviceUsageTypeDumpFile
5425 } DEVICE_USAGE_NOTIFICATION_TYPE;
5426
5427 typedef struct _POWER_SEQUENCE {
5428 ULONG SequenceD1;
5429 ULONG SequenceD2;
5430 ULONG SequenceD3;
5431 } POWER_SEQUENCE, *PPOWER_SEQUENCE;
5432
5433 #ifdef _PREFAST_
5434 #define __string_type 0x1000
5435 #define __guid_type 0x2000
5436 #define __multiString_type 0x4000
5437 #else
5438 #define __string_type 0
5439 #define __guid_type 0
5440 #define __multiString_type 0
5441 #endif
5442
5443 typedef enum {
5444 DevicePropertyDeviceDescription = 0x0 | __string_type,
5445 DevicePropertyHardwareID = 0x1 | __multiString_type,
5446 DevicePropertyCompatibleIDs = 0x2 | __multiString_type,
5447 DevicePropertyBootConfiguration = 0x3,
5448 DevicePropertyBootConfigurationTranslated = 0x4,
5449 DevicePropertyClassName = 0x5 | __string_type,
5450 DevicePropertyClassGuid = 0x6 | __string_type,
5451 DevicePropertyDriverKeyName = 0x7 | __string_type,
5452 DevicePropertyManufacturer = 0x8 | __string_type,
5453 DevicePropertyFriendlyName = 0x9 | __string_type,
5454 DevicePropertyLocationInformation = 0xa | __string_type,
5455 DevicePropertyPhysicalDeviceObjectName = 0xb | __string_type,
5456 DevicePropertyBusTypeGuid = 0xc | __guid_type,
5457 DevicePropertyLegacyBusType = 0xd,
5458 DevicePropertyBusNumber = 0xe,
5459 DevicePropertyEnumeratorName = 0xf | __string_type,
5460 DevicePropertyAddress = 0x10,
5461 DevicePropertyUINumber = 0x11,
5462 DevicePropertyInstallState = 0x12,
5463 DevicePropertyRemovalPolicy = 0x13,
5464 DevicePropertyResourceRequirements = 0x14,
5465 DevicePropertyAllocatedResources = 0x15,
5466 DevicePropertyContainerID = 0x16 | __string_type
5467 } DEVICE_REGISTRY_PROPERTY;
5468
5469 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
5470 EventCategoryReserved,
5471 EventCategoryHardwareProfileChange,
5472 EventCategoryDeviceInterfaceChange,
5473 EventCategoryTargetDeviceChange
5474 } IO_NOTIFICATION_EVENT_CATEGORY;
5475
5476 typedef enum _IO_PRIORITY_HINT {
5477 IoPriorityVeryLow = 0,
5478 IoPriorityLow,
5479 IoPriorityNormal,
5480 IoPriorityHigh,
5481 IoPriorityCritical,
5482 MaxIoPriorityTypes
5483 } IO_PRIORITY_HINT;
5484
5485 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
5486
5487 _Function_class_(DRIVER_NOTIFICATION_CALLBACK_ROUTINE)
5488 _IRQL_requires_max_(PASSIVE_LEVEL)
5489 typedef NTSTATUS
5490 (NTAPI DRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
5491 _In_ PVOID NotificationStructure,
5492 _Inout_opt_ PVOID Context);
5493 typedef DRIVER_NOTIFICATION_CALLBACK_ROUTINE *PDRIVER_NOTIFICATION_CALLBACK_ROUTINE;
5494
5495 _Function_class_(DEVICE_CHANGE_COMPLETE_CALLBACK)
5496 _IRQL_requires_same_
5497 typedef VOID
5498 (NTAPI DEVICE_CHANGE_COMPLETE_CALLBACK)(
5499 _Inout_opt_ PVOID Context);
5500 typedef DEVICE_CHANGE_COMPLETE_CALLBACK *PDEVICE_CHANGE_COMPLETE_CALLBACK;
5501
5502 typedef enum _FILE_INFORMATION_CLASS {
5503 FileDirectoryInformation = 1,
5504 FileFullDirectoryInformation,
5505 FileBothDirectoryInformation,
5506 FileBasicInformation,
5507 FileStandardInformation,
5508 FileInternalInformation,
5509 FileEaInformation,
5510 FileAccessInformation,
5511 FileNameInformation,
5512 FileRenameInformation,
5513 FileLinkInformation,
5514 FileNamesInformation,
5515 FileDispositionInformation,
5516 FilePositionInformation,
5517 FileFullEaInformation,
5518 FileModeInformation,
5519 FileAlignmentInformation,
5520 FileAllInformation,
5521 FileAllocationInformation,
5522 FileEndOfFileInformation,
5523 FileAlternateNameInformation,
5524 FileStreamInformation,
5525 FilePipeInformation,
5526 FilePipeLocalInformation,
5527 FilePipeRemoteInformation,
5528 FileMailslotQueryInformation,
5529 FileMailslotSetInformation,
5530 FileCompressionInformation,
5531 FileObjectIdInformation,
5532 FileCompletionInformation,
5533 FileMoveClusterInformation,
5534 FileQuotaInformation,
5535 FileReparsePointInformation,
5536 FileNetworkOpenInformation,
5537 FileAttributeTagInformation,
5538 FileTrackingInformation,
5539 FileIdBothDirectoryInformation,
5540 FileIdFullDirectoryInformation,
5541 FileValidDataLengthInformation,
5542 FileShortNameInformation,
5543 #if (NTDDI_VERSION >= NTDDI_VISTA)
5544 FileIoCompletionNotificationInformation,
5545 FileIoStatusBlockRangeInformation,
5546 FileIoPriorityHintInformation,
5547 FileSfioReserveInformation,
5548 FileSfioVolumeInformation,
5549 FileHardLinkInformation,
5550 FileProcessIdsUsingFileInformation,
5551 FileNormalizedNameInformation,
5552 FileNetworkPhysicalNameInformation,
5553 #endif
5554 #if (NTDDI_VERSION >= NTDDI_WIN7)
5555 FileIdGlobalTxDirectoryInformation,
5556 FileIsRemoteDeviceInformation,
5557 FileAttributeCacheInformation,
5558 FileNumaNodeInformation,
5559 FileStandardLinkInformation,
5560 FileRemoteProtocolInformation,
5561 #endif
5562 FileMaximumInformation
5563 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
5564
5565 typedef struct _FILE_POSITION_INFORMATION {
5566 LARGE_INTEGER CurrentByteOffset;
5567 } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
5568
5569 typedef struct _FILE_BASIC_INFORMATION {
5570 LARGE_INTEGER CreationTime;
5571 LARGE_INTEGER LastAccessTime;
5572 LARGE_INTEGER LastWriteTime;
5573 LARGE_INTEGER ChangeTime;
5574 ULONG FileAttributes;
5575 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
5576
5577 typedef struct _FILE_IO_PRIORITY_HINT_INFORMATION {
5578 IO_PRIORITY_HINT PriorityHint;
5579 } FILE_IO_PRIORITY_HINT_INFORMATION, *PFILE_IO_PRIORITY_HINT_INFORMATION;
5580
5581 typedef struct _FILE_IO_COMPLETION_NOTIFICATION_INFORMATION {
5582 ULONG Flags;
5583 } FILE_IO_COMPLETION_NOTIFICATION_INFORMATION, *PFILE_IO_COMPLETION_NOTIFICATION_INFORMATION;
5584
5585 typedef struct _FILE_IOSTATUSBLOCK_RANGE_INFORMATION {
5586 PUCHAR IoStatusBlockRange;
5587 ULONG Length;
5588 } FILE_IOSTATUSBLOCK_RANGE_INFORMATION, *PFILE_IOSTATUSBLOCK_RANGE_INFORMATION;
5589
5590 typedef struct _FILE_IS_REMOTE_DEVICE_INFORMATION {
5591 BOOLEAN IsRemote;
5592 } FILE_IS_REMOTE_DEVICE_INFORMATION, *PFILE_IS_REMOTE_DEVICE_INFORMATION;
5593
5594 typedef struct _FILE_NUMA_NODE_INFORMATION {
5595 USHORT NodeNumber;
5596 } FILE_NUMA_NODE_INFORMATION, *PFILE_NUMA_NODE_INFORMATION;
5597
5598 typedef struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION {
5599 ULONG NumberOfProcessIdsInList;
5600 ULONG_PTR ProcessIdList[1];
5601 } FILE_PROCESS_IDS_USING_FILE_INFORMATION, *PFILE_PROCESS_IDS_USING_FILE_INFORMATION;
5602
5603 typedef struct _FILE_STANDARD_INFORMATION {
5604 LARGE_INTEGER AllocationSize;
5605 LARGE_INTEGER EndOfFile;
5606 ULONG NumberOfLinks;
5607 BOOLEAN DeletePending;
5608 BOOLEAN Directory;
5609 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
5610
5611 typedef struct _FILE_NETWORK_OPEN_INFORMATION {
5612 LARGE_INTEGER CreationTime;
5613 LARGE_INTEGER LastAccessTime;
5614 LARGE_INTEGER LastWriteTime;
5615 LARGE_INTEGER ChangeTime;
5616 LARGE_INTEGER AllocationSize;
5617 LARGE_INTEGER EndOfFile;
5618 ULONG FileAttributes;
5619 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
5620
5621 typedef enum _FSINFOCLASS {
5622 FileFsVolumeInformation = 1,
5623 FileFsLabelInformation,
5624 FileFsSizeInformation,
5625 FileFsDeviceInformation,
5626 FileFsAttributeInformation,
5627 FileFsControlInformation,
5628 FileFsFullSizeInformation,
5629 FileFsObjectIdInformation,
5630 FileFsDriverPathInformation,
5631 FileFsVolumeFlagsInformation,
5632 FileFsMaximumInformation
5633 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
5634
5635 typedef struct _FILE_FS_DEVICE_INFORMATION {
5636 DEVICE_TYPE DeviceType;
5637 ULONG Characteristics;
5638 } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
5639
5640 typedef struct _FILE_FULL_EA_INFORMATION {
5641 ULONG NextEntryOffset;
5642 UCHAR Flags;
5643 UCHAR EaNameLength;
5644 USHORT EaValueLength;
5645 CHAR EaName[1];
5646 } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
5647
5648 typedef struct _FILE_SFIO_RESERVE_INFORMATION {
5649 ULONG RequestsPerPeriod;
5650 ULONG Period;
5651 BOOLEAN RetryFailures;
5652 BOOLEAN Discardable;
5653 ULONG RequestSize;
5654 ULONG NumOutstandingRequests;
5655 } FILE_SFIO_RESERVE_INFORMATION, *PFILE_SFIO_RESERVE_INFORMATION;
5656
5657 typedef struct _FILE_SFIO_VOLUME_INFORMATION {
5658 ULONG MaximumRequestsPerPeriod;
5659 ULONG MinimumPeriod;
5660 ULONG MinimumTransferSize;
5661 } FILE_SFIO_VOLUME_INFORMATION, *PFILE_SFIO_VOLUME_INFORMATION;
5662
5663 #define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 0x1
5664 #define FILE_SKIP_SET_EVENT_ON_HANDLE 0x2
5665 #define FILE_SKIP_SET_USER_EVENT_ON_FAST_IO 0x4
5666
5667 #define FM_LOCK_BIT (0x1)
5668 #define FM_LOCK_BIT_V (0x0)
5669 #define FM_LOCK_WAITER_WOKEN (0x2)
5670 #define FM_LOCK_WAITER_INC (0x4)
5671
5672 _Function_class_(FAST_IO_CHECK_IF_POSSIBLE)
5673 _IRQL_requires_same_
5674 typedef BOOLEAN
5675 (NTAPI FAST_IO_CHECK_IF_POSSIBLE)(
5676 _In_ struct _FILE_OBJECT *FileObject,
5677 _In_ PLARGE_INTEGER FileOffset,
5678 _In_ ULONG Length,
5679 _In_ BOOLEAN Wait,
5680 _In_ ULONG LockKey,
5681 _In_ BOOLEAN CheckForReadOperation,
5682 _Out_ PIO_STATUS_BLOCK IoStatus,
5683 _In_ struct _DEVICE_OBJECT *DeviceObject);
5684 typedef FAST_IO_CHECK_IF_POSSIBLE *PFAST_IO_CHECK_IF_POSSIBLE;
5685
5686 _Function_class_(FAST_IO_READ)
5687 _IRQL_requires_same_
5688 typedef BOOLEAN
5689 (NTAPI FAST_IO_READ)(
5690 _In_ struct _FILE_OBJECT *FileObject,
5691 _In_ PLARGE_INTEGER FileOffset,
5692 _In_ ULONG Length,
5693 _In_ BOOLEAN Wait,
5694 _In_ ULONG LockKey,
5695 _Out_ PVOID Buffer,
5696 _Out_ PIO_STATUS_BLOCK IoStatus,
5697 _In_ struct _DEVICE_OBJECT *DeviceObject);
5698 typedef FAST_IO_READ *PFAST_IO_READ;
5699
5700 _Function_class_(FAST_IO_WRITE)
5701 _IRQL_requires_same_
5702 typedef BOOLEAN
5703 (NTAPI FAST_IO_WRITE)(
5704 _In_ struct _FILE_OBJECT *FileObject,
5705 _In_ PLARGE_INTEGER FileOffset,
5706 _In_ ULONG Length,
5707 _In_ BOOLEAN Wait,
5708 _In_ ULONG LockKey,
5709 _In_ PVOID Buffer,
5710 _Out_ PIO_STATUS_BLOCK IoStatus,
5711 _In_ struct _DEVICE_OBJECT *DeviceObject);
5712 typedef FAST_IO_WRITE *PFAST_IO_WRITE;
5713
5714 _Function_class_(FAST_IO_QUERY_BASIC_INFO)
5715 _IRQL_requires_same_
5716 typedef BOOLEAN
5717 (NTAPI FAST_IO_QUERY_BASIC_INFO)(
5718 _In_ struct _FILE_OBJECT *FileObject,
5719 _In_ BOOLEAN Wait,
5720 _Out_ PFILE_BASIC_INFORMATION Buffer,
5721 _Out_ PIO_STATUS_BLOCK IoStatus,
5722 _In_ struct _DEVICE_OBJECT *DeviceObject);
5723 typedef FAST_IO_QUERY_BASIC_INFO *PFAST_IO_QUERY_BASIC_INFO;
5724
5725 _Function_class_(FAST_IO_QUERY_STANDARD_INFO)
5726 _IRQL_requires_same_
5727 typedef BOOLEAN
5728 (NTAPI FAST_IO_QUERY_STANDARD_INFO)(
5729 _In_ struct _FILE_OBJECT *FileObject,
5730 _In_ BOOLEAN Wait,
5731 _Out_ PFILE_STANDARD_INFORMATION Buffer,
5732 _Out_ PIO_STATUS_BLOCK IoStatus,
5733 _In_ struct _DEVICE_OBJECT *DeviceObject);
5734 typedef FAST_IO_QUERY_STANDARD_INFO *PFAST_IO_QUERY_STANDARD_INFO;
5735
5736 _Function_class_(FAST_IO_LOCK)
5737 _IRQL_requires_same_
5738 typedef BOOLEAN
5739 (NTAPI FAST_IO_LOCK)(
5740 _In_ struct _FILE_OBJECT *FileObject,
5741 _In_ PLARGE_INTEGER FileOffset,
5742 _In_ PLARGE_INTEGER Length,
5743 _In_ PEPROCESS ProcessId,
5744 _In_ ULONG Key,
5745 _In_ BOOLEAN FailImmediately,
5746 _In_ BOOLEAN ExclusiveLock,
5747 _Out_ PIO_STATUS_BLOCK IoStatus,
5748 _In_ struct _DEVICE_OBJECT *DeviceObject);
5749 typedef FAST_IO_LOCK *PFAST_IO_LOCK;
5750
5751 _Function_class_(FAST_IO_UNLOCK_SINGLE)
5752 _IRQL_requires_same_
5753 typedef BOOLEAN
5754 (NTAPI FAST_IO_UNLOCK_SINGLE)(
5755 _In_ struct _FILE_OBJECT *FileObject,
5756 _In_ PLARGE_INTEGER FileOffset,
5757 _In_ PLARGE_INTEGER Length,
5758 _In_ PEPROCESS ProcessId,
5759 _In_ ULONG Key,
5760 _Out_ PIO_STATUS_BLOCK IoStatus,
5761 _In_ struct _DEVICE_OBJECT *DeviceObject);
5762 typedef FAST_IO_UNLOCK_SINGLE *PFAST_IO_UNLOCK_SINGLE;
5763
5764 _Function_class_(FAST_IO_UNLOCK_ALL)
5765 _IRQL_requires_same_
5766 typedef BOOLEAN
5767 (NTAPI FAST_IO_UNLOCK_ALL)(
5768 _In_ struct _FILE_OBJECT *FileObject,
5769 _In_ PEPROCESS ProcessId,
5770 _Out_ PIO_STATUS_BLOCK IoStatus,
5771 _In_ struct _DEVICE_OBJECT *DeviceObject);
5772 typedef FAST_IO_UNLOCK_ALL *PFAST_IO_UNLOCK_ALL;
5773
5774 _Function_class_(FAST_IO_UNLOCK_ALL_BY_KEY)
5775 _IRQL_requires_same_
5776 typedef BOOLEAN
5777 (NTAPI FAST_IO_UNLOCK_ALL_BY_KEY)(
5778 _In_ struct _FILE_OBJECT *FileObject,
5779 _In_ PVOID ProcessId,
5780 _In_ ULONG Key,
5781 _Out_ PIO_STATUS_BLOCK IoStatus,
5782 _In_ struct _DEVICE_OBJECT *DeviceObject);
5783 typedef FAST_IO_UNLOCK_ALL_BY_KEY *PFAST_IO_UNLOCK_ALL_BY_KEY;
5784
5785 _Function_class_(FAST_IO_DEVICE_CONTROL)
5786 _IRQL_requires_same_
5787 typedef BOOLEAN
5788 (NTAPI FAST_IO_DEVICE_CONTROL)(
5789 _In_ struct _FILE_OBJECT *FileObject,
5790 _In_ BOOLEAN Wait,
5791 _In_opt_ PVOID InputBuffer,
5792 _In_ ULONG InputBufferLength,
5793 _Out_opt_ PVOID OutputBuffer,
5794 _In_ ULONG OutputBufferLength,
5795 _In_ ULONG IoControlCode,
5796 _Out_ PIO_STATUS_BLOCK IoStatus,
5797 _In_ struct _DEVICE_OBJECT *DeviceObject);
5798 typedef FAST_IO_DEVICE_CONTROL *PFAST_IO_DEVICE_CONTROL;
5799
5800 _Function_class_(FAST_IO_ACQUIRE_FILE)
5801 _IRQL_requires_same_
5802 typedef VOID
5803 (NTAPI FAST_IO_ACQUIRE_FILE)(
5804 _In_ struct _FILE_OBJECT *FileObject);
5805 typedef FAST_IO_ACQUIRE_FILE *PFAST_IO_ACQUIRE_FILE;
5806
5807 _Function_class_(FAST_IO_RELEASE_FILE)
5808 _IRQL_requires_same_
5809 typedef VOID
5810 (NTAPI FAST_IO_RELEASE_FILE)(
5811 _In_ struct _FILE_OBJECT *FileObject);
5812 typedef FAST_IO_RELEASE_FILE *PFAST_IO_RELEASE_FILE;
5813
5814 _Function_class_(FAST_IO_DETACH_DEVICE)
5815 _IRQL_requires_same_
5816 typedef VOID
5817 (NTAPI FAST_IO_DETACH_DEVICE)(
5818 _In_ struct _DEVICE_OBJECT *SourceDevice,
5819 _In_ struct _DEVICE_OBJECT *TargetDevice);
5820 typedef FAST_IO_DETACH_DEVICE *PFAST_IO_DETACH_DEVICE;
5821
5822 _Function_class_(FAST_IO_QUERY_NETWORK_OPEN_INFO)
5823 _IRQL_requires_same_
5824 typedef BOOLEAN
5825 (NTAPI FAST_IO_QUERY_NETWORK_OPEN_INFO)(
5826 _In_ struct _FILE_OBJECT *FileObject,
5827 _In_ BOOLEAN Wait,
5828 _Out_ struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
5829 _Out_ struct _IO_STATUS_BLOCK *IoStatus,
5830 _In_ struct _DEVICE_OBJECT *DeviceObject);
5831 typedef FAST_IO_QUERY_NETWORK_OPEN_INFO *PFAST_IO_QUERY_NETWORK_OPEN_INFO;
5832
5833 _Function_class_(FAST_IO_ACQUIRE_FOR_MOD_WRITE)
5834 _IRQL_requires_same_
5835 typedef NTSTATUS
5836 (NTAPI FAST_IO_ACQUIRE_FOR_MOD_WRITE)(
5837 _In_ struct _FILE_OBJECT *FileObject,
5838 _In_ PLARGE_INTEGER EndingOffset,
5839 _Out_ struct _ERESOURCE **ResourceToRelease,
5840 _In_ struct _DEVICE_OBJECT *DeviceObject);
5841 typedef FAST_IO_ACQUIRE_FOR_MOD_WRITE *PFAST_IO_ACQUIRE_FOR_MOD_WRITE;
5842
5843 _Function_class_(FAST_IO_MDL_READ)
5844 _IRQL_requires_same_
5845 typedef BOOLEAN
5846 (NTAPI FAST_IO_MDL_READ)(
5847 _In_ struct _FILE_OBJECT *FileObject,
5848 _In_ PLARGE_INTEGER FileOffset,
5849 _In_ ULONG Length,
5850 _In_ ULONG LockKey,
5851 _Out_ PMDL *MdlChain,
5852 _Out_ PIO_STATUS_BLOCK IoStatus,
5853 _In_ struct _DEVICE_OBJECT *DeviceObject);
5854 typedef FAST_IO_MDL_READ *PFAST_IO_MDL_READ;
5855
5856 _Function_class_(FAST_IO_MDL_READ_COMPLETE)
5857 _IRQL_requires_same_
5858 typedef BOOLEAN
5859 (NTAPI FAST_IO_MDL_READ_COMPLETE)(
5860 _In_ struct _FILE_OBJECT *FileObject,
5861 _In_ PMDL MdlChain,
5862 _In_ struct _DEVICE_OBJECT *DeviceObject);
5863 typedef FAST_IO_MDL_READ_COMPLETE *PFAST_IO_MDL_READ_COMPLETE;
5864
5865 _Function_class_(FAST_IO_PREPARE_MDL_WRITE)
5866 _IRQL_requires_same_
5867 typedef BOOLEAN
5868 (NTAPI FAST_IO_PREPARE_MDL_WRITE)(
5869 _In_ struct _FILE_OBJECT *FileObject,
5870 _In_ PLARGE_INTEGER FileOffset,
5871 _In_ ULONG Length,
5872 _In_ ULONG LockKey,
5873 _Out_ PMDL *MdlChain,
5874 _Out_ PIO_STATUS_BLOCK IoStatus,
5875 _In_ struct _DEVICE_OBJECT *DeviceObject);
5876 typedef FAST_IO_PREPARE_MDL_WRITE *PFAST_IO_PREPARE_MDL_WRITE;
5877
5878 _Function_class_(FAST_IO_MDL_WRITE_COMPLETE)
5879 _IRQL_requires_same_
5880 typedef BOOLEAN
5881 (NTAPI FAST_IO_MDL_WRITE_COMPLETE)(
5882 _In_ struct _FILE_OBJECT *FileObject,
5883 _In_ PLARGE_INTEGER FileOffset,
5884 _In_ PMDL MdlChain,
5885 _In_ struct _DEVICE_OBJECT *DeviceObject);
5886 typedef FAST_IO_MDL_WRITE_COMPLETE *PFAST_IO_MDL_WRITE_COMPLETE;
5887
5888 _Function_class_(FAST_IO_READ_COMPRESSED)
5889 _IRQL_requires_same_
5890 typedef BOOLEAN
5891 (NTAPI FAST_IO_READ_COMPRESSED)(
5892 _In_ struct _FILE_OBJECT *FileObject,
5893 _In_ PLARGE_INTEGER FileOffset,
5894 _In_ ULONG Length,
5895 _In_ ULONG LockKey,
5896 _Out_ PVOID Buffer,
5897 _Out_ PMDL *MdlChain,
5898 _Out_ PIO_STATUS_BLOCK IoStatus,
5899 _Out_ struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
5900 _In_ ULONG CompressedDataInfoLength,
5901 _In_ struct _DEVICE_OBJECT *DeviceObject);
5902 typedef FAST_IO_READ_COMPRESSED *PFAST_IO_READ_COMPRESSED;
5903
5904 _Function_class_(FAST_IO_WRITE_COMPRESSED)
5905 _IRQL_requires_same_
5906 typedef BOOLEAN
5907 (NTAPI FAST_IO_WRITE_COMPRESSED)(
5908 _In_ struct _FILE_OBJECT *FileObject,
5909 _In_ PLARGE_INTEGER FileOffset,
5910 _In_ ULONG Length,
5911 _In_ ULONG LockKey,
5912 _In_ PVOID Buffer,
5913 _Out_ PMDL *MdlChain,
5914 _Out_ PIO_STATUS_BLOCK IoStatus,
5915 _In_ struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
5916 _In_ ULONG CompressedDataInfoLength,
5917 _In_ struct _DEVICE_OBJECT *DeviceObject);
5918 typedef FAST_IO_WRITE_COMPRESSED *PFAST_IO_WRITE_COMPRESSED;
5919
5920 _Function_class_(FAST_IO_MDL_READ_COMPLETE_COMPRESSED)
5921 _IRQL_requires_same_
5922 typedef BOOLEAN
5923 (NTAPI FAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
5924 _In_ struct _FILE_OBJECT *FileObject,
5925 _In_ PMDL MdlChain,
5926 _In_ struct _DEVICE_OBJECT *DeviceObject);
5927 typedef FAST_IO_MDL_READ_COMPLETE_COMPRESSED *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED;
5928
5929 _Function_class_(FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)
5930 _IRQL_requires_same_
5931 typedef BOOLEAN
5932 (NTAPI FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
5933 _In_ struct _FILE_OBJECT *FileObject,
5934 _In_ PLARGE_INTEGER FileOffset,
5935 _In_ PMDL MdlChain,
5936 _In_ struct _DEVICE_OBJECT *DeviceObject);
5937 typedef FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED;
5938
5939 _Function_class_(FAST_IO_QUERY_OPEN)
5940 _IRQL_requires_same_
5941 typedef BOOLEAN
5942 (NTAPI FAST_IO_QUERY_OPEN)(
5943 _Inout_ struct _IRP *Irp,
5944 _Out_ PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
5945 _In_ struct _DEVICE_OBJECT *DeviceObject);
5946 typedef FAST_IO_QUERY_OPEN *PFAST_IO_QUERY_OPEN;
5947
5948 _Function_class_(FAST_IO_RELEASE_FOR_MOD_WRITE)
5949 _IRQL_requires_same_
5950 typedef NTSTATUS
5951 (NTAPI FAST_IO_RELEASE_FOR_MOD_WRITE)(
5952 _In_ struct _FILE_OBJECT *FileObject,
5953 _In_ struct _ERESOURCE *ResourceToRelease,
5954 _In_ struct _DEVICE_OBJECT *DeviceObject);
5955 typedef FAST_IO_RELEASE_FOR_MOD_WRITE *PFAST_IO_RELEASE_FOR_MOD_WRITE;
5956
5957 _Function_class_(FAST_IO_ACQUIRE_FOR_CCFLUSH)
5958 _IRQL_requires_same_
5959 typedef NTSTATUS
5960 (NTAPI FAST_IO_ACQUIRE_FOR_CCFLUSH)(
5961 _In_ struct _FILE_OBJECT *FileObject,
5962 _In_ struct _DEVICE_OBJECT *DeviceObject);
5963 typedef FAST_IO_ACQUIRE_FOR_CCFLUSH *PFAST_IO_ACQUIRE_FOR_CCFLUSH;
5964
5965 _Function_class_(FAST_IO_RELEASE_FOR_CCFLUSH)
5966 _IRQL_requires_same_
5967 typedef NTSTATUS
5968 (NTAPI FAST_IO_RELEASE_FOR_CCFLUSH)(
5969 _In_ struct _FILE_OBJECT *FileObject,
5970 _In_ struct _DEVICE_OBJECT *DeviceObject);
5971 typedef FAST_IO_RELEASE_FOR_CCFLUSH *PFAST_IO_RELEASE_FOR_CCFLUSH;
5972
5973 typedef struct _FAST_IO_DISPATCH {
5974 ULONG SizeOfFastIoDispatch;
5975 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible;
5976 PFAST_IO_READ FastIoRead;
5977 PFAST_IO_WRITE FastIoWrite;
5978 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo;
5979 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo;
5980 PFAST_IO_LOCK FastIoLock;
5981 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle;
5982 PFAST_IO_UNLOCK_ALL FastIoUnlockAll;
5983 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey;
5984 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl;
5985 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection;
5986 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection;
5987 PFAST_IO_DETACH_DEVICE FastIoDetachDevice;
5988 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo;
5989 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite;
5990 PFAST_IO_MDL_READ MdlRead;
5991 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete;
5992 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite;
5993 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete;
5994 PFAST_IO_READ_COMPRESSED FastIoReadCompressed;
5995 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed;
5996 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed;
5997 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed;
5998 PFAST_IO_QUERY_OPEN FastIoQueryOpen;
5999 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite;
6000 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush;
6001 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush;
6002 } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
6003
6004 typedef struct _SECTION_OBJECT_POINTERS {
6005 PVOID DataSectionObject;
6006 PVOID SharedCacheMap;
6007 PVOID ImageSectionObject;
6008 } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
6009
6010 typedef struct _IO_COMPLETION_CONTEXT {
6011 PVOID Port;
6012 PVOID Key;
6013 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
6014
6015 /* FILE_OBJECT.Flags */
6016 #define FO_FILE_OPEN 0x00000001
6017 #define FO_SYNCHRONOUS_IO 0x00000002
6018 #define FO_ALERTABLE_IO 0x00000004
6019 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
6020 #define FO_WRITE_THROUGH 0x00000010
6021 #define FO_SEQUENTIAL_ONLY 0x00000020
6022 #define FO_CACHE_SUPPORTED 0x00000040
6023 #define FO_NAMED_PIPE 0x00000080
6024 #define FO_STREAM_FILE 0x00000100
6025 #define FO_MAILSLOT 0x00000200
6026 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
6027 #define FO_QUEUE_IRP_TO_THREAD 0x00000400
6028 #define FO_DIRECT_DEVICE_OPEN 0x00000800
6029 #define FO_FILE_MODIFIED 0x00001000
6030 #define FO_FILE_SIZE_CHANGED 0x00002000
6031 #define FO_CLEANUP_COMPLETE 0x00004000
6032 #define FO_TEMPORARY_FILE 0x00008000
6033 #define FO_DELETE_ON_CLOSE 0x00010000
6034 #define FO_OPENED_CASE_SENSITIVE 0x00020000
6035 #define FO_HANDLE_CREATED 0x00040000
6036 #define FO_FILE_FAST_IO_READ 0x00080000
6037 #define FO_RANDOM_ACCESS 0x00100000
6038 #define FO_FILE_OPEN_CANCELLED 0x00200000
6039 #define FO_VOLUME_OPEN 0x00400000
6040 #define FO_REMOTE_ORIGIN 0x01000000
6041 #define FO_DISALLOW_EXCLUSIVE 0x02000000
6042 #define FO_SKIP_COMPLETION_PORT 0x02000000
6043 #define FO_SKIP_SET_EVENT 0x04000000
6044 #define FO_SKIP_SET_FAST_IO 0x08000000
6045 #define FO_FLAGS_VALID_ONLY_DURING_CREATE FO_DISALLOW_EXCLUSIVE
6046
6047 /* VPB.Flags */
6048 #define VPB_MOUNTED 0x0001
6049 #define VPB_LOCKED 0x0002
6050 #define VPB_PERSISTENT 0x0004
6051 #define VPB_REMOVE_PENDING 0x0008
6052 #define VPB_RAW_MOUNT 0x0010
6053 #define VPB_DIRECT_WRITES_ALLOWED 0x0020
6054
6055 /* IRP.Flags */
6056
6057 #define SL_FORCE_ACCESS_CHECK 0x01
6058 #define SL_OPEN_PAGING_FILE 0x02
6059 #define SL_OPEN_TARGET_DIRECTORY 0x04
6060 #define SL_STOP_ON_SYMLINK 0x08
6061 #define SL_CASE_SENSITIVE 0x80
6062
6063 #define SL_KEY_SPECIFIED 0x01
6064 #define SL_OVERRIDE_VERIFY_VOLUME 0x02
6065 #define SL_WRITE_THROUGH 0x04
6066 #define SL_FT_SEQUENTIAL_WRITE 0x08
6067 #define SL_FORCE_DIRECT_WRITE 0x10
6068 #define SL_REALTIME_STREAM 0x20
6069
6070 #define SL_READ_ACCESS_GRANTED 0x01
6071 #define SL_WRITE_ACCESS_GRANTED 0x04
6072
6073 #define SL_FAIL_IMMEDIATELY 0x01
6074 #define SL_EXCLUSIVE_LOCK 0x02
6075
6076 #define SL_RESTART_SCAN 0x01
6077 #define SL_RETURN_SINGLE_ENTRY 0x02
6078 #define SL_INDEX_SPECIFIED 0x04
6079
6080 #define SL_WATCH_TREE 0x01
6081
6082 #define SL_ALLOW_RAW_MOUNT 0x01
6083
6084 #define CTL_CODE(DeviceType, Function, Method, Access) \
6085 (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
6086
6087 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
6088
6089 #define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)(ctrlCode & 3))
6090
6091 #define IRP_NOCACHE 0x00000001
6092 #define IRP_PAGING_IO 0x00000002
6093 #define IRP_MOUNT_COMPLETION 0x00000002
6094 #define IRP_SYNCHRONOUS_API 0x00000004
6095 #define IRP_ASSOCIATED_IRP 0x00000008
6096 #define IRP_BUFFERED_IO 0x00000010
6097 #define IRP_DEALLOCATE_BUFFER 0x00000020
6098 #define IRP_INPUT_OPERATION 0x00000040
6099 #define IRP_SYNCHRONOUS_PAGING_IO 0x00000040
6100 #define IRP_CREATE_OPERATION 0x00000080
6101 #define IRP_READ_OPERATION 0x00000100
6102 #define IRP_WRITE_OPERATION 0x00000200
6103 #define IRP_CLOSE_OPERATION 0x00000400
6104 #define IRP_DEFER_IO_COMPLETION 0x00000800
6105 #define IRP_OB_QUERY_NAME 0x00001000
6106 #define IRP_HOLD_DEVICE_QUEUE 0x00002000
6107 /* The following 2 are missing in latest WDK */
6108 #define IRP_RETRY_IO_COMPLETION 0x00004000
6109 #define IRP_CLASS_CACHE_OPERATION 0x00008000
6110
6111 #define IRP_QUOTA_CHARGED 0x01
6112 #define IRP_ALLOCATED_MUST_SUCCEED 0x02
6113 #define IRP_ALLOCATED_FIXED_SIZE 0x04
6114 #define IRP_LOOKASIDE_ALLOCATION 0x08
6115
6116 /*
6117 ** IRP function codes
6118 */
6119
6120 #define IRP_MJ_CREATE 0x00
6121 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
6122 #define IRP_MJ_CLOSE 0x02
6123 #define IRP_MJ_READ 0x03
6124 #define IRP_MJ_WRITE 0x04
6125 #define IRP_MJ_QUERY_INFORMATION 0x05
6126 #define IRP_MJ_SET_INFORMATION 0x06
6127 #define IRP_MJ_QUERY_EA 0x07
6128 #define IRP_MJ_SET_EA 0x08
6129 #define IRP_MJ_FLUSH_BUFFERS 0x09
6130 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
6131 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
6132 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
6133 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
6134 #define IRP_MJ_DEVICE_CONTROL 0x0e
6135 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
6136 #define IRP_MJ_SCSI 0x0f
6137 #define IRP_MJ_SHUTDOWN 0x10
6138 #define IRP_MJ_LOCK_CONTROL 0x11
6139 #define IRP_MJ_CLEANUP 0x12
6140 #define IRP_MJ_CREATE_MAILSLOT 0x13
6141 #define IRP_MJ_QUERY_SECURITY 0x14
6142 #define IRP_MJ_SET_SECURITY 0x15
6143 #define IRP_MJ_POWER 0x16
6144 #define IRP_MJ_SYSTEM_CONTROL 0x17
6145 #define IRP_MJ_DEVICE_CHANGE 0x18
6146 #define IRP_MJ_QUERY_QUOTA 0x19
6147 #define IRP_MJ_SET_QUOTA 0x1a
6148 #define IRP_MJ_PNP 0x1b
6149 #define IRP_MJ_PNP_POWER 0x1b
6150 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
6151
6152 #define IRP_MN_SCSI_CLASS 0x01
6153
6154 #define IRP_MN_START_DEVICE 0x00
6155 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
6156 #define IRP_MN_REMOVE_DEVICE 0x02
6157 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
6158 #define IRP_MN_STOP_DEVICE 0x04
6159 #define IRP_MN_QUERY_STOP_DEVICE 0x05
6160 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
6161
6162 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
6163 #define IRP_MN_QUERY_INTERFACE 0x08
6164 #define IRP_MN_QUERY_CAPABILITIES 0x09
6165 #define IRP_MN_QUERY_RESOURCES 0x0A
6166 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
6167 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
6168 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
6169
6170 #define IRP_MN_READ_CONFIG 0x0F
6171 #define IRP_MN_WRITE_CONFIG 0x10
6172 #define IRP_MN_EJECT 0x11
6173 #define IRP_MN_SET_LOCK 0x12
6174 #define IRP_MN_QUERY_ID 0x13
6175 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
6176 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
6177 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
6178 #define IRP_MN_SURPRISE_REMOVAL 0x17
6179 #if (NTDDI_VERSION >= NTDDI_WIN7)
6180 #define IRP_MN_DEVICE_ENUMERATED 0x19
6181 #endif
6182
6183 #define IRP_MN_WAIT_WAKE 0x00
6184 #define IRP_MN_POWER_SEQUENCE 0x01
6185 #define IRP_MN_SET_POWER 0x02
6186 #define IRP_MN_QUERY_POWER 0x03
6187
6188 #define IRP_MN_QUERY_ALL_DATA 0x00
6189 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
6190 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
6191 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
6192 #define IRP_MN_ENABLE_EVENTS 0x04
6193 #define IRP_MN_DISABLE_EVENTS 0x05
6194 #define IRP_MN_ENABLE_COLLECTION 0x06
6195 #define IRP_MN_DISABLE_COLLECTION 0x07
6196 #define IRP_MN_REGINFO 0x08
6197 #define IRP_MN_EXECUTE_METHOD 0x09
6198
6199 #define IRP_MN_REGINFO_EX 0x0b
6200
6201 typedef struct _FILE_OBJECT {
6202 CSHORT Type;
6203 CSHORT Size;
6204 PDEVICE_OBJECT DeviceObject;
6205 PVPB Vpb;
6206 PVOID FsContext;
6207 PVOID FsContext2;
6208 PSECTION_OBJECT_POINTERS SectionObjectPointer;
6209 PVOID PrivateCacheMap;
6210 NTSTATUS FinalStatus;
6211 struct _FILE_OBJECT *RelatedFileObject;
6212 BOOLEAN LockOperation;
6213 BOOLEAN DeletePending;
6214 BOOLEAN ReadAccess;
6215 BOOLEAN WriteAccess;
6216 BOOLEAN DeleteAccess;
6217 BOOLEAN SharedRead;
6218 BOOLEAN SharedWrite;
6219 BOOLEAN SharedDelete;
6220 ULONG Flags;
6221 UNICODE_STRING FileName;
6222 LARGE_INTEGER CurrentByteOffset;
6223 volatile ULONG Waiters;
6224 volatile ULONG Busy;
6225 PVOID LastLock;
6226 KEVENT Lock;
6227 KEVENT Event;
6228 volatile PIO_COMPLETION_CONTEXT CompletionContext;
6229 KSPIN_LOCK IrpListLock;
6230 LIST_ENTRY IrpList;
6231 volatile PVOID FileObjectExtension;
6232 } FILE_OBJECT, *PFILE_OBJECT;
6233
6234 typedef struct _IO_ERROR_LOG_PACKET {
6235 UCHAR MajorFunctionCode;
6236 UCHAR RetryCount;
6237 USHORT DumpDataSize;
6238 USHORT NumberOfStrings;
6239 USHORT StringOffset;
6240 USHORT EventCategory;
6241 NTSTATUS ErrorCode;
6242 ULONG UniqueErrorValue;
6243 NTSTATUS FinalStatus;
6244 ULONG SequenceNumber;
6245 ULONG IoControlCode;
6246 LARGE_INTEGER DeviceOffset;
6247 ULONG DumpData[1];
6248 } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
6249
6250 typedef struct _IO_ERROR_LOG_MESSAGE {
6251 USHORT Type;
6252 USHORT Size;
6253 USHORT DriverNameLength;
6254 LARGE_INTEGER TimeStamp;
6255 ULONG DriverNameOffset;
6256 IO_ERROR_LOG_PACKET EntryData;
6257 } IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
6258
6259 #define ERROR_LOG_LIMIT_SIZE 240
6260 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
6261 sizeof(IO_ERROR_LOG_PACKET) + \
6262 (sizeof(WCHAR) * 40))
6263 #define ERROR_LOG_MESSAGE_LIMIT_SIZE \
6264 (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
6265 #define IO_ERROR_LOG_MESSAGE_LENGTH \
6266 ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \
6267 ERROR_LOG_MESSAGE_LIMIT_SIZE : \
6268 PORT_MAXIMUM_MESSAGE_LENGTH)
6269 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \
6270 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
6271
6272 #ifdef _WIN64
6273 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
6274 #else
6275 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
6276 #endif
6277
6278 typedef enum _DMA_WIDTH {
6279 Width8Bits,
6280 Width16Bits,
6281 Width32Bits,
6282 MaximumDmaWidth
6283 } DMA_WIDTH, *PDMA_WIDTH;
6284
6285 typedef enum _DMA_SPEED {
6286 Compatible,
6287 TypeA,
6288 TypeB,
6289 TypeC,
6290 TypeF,
6291 MaximumDmaSpeed
6292 } DMA_SPEED, *PDMA_SPEED;
6293
6294 /* DEVICE_DESCRIPTION.Version */
6295
6296 #define DEVICE_DESCRIPTION_VERSION 0x0000
6297 #define DEVICE_DESCRIPTION_VERSION1 0x0001
6298 #define DEVICE_DESCRIPTION_VERSION2 0x0002
6299
6300 typedef struct _DEVICE_DESCRIPTION {
6301 ULONG Version;
6302 BOOLEAN Master;
6303 BOOLEAN ScatterGather;
6304 BOOLEAN DemandMode;
6305 BOOLEAN AutoInitialize;
6306 BOOLEAN Dma32BitAddresses;
6307 BOOLEAN IgnoreCount;
6308 BOOLEAN Reserved1;
6309 BOOLEAN Dma64BitAddresses;
6310 ULONG BusNumber;
6311 ULONG DmaChannel;
6312 INTERFACE_TYPE InterfaceType;
6313 DMA_WIDTH DmaWidth;
6314 DMA_SPEED DmaSpeed;
6315 ULONG MaximumLength;
6316 ULONG DmaPort;
6317 } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
6318
6319 typedef enum _DEVICE_RELATION_TYPE {
6320 BusRelations,
6321 EjectionRelations,
6322 PowerRelations,
6323 RemovalRelations,
6324 TargetDeviceRelation,
6325 SingleBusRelations,
6326 TransportRelations
6327 } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
6328
6329 typedef struct _DEVICE_RELATIONS {
6330 ULONG Count;
6331 PDEVICE_OBJECT Objects[1];
6332 } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
6333
6334 typedef struct _DEVOBJ_EXTENSION {
6335 CSHORT Type;
6336 USHORT Size;
6337 PDEVICE_OBJECT DeviceObject;
6338 } DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
6339
6340 typedef struct _SCATTER_GATHER_ELEMENT {
6341 PHYSICAL_ADDRESS Address;
6342 ULONG Length;
6343 ULONG_PTR Reserved;
6344 } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
6345
6346 #if defined(_MSC_EXTENSIONS) || defined(__GNUC__)
6347
6348 #if defined(_MSC_VER)
6349 #if _MSC_VER >= 1200
6350 #pragma warning(push)
6351 #endif
6352 #pragma warning(disable:4200)
6353 #endif /* _MSC_VER */
6354
6355 typedef struct _SCATTER_GATHER_LIST {
6356 ULONG NumberOfElements;
6357 ULONG_PTR Reserved;
6358 SCATTER_GATHER_ELEMENT Elements[1];
6359 } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
6360
6361 #if defined(_MSC_VER)
6362 #if _MSC_VER >= 1200
6363 #pragma warning(pop)
6364 #else
6365 #pragma warning(default:4200)
6366 #endif
6367 #endif /* _MSC_VER */
6368
6369 #else /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
6370
6371 struct _SCATTER_GATHER_LIST;
6372 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
6373
6374 #endif /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */
6375
6376 _Function_class_(DRIVER_ADD_DEVICE)
6377 _IRQL_requires_(PASSIVE_LEVEL)
6378 _IRQL_requires_same_
6379 _When_(return>=0, _Kernel_clear_do_init_(__yes))
6380 typedef NTSTATUS
6381 (NTAPI DRIVER_ADD_DEVICE)(
6382 _In_ struct _DRIVER_OBJECT *DriverObject,
6383 _In_ struct _DEVICE_OBJECT *PhysicalDeviceObject);
6384 typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
6385
6386 typedef struct _DRIVER_EXTENSION {
6387 struct _DRIVER_OBJECT *DriverObject;
6388 PDRIVER_ADD_DEVICE AddDevice;
6389 ULONG Count;
6390 UNICODE_STRING ServiceKeyName;
6391 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
6392
6393 #define DRVO_UNLOAD_INVOKED 0x00000001
6394 #define DRVO_LEGACY_DRIVER 0x00000002
6395 #define DRVO_BUILTIN_DRIVER 0x00000004
6396
6397 _Function_class_(DRIVER_INITIALIZE)
6398 _IRQL_requires_same_
6399 typedef NTSTATUS
6400 (NTAPI DRIVER_INITIALIZE)(
6401 _In_ struct _DRIVER_OBJECT *DriverObject,
6402 _In_ PUNICODE_STRING RegistryPath);
6403 typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
6404
6405 _Function_class_(DRIVER_STARTIO)
6406 _IRQL_always_function_min_(DISPATCH_LEVEL)
6407 _IRQL_requires_(DISPATCH_LEVEL)
6408 _IRQL_requires_same_
6409 typedef VOID
6410 (NTAPI DRIVER_STARTIO)(
6411 _Inout_ struct _DEVICE_OBJECT *DeviceObject,
6412 _Inout_ struct _IRP *Irp);
6413 typedef DRIVER_STARTIO *PDRIVER_STARTIO;
6414
6415 _Function_class_(DRIVER_UNLOAD)
6416 _IRQL_requires_(PASSIVE_LEVEL)
6417 _IRQL_requires_same_
6418 typedef VOID
6419 (NTAPI DRIVER_UNLOAD)(
6420 _In_ struct _DRIVER_OBJECT *DriverObject);
6421 typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
6422
6423 _Function_class_(DRIVER_DISPATCH)
6424 _IRQL_requires_(PASSIVE_LEVEL)
6425 _IRQL_requires_same_
6426 typedef NTSTATUS
6427 (NTAPI DRIVER_DISPATCH)(
6428 _In_ struct _DEVICE_OBJECT *DeviceObject,
6429 _Inout_ struct _IRP *Irp);
6430 typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
6431
6432 typedef struct _DRIVER_OBJECT {
6433 CSHORT Type;
6434 CSHORT Size;
6435 PDEVICE_OBJECT DeviceObject;
6436 ULONG Flags;
6437 PVOID DriverStart;
6438 ULONG DriverSize;
6439 PVOID DriverSection;
6440 PDRIVER_EXTENSION DriverExtension;
6441 UNICODE_STRING DriverName;
6442 PUNICODE_STRING HardwareDatabase;
6443 struct _FAST_IO_DISPATCH *FastIoDispatch;
6444 PDRIVER_INITIALIZE DriverInit;
6445 PDRIVER_STARTIO DriverStartIo;
6446 PDRIVER_UNLOAD DriverUnload;
6447 PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
6448 } DRIVER_OBJECT, *PDRIVER_OBJECT;
6449
6450 typedef struct _DMA_ADAPTER {
6451 USHORT Version;
6452 USHORT Size;
6453 struct _DMA_OPERATIONS* DmaOperations;
6454 } DMA_ADAPTER, *PDMA_ADAPTER;
6455
6456 typedef VOID
6457 (NTAPI *PPUT_DMA_ADAPTER)(
6458 PDMA_ADAPTER DmaAdapter);
6459
6460 typedef PVOID
6461 (NTAPI *PALLOCATE_COMMON_BUFFER)(
6462 _In_ PDMA_ADAPTER DmaAdapter,
6463 _In_ ULONG Length,
6464 _Out_ PPHYSICAL_ADDRESS LogicalAddress,
6465 _In_ BOOLEAN CacheEnabled);
6466
6467 typedef VOID
6468 (NTAPI *PFREE_COMMON_BUFFER)(
6469 _In_ PDMA_ADAPTER DmaAdapter,
6470 _In_ ULONG Length,
6471 _In_ PHYSICAL_ADDRESS LogicalAddress,
6472 _In_ PVOID VirtualAddress,
6473 _In_ BOOLEAN CacheEnabled);
6474
6475 typedef NTSTATUS
6476 (NTAPI *PALLOCATE_ADAPTER_CHANNEL)(
6477 _In_ PDMA_ADAPTER DmaAdapter,
6478 _In_ PDEVICE_OBJECT DeviceObject,
6479 _In_ ULONG NumberOfMapRegisters,
6480 _In_ PDRIVER_CONTROL ExecutionRoutine,
6481 _In_ PVOID Context);
6482
6483 typedef BOOLEAN
6484 (NTAPI *PFLUSH_ADAPTER_BUFFERS)(
6485 _In_ PDMA_ADAPTER DmaAdapter,
6486 _In_ PMDL Mdl,
6487 _In_ PVOID MapRegisterBase,
6488 _In_ PVOID CurrentVa,
6489 _In_ ULONG Length,
6490 _In_ BOOLEAN WriteToDevice);
6491
6492 typedef VOID
6493 (NTAPI *PFREE_ADAPTER_CHANNEL)(
6494 _In_ PDMA_ADAPTER DmaAdapter);
6495
6496 typedef VOID
6497 (NTAPI *PFREE_MAP_REGISTERS)(
6498 _In_ PDMA_ADAPTER DmaAdapter,
6499 PVOID MapRegisterBase,
6500 ULONG NumberOfMapRegisters);
6501
6502 typedef PHYSICAL_ADDRESS
6503 (NTAPI *PMAP_TRANSFER)(
6504 _In_ PDMA_ADAPTER DmaAdapter,
6505 _In_ PMDL Mdl,
6506 _In_ PVOID MapRegisterBase,
6507 _In_ PVOID CurrentVa,
6508 _Inout_ PULONG Length,
6509 _In_ BOOLEAN WriteToDevice);
6510
6511 typedef ULONG
6512 (NTAPI *PGET_DMA_ALIGNMENT)(
6513 _In_ PDMA_ADAPTER DmaAdapter);
6514
6515 typedef ULONG
6516 (NTAPI *PREAD_DMA_COUNTER)(
6517 _In_ PDMA_ADAPTER DmaAdapter);
6518
6519 _Function_class_(DRIVER_LIST_CONTROL)
6520 _IRQL_requires_same_
6521 typedef VOID
6522 (NTAPI DRIVER_LIST_CONTROL)(
6523 _In_ struct _DEVICE_OBJECT *DeviceObject,
6524 _In_ struct _IRP *Irp,
6525 _In_ struct _SCATTER_GATHER_LIST *ScatterGather,
6526 _In_ PVOID Context);
6527 typedef DRIVER_LIST_CONTROL *PDRIVER_LIST_CONTROL;
6528
6529 typedef NTSTATUS
6530 (NTAPI *PGET_SCATTER_GATHER_LIST)(
6531 _In_ PDMA_ADAPTER DmaAdapter,
6532 _In_ PDEVICE_OBJECT DeviceObject,
6533 _In_ PMDL Mdl,
6534 _In_ PVOID CurrentVa,
6535 _In_ ULONG Length,
6536 _In_ PDRIVER_LIST_CONTROL ExecutionRoutine,
6537 _In_ PVOID Context,
6538 _In_ BOOLEAN WriteToDevice);
6539
6540 typedef VOID
6541 (NTAPI *PPUT_SCATTER_GATHER_LIST)(
6542 _In_ PDMA_ADAPTER DmaAdapter,
6543 _In_ PSCATTER_GATHER_LIST ScatterGather,
6544 _In_ BOOLEAN WriteToDevice);
6545
6546 typedef NTSTATUS
6547 (NTAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
6548 _In_ PDMA_ADAPTER DmaAdapter,
6549 _In_ PMDL Mdl OPTIONAL,
6550 _In_ PVOID CurrentVa,
6551 _In_ ULONG Length,
6552 _Out_ PULONG ScatterGatherListSize,
6553 _Out_ OPTIONAL PULONG pNumberOfMapRegisters);
6554
6555 typedef NTSTATUS
6556 (NTAPI *PBUILD_SCATTER_GATHER_LIST)(
6557 _In_ PDMA_ADAPTER DmaAdapter,
6558 _In_ PDEVICE_OBJECT DeviceObject,
6559 _In_ PMDL Mdl,
6560 _In_ PVOID CurrentVa,
6561 _In_ ULONG Length,
6562 _In_ PDRIVER_LIST_CONTROL ExecutionRoutine,
6563 _In_ PVOID Context,
6564 _In_ BOOLEAN WriteToDevice,
6565 _In_ PVOID ScatterGatherBuffer,
6566 _In_ ULONG ScatterGatherLength);
6567
6568 typedef NTSTATUS
6569 (NTAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
6570 _In_ PDMA_ADAPTER DmaAdapter,
6571 _In_ PSCATTER_GATHER_LIST ScatterGather,
6572 _In_ PMDL OriginalMdl,
6573 _Out_ PMDL *TargetMdl);
6574
6575 typedef struct _DMA_OPERATIONS {
6576 ULONG Size;
6577 PPUT_DMA_ADAPTER PutDmaAdapter;
6578 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
6579 PFREE_COMMON_BUFFER FreeCommonBuffer;
6580 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
6581 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
6582 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
6583 PFREE_MAP_REGISTERS FreeMapRegisters;
6584 PMAP_TRANSFER MapTransfer;
6585 PGET_DMA_ALIGNMENT GetDmaAlignment;
6586 PREAD_DMA_COUNTER ReadDmaCounter;
6587 PGET_SCATTER_GATHER_LIST GetScatterGatherList;
6588 PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
6589 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList;
6590 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList;
6591 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList;
6592 } DMA_OPERATIONS, *PDMA_OPERATIONS;
6593
6594 typedef struct _IO_RESOURCE_DESCRIPTOR {
6595 UCHAR Option;
6596 UCHAR Type;
6597 UCHAR ShareDisposition;
6598 UCHAR Spare1;
6599 USHORT Flags;
6600 USHORT Spare2;
6601 union {
6602 struct {
6603 ULONG Length;
6604 ULONG Alignment;
6605 PHYSICAL_ADDRESS MinimumAddress;
6606 PHYSICAL_ADDRESS MaximumAddress;
6607 } Port;
6608 struct {
6609 ULONG Length;
6610 ULONG Alignment;
6611 PHYSICAL_ADDRESS MinimumAddress;
6612 PHYSICAL_ADDRESS MaximumAddress;
6613 } Memory;
6614 struct {
6615 ULONG MinimumVector;
6616 ULONG MaximumVector;
6617 } Interrupt;
6618 struct {
6619 ULONG MinimumChannel;
6620 ULONG MaximumChannel;
6621 } Dma;
6622 struct {
6623 ULONG Length;
6624 ULONG Alignment;
6625 PHYSICAL_ADDRESS MinimumAddress;
6626 PHYSICAL_ADDRESS MaximumAddress;
6627 } Generic;
6628 struct {
6629 ULONG Data[3];
6630 } DevicePrivate;
6631 struct {
6632 ULONG Length;
6633 ULONG MinBusNumber;
6634 ULONG MaxBusNumber;
6635 ULONG Reserved;
6636 } BusNumber;
6637 struct {
6638 ULONG Priority;
6639 ULONG Reserved1;
6640 ULONG Reserved2;
6641 } ConfigData;
6642 } u;
6643 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
6644
6645 typedef struct _IO_RESOURCE_LIST {
6646 USHORT Version;
6647 USHORT Revision;
6648 ULONG Count;
6649 IO_RESOURCE_DESCRIPTOR Descriptors[1];
6650 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
6651
6652 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
6653 ULONG ListSize;
6654 INTERFACE_TYPE InterfaceType;
6655 ULONG BusNumber;
6656 ULONG SlotNumber;
6657 ULONG Reserved[3];
6658 ULONG AlternativeLists;
6659 IO_RESOURCE_LIST List[1];
6660 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
6661
6662 _Function_class_(DRIVER_CANCEL)
6663 _Requires_lock_held_(_Global_cancel_spin_lock_)
6664 _Releases_lock_(_Global_cancel_spin_lock_)
6665 _IRQL_requires_min_(DISPATCH_LEVEL)
6666 _IRQL_requires_(DISPATCH_LEVEL)
6667 typedef VOID
6668 (NTAPI DRIVER_CANCEL)(
6669 _Inout_ struct _DEVICE_OBJECT *DeviceObject,
6670 _Inout_ _IRQL_uses_cancel_ struct _IRP *Irp);
6671 typedef DRIVER_CANCEL *PDRIVER_CANCEL;
6672
6673 typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _IRP {
6674 CSHORT Type;
6675 USHORT Size;
6676 struct _MDL *MdlAddress;
6677 ULONG Flags;
6678 union {
6679 struct _IRP *MasterIrp;
6680 volatile LONG IrpCount;
6681 PVOID SystemBuffer;
6682 } AssociatedIrp;
6683 LIST_ENTRY ThreadListEntry;
6684 IO_STATUS_BLOCK IoStatus;
6685 KPROCESSOR_MODE RequestorMode;
6686 BOOLEAN PendingReturned;
6687 CHAR StackCount;
6688 CHAR CurrentLocation;
6689 BOOLEAN Cancel;
6690 KIRQL CancelIrql;
6691 CCHAR ApcEnvironment;
6692 UCHAR AllocationFlags;
6693 PIO_STATUS_BLOCK UserIosb;
6694 PKEVENT UserEvent;
6695 union {
6696 struct {
6697 _ANONYMOUS_UNION union {
6698 PIO_APC_ROUTINE UserApcRoutine;
6699 PVOID IssuingProcess;
6700 } DUMMYUNIONNAME;
6701 PVOID UserApcContext;
6702 } AsynchronousParameters;
6703 LARGE_INTEGER AllocationSize;
6704 } Overlay;
6705 volatile PDRIVER_CANCEL CancelRoutine;
6706 PVOID UserBuffer;
6707 union {
6708 struct {
6709 _ANONYMOUS_UNION union {
6710 KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
6711 _ANONYMOUS_STRUCT struct {
6712 PVOID DriverContext[4];
6713 } DUMMYSTRUCTNAME;
6714 } DUMMYUNIONNAME;
6715 PETHREAD Thread;
6716 PCHAR AuxiliaryBuffer;
6717 _ANONYMOUS_STRUCT struct {
6718 LIST_ENTRY ListEntry;
6719 _ANONYMOUS_UNION union {
6720 struct _IO_STACK_LOCATION *CurrentStackLocation;
6721 ULONG PacketType;
6722 } DUMMYUNIONNAME;
6723 } DUMMYSTRUCTNAME;
6724 struct _FILE_OBJECT *OriginalFileObject;
6725 } Overlay;
6726 KAPC Apc;
6727 PVOID CompletionKey;
6728 } Tail;
6729 } IRP, *PIRP;
6730
6731 typedef enum _IO_PAGING_PRIORITY {
6732 IoPagingPriorityInvalid,
6733 IoPagingPriorityNormal,
6734 IoPagingPriorityHigh,
6735 IoPagingPriorityReserved1,
6736 IoPagingPriorityReserved2
6737 } IO_PAGING_PRIORITY;
6738
6739 _Function_class_(IO_COMPLETION_ROUTINE)
6740 _IRQL_requires_same_
6741 typedef NTSTATUS
6742 (NTAPI IO_COMPLETION_ROUTINE)(
6743 _In_ struct _DEVICE_OBJECT *DeviceObject,
6744 _In_ struct _IRP *Irp,
6745 _In_opt_ PVOID Context);
6746 typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
6747
6748 _Function_class_(IO_DPC_ROUTINE)
6749 _IRQL_always_function_min_(DISPATCH_LEVEL)
6750 _IRQL_requires_(DISPATCH_LEVEL)
6751 _IRQL_requires_same_
6752 typedef VOID
6753 (NTAPI IO_DPC_ROUTINE)(
6754 _In_ struct _KDPC *Dpc,
6755 _In_ struct _DEVICE_OBJECT *DeviceObject,
6756 _Inout_ struct _IRP *Irp,
6757 _In_opt_ PVOID Context);
6758 typedef IO_DPC_ROUTINE *PIO_DPC_ROUTINE;
6759
6760 typedef NTSTATUS
6761 (NTAPI *PMM_DLL_INITIALIZE)(
6762 _In_ PUNICODE_STRING RegistryPath);
6763
6764 typedef NTSTATUS
6765 (NTAPI *PMM_DLL_UNLOAD)(
6766 VOID);
6767
6768 _Function_class_(IO_TIMER_ROUTINE)
6769 _IRQL_requires_same_
6770 typedef VOID
6771 (NTAPI IO_TIMER_ROUTINE)(
6772 _In_ struct _DEVICE_OBJECT *DeviceObject,
6773 _In_opt_ PVOID Context);
6774 typedef IO_TIMER_ROUTINE *PIO_TIMER_ROUTINE;
6775
6776 typedef struct _IO_SECURITY_CONTEXT {
6777 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
6778 PACCESS_STATE AccessState;
6779 ACCESS_MASK DesiredAccess;
6780 ULONG FullCreateOptions;
6781 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
6782
6783 struct _IO_CSQ;
6784
6785 typedef struct _IO_CSQ_IRP_CONTEXT {
6786 ULONG Type;
6787 struct _IRP *Irp;
6788 struct _IO_CSQ *Csq;
6789 } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
6790
6791 typedef VOID
6792 (NTAPI *PIO_CSQ_INSERT_IRP)(
6793 _In_ struct _IO_CSQ *Csq,
6794 _In_ PIRP Irp);
6795
6796 typedef NTSTATUS
6797 (NTAPI IO_CSQ_INSERT_IRP_EX)(
6798 _In_ struct _IO_CSQ *Csq,
6799 _In_ PIRP Irp,
6800 _In_ PVOID InsertContext);
6801 typedef IO_CSQ_INSERT_IRP_EX *PIO_CSQ_INSERT_IRP_EX;
6802
6803 typedef VOID
6804 (NTAPI *PIO_CSQ_REMOVE_IRP)(
6805 _In_ struct _IO_CSQ *Csq,
6806 _In_ PIRP Irp);
6807
6808 typedef PIRP
6809 (NTAPI *PIO_CSQ_PEEK_NEXT_IRP)(
6810 _In_ struct _IO_CSQ *Csq,
6811 _In_ PIRP Irp,
6812 _In_ PVOID PeekContext);
6813
6814 typedef VOID
6815 (NTAPI *PIO_CSQ_ACQUIRE_LOCK)(
6816 _In_ struct _IO_CSQ *Csq,
6817 _Out_ PKIRQL Irql);
6818
6819 typedef VOID
6820 (NTAPI *PIO_CSQ_RELEASE_LOCK)(
6821 _In_ struct _IO_CSQ *Csq,
6822 _In_ KIRQL Irql);
6823
6824 typedef VOID
6825 (NTAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
6826 _In_ struct _IO_CSQ *Csq,
6827 _In_ PIRP Irp);
6828
6829 typedef struct _IO_CSQ {
6830 ULONG Type;
6831 PIO_CSQ_INSERT_IRP CsqInsertIrp;
6832 PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
6833 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
6834 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
6835 PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
6836 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
6837 PVOID ReservePointer;
6838 } IO_CSQ, *PIO_CSQ;
6839
6840 typedef enum _BUS_QUERY_ID_TYPE {
6841 BusQueryDeviceID,
6842 BusQueryHardwareIDs,
6843 BusQueryCompatibleIDs,
6844 BusQueryInstanceID,
6845 BusQueryDeviceSerialNumber
6846 } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
6847
6848 typedef enum _DEVICE_TEXT_TYPE {
6849 DeviceTextDescription,
6850 DeviceTextLocationInformation
6851 } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
6852
6853 typedef BOOLEAN
6854 (NTAPI *PGPE_SERVICE_ROUTINE)(
6855 PVOID,
6856 PVOID);
6857
6858 _IRQL_requires_max_(DISPATCH_LEVEL)
6859 _Must_inspect_result_
6860 typedef NTSTATUS
6861 (NTAPI *PGPE_CONNECT_VECTOR)(
6862 PDEVICE_OBJECT,
6863 ULONG,
6864 KINTERRUPT_MODE,
6865 BOOLEAN,
6866 PGPE_SERVICE_ROUTINE,
6867 PVOID,
6868 PVOID);
6869
6870 _IRQL_requires_max_(DISPATCH_LEVEL)
6871 _Must_inspect_result_
6872 typedef NTSTATUS
6873 (NTAPI *PGPE_DISCONNECT_VECTOR)(
6874 PVOID);
6875
6876 _IRQL_requires_max_(DISPATCH_LEVEL)
6877 _Must_inspect_result_
6878 typedef NTSTATUS
6879 (NTAPI *PGPE_ENABLE_EVENT)(
6880 PDEVICE_OBJECT,
6881 PVOID);
6882
6883 _IRQL_requires_max_(DISPATCH_LEVEL)
6884 _Must_inspect_result_
6885 typedef NTSTATUS
6886 (NTAPI *PGPE_DISABLE_EVENT)(
6887 PDEVICE_OBJECT,
6888 PVOID);
6889
6890 _IRQL_requires_max_(DISPATCH_LEVEL)
6891 _Must_inspect_result_
6892 typedef NTSTATUS
6893 (NTAPI *PGPE_CLEAR_STATUS)(
6894 PDEVICE_OBJECT,
6895 PVOID);
6896
6897 typedef VOID
6898 (NTAPI *PDEVICE_NOTIFY_CALLBACK)(
6899 PVOID,
6900 ULONG);
6901
6902 _IRQL_requires_max_(DISPATCH_LEVEL)
6903 _Must_inspect_result_
6904 typedef NTSTATUS
6905 (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS)(
6906 PDEVICE_OBJECT,
6907 PDEVICE_NOTIFY_CALLBACK,
6908 PVOID);
6909
6910 _IRQL_requires_max_(DISPATCH_LEVEL)
6911 typedef VOID
6912 (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)(
6913 PDEVICE_OBJECT,
6914 PDEVICE_NOTIFY_CALLBACK);
6915
6916 typedef struct _ACPI_INTERFACE_STANDARD {
6917 USHORT Size;
6918 USHORT Version;
6919 PVOID Context;
6920 PINTERFACE_REFERENCE InterfaceReference;
6921 PINTERFACE_DEREFERENCE InterfaceDereference;
6922 PGPE_CONNECT_VECTOR GpeConnectVector;
6923 PGPE_DISCONNECT_VECTOR GpeDisconnectVector;
6924 PGPE_ENABLE_EVENT GpeEnableEvent;
6925 PGPE_DISABLE_EVENT GpeDisableEvent;
6926 PGPE_CLEAR_STATUS GpeClearStatus;
6927 PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications;
6928 PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications;
6929 } ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD;
6930
6931 typedef BOOLEAN
6932 (NTAPI *PGPE_SERVICE_ROUTINE2)(
6933 PVOID ObjectContext,
6934 PVOID ServiceContext);
6935
6936 _IRQL_requires_max_(DISPATCH_LEVEL)
6937 _Must_inspect_result_
6938 typedef NTSTATUS
6939 (NTAPI *PGPE_CONNECT_VECTOR2)(
6940 PVOID Context,
6941 ULONG GpeNumber,
6942 KINTERRUPT_MODE Mode,
6943 BOOLEAN Shareable,
6944 PGPE_SERVICE_ROUTINE ServiceRoutine,
6945 PVOID ServiceContext,
6946 PVOID *ObjectContext);
6947
6948 _IRQL_requires_max_(DISPATCH_LEVEL)
6949 _Must_inspect_result_
6950 typedef NTSTATUS
6951 (NTAPI *PGPE_DISCONNECT_VECTOR2)(
6952 PVOID Context,
6953 PVOID ObjectContext);
6954
6955 _IRQL_requires_max_(DISPATCH_LEVEL)
6956 _Must_inspect_result_
6957 typedef NTSTATUS
6958 (NTAPI *PGPE_ENABLE_EVENT2)(
6959 PVOID Context,
6960 PVOID ObjectContext);
6961
6962 _IRQL_requires_max_(DISPATCH_LEVEL)
6963 _Must_inspect_result_
6964 typedef NTSTATUS
6965 (NTAPI *PGPE_DISABLE_EVENT2)(
6966 PVOID Context,
6967 PVOID ObjectContext);
6968
6969 _IRQL_requires_max_(DISPATCH_LEVEL)
6970 _Must_inspect_result_
6971 typedef NTSTATUS
6972 (NTAPI *PGPE_CLEAR_STATUS2)(
6973 PVOID Context,
6974 PVOID ObjectContext);
6975
6976 _IRQL_requires_max_(DISPATCH_LEVEL)
6977 typedef VOID
6978 (NTAPI *PDEVICE_NOTIFY_CALLBACK2)(
6979 PVOID NotificationContext,
6980 ULONG NotifyCode);
6981
6982 _IRQL_requires_max_(DISPATCH_LEVEL)
6983 _Must_inspect_result_
6984 typedef NTSTATUS
6985 (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
6986 PVOID Context,
6987 PDEVICE_NOTIFY_CALLBACK2 NotificationHandler,
6988 PVOID NotificationContext);
6989
6990 _IRQL_requires_max_(DISPATCH_LEVEL)
6991 typedef VOID
6992 (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)(
6993 PVOID Context);
6994
6995 typedef struct _ACPI_INTERFACE_STANDARD2 {
6996 USHORT Size;
6997 USHORT Version;
6998 PVOID Context;
6999 PINTERFACE_REFERENCE InterfaceReference;
7000 PINTERFACE_DEREFERENCE InterfaceDereference;
7001 PGPE_CONNECT_VECTOR2 GpeConnectVector;
7002 PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector;
7003 PGPE_ENABLE_EVENT2 GpeEnableEvent;
7004 PGPE_DISABLE_EVENT2 GpeDisableEvent;
7005 PGPE_CLEAR_STATUS2 GpeClearStatus;
7006 PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications;
7007 PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications;
7008 } ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2;
7009
7010 #if !defined(_AMD64_) && !defined(_IA64_)
7011 #include <pshpack4.h>
7012 #endif
7013 typedef struct _IO_STACK_LOCATION {
7014 UCHAR MajorFunction;
7015 UCHAR MinorFunction;
7016 UCHAR Flags;
7017 UCHAR Control;
7018 union {
7019 struct {
7020 PIO_SECURITY_CONTEXT SecurityContext;
7021 ULONG Options;
7022 USHORT POINTER_ALIGNMENT FileAttributes;
7023 USHORT ShareAccess;
7024 ULONG POINTER_ALIGNMENT EaLength;
7025 } Create;
7026 struct {
7027 ULONG Length;
7028 ULONG POINTER_ALIGNMENT Key;
7029 LARGE_INTEGER ByteOffset;
7030 } Read;
7031 struct {
7032 ULONG Length;
7033 ULONG POINTER_ALIGNMENT Key;
7034 LARGE_INTEGER ByteOffset;
7035 } Write;
7036 struct {
7037 ULONG Length;
7038 PUNICODE_STRING FileName;
7039 FILE_INFORMATION_CLASS FileInformationClass;
7040 ULONG FileIndex;
7041 } QueryDirectory;
7042 struct {
7043 ULONG Length;
7044 ULONG CompletionFilter;
7045 } NotifyDirectory;
7046 struct {
7047 ULONG Length;
7048 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
7049 } QueryFile;
7050 struct {
7051 ULONG Length;
7052 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
7053 PFILE_OBJECT FileObject;
7054 _ANONYMOUS_UNION union {
7055 _ANONYMOUS_STRUCT struct {
7056 BOOLEAN ReplaceIfExists;
7057 BOOLEAN AdvanceOnly;
7058 } DUMMYSTRUCTNAME;
7059 ULONG ClusterCount;
7060 HANDLE DeleteHandle;
7061 } DUMMYUNIONNAME;
7062 } SetFile;
7063 struct {
7064 ULONG Length;
7065 PVOID EaList;
7066 ULONG EaListLength;
7067 ULONG EaIndex;
7068 } QueryEa;
7069 struct {
7070 ULONG Length;
7071 } SetEa;
7072 struct {
7073 ULONG Length;
7074 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
7075 } QueryVolume;
7076 struct {
7077 ULONG Length;
7078 FS_INFORMATION_CLASS FsInformationClass;
7079 } SetVolume;
7080 struct {
7081 ULONG OutputBufferLength;
7082 ULONG InputBufferLength;
7083 ULONG FsControlCode;
7084 PVOID Type3InputBuffer;
7085 } FileSystemControl;
7086 struct {
7087 PLARGE_INTEGER Length;
7088 ULONG Key;
7089 LARGE_INTEGER ByteOffset;
7090 } LockControl;
7091 struct {
7092 ULONG OutputBufferLength;
7093 ULONG POINTER_ALIGNMENT InputBufferLength;
7094 ULONG POINTER_ALIGNMENT IoControlCode;
7095 PVOID Type3InputBuffer;
7096 } DeviceIoControl;
7097 struct {
7098 SECURITY_INFORMATION SecurityInformation;
7099 ULONG POINTER_ALIGNMENT Length;
7100 } QuerySecurity;
7101 struct {
7102 SECURITY_INFORMATION SecurityInformation;
7103 PSECURITY_DESCRIPTOR SecurityDescriptor;
7104 } SetSecurity;
7105 struct {
7106 PVPB Vpb;
7107 PDEVICE_OBJECT DeviceObject;
7108 } MountVolume;
7109 struct {
7110 PVPB Vpb;
7111 PDEVICE_OBJECT DeviceObject;
7112 } VerifyVolume;
7113 struct {
7114 struct _SCSI_REQUEST_BLOCK *Srb;
7115 } Scsi;
7116 struct {
7117 ULONG Length;
7118 PSID StartSid;
7119 struct _FILE_GET_QUOTA_INFORMATION *SidList;
7120 ULONG SidListLength;
7121 } QueryQuota;
7122 struct {
7123 ULONG Length;
7124 } SetQuota;
7125 struct {
7126 DEVICE_RELATION_TYPE Type;
7127 } QueryDeviceRelations;
7128 struct {
7129 CONST GUID *InterfaceType;
7130 USHORT Size;
7131 USHORT Version;
7132 PINTERFACE Interface;
7133 PVOID InterfaceSpecificData;
7134 } QueryInterface;
7135 struct {
7136 PDEVICE_CAPABILITIES Capabilities;
7137 } DeviceCapabilities;
7138 struct {
7139 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
7140 } FilterResourceRequirements;
7141 struct {
7142 ULONG WhichSpace;
7143 PVOID Buffer;
7144 ULONG Offset;
7145 ULONG POINTER_ALIGNMENT Length;
7146 } ReadWriteConfig;
7147 struct {
7148 BOOLEAN Lock;
7149 } SetLock;
7150 struct {
7151 BUS_QUERY_ID_TYPE IdType;
7152 } QueryId;
7153 struct {
7154 DEVICE_TEXT_TYPE DeviceTextType;
7155 LCID POINTER_ALIGNMENT LocaleId;
7156 } QueryDeviceText;
7157 struct {
7158 BOOLEAN InPath;
7159 BOOLEAN Reserved[3];
7160 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
7161 } UsageNotification;
7162 struct {
7163 SYSTEM_POWER_STATE PowerState;
7164 } WaitWake;
7165 struct {
7166 PPOWER_SEQUENCE PowerSequence;
7167 } PowerSequence;
7168 struct {
7169 ULONG SystemContext;
7170 POWER_STATE_TYPE POINTER_ALIGNMENT Type;
7171 POWER_STATE POINTER_ALIGNMENT State;
7172 POWER_ACTION POINTER_ALIGNMENT ShutdownType;
7173 } Power;
7174 struct {
7175 PCM_RESOURCE_LIST AllocatedResources;
7176 PCM_RESOURCE_LIST AllocatedResourcesTranslated;
7177 } StartDevice;
7178 struct {
7179 ULONG_PTR ProviderId;
7180 PVOID DataPath;
7181 ULONG BufferSize;
7182 PVOID Buffer;
7183 } WMI;
7184 struct {
7185 PVOID Argument1;
7186 PVOID Argument2;
7187 PVOID Argument3;
7188 PVOID Argument4;
7189 } Others;
7190 } Parameters;
7191 PDEVICE_OBJECT DeviceObject;
7192 PFILE_OBJECT FileObject;
7193 PIO_COMPLETION_ROUTINE CompletionRoutine;
7194 PVOID Context;
7195 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
7196 #if !defined(_AMD64_) && !defined(_IA64_)
7197 #include <poppack.h>
7198 #endif
7199
7200 /* IO_STACK_LOCATION.Control */
7201
7202 #define SL_PENDING_RETURNED 0x01
7203 #define SL_ERROR_RETURNED 0x02
7204 #define SL_INVOKE_ON_CANCEL 0x20
7205 #define SL_INVOKE_ON_SUCCESS 0x40
7206 #define SL_INVOKE_ON_ERROR 0x80
7207
7208 #define METHOD_BUFFERED 0
7209 #define METHOD_IN_DIRECT 1
7210 #define METHOD_OUT_DIRECT 2
7211 #define METHOD_NEITHER 3
7212
7213 #define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT
7214 #define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
7215
7216 #define FILE_SUPERSEDED 0x00000000
7217 #define FILE_OPENED 0x00000001
7218 #define FILE_CREATED 0x00000002
7219 #define FILE_OVERWRITTEN 0x00000003
7220 #define FILE_EXISTS 0x00000004
7221 #define FILE_DOES_NOT_EXIST 0x00000005
7222
7223 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
7224 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
7225
7226 /* also in winnt.h */
7227 #define FILE_LIST_DIRECTORY 0x00000001
7228 #define FILE_READ_DATA 0x00000001
7229 #define FILE_ADD_FILE 0x00000002
7230 #define FILE_WRITE_DATA 0x00000002
7231 #define FILE_ADD_SUBDIRECTORY 0x00000004
7232 #define FILE_APPEND_DATA 0x00000004
7233 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
7234 #define FILE_READ_EA 0x00000008
7235 #define FILE_WRITE_EA 0x00000010
7236 #define FILE_EXECUTE 0x00000020
7237 #define FILE_TRAVERSE 0x00000020
7238 #define FILE_DELETE_CHILD 0x00000040
7239 #define FILE_READ_ATTRIBUTES 0x00000080
7240 #define FILE_WRITE_ATTRIBUTES 0x00000100
7241
7242 #define FILE_SHARE_READ 0x00000001
7243 #define FILE_SHARE_WRITE 0x00000002
7244 #define FILE_SHARE_DELETE 0x00000004
7245 #define FILE_SHARE_VALID_FLAGS 0x00000007
7246
7247 #define FILE_ATTRIBUTE_READONLY 0x00000001
7248 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
7249 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
7250 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
7251 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
7252 #define FILE_ATTRIBUTE_DEVICE 0x00000040
7253 #define FILE_ATTRIBUTE_NORMAL 0x00000080
7254 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
7255 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
7256 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
7257 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
7258 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
7259 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
7260 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
7261 #define FILE_ATTRIBUTE_VIRTUAL 0x00010000
7262
7263 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
7264 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
7265
7266 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
7267 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
7268 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
7269 #define FILE_VALID_SET_FLAGS 0x00000036
7270
7271 #define FILE_SUPERSEDE 0x00000000
7272 #define FILE_OPEN 0x00000001
7273 #define FILE_CREATE 0x00000002
7274 #define FILE_OPEN_IF 0x00000003
7275 #define FILE_OVERWRITE 0x00000004
7276 #define FILE_OVERWRITE_IF 0x00000005
7277 #define FILE_MAXIMUM_DISPOSITION 0x00000005
7278
7279 #define FILE_DIRECTORY_FILE 0x00000001
7280 #define FILE_WRITE_THROUGH 0x00000002
7281 #define FILE_SEQUENTIAL_ONLY 0x00000004
7282 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
7283 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
7284 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
7285 #define FILE_NON_DIRECTORY_FILE 0x00000040
7286 #define FILE_CREATE_TREE_CONNECTION 0x00000080
7287 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
7288 #define FILE_NO_EA_KNOWLEDGE 0x00000200
7289 #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
7290 #define FILE_RANDOM_ACCESS 0x00000800
7291 #define FILE_DELETE_ON_CLOSE 0x00001000
7292 #define FILE_OPEN_BY_FILE_ID 0x00002000
7293 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
7294 #define FILE_NO_COMPRESSION 0x00008000
7295 #if (NTDDI_VERSION >= NTDDI_WIN7)
7296 #define FILE_OPEN_REQUIRING_OPLOCK 0x00010000
7297 #define FILE_DISALLOW_EXCLUSIVE 0x00020000
7298 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
7299 #define FILE_RESERVE_OPFILTER 0x00100000
7300 #define FILE_OPEN_REPARSE_POINT 0x00200000
7301 #define FILE_OPEN_NO_RECALL 0x00400000
7302 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
7303
7304 #define FILE_ANY_ACCESS 0x00000000
7305 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
7306 #define FILE_READ_ACCESS 0x00000001
7307 #define FILE_WRITE_ACCESS 0x00000002
7308
7309 #define FILE_ALL_ACCESS \
7310 (STANDARD_RIGHTS_REQUIRED | \
7311 SYNCHRONIZE | \
7312 0x1FF)
7313
7314 #define FILE_GENERIC_EXECUTE \
7315 (STANDARD_RIGHTS_EXECUTE | \
7316 FILE_READ_ATTRIBUTES | \
7317 FILE_EXECUTE | \
7318 SYNCHRONIZE)
7319
7320 #define FILE_GENERIC_READ \
7321 (STANDARD_RIGHTS_READ | \
7322 FILE_READ_DATA | \
7323 FILE_READ_ATTRIBUTES | \
7324 FILE_READ_EA | \
7325 SYNCHRONIZE)
7326
7327 #define FILE_GENERIC_WRITE \
7328 (STANDARD_RIGHTS_WRITE | \
7329 FILE_WRITE_DATA | \
7330 FILE_WRITE_ATTRIBUTES | \
7331 FILE_WRITE_EA | \
7332 FILE_APPEND_DATA | \
7333 SYNCHRONIZE)
7334
7335 /* end winnt.h */
7336
7337 #define WMIREG_ACTION_REGISTER 1
7338 #define WMIREG_ACTION_DEREGISTER 2
7339 #define WMIREG_ACTION_REREGISTER 3
7340 #define WMIREG_ACTION_UPDATE_GUIDS 4
7341 #define WMIREG_ACTION_BLOCK_IRPS 5
7342
7343 #define WMIREGISTER 0
7344 #define WMIUPDATE 1
7345
7346 _Function_class_(WMI_NOTIFICATION_CALLBACK)
7347 _IRQL_requires_same_
7348 typedef VOID
7349 (NTAPI FWMI_NOTIFICATION_CALLBACK)(
7350 PVOID Wnode,
7351 PVOID Context);
7352 typedef FWMI_NOTIFICATION_CALLBACK *WMI_NOTIFICATION_CALLBACK;
7353
7354 #ifndef _PCI_X_
7355 #define _PCI_X_
7356
7357 typedef struct _PCI_SLOT_NUMBER {
7358 union {
7359 struct {
7360 ULONG DeviceNumber:5;
7361 ULONG FunctionNumber:3;
7362 ULONG Reserved:24;
7363 } bits;
7364 ULONG AsULONG;
7365 } u;
7366 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
7367
7368 #define PCI_TYPE0_ADDRESSES 6
7369 #define PCI_TYPE1_ADDRESSES 2
7370 #define PCI_TYPE2_ADDRESSES 5
7371
7372 typedef struct _PCI_COMMON_HEADER {
7373 PCI_COMMON_HEADER_LAYOUT
7374 } PCI_COMMON_HEADER, *PPCI_COMMON_HEADER;
7375
7376 #ifdef __cplusplus
7377 typedef struct _PCI_COMMON_CONFIG {
7378 PCI_COMMON_HEADER_LAYOUT
7379 UCHAR DeviceSpecific[192];
7380 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
7381 #else
7382 typedef struct _PCI_COMMON_CONFIG {
7383 PCI_COMMON_HEADER DUMMYSTRUCTNAME;
7384 UCHAR DeviceSpecific[192];
7385 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
7386 #endif
7387
7388 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
7389
7390 #define PCI_EXTENDED_CONFIG_LENGTH 0x1000
7391
7392 #define PCI_MAX_DEVICES 32
7393 #define PCI_MAX_FUNCTION 8
7394 #define PCI_MAX_BRIDGE_NUMBER 0xFF
7395 #define PCI_INVALID_VENDORID 0xFFFF
7396
7397 /* PCI_COMMON_CONFIG.HeaderType */
7398 #define PCI_MULTIFUNCTION 0x80
7399 #define PCI_DEVICE_TYPE 0x00
7400 #define PCI_BRIDGE_TYPE 0x01
7401 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
7402
7403 #define PCI_CONFIGURATION_TYPE(PciData) \
7404 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
7405
7406 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
7407 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
7408
7409 /* PCI_COMMON_CONFIG.Command */
7410 #define PCI_ENABLE_IO_SPACE 0x0001
7411 #define PCI_ENABLE_MEMORY_SPACE 0x0002
7412 #define PCI_ENABLE_BUS_MASTER 0x0004
7413 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
7414 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
7415 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
7416 #define PCI_ENABLE_PARITY 0x0040
7417 #define PCI_ENABLE_WAIT_CYCLE 0x0080
7418 #define PCI_ENABLE_SERR 0x0100
7419 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
7420 #define PCI_DISABLE_LEVEL_INTERRUPT 0x0400
7421
7422 /* PCI_COMMON_CONFIG.Status */
7423 #define PCI_STATUS_INTERRUPT_PENDING 0x0008
7424 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
7425 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
7426 #define PCI_STATUS_UDF_SUPPORTED 0x0040
7427 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
7428 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
7429 #define PCI_STATUS_DEVSEL 0x0600
7430 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
7431 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
7432 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
7433 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
7434 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
7435
7436 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
7437
7438 #define PCI_WHICHSPACE_CONFIG 0x0
7439 #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
7440
7441 #define PCI_CAPABILITY_ID_POWER_MANAGEMENT 0x01
7442 #define PCI_CAPABILITY_ID_AGP 0x02
7443 #define PCI_CAPABILITY_ID_VPD 0x03
7444 #define PCI_CAPABILITY_ID_SLOT_ID 0x04
7445 #define PCI_CAPABILITY_ID_MSI 0x05
7446 #define PCI_CAPABILITY_ID_CPCI_HOTSWAP 0x06
7447 #define PCI_CAPABILITY_ID_PCIX 0x07
7448 #define PCI_CAPABILITY_ID_HYPERTRANSPORT 0x08
7449 #define PCI_CAPABILITY_ID_VENDOR_SPECIFIC 0x09
7450 #define PCI_CAPABILITY_ID_DEBUG_PORT 0x0A
7451 #define PCI_CAPABILITY_ID_CPCI_RES_CTRL 0x0B
7452 #define PCI_CAPABILITY_ID_SHPC 0x0C
7453 #define PCI_CAPABILITY_ID_P2P_SSID 0x0D
7454 #define PCI_CAPABILITY_ID_AGP_TARGET 0x0E
7455 #define PCI_CAPABILITY_ID_SECURE 0x0F
7456 #define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10
7457 #define PCI_CAPABILITY_ID_MSIX 0x11
7458
7459 typedef struct _PCI_CAPABILITIES_HEADER {
7460 UCHAR CapabilityID;
7461 UCHAR Next;
7462 } PCI_CAPABILITIES_HEADER, *PPCI_CAPABILITIES_HEADER;
7463
7464 typedef struct _PCI_PMC {
7465 UCHAR Version:3;
7466 UCHAR PMEClock:1;
7467 UCHAR Rsvd1:1;
7468 UCHAR DeviceSpecificInitialization:1;
7469 UCHAR Rsvd2:2;
7470 struct _PM_SUPPORT {
7471 UCHAR Rsvd2:1;
7472 UCHAR D1:1;
7473 UCHAR D2:1;
7474 UCHAR PMED0:1;
7475 UCHAR PMED1:1;
7476 UCHAR PMED2:1;
7477 UCHAR PMED3Hot:1;
7478 UCHAR PMED3Cold:1;
7479 } Support;
7480 } PCI_PMC, *PPCI_PMC;
7481
7482 typedef struct _PCI_PMCSR {
7483 USHORT PowerState:2;
7484 USHORT Rsvd1:6;
7485 USHORT PMEEnable:1;
7486 USHORT DataSelect:4;
7487 USHORT DataScale:2;
7488 USHORT PMEStatus:1;
7489 } PCI_PMCSR, *PPCI_PMCSR;
7490
7491 typedef struct _PCI_PMCSR_BSE {
7492 UCHAR Rsvd1:6;
7493 UCHAR D3HotSupportsStopClock:1;
7494 UCHAR BusPowerClockControlEnabled:1;
7495 } PCI_PMCSR_BSE, *PPCI_PMCSR_BSE;
7496
7497 typedef struct _PCI_PM_CAPABILITY {
7498 PCI_CAPABILITIES_HEADER Header;
7499 union {
7500 PCI_PMC Capabilities;
7501 USHORT AsUSHORT;
7502 } PMC;
7503 union {
7504 PCI_PMCSR ControlStatus;
7505 USHORT AsUSHORT;
7506 } PMCSR;
7507 union {
7508 PCI_PMCSR_BSE BridgeSupport;
7509 UCHAR AsUCHAR;
7510 } PMCSR_BSE;
7511 UCHAR Data;
7512 } PCI_PM_CAPABILITY, *PPCI_PM_CAPABILITY;
7513
7514 typedef struct {
7515 PCI_CAPABILITIES_HEADER Header;
7516 union {
7517 struct {
7518 USHORT DataParityErrorRecoveryEnable:1;
7519 USHORT EnableRelaxedOrdering:1;
7520 USHORT MaxMemoryReadByteCount:2;
7521 USHORT MaxOutstandingSplitTransactions:3;
7522 USHORT Reserved:9;
7523 } bits;
7524 USHORT AsUSHORT;
7525 } Command;
7526 union {
7527 struct {
7528 ULONG FunctionNumber:3;
7529 ULONG DeviceNumber:5;
7530 ULONG BusNumber:8;
7531 ULONG Device64Bit:1;
7532 ULONG Capable133MHz:1;
7533 ULONG SplitCompletionDiscarded:1;
7534 ULONG UnexpectedSplitCompletion:1;
7535 ULONG DeviceComplexity:1;
7536 ULONG DesignedMaxMemoryReadByteCount:2;
7537 ULONG DesignedMaxOutstandingSplitTransactions:3;
7538 ULONG DesignedMaxCumulativeReadSize:3;
7539 ULONG ReceivedSplitCompletionErrorMessage:1;
7540 ULONG CapablePCIX266:1;
7541 ULONG CapablePCIX533:1;
7542 } bits;
7543 ULONG AsULONG;
7544 } Status;
7545 } PCI_X_CAPABILITY, *PPCI_X_CAPABILITY;
7546
7547 #define PCI_EXPRESS_ADVANCED_ERROR_REPORTING_CAP_ID 0x0001
7548 #define PCI_EXPRESS_VIRTUAL_CHANNEL_CAP_ID 0x0002
7549 #define PCI_EXPRESS_DEVICE_SERIAL_NUMBER_CAP_ID 0x0003
7550 #define PCI_EXPRESS_POWER_BUDGETING_CAP_ID 0x0004
7551 #define PCI_EXPRESS_RC_LINK_DECLARATION_CAP_ID 0x0005
7552 #define PCI_EXPRESS_RC_INTERNAL_LINK_CONTROL_CAP_ID 0x0006
7553 #define PCI_EXPRESS_RC_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_CAP_ID 0x0007
7554 #define PCI_EXPRESS_MFVC_CAP_ID 0x0008
7555 #define PCI_EXPRESS_VC_AND_MFVC_CAP_ID 0x0009
7556 #define PCI_EXPRESS_RCRB_HEADER_CAP_ID 0x000A
7557 #define PCI_EXPRESS_SINGLE_ROOT_IO_VIRTUALIZATION_CAP_ID 0x0010
7558
7559 typedef struct _PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER {
7560 USHORT CapabilityID;
7561 USHORT Version:4;
7562 USHORT Next:12;
7563 } PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER, *PPCI_EXPRESS_ENHANCED_CAPABILITY_HEADER;
7564
7565 typedef struct _PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY {
7566 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
7567 ULONG LowSerialNumber;
7568 ULONG HighSerialNumber;
7569 } PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY, *PPCI_EXPRESS_SERIAL_NUMBER_CAPABILITY;
7570
7571 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS {
7572 _ANONYMOUS_STRUCT struct {
7573 ULONG Undefined:1;
7574 ULONG Reserved1:3;
7575 ULONG DataLinkProtocolError:1;
7576 ULONG SurpriseDownError:1;
7577 ULONG Reserved2:6;
7578 ULONG PoisonedTLP:1;
7579 ULONG FlowControlProtocolError:1;
7580 ULONG CompletionTimeout:1;
7581 ULONG CompleterAbort:1;
7582 ULONG UnexpectedCompletion:1;
7583 ULONG ReceiverOverflow:1;
7584 ULONG MalformedTLP:1;
7585 ULONG ECRCError:1;
7586 ULONG UnsupportedRequestError:1;
7587 ULONG Reserved3:11;
7588 } DUMMYSTRUCTNAME;
7589 ULONG AsULONG;
7590 } PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS;
7591
7592 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK {
7593 _ANONYMOUS_STRUCT struct {
7594 ULONG Undefined:1;
7595 ULONG Reserved1:3;
7596 ULONG DataLinkProtocolError:1;
7597 ULONG SurpriseDownError:1;
7598 ULONG Reserved2:6;
7599 ULONG PoisonedTLP:1;
7600 ULONG FlowControlProtocolError:1;
7601 ULONG CompletionTimeout:1;
7602 ULONG CompleterAbort:1;
7603 ULONG UnexpectedCompletion:1;
7604 ULONG ReceiverOverflow:1;
7605 ULONG MalformedTLP:1;
7606 ULONG ECRCError:1;
7607 ULONG UnsupportedRequestError:1;
7608 ULONG Reserved3:11;
7609 } DUMMYSTRUCTNAME;
7610 ULONG AsULONG;
7611 } PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_MASK;
7612
7613 typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY {
7614 _ANONYMOUS_STRUCT struct {
7615 ULONG Undefined:1;
7616 ULONG Reserved1:3;
7617 ULONG DataLinkProtocolError:1;
7618 ULONG SurpriseDownError:1;
7619 ULONG Reserved2:6;
7620 ULONG PoisonedTLP:1;
7621 ULONG FlowControlProtocolError:1;
7622 ULONG CompletionTimeout:1;
7623 ULONG CompleterAbort:1;
7624 ULONG UnexpectedCompletion:1;
7625 ULONG ReceiverOverflow:1;
7626 ULONG MalformedTLP:1;
7627 ULONG ECRCError:1;
7628 ULONG UnsupportedRequestError:1;
7629 ULONG Reserved3:11;
7630 } DUMMYSTRUCTNAME;
7631 ULONG AsULONG;
7632 } PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY;
7633
7634 typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_STATUS {
7635 _ANONYMOUS_STRUCT struct {
7636 ULONG ReceiverError:1;
7637 ULONG Reserved1:5;
7638 ULONG BadTLP:1;
7639 ULONG BadDLLP:1;
7640 ULONG ReplayNumRollover:1;
7641 ULONG Reserved2:3;
7642 ULONG ReplayTimerTimeout:1;
7643 ULONG AdvisoryNonFatalError:1;
7644 ULONG Reserved3:18;
7645 } DUMMYSTRUCTNAME;
7646 ULONG AsULONG;
7647 } PCI_EXPRESS_CORRECTABLE_ERROR_STATUS, *PPCI_CORRECTABLE_ERROR_STATUS;
7648
7649 typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_MASK {
7650 _ANONYMOUS_STRUCT struct {
7651 ULONG ReceiverError:1;
7652 ULONG Reserved1:5;
7653 ULONG BadTLP:1;
7654 ULONG BadDLLP:1;
7655 ULONG ReplayNumRollover:1;
7656 ULONG Reserved2:3;
7657 ULONG ReplayTimerTimeout:1;
7658 ULONG AdvisoryNonFatalError:1;
7659 ULONG Reserved3:18;
7660 } DUMMYSTRUCTNAME;
7661 ULONG AsULONG;
7662 } PCI_EXPRESS_CORRECTABLE_ERROR_MASK, *PPCI_CORRECTABLE_ERROR_MASK;
7663
7664 typedef union _PCI_EXPRESS_AER_CAPABILITIES {
7665 _ANONYMOUS_STRUCT struct {
7666 ULONG FirstErrorPointer:5;
7667 ULONG ECRCGenerationCapable:1;
7668 ULONG ECRCGenerationEnable:1;
7669 ULONG ECRCCheckCapable:1;
7670 ULONG ECRCCheckEnable:1;
7671 ULONG Reserved:23;
7672 } DUMMYSTRUCTNAME;
7673 ULONG AsULONG;
7674 } PCI_EXPRESS_AER_CAPABILITIES, *PPCI_EXPRESS_AER_CAPABILITIES;
7675
7676 typedef union _PCI_EXPRESS_ROOT_ERROR_COMMAND {
7677 _ANONYMOUS_STRUCT struct {
7678 ULONG CorrectableErrorReportingEnable:1;
7679 ULONG NonFatalErrorReportingEnable:1;
7680 ULONG FatalErrorReportingEnable:1;
7681 ULONG Reserved:29;
7682 } DUMMYSTRUCTNAME;
7683 ULONG AsULONG;
7684 } PCI_EXPRESS_ROOT_ERROR_COMMAND, *PPCI_EXPRESS_ROOT_ERROR_COMMAND;
7685
7686 typedef union _PCI_EXPRESS_ROOT_ERROR_STATUS {
7687 _ANONYMOUS_STRUCT struct {
7688 ULONG CorrectableErrorReceived:1;
7689 ULONG MultipleCorrectableErrorsReceived:1;
7690 ULONG UncorrectableErrorReceived:1;
7691 ULONG MultipleUncorrectableErrorsReceived:1;
7692 ULONG FirstUncorrectableFatal:1;
7693 ULONG NonFatalErrorMessagesReceived:1;
7694 ULONG FatalErrorMessagesReceived:1;
7695 ULONG Reserved:20;
7696 ULONG AdvancedErrorInterruptMessageNumber:5;
7697 } DUMMYSTRUCTNAME;
7698 ULONG AsULONG;
7699 } PCI_EXPRESS_ROOT_ERROR_STATUS, *PPCI_EXPRESS_ROOT_ERROR_STATUS;
7700
7701 typedef union _PCI_EXPRESS_ERROR_SOURCE_ID {
7702 _ANONYMOUS_STRUCT struct {
7703 USHORT CorrectableSourceIdFun:3;
7704 USHORT CorrectableSourceIdDev:5;
7705 USHORT CorrectableSourceIdBus:8;
7706 USHORT UncorrectableSourceIdFun:3;
7707 USHORT UncorrectableSourceIdDev:5;
7708 USHORT UncorrectableSourceIdBus:8;
7709 } DUMMYSTRUCTNAME;
7710 ULONG AsULONG;
7711 } PCI_EXPRESS_ERROR_SOURCE_ID, *PPCI_EXPRESS_ERROR_SOURCE_ID;
7712
7713 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS {
7714 _ANONYMOUS_STRUCT struct {
7715 ULONG TargetAbortOnSplitCompletion:1;
7716 ULONG MasterAbortOnSplitCompletion:1;
7717 ULONG ReceivedTargetAbort:1;
7718 ULONG ReceivedMasterAbort:1;
7719 ULONG RsvdZ:1;
7720 ULONG UnexpectedSplitCompletionError:1;
7721 ULONG UncorrectableSplitCompletion:1;
7722 ULONG UncorrectableDataError:1;
7723 ULONG UncorrectableAttributeError:1;
7724 ULONG UncorrectableAddressError:1;
7725 ULONG DelayedTransactionDiscardTimerExpired:1;
7726 ULONG PERRAsserted:1;
7727 ULONG SERRAsserted:1;
7728 ULONG InternalBridgeError:1;
7729 ULONG Reserved:18;
7730 } DUMMYSTRUCTNAME;
7731 ULONG AsULONG;
7732 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS;
7733
7734 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK {
7735 _ANONYMOUS_STRUCT struct {
7736 ULONG TargetAbortOnSplitCompletion:1;
7737 ULONG MasterAbortOnSplitCompletion:1;
7738 ULONG ReceivedTargetAbort:1;
7739 ULONG ReceivedMasterAbort:1;
7740 ULONG RsvdZ:1;
7741 ULONG UnexpectedSplitCompletionError:1;
7742 ULONG UncorrectableSplitCompletion:1;
7743 ULONG UncorrectableDataError:1;
7744 ULONG UncorrectableAttributeError:1;
7745 ULONG UncorrectableAddressError:1;
7746 ULONG DelayedTransactionDiscardTimerExpired:1;
7747 ULONG PERRAsserted:1;
7748 ULONG SERRAsserted:1;
7749 ULONG InternalBridgeError:1;
7750 ULONG Reserved:18;
7751 } DUMMYSTRUCTNAME;
7752 ULONG AsULONG;
7753 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK;
7754
7755 typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY {
7756 _ANONYMOUS_STRUCT struct {
7757 ULONG TargetAbortOnSplitCompletion:1;
7758 ULONG MasterAbortOnSplitCompletion:1;
7759 ULONG ReceivedTargetAbort:1;
7760 ULONG ReceivedMasterAbort:1;
7761 ULONG RsvdZ:1;
7762 ULONG UnexpectedSplitCompletionError:1;
7763 ULONG UncorrectableSplitCompletion:1;
7764 ULONG UncorrectableDataError:1;
7765 ULONG UncorrectableAttributeError:1;
7766 ULONG UncorrectableAddressError:1;
7767 ULONG DelayedTransactionDiscardTimerExpired:1;
7768 ULONG PERRAsserted:1;
7769 ULONG SERRAsserted:1;
7770 ULONG InternalBridgeError:1;
7771 ULONG Reserved:18;
7772 } DUMMYSTRUCTNAME;
7773 ULONG AsULONG;
7774 } PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY;
7775
7776 typedef union _PCI_EXPRESS_SEC_AER_CAPABILITIES {
7777 _ANONYMOUS_STRUCT struct {
7778 ULONG SecondaryUncorrectableFirstErrorPtr:5;
7779 ULONG Reserved:27;
7780 } DUMMYSTRUCTNAME;
7781 ULONG AsULONG;
7782 } PCI_EXPRESS_SEC_AER_CAPABILITIES, *PPCI_EXPRESS_SEC_AER_CAPABILITIES;
7783
7784 #define ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING 0x00000001
7785 #define ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING 0x00000002
7786 #define ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING 0x00000004
7787
7788 #define ROOT_CMD_ERROR_REPORTING_ENABLE_MASK \
7789 (ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING | \
7790 ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING | \
7791 ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING)
7792
7793 typedef struct _PCI_EXPRESS_AER_CAPABILITY {
7794 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
7795 PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
7796 PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
7797 PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
7798 PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
7799 PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
7800 PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
7801 ULONG HeaderLog[4];
7802 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus;
7803 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask;
7804 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity;
7805 PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl;
7806 ULONG SecHeaderLog[4];
7807 } PCI_EXPRESS_AER_CAPABILITY, *PPCI_EXPRESS_AER_CAPABILITY;
7808
7809 typedef struct _PCI_EXPRESS_ROOTPORT_AER_CAPABILITY {
7810 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
7811 PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
7812 PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
7813 PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
7814 PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
7815 PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
7816 PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
7817 ULONG HeaderLog[4];
7818 PCI_EXPRESS_ROOT_ERROR_COMMAND RootErrorCommand;
7819 PCI_EXPRESS_ROOT_ERROR_STATUS RootErrorStatus;
7820 PCI_EXPRESS_ERROR_SOURCE_ID ErrorSourceId;
7821 } PCI_EXPRESS_ROOTPORT_AER_CAPABILITY, *PPCI_EXPRESS_ROOTPORT_AER_CAPABILITY;
7822
7823 typedef struct _PCI_EXPRESS_BRIDGE_AER_CAPABILITY {
7824 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
7825 PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus;
7826 PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask;
7827 PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity;
7828 PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus;
7829 PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask;
7830 PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl;
7831 ULONG HeaderLog[4];
7832 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus;
7833 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask;
7834 PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity;
7835 PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl;
7836 ULONG SecHeaderLog[4];
7837 } PCI_EXPRESS_BRIDGE_AER_CAPABILITY, *PPCI_EXPRESS_BRIDGE_AER_CAPABILITY;
7838
7839 typedef union _PCI_EXPRESS_SRIOV_CAPS {
7840 _ANONYMOUS_STRUCT struct {
7841 ULONG VFMigrationCapable:1;
7842 ULONG Reserved1:20;
7843 ULONG VFMigrationInterruptNumber:11;
7844 } DUMMYSTRUCTNAME;
7845 ULONG AsULONG;
7846 } PCI_EXPRESS_SRIOV_CAPS, *PPCI_EXPRESS_SRIOV_CAPS;
7847
7848 typedef union _PCI_EXPRESS_SRIOV_CONTROL {
7849 _ANONYMOUS_STRUCT struct {
7850 USHORT VFEnable:1;
7851 USHORT VFMigrationEnable:1;
7852 USHORT VFMigrationInterruptEnable:1;
7853 USHORT VFMemorySpaceEnable:1;
7854 USHORT ARICapableHierarchy:1;
7855 USHORT Reserved1:11;
7856 } DUMMYSTRUCTNAME;
7857 USHORT AsUSHORT;
7858 } PCI_EXPRESS_SRIOV_CONTROL, *PPCI_EXPRESS_SRIOV_CONTROL;
7859
7860 typedef union _PCI_EXPRESS_SRIOV_STATUS {
7861 _ANONYMOUS_STRUCT struct {
7862 USHORT VFMigrationStatus:1;
7863 USHORT Reserved1:15;
7864 } DUMMYSTRUCTNAME;
7865 USHORT AsUSHORT;
7866 } PCI_EXPRESS_SRIOV_STATUS, *PPCI_EXPRESS_SRIOV_STATUS;
7867
7868 typedef union _PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY {
7869 _ANONYMOUS_STRUCT struct {
7870 ULONG VFMigrationStateBIR:3;
7871 ULONG VFMigrationStateOffset:29;
7872 } DUMMYSTRUCTNAME;
7873 ULONG AsULONG;
7874 } PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY, *PPCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY;
7875
7876 typedef struct _PCI_EXPRESS_SRIOV_CAPABILITY {
7877 PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header;
7878 PCI_EXPRESS_SRIOV_CAPS SRIOVCapabilities;
7879 PCI_EXPRESS_SRIOV_CONTROL SRIOVControl;
7880 PCI_EXPRESS_SRIOV_STATUS SRIOVStatus;
7881 USHORT InitialVFs;
7882 USHORT TotalVFs;
7883 USHORT NumVFs;
7884 UCHAR FunctionDependencyLink;
7885 UCHAR RsvdP1;
7886 USHORT FirstVFOffset;
7887 USHORT VFStride;
7888 USHORT RsvdP2;
7889 USHORT VFDeviceId;
7890 ULONG SupportedPageSizes;
7891 ULONG SystemPageSize;
7892 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
7893 PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY VFMigrationStateArrayOffset;
7894 } PCI_EXPRESS_SRIOV_CAPABILITY, *PPCI_EXPRESS_SRIOV_CAPABILITY;
7895
7896 /* PCI device classes */
7897 #define PCI_CLASS_PRE_20 0x00
7898 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
7899 #define PCI_CLASS_NETWORK_CTLR 0x02
7900 #define PCI_CLASS_DISPLAY_CTLR 0x03
7901 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
7902 #define PCI_CLASS_MEMORY_CTLR 0x05
7903 #define PCI_CLASS_BRIDGE_DEV 0x06
7904 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
7905 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
7906 #define PCI_CLASS_INPUT_DEV 0x09
7907 #define PCI_CLASS_DOCKING_STATION 0x0a
7908 #define PCI_CLASS_PROCESSOR 0x0b
7909 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
7910 #define PCI_CLASS_WIRELESS_CTLR 0x0d
7911 #define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e
7912 #define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f
7913 #define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10
7914 #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11
7915 #define PCI_CLASS_NOT_DEFINED 0xff
7916
7917 /* PCI device subclasses for class 0 */
7918 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
7919 #define PCI_SUBCLASS_PRE_20_VGA 0x01
7920
7921 /* PCI device subclasses for class 1 (mass storage controllers)*/
7922 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
7923 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
7924 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
7925 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
7926 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
7927 #define PCI_SUBCLASS_MSC_OTHER 0x80
7928
7929 /* PCI device subclasses for class 2 (network controllers)*/
7930 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
7931 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
7932 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
7933 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
7934 #define PCI_SUBCLASS_NET_ISDN_CTLR 0x04
7935 #define PCI_SUBCLASS_NET_OTHER 0x80
7936
7937 /* PCI device subclasses for class 3 (display controllers)*/
7938 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
7939 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
7940 #define PCI_SUBCLASS_VID_3D_CTLR 0x02
7941 #define PCI_SUBCLASS_VID_OTHER 0x80
7942
7943 /* PCI device subclasses for class 4 (multimedia device)*/
7944 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
7945 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
7946 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
7947 #define PCI_SUBCLASS_MM_OTHER 0x80
7948
7949 /* PCI device subclasses for class 5 (memory controller)*/
7950 #define PCI_SUBCLASS_MEM_RAM 0x00
7951 #define PCI_SUBCLASS_MEM_FLASH 0x01
7952 #define PCI_SUBCLASS_MEM_OTHER 0x80
7953
7954 /* PCI device subclasses for class 6 (bridge device)*/
7955 #define PCI_SUBCLASS_BR_HOST 0x00
7956 #define PCI_SUBCLASS_BR_ISA 0x01
7957 #define PCI_SUBCLASS_BR_EISA 0x02
7958 #define PCI_SUBCLASS_BR_MCA 0x03
7959 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
7960 #define PCI_SUBCLASS_BR_PCMCIA 0x05
7961 #define PCI_SUBCLASS_BR_NUBUS 0x06
7962 #define PCI_SUBCLASS_BR_CARDBUS 0x07
7963 #define PCI_SUBCLASS_BR_RACEWAY 0x08
7964 #define PCI_SUBCLASS_BR_OTHER 0x80
7965
7966 #define PCI_SUBCLASS_COM_SERIAL 0x00
7967 #define PCI_SUBCLASS_COM_PARALLEL 0x01
7968 #define PCI_SUBCLASS_COM_MULTIPORT 0x02
7969 #define PCI_SUBCLASS_COM_MODEM 0x03
7970 #define PCI_SUBCLASS_COM_OTHER 0x80
7971
7972 #define PCI_SUBCLASS_SYS_INTERRUPT_CTLR 0x00
7973 #define PCI_SUBCLASS_SYS_DMA_CTLR 0x01
7974 #define PCI_SUBCLASS_SYS_SYSTEM_TIMER 0x02
7975 #define PCI_SUBCLASS_SYS_REAL_TIME_CLOCK 0x03
7976 #define PCI_SUBCLASS_SYS_GEN_HOTPLUG_CTLR 0x04
7977 #define PCI_SUBCLASS_SYS_SDIO_CTRL 0x05
7978 #define PCI_SUBCLASS_SYS_OTHER 0x80
7979
7980 #define PCI_SUBCLASS_INP_KEYBOARD 0x00
7981 #define PCI_SUBCLASS_INP_DIGITIZER 0x01
7982 #define PCI_SUBCLASS_INP_MOUSE 0x02
7983 #define PCI_SUBCLASS_INP_SCANNER 0x03
7984 #define PCI_SUBCLASS_INP_GAMEPORT 0x04
7985 #define PCI_SUBCLASS_INP_OTHER 0x80
7986
7987 #define PCI_SUBCLASS_DOC_GENERIC 0x00
7988 #define PCI_SUBCLASS_DOC_OTHER 0x80
7989
7990 #define PCI_SUBCLASS_PROC_386 0x00
7991 #define PCI_SUBCLASS_PROC_486 0x01
7992 #define PCI_SUBCLASS_PROC_PENTIUM 0x02
7993 #define PCI_SUBCLASS_PROC_ALPHA 0x10
7994 #define PCI_SUBCLASS_PROC_POWERPC 0x20
7995 #define PCI_SUBCLASS_PROC_COPROCESSOR 0x40
7996
7997 /* PCI device subclasses for class C (serial bus controller)*/
7998 #define PCI_SUBCLASS_SB_IEEE1394 0x00
7999 #define PCI_SUBCLASS_SB_ACCESS 0x01
8000 #define PCI_SUBCLASS_SB_SSA 0x02
8001 #define PCI_SUBCLASS_SB_USB 0x03
8002 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
8003 #define PCI_SUBCLASS_SB_SMBUS 0x05
8004
8005 #define PCI_SUBCLASS_WIRELESS_IRDA 0x00
8006 #define PCI_SUBCLASS_WIRELESS_CON_IR 0x01
8007 #define PCI_SUBCLASS_WIRELESS_RF 0x10
8008 #define PCI_SUBCLASS_WIRELESS_OTHER 0x80
8009
8010 #define PCI_SUBCLASS_INTIO_I2O 0x00
8011
8012 #define PCI_SUBCLASS_SAT_TV 0x01
8013 #define PCI_SUBCLASS_SAT_AUDIO 0x02
8014 #define PCI_SUBCLASS_SAT_VOICE 0x03
8015 #define PCI_SUBCLASS_SAT_DATA 0x04
8016
8017 #define PCI_SUBCLASS_CRYPTO_NET_COMP 0x00
8018 #define PCI_SUBCLASS_CRYPTO_ENTERTAINMENT 0x10
8019 #define PCI_SUBCLASS_CRYPTO_OTHER 0x80
8020
8021 #define PCI_SUBCLASS_DASP_DPIO 0x00
8022 #define PCI_SUBCLASS_DASP_OTHER 0x80
8023
8024 #define PCI_ADDRESS_IO_SPACE 0x00000001
8025 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006
8026 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008
8027 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
8028 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
8029 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
8030
8031 #define PCI_TYPE_32BIT 0
8032 #define PCI_TYPE_20BIT 2
8033 #define PCI_TYPE_64BIT 4
8034
8035 #define PCI_ROMADDRESS_ENABLED 0x00000001
8036
8037 #endif /* _PCI_X_ */
8038
8039 #define PCI_EXPRESS_LINK_QUIESCENT_INTERFACE_VERSION 1
8040
8041 _IRQL_requires_max_(PASSIVE_LEVEL)
8042 _Must_inspect_result_
8043 typedef NTSTATUS
8044 (NTAPI PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE)(
8045 _Inout_ PVOID Context);
8046 typedef PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE *PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE;
8047
8048 _IRQL_requires_max_(PASSIVE_LEVEL)
8049 _Must_inspect_result_
8050 typedef NTSTATUS
8051 (NTAPI PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE)(
8052 _Inout_ PVOID Context);
8053 typedef PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE *PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE;
8054
8055 typedef struct _PCI_EXPRESS_LINK_QUIESCENT_INTERFACE {
8056 USHORT Size;
8057 USHORT Version;
8058 PVOID Context;
8059 PINTERFACE_REFERENCE InterfaceReference;
8060 PINTERFACE_DEREFERENCE InterfaceDereference;
8061 PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE PciExpressEnterLinkQuiescentMode;
8062 PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE PciExpressExitLinkQuiescentMode;
8063 } PCI_EXPRESS_LINK_QUIESCENT_INTERFACE, *PPCI_EXPRESS_LINK_QUIESCENT_INTERFACE;
8064
8065 #define PCI_EXPRESS_ROOT_PORT_INTERFACE_VERSION 1
8066
8067 typedef ULONG
8068 (NTAPI *PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE)(
8069 _In_ PVOID Context,
8070 _Out_writes_bytes_(Length) PVOID Buffer,
8071 _In_ ULONG Offset,
8072 _In_ ULONG Length);
8073
8074 typedef ULONG
8075 (NTAPI *PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE)(
8076 _In_ PVOID Context,
8077 _In_reads_bytes_(Length) PVOID Buffer,
8078 _In_ ULONG Offset,
8079 _In_ ULONG Length);
8080
8081 typedef struct _PCI_EXPRESS_ROOT_PORT_INTERFACE {
8082 USHORT Size;
8083 USHORT Version;
8084 PVOID Context;
8085 PINTERFACE_REFERENCE InterfaceReference;
8086 PINTERFACE_DEREFERENCE InterfaceDereference;
8087 PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE ReadConfigSpace;
8088 PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE WriteConfigSpace;
8089 } PCI_EXPRESS_ROOT_PORT_INTERFACE, *PPCI_EXPRESS_ROOT_PORT_INTERFACE;
8090
8091 #define PCI_MSIX_TABLE_CONFIG_INTERFACE_VERSION 1
8092
8093 _Must_inspect_result_
8094 typedef NTSTATUS
8095 (NTAPI PCI_MSIX_SET_ENTRY)(
8096 _In_ PVOID Context,
8097 _In_ ULONG TableEntry,
8098 _In_ ULONG MessageNumber);
8099 typedef PCI_MSIX_SET_ENTRY *PPCI_MSIX_SET_ENTRY;
8100
8101 _Must_inspect_result_
8102 typedef NTSTATUS
8103 (NTAPI PCI_MSIX_MASKUNMASK_ENTRY)(
8104 _In_ PVOID Context,
8105 _In_ ULONG TableEntry);
8106 typedef PCI_MSIX_MASKUNMASK_ENTRY *PPCI_MSIX_MASKUNMASK_ENTRY;
8107
8108 _Must_inspect_result_
8109 typedef NTSTATUS
8110 (NTAPI PCI_MSIX_GET_ENTRY)(
8111 _In_ PVOID Context,
8112 _In_ ULONG TableEntry,
8113 _Out_ PULONG MessageNumber,
8114 _Out_ PBOOLEAN Masked);
8115 typedef PCI_MSIX_GET_ENTRY *PPCI_MSIX_GET_ENTRY;
8116
8117 _Must_inspect_result_
8118 typedef NTSTATUS
8119 (NTAPI PCI_MSIX_GET_TABLE_SIZE)(
8120 _In_ PVOID Context,
8121 _Out_ PULONG TableSize);
8122 typedef PCI_MSIX_GET_TABLE_SIZE *PPCI_MSIX_GET_TABLE_SIZE;
8123
8124 typedef struct _PCI_MSIX_TABLE_CONFIG_INTERFACE {
8125 USHORT Size;
8126 USHORT Version;
8127 PVOID Context;
8128 PINTERFACE_REFERENCE InterfaceReference;
8129 PINTERFACE_DEREFERENCE InterfaceDereference;
8130 PPCI_MSIX_SET_ENTRY SetTableEntry;
8131 PPCI_MSIX_MASKUNMASK_ENTRY MaskTableEntry;
8132 PPCI_MSIX_MASKUNMASK_ENTRY UnmaskTableEntry;
8133 PPCI_MSIX_GET_ENTRY GetTableEntry;
8134 PPCI_MSIX_GET_TABLE_SIZE GetTableSize;
8135 } PCI_MSIX_TABLE_CONFIG_INTERFACE, *PPCI_MSIX_TABLE_CONFIG_INTERFACE;
8136
8137 #define PCI_MSIX_TABLE_CONFIG_MINIMUM_SIZE \
8138 RTL_SIZEOF_THROUGH_FIELD(PCI_MSIX_TABLE_CONFIG_INTERFACE, UnmaskTableEntry)
8139
8140 /******************************************************************************
8141 * Object Manager Types *
8142 ******************************************************************************/
8143
8144 #define MAXIMUM_FILENAME_LENGTH 256
8145 #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
8146
8147 #define OBJECT_TYPE_CREATE 0x0001
8148 #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
8149
8150 #define DIRECTORY_QUERY 0x0001
8151 #define DIRECTORY_TRAVERSE 0x0002
8152 #define DIRECTORY_CREATE_OBJECT 0x0004
8153 #define DIRECTORY_CREATE_SUBDIRECTORY 0x0008
8154 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
8155
8156 #define SYMBOLIC_LINK_QUERY 0x0001
8157 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
8158
8159 #define DUPLICATE_CLOSE_SOURCE 0x00000001
8160 #define DUPLICATE_SAME_ACCESS 0x00000002
8161 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
8162
8163 #define OB_FLT_REGISTRATION_VERSION_0100 0x0100
8164 #define OB_FLT_REGISTRATION_VERSION OB_FLT_REGISTRATION_VERSION_0100
8165
8166 typedef ULONG OB_OPERATION;
8167
8168 #define OB_OPERATION_HANDLE_CREATE 0x00000001
8169 #define OB_OPERATION_HANDLE_DUPLICATE 0x00000002
8170
8171 typedef struct _OB_PRE_CREATE_HANDLE_INFORMATION {
8172 _Inout_ ACCESS_MASK DesiredAccess;
8173 _In_ ACCESS_MASK OriginalDesiredAccess;
8174 } OB_PRE_CREATE_HANDLE_INFORMATION, *POB_PRE_CREATE_HANDLE_INFORMATION;
8175
8176 typedef struct _OB_PRE_DUPLICATE_HANDLE_INFORMATION {
8177 _Inout_ ACCESS_MASK DesiredAccess;
8178 _In_ ACCESS_MASK OriginalDesiredAccess;
8179 _In_ PVOID SourceProcess;
8180 _In_ PVOID TargetProcess;
8181 } OB_PRE_DUPLICATE_HANDLE_INFORMATION, *POB_PRE_DUPLICATE_HANDLE_INFORMATION;
8182
8183 typedef union _OB_PRE_OPERATION_PARAMETERS {
8184 _Inout_ OB_PRE_CREATE_HANDLE_INFORMATION CreateHandleInformation;
8185 _Inout_ OB_PRE_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation;
8186 } OB_PRE_OPERATION_PARAMETERS, *POB_PRE_OPERATION_PARAMETERS;
8187
8188 typedef struct _OB_PRE_OPERATION_INFORMATION {
8189 _In_ OB_OPERATION Operation;
8190 _ANONYMOUS_UNION union {
8191 _In_ ULONG Flags;
8192 _ANONYMOUS_STRUCT struct {
8193 _In_ ULONG KernelHandle:1;
8194 _In_ ULONG Reserved:31;
8195 } DUMMYSTRUCTNAME;
8196 } DUMMYUNIONNAME;
8197 _In_ PVOID Object;
8198 _In_ POBJECT_TYPE ObjectType;
8199 _Out_ PVOID CallContext;
8200 _In_ POB_PRE_OPERATION_PARAMETERS Parameters;
8201 } OB_PRE_OPERATION_INFORMATION, *POB_PRE_OPERATION_INFORMATION;
8202
8203 typedef struct _OB_POST_CREATE_HANDLE_INFORMATION {
8204 _In_ ACCESS_MASK GrantedAccess;
8205 } OB_POST_CREATE_HANDLE_INFORMATION, *POB_POST_CREATE_HANDLE_INFORMATION;
8206
8207 typedef struct _OB_POST_DUPLICATE_HANDLE_INFORMATION {
8208 _In_ ACCESS_MASK GrantedAccess;
8209 } OB_POST_DUPLICATE_HANDLE_INFORMATION, *POB_POST_DUPLICATE_HANDLE_INFORMATION;
8210
8211 typedef union _OB_POST_OPERATION_PARAMETERS {
8212 _In_ OB_POST_CREATE_HANDLE_INFORMATION CreateHandleInformation;
8213 _In_ OB_POST_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation;
8214 } OB_POST_OPERATION_PARAMETERS, *POB_POST_OPERATION_PARAMETERS;
8215
8216 typedef struct _OB_POST_OPERATION_INFORMATION {
8217 _In_ OB_OPERATION Operation;
8218 _ANONYMOUS_UNION union {
8219 _In_ ULONG Flags;
8220 _ANONYMOUS_STRUCT struct {
8221 _In_ ULONG KernelHandle:1;
8222 _In_ ULONG Reserved:31;
8223 } DUMMYSTRUCTNAME;
8224 } DUMMYUNIONNAME;
8225 _In_ PVOID Object;
8226 _In_ POBJECT_TYPE ObjectType;
8227 _In_ PVOID CallContext;
8228 _In_ NTSTATUS ReturnStatus;
8229 _In_ POB_POST_OPERATION_PARAMETERS Parameters;
8230 } OB_POST_OPERATION_INFORMATION,*POB_POST_OPERATION_INFORMATION;
8231
8232 typedef enum _OB_PREOP_CALLBACK_STATUS {
8233 OB_PREOP_SUCCESS
8234 } OB_PREOP_CALLBACK_STATUS, *POB_PREOP_CALLBACK_STATUS;
8235
8236 typedef OB_PREOP_CALLBACK_STATUS
8237 (NTAPI *POB_PRE_OPERATION_CALLBACK)(
8238 _In_ PVOID RegistrationContext,
8239 _Inout_ POB_PRE_OPERATION_INFORMATION OperationInformation);
8240
8241 typedef VOID
8242 (NTAPI *POB_POST_OPERATION_CALLBACK)(
8243 _In_ PVOID RegistrationContext,
8244 _In_ POB_POST_OPERATION_INFORMATION OperationInformation);
8245
8246 typedef struct _OB_OPERATION_REGISTRATION {
8247 _In_ POBJECT_TYPE *ObjectType;
8248 _In_ OB_OPERATION Operations;
8249 _In_ POB_PRE_OPERATION_CALLBACK PreOperation;
8250 _In_ POB_POST_OPERATION_CALLBACK PostOperation;
8251 } OB_OPERATION_REGISTRATION, *POB_OPERATION_REGISTRATION;
8252
8253 typedef struct _OB_CALLBACK_REGISTRATION {
8254 _In_ USHORT Version;
8255 _In_ USHORT OperationRegistrationCount;
8256 _In_ UNICODE_STRING Altitude;
8257 _In_ PVOID RegistrationContext;
8258 _In_ OB_OPERATION_REGISTRATION *OperationRegistration;
8259 } OB_CALLBACK_REGISTRATION, *POB_CALLBACK_REGISTRATION;
8260
8261 typedef struct _OBJECT_NAME_INFORMATION {
8262 UNICODE_STRING Name;
8263 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
8264
8265 /* Exported object types */
8266 #ifdef _NTSYSTEM_
8267 extern POBJECT_TYPE NTSYSAPI CmKeyObjectType;
8268 extern POBJECT_TYPE NTSYSAPI ExEventObjectType;
8269 extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType;
8270 extern POBJECT_TYPE NTSYSAPI IoFileObjectType;
8271 extern POBJECT_TYPE NTSYSAPI PsThreadType;
8272 extern POBJECT_TYPE NTSYSAPI SeTokenObjectType;
8273 extern POBJECT_TYPE NTSYSAPI PsProcessType;
8274 #else
8275 __CREATE_NTOS_DATA_IMPORT_ALIAS(CmKeyObjectType)
8276 __CREATE_NTOS_DATA_IMPORT_ALIAS(IoFileObjectType)
8277 __CREATE_NTOS_DATA_IMPORT_ALIAS(ExEventObjectType)
8278 __CREATE_NTOS_DATA_IMPORT_ALIAS(ExSemaphoreObjectType)
8279 __CREATE_NTOS_DATA_IMPORT_ALIAS(TmTransactionManagerObjectType)
8280 __CREATE_NTOS_DATA_IMPORT_ALIAS(TmResourceManagerObjectType)
8281 __CREATE_NTOS_DATA_IMPORT_ALIAS(TmEnlistmentObjectType)
8282 __CREATE_NTOS_DATA_IMPORT_ALIAS(TmTransactionObjectType)
8283 __CREATE_NTOS_DATA_IMPORT_ALIAS(PsProcessType)
8284 __CREATE_NTOS_DATA_IMPORT_ALIAS(PsThreadType)
8285 __CREATE_NTOS_DATA_IMPORT_ALIAS(SeTokenObjectType)
8286 extern POBJECT_TYPE *CmKeyObjectType;
8287 extern POBJECT_TYPE *IoFileObjectType;
8288 extern POBJECT_TYPE *ExEventObjectType;
8289 extern POBJECT_TYPE *ExSemaphoreObjectType;
8290 extern POBJECT_TYPE *TmTransactionManagerObjectType;
8291 extern POBJECT_TYPE *TmResourceManagerObjectType;
8292 extern POBJECT_TYPE *TmEnlistmentObjectType;
8293 extern POBJECT_TYPE *TmTransactionObjectType;
8294 extern POBJECT_TYPE *PsProcessType;
8295 extern POBJECT_TYPE *PsThreadType;
8296 extern POBJECT_TYPE *SeTokenObjectType;
8297 #endif
8298
8299
8300 /******************************************************************************
8301 * Process Manager Types *
8302 ******************************************************************************/
8303
8304 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
8305 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
8306 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
8307 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
8308 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
8309
8310 /* Thread Access Rights */
8311 #define THREAD_TERMINATE 0x0001
8312 #define THREAD_SUSPEND_RESUME 0x0002
8313 #define THREAD_ALERT 0x0004
8314 #define THREAD_GET_CONTEXT 0x0008
8315 #define THREAD_SET_CONTEXT 0x0010
8316 #define THREAD_SET_INFORMATION 0x0020
8317 #define THREAD_SET_LIMITED_INFORMATION 0x0400
8318 #define THREAD_QUERY_LIMITED_INFORMATION 0x0800
8319
8320 #define PROCESS_DUP_HANDLE (0x0040)
8321
8322 #if (NTDDI_VERSION >= NTDDI_VISTA)
8323 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
8324 #else
8325 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)
8326 #endif
8327
8328 #if (NTDDI_VERSION >= NTDDI_VISTA)
8329 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
8330 #else
8331 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF)
8332 #endif
8333
8334 #define LOW_PRIORITY 0
8335 #define LOW_REALTIME_PRIORITY 16
8336 #define HIGH_PRIORITY 31
8337 #define MAXIMUM_PRIORITY 32
8338
8339
8340 /******************************************************************************
8341 * WMI Library Support Types *
8342 ******************************************************************************/
8343
8344 #ifdef RUN_WPP
8345 #include <evntrace.h>
8346 #include <stdarg.h>
8347 #endif
8348
8349 #ifndef _TRACEHANDLE_DEFINED
8350 #define _TRACEHANDLE_DEFINED
8351 typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE;
8352 #endif
8353
8354 #ifndef TRACE_INFORMATION_CLASS_DEFINE
8355
8356 typedef struct _ETW_TRACE_SESSION_SETTINGS {
8357 ULONG Version;
8358 ULONG BufferSize;
8359 ULONG MinimumBuffers;
8360 ULONG MaximumBuffers;
8361 ULONG LoggerMode;
8362 ULONG FlushTimer;
8363 ULONG FlushThreshold;
8364 ULONG ClockType;
8365 } ETW_TRACE_SESSION_SETTINGS, *PETW_TRACE_SESSION_SETTINGS;
8366
8367 typedef enum _TRACE_INFORMATION_CLASS {
8368 TraceIdClass,
8369 TraceHandleClass,
8370 TraceEnableFlagsClass,
8371 TraceEnableLevelClass,
8372 GlobalLoggerHandleClass,
8373 EventLoggerHandleClass,
8374 AllLoggerHandlesClass,
8375 TraceHandleByNameClass,
8376 LoggerEventsLostClass,
8377 TraceSessionSettingsClass,
8378 LoggerEventsLoggedClass,
8379 MaxTraceInformationClass
8380 } TRACE_INFORMATION_CLASS;
8381
8382 #endif /* TRACE_INFORMATION_CLASS_DEFINE */
8383
8384 #ifndef _ETW_KM_
8385 #define _ETW_KM_
8386 #endif
8387
8388 #include <evntprov.h>
8389
8390 _IRQL_requires_same_
8391 typedef VOID
8392 (NTAPI *PETWENABLECALLBACK)(
8393 _In_ LPCGUID SourceId,
8394 _In_ ULONG ControlCode,
8395 _In_ UCHAR Level,
8396 _In_ ULONGLONG MatchAnyKeyword,
8397 _In_ ULONGLONG MatchAllKeyword,
8398 _In_opt_ PEVENT_FILTER_DESCRIPTOR FilterData,
8399 _Inout_opt_ PVOID CallbackContext);
8400
8401 #define EVENT_WRITE_FLAG_NO_FAULTING 0x00000001
8402
8403
8404 /******************************************************************************
8405 * Kernel Functions *
8406 ******************************************************************************/
8407 #if defined(_M_IX86)
8408 /** Kernel definitions for x86 **/
8409
8410 /* Interrupt request levels */
8411 #define PASSIVE_LEVEL 0
8412 #define LOW_LEVEL 0
8413 #define APC_LEVEL 1
8414 #define DISPATCH_LEVEL 2
8415 #define CMCI_LEVEL 5
8416 #define PROFILE_LEVEL 27
8417 #define CLOCK1_LEVEL 28
8418 #define CLOCK2_LEVEL 28
8419 #define IPI_LEVEL 29
8420 #define POWER_LEVEL 30
8421 #define HIGH_LEVEL 31
8422 #define CLOCK_LEVEL CLOCK2_LEVEL
8423
8424 #define KIP0PCRADDRESS 0xffdff000
8425 #define KI_USER_SHARED_DATA 0xffdf0000
8426 #define SharedUserData ((KUSER_SHARED_DATA * CONST)KI_USER_SHARED_DATA)
8427
8428 #define PAGE_SIZE 0x1000
8429 #define PAGE_SHIFT 12L
8430 #define KeGetDcacheFillSize() 1L
8431
8432 #define EFLAG_SIGN 0x8000
8433 #define EFLAG_ZERO 0x4000
8434 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
8435
8436 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
8437 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
8438 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
8439
8440
8441 typedef struct _KFLOATING_SAVE {
8442 ULONG ControlWord;
8443 ULONG StatusWord;
8444 ULONG ErrorOffset;
8445 ULONG ErrorSelector;
8446 ULONG DataOffset;
8447 ULONG DataSelector;
8448 ULONG Cr0NpxState;
8449 ULONG Spare1;
8450 } KFLOATING_SAVE, *PKFLOATING_SAVE;
8451
8452 extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount;
8453
8454 #define YieldProcessor _mm_pause
8455
8456 FORCEINLINE
8457 VOID
8458 KeMemoryBarrier(VOID)
8459 {
8460 LONG Barrier, *Dummy = &Barrier;
8461 UNREFERENCED_LOCAL_VARIABLE(Dummy);
8462
8463 #if defined(__GNUC__)
8464 __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax");
8465 #elif defined(_MSC_VER)
8466 __asm xchg [Barrier], eax
8467 #endif
8468 }
8469
8470 #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier()
8471
8472 _IRQL_requires_max_(HIGH_LEVEL)
8473 _IRQL_saves_
8474 NTHALAPI
8475 KIRQL
8476 NTAPI
8477 KeGetCurrentIrql(VOID);
8478
8479 _IRQL_requires_max_(HIGH_LEVEL)
8480 NTHALAPI
8481 VOID
8482 FASTCALL
8483 KfLowerIrql(
8484 _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql);
8485 #define KeLowerIrql(a) KfLowerIrql(a)
8486
8487 _IRQL_requires_max_(HIGH_LEVEL)
8488 _IRQL_raises_(NewIrql)
8489 _IRQL_saves_
8490 NTHALAPI
8491 KIRQL
8492 FASTCALL
8493 KfRaiseIrql(
8494 _In_ KIRQL NewIrql);
8495 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8496
8497 _IRQL_requires_max_(DISPATCH_LEVEL)
8498 _IRQL_saves_
8499 _IRQL_raises_(DISPATCH_LEVEL)
8500 NTHALAPI
8501 KIRQL
8502 NTAPI
8503 KeRaiseIrqlToDpcLevel(VOID);
8504
8505 NTHALAPI
8506 KIRQL
8507 NTAPI
8508 KeRaiseIrqlToSynchLevel(VOID);
8509
8510 _Requires_lock_not_held_(*SpinLock)
8511 _Acquires_lock_(*SpinLock)
8512 _IRQL_requires_max_(DISPATCH_LEVEL)
8513 _IRQL_saves_
8514 _IRQL_raises_(DISPATCH_LEVEL)
8515 NTHALAPI
8516 KIRQL
8517 FASTCALL
8518 KfAcquireSpinLock(
8519 _Inout_ PKSPIN_LOCK SpinLock);
8520 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
8521
8522 _Requires_lock_held_(*SpinLock)
8523 _Releases_lock_(*SpinLock)
8524 _IRQL_requires_(DISPATCH_LEVEL)
8525 NTHALAPI
8526 VOID
8527 FASTCALL
8528 KfReleaseSpinLock(
8529 _Inout_ PKSPIN_LOCK SpinLock,
8530 _In_ _IRQL_restores_ KIRQL NewIrql);
8531 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
8532
8533 _Requires_lock_not_held_(*SpinLock)
8534 _Acquires_lock_(*SpinLock)
8535 _IRQL_requires_min_(DISPATCH_LEVEL)
8536 NTKERNELAPI
8537 VOID
8538 FASTCALL
8539 KefAcquireSpinLockAtDpcLevel(
8540 _Inout_ PKSPIN_LOCK SpinLock);
8541 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
8542
8543 _Requires_lock_held_(*SpinLock)
8544 _Releases_lock_(*SpinLock)
8545 _IRQL_requires_min_(DISPATCH_LEVEL)
8546 NTKERNELAPI
8547 VOID
8548 FASTCALL
8549 KefReleaseSpinLockFromDpcLevel(
8550 _Inout_ PKSPIN_LOCK SpinLock);
8551 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
8552
8553 NTSYSAPI
8554 PKTHREAD
8555 NTAPI
8556 KeGetCurrentThread(VOID);
8557
8558 _Always_(_Post_satisfies_(return<=0))
8559 _Must_inspect_result_
8560 _IRQL_requires_max_(DISPATCH_LEVEL)
8561 _Kernel_float_saved_
8562 _At_(*FloatSave, _Kernel_requires_resource_not_held_(FloatState) _Kernel_acquires_resource_(FloatState))
8563 NTKERNELAPI
8564 NTSTATUS
8565 NTAPI
8566 KeSaveFloatingPointState(
8567 _Out_ PKFLOATING_SAVE FloatSave);
8568
8569 _Success_(1)
8570 _Kernel_float_restored_
8571 _At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState))
8572 NTKERNELAPI
8573 NTSTATUS
8574 NTAPI
8575 KeRestoreFloatingPointState(
8576 _In_ PKFLOATING_SAVE FloatSave);
8577
8578 /* VOID
8579 * KeFlushIoBuffers(
8580 * IN PMDL Mdl,
8581 * IN BOOLEAN ReadOperation,
8582 * IN BOOLEAN DmaOperation)
8583 */
8584 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
8585
8586 /* x86 and x64 performs a 0x2C interrupt */
8587 #define DbgRaiseAssertionFailure __int2c
8588
8589 FORCEINLINE
8590 VOID
8591 _KeQueryTickCount(
8592 OUT PLARGE_INTEGER CurrentCount)
8593 {
8594 for (;;) {
8595 #ifdef NONAMELESSUNION
8596 CurrentCount->s.HighPart = KeTickCount.High1Time;
8597 CurrentCount->s.LowPart = KeTickCount.LowPart;
8598 if (CurrentCount->s.HighPart == KeTickCount.High2Time) break;
8599 #else
8600 CurrentCount->HighPart = KeTickCount.High1Time;
8601 CurrentCount->LowPart = KeTickCount.LowPart;
8602 if (CurrentCount->HighPart == KeTickCount.High2Time) break;
8603 #endif
8604 YieldProcessor();
8605 }
8606 }
8607 #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
8608
8609
8610
8611
8612
8613 #elif defined(_M_AMD64)
8614 /** Kernel definitions for AMD64 **/
8615
8616 /* Interrupt request levels */
8617 #define PASSIVE_LEVEL 0
8618 #define LOW_LEVEL 0
8619 #define APC_LEVEL 1
8620 #define DISPATCH_LEVEL 2
8621 #define CMCI_LEVEL 5
8622 #define CLOCK_LEVEL 13
8623 #define IPI_LEVEL 14
8624 #define DRS_LEVEL 14
8625 #define POWER_LEVEL 14
8626 #define PROFILE_LEVEL 15
8627 #define HIGH_LEVEL 15
8628
8629 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
8630 #define SharedUserData ((KUSER_SHARED_DATA * const)KI_USER_SHARED_DATA)
8631 #define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8)
8632 #define SharedSystemTime (KI_USER_SHARED_DATA + 0x14)
8633 #define SharedTickCount (KI_USER_SHARED_DATA + 0x320)
8634
8635 #define PAGE_SIZE 0x1000
8636 #define PAGE_SHIFT 12L
8637
8638 #define EFLAG_SIGN 0x8000
8639 #define EFLAG_ZERO 0x4000
8640 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
8641
8642 typedef struct _KFLOATING_SAVE
8643 {
8644 ULONG Dummy;
8645 } KFLOATING_SAVE, *PKFLOATING_SAVE;
8646
8647 typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
8648
8649 #define KeQueryInterruptTime() \
8650 (*(volatile ULONG64*)SharedInterruptTime)
8651
8652 #define KeQuerySystemTime(CurrentCount) \
8653 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime
8654
8655 #define KeQueryTickCount(CurrentCount) \
8656 *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount
8657
8658 #define KeGetDcacheFillSize() 1L
8659
8660 #define YieldProcessor _mm_pause
8661 #define MemoryBarrier __faststorefence
8662 #define FastFence __faststorefence
8663 #define LoadFence _mm_lfence
8664 #define MemoryFence _mm_mfence
8665 #define StoreFence _mm_sfence
8666 #define LFENCE_ACQUIRE() LoadFence()
8667
8668 FORCEINLINE
8669 VOID
8670 KeMemoryBarrier(
8671 VOID)
8672 {
8673 // FIXME: Do we really need lfence after the __faststorefence ?
8674 FastFence();
8675 LFENCE_ACQUIRE();
8676 }
8677
8678 #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier()
8679
8680 _IRQL_requires_max_(HIGH_LEVEL)
8681 _IRQL_saves_
8682 FORCEINLINE
8683 KIRQL
8684 KeGetCurrentIrql(VOID)
8685 {
8686 return (KIRQL)__readcr8();
8687 }
8688
8689 _IRQL_requires_max_(HIGH_LEVEL)
8690 FORCEINLINE
8691 VOID
8692 KeLowerIrql(
8693 _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql)
8694 {
8695 //ASSERT((KIRQL)__readcr8() >= NewIrql);
8696 __writecr8(NewIrql);
8697 }
8698
8699 _IRQL_requires_max_(HIGH_LEVEL)
8700 _IRQL_raises_(NewIrql)
8701 _IRQL_saves_
8702 FORCEINLINE
8703 KIRQL
8704 KfRaiseIrql(
8705 _In_ KIRQL NewIrql)
8706 {
8707 KIRQL OldIrql;
8708
8709 OldIrql = (KIRQL)__readcr8();
8710 //ASSERT(OldIrql <= NewIrql);
8711 __writecr8(NewIrql);
8712 return OldIrql;
8713 }
8714 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8715
8716 _IRQL_requires_max_(DISPATCH_LEVEL)
8717 _IRQL_saves_
8718 _IRQL_raises_(DISPATCH_LEVEL)
8719 FORCEINLINE
8720 KIRQL
8721 KeRaiseIrqlToDpcLevel(
8722 VOID)
8723 {
8724 return KfRaiseIrql(DISPATCH_LEVEL);
8725 }
8726
8727 FORCEINLINE
8728 KIRQL
8729 KeRaiseIrqlToSynchLevel(VOID)
8730 {
8731 return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
8732 }
8733
8734 FORCEINLINE
8735 PKTHREAD
8736 KeGetCurrentThread(VOID)
8737 {
8738 return (struct _KTHREAD *)__readgsqword(0x188);
8739 }
8740
8741 _Always_(_Post_satisfies_(return<=0))
8742 _Must_inspect_result_
8743 _IRQL_requires_max_(DISPATCH_LEVEL)
8744 _Kernel_float_saved_
8745 _At_(*FloatSave, _Kernel_requires_resource_not_held_(FloatState) _Kernel_acquires_resource_(FloatState))
8746 FORCEINLINE
8747 NTSTATUS
8748 KeSaveFloatingPointState(
8749 _Out_ PKFLOATING_SAVE FloatSave)
8750 {
8751 UNREFERENCED_PARAMETER(FloatSave);
8752 return STATUS_SUCCESS;
8753 }
8754
8755 _Success_(1)
8756 _Kernel_float_restored_
8757 _At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState))
8758 FORCEINLINE
8759 NTSTATUS
8760 KeRestoreFloatingPointState(
8761 _In_ PKFLOATING_SAVE FloatSave)
8762 {
8763 UNREFERENCED_PARAMETER(FloatSave);
8764 return STATUS_SUCCESS;
8765 }
8766
8767 /* VOID
8768 * KeFlushIoBuffers(
8769 * IN PMDL Mdl,
8770 * IN BOOLEAN ReadOperation,
8771 * IN BOOLEAN DmaOperation)
8772 */
8773 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
8774
8775 /* x86 and x64 performs a 0x2C interrupt */
8776 #define DbgRaiseAssertionFailure __int2c
8777
8778 #elif defined(_M_IA64)
8779 /** Kernel definitions for IA64 **/
8780
8781 /* Interrupt request levels */
8782 #define PASSIVE_LEVEL 0
8783 #define LOW_LEVEL 0
8784 #define APC_LEVEL 1
8785 #define DISPATCH_LEVEL 2
8786 #define CMC_LEVEL 3
8787 #define DEVICE_LEVEL_BASE 4
8788 #define PC_LEVEL 12
8789 #define IPI_LEVEL 14
8790 #define DRS_LEVEL 14
8791 #define CLOCK_LEVEL 13
8792 #define POWER_LEVEL 15
8793 #define PROFILE_LEVEL 15
8794 #define HIGH_LEVEL 15
8795
8796 #define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000))
8797 extern NTKERNELAPI volatile LARGE_INTEGER KeTickCount;
8798
8799 #define PAUSE_PROCESSOR __yield();
8800
8801 FORCEINLINE
8802 VOID
8803 KeFlushWriteBuffer(VOID)
8804 {
8805 __mf ();
8806 return;
8807 }
8808
8809 NTSYSAPI
8810 PKTHREAD
8811 NTAPI
8812 KeGetCurrentThread(VOID);
8813
8814
8815 #elif defined(_M_PPC)
8816
8817 /* Interrupt request levels */
8818 #define PASSIVE_LEVEL 0
8819 #define LOW_LEVEL 0
8820 #define APC_LEVEL 1
8821 #define DISPATCH_LEVEL 2
8822 #define PROFILE_LEVEL 27
8823 #define CLOCK1_LEVEL 28
8824 #define CLOCK2_LEVEL 28
8825 #define IPI_LEVEL 29
8826 #define POWER_LEVEL 30
8827 #define HIGH_LEVEL 31
8828
8829 //
8830 // Used to contain PFNs and PFN counts
8831 //
8832 typedef ULONG PFN_COUNT;
8833 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
8834 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
8835
8836
8837 typedef struct _KFLOATING_SAVE {
8838 ULONG Dummy;
8839 } KFLOATING_SAVE, *PKFLOATING_SAVE;
8840
8841 typedef struct _KPCR_TIB {
8842 PVOID ExceptionList; /* 00 */
8843 PVOID StackBase; /* 04 */
8844 PVOID StackLimit; /* 08 */
8845 PVOID SubSystemTib; /* 0C */
8846 _ANONYMOUS_UNION union {
8847 PVOID FiberData; /* 10 */
8848 ULONG Version; /* 10 */
8849 } DUMMYUNIONNAME;
8850 PVOID ArbitraryUserPointer; /* 14 */
8851 struct _KPCR_TIB *Self; /* 18 */
8852 } KPCR_TIB, *PKPCR_TIB; /* 1C */
8853
8854 #define PCR_MINOR_VERSION 1
8855 #define PCR_MAJOR_VERSION 1
8856
8857 typedef struct _KPCR {
8858 KPCR_TIB Tib; /* 00 */
8859 struct _KPCR *Self; /* 1C */
8860 struct _KPRCB *Prcb; /* 20 */
8861 KIRQL Irql; /* 24 */
8862 ULONG IRR; /* 28 */
8863 ULONG IrrActive; /* 2C */
8864 ULONG IDR; /* 30 */
8865 PVOID KdVersionBlock; /* 34 */
8866 PUSHORT IDT; /* 38 */
8867 PUSHORT GDT; /* 3C */
8868 struct _KTSS *TSS; /* 40 */
8869 USHORT MajorVersion; /* 44 */
8870 USHORT MinorVersion; /* 46 */
8871 KAFFINITY SetMember; /* 48 */
8872 ULONG StallScaleFactor; /* 4C */
8873 UCHAR SpareUnused; /* 50 */
8874 UCHAR Number; /* 51 */
8875 } KPCR, *PKPCR; /* 54 */
8876
8877 #define KeGetPcr() PCR
8878
8879 #define YieldProcessor() __asm__ __volatile__("nop");
8880
8881 FORCEINLINE
8882 ULONG
8883 NTAPI
8884 KeGetCurrentProcessorNumber(VOID)
8885 {
8886 ULONG Number;
8887 __asm__ __volatile__ (
8888 "lwz %0, %c1(12)\n"
8889 : "=r" (Number)
8890 : "i" (FIELD_OFFSET(KPCR, Number))
8891 );
8892 return Number;
8893 }
8894
8895 NTHALAPI
8896 VOID
8897 FASTCALL
8898 KfLowerIrql(
8899 IN KIRQL NewIrql);
8900 #define KeLowerIrql(a) KfLowerIrql(a)
8901
8902 NTHALAPI
8903 KIRQL
8904 FASTCALL
8905 KfRaiseIrql(
8906 IN KIRQL NewIrql);
8907 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8908
8909 NTHALAPI
8910 KIRQL
8911 NTAPI
8912 KeRaiseIrqlToDpcLevel(VOID);
8913
8914 NTHALAPI
8915 KIRQL
8916 NTAPI
8917 KeRaiseIrqlToSynchLevel(VOID);
8918
8919
8920
8921 #elif defined(_M_MIPS)
8922 #error MIPS Headers are totally incorrect
8923
8924 //
8925 // Used to contain PFNs and PFN counts
8926 //
8927 typedef ULONG PFN_COUNT;
8928 typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
8929 typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
8930
8931 #define PASSIVE_LEVEL 0
8932 #define APC_LEVEL 1
8933 #define DISPATCH_LEVEL 2
8934 #define PROFILE_LEVEL 27
8935 #define IPI_LEVEL 29
8936 #define HIGH_LEVEL 31
8937
8938 typedef struct _KPCR {
8939 struct _KPRCB *Prcb; /* 20 */
8940 KIRQL Irql; /* 24 */
8941 ULONG IRR; /* 28 */
8942 ULONG IDR; /* 30 */
8943 } KPCR, *PKPCR;
8944
8945 #define KeGetPcr() PCR
8946
8947 typedef struct _KFLOATING_SAVE {
8948 } KFLOATING_SAVE, *PKFLOATING_SAVE;
8949
8950 static __inline
8951 ULONG
8952 NTAPI
8953 KeGetCurrentProcessorNumber(VOID)
8954 {
8955 return 0;
8956 }
8957
8958 #define YieldProcessor() __asm__ __volatile__("nop");
8959
8960 #define KeLowerIrql(a) KfLowerIrql(a)
8961 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
8962
8963 NTKERNELAPI
8964 VOID
8965 NTAPI
8966 KfLowerIrql(
8967 IN KIRQL NewIrql);
8968
8969 NTKERNELAPI
8970 KIRQL
8971 NTAPI
8972 KfRaiseIrql(
8973 IN KIRQL NewIrql);
8974
8975 NTKERNELAPI
8976 KIRQL
8977 NTAPI
8978 KeRaiseIrqlToDpcLevel(VOID);
8979
8980 NTKERNELAPI
8981 KIRQL
8982 NTAPI
8983 KeRaiseIrqlToSynchLevel(VOID);
8984
8985
8986 #elif defined(_M_ARM)
8987 /** Kernel definitions for ARM **/
8988
8989 /* Interrupt request levels */
8990 #define PASSIVE_LEVEL 0
8991 #define LOW_LEVEL 0
8992 #define APC_LEVEL 1
8993 #define DISPATCH_LEVEL 2
8994 #define CLOCK_LEVEL 13
8995 #define IPI_LEVEL 14
8996 #define DRS_LEVEL 14
8997 #define POWER_LEVEL 14
8998 #define PROFILE_LEVEL 15
8999 #define HIGH_LEVEL 15
9000
9001 #define KIP0PCRADDRESS 0xFFDFF000
9002 #define KI_USER_SHARED_DATA 0xFFFF9000
9003 #define SharedUserData ((KUSER_SHARED_DATA * const)KI_USER_SHARED_DATA)
9004
9005 #define PAGE_SIZE 0x1000
9006 #define PAGE_SHIFT 12L
9007
9008 typedef struct _KFLOATING_SAVE
9009 {
9010 ULONG Reserved;
9011 } KFLOATING_SAVE, *PKFLOATING_SAVE;
9012
9013 extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount;
9014
9015 FORCEINLINE
9016 VOID
9017 YieldProcessor(
9018 VOID)
9019 {
9020 __dmb(_ARM_BARRIER_ISHST);
9021 __yield();
9022 }
9023
9024 #define MemoryBarrier() __dmb(_ARM_BARRIER_SY)
9025 #define PreFetchCacheLine(l,a) __prefetch((const void *) (a))
9026 #define PrefetchForWrite(p) __prefetch((const void *) (p))
9027 #define ReadForWriteAccess(p) (*(p))
9028
9029 FORCEINLINE
9030 VOID
9031 KeMemoryBarrier(
9032 VOID)
9033 {
9034 _ReadWriteBarrier();
9035 MemoryBarrier();
9036 }
9037
9038 #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier()
9039
9040 _IRQL_requires_max_(HIGH_LEVEL)
9041 _IRQL_saves_
9042 NTHALAPI
9043 KIRQL
9044 NTAPI
9045 KeGetCurrentIrql(
9046 VOID);
9047
9048 _IRQL_requires_max_(HIGH_LEVEL)
9049 NTHALAPI
9050 VOID
9051 FASTCALL
9052 KfLowerIrql(
9053 _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql);
9054 #define KeLowerIrql(a) KfLowerIrql(a)
9055
9056 _IRQL_requires_max_(HIGH_LEVEL)
9057 _IRQL_raises_(NewIrql)
9058 _IRQL_saves_
9059 NTHALAPI
9060 KIRQL
9061 FASTCALL
9062 KfRaiseIrql(
9063 _In_ KIRQL NewIrql);
9064 #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
9065
9066 _IRQL_requires_max_(DISPATCH_LEVEL)
9067 _IRQL_saves_
9068 _IRQL_raises_(DISPATCH_LEVEL)
9069 NTHALAPI
9070 KIRQL
9071 NTAPI
9072 KeRaiseIrqlToDpcLevel(VOID);
9073
9074 NTHALAPI
9075 KIRQL
9076 NTAPI
9077 KeRaiseIrqlToSynchLevel(VOID);
9078
9079 _Requires_lock_not_held_(*SpinLock)
9080 _Acquires_lock_(*SpinLock)
9081 _IRQL_requires_max_(DISPATCH_LEVEL)
9082 _IRQL_saves_
9083 _IRQL_raises_(DISPATCH_LEVEL)
9084 NTHALAPI
9085 KIRQL
9086 FASTCALL
9087 KfAcquireSpinLock(
9088 _Inout_ PKSPIN_LOCK SpinLock);
9089 #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
9090
9091 _Requires_lock_held_(*SpinLock)
9092 _Releases_lock_(*SpinLock)
9093 _IRQL_requires_(DISPATCH_LEVEL)
9094 NTHALAPI
9095 VOID
9096 FASTCALL
9097 KfReleaseSpinLock(
9098 _Inout_ PKSPIN_LOCK SpinLock,
9099 _In_ _IRQL_restores_ KIRQL NewIrql);
9100 #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
9101
9102 _Requires_lock_not_held_(*SpinLock)
9103 _Acquires_lock_(*SpinLock)
9104 _IRQL_requires_min_(DISPATCH_LEVEL)
9105 NTKERNELAPI
9106 VOID
9107 FASTCALL
9108 KefAcquireSpinLockAtDpcLevel(
9109 _Inout_ PKSPIN_LOCK SpinLock);
9110 #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock)
9111
9112 _Requires_lock_held_(*SpinLock)
9113 _Releases_lock_(*SpinLock)
9114 _IRQL_requires_min_(DISPATCH_LEVEL)
9115 NTKERNELAPI
9116 VOID
9117 FASTCALL
9118 KefReleaseSpinLockFromDpcLevel(
9119 _Inout_ PKSPIN_LOCK SpinLock);
9120 #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock)
9121
9122 NTSYSAPI
9123 PKTHREAD
9124 NTAPI
9125 KeGetCurrentThread(VOID);
9126
9127 _Always_(_Post_satisfies_(return<=0))
9128 _Must_inspect_result_
9129 _IRQL_requires_max_(DISPATCH_LEVEL)
9130 _Kernel_float_saved_
9131 _At_(*FloatSave, _Kernel_requires_resource_not_held_(FloatState) _Kernel_acquires_resource_(FloatState))
9132 FORCEINLINE
9133 NTSTATUS
9134 KeSaveFloatingPointState(
9135 _Out_ PKFLOATING_SAVE FloatSave)
9136 {
9137 UNREFERENCED_PARAMETER(FloatSave);
9138 return STATUS_SUCCESS;
9139 }
9140
9141 _Success_(1)
9142 _Kernel_float_restored_
9143 _At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState))
9144 FORCEINLINE
9145 NTSTATUS
9146 KeRestoreFloatingPointState(
9147 _In_ PKFLOATING_SAVE FloatSave)
9148 {
9149 UNREFERENCED_PARAMETER(FloatSave);
9150 return STATUS_SUCCESS;
9151 }
9152
9153 VOID
9154 KeFlushIoBuffers(
9155 _In_ PMDL Mdl,
9156 _In_ BOOLEAN ReadOperation,
9157 _In_ BOOLEAN DmaOperation);
9158
9159 #define DbgRaiseAssertionFailure() __emit(0xdefc)
9160
9161 FORCEINLINE
9162 VOID
9163 _KeQueryTickCount(
9164 OUT PLARGE_INTEGER CurrentCount)
9165 {
9166 for (;;) {
9167 #ifdef NONAMELESSUNION
9168 CurrentCount->s.HighPart = KeTickCount.High1Time;
9169 CurrentCount->s.LowPart = KeTickCount.LowPart;
9170 if (CurrentCount->s.HighPart == KeTickCount.High2Time) break;
9171 #else
9172 CurrentCount->HighPart = KeTickCount.High1Time;
9173 CurrentCount->LowPart = KeTickCount.LowPart;
9174 if (CurrentCount->HighPart == KeTickCount.High2Time) break;
9175 #endif
9176 YieldProcessor();
9177 }
9178 }
9179 #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
9180
9181 #define CP15_PMSELR 15, 0, 9, 12, 5 /* Event Counter Selection Register */
9182 #define CP15_PMXEVCNTR 15, 0, 9, 13, 2 /* Event Count Register */
9183 #define CP15_TPIDRURW 15, 0, 13, 0, 2 /* Software Thread ID Register, UsRW */
9184 #define CP15_TPIDRURO 15, 0, 13, 0, 3 /* Software Thread ID Register, UsRO */
9185 #define CP15_TPIDRPRW 15, 0, 13, 0, 4 /* Software Thread ID Register, Kernel */
9186
9187 #else
9188 #error Unknown Architecture
9189 #endif
9190
9191 NTKERNELAPI
9192 VOID
9193 NTAPI
9194 KeInitializeEvent(
9195 _Out_ PRKEVENT Event,
9196 _In_ EVENT_TYPE Type,
9197 _In_ BOOLEAN State);
9198
9199 _IRQL_requires_max_(DISPATCH_LEVEL)
9200 NTKERNELAPI
9201 VOID
9202 NTAPI
9203 KeClearEvent(
9204 _Inout_ PRKEVENT Event);
9205
9206 #if (NTDDI_VERSION >= NTDDI_WIN2K)
9207
9208 #if defined(_NTDDK_) || defined(_NTIFS_)
9209 _Maybe_raises_SEH_exception_
9210 _IRQL_requires_max_(APC_LEVEL)
9211 NTKERNELAPI
9212 VOID
9213 NTAPI
9214 ProbeForRead(
9215 __in_data_source(USER_MODE) _In_reads_bytes_(Length) CONST VOID *Address, /* CONST is added */
9216 _In_ SIZE_T Length,
9217 _In_ ULONG Alignment);
9218 #endif /* defined(_NTDDK_) || defined(_NTIFS_) */
9219
9220 _Maybe_raises_SEH_exception_
9221 _IRQL_requires_max_(APC_LEVEL)
9222 NTKERNELAPI
9223 VOID
9224 NTAPI
9225 ProbeForWrite(
9226 __in_data_source(USER_MODE) _Out_writes_bytes_(Length) PVOID Address,
9227 _In_ SIZE_T Length,
9228 _In_ ULONG Alignment);
9229
9230 #if defined(SINGLE_GROUP_LEGACY_API)
9231
9232 _IRQL_requires_min_(PASSIVE_LEVEL)
9233 _IRQL_requires_max_(APC_LEVEL)
9234 NTKERNELAPI
9235 VOID
9236 NTAPI
9237 KeRevertToUserAffinityThread(VOID);
9238
9239 _IRQL_requires_min_(PASSIVE_LEVEL)
9240 _IRQL_requires_max_(APC_LEVEL)
9241 NTKERNELAPI
9242 VOID
9243 NTAPI
9244 KeSetSystemAffinityThread(
9245 _In_ KAFFINITY Affinity);
9246
9247 NTKERNELAPI
9248 VOID
9249 NTAPI
9250 KeSetTargetProcessorDpc(
9251 _Inout_ PRKDPC Dpc,
9252 _In_ CCHAR Number);
9253
9254 NTKERNELAPI
9255 KAFFINITY
9256 NTAPI
9257 KeQueryActiveProcessors(VOID);
9258 #endif /* defined(SINGLE_GROUP_LEGACY_API) */
9259
9260 #if !defined(_M_AMD64)
9261 NTKERNELAPI
9262 ULONGLONG
9263 NTAPI
9264 KeQueryInterruptTime(VOID);
9265
9266 NTKERNELAPI
9267 VOID
9268 NTAPI
9269 KeQuerySystemTime(
9270 _Out_ PLARGE_INTEGER CurrentTime);
9271 #endif /* !_M_AMD64 */
9272
9273 #if !defined(_X86_) && !defined(_M_ARM)
9274 _Requires_lock_not_held_(*SpinLock)
9275 _Acquires_lock_(*SpinLock)
9276 _IRQL_requires_max_(DISPATCH_LEVEL)
9277 _IRQL_saves_
9278 _IRQL_raises_(DISPATCH_LEVEL)
9279 NTKERNELAPI
9280 KIRQL
9281 NTAPI
9282 KeAcquireSpinLockRaiseToDpc(
9283 _Inout_ PKSPIN_LOCK SpinLock);
9284
9285 #define KeAcquireSpinLock(SpinLock, OldIrql) \
9286 *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
9287
9288 _Requires_lock_not_held_(*SpinLock)
9289 _Acquires_lock_(*SpinLock)
9290 _IRQL_requires_min_(DISPATCH_LEVEL)
9291 NTKERNELAPI
9292 VOID
9293 NTAPI
9294 KeAcquireSpinLockAtDpcLevel(
9295 _Inout_ PKSPIN_LOCK SpinLock);
9296
9297 _Requires_lock_held_(*SpinLock)
9298 _Releases_lock_(*SpinLock)
9299 _IRQL_requires_(DISPATCH_LEVEL)
9300 NTKERNELAPI
9301 VOID
9302 NTAPI
9303 KeReleaseSpinLock(
9304 _Inout_ PKSPIN_LOCK SpinLock,
9305 _In_ _IRQL_restores_ KIRQL NewIrql);
9306
9307 _Requires_lock_held_(*SpinLock)
9308 _Releases_lock_(*SpinLock)
9309 _IRQL_requires_min_(DISPATCH_LEVEL)
9310 NTKERNELAPI
9311 VOID
9312 NTAPI
9313 KeReleaseSpinLockFromDpcLevel(
9314 _Inout_ PKSPIN_LOCK SpinLock);
9315 #endif /* !_X86_ */
9316
9317 #if defined(_X86_) && (defined(_WDM_INCLUDED_) || defined(WIN9X_COMPAT_SPINLOCK))
9318 NTKERNELAPI
9319 VOID
9320 NTAPI
9321 KeInitializeSpinLock(
9322 _Out_ PKSPIN_LOCK SpinLock);
9323 #else
9324 FORCEINLINE
9325 VOID
9326 KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
9327 {
9328 /* Clear the lock */
9329 *SpinLock = 0;
9330 }
9331 #endif
9332
9333 NTKERNELAPI
9334 DECLSPEC_NORETURN
9335 VOID
9336 NTAPI
9337 KeBugCheckEx(
9338 _In_ ULONG BugCheckCode,
9339 _In_ ULONG_PTR BugCheckParameter1,
9340 _In_ ULONG_PTR BugCheckParameter2,
9341 _In_ ULONG_PTR BugCheckParameter3,
9342 _In_ ULONG_PTR BugCheckParameter4);
9343
9344 _IRQL_requires_max_(DISPATCH_LEVEL)
9345 NTKERNELAPI
9346 BOOLEAN
9347 NTAPI
9348 KeCancelTimer(
9349 _Inout_ PKTIMER);
9350
9351 _IRQL_requires_min_(PASSIVE_LEVEL)
9352 _IRQL_requires_max_(APC_LEVEL)
9353 NTKERNELAPI
9354 NTSTATUS
9355 NTAPI
9356 KeDelayExecutionThread(
9357 _In_ KPROCESSOR_MODE WaitMode,
9358 _In_ BOOLEAN Alertable,
9359 _In_ PLARGE_INTEGER Interval);
9360
9361 _Must_inspect_result_
9362 NTKERNELAPI
9363 BOOLEAN
9364 NTAPI
9365 KeDeregisterBugCheckCallback(
9366 _Inout_ PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
9367
9368 _Acquires_lock_(_Global_critical_region_)
9369 _IRQL_requires_max_(APC_LEVEL)
9370 NTKERNELAPI
9371 VOID
9372 NTAPI
9373 KeEnterCriticalRegion(VOID);
9374
9375 _IRQL_requires_max_(DISPATCH_LEVEL)
9376 NTKERNELAPI
9377 VOID
9378 NTAPI
9379 KeInitializeDeviceQueue(
9380 _Out_ PKDEVICE_QUEUE DeviceQueue);
9381
9382 NTKERNELAPI
9383 VOID
9384 NTAPI
9385 KeInitializeDpc(
9386 _Out_ __drv_aliasesMem PRKDPC Dpc,
9387 _In_ PKDEFERRED_ROUTINE DeferredRoutine,
9388 _In_opt_ __drv_aliasesMem PVOID DeferredContext);
9389
9390 NTKERNELAPI
9391 VOID
9392 NTAPI
9393 KeInitializeMutex(
9394 _Out_ PRKMUTEX Mutex,
9395 _In_ ULONG Level);
9396
9397 _IRQL_requires_max_(PASSIVE_LEVEL)
9398 NTKERNELAPI
9399 VOID
9400 NTAPI
9401 KeInitializeSemaphore(
9402 _Out_ PRKSEMAPHORE Semaphore,
9403 _In_ LONG Count,
9404 _In_ LONG Limit);
9405
9406 _IRQL_requires_max_(DISPATCH_LEVEL)
9407 NTKERNELAPI
9408 VOID
9409 NTAPI
9410 KeInitializeTimer(
9411 _Out_ PKTIMER Timer);
9412
9413 _IRQL_requires_max_(DISPATCH_LEVEL)
9414 NTKERNELAPI
9415 VOID
9416 NTAPI
9417 KeInitializeTimerEx(
9418 _Out_ PKTIMER Timer,
9419 _In_ TIMER_TYPE Type);
9420
9421 _IRQL_requires_(DISPATCH_LEVEL)
9422 NTKERNELAPI
9423 BOOLEAN
9424 NTAPI
9425 KeInsertByKeyDeviceQueue(
9426 _Inout_ PKDEVICE_QUEUE DeviceQueue,
9427 _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
9428 _In_ ULONG SortKey);
9429
9430 _IRQL_requires_(DISPATCH_LEVEL)
9431 NTKERNELAPI
9432 BOOLEAN
9433 NTAPI
9434 KeInsertDeviceQueue(
9435 _Inout_ PKDEVICE_QUEUE DeviceQueue,
9436 _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
9437
9438 NTKERNELAPI
9439 BOOLEAN
9440 NTAPI
9441 KeInsertQueueDpc(
9442 _Inout_ PRKDPC Dpc,
9443 _In_opt_ PVOID SystemArgument1,
9444 _In_opt_ PVOID SystemArgument2);
9445
9446 _Releases_lock_(_Global_critical_region_)
9447 _IRQL_requires_max_(APC_LEVEL)
9448 NTKERNELAPI
9449 VOID
9450 NTAPI
9451 KeLeaveCriticalRegion(VOID);
9452
9453 NTHALAPI
9454 LARGE_INTEGER
9455 NTAPI
9456 KeQueryPerformanceCounter(
9457 _Out_opt_ PLARGE_INTEGER PerformanceFrequency);
9458
9459 _IRQL_requires_max_(PASSIVE_LEVEL)
9460 NTKERNELAPI
9461 KPRIORITY
9462 NTAPI
9463 KeQueryPriorityThread(
9464 _In_ PRKTHREAD Thread);
9465
9466 NTKERNELAPI
9467 ULONG
9468 NTAPI
9469 KeQueryTimeIncrement(VOID);
9470
9471 _IRQL_requires_max_(DISPATCH_LEVEL)
9472 NTKERNELAPI
9473 LONG
9474 NTAPI
9475 KeReadStateEvent(
9476 _In_ PRKEVENT Event);
9477
9478 _IRQL_requires_max_(DISPATCH_LEVEL)
9479 NTKERNELAPI
9480 LONG
9481 NTAPI
9482 KeReadStateMutex(
9483 _In_ PRKMUTEX Mutex);
9484
9485 _IRQL_requires_max_(DISPATCH_LEVEL)
9486 NTKERNELAPI
9487 LONG
9488 NTAPI
9489 KeReadStateSemaphore(
9490 _In_ PRKSEMAPHORE Semaphore);
9491
9492 _IRQL_requires_max_(DISPATCH_LEVEL)
9493 NTKERNELAPI
9494 BOOLEAN
9495 NTAPI
9496 KeReadStateTimer(
9497 _In_ PKTIMER Timer);
9498
9499 _Must_inspect_result_
9500 NTKERNELAPI
9501 BOOLEAN
9502 NTAPI
9503 KeRegisterBugCheckCallback(
9504 _Out_ PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
9505 _In_ PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
9506 _In_reads_bytes_opt_(Length) PVOID Buffer,
9507 _In_ ULONG Length,
9508 _In_ PUCHAR Component);
9509
9510 _When_(Wait==0, _IRQL_requires_max_(DISPATCH_LEVEL))
9511 _When_(Wait==1, _IRQL_requires_max_(APC_LEVEL))
9512 NTKERNELAPI
9513 LONG
9514 NTAPI
9515 KeReleaseMutex(
9516 _Inout_ PRKMUTEX Mutex,
9517 _In_ BOOLEAN Wait);
9518
9519 _When_(Wait==0, _IRQL_requires_max_(DISPATCH_LEVEL))
9520 _When_(Wait==1, _IRQL_requires_max_(APC_LEVEL))
9521 NTKERNELAPI
9522 LONG
9523 NTAPI
9524 KeReleaseSemaphore(
9525 _Inout_ PRKSEMAPHORE Semaphore,
9526 _In_ KPRIORITY Increment,
9527 _In_ LONG Adjustment,
9528 _In_ _Literal_ BOOLEAN Wait);
9529
9530 _IRQL_requires_(DISPATCH_LEVEL)
9531 NTKERNELAPI
9532 PKDEVICE_QUEUE_ENTRY
9533 NTAPI
9534 KeRemoveByKeyDeviceQueue(
9535 _Inout_ PKDEVICE_QUEUE DeviceQueue,
9536 _In_ ULONG SortKey);
9537
9538 _IRQL_requires_(DISPATCH_LEVEL)
9539 NTKERNELAPI
9540 PKDEVICE_QUEUE_ENTRY
9541 NTAPI
9542 KeRemoveDeviceQueue(
9543 _Inout_ PKDEVICE_QUEUE DeviceQueue);
9544
9545 _IRQL_requires_max_(DISPATCH_LEVEL)
9546 NTKERNELAPI
9547 BOOLEAN
9548 NTAPI
9549 KeRemoveEntryDeviceQueue(
9550 _Inout_ PKDEVICE_QUEUE DeviceQueue,
9551 _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
9552
9553 _IRQL_requires_max_(HIGH_LEVEL)
9554 NTKERNELAPI
9555 BOOLEAN
9556 NTAPI
9557 KeRemoveQueueDpc(
9558 _Inout_ PRKDPC Dpc);
9559
9560 _IRQL_requires_max_(DISPATCH_LEVEL)
9561 NTKERNELAPI
9562 LONG
9563 NTAPI
9564 KeResetEvent(
9565 _Inout_ PRKEVENT Event);
9566
9567 _When_(Wait==0, _IRQL_requires_max_(DISPATCH_LEVEL))
9568 _When_(Wait==1, _IRQL_requires_max_(APC_LEVEL))
9569 NTKERNELAPI
9570 LONG
9571 NTAPI
9572 KeSetEvent(
9573 _Inout_ PRKEVENT Event,
9574 _In_ KPRIORITY Increment,
9575 _In_ _Literal_ BOOLEAN Wait);
9576
9577 NTKERNELAPI
9578 VOID
9579 NTAPI
9580 KeSetImportanceDpc(
9581 _Inout_ PRKDPC Dpc,
9582 _In_ KDPC_IMPORTANCE Importance);
9583
9584 _IRQL_requires_min_(PASSIVE_LEVEL)
9585 _IRQL_requires_max_(DISPATCH_LEVEL)
9586 NTKERNELAPI
9587 KPRIORITY
9588 NTAPI
9589 KeSetPriorityThread(
9590 _Inout_ PKTHREAD Thread,
9591 _In_ KPRIORITY Priority);
9592
9593 _IRQL_requires_max_(DISPATCH_LEVEL)
9594 NTKERNELAPI
9595 BOOLEAN
9596 NTAPI
9597 KeSetTimer(
9598 _Inout_ PKTIMER Timer,
9599 _In_ LARGE_INTEGER DueTime,
9600 _In_opt_ PKDPC Dpc);
9601
9602 _IRQL_requires_max_(DISPATCH_LEVEL)
9603 NTKERNELAPI
9604 BOOLEAN
9605 NTAPI
9606 KeSetTimerEx(
9607 _Inout_ PKTIMER Timer,
9608 _In_ LARGE_INTEGER DueTime,
9609 _In_ LONG Period OPTIONAL,
9610 _In_opt_ PKDPC Dpc);
9611
9612 NTHALAPI
9613 VOID
9614 NTAPI
9615 KeStallExecutionProcessor(
9616 _In_ ULONG MicroSeconds);
9617
9618 _IRQL_requires_max_(HIGH_LEVEL)
9619 NTKERNELAPI
9620 BOOLEAN
9621 NTAPI
9622 KeSynchronizeExecution(
9623 _Inout_ PKINTERRUPT Interrupt,
9624 _In_ PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
9625 _In_opt_ __drv_aliasesMem PVOID SynchronizeContext);
9626
9627 _IRQL_requires_min_(PASSIVE_LEVEL)
9628 _When_((Timeout==NULL || Timeout->QuadPart!=0), _IRQL_requires_max_(APC_LEVEL))
9629 _When_((Timeout!=NULL && Timeout->QuadPart==0), _IRQL_requires_max_(DISPATCH_LEVEL))
9630 NTKERNELAPI
9631 NTSTATUS
9632 NTAPI
9633 KeWaitForMultipleObjects(
9634 _In_ ULONG Count,
9635 _In_reads_(Count) PVOID Object[],
9636 _In_ __drv_strictTypeMatch(__drv_typeConst) WAIT_TYPE WaitType,
9637 _In_ __drv_strictTypeMatch(__drv_typeCond) KWAIT_REASON WaitReason,
9638 _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst) KPROCESSOR_MODE WaitMode,
9639 _In_ BOOLEAN Alertable,
9640 _In_opt_ PLARGE_INTEGER Timeout,
9641 _Out_opt_ PKWAIT_BLOCK WaitBlockArray);
9642
9643 #define KeWaitForMutexObject KeWaitForSingleObject
9644
9645 _IRQL_requires_min_(PASSIVE_LEVEL)
9646 _When_((Timeout==NULL || Timeout->QuadPart!=0), _IRQL_requires_max_(APC_LEVEL))
9647 _When_((Timeout!=NULL && Timeout->QuadPart==0), _IRQL_requires_max_(DISPATCH_LEVEL))
9648 NTKERNELAPI
9649 NTSTATUS
9650 NTAPI
9651 KeWaitForSingleObject(
9652 _In_ _Points_to_data_ PVOID Object,
9653 _In_ __drv_strictTypeMatch(__drv_typeCond) KWAIT_REASON WaitReason,
9654 _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst) KPROCESSOR_MODE WaitMode,
9655 _In_ BOOLEAN Alertable,
9656 _In_opt_ PLARGE_INTEGER Timeout);
9657
9658 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
9659
9660 #if (NTDDI_VERSION >= NTDDI_WINXP)
9661
9662 _Requires_lock_not_held_(*LockHandle)
9663 _Acquires_lock_(*LockHandle)
9664 _Post_same_lock_(*SpinLock, *LockHandle)
9665 _IRQL_requires_max_(DISPATCH_LEVEL)
9666 _IRQL_saves_global_(QueuedSpinLock,LockHandle)
9667 _IRQL_raises_(DISPATCH_LEVEL)
9668 _DECL_HAL_KE_IMPORT
9669 VOID
9670 FASTCALL
9671 KeAcquireInStackQueuedSpinLock(
9672 _Inout_ PKSPIN_LOCK SpinLock,
9673 _Out_ PKLOCK_QUEUE_HANDLE LockHandle);
9674
9675 _Requires_lock_not_held_(*LockHandle)
9676 _Acquires_lock_(*LockHandle)
9677 _Post_same_lock_(*SpinLock, *LockHandle)
9678 _IRQL_requires_min_(DISPATCH_LEVEL)
9679 NTKERNELAPI
9680 VOID
9681 FASTCALL
9682 KeAcquireInStackQueuedSpinLockAtDpcLevel(
9683 _Inout_ PKSPIN_LOCK SpinLock,
9684 _Out_ PKLOCK_QUEUE_HANDLE LockHandle);
9685
9686 _Requires_lock_not_held_(*Interrupt->ActualLock)
9687 _Acquires_lock_(*Interrupt->ActualLock)
9688 _IRQL_requires_max_(HIGH_LEVEL)
9689 _IRQL_saves_
9690 _IRQL_raises_(HIGH_LEVEL)
9691 NTKERNELAPI
9692 KIRQL
9693 NTAPI
9694 KeAcquireInterruptSpinLock(
9695 _Inout_ PKINTERRUPT Interrupt);
9696
9697 _IRQL_requires_min_(PASSIVE_LEVEL)
9698 _IRQL_requires_max_(DISPATCH_LEVEL)
9699 NTKERNELAPI
9700 BOOLEAN
9701 NTAPI
9702 KeAreApcsDisabled(VOID);
9703
9704 NTKERNELAPI
9705 ULONG
9706 NTAPI
9707 KeGetRecommendedSharedDataAlignment(VOID);
9708
9709 _IRQL_requires_max_(PASSIVE_LEVEL)
9710 NTKERNELAPI
9711 ULONG
9712 NTAPI
9713 KeQueryRuntimeThread(
9714 _In_ PKTHREAD Thread,
9715 _Out_ PULONG UserTime);
9716
9717 _Requires_lock_held_(*LockHandle)
9718 _Releases_lock_(*LockHandle)
9719 _IRQL_requires_(DISPATCH_LEVEL)
9720 NTKERNELAPI
9721 VOID
9722 FASTCALL
9723 KeReleaseInStackQueuedSpinLockFromDpcLevel(
9724 _In_ PKLOCK_QUEUE_HANDLE LockHandle);
9725
9726 _Requires_lock_held_(*Interrupt->ActualLock)
9727 _Releases_lock_(*Interrupt->ActualLock)
9728 _IRQL_requires_(HIGH_LEVEL)
9729 NTKERNELAPI
9730 VOID
9731 NTAPI
9732 KeReleaseInterruptSpinLock(
9733 _Inout_ PKINTERRUPT Interrupt,
9734 _In_ _IRQL_restores_ KIRQL OldIrql);
9735
9736 _IRQL_requires_(DISPATCH_LEVEL)
9737 NTKERNELAPI
9738 PKDEVICE_QUEUE_ENTRY
9739 NTAPI
9740 KeRemoveByKeyDeviceQueueIfBusy(
9741 _Inout_ PKDEVICE_QUEUE DeviceQueue,
9742 _In_ ULONG SortKey);
9743
9744 _Requires_lock_held_(*LockHandle)
9745 _Releases_lock_(*LockHandle)
9746 _IRQL_requires_(DISPATCH_LEVEL)
9747 _IRQL_restores_global_(QueuedSpinLock,LockHandle)
9748 _DECL_HAL_KE_IMPORT
9749 VOID
9750 FASTCALL
9751 KeReleaseInStackQueuedSpinLock(
9752 _In_ PKLOCK_QUEUE_HANDLE LockHandle);
9753
9754 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
9755
9756 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
9757
9758 _Must_inspect_result_
9759 NTKERNELAPI
9760 BOOLEAN
9761 NTAPI
9762 KeDeregisterBugCheckReasonCallback(
9763 _Inout_ PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord);
9764
9765 _Must_inspect_result_
9766 NTKERNELAPI
9767 BOOLEAN
9768 NTAPI
9769 KeRegisterBugCheckReasonCallback(
9770 _Out_ PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord,
9771 _In_ PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine,
9772 _In_ KBUGCHECK_CALLBACK_REASON Reason,
9773 _In_ PUCHAR Component);
9774
9775 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */
9776
9777 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
9778 _IRQL_requires_max_(APC_LEVEL)
9779 NTKERNELAPI
9780 VOID
9781 NTAPI
9782 KeFlushQueuedDpcs(VOID);
9783 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
9784 #if (NTDDI_VERSION >= NTDDI_WS03)
9785
9786 _IRQL_requires_max_(APC_LEVEL)
9787 NTKERNELAPI
9788 PVOID
9789 NTAPI
9790 KeRegisterNmiCallback(
9791 _In_ PNMI_CALLBACK CallbackRoutine,
9792 _In_opt_ PVOID Context);
9793
9794 _IRQL_requires_max_(APC_LEVEL)
9795 NTKERNELAPI
9796 NTSTATUS
9797 NTAPI
9798 KeDeregisterNmiCallback(
9799 _In_ PVOID Handle);
9800
9801 NTKERNELAPI
9802 VOID
9803 NTAPI
9804 KeInitializeThreadedDpc(
9805 _Out_ PRKDPC Dpc,
9806 _In_ PKDEFERRED_ROUTINE DeferredRoutine,
9807 _In_opt_ PVOID DeferredContext);
9808
9809 _IRQL_requires_min_(PASSIVE_LEVEL)
9810 _IRQL_requires_max_(IPI_LEVEL-1)
9811 NTKERNELAPI
9812 ULONG_PTR
9813 NTAPI
9814 KeIpiGenericCall(
9815 _In_ PKIPI_BROADCAST_WORKER BroadcastFunction,
9816 _In_ ULONG_PTR Context);
9817
9818 _Requires_lock_not_held_(*SpinLock)
9819 _Acquires_lock_(*SpinLock)
9820 _IRQL_requires_max_(DISPATCH_LEVEL)
9821 _IRQL_saves_
9822 NTKERNELAPI
9823 KIRQL
9824 FASTCALL
9825 KeAcquireSpinLockForDpc(
9826 _Inout_ PKSPIN_LOCK SpinLock);
9827
9828 _Requires_lock_held_(*SpinLock)
9829 _Releases_lock_(*SpinLock)
9830 _IRQL_requires_(DISPATCH_LEVEL)
9831 NTKERNELAPI
9832 VOID
9833 FASTCALL
9834 KeReleaseSpinLockForDpc(
9835 _Inout_ PKSPIN_LOCK SpinLock,
9836 _In_ _IRQL_restores_ KIRQL OldIrql);
9837
9838 _Must_inspect_result_
9839 NTKERNELAPI
9840 BOOLEAN
9841 FASTCALL
9842 KeTestSpinLock(
9843 _In_ PKSPIN_LOCK SpinLock);
9844
9845 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
9846 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
9847
9848 _Must_inspect_result_
9849 _IRQL_requires_min_(DISPATCH_LEVEL)
9850 _Post_satisfies_(return == 1 || return == 0)
9851 NTKERNELAPI
9852 BOOLEAN
9853 FASTCALL
9854 KeTryToAcquireSpinLockAtDpcLevel(
9855 _Inout_ _Requires_lock_not_held_(*_Curr_)
9856 _When_(return!=0, _Acquires_lock_(*_Curr_))
9857 PKSPIN_LOCK SpinLock);
9858
9859 _IRQL_requires_min_(PASSIVE_LEVEL)
9860 _IRQL_requires_max_(DISPATCH_LEVEL)
9861 NTKERNELAPI
9862 BOOLEAN
9863 NTAPI
9864 KeAreAllApcsDisabled(VOID);
9865
9866 _Acquires_lock_(_Global_critical_region_)
9867 _Requires_lock_not_held_(*Mutex)
9868 _Acquires_lock_(*Mutex)
9869 _IRQL_requires_max_(APC_LEVEL)
9870 _IRQL_requires_min_(PASSIVE_LEVEL)
9871 NTKERNELAPI
9872 VOID
9873 FASTCALL
9874 KeAcquireGuardedMutex(
9875 _Inout_ PKGUARDED_MUTEX GuardedMutex);
9876
9877 _Requires_lock_not_held_(*FastMutex)
9878 _Acquires_lock_(*FastMutex)
9879 _IRQL_requires_max_(APC_LEVEL)
9880 _IRQL_requires_min_(PASSIVE_LEVEL)
9881 NTKERNELAPI
9882 VOID
9883 FASTCALL
9884 KeAcquireGuardedMutexUnsafe(
9885 _Inout_ PKGUARDED_MUTEX GuardedMutex);
9886
9887 _Acquires_lock_(_Global_critical_region_)
9888 _IRQL_requires_max_(APC_LEVEL)
9889 NTKERNELAPI
9890 VOID
9891 NTAPI
9892 KeEnterGuardedRegion(VOID);
9893
9894 _Releases_lock_(_Global_critical_region_)
9895 _IRQL_requires_max_(APC_LEVEL)
9896 NTKERNELAPI
9897 VOID
9898 NTAPI
9899 KeLeaveGuardedRegion(VOID);
9900
9901 _IRQL_requires_max_(APC_LEVEL)
9902 _IRQL_requires_min_(PASSIVE_LEVEL)
9903 NTKERNELAPI
9904 VOID
9905 FASTCALL
9906 KeInitializeGuardedMutex(
9907 _Out_ PKGUARDED_MUTEX GuardedMutex);
9908
9909 _Requires_lock_held_(*FastMutex)
9910 _Releases_lock_(*FastMutex)
9911 _IRQL_requires_max_(APC_LEVEL)
9912 NTKERNELAPI
9913 VOID
9914 FASTCALL
9915 KeReleaseGuardedMutexUnsafe(
9916 _Inout_ PKGUARDED_MUTEX GuardedMutex);
9917
9918 _Releases_lock_(_Global_critical_region_)
9919 _Requires_lock_held_(*Mutex)
9920 _Releases_lock_(*Mutex)
9921 _IRQL_requires_max_(APC_LEVEL)
9922 NTKERNELAPI
9923 VOID
9924 FASTCALL
9925 KeReleaseGuardedMutex(
9926 _Inout_ PKGUARDED_MUTEX GuardedMutex);
9927
9928 _Must_inspect_result_
9929 _Success_(return != FALSE)
9930 _IRQL_requires_max_(APC_LEVEL)
9931 _Post_satisfies_(return == 1 || return == 0)
9932 NTKERNELAPI
9933 BOOLEAN
9934 FASTCALL
9935 KeTryToAcquireGuardedMutex(
9936 _When_ (return, _Requires_lock_not_held_(*_Curr_) _Acquires_exclusive_lock_(*_Curr_)) _Acquires_lock_(_Global_critical_region_)
9937 _Inout_ PKGUARDED_MUTEX GuardedMutex);
9938 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
9939
9940 #if (NTDDI_VERSION >= NTDDI_VISTA)
9941 _Requires_lock_not_held_(*LockHandle)
9942 _Acquires_lock_(*LockHandle)
9943 _Post_same_lock_(*SpinLock, *LockHandle)
9944 _IRQL_requires_max_(DISPATCH_LEVEL)
9945 _IRQL_saves_global_(QueuedSpinLock,LockHandle)
9946 NTKERNELAPI
9947 VOID
9948 FASTCALL
9949 KeAcquireInStackQueuedSpinLockForDpc(
9950 _Inout_ PKSPIN_LOCK SpinLock,
9951 _Out_ PKLOCK_QUEUE_HANDLE LockHandle);
9952
9953 _Requires_lock_held_(*LockHandle)
9954 _Releases_lock_(*LockHandle)
9955 _IRQL_requires_(DISPATCH_LEVEL)
9956 _IRQL_restores_global_(QueuedSpinLock,LockHandle)
9957 NTKERNELAPI
9958 VOID
9959 FASTCALL
9960 KeReleaseInStackQueuedSpinLockForDpc(
9961 _In_ PKLOCK_QUEUE_HANDLE LockHandle);
9962
9963 _IRQL_requires_(DISPATCH_LEVEL)
9964 NTKERNELAPI
9965 NTSTATUS
9966 NTAPI
9967 KeQueryDpcWatchdogInformation(
9968 _Out_ PKDPC_WATCHDOG_INFORMATION WatchdogInformation);
9969 #if defined(SINGLE_GROUP_LEGACY_API)
9970
9971 _IRQL_requires_min_(PASSIVE_LEVEL)
9972 _IRQL_requires_max_(APC_LEVEL)
9973 NTKERNELAPI
9974 KAFFINITY
9975 NTAPI
9976 KeSetSystemAffinityThreadEx(
9977 _In_ KAFFINITY Affinity);
9978
9979 _IRQL_requires_min_(PASSIVE_LEVEL)
9980 _IRQL_requires_max_(APC_LEVEL)
9981 NTKERNELAPI
9982 VOID
9983 NTAPI
9984 KeRevertToUserAffinityThreadEx(
9985 _In_ KAFFINITY Affinity);
9986
9987 NTKERNELAPI
9988 ULONG
9989 NTAPI
9990 KeQueryActiveProcessorCount(
9991 _Out_opt_ PKAFFINITY ActiveProcessors);
9992
9993 NTKERNELAPI
9994 ULONG
9995 NTAPI
9996 KeQueryMaximumProcessorCount(VOID);
9997 #endif /* SINGLE_GROUP_LEGACY_API */
9998
9999 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
10000
10001 #if (NTDDI_VERSION >= NTDDI_WS08)
10002
10003 _IRQL_requires_max_(APC_LEVEL)
10004 PVOID
10005 NTAPI
10006 KeRegisterProcessorChangeCallback(
10007 _In_ PPROCESSOR_CALLBACK_FUNCTION CallbackFunction,
10008 _In_opt_ PVOID CallbackContext,
10009 _In_ ULONG Flags);
10010
10011 _IRQL_requires_max_(APC_LEVEL)
10012 VOID
10013 NTAPI
10014 KeDeregisterProcessorChangeCallback(
10015 _In_ PVOID CallbackHandle);
10016
10017 #endif /* (NTDDI_VERSION >= NTDDI_WS08) */
10018 #if (NTDDI_VERSION >= NTDDI_WIN7)
10019
10020 _IRQL_requires_max_(DISPATCH_LEVEL)
10021 _IRQL_requires_min_(PASSIVE_LEVEL)
10022 _IRQL_requires_same_
10023 ULONG64
10024 NTAPI
10025 KeQueryTotalCycleTimeProcess(
10026 _Inout_ PKPROCESS Process,
10027 _Out_ PULONG64 CycleTimeStamp);
10028
10029 _IRQL_requires_max_(APC_LEVEL)
10030 _IRQL_requires_min_(PASSIVE_LEVEL)
10031 _IRQL_requires_same_
10032 ULONG64
10033 NTAPI
10034 KeQueryTotalCycleTimeThread(
10035 _Inout_ PKTHREAD Thread,
10036 _Out_ PULONG64 CycleTimeStamp);
10037
10038 _Must_inspect_result_
10039 NTKERNELAPI
10040 NTSTATUS
10041 NTAPI
10042 KeSetTargetProcessorDpcEx(
10043 _Inout_ PKDPC Dpc,
10044 _In_ PPROCESSOR_NUMBER ProcNumber);
10045
10046 _IRQL_requires_min_(PASSIVE_LEVEL)
10047 _IRQL_requires_max_(APC_LEVEL)
10048 NTKERNELAPI
10049 VOID
10050 NTAPI
10051 KeSetSystemGroupAffinityThread(
10052 _In_ PGROUP_AFFINITY Affinity,
10053 _Out_opt_ PGROUP_AFFINITY PreviousAffinity);
10054
10055 _IRQL_requires_min_(PASSIVE_LEVEL)
10056 _IRQL_requires_max_(APC_LEVEL)
10057 NTKERNELAPI
10058 VOID
10059 NTAPI
10060 KeRevertToUserGroupAffinityThread(
10061 _In_ PGROUP_AFFINITY PreviousAffinity);
10062
10063 _IRQL_requires_max_(DISPATCH_LEVEL)
10064 NTKERNELAPI
10065 BOOLEAN
10066 NTAPI
10067 KeSetCoalescableTimer(
10068 _Inout_ PKTIMER Timer,
10069 _In_ LARGE_INTEGER DueTime,
10070 _In_ ULONG Period,
10071 _In_ ULONG TolerableDelay,
10072 _In_opt_ PKDPC Dpc);
10073
10074 NTKERNELAPI
10075 ULONGLONG
10076 NTAPI
10077 KeQueryUnbiasedInterruptTime(VOID);
10078
10079 NTKERNELAPI
10080 ULONG
10081 NTAPI
10082 KeQueryActiveProcessorCountEx(
10083 _In_ USHORT GroupNumber);
10084
10085 NTKERNELAPI
10086 ULONG
10087 NTAPI
10088 KeQueryMaximumProcessorCountEx(
10089 _In_ USHORT GroupNumber);
10090
10091 NTKERNELAPI
10092 USHORT
10093 NTAPI
10094 KeQueryActiveGroupCount(VOID);
10095
10096 NTKERNELAPI
10097 USHORT
10098 NTAPI
10099 KeQueryMaximumGroupCount(VOID);
10100
10101 NTKERNELAPI
10102 KAFFINITY
10103 NTAPI
10104 KeQueryGroupAffinity(
10105 _In_ USHORT GroupNumber);
10106
10107 NTKERNELAPI
10108 ULONG
10109 NTAPI
10110 KeGetCurrentProcessorNumberEx(
10111 _Out_opt_ PPROCESSOR_NUMBER ProcNumber);
10112
10113 NTKERNELAPI
10114 VOID
10115 NTAPI
10116 KeQueryNodeActiveAffinity(
10117 _In_ USHORT NodeNumber,
10118 _Out_opt_ PGROUP_AFFINITY Affinity,
10119 _Out_opt_ PUSHORT Count);
10120
10121 NTKERNELAPI
10122 USHORT
10123 NTAPI
10124 KeQueryNodeMaximumProcessorCount(
10125 _In_ USHORT NodeNumber);
10126
10127 NTKERNELAPI
10128 USHORT
10129 NTAPI
10130 KeQueryHighestNodeNumber(VOID);
10131
10132 NTKERNELAPI
10133 USHORT
10134 NTAPI
10135 KeGetCurrentNodeNumber(VOID);
10136
10137 _IRQL_requires_max_(DISPATCH_LEVEL)
10138 NTKERNELAPI
10139 NTSTATUS
10140 NTAPI
10141 KeQueryLogicalProcessorRelationship(
10142 _In_opt_ PPROCESSOR_NUMBER ProcessorNumber OPTIONAL,
10143 _In_ LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,
10144 _Out_writes_bytes_opt_(*Length) PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information,
10145 _Inout_ PULONG Length);
10146
10147 _Must_inspect_result_
10148 _IRQL_requires_max_(DISPATCH_LEVEL)
10149 _Ret_range_(<=, 0)
10150 _When_(return==0, _Kernel_float_saved_)
10151 NTKERNELAPI
10152 NTSTATUS
10153 NTAPI
10154 KeSaveExtendedProcessorState(
10155 _In_ ULONG64 Mask,
10156 _Out_ _Requires_lock_not_held_(*_Curr_)
10157 _When_(return==0, _Acquires_lock_(*_Curr_))
10158 PXSTATE_SAVE XStateSave);
10159
10160 _Kernel_float_restored_
10161 NTKERNELAPI
10162 VOID
10163 NTAPI
10164 KeRestoreExtendedProcessorState(
10165 _In_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_)
10166 PXSTATE_SAVE XStateSave);
10167
10168 NTSTATUS
10169 NTAPI
10170 KeGetProcessorNumberFromIndex(
10171 _In_ ULONG ProcIndex,
10172 _Out_ PPROCESSOR_NUMBER ProcNumber);
10173
10174 ULONG
10175 NTAPI
10176 KeGetProcessorIndexFromNumber(
10177 _In_ PPROCESSOR_NUMBER ProcNumber);
10178 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
10179 #if !defined(_IA64_)
10180 NTHALAPI
10181 VOID
10182 NTAPI
10183 KeFlushWriteBuffer(VOID);
10184 #endif
10185
10186 /* VOID
10187 * KeInitializeCallbackRecord(
10188 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
10189 */
10190 #define KeInitializeCallbackRecord(CallbackRecord) \
10191 CallbackRecord->State = BufferEmpty;
10192
10193 #if defined(_PREFAST_)
10194
10195 void __PREfastPagedCode(void);
10196 void __PREfastPagedCodeLocked(void);
10197 #define PAGED_CODE() __PREfastPagedCode();
10198 #define PAGED_CODE_LOCKED() __PREfastPagedCodeLocked();
10199
10200 #elif DBG
10201
10202 #if (NTDDI_VERSION >= NTDDI_VISTA)
10203 #define PAGED_ASSERT( exp ) NT_ASSERT( exp )
10204 #else
10205 #define PAGED_ASSERT( exp ) ASSERT( exp )
10206 #endif
10207
10208 #define PAGED_CODE() { \
10209 if (KeGetCurrentIrql() > APC_LEVEL) { \
10210 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
10211 PAGED_ASSERT(FALSE); \
10212 } \
10213 }
10214
10215 #define PAGED_CODE_LOCKED() NOP_FUNCTION;
10216
10217 #else
10218
10219 #define PAGED_CODE() NOP_FUNCTION;
10220 #define PAGED_CODE_LOCKED() NOP_FUNCTION;
10221
10222 #endif /* DBG */
10223
10224 /******************************************************************************
10225 * Runtime Library Functions *
10226 ******************************************************************************/
10227
10228 #define FAST_FAIL_LEGACY_GS_VIOLATION 0
10229 #define FAST_FAIL_VTGUARD_CHECK_FAILURE 1
10230 #define FAST_FAIL_STACK_COOKIE_CHECK_FAILURE 2
10231 #define FAST_FAIL_CORRUPT_LIST_ENTRY 3
10232 #define FAST_FAIL_INCORRECT_STACK 4
10233 #define FAST_FAIL_INVALID_ARG 5
10234 #define FAST_FAIL_GS_COOKIE_INIT 6
10235 #define FAST_FAIL_FATAL_APP_EXIT 7
10236 #define FAST_FAIL_RANGE_CHECK_FAILURE 8
10237 #define FAST_FAIL_UNSAFE_REGISTRY_ACCESS 9
10238 #define FAST_FAIL_GUARD_ICALL_CHECK_FAILURE 10
10239 #define FAST_FAIL_GUARD_WRITE_CHECK_FAILURE 11
10240 #define FAST_FAIL_INVALID_FIBER_SWITCH 12
10241 #define FAST_FAIL_INVALID_SET_OF_CONTEXT 13
10242 #define FAST_FAIL_INVALID_REFERENCE_COUNT 14
10243 #define FAST_FAIL_INVALID_JUMP_BUFFER 18
10244 #define FAST_FAIL_MRDATA_MODIFIED 19
10245 #define FAST_FAIL_INVALID_FAST_FAIL_CODE 0xFFFFFFFF
10246
10247 DECLSPEC_NORETURN
10248 FORCEINLINE
10249 VOID
10250 RtlFailFast(
10251 _In_ ULONG Code)
10252 {
10253 __fastfail(Code);
10254 }
10255
10256 #if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && (defined(_M_CEE_PURE) || defined(_M_CEE_SAFE))
10257 #define NO_KERNEL_LIST_ENTRY_CHECKS
10258 #endif
10259
10260 #if !defined(EXTRA_KERNEL_LIST_ENTRY_CHECKS) && defined(__REACTOS__)
10261 #define EXTRA_KERNEL_LIST_ENTRY_CHECKS
10262 #endif
10263
10264 #if !defined(MIDL_PASS) && !defined(SORTPP_PASS)
10265
10266 #define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x }
10267
10268 FORCEINLINE
10269 VOID
10270 InitializeListHead(
10271 _Out_ PLIST_ENTRY ListHead)
10272 {
10273 ListHead->Flink = ListHead->Blink = ListHead;
10274 }
10275
10276 _Must_inspect_result_
10277 FORCEINLINE
10278 BOOLEAN
10279 IsListEmpty(
10280 _In_ const LIST_ENTRY * ListHead)
10281 {
10282 return (BOOLEAN)(ListHead->Flink == ListHead);
10283 }
10284
10285 FORCEINLINE
10286 BOOLEAN
10287 RemoveEntryListUnsafe(
10288 _In_ PLIST_ENTRY Entry)
10289 {
10290 PLIST_ENTRY OldFlink;
10291 PLIST_ENTRY OldBlink;
10292
10293 OldFlink = Entry->Flink;
10294 OldBlink = Entry->Blink;
10295 OldFlink->Blink = OldBlink;
10296 OldBlink->Flink = OldFlink;
10297 return (BOOLEAN)(OldFlink == OldBlink);
10298 }
10299
10300 #if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
10301 FORCEINLINE
10302 VOID
10303 FatalListEntryError(
10304 _In_ PVOID P1,
10305 _In_ PVOID P2,
10306 _In_ PVOID P3)
10307 {
10308 UNREFERENCED_PARAMETER(P1);
10309 UNREFERENCED_PARAMETER(P2);
10310 UNREFERENCED_PARAMETER(P3);
10311
10312 RtlFailFast(FAST_FAIL_CORRUPT_LIST_ENTRY);
10313 }
10314
10315 FORCEINLINE
10316 VOID
10317 RtlpCheckListEntry(
10318 _In_ PLIST_ENTRY Entry)
10319 {
10320 if (Entry->Flink->Blink != Entry || Entry->Blink->Flink != Entry)
10321 FatalListEntryError(Entry->Blink, Entry, Entry->Flink);
10322 }
10323 #endif
10324
10325 FORCEINLINE
10326 BOOLEAN
10327 RemoveEntryList(
10328 _In_ PLIST_ENTRY Entry)
10329 {
10330 PLIST_ENTRY OldFlink;
10331 PLIST_ENTRY OldBlink;
10332
10333 OldFlink = Entry->Flink;
10334 OldBlink = Entry->Blink;
10335 #if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
10336 #ifdef EXTRA_KERNEL_LIST_ENTRY_CHECKS
10337 if (OldFlink == Entry || OldBlink == Entry)
10338 FatalListEntryError(OldBlink, Entry, OldFlink);
10339 #endif
10340 if (OldFlink->Blink != Entry || OldBlink->Flink != Entry)
10341 FatalListEntryError(OldBlink, Entry, OldFlink);
10342 #endif
10343 OldFlink->Blink = OldBlink;
10344 OldBlink->Flink = OldFlink;
10345 return (BOOLEAN)(OldFlink == OldBlink);
10346 }
10347
10348 FORCEINLINE
10349 PLIST_ENTRY
10350 RemoveHeadList(
10351 _Inout_ PLIST_ENTRY ListHead)
10352 {
10353 PLIST_ENTRY Flink;
10354 PLIST_ENTRY Entry;
10355
10356 #if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG
10357 RtlpCheckListEntry(ListHead);
10358 #ifdef EXTRA_KERNEL_LIST_ENTRY_CHECKS
10359 if (ListHead->Flink == ListHead || ListHead->Blink == ListHead)
10360 FatalListEntryError(ListHead->Blink, ListHead, ListHead->Flink);
10361 #endif
10362 #endif
10363 Entry = ListHead->Flink;
10364 Flink = Entry->Flink;
10365 #if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
10366 if (Entry->Blink != ListHead || Flink->Blink != Entry)
10367 FatalListEntryError(ListHead, Entry, Flink);
10368 #endif
10369 ListHead->Flink = Flink;
10370 Flink->Blink = ListHead;
10371 return Entry;
10372 }
10373
10374 FORCEINLINE
10375 PLIST_ENTRY
10376 RemoveTailList(
10377 _Inout_ PLIST_ENTRY ListHead)
10378 {
10379 PLIST_ENTRY Blink;
10380 PLIST_ENTRY Entry;
10381
10382 #if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG
10383 RtlpCheckListEntry(ListHead);
10384 #ifdef EXTRA_KERNEL_LIST_ENTRY_CHECKS
10385 if (ListHead->Flink == ListHead || ListHead->Blink == ListHead)
10386 FatalListEntryError(ListHead->Blink, ListHead, ListHead->Flink);
10387 #endif
10388 #endif
10389 Entry = ListHead->Blink;
10390 Blink = Entry->Blink;
10391 #if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
10392 if (Blink->Flink != Entry || Entry->Flink != ListHead)
10393 FatalListEntryError(Blink, Entry, ListHead);
10394 #endif
10395 ListHead->Blink = Blink;
10396 Blink->Flink = ListHead;
10397 return Entry;
10398 }
10399
10400 FORCEINLINE
10401 VOID
10402 InsertTailList(
10403 _Inout_ PLIST_ENTRY ListHead,
10404 _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
10405 {
10406 PLIST_ENTRY OldBlink;
10407 #if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG
10408 RtlpCheckListEntry(ListHead);
10409 #endif
10410 OldBlink = ListHead->Blink;
10411 Entry->Flink = ListHead;
10412 Entry->Blink = OldBlink;
10413 #if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
10414 if (OldBlink->Flink != ListHead)
10415 FatalListEntryError(OldBlink->Blink, OldBlink, ListHead);
10416 #endif
10417 OldBlink->Flink = Entry;
10418 ListHead->Blink = Entry;
10419 }
10420
10421 FORCEINLINE
10422 VOID
10423 InsertHeadList(
10424 _Inout_ PLIST_ENTRY ListHead,
10425 _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
10426 {
10427 PLIST_ENTRY OldFlink;
10428 #if !defined(NO_KERNEL_LIST_ENTRY_CHECKS) && DBG
10429 RtlpCheckListEntry(ListHead);
10430 #endif
10431 OldFlink = ListHead->Flink;
10432 Entry->Flink = OldFlink;
10433 Entry->Blink = ListHead;
10434 #if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
10435 if (OldFlink->Blink != ListHead)
10436 FatalListEntryError(ListHead, OldFlink, OldFlink->Flink);
10437 #endif
10438 OldFlink->Blink = Entry;
10439 ListHead->Flink = Entry;
10440 }
10441
10442 FORCEINLINE
10443 VOID
10444 AppendTailList(
10445 _Inout_ PLIST_ENTRY ListHead,
10446 _Inout_ PLIST_ENTRY ListToAppend)
10447 {
10448 PLIST_ENTRY ListEnd = ListHead->Blink;
10449
10450 #if !defined(NO_KERNEL_LIST_ENTRY_CHECKS)
10451 RtlpCheckListEntry(ListHead);
10452 RtlpCheckListEntry(ListToAppend);
10453 #endif
10454 ListHead->Blink->Flink = ListToAppend;
10455 ListHead->Blink = ListToAppend->Blink;
10456 ListToAppend->Blink->Flink = ListHead;
10457 ListToAppend->Blink = ListEnd;
10458 }
10459
10460 FORCEINLINE
10461 PSINGLE_LIST_ENTRY
10462 PopEntryList(
10463 _Inout_ PSINGLE_LIST_ENTRY ListHead)
10464 {
10465 PSINGLE_LIST_ENTRY FirstEntry;
10466 FirstEntry = ListHead->Next;
10467 if (FirstEntry != NULL) {
10468 ListHead->Next = FirstEntry->Next;
10469 }
10470 return FirstEntry;
10471 }
10472
10473 FORCEINLINE
10474 VOID
10475 PushEntryList(
10476 _Inout_ PSINGLE_LIST_ENTRY ListHead,
10477 _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY Entry)
10478 {
10479 Entry->Next = ListHead->Next;
10480 ListHead->Next = Entry;
10481 }
10482
10483 #endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */
10484
10485 __analysis_noreturn
10486 NTSYSAPI
10487 VOID
10488 NTAPI
10489 RtlAssert(
10490 _In_ PVOID FailedAssertion,
10491 _In_ PVOID FileName,
10492 _In_ ULONG LineNumber,
10493 _In_opt_z_ PSTR Message);
10494
10495 /* VOID
10496 * RtlCopyMemory(
10497 * IN VOID UNALIGNED *Destination,
10498 * IN CONST VOID UNALIGNED *Source,
10499 * IN SIZE_T Length)
10500 */
10501 #define RtlCopyMemory(Destination, Source, Length) \
10502 memcpy(Destination, Source, Length)
10503
10504 #define RtlCopyBytes RtlCopyMemory
10505
10506 #if defined(_M_AMD64)
10507 NTSYSAPI
10508 VOID
10509 NTAPI
10510 RtlCopyMemoryNonTemporal(
10511 _Out_writes_bytes_all_(Length) VOID UNALIGNED *Destination,
10512 _In_reads_bytes_(Length) const VOID UNALIGNED *Source,
10513 _In_ SIZE_T Length);
10514 #else
10515 #define RtlCopyMemoryNonTemporal RtlCopyMemory
10516 #endif
10517
10518 /* BOOLEAN
10519 * RtlEqualLuid(
10520 * IN PLUID Luid1,
10521 * IN PLUID Luid2)
10522 */
10523 #define RtlEqualLuid(Luid1, Luid2) \
10524 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
10525
10526 /* LOGICAL
10527 * RtlEqualMemory(
10528 * IN VOID UNALIGNED *Destination,
10529 * IN CONST VOID UNALIGNED *Source,
10530 * IN SIZE_T Length)
10531 */
10532 #define RtlEqualMemory(Destination, Source, Length) \
10533 (!memcmp(Destination, Source, Length))
10534
10535 /* VOID
10536 * RtlFillMemory(
10537 * IN VOID UNALIGNED *Destination,
10538 * IN SIZE_T Length,
10539 * IN UCHAR Fill)
10540 */
10541 #define RtlFillMemory(Destination, Length, Fill) \
10542 memset(Destination, Fill, Length)
10543
10544 #define RtlFillBytes RtlFillMemory
10545
10546 _IRQL_requires_max_(PASSIVE_LEVEL)
10547 NTSYSAPI
10548 VOID
10549 NTAPI
10550 RtlFreeUnicodeString(
10551 _Inout_ _At_(UnicodeString->Buffer, __drv_freesMem(Mem))
10552 PUNICODE_STRING UnicodeString);
10553
10554 _IRQL_requires_max_(PASSIVE_LEVEL)
10555 _Must_inspect_result_
10556 NTSYSAPI
10557 NTSTATUS
10558 NTAPI
10559 RtlGUIDFromString(
10560 _In_ PUNICODE_STRING GuidString,
10561 _Out_ GUID *Guid);
10562
10563 _IRQL_requires_max_(DISPATCH_LEVEL)
10564 _At_(DestinationString->Buffer, _Post_equal_to_(SourceString))
10565 _When_(SourceString != NULL,
10566 _At_(DestinationString->Length, _Post_equal_to_(_String_length_(SourceString) * sizeof(WCHAR)))
10567 _At_(DestinationString->MaximumLength, _Post_equal_to_(DestinationString->Length + sizeof(WCHAR))))
10568 _When_(SourceString == NULL,
10569 _At_(DestinationString->Length, _Post_equal_to_(0))
10570 _At_(DestinationString->MaximumLength, _Post_equal_to_(0)))
10571 NTSYSAPI
10572 VOID
10573 NTAPI
10574 RtlInitUnicodeString(
10575 _Out_ PUNICODE_STRING DestinationString,
10576 _In_opt_z_ __drv_aliasesMem PCWSTR SourceString);
10577
10578 /* VOID
10579 * RtlMoveMemory(
10580 * IN VOID UNALIGNED *Destination,
10581 * IN CONST VOID UNALIGNED *Source,
10582 * IN SIZE_T Length)
10583 */
10584 #define RtlMoveMemory(Destination, Source, Length) \
10585 memmove(Destination, Source, Length)
10586
10587 _IRQL_requires_max_(PASSIVE_LEVEL)
10588 _Must_inspect_result_
10589 NTSYSAPI
10590 NTSTATUS
10591 NTAPI
10592 RtlStringFromGUID(
10593 _In_ REFGUID Guid,
10594 _Out_ _At_(GuidString->Buffer, __drv_allocatesMem(Mem))
10595 PUNICODE_STRING GuidString);
10596
10597 /* VOID
10598 * RtlZeroMemory(
10599 * IN VOID UNALIGNED *Destination,
10600 * IN SIZE_T Length)
10601 */
10602 #define RtlZeroMemory(Destination, Length) \
10603 memset(Destination, 0, Length)
10604
10605 #define RtlZeroBytes RtlZeroMemory
10606
10607 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10608
10609 _Must_inspect_result_
10610 NTSYSAPI
10611 BOOLEAN
10612 NTAPI
10613 RtlAreBitsClear(
10614 _In_ PRTL_BITMAP BitMapHeader,
10615 _In_ ULONG StartingIndex,
10616 _In_ ULONG Length);
10617
10618 _Must_inspect_result_
10619 NTSYSAPI
10620 BOOLEAN
10621 NTAPI
10622 RtlAreBitsSet(
10623 _In_ PRTL_BITMAP BitMapHeader,
10624 _In_ ULONG StartingIndex,
10625 _In_ ULONG Length);
10626
10627 _IRQL_requires_max_(PASSIVE_LEVEL)
10628 _Must_inspect_result_
10629 NTSYSAPI
10630 NTSTATUS
10631 NTAPI
10632 RtlAnsiStringToUnicodeString(
10633 _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem)))
10634 _When_(!AllocateDestinationString, _Inout_)
10635 PUNICODE_STRING DestinationString,
10636 _In_ PANSI_STRING SourceString,
10637 _In_ BOOLEAN AllocateDestinationString);
10638
10639 _IRQL_requires_max_(PASSIVE_LEVEL)
10640 NTSYSAPI
10641 ULONG
10642 NTAPI
10643 RtlxAnsiStringToUnicodeSize(
10644 _In_ PCANSI_STRING AnsiString);
10645
10646 #define RtlAnsiStringToUnicodeSize(String) ( \
10647 NLS_MB_CODE_PAGE_TAG ? \
10648 RtlxAnsiStringToUnicodeSize(String) : \
10649 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
10650 )
10651
10652 _Success_(1)
10653 _Unchanged_(Destination->MaximumLength)
10654 _Unchanged_(Destination->Buffer)
10655 _When_(_Old_(Destination->Length) + Source->Length <= Destination->MaximumLength,
10656 _At_(Destination->Length, _Post_equal_to_(_Old_(Destination->Length) + Source->Length))
10657 _At_(return, _Out_range_(==, 0)))
10658 _When_(_Old_(Destination->Length) + Source->Length > Destination->MaximumLength,
10659 _Unchanged_(Destination->Length)
10660 _At_(return, _Out_range_(<, 0)))
10661 NTSYSAPI
10662 NTSTATUS
10663 NTAPI
10664 RtlAppendUnicodeStringToString(
10665 _Inout_ PUNICODE_STRING Destination,
10666 _In_ PCUNICODE_STRING Source);
10667
10668 _Success_(1)
10669 _Unchanged_(Destination->MaximumLength)
10670 _Unchanged_(Destination->Buffer)
10671 /* _When_(_Old_(Destination->Length) + _String_length_(Source) * sizeof(WCHAR) <= Destination->MaximumLength,
10672 _At_(Destination->Length, _Post_equal_to_(_Old_(Destination->Length) + _String_length_(Source) * sizeof(WCHAR)))
10673 _At_(return, _Out_range_(==, 0)))
10674 _When_(_Old_(Destination->Length) + _String_length_(Source) * sizeof(WCHAR) > Destination->MaximumLength,
10675 _Unchanged_(Destination->Length)
10676 _At_(return, _Out_range_(<, 0))) */
10677 NTSYSAPI
10678 NTSTATUS
10679 NTAPI
10680 RtlAppendUnicodeToString(
10681 _Inout_ PUNICODE_STRING Destination,
10682 _In_opt_z_ PCWSTR Source);
10683
10684 _IRQL_requires_max_(PASSIVE_LEVEL)
10685 _Must_inspect_result_
10686 NTSYSAPI
10687 NTSTATUS
10688 NTAPI
10689 RtlCheckRegistryKey(
10690 _In_ ULONG RelativeTo,
10691 _In_ PWSTR Path);
10692
10693 NTSYSAPI
10694 VOID
10695 NTAPI
10696 RtlClearAllBits(
10697 _In_ PRTL_BITMAP BitMapHeader);
10698
10699 NTSYSAPI
10700 VOID
10701 NTAPI
10702 RtlClearBits(
10703 _In_ PRTL_BITMAP BitMapHeader,
10704 _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToClear) ULONG StartingIndex,
10705 _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToClear);
10706
10707 _Must_inspect_result_
10708 NTSYSAPI
10709 SIZE_T
10710 NTAPI
10711 RtlCompareMemory(
10712 _In_ const VOID *Source1,
10713 _In_ const VOID *Source2,
10714 _In_ SIZE_T Length);
10715
10716 _IRQL_requires_max_(PASSIVE_LEVEL)
10717 _Must_inspect_result_
10718 NTSYSAPI
10719 LONG
10720 NTAPI
10721 RtlCompareUnicodeString(
10722 _In_ PCUNICODE_STRING String1,
10723 _In_ PCUNICODE_STRING String2,
10724 _In_ BOOLEAN CaseInSensitive);
10725
10726 _IRQL_requires_max_(PASSIVE_LEVEL)
10727 _Must_inspect_result_
10728 NTSYSAPI
10729 LONG
10730 NTAPI
10731 RtlCompareUnicodeStrings(
10732 _In_reads_(String1Length) PCWCH String1,
10733 _In_ SIZE_T String1Length,
10734 _In_reads_(String2Length) PCWCH String2,
10735 _In_ SIZE_T String2Length,
10736 _In_ BOOLEAN CaseInSensitive);
10737
10738 _Unchanged_(DestinationString->Buffer)
10739 _Unchanged_(DestinationString->MaximumLength)
10740 _At_(DestinationString->Length,
10741 _When_(SourceString->Length > DestinationString->MaximumLength,
10742 _Post_equal_to_(DestinationString->MaximumLength))
10743 _When_(SourceString->Length <= DestinationString->MaximumLength,
10744 _Post_equal_to_(SourceString->Length)))
10745 NTSYSAPI
10746 VOID
10747 NTAPI
10748 RtlCopyUnicodeString(
10749 _Inout_ PUNICODE_STRING DestinationString,
10750 _In_opt_ PCUNICODE_STRING SourceString);
10751
10752 _IRQL_requires_max_(PASSIVE_LEVEL)
10753 NTSYSAPI
10754 NTSTATUS
10755 NTAPI
10756 RtlCreateRegistryKey(
10757 _In_ ULONG RelativeTo,
10758 _In_ PWSTR Path);
10759
10760 _IRQL_requires_max_(APC_LEVEL)
10761 NTSYSAPI
10762 NTSTATUS
10763 NTAPI
10764 RtlCreateSecurityDescriptor(
10765 _Out_ PSECURITY_DESCRIPTOR SecurityDescriptor,
10766 _In_ ULONG Revision);
10767
10768 _IRQL_requires_max_(PASSIVE_LEVEL)
10769 NTSYSAPI
10770 NTSTATUS
10771 NTAPI
10772 RtlDeleteRegistryValue(
10773 _In_ ULONG RelativeTo,
10774 _In_ PCWSTR Path,
10775 _In_z_ PCWSTR ValueName);
10776
10777 _IRQL_requires_max_(PASSIVE_LEVEL)
10778 _Must_inspect_result_
10779 NTSYSAPI
10780 BOOLEAN
10781 NTAPI
10782 RtlEqualUnicodeString(
10783 _In_ CONST UNICODE_STRING *String1,
10784 _In_ CONST UNICODE_STRING *String2,
10785 _In_ BOOLEAN CaseInSensitive);
10786
10787 #if !defined(_AMD64_) && !defined(_IA64_)
10788 NTSYSAPI
10789 LARGE_INTEGER
10790 NTAPI
10791 RtlExtendedIntegerMultiply(
10792 _In_ LARGE_INTEGER Multiplicand,
10793 _In_ LONG Multiplier);
10794
10795 NTSYSAPI
10796 LARGE_INTEGER
10797 NTAPI
10798 RtlExtendedLargeIntegerDivide(
10799 _In_ LARGE_INTEGER Dividend,
10800 _In_ ULONG Divisor,
10801 _Out_opt_ PULONG Remainder);
10802 #endif
10803
10804 #if defined(_X86_) || defined(_IA64_)
10805 NTSYSAPI
10806 LARGE_INTEGER
10807 NTAPI
10808 RtlExtendedMagicDivide(
10809 _In_ LARGE_INTEGER Dividend,
10810 _In_ LARGE_INTEGER MagicDivisor,
10811 _In_ CCHAR ShiftCount);
10812 #endif
10813
10814 _IRQL_requires_max_(PASSIVE_LEVEL)
10815 NTSYSAPI
10816 VOID
10817 NTAPI
10818 RtlFreeAnsiString(
10819 _Inout_ _At_(AnsiString->Buffer, __drv_freesMem(Mem))
10820 PANSI_STRING AnsiString);
10821
10822 _Success_(return != -1)
10823 _Must_inspect_result_
10824 NTSYSAPI
10825 ULONG
10826 NTAPI
10827 RtlFindClearBits(
10828 _In_ PRTL_BITMAP BitMapHeader,
10829 _In_ ULONG NumberToFind,
10830 _In_ ULONG HintIndex);
10831
10832 _Success_(return != -1)
10833 NTSYSAPI
10834 ULONG
10835 NTAPI
10836 RtlFindClearBitsAndSet(
10837 _In_ PRTL_BITMAP BitMapHeader,
10838 _In_ ULONG NumberToFind,
10839 _In_ ULONG HintIndex);
10840
10841 NTSYSAPI
10842 ULONG
10843 NTAPI
10844 RtlFindFirstRunClear(
10845 _In_ PRTL_BITMAP BitMapHeader,
10846 _Out_ PULONG StartingIndex);
10847
10848 NTSYSAPI
10849 ULONG
10850 NTAPI
10851 RtlFindClearRuns(
10852 _In_ PRTL_BITMAP BitMapHeader,
10853 _Out_writes_to_(SizeOfRunArray, return) PRTL_BITMAP_RUN RunArray,
10854 _In_range_(>, 0) ULONG SizeOfRunArray,
10855 _In_ BOOLEAN LocateLongestRuns);
10856
10857 NTSYSAPI
10858 ULONG
10859 NTAPI
10860 RtlFindLastBackwardRunClear(
10861 _In_ PRTL_BITMAP BitMapHeader,
10862 _In_ ULONG FromIndex,
10863 _Out_ PULONG StartingRunIndex);
10864
10865 _Success_(return != -1)
10866 _Must_inspect_result_
10867 NTSYSAPI
10868 CCHAR
10869 NTAPI
10870 RtlFindLeastSignificantBit(
10871 _In_ ULONGLONG Set);
10872
10873 NTSYSAPI
10874 ULONG
10875 NTAPI
10876 RtlFindLongestRunClear(
10877 _In_ PRTL_BITMAP BitMapHeader,
10878 _Out_ PULONG StartingIndex);
10879
10880 _Success_(return != -1)
10881 _Must_inspect_result_
10882 NTSYSAPI
10883 CCHAR
10884 NTAPI
10885 RtlFindMostSignificantBit(
10886 _In_ ULONGLONG Set);
10887
10888 NTSYSAPI
10889 ULONG
10890 NTAPI
10891 RtlFindNextForwardRunClear(
10892 _In_ PRTL_BITMAP BitMapHeader,
10893 _In_ ULONG FromIndex,
10894 _Out_ PULONG StartingRunIndex);
10895
10896 _Success_(return != -1)
10897 _Must_inspect_result_
10898 NTSYSAPI
10899 ULONG
10900 NTAPI
10901 RtlFindSetBits(
10902 _In_ PRTL_BITMAP BitMapHeader,
10903 _In_ ULONG NumberToFind,
10904 _In_ ULONG HintIndex);
10905
10906 _Success_(return != -1)
10907 NTSYSAPI
10908 ULONG
10909 NTAPI
10910 RtlFindSetBitsAndClear(
10911 _In_ PRTL_BITMAP BitMapHeader,
10912 _In_ ULONG NumberToFind,
10913 _In_ ULONG HintIndex);
10914
10915 _IRQL_requires_max_(DISPATCH_LEVEL)
10916 NTSYSAPI
10917 VOID
10918 NTAPI
10919 RtlInitAnsiString(
10920 _Out_ PANSI_STRING DestinationString,
10921 _In_opt_z_ __drv_aliasesMem PCSZ SourceString);
10922
10923 _At_(BitMapHeader->SizeOfBitMap, _Post_equal_to_(SizeOfBitMap))
10924 _At_(BitMapHeader->Buffer, _Post_equal_to_(BitMapBuffer))
10925 NTSYSAPI
10926 VOID
10927 NTAPI
10928 RtlInitializeBitMap(
10929 _Out_ PRTL_BITMAP BitMapHeader,
10930 _In_opt_ __drv_aliasesMem PULONG BitMapBuffer,
10931 _In_opt_ ULONG SizeOfBitMap);
10932
10933 _IRQL_requires_max_(DISPATCH_LEVEL)
10934 NTSYSAPI
10935 VOID
10936 NTAPI
10937 RtlInitString(
10938 _Out_ PSTRING DestinationString,
10939 _In_opt_z_ __drv_aliasesMem PCSZ SourceString);
10940
10941 _IRQL_requires_max_(PASSIVE_LEVEL)
10942 _At_(String->MaximumLength, _Const_)
10943 NTSYSAPI
10944 NTSTATUS
10945 NTAPI
10946 RtlIntegerToUnicodeString(
10947 _In_ ULONG Value,
10948 _In_opt_ ULONG Base,
10949 _Inout_ PUNICODE_STRING String);
10950
10951 _IRQL_requires_max_(PASSIVE_LEVEL)
10952 _At_(String->MaximumLength, _Const_)
10953 NTSYSAPI
10954 NTSTATUS
10955 NTAPI
10956 RtlInt64ToUnicodeString(
10957 _In_ ULONGLONG Value,
10958 _In_opt_ ULONG Base,
10959 _Inout_ PUNICODE_STRING String);
10960
10961 #ifdef _WIN64
10962 #define RtlIntPtrToUnicodeString(Value, Base, String) \
10963 RtlInt64ToUnicodeString(Value, Base, String)
10964 #else
10965 #define RtlIntPtrToUnicodeString(Value, Base, String) \
10966 RtlIntegerToUnicodeString(Value, Base, String)
10967 #endif
10968
10969 /* BOOLEAN
10970 * RtlIsZeroLuid(
10971 * IN PLUID L1);
10972 */
10973 #define RtlIsZeroLuid(_L1) \
10974 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
10975
10976 _IRQL_requires_max_(APC_LEVEL)
10977 NTSYSAPI
10978 ULONG
10979 NTAPI
10980 RtlLengthSecurityDescriptor(
10981 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor);
10982
10983 NTSYSAPI
10984 ULONG
10985 NTAPI
10986 RtlNumberOfClearBits(
10987 _In_ PRTL_BITMAP BitMapHeader);
10988
10989 NTSYSAPI
10990 ULONG
10991 NTAPI
10992 RtlNumberOfSetBits(
10993 _In_ PRTL_BITMAP BitMapHeader);
10994
10995 _IRQL_requires_max_(PASSIVE_LEVEL)
10996 NTSYSAPI
10997 NTSTATUS
10998 NTAPI
10999 RtlQueryRegistryValues(
11000 _In_ ULONG RelativeTo,
11001 _In_ PCWSTR Path,
11002 _Inout_ _At_(*(*QueryTable).EntryContext, _Pre_unknown_)
11003 PRTL_QUERY_REGISTRY_TABLE QueryTable,
11004 _In_opt_ PVOID Context,
11005 _In_opt_ PVOID Environment);
11006
11007 #define SHORT_SIZE (sizeof(USHORT))
11008 #define SHORT_MASK (SHORT_SIZE - 1)
11009 #define LONG_SIZE (sizeof(LONG))
11010 #define LONGLONG_SIZE (sizeof(LONGLONG))
11011 #define LONG_MASK (LONG_SIZE - 1)
11012 #define LONGLONG_MASK (LONGLONG_SIZE - 1)
11013 #define LOWBYTE_MASK 0x00FF
11014
11015 #define FIRSTBYTE(VALUE) ((VALUE) & LOWBYTE_MASK)
11016 #define SECONDBYTE(VALUE) (((VALUE) >> 8) & LOWBYTE_MASK)
11017 #define THIRDBYTE(VALUE) (((VALUE) >> 16) & LOWBYTE_MASK)
11018 #define FOURTHBYTE(VALUE) (((VALUE) >> 24) & LOWBYTE_MASK)
11019
11020 NTSYSAPI
11021 VOID
11022 NTAPI
11023 RtlSetAllBits(
11024 _In_ PRTL_BITMAP BitMapHeader);
11025
11026 NTSYSAPI
11027 VOID
11028 NTAPI
11029 RtlSetBits(
11030 _In_ PRTL_BITMAP BitMapHeader,
11031 _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToSet) ULONG StartingIndex,
11032 _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToSet);
11033
11034 _IRQL_requires_max_(APC_LEVEL)
11035 NTSYSAPI
11036 NTSTATUS
11037 NTAPI
11038 RtlSetDaclSecurityDescriptor(
11039 _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor,
11040 _In_ BOOLEAN DaclPresent,
11041 _In_opt_ PACL Dacl,
11042 _In_opt_ BOOLEAN DaclDefaulted);
11043
11044 #if defined(_AMD64_)
11045
11046 /* VOID
11047 * RtlStoreUlong(
11048 * IN PULONG Address,
11049 * IN ULONG Value);
11050 */
11051 #define RtlStoreUlong(Address,Value) \
11052 *(ULONG UNALIGNED *)(Address) = (Value)
11053
11054 /* VOID
11055 * RtlStoreUlonglong(
11056 * IN OUT PULONGLONG Address,
11057 * ULONGLONG Value);
11058 */
11059 #define RtlStoreUlonglong(Address,Value) \
11060 *(ULONGLONG UNALIGNED *)(Address) = (Value)
11061
11062 /* VOID
11063 * RtlStoreUshort(
11064 * IN PUSHORT Address,
11065 * IN USHORT Value);
11066 */
11067 #define RtlStoreUshort(Address,Value) \
11068 *(USHORT UNALIGNED *)(Address) = (Value)
11069
11070 /* VOID
11071 * RtlRetrieveUshort(
11072 * PUSHORT DestinationAddress,
11073 * PUSHORT SourceAddress);
11074 */
11075 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
11076 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
11077
11078 /* VOID
11079 * RtlRetrieveUlong(
11080 * PULONG DestinationAddress,
11081 * PULONG SourceAddress);
11082 */
11083 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
11084 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
11085
11086 #else
11087
11088 #define RtlStoreUlong(Address,Value) \
11089 if ((ULONG_PTR)(Address) & LONG_MASK) { \
11090 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
11091 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
11092 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
11093 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
11094 } \
11095 else { \
11096 *((PULONG)(Address)) = (ULONG) (Value); \
11097 }
11098
11099 #define RtlStoreUlonglong(Address,Value) \
11100 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
11101 RtlStoreUlong((ULONG_PTR)(Address), \
11102 (ULONGLONG)(Value) & 0xFFFFFFFF); \
11103 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
11104 (ULONGLONG)(Value) >> 32); \
11105 } else { \
11106 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
11107 }
11108
11109 #define RtlStoreUshort(Address,Value) \
11110 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
11111 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
11112 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
11113 } \
11114 else { \
11115 *((PUSHORT) (Address)) = (USHORT)Value; \
11116 }
11117
11118 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
11119 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
11120 { \
11121 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
11122 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
11123 } \
11124 else \
11125 { \
11126 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
11127 }
11128
11129 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
11130 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
11131 { \
11132 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
11133 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
11134 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
11135 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
11136 } \
11137 else \
11138 { \
11139 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
11140 }
11141
11142 #endif /* defined(_AMD64_) */
11143
11144 #ifdef _WIN64
11145 /* VOID
11146 * RtlStoreUlongPtr(
11147 * IN OUT PULONG_PTR Address,
11148 * IN ULONG_PTR Value);
11149 */
11150 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlonglong(Address,Value)
11151 #else
11152 #define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value)
11153 #endif /* _WIN64 */
11154
11155 _Success_(return!=FALSE)
11156 _Must_inspect_result_
11157 NTSYSAPI
11158 BOOLEAN
11159 NTAPI
11160 RtlTimeFieldsToTime(
11161 _In_ PTIME_FIELDS TimeFields,
11162 _Out_ PLARGE_INTEGER Time);
11163
11164 NTSYSAPI
11165 VOID
11166 NTAPI
11167 RtlTimeToTimeFields(
11168 _In_ PLARGE_INTEGER Time,
11169 _Out_ PTIME_FIELDS TimeFields);
11170
11171 NTSYSAPI
11172 ULONG
11173 FASTCALL
11174 RtlUlongByteSwap(
11175 _In_ ULONG Source);
11176
11177 NTSYSAPI
11178 ULONGLONG
11179 FASTCALL
11180 RtlUlonglongByteSwap(
11181 _In_ ULONGLONG Source);
11182
11183 _When_(AllocateDestinationString,
11184 _At_(DestinationString->MaximumLength,
11185 _Out_range_(<=, (SourceString->MaximumLength / sizeof(WCHAR)))))
11186 _When_(!AllocateDestinationString,
11187 _At_(DestinationString->Buffer, _Const_)
11188 _At_(DestinationString->MaximumLength, _Const_))
11189 _IRQL_requires_max_(PASSIVE_LEVEL)
11190 _When_(AllocateDestinationString, _Must_inspect_result_)
11191 NTSYSAPI
11192 NTSTATUS
11193 NTAPI
11194 RtlUnicodeStringToAnsiString(
11195 _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem)))
11196 _When_(!AllocateDestinationString, _Inout_)
11197 PANSI_STRING DestinationString,
11198 _In_ PCUNICODE_STRING SourceString,
11199 _In_ BOOLEAN AllocateDestinationString);
11200
11201 _IRQL_requires_max_(PASSIVE_LEVEL)
11202 NTSYSAPI
11203 ULONG
11204 NTAPI
11205 RtlxUnicodeStringToAnsiSize(
11206 _In_ PCUNICODE_STRING UnicodeString);
11207
11208 #define RtlUnicodeStringToAnsiSize(String) ( \
11209 NLS_MB_CODE_PAGE_TAG ? \
11210 RtlxUnicodeStringToAnsiSize(String) : \
11211 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
11212 )
11213
11214 _IRQL_requires_max_(PASSIVE_LEVEL)
11215 NTSYSAPI
11216 NTSTATUS
11217 NTAPI
11218 RtlUnicodeStringToInteger(
11219 _In_ PCUNICODE_STRING String,
11220 _In_opt_ ULONG Base,
11221 _Out_ PULONG Value);
11222
11223 _IRQL_requires_max_(PASSIVE_LEVEL)
11224 NTSYSAPI
11225 WCHAR
11226 NTAPI
11227 RtlUpcaseUnicodeChar(
11228 _In_ WCHAR SourceCharacter);
11229
11230 NTSYSAPI
11231 USHORT
11232 FASTCALL
11233 RtlUshortByteSwap(
11234 _In_ USHORT Source);
11235
11236 _IRQL_requires_max_(APC_LEVEL)
11237 _Must_inspect_result_
11238 NTSYSAPI
11239 BOOLEAN
11240 NTAPI
11241 RtlValidRelativeSecurityDescriptor(
11242 _In_reads_bytes_(SecurityDescriptorLength) PSECURITY_DESCRIPTOR SecurityDescriptorInput,
11243 _In_ ULONG SecurityDescriptorLength,
11244 _In_ SECURITY_INFORMATION RequiredInformation);
11245
11246 _IRQL_requires_max_(APC_LEVEL)
11247 _Must_inspect_result_
11248 NTSYSAPI
11249 BOOLEAN
11250 NTAPI
11251 RtlValidSecurityDescriptor(
11252 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor);
11253
11254 _IRQL_requires_max_(PASSIVE_LEVEL)
11255 NTSYSAPI
11256 NTSTATUS
11257 NTAPI
11258 RtlGetVersion(
11259 _Out_
11260 _At_(lpVersionInformation->dwOSVersionInfoSize, _Pre_ _Valid_)
11261 _When_(lpVersionInformation->dwOSVersionInfoSize == sizeof(RTL_OSVERSIONINFOEXW),
11262 _At_((PRTL_OSVERSIONINFOEXW)lpVersionInformation, _Out_))
11263 PRTL_OSVERSIONINFOW lpVersionInformation);
11264
11265 _IRQL_requires_max_(PASSIVE_LEVEL)
11266 _Must_inspect_result_
11267 NTSYSAPI
11268 NTSTATUS
11269 NTAPI
11270 RtlVerifyVersionInfo(
11271 _In_ PRTL_OSVERSIONINFOEXW VersionInfo,
11272 _In_ ULONG TypeMask,
11273 _In_ ULONGLONG ConditionMask);
11274
11275 _IRQL_requires_max_(PASSIVE_LEVEL)
11276 NTSYSAPI
11277 NTSTATUS
11278 NTAPI
11279 RtlWriteRegistryValue(
11280 _In_ ULONG RelativeTo,
11281 _In_ PCWSTR Path,
11282 _In_z_ PCWSTR ValueName,
11283 _In_ ULONG ValueType,
11284 _In_reads_bytes_opt_(ValueLength) PVOID ValueData,
11285 _In_ ULONG ValueLength);
11286
11287
11288 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
11289
11290
11291 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
11292 NTSYSAPI
11293 VOID
11294 FASTCALL
11295 RtlPrefetchMemoryNonTemporal(
11296 _In_ PVOID Source,
11297 _In_ SIZE_T Length);
11298 #endif
11299
11300
11301 #if (NTDDI_VERSION >= NTDDI_WINXP)
11302
11303
11304 NTSYSAPI
11305 VOID
11306 NTAPI
11307 RtlClearBit(
11308 _In_ PRTL_BITMAP BitMapHeader,
11309 _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber);
11310
11311 _IRQL_requires_max_(PASSIVE_LEVEL)
11312 NTSYSAPI
11313 WCHAR
11314 NTAPI
11315 RtlDowncaseUnicodeChar(
11316 _In_ WCHAR SourceCharacter);
11317
11318 NTSYSAPI
11319 VOID
11320 NTAPI
11321 RtlSetBit(
11322 _In_ PRTL_BITMAP BitMapHeader,
11323 _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber);
11324
11325 _Must_inspect_result_
11326 NTSYSAPI
11327 BOOLEAN
11328 NTAPI
11329 RtlTestBit(
11330 _In_ PRTL_BITMAP BitMapHeader,
11331 _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber);
11332
11333 _IRQL_requires_max_(PASSIVE_LEVEL)
11334 NTSYSAPI
11335 NTSTATUS
11336 NTAPI
11337 RtlHashUnicodeString(
11338 _In_ CONST UNICODE_STRING *String,
11339 _In_ BOOLEAN CaseInSensitive,
11340 _In_ ULONG HashAlgorithm,
11341 _Out_ PULONG HashValue);
11342
11343
11344
11345 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
11346
11347
11348 #if (NTDDI_VERSION >= NTDDI_VISTA)
11349
11350 NTSYSAPI
11351 ULONG
11352 NTAPI
11353 RtlNumberOfSetBitsUlongPtr(
11354 _In_ ULONG_PTR Target);
11355
11356 NTSYSAPI
11357 ULONGLONG
11358 NTAPI
11359 RtlIoDecodeMemIoResource(
11360 _In_ struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
11361 _Out_opt_ PULONGLONG Alignment,
11362 _Out_opt_ PULONGLONG MinimumAddress,
11363 _Out_opt_ PULONGLONG MaximumAddress);
11364
11365 NTSYSAPI
11366 NTSTATUS
11367 NTAPI
11368 RtlIoEncodeMemIoResource(
11369 _In_ struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
11370 _In_ UCHAR Type,
11371 _In_ ULONGLONG Length,
11372 _In_ ULONGLONG Alignment,
11373 _In_ ULONGLONG MinimumAddress,
11374 _In_ ULONGLONG MaximumAddress);
11375
11376 NTSYSAPI
11377 ULONGLONG
11378 NTAPI
11379 RtlCmDecodeMemIoResource(
11380 _In_ struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor,
11381 _Out_opt_ PULONGLONG Start);
11382
11383 NTSYSAPI
11384 NTSTATUS
11385 NTAPI
11386 RtlFindClosestEncodableLength(
11387 _In_ ULONGLONG SourceLength,
11388 _Out_ PULONGLONG TargetLength);
11389
11390 NTSYSAPI
11391 NTSTATUS
11392 NTAPI
11393 RtlCmEncodeMemIoResource(
11394 _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor,
11395 _In_ UCHAR Type,
11396 _In_ ULONGLONG Length,
11397 _In_ ULONGLONG Start);
11398
11399
11400 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
11401
11402 #if (NTDDI_VERSION >= NTDDI_WIN7)
11403
11404 _IRQL_requires_max_(PASSIVE_LEVEL)
11405 _Must_inspect_result_
11406 NTSYSAPI
11407 NTSTATUS
11408 NTAPI
11409 RtlUnicodeToUTF8N(
11410 _Out_writes_bytes_to_(UTF8StringMaxByteCount, *UTF8StringActualByteCount)
11411 PCHAR UTF8StringDestination,
11412 _In_ ULONG UTF8StringMaxByteCount,
11413 _Out_ PULONG UTF8StringActualByteCount,
11414 _In_reads_bytes_(UnicodeStringByteCount) PCWCH UnicodeStringSource,
11415 _In_ ULONG UnicodeStringByteCount);
11416
11417 _IRQL_requires_max_(PASSIVE_LEVEL)
11418 _Must_inspect_result_
11419 NTSYSAPI
11420 NTSTATUS
11421 NTAPI
11422 RtlUTF8ToUnicodeN(
11423 _Out_writes_bytes_to_(UnicodeStringMaxByteCount, *UnicodeStringActualByteCount)
11424 PWSTR UnicodeStringDestination,
11425 _In_ ULONG UnicodeStringMaxByteCount,
11426 _Out_ PULONG UnicodeStringActualByteCount,
11427 _In_reads_bytes_(UTF8StringByteCount) PCCH UTF8StringSource,
11428 _In_ ULONG UTF8StringByteCount);
11429
11430 NTSYSAPI
11431 ULONG64
11432 NTAPI
11433 RtlGetEnabledExtendedFeatures(
11434 IN ULONG64 FeatureMask);
11435
11436
11437 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
11438
11439
11440 #if !defined(MIDL_PASS)
11441 /* inline funftions */
11442 //DECLSPEC_DEPRECATED_DDK_WINXP
11443 static __inline
11444 LARGE_INTEGER
11445 NTAPI_INLINE
11446 RtlConvertLongToLargeInteger(
11447 _In_ LONG SignedInteger)
11448 {
11449 LARGE_INTEGER ret;
11450 ret.QuadPart = SignedInteger;
11451 return ret;
11452 }
11453
11454 //DECLSPEC_DEPRECATED_DDK_WINXP
11455 static __inline
11456 LARGE_INTEGER
11457 NTAPI_INLINE
11458 RtlConvertUlongToLargeInteger(
11459 _In_ ULONG UnsignedInteger)
11460 {
11461 LARGE_INTEGER ret;
11462 ret.QuadPart = UnsignedInteger;
11463 return ret;
11464 }
11465
11466 //DECLSPEC_DEPRECATED_DDK_WINXP
11467 static __inline
11468 LARGE_INTEGER
11469 NTAPI_INLINE
11470 RtlLargeIntegerShiftLeft(
11471 _In_ LARGE_INTEGER LargeInteger,
11472 _In_ CCHAR ShiftCount)
11473 {
11474 LARGE_INTEGER Result;
11475
11476 Result.QuadPart = LargeInteger.QuadPart << ShiftCount;
11477 return Result;
11478 }
11479
11480 //DECLSPEC_DEPRECATED_DDK_WINXP
11481 static __inline
11482 LARGE_INTEGER
11483 NTAPI_INLINE
11484 RtlLargeIntegerShiftRight(
11485 _In_ LARGE_INTEGER LargeInteger,
11486 _In_ CCHAR ShiftCount)
11487 {
11488 LARGE_INTEGER Result;
11489
11490 Result.QuadPart = (ULONG64)LargeInteger.QuadPart >> ShiftCount;
11491 return Result;
11492 }
11493
11494 //DECLSPEC_DEPRECATED_DDK
11495 static __inline
11496 ULONG
11497 NTAPI_INLINE
11498 RtlEnlargedUnsignedDivide(
11499 _In_ ULARGE_INTEGER Dividend,
11500 _In_ ULONG Divisor,
11501 _Out_opt_ PULONG Remainder)
11502 {
11503 if (Remainder)
11504 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
11505 return (ULONG)(Dividend.QuadPart / Divisor);
11506 }
11507
11508 //DECLSPEC_DEPRECATED_DDK
11509 static __inline
11510 LARGE_INTEGER
11511 NTAPI_INLINE
11512 RtlLargeIntegerNegate(
11513 _In_ LARGE_INTEGER Subtrahend)
11514 {
11515 LARGE_INTEGER Difference;
11516
11517 Difference.QuadPart = -Subtrahend.QuadPart;
11518 return Difference;
11519 }
11520
11521 //DECLSPEC_DEPRECATED_DDK
11522 static __inline
11523 LARGE_INTEGER
11524 NTAPI_INLINE
11525 RtlLargeIntegerSubtract(
11526 _In_ LARGE_INTEGER Minuend,
11527 _In_ LARGE_INTEGER Subtrahend)
11528 {
11529 LARGE_INTEGER Difference;
11530
11531 Difference.QuadPart = Minuend.QuadPart - Subtrahend.QuadPart;
11532 return Difference;
11533 }
11534
11535 //DECLSPEC_DEPRECATED_DDK
11536 static __inline
11537 LARGE_INTEGER
11538 NTAPI_INLINE
11539 RtlEnlargedUnsignedMultiply(
11540 _In_ ULONG Multiplicand,
11541 _In_ ULONG Multiplier)
11542 {
11543 LARGE_INTEGER ret;
11544 ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
11545 return ret;
11546 }
11547
11548 //DECLSPEC_DEPRECATED_DDK
11549 static __inline
11550 LARGE_INTEGER
11551 NTAPI_INLINE
11552 RtlEnlargedIntegerMultiply(
11553 _In_ LONG Multiplicand,
11554 _In_ LONG Multiplier)
11555 {
11556 LARGE_INTEGER ret;
11557 ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
11558 return ret;
11559 }
11560
11561 _At_(AnsiString->Buffer, _Post_equal_to_(Buffer))
11562 _At_(AnsiString->Length, _Post_equal_to_(0))
11563 _At_(AnsiString->MaximumLength, _Post_equal_to_(BufferSize))
11564 FORCEINLINE
11565 VOID
11566 RtlInitEmptyAnsiString(
11567 _Out_ PANSI_STRING AnsiString,
11568 _Pre_maybenull_ _Pre_readable_size_(BufferSize) __drv_aliasesMem PCHAR Buffer,
11569 _In_ USHORT BufferSize)
11570 {
11571 AnsiString->Length = 0;
11572 AnsiString->MaximumLength = BufferSize;
11573 AnsiString->Buffer = Buffer;
11574 }
11575
11576 _At_(UnicodeString->Buffer, _Post_equal_to_(Buffer))
11577 _At_(UnicodeString->Length, _Post_equal_to_(0))
11578 _At_(UnicodeString->MaximumLength, _Post_equal_to_(BufferSize))
11579 FORCEINLINE
11580 VOID
11581 RtlInitEmptyUnicodeString(
11582 _Out_ PUNICODE_STRING UnicodeString,
11583 _Writable_bytes_(BufferSize)
11584 _When_(BufferSize != 0, _Notnull_)
11585 __drv_aliasesMem PWSTR Buffer,
11586 _In_ USHORT BufferSize)
11587 {
11588 UnicodeString->Length = 0;
11589 UnicodeString->MaximumLength = BufferSize;
11590 UnicodeString->Buffer = Buffer;
11591 }
11592
11593 #if defined(_AMD64_) || defined(_IA64_)
11594
11595
11596 static __inline
11597 LARGE_INTEGER
11598 NTAPI_INLINE
11599 RtlExtendedIntegerMultiply(
11600 _In_ LARGE_INTEGER Multiplicand,
11601 _In_ LONG Multiplier)
11602 {
11603 LARGE_INTEGER ret;
11604 ret.QuadPart = Multiplicand.QuadPart * Multiplier;
11605 return ret;
11606 }
11607
11608 static __inline
11609 LARGE_INTEGER
11610 NTAPI_INLINE
11611 RtlExtendedLargeIntegerDivide(
11612 _In_ LARGE_INTEGER Dividend,
11613 _In_ ULONG Divisor,
11614 _Out_opt_ PULONG Remainder)
11615 {
11616 LARGE_INTEGER ret;
11617 ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
11618 if (Remainder)
11619 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
11620 return ret;
11621 }
11622
11623
11624
11625 #endif /* defined(_AMD64_) || defined(_IA64_) */
11626
11627
11628 #if defined(_AMD64_)
11629
11630 #define MultiplyHigh __mulh
11631 #define UnsignedMultiplyHigh __umulh
11632
11633 //DECLSPEC_DEPRECATED_DDK
11634 static __inline
11635 LARGE_INTEGER
11636 NTAPI_INLINE
11637 RtlExtendedMagicDivide(
11638 _In_ LARGE_INTEGER Dividend,
11639 _In_ LARGE_INTEGER MagicDivisor,
11640 _In_ CCHAR ShiftCount)
11641 {
11642 LARGE_INTEGER ret;
11643 ULONG64 ret64;
11644 BOOLEAN Pos;
11645 Pos = (Dividend.QuadPart >= 0);
11646 ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,
11647 MagicDivisor.QuadPart);
11648 ret64 >>= ShiftCount;
11649 ret.QuadPart = Pos ? ret64 : -(LONG64)ret64;
11650 return ret;
11651 }
11652 #endif
11653
11654 //DECLSPEC_DEPRECATED_DDK
11655 static __inline
11656 LARGE_INTEGER
11657 NTAPI_INLINE
11658 RtlLargeIntegerAdd(
11659 _In_ LARGE_INTEGER Addend1,
11660 _In_ LARGE_INTEGER Addend2)
11661 {
11662 LARGE_INTEGER ret;
11663 ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
11664 return ret;
11665 }
11666
11667 /* VOID
11668 * RtlLargeIntegerAnd(
11669 * IN OUT LARGE_INTEGER Result,
11670 * IN LARGE_INTEGER Source,
11671 * IN LARGE_INTEGER Mask);
11672 */
11673 #define RtlLargeIntegerAnd(Result, Source, Mask) \
11674 Result.QuadPart = Source.QuadPart & Mask.QuadPart
11675
11676 //DECLSPEC_DEPRECATED_DDK
11677 static __inline
11678 LARGE_INTEGER
11679 NTAPI_INLINE
11680 RtlLargeIntegerArithmeticShift(
11681 _In_ LARGE_INTEGER LargeInteger,
11682 _In_ CCHAR ShiftCount)
11683 {
11684 LARGE_INTEGER ret;
11685 ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;
11686 return ret;
11687 }
11688
11689 /* BOOLEAN
11690 * RtlLargeIntegerEqualTo(
11691 * IN LARGE_INTEGER Operand1,
11692 * IN LARGE_INTEGER Operand2);
11693 */
11694 #define RtlLargeIntegerEqualTo(X,Y) \
11695 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
11696
11697 FORCEINLINE
11698 PVOID
11699 RtlSecureZeroMemory(
11700 _Out_writes_bytes_all_(Size) PVOID Pointer,
11701 _In_ SIZE_T Size)
11702 {
11703 volatile char* vptr = (volatile char*)Pointer;
11704 #if defined(_M_AMD64)
11705 __stosb((PUCHAR)vptr, 0, Size);
11706 #else
11707 char * endptr = (char *)vptr + Size;
11708 while (vptr < endptr) {
11709 *vptr = 0; vptr++;
11710 }
11711 #endif
11712 return Pointer;
11713 }
11714
11715 #if defined(_M_AMD64)
11716 _Must_inspect_result_
11717 FORCEINLINE
11718 BOOLEAN
11719 RtlCheckBit(
11720 _In_ PRTL_BITMAP BitMapHeader,
11721 _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitPosition)
11722 {
11723 return BitTest64((LONG64 CONST*)BitMapHeader->Buffer, (LONG64)BitPosition);
11724 }
11725 #else
11726 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
11727 #endif /* defined(_M_AMD64) */
11728
11729 #define RtlLargeIntegerGreaterThan(X,Y) ( \
11730 (((X).HighPart == (Y).HighPart) && ((X).LowPart > (Y).LowPart)) || \
11731 ((X).HighPart > (Y).HighPart) \
11732 )
11733
11734 #define RtlLargeIntegerGreaterThanOrEqualTo(X,Y) ( \
11735 (((X).HighPart == (Y).HighPart) && ((X).LowPart >= (Y).LowPart)) || \
11736 ((X).HighPart > (Y).HighPart) \
11737 )
11738
11739 #define RtlLargeIntegerNotEqualTo(X,Y) ( \
11740 (((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \
11741 )
11742
11743 #define RtlLargeIntegerLessThan(X,Y) ( \
11744 (((X).HighPart == (Y).HighPart) && ((X).LowPart < (Y).LowPart)) || \
11745 ((X).HighPart < (Y).HighPart) \
11746 )
11747
11748 #define RtlLargeIntegerLessThanOrEqualTo(X,Y) ( \
11749 (((X).HighPart == (Y).HighPart) && ((X).LowPart <= (Y).LowPart)) || \
11750 ((X).HighPart < (Y).HighPart) \
11751 )
11752
11753 #define RtlLargeIntegerGreaterThanZero(X) ( \
11754 (((X).HighPart == 0) && ((X).LowPart > 0)) || \
11755 ((X).HighPart > 0 ) \
11756 )
11757
11758 #define RtlLargeIntegerGreaterOrEqualToZero(X) ( (X).HighPart >= 0 )
11759
11760 #define RtlLargeIntegerEqualToZero(X) ( !((X).LowPart | (X).HighPart) )
11761
11762 #define RtlLargeIntegerNotEqualToZero(X) ( ((X).LowPart | (X).HighPart) )
11763
11764 #define RtlLargeIntegerLessThanZero(X) ( ((X).HighPart < 0) )
11765
11766 #define RtlLargeIntegerLessOrEqualToZero(X) ( ((X).HighPart < 0) || !((X).LowPart | (X).HighPart) )
11767
11768 #endif /* !defined(MIDL_PASS) */
11769
11770 /* Byte Swap Functions */
11771 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
11772 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
11773 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
11774
11775 #if DBG
11776
11777 #define RTL_VERIFY(exp) \
11778 ((!(exp)) ? \
11779 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
11780
11781 #define RTL_VERIFYMSG(msg, exp) \
11782 ((!(exp)) ? \
11783 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, (PCHAR)msg ), FALSE : TRUE)
11784
11785 #define RTL_SOFT_VERIFY(exp) \
11786 ((!(exp)) ? \
11787 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
11788
11789 #define RTL_SOFT_VERIFYMSG(msg, exp) \
11790 ((!(exp)) ? \
11791 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
11792
11793 /* The ASSERTs must be cast to void to avoid warnings about unused results.
11794 * We also cannot invoke the VERIFY versions because the indirection messes
11795 * with stringify. */
11796 #define ASSERT(exp) \
11797 ((VOID)((!(exp)) ? \
11798 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE))
11799
11800 #define ASSERTMSG(msg, exp) \
11801 ((VOID)((!(exp)) ? \
11802 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, (PCHAR)msg ), FALSE : TRUE))
11803
11804 #define RTL_SOFT_ASSERT(exp) \
11805 ((VOID)((!(exp)) ? \
11806 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE))
11807
11808 #define RTL_SOFT_ASSERTMSG(msg, exp) \
11809 ((VOID)((!(exp)) ? \
11810 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE))
11811
11812 #if defined(_MSC_VER)
11813 # define __assert_annotationA(msg) __annotation(L"Debug", L"AssertFail", L ## msg)
11814 # define __assert_annotationW(msg) __annotation(L"Debug", L"AssertFail", msg)
11815 #else
11816 # define __assert_annotationA(msg) \
11817 DbgPrint("Assertion failed at %s(%d): %s\n", __FILE__, __LINE__, msg)
11818 # define __assert_annotationW(msg) \
11819 DbgPrint("Assertion failed at %s(%d): %S\n", __FILE__, __LINE__, msg)
11820 #endif
11821
11822 #ifdef _PREFAST_
11823 #define __analysis_unreachable() __assume(0)
11824 #else
11825 #define __analysis_unreachable() ((void)0)
11826 #endif
11827
11828 #define NT_VERIFY(exp) \
11829 ((!(exp)) ? \
11830 (__assert_annotationA(#exp), \
11831 DbgRaiseAssertionFailure(), FALSE) : TRUE)
11832
11833 #define NT_VERIFYMSG(msg, exp) \
11834 ((!(exp)) ? \
11835 (__assert_annotationA(msg), \
11836 DbgRaiseAssertionFailure(), FALSE) : TRUE)
11837
11838 #define NT_VERIFYMSGW(msg, exp) \
11839 ((!(exp)) ? \
11840 (__assert_annotationW(msg), \
11841 DbgRaiseAssertionFailure(), FALSE) : TRUE)
11842
11843 /* Can't reuse verify, see above */
11844 #define NT_ASSERT(exp) \
11845 ((VOID)((!(exp)) ? \
11846 (__assert_annotationA(#exp), \
11847 DbgRaiseAssertionFailure(), __analysis_unreachable(), FALSE) : TRUE))
11848
11849 #define NT_ASSERTMSG(msg, exp) \
11850 ((VOID)((!(exp)) ? \
11851 (__assert_annotationA(msg), \
11852 DbgRaiseAssertionFailure(), __analysis_unreachable(), FALSE) : TRUE))
11853
11854 #define NT_ASSERTMSGW(msg, exp) \
11855 ((VOID)((!(exp)) ? \
11856 (__assert_annotationW(msg), \
11857 DbgRaiseAssertionFailure(), __analysis_unreachable(), FALSE) : TRUE))
11858
11859 #else /* !DBG */
11860
11861 #define ASSERT(exp) ((VOID) 0)
11862 #define ASSERTMSG(msg, exp) ((VOID) 0)
11863
11864 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
11865 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
11866
11867 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
11868 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
11869
11870 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
11871 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
11872
11873 #define NT_ASSERT(exp) ((VOID)0)
11874 #define NT_ASSERTMSG(msg, exp) ((VOID)0)
11875 #define NT_ASSERTMSGW(msg, exp) ((VOID)0)
11876
11877 #define NT_VERIFY(_exp) ((_exp) ? TRUE : FALSE)
11878 #define NT_VERIFYMSG(_msg, _exp ) ((_exp) ? TRUE : FALSE)
11879 #define NT_VERIFYMSGW(_msg, _exp) ((_exp) ? TRUE : FALSE)
11880
11881 #endif /* DBG */
11882
11883 #define InitializeListHead32(ListHead) (\
11884 (ListHead)->Flink = (ListHead)->Blink = PtrToUlong((ListHead)))
11885
11886 #if !defined(_WINBASE_)
11887
11888 #if defined(_WIN64) && !defined(_NTSYSTEM_) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || !defined(_NTOSP_))
11889
11890 NTKERNELAPI
11891 VOID
11892 InitializeSListHead(
11893 _Out_ PSLIST_HEADER SListHead);
11894
11895 #else /* defined(_WIN64) && ... */
11896
11897 /* HACK */
11898 _IRQL_requires_max_(APC_LEVEL)
11899 NTKERNELAPI
11900 DECLSPEC_NORETURN
11901 VOID
11902 NTAPI
11903 ExRaiseStatus(
11904 _In_ NTSTATUS Status);
11905
11906 FORCEINLINE
11907 VOID
11908 InitializeSListHead(
11909 _Out_ PSLIST_HEADER SListHead)
11910 {
11911 #if defined(_WIN64)
11912 if (((ULONG_PTR)SListHead & 0xf) != 0) {
11913 ExRaiseStatus(STATUS_DATATYPE_MISALIGNMENT);
11914 }
11915 #if defined(_IA64_)
11916 SListHead->Region = (ULONG_PTR)SListHead & VRN_MASK;
11917 #else
11918 SListHead->Region = 0;
11919 #endif /* _IA64_ */
11920 #endif /* _WIN64 */
11921 SListHead->Alignment = 0;
11922 }
11923
11924 #endif /* defined(_WIN64) && ... */
11925
11926 #ifdef _X86_
11927
11928 NTKERNELAPI
11929 PSLIST_ENTRY
11930 FASTCALL
11931 InterlockedPushEntrySList(
11932 _Inout_ PSLIST_HEADER SListHead,
11933 _Inout_ __drv_aliasesMem PSLIST_ENTRY SListEntry);
11934
11935 NTKERNELAPI
11936 PSLIST_ENTRY
11937 FASTCALL
11938 InterlockedPopEntrySList(
11939 _Inout_ PSLIST_HEADER SListHead);
11940
11941 #define InterlockedFlushSList(SListHead) \
11942 ExInterlockedFlushSList(SListHead)
11943
11944 #else /* !_X86_ */
11945
11946 #define InterlockedPushEntrySList(SListHead, SListEntry) \
11947 ExpInterlockedPushEntrySList(SListHead, SListEntry)
11948
11949 #define InterlockedPopEntrySList(SListHead) \
11950 ExpInterlockedPopEntrySList(SListHead)
11951
11952 #define InterlockedFlushSList(SListHead) \
11953 ExpInterlockedFlushSList(SListHead)
11954
11955 #endif /* _X86_ */
11956
11957 #define QueryDepthSList(SListHead) \
11958 ExQueryDepthSList(SListHead)
11959
11960 #endif /* !defined(_WINBASE_) */
11961
11962 #define RTL_CONTEXT_EX_OFFSET(ContextEx, Chunk) ((ContextEx)->Chunk.Offset)
11963 #define RTL_CONTEXT_EX_LENGTH(ContextEx, Chunk) ((ContextEx)->Chunk.Length)
11964 #define RTL_CONTEXT_EX_CHUNK(Base, Layout, Chunk) \
11965 ((PVOID)((PCHAR)(Base) + RTL_CONTEXT_EX_OFFSET(Layout, Chunk)))
11966 #define RTL_CONTEXT_OFFSET(Context, Chunk) \
11967 RTL_CONTEXT_EX_OFFSET((PCONTEXT_EX)(Context + 1), Chunk)
11968 #define RTL_CONTEXT_LENGTH(Context, Chunk) \
11969 RTL_CONTEXT_EX_LENGTH((PCONTEXT_EX)(Context + 1), Chunk)
11970 #define RTL_CONTEXT_CHUNK(Context, Chunk) \
11971 RTL_CONTEXT_EX_CHUNK((PCONTEXT_EX)(Context + 1), \
11972 (PCONTEXT_EX)(Context + 1), \
11973 Chunk)
11974
11975 BOOLEAN
11976 RTLVERLIB_DDI(RtlIsNtDdiVersionAvailable)(
11977 _In_ ULONG Version);
11978
11979 BOOLEAN
11980 RTLVERLIB_DDI(RtlIsServicePackVersionInstalled)(
11981 _In_ ULONG Version);
11982
11983 #ifndef RtlIsNtDdiVersionAvailable
11984 #define RtlIsNtDdiVersionAvailable WdmlibRtlIsNtDdiVersionAvailable
11985 #endif
11986
11987 #ifndef RtlIsServicePackVersionInstalled
11988 #define RtlIsServicePackVersionInstalled WdmlibRtlIsServicePackVersionInstalled
11989 #endif
11990
11991 #define RtlInterlockedSetBits(Flags, Flag) \
11992 InterlockedOr((PLONG)(Flags), Flag)
11993
11994 #define RtlInterlockedAndBits(Flags, Flag) \
11995 InterlockedAnd((PLONG)(Flags), Flag)
11996
11997 #define RtlInterlockedClearBits(Flags, Flag) \
11998 RtlInterlockedAndBits(Flags, ~(Flag))
11999
12000 #define RtlInterlockedXorBits(Flags, Flag) \
12001 InterlockedXor(Flags, Flag)
12002
12003 #define RtlInterlockedSetBitsDiscardReturn(Flags, Flag) \
12004 (VOID) RtlInterlockedSetBits(Flags, Flag)
12005
12006 #define RtlInterlockedAndBitsDiscardReturn(Flags, Flag) \
12007 (VOID) RtlInterlockedAndBits(Flags, Flag)
12008
12009 #define RtlInterlockedClearBitsDiscardReturn(Flags, Flag) \
12010 RtlInterlockedAndBitsDiscardReturn(Flags, ~(Flag))
12011
12012
12013 /******************************************************************************
12014 * Memory manager Functions *
12015 ******************************************************************************/
12016 /* Alignment Macros */
12017 #define ALIGN_DOWN_BY(size, align) \
12018 ((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1))
12019
12020 #define ALIGN_UP_BY(size, align) \
12021 (ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align))
12022
12023 #define ALIGN_DOWN_POINTER_BY(ptr, align) \
12024 ((PVOID)ALIGN_DOWN_BY(ptr, align))
12025
12026 #define ALIGN_UP_POINTER_BY(ptr, align) \
12027 ((PVOID)ALIGN_UP_BY(ptr, align))
12028
12029 #define ALIGN_DOWN(size, type) \
12030 ALIGN_DOWN_BY(size, sizeof(type))
12031
12032 #define ALIGN_UP(size, type) \
12033 ALIGN_UP_BY(size, sizeof(type))
12034
12035 #define ALIGN_DOWN_POINTER(ptr, type) \
12036 ALIGN_DOWN_POINTER_BY(ptr, sizeof(type))
12037
12038 #define ALIGN_UP_POINTER(ptr, type) \
12039 ALIGN_UP_POINTER_BY(ptr, sizeof(type))
12040
12041 #ifndef FIELD_OFFSET
12042 #define FIELD_OFFSET(type, field) ((ULONG)&(((type *)0)->field))
12043 #endif
12044
12045 #ifndef FIELD_SIZE
12046 #define FIELD_SIZE(type, field) (sizeof(((type *)0)->field))
12047 #endif
12048
12049 #define POOL_TAGGING 1
12050
12051 #if DBG
12052 #define IF_DEBUG if (TRUE)
12053 #else
12054 #define IF_DEBUG if (FALSE)
12055 #endif /* DBG */
12056
12057 /* ULONG
12058 * BYTE_OFFSET(
12059 * _In_ PVOID Va)
12060 */
12061 #define BYTE_OFFSET(Va) \
12062 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
12063
12064 /* ULONG
12065 * BYTES_TO_PAGES(
12066 * _In_ ULONG Size)
12067 *
12068 * Note: This needs to be like this to avoid overflows!
12069 */
12070 #define BYTES_TO_PAGES(Size) \
12071 (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0))
12072
12073 /* PVOID
12074 * PAGE_ALIGN(
12075 * _In_ PVOID Va)
12076 */
12077 #define PAGE_ALIGN(Va) \
12078 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
12079
12080 /* ULONG_PTR
12081 * ROUND_TO_PAGES(
12082 * _In_ ULONG_PTR Size)
12083 */
12084 #define ROUND_TO_PAGES(Size) \
12085 (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
12086
12087 /* ULONG
12088 * ADDRESS_AND_SIZE_TO_SPAN_PAGES(
12089 * _In_ PVOID Va,
12090 * _In_ ULONG Size)
12091 */
12092 #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(_Va, _Size) \
12093 ((ULONG) ((((ULONG_PTR) (_Va) & (PAGE_SIZE - 1)) \
12094 + (_Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
12095
12096 #define COMPUTE_PAGES_SPANNED(Va, Size) \
12097 ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va,Size)
12098
12099 /*
12100 * ULONG
12101 * MmGetMdlByteCount(
12102 * _In_ PMDL Mdl)
12103 */
12104 #define MmGetMdlByteCount(_Mdl) \
12105 ((_Mdl)->ByteCount)
12106
12107 /*
12108 * ULONG
12109 * MmGetMdlByteOffset(
12110 * IN PMDL Mdl)
12111 */
12112 #define MmGetMdlByteOffset(_Mdl) \
12113 ((_Mdl)->ByteOffset)
12114
12115 #define MmGetMdlBaseVa(Mdl) ((Mdl)->StartVa)
12116
12117 /*
12118 * PPFN_NUMBER
12119 * MmGetMdlPfnArray(
12120 * _In_ PMDL Mdl)
12121 */
12122 #define MmGetMdlPfnArray(_Mdl) \
12123 ((PPFN_NUMBER) ((_Mdl) + 1))
12124
12125 /*
12126 * PVOID
12127 * MmGetMdlVirtualAddress(
12128 * _In_ PMDL Mdl)
12129 */
12130 #define MmGetMdlVirtualAddress(_Mdl) \
12131 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
12132
12133 #define MmGetProcedureAddress(Address) (Address)
12134 #define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
12135
12136 /* PVOID MmGetSystemAddressForMdl(
12137 * _In_ PMDL Mdl);
12138 */
12139 #define MmGetSystemAddressForMdl(Mdl) \
12140 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
12141 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
12142 ((Mdl)->MappedSystemVa) : \
12143 (MmMapLockedPages((Mdl), KernelMode)))
12144
12145 /* PVOID
12146 * MmGetSystemAddressForMdlSafe(
12147 * _In_ PMDL Mdl,
12148 * _In_ MM_PAGE_PRIORITY Priority)
12149 */
12150 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
12151 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
12152 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
12153 (_Mdl)->MappedSystemVa : \
12154 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
12155 KernelMode, MmCached, NULL, FALSE, (_Priority)))
12156
12157 /*
12158 * VOID
12159 * MmInitializeMdl(
12160 * _In_ PMDL MemoryDescriptorList,
12161 * _In_ PVOID BaseVa,
12162 * _In_ SIZE_T Length)
12163 */
12164 #define MmInitializeMdl(_MemoryDescriptorList, \
12165 _BaseVa, \
12166 _Length) \
12167 { \
12168 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
12169 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
12170 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
12171 (_MemoryDescriptorList)->MdlFlags = 0; \
12172 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
12173 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
12174 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
12175 }
12176
12177 /*
12178 * VOID
12179 * MmPrepareMdlForReuse(
12180 * _In_ PMDL Mdl)
12181 */
12182 #define MmPrepareMdlForReuse(_Mdl) \
12183 { \
12184 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
12185 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
12186 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
12187 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
12188 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
12189 } \
12190 }
12191
12192 #if (NTDDI_VERSION >= NTDDI_WIN2K)
12193 _Must_inspect_result_
12194 _IRQL_requires_max_(DISPATCH_LEVEL)
12195 _When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes))
12196 NTKERNELAPI
12197 PVOID
12198 NTAPI
12199 MmAllocateContiguousMemory(
12200 _In_ SIZE_T NumberOfBytes,
12201 _In_ PHYSICAL_ADDRESS HighestAcceptableAddress);
12202
12203 _Must_inspect_result_
12204 _IRQL_requires_max_(DISPATCH_LEVEL)
12205 _When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes))
12206 NTKERNELAPI
12207 PVOID
12208 NTAPI
12209 MmAllocateContiguousMemorySpecifyCache(
12210 _In_ SIZE_T NumberOfBytes,
12211 _In_ PHYSICAL_ADDRESS LowestAcceptableAddress,
12212 _In_ PHYSICAL_ADDRESS HighestAcceptableAddress,
12213 _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple,
12214 _In_ MEMORY_CACHING_TYPE CacheType);
12215
12216 _Must_inspect_result_
12217 _IRQL_requires_max_(DISPATCH_LEVEL)
12218 NTKERNELAPI
12219 PMDL
12220 NTAPI
12221 MmAllocatePagesForMdl(
12222 _In_ PHYSICAL_ADDRESS LowAddress,
12223 _In_ PHYSICAL_ADDRESS HighAddress,
12224 _In_ PHYSICAL_ADDRESS SkipBytes,
12225 _In_ SIZE_T TotalBytes);
12226
12227 _IRQL_requires_max_(DISPATCH_LEVEL)
12228 NTKERNELAPI
12229 VOID
12230 NTAPI
12231 MmBuildMdlForNonPagedPool(
12232 _Inout_ PMDL MemoryDescriptorList);
12233
12234 //DECLSPEC_DEPRECATED_DDK
12235 NTKERNELAPI
12236 PMDL
12237 NTAPI
12238 MmCreateMdl(
12239 _Out_writes_bytes_opt_ (sizeof (MDL) + (sizeof (PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES (Base, Length)))
12240 PMDL MemoryDescriptorList,
12241 _In_reads_bytes_opt_ (Length) PVOID Base,
12242 _In_ SIZE_T Length);
12243
12244 _IRQL_requires_max_(DISPATCH_LEVEL)
12245 NTKERNELAPI
12246 VOID
12247 NTAPI
12248 MmFreeContiguousMemory(
12249 _In_ PVOID BaseAddress);
12250
12251 _IRQL_requires_max_ (DISPATCH_LEVEL)
12252 NTKERNELAPI
12253 VOID
12254 NTAPI
12255 MmFreeContiguousMemorySpecifyCache(
12256 _In_reads_bytes_ (NumberOfBytes) PVOID BaseAddress,
12257 _In_ SIZE_T NumberOfBytes,
12258 _In_ MEMORY_CACHING_TYPE CacheType);
12259
12260 _IRQL_requires_max_(DISPATCH_LEVEL)
12261 NTKERNELAPI
12262 VOID
12263 NTAPI
12264 MmFreePagesFromMdl(
12265 _Inout_ PMDL MemoryDescriptorList);
12266
12267 _IRQL_requires_max_(PASSIVE_LEVEL)
12268 NTKERNELAPI
12269 PVOID
12270 NTAPI
12271 MmGetSystemRoutineAddress(
12272 _In_ PUNICODE_STRING SystemRoutineName);
12273
12274 NTKERNELAPI
12275 LOGICAL
12276 NTAPI
12277 MmIsDriverVerifying(
12278 _In_ struct _DRIVER_OBJECT *DriverObject);
12279
12280 _Must_inspect_result_
12281 _IRQL_requires_max_(APC_LEVEL)
12282 NTKERNELAPI
12283 PVOID
12284 NTAPI
12285 MmLockPagableDataSection(
12286 _In_ PVOID AddressWithinSection);
12287
12288 _Must_inspect_result_
12289 _IRQL_requires_max_(DISPATCH_LEVEL)
12290 _Out_writes_bytes_opt_ (NumberOfBytes)
12291 NTKERNELAPI
12292 PVOID
12293 NTAPI
12294 MmMapIoSpace(
12295 _In_ PHYSICAL_ADDRESS PhysicalAddress,
12296 _In_ SIZE_T NumberOfBytes,
12297 _In_ MEMORY_CACHING_TYPE CacheType);
12298
12299 _Must_inspect_result_
12300 _When_(AccessMode==KernelMode, _IRQL_requires_max_(DISPATCH_LEVEL))
12301 _When_(AccessMode==UserMode, _Maybe_raises_SEH_exception_ _IRQL_requires_max_(APC_LEVEL))
12302 NTKERNELAPI
12303 PVOID
12304 NTAPI
12305 MmMapLockedPages(
12306 _Inout_ PMDL MemoryDescriptorList,
12307 _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst)
12308 KPROCESSOR_MODE AccessMode);
12309
12310 _Post_writable_byte_size_(MemoryDescriptorList->ByteCount)
12311 _When_(AccessMode==KernelMode, _IRQL_requires_max_(DISPATCH_LEVEL))
12312 _When_(AccessMode==UserMode, _Maybe_raises_SEH_exception_ _IRQL_requires_max_(APC_LEVEL) _Post_notnull_)
12313 _At_(MemoryDescriptorList->MappedSystemVa, _Post_writable_byte_size_(MemoryDescriptorList->ByteCount))
12314 _Must_inspect_result_
12315 _Success_(return != NULL)
12316 NTKERNELAPI
12317 PVOID
12318 NTAPI
12319 MmMapLockedPagesSpecifyCache(
12320 _Inout_ PMDL MemoryDescriptorList,
12321 _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst)
12322 KPROCESSOR_MODE AccessMode,
12323 _In_ __drv_strictTypeMatch(__drv_typeCond) MEMORY_CACHING_TYPE CacheType,
12324 _In_opt_ PVOID BaseAddress,
12325 _In_ ULONG BugCheckOnFailure,
12326 _In_ MM_PAGE_PRIORITY Priority);
12327
12328 _IRQL_requires_max_(APC_LEVEL)
12329 NTKERNELAPI
12330 PVOID
12331 NTAPI
12332 MmPageEntireDriver(
12333 _In_ PVOID AddressWithinSection);
12334
12335 _IRQL_requires_max_(DISPATCH_LEVEL)
12336 _At_(MemoryDescriptorList->StartVa + MemoryDescriptorList->ByteOffset,
12337 _Field_size_bytes_opt_(MemoryDescriptorList->ByteCount))
12338 NTKERNELAPI
12339 VOID
12340 NTAPI
12341 MmProbeAndLockPages(
12342 _Inout_ PMDL MemoryDescriptorList,
12343 _In_ KPROCESSOR_MODE AccessMode,
12344 _In_ LOCK_OPERATION Operation);
12345
12346 NTKERNELAPI
12347 MM_SYSTEMSIZE
12348 NTAPI
12349 MmQuerySystemSize(VOID);
12350
12351 _IRQL_requires_max_(APC_LEVEL)
12352 NTKERNELAPI
12353 VOID
12354 NTAPI
12355 MmResetDriverPaging(
12356 _In_ PVOID AddressWithinSection);
12357
12358 NTKERNELAPI
12359 SIZE_T
12360 NTAPI
12361 MmSizeOfMdl(
12362 _In_reads_bytes_opt_ (Length) PVOID Base,
12363 _In_ SIZE_T Length);
12364
12365 _IRQL_requires_max_(DISPATCH_LEVEL)
12366 NTKERNELAPI
12367 VOID
12368 NTAPI
12369 MmUnlockPagableImageSection(
12370 _In_ PVOID ImageSectionHandle);
12371
12372 _IRQL_requires_max_(DISPATCH_LEVEL)
12373 NTKERNELAPI
12374 VOID
12375 NTAPI
12376 MmUnlockPages(
12377 _Inout_ PMDL MemoryDescriptorList);
12378
12379 _IRQL_requires_max_(DISPATCH_LEVEL)
12380 NTKERNELAPI
12381 VOID
12382 NTAPI
12383 MmUnmapIoSpace(
12384 _In_reads_bytes_ (NumberOfBytes) PVOID BaseAddress,
12385 _In_ SIZE_T NumberOfBytes);
12386
12387 _IRQL_requires_max_ (APC_LEVEL)
12388 NTKERNELAPI
12389 VOID
12390 NTAPI
12391 MmProbeAndLockProcessPages(
12392 _Inout_ PMDL MemoryDescriptorList,
12393 _In_ PEPROCESS Process,
12394 _In_ KPROCESSOR_MODE AccessMode,
12395 _In_ LOCK_OPERATION Operation);
12396
12397 _IRQL_requires_max_(DISPATCH_LEVEL)
12398 NTKERNELAPI
12399 VOID
12400 NTAPI
12401 MmUnmapLockedPages(
12402 _In_ PVOID BaseAddress,
12403 _Inout_ PMDL MemoryDescriptorList);
12404
12405 _Must_inspect_result_
12406 _IRQL_requires_max_(DISPATCH_LEVEL)
12407 _When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes))
12408 NTKERNELAPI
12409 PVOID
12410 NTAPI
12411 MmAllocateContiguousMemorySpecifyCacheNode(
12412 _In_ SIZE_T NumberOfBytes,
12413 _In_ PHYSICAL_ADDRESS LowestAcceptableAddress,
12414 _In_ PHYSICAL_ADDRESS HighestAcceptableAddress,
12415 _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple,
12416 _In_ MEMORY_CACHING_TYPE CacheType,
12417 _In_ NODE_REQUIREMENT PreferredNode);
12418
12419 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
12420
12421 #if (NTDDI_VERSION >= NTDDI_WINXP)
12422
12423 _IRQL_requires_max_(DISPATCH_LEVEL)
12424 NTKERNELAPI
12425 NTSTATUS
12426 NTAPI
12427 MmAdvanceMdl(
12428 _Inout_ PMDL Mdl,
12429 _In_ ULONG NumberOfBytes);
12430
12431 _Must_inspect_result_
12432 _IRQL_requires_max_(APC_LEVEL)
12433 _When_ (return != NULL, _Out_writes_bytes_opt_ (NumberOfBytes))
12434 NTKERNELAPI
12435 PVOID
12436 NTAPI
12437 MmAllocateMappingAddress(
12438 _In_ SIZE_T NumberOfBytes,
12439 _In_ ULONG PoolTag);
12440
12441 _IRQL_requires_max_(APC_LEVEL)
12442 NTKERNELAPI
12443 VOID
12444 NTAPI
12445 MmFreeMappingAddress(
12446 _In_ PVOID BaseAddress,
12447 _In_ ULONG PoolTag);
12448
12449 _IRQL_requires_max_ (APC_LEVEL)
12450 NTKERNELAPI
12451 NTSTATUS
12452 NTAPI
12453 MmIsVerifierEnabled(
12454 _Out_ PULONG VerifierFlags);
12455
12456 _Post_writable_byte_size_(MemoryDescriptorList->ByteCount)
12457 _IRQL_requires_max_(DISPATCH_LEVEL)
12458 _At_(MemoryDescriptorList->MappedSystemVa + MemoryDescriptorList->ByteOffset,
12459 _Post_writable_byte_size_(MemoryDescriptorList->ByteCount))
12460 _Must_inspect_result_
12461 _Success_(return != NULL)
12462 NTKERNELAPI
12463 PVOID
12464 NTAPI
12465 MmMapLockedPagesWithReservedMapping(
12466 _In_ PVOID MappingAddress,
12467 _In_ ULONG PoolTag,
12468 _Inout_ PMDL MemoryDescriptorList,
12469 _In_ __drv_strictTypeMatch(__drv_typeCond)
12470 MEMORY_CACHING_TYPE CacheType);
12471
12472 _Must_inspect_result_
12473 _IRQL_requires_max_(DISPATCH_LEVEL)
12474 NTKERNELAPI
12475 NTSTATUS
12476 NTAPI
12477 MmProtectMdlSystemAddress(
12478 _In_ PMDL MemoryDescriptorList,
12479 _In_ ULONG NewProtect);
12480
12481 _IRQL_requires_max_(DISPATCH_LEVEL)
12482 NTKERNELAPI
12483 VOID
12484 NTAPI
12485 MmUnmapReservedMapping(
12486 _In_ PVOID BaseAddress,
12487 _In_ ULONG PoolTag,
12488 _Inout_ PMDL MemoryDescriptorList);
12489
12490 _IRQL_requires_max_ (APC_LEVEL)
12491 NTKERNELAPI
12492 NTSTATUS
12493 NTAPI
12494 MmAddVerifierThunks(
12495 _In_reads_bytes_ (ThunkBufferSize) PVOID ThunkBuffer,
12496 _In_ ULONG ThunkBufferSize);
12497
12498 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
12499 #if (NTDDI_VERSION >= NTDDI_WS03)
12500 _IRQL_requires_max_ (DISPATCH_LEVEL)
12501 NTKERNELAPI
12502 LOGICAL
12503 NTAPI
12504 MmIsIoSpaceActive(
12505 _In_ PHYSICAL_ADDRESS StartAddress,
12506 _In_ SIZE_T NumberOfBytes);
12507
12508 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
12509 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
12510 _Must_inspect_result_
12511 _IRQL_requires_max_ (DISPATCH_LEVEL)
12512 NTKERNELAPI
12513 PMDL
12514 NTAPI
12515 MmAllocatePagesForMdlEx(
12516 _In_ PHYSICAL_ADDRESS LowAddress,
12517 _In_ PHYSICAL_ADDRESS HighAddress,
12518 _In_ PHYSICAL_ADDRESS SkipBytes,
12519 _In_ SIZE_T TotalBytes,
12520 _In_ MEMORY_CACHING_TYPE CacheType,
12521 _In_ ULONG Flags);
12522 #endif
12523
12524 #if (NTDDI_VERSION >= NTDDI_VISTA)
12525 _IRQL_requires_max_ (APC_LEVEL)
12526 NTKERNELAPI
12527 LOGICAL
12528 NTAPI
12529 MmIsDriverVerifyingByAddress(
12530 _In_ PVOID AddressWithinSection);
12531 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
12532
12533 /******************************************************************************
12534 * Security Manager Functions *
12535 ******************************************************************************/
12536
12537 #if (NTDDI_VERSION >= NTDDI_WIN2K)
12538 _IRQL_requires_max_(PASSIVE_LEVEL)
12539 NTKERNELAPI
12540 BOOLEAN
12541 NTAPI
12542 SeAccessCheck(
12543 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
12544 _In_ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
12545 _In_ BOOLEAN SubjectContextLocked,
12546 _In_ ACCESS_MASK DesiredAccess,
12547 _In_ ACCESS_MASK PreviouslyGrantedAccess,
12548 _Outptr_opt_ PPRIVILEGE_SET *Privileges,
12549 _In_ PGENERIC_MAPPING GenericMapping,
12550 _In_ KPROCESSOR_MODE AccessMode,
12551 _Out_ PACCESS_MASK GrantedAccess,
12552 _Out_ PNTSTATUS AccessStatus);
12553
12554 _IRQL_requires_max_(PASSIVE_LEVEL)
12555 NTKERNELAPI
12556 NTSTATUS
12557 NTAPI
12558 SeAssignSecurity(
12559 _In_opt_ PSECURITY_DESCRIPTOR ParentDescriptor,
12560 _In_opt_ PSECURITY_DESCRIPTOR ExplicitDescriptor,
12561 _Out_ PSECURITY_DESCRIPTOR *NewDescriptor,
12562 _In_ BOOLEAN IsDirectoryObject,
12563 _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext,
12564 _In_ PGENERIC_MAPPING GenericMapping,
12565 _In_ POOL_TYPE PoolType);
12566
12567 NTKERNELAPI
12568 NTSTATUS
12569 NTAPI
12570 SeAssignSecurityEx(
12571 _In_opt_ PSECURITY_DESCRIPTOR ParentDescriptor,
12572 _In_opt_ PSECURITY_DESCRIPTOR ExplicitDescriptor,
12573 _Out_ PSECURITY_DESCRIPTOR *NewDescriptor,
12574 _In_opt_ GUID *ObjectType,
12575 _In_ BOOLEAN IsDirectoryObject,
12576 _In_ ULONG AutoInheritFlags,
12577 _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext,
12578 _In_ PGENERIC_MAPPING GenericMapping,
12579 _In_ POOL_TYPE PoolType);
12580
12581 _IRQL_requires_max_(PASSIVE_LEVEL)
12582 NTKERNELAPI
12583 NTSTATUS
12584 NTAPI
12585 SeDeassignSecurity(
12586 _Inout_ PSECURITY_DESCRIPTOR *SecurityDescriptor);
12587
12588 _IRQL_requires_max_(PASSIVE_LEVEL)
12589 NTKERNELAPI
12590 BOOLEAN
12591 NTAPI
12592 SeValidSecurityDescriptor(
12593 _In_ ULONG Length,
12594 _In_reads_bytes_(Length) PSECURITY_DESCRIPTOR SecurityDescriptor);
12595
12596 NTKERNELAPI
12597 ULONG
12598 NTAPI
12599 SeObjectCreateSaclAccessBits(
12600 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor);
12601
12602 NTKERNELAPI
12603 VOID
12604 NTAPI
12605 SeReleaseSubjectContext(
12606 _Inout_ PSECURITY_SUBJECT_CONTEXT SubjectContext);
12607
12608 NTKERNELAPI
12609 VOID
12610 NTAPI
12611 SeUnlockSubjectContext(
12612 _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext);
12613
12614 NTKERNELAPI
12615 VOID
12616 NTAPI
12617 SeCaptureSubjectContext(
12618 _Out_ PSECURITY_SUBJECT_CONTEXT SubjectContext);
12619
12620 NTKERNELAPI
12621 VOID
12622 NTAPI
12623 SeLockSubjectContext(
12624 _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext);
12625
12626
12627 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
12628
12629 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
12630
12631 _At_(AuditParameters->ParameterCount, _Const_)
12632 NTSTATUS
12633 NTAPI
12634 SeSetAuditParameter(
12635 _Inout_ PSE_ADT_PARAMETER_ARRAY AuditParameters,
12636 _In_ SE_ADT_PARAMETER_TYPE Type,
12637 _In_range_(<,SE_MAX_AUDIT_PARAMETERS) ULONG Index,
12638 _In_reads_(_Inexpressible_("depends on SE_ADT_PARAMETER_TYPE"))
12639 PVOID Data);
12640
12641 NTSTATUS
12642 NTAPI
12643 SeReportSecurityEvent(
12644 _In_ ULONG Flags,
12645 _In_ PUNICODE_STRING SourceName,
12646 _In_opt_ PSID UserSid,
12647 _In_ PSE_ADT_PARAMETER_ARRAY AuditParameters);
12648
12649 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
12650
12651 #if (NTDDI_VERSION >= NTDDI_VISTA)
12652 NTKERNELAPI
12653 ULONG
12654 NTAPI
12655 SeComputeAutoInheritByObjectType(
12656 _In_ PVOID ObjectType,
12657 _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor,
12658 _In_opt_ PSECURITY_DESCRIPTOR ParentSecurityDescriptor);
12659
12660 #ifdef SE_NTFS_WORLD_CACHE
12661 VOID
12662 NTAPI
12663 SeGetWorldRights(
12664 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
12665 _In_ PGENERIC_MAPPING GenericMapping,
12666 _Out_ PACCESS_MASK GrantedAccess);
12667 #endif /* SE_NTFS_WORLD_CACHE */
12668 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
12669 /******************************************************************************
12670 * Configuration Manager Functions *
12671 ******************************************************************************/
12672
12673 #if (NTDDI_VERSION >= NTDDI_WINXP)
12674 _IRQL_requires_max_(APC_LEVEL)
12675 NTKERNELAPI
12676 NTSTATUS
12677 NTAPI
12678 CmRegisterCallback(
12679 _In_ PEX_CALLBACK_FUNCTION Function,
12680 _In_opt_ PVOID Context,
12681 _Out_ PLARGE_INTEGER Cookie);
12682
12683 _IRQL_requires_max_(APC_LEVEL)
12684 NTKERNELAPI
12685 NTSTATUS
12686 NTAPI
12687 CmUnRegisterCallback(
12688 _In_ LARGE_INTEGER Cookie);
12689 #endif
12690
12691 #if (NTDDI_VERSION >= NTDDI_VISTA)
12692
12693 _IRQL_requires_max_(APC_LEVEL)
12694 NTKERNELAPI
12695 NTSTATUS
12696 NTAPI
12697 CmRegisterCallbackEx(
12698 _In_ PEX_CALLBACK_FUNCTION Function,
12699 _In_ PCUNICODE_STRING Altitude,
12700 _In_ PVOID Driver,
12701 _In_opt_ PVOID Context,
12702 _Out_ PLARGE_INTEGER Cookie,
12703 _Reserved_ PVOID Reserved);
12704
12705 _IRQL_requires_max_(APC_LEVEL)
12706 NTKERNELAPI
12707 VOID
12708 NTAPI
12709 CmGetCallbackVersion(
12710 _Out_opt_ PULONG Major,
12711 _Out_opt_ PULONG Minor);
12712
12713 _IRQL_requires_max_(APC_LEVEL)
12714 NTKERNELAPI
12715 NTSTATUS
12716 NTAPI
12717 CmSetCallbackObjectContext(
12718 _Inout_ PVOID Object,
12719 _In_ PLARGE_INTEGER Cookie,
12720 _In_ PVOID NewContext,
12721 _Out_opt_ PVOID *OldContext);
12722
12723 _IRQL_requires_max_(APC_LEVEL)
12724 NTKERNELAPI
12725 NTSTATUS
12726 NTAPI
12727 CmCallbackGetKeyObjectID(
12728 _In_ PLARGE_INTEGER Cookie,
12729 _In_ PVOID Object,
12730 _Out_opt_ PULONG_PTR ObjectID,
12731 _Outptr_opt_ PCUNICODE_STRING *ObjectName);
12732
12733 _IRQL_requires_max_(APC_LEVEL)
12734 NTKERNELAPI
12735 PVOID
12736 NTAPI
12737 CmGetBoundTransaction(
12738 _In_ PLARGE_INTEGER Cookie,
12739 _In_ PVOID Object);
12740
12741 #endif // NTDDI_VERSION >= NTDDI_VISTA
12742
12743
12744 /******************************************************************************
12745 * I/O Manager Functions *
12746 ******************************************************************************/
12747
12748 /*
12749 * NTSTATUS
12750 * IoAcquireRemoveLock(
12751 * IN PIO_REMOVE_LOCK RemoveLock,
12752 * IN OPTIONAL PVOID Tag)
12753 */
12754 #if DBG
12755 #define IoAcquireRemoveLock(RemoveLock, Tag) \
12756 IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
12757 #else
12758 #define IoAcquireRemoveLock(RemoveLock, Tag) \
12759 IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
12760 #endif
12761
12762 /*
12763 * VOID
12764 * IoAdjustPagingPathCount(
12765 * IN PLONG Count,
12766 * IN BOOLEAN Increment)
12767 */
12768 #define IoAdjustPagingPathCount(_Count, \
12769 _Increment) \
12770 { \
12771 if (_Increment) \
12772 { \
12773 InterlockedIncrement(_Count); \
12774 } \
12775 else \
12776 { \
12777 InterlockedDecrement(_Count); \
12778 } \
12779 }
12780
12781 #if !defined(_M_AMD64)
12782 NTHALAPI
12783 VOID
12784 NTAPI
12785 READ_PORT_BUFFER_UCHAR(
12786 IN PUCHAR Port,
12787 IN PUCHAR Buffer,
12788 IN ULONG Count);
12789
12790 NTHALAPI
12791 VOID
12792 NTAPI
12793 READ_PORT_BUFFER_ULONG(
12794 IN PULONG Port,
12795 IN PULONG Buffer,
12796 IN ULONG Count);
12797
12798 NTHALAPI
12799 VOID
12800 NTAPI
12801 READ_PORT_BUFFER_USHORT(
12802 IN PUSHORT Port,
12803 IN PUSHORT Buffer,
12804 IN ULONG Count);
12805
12806 NTHALAPI
12807 UCHAR
12808 NTAPI
12809 READ_PORT_UCHAR(
12810 IN PUCHAR Port);
12811
12812 NTHALAPI
12813 ULONG
12814 NTAPI
12815 READ_PORT_ULONG(
12816 IN PULONG Port);
12817
12818 NTHALAPI
12819 USHORT
12820 NTAPI
12821 READ_PORT_USHORT(
12822 IN PUSHORT Port);
12823
12824 NTKERNELAPI
12825 VOID
12826 NTAPI
12827 READ_REGISTER_BUFFER_UCHAR(
12828 IN PUCHAR Register,
12829 IN PUCHAR Buffer,
12830 IN ULONG Count);
12831
12832 NTKERNELAPI
12833 VOID
12834 NTAPI
12835 READ_REGISTER_BUFFER_ULONG(
12836 IN PULONG Register,
12837 IN PULONG Buffer,
12838 IN ULONG Count);
12839
12840 NTKERNELAPI
12841 VOID
12842 NTAPI
12843 READ_REGISTER_BUFFER_USHORT(
12844 IN PUSHORT Register,
12845 IN PUSHORT Buffer,
12846 IN ULONG Count);
12847
12848 NTKERNELAPI
12849 UCHAR
12850 NTAPI
12851 READ_REGISTER_UCHAR(
12852 IN PUCHAR Register);
12853
12854 NTKERNELAPI
12855 ULONG
12856 NTAPI
12857 READ_REGISTER_ULONG(
12858 IN PULONG Register);
12859
12860 NTKERNELAPI
12861 USHORT
12862 NTAPI
12863 READ_REGISTER_USHORT(
12864 IN PUSHORT Register);
12865
12866 NTHALAPI
12867 VOID
12868 NTAPI
12869 WRITE_PORT_BUFFER_UCHAR(
12870 IN PUCHAR Port,
12871 IN PUCHAR Buffer,
12872 IN ULONG Count);
12873
12874 NTHALAPI
12875 VOID
12876 NTAPI
12877 WRITE_PORT_BUFFER_ULONG(
12878 IN PULONG Port,
12879 IN PULONG Buffer,
12880 IN ULONG Count);
12881
12882 NTHALAPI
12883 VOID
12884 NTAPI
12885 WRITE_PORT_BUFFER_USHORT(
12886 IN PUSHORT Port,
12887 IN PUSHORT Buffer,
12888 IN ULONG Count);
12889
12890 NTHALAPI
12891 VOID
12892 NTAPI
12893 WRITE_PORT_UCHAR(
12894 IN PUCHAR Port,
12895 IN UCHAR Value);
12896
12897 NTHALAPI
12898 VOID
12899 NTAPI
12900 WRITE_PORT_ULONG(
12901 IN PULONG Port,
12902 IN ULONG Value);
12903
12904 NTHALAPI
12905 VOID
12906 NTAPI
12907 WRITE_PORT_USHORT(
12908 IN PUSHORT Port,
12909 IN USHORT Value);
12910
12911 NTKERNELAPI
12912 VOID
12913 NTAPI
12914 WRITE_REGISTER_BUFFER_UCHAR(
12915 IN PUCHAR Register,
12916 IN PUCHAR Buffer,
12917 IN ULONG Count);
12918
12919 NTKERNELAPI
12920 VOID
12921 NTAPI
12922 WRITE_REGISTER_BUFFER_ULONG(
12923 IN PULONG Register,
12924 IN PULONG Buffer,
12925 IN ULONG Count);
12926
12927 NTKERNELAPI
12928 VOID
12929 NTAPI
12930 WRITE_REGISTER_BUFFER_USHORT(
12931 IN PUSHORT Register,
12932 IN PUSHORT Buffer,
12933 IN ULONG Count);
12934
12935 NTKERNELAPI
12936 VOID
12937 NTAPI
12938 WRITE_REGISTER_UCHAR(
12939 IN PUCHAR Register,
12940 IN UCHAR Value);
12941
12942 NTKERNELAPI
12943 VOID
12944 NTAPI
12945 WRITE_REGISTER_ULONG(
12946 IN PULONG Register,
12947 IN ULONG Value);
12948
12949 NTKERNELAPI
12950 VOID
12951 NTAPI
12952 WRITE_REGISTER_USHORT(
12953 IN PUSHORT Register,
12954 IN USHORT Value);
12955
12956 #else
12957
12958 FORCEINLINE
12959 VOID
12960 READ_PORT_BUFFER_UCHAR(
12961 IN PUCHAR Port,
12962 IN PUCHAR Buffer,
12963 IN ULONG Count)
12964 {
12965 __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
12966 }
12967
12968 FORCEINLINE
12969 VOID
12970 READ_PORT_BUFFER_ULONG(
12971 IN PULONG Port,
12972 IN PULONG Buffer,
12973 IN ULONG Count)
12974 {
12975 __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
12976 }
12977
12978 FORCEINLINE
12979 VOID
12980 READ_PORT_BUFFER_USHORT(
12981 IN PUSHORT Port,
12982 IN PUSHORT Buffer,
12983 IN ULONG Count)
12984 {
12985 __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
12986 }
12987
12988 FORCEINLINE
12989 UCHAR
12990 READ_PORT_UCHAR(
12991 IN PUCHAR Port)
12992 {
12993 return __inbyte((USHORT)(ULONG_PTR)Port);
12994 }
12995
12996 FORCEINLINE
12997 ULONG
12998 READ_PORT_ULONG(
12999 IN PULONG Port)
13000 {
13001 return __indword((USHORT)(ULONG_PTR)Port);
13002 }
13003
13004 FORCEINLINE
13005 USHORT
13006 READ_PORT_USHORT(
13007 IN PUSHORT Port)
13008 {
13009 return __inword((USHORT)(ULONG_PTR)Port);
13010 }
13011
13012 FORCEINLINE
13013 VOID
13014 READ_REGISTER_BUFFER_UCHAR(
13015 IN PUCHAR Register,
13016 IN PUCHAR Buffer,
13017 IN ULONG Count)
13018 {
13019 __movsb(Register, Buffer, Count);
13020 }
13021
13022 FORCEINLINE
13023 VOID
13024 READ_REGISTER_BUFFER_ULONG(
13025 IN PULONG Register,
13026 IN PULONG Buffer,
13027 IN ULONG Count)
13028 {
13029 __movsd(Register, Buffer, Count);
13030 }
13031
13032 FORCEINLINE
13033 VOID
13034 READ_REGISTER_BUFFER_USHORT(
13035 IN PUSHORT Register,
13036 IN PUSHORT Buffer,
13037 IN ULONG Count)
13038 {
13039 __movsw(Register, Buffer, Count);
13040 }
13041
13042 FORCEINLINE
13043 UCHAR
13044 READ_REGISTER_UCHAR(
13045 IN volatile UCHAR *Register)
13046 {
13047 return *Register;
13048 }
13049
13050 FORCEINLINE
13051 ULONG
13052 READ_REGISTER_ULONG(
13053 IN volatile ULONG *Register)
13054 {
13055 return *Register;
13056 }
13057
13058 FORCEINLINE
13059 USHORT
13060 READ_REGISTER_USHORT(
13061 IN volatile USHORT *Register)
13062 {
13063 return *Register;
13064 }
13065
13066 FORCEINLINE
13067 VOID
13068 WRITE_PORT_BUFFER_UCHAR(
13069 IN PUCHAR Port,
13070 IN PUCHAR Buffer,
13071 IN ULONG Count)
13072 {
13073 __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
13074 }
13075
13076 FORCEINLINE
13077 VOID
13078 WRITE_PORT_BUFFER_ULONG(
13079 IN PULONG Port,
13080 IN PULONG Buffer,
13081 IN ULONG Count)
13082 {
13083 __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
13084 }
13085
13086 FORCEINLINE
13087 VOID
13088 WRITE_PORT_BUFFER_USHORT(
13089 IN PUSHORT Port,
13090 IN PUSHORT Buffer,
13091 IN ULONG Count)
13092 {
13093 __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
13094 }
13095
13096 FORCEINLINE
13097 VOID
13098 WRITE_PORT_UCHAR(
13099 IN PUCHAR Port,
13100 IN UCHAR Value)
13101 {
13102 __outbyte((USHORT)(ULONG_PTR)Port, Value);
13103 }
13104
13105 FORCEINLINE
13106 VOID
13107 WRITE_PORT_ULONG(
13108 IN PULONG Port,
13109 IN ULONG Value)
13110 {
13111 __outdword((USHORT)(ULONG_PTR)Port, Value);
13112 }
13113
13114 FORCEINLINE
13115 VOID
13116 WRITE_PORT_USHORT(
13117 IN PUSHORT Port,
13118 IN USHORT Value)
13119 {
13120 __outword((USHORT)(ULONG_PTR)Port, Value);
13121 }
13122
13123 FORCEINLINE
13124 VOID
13125 WRITE_REGISTER_BUFFER_UCHAR(
13126 IN PUCHAR Register,
13127 IN PUCHAR Buffer,
13128 IN ULONG Count)
13129 {
13130 LONG Synch;
13131 __movsb(Register, Buffer, Count);
13132 InterlockedOr(&Synch, 1);
13133 }
13134
13135 FORCEINLINE
13136 VOID
13137 WRITE_REGISTER_BUFFER_ULONG(
13138 IN PULONG Register,
13139 IN PULONG Buffer,
13140 IN ULONG Count)
13141 {
13142 LONG Synch;
13143 __movsd(Register, Buffer, Count);
13144 InterlockedOr(&Synch, 1);
13145 }
13146
13147 FORCEINLINE
13148 VOID
13149 WRITE_REGISTER_BUFFER_USHORT(
13150 IN PUSHORT Register,
13151 IN PUSHORT Buffer,
13152 IN ULONG Count)
13153 {
13154 LONG Synch;
13155 __movsw(Register, Buffer, Count);
13156 InterlockedOr(&Synch, 1);
13157 }
13158
13159 FORCEINLINE
13160 VOID
13161 WRITE_REGISTER_UCHAR(
13162 IN volatile UCHAR *Register,
13163 IN UCHAR Value)
13164 {
13165 LONG Synch;
13166 *Register = Value;
13167 InterlockedOr(&Synch, 1);
13168 }
13169
13170 FORCEINLINE
13171 VOID
13172 WRITE_REGISTER_ULONG(
13173 IN volatile ULONG *Register,
13174 IN ULONG Value)
13175 {
13176 LONG Synch;
13177 *Register = Value;
13178 InterlockedOr(&Synch, 1);
13179 }
13180
13181 FORCEINLINE
13182 VOID
13183 WRITE_REGISTER_USHORT(
13184 IN volatile USHORT *Register,
13185 IN USHORT Value)
13186 {
13187 LONG Sync;
13188 *Register = Value;
13189 InterlockedOr(&Sync, 1);
13190 }
13191 #endif
13192
13193 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
13194 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
13195
13196 #define DMA_MACROS_DEFINED
13197
13198 _IRQL_requires_max_(DISPATCH_LEVEL)
13199 _IRQL_requires_min_(DISPATCH_LEVEL)
13200 FORCEINLINE
13201 NTSTATUS
13202 IoAllocateAdapterChannel(
13203 _In_ PDMA_ADAPTER DmaAdapter,
13204 _In_ PDEVICE_OBJECT DeviceObject,
13205 _In_ ULONG NumberOfMapRegisters,
13206 _In_ PDRIVER_CONTROL ExecutionRoutine,
13207 _In_ PVOID Context)
13208 {
13209 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
13210 AllocateAdapterChannel =
13211 *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
13212 ASSERT(AllocateAdapterChannel);
13213 return AllocateAdapterChannel(DmaAdapter,
13214 DeviceObject,
13215 NumberOfMapRegisters,
13216 ExecutionRoutine,
13217 Context);
13218 }
13219
13220 FORCEINLINE
13221 BOOLEAN
13222 NTAPI
13223 IoFlushAdapterBuffers(
13224 _In_ PDMA_ADAPTER DmaAdapter,
13225 _In_ PMDL Mdl,
13226 _In_ PVOID MapRegisterBase,
13227 _In_ PVOID CurrentVa,
13228 _In_ ULONG Length,
13229 _In_ BOOLEAN WriteToDevice)
13230 {
13231 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
13232 FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
13233 ASSERT(FlushAdapterBuffers);
13234 return FlushAdapterBuffers(DmaAdapter,
13235 Mdl,
13236 MapRegisterBase,
13237 CurrentVa,
13238 Length,
13239 WriteToDevice);
13240 }
13241
13242 FORCEINLINE
13243 VOID
13244 NTAPI
13245 IoFreeAdapterChannel(
13246 _In_ PDMA_ADAPTER DmaAdapter)
13247 {
13248 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
13249 FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
13250 ASSERT(FreeAdapterChannel);
13251 FreeAdapterChannel(DmaAdapter);
13252 }
13253
13254 FORCEINLINE
13255 VOID
13256 NTAPI
13257 IoFreeMapRegisters(
13258 _In_ PDMA_ADAPTER DmaAdapter,
13259 _In_ PVOID MapRegisterBase,
13260 _In_ ULONG NumberOfMapRegisters)
13261 {
13262 PFREE_MAP_REGISTERS FreeMapRegisters;
13263 FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
13264 ASSERT(FreeMapRegisters);
13265 FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
13266 }
13267
13268 FORCEINLINE
13269 PHYSICAL_ADDRESS
13270 NTAPI
13271 IoMapTransfer(
13272 _In_ PDMA_ADAPTER DmaAdapter,
13273 _In_ PMDL Mdl,
13274 _In_ PVOID MapRegisterBase,
13275 _In_ PVOID CurrentVa,
13276 _Inout_ PULONG Length,
13277 _In_ BOOLEAN WriteToDevice)
13278 {
13279 PMAP_TRANSFER MapTransfer;
13280
13281 MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
13282 ASSERT(MapTransfer);
13283 return MapTransfer(DmaAdapter,
13284 Mdl,
13285 MapRegisterBase,
13286 CurrentVa,
13287 Length,
13288 WriteToDevice);
13289 }
13290 #endif
13291
13292 #if (NTDDI_VERSION >= NTDDI_WIN2K)
13293
13294 _Acquires_lock_(_Global_cancel_spin_lock_)
13295 _Requires_lock_not_held_(_Global_cancel_spin_lock_)
13296 _IRQL_requires_max_(DISPATCH_LEVEL)
13297 _IRQL_raises_(DISPATCH_LEVEL)
13298 NTKERNELAPI
13299 VOID
13300 NTAPI
13301 IoAcquireCancelSpinLock(
13302 _Out_ _At_(*Irql, _IRQL_saves_) PKIRQL Irql);
13303
13304 _IRQL_requires_max_(DISPATCH_LEVEL)
13305 NTKERNELAPI
13306 NTSTATUS
13307 NTAPI
13308 IoAcquireRemoveLockEx(
13309 _Inout_ PIO_REMOVE_LOCK RemoveLock,
13310 _In_opt_ PVOID Tag,
13311 _In_ PCSTR File,
13312 _In_ ULONG Line,
13313 _In_ ULONG RemlockSize);
13314
13315 _IRQL_requires_max_(DISPATCH_LEVEL)
13316 _Ret_range_(<=, 0)
13317 NTKERNELAPI
13318 NTSTATUS
13319 NTAPI
13320 IoAllocateDriverObjectExtension(
13321 _In_ PDRIVER_OBJECT DriverObject,
13322 _In_ PVOID ClientIdentificationAddress,
13323 _In_ ULONG DriverObjectExtensionSize,
13324 _Post_ _At_(*DriverObjectExtension, _When_(return==0,
13325 __drv_aliasesMem __drv_allocatesMem(Mem) _Post_notnull_))
13326 _When_(return == 0, _Outptr_result_bytebuffer_(DriverObjectExtensionSize))
13327 PVOID *DriverObjectExtension);
13328
13329 _IRQL_requires_max_(DISPATCH_LEVEL)
13330 NTKERNELAPI
13331 PVOID
13332 NTAPI
13333 IoAllocateErrorLogEntry(
13334 _In_ PVOID IoObject,
13335 _In_ UCHAR EntrySize);
13336
13337 _Must_inspect_result_
13338 _IRQL_requires_max_(DISPATCH_LEVEL)
13339 NTKERNELAPI
13340 PIRP
13341 NTAPI
13342 IoAllocateIrp(
13343 _In_ CCHAR StackSize,
13344 _In_ BOOLEAN ChargeQuota);
13345
13346 _IRQL_requires_max_(DISPATCH_LEVEL)
13347 NTKERNELAPI
13348 PMDL
13349 NTAPI
13350 IoAllocateMdl(
13351 _In_opt_ __drv_aliasesMem PVOID VirtualAddress,
13352 _In_ ULONG Length,
13353 _In_ BOOLEAN SecondaryBuffer,
13354 _In_ BOOLEAN ChargeQuota,
13355 _Inout_opt_ PIRP Irp);
13356
13357 __drv_allocatesMem(Mem)
13358 _IRQL_requires_max_(DISPATCH_LEVEL)
13359 NTKERNELAPI
13360 PIO_WORKITEM
13361 NTAPI
13362 IoAllocateWorkItem(
13363 _In_ PDEVICE_OBJECT DeviceObject);
13364
13365 _IRQL_requires_max_(APC_LEVEL)
13366 _Ret_range_(<=, 0)
13367 NTKERNELAPI
13368 NTSTATUS
13369 NTAPI
13370 IoAttachDevice(
13371 _In_ _Kernel_requires_resource_held_(Memory) _When_(return==0, __drv_aliasesMem)
13372 PDEVICE_OBJECT SourceDevice,
13373 _In_ PUNICODE_STRING TargetDevice,
13374 _Out_ PDEVICE_OBJECT *AttachedDevice);
13375
13376 _Must_inspect_result_
13377 _IRQL_requires_max_(DISPATCH_LEVEL)
13378 NTKERNELAPI
13379 PDEVICE_OBJECT
13380 NTAPI
13381 IoAttachDeviceToDeviceStack(
13382 _In_ _Kernel_requires_resource_held_(Memory) _When_(return!=0, __drv_aliasesMem)
13383 PDEVICE_OBJECT SourceDevice,
13384 _In_ PDEVICE_OBJECT TargetDevice);
13385
13386 _Must_inspect_result_
13387 __drv_aliasesMem
13388 _IRQL_requires_max_(DISPATCH_LEVEL)
13389 NTKERNELAPI
13390 PIRP
13391 NTAPI
13392 IoBuildAsynchronousFsdRequest(
13393 _In_ ULONG MajorFunction,
13394 _In_ PDEVICE_OBJECT DeviceObject,
13395 _Inout_opt_ PVOID Buffer,
13396 _In_opt_ ULONG Length,
13397 _In_opt_ PLARGE_INTEGER StartingOffset,
13398 _In_opt_ PIO_STATUS_BLOCK IoStatusBlock);
13399
13400 _Must_inspect_result_
13401 __drv_aliasesMem
13402 _IRQL_requires_max_(PASSIVE_LEVEL)
13403 NTKERNELAPI
13404 PIRP
13405 NTAPI
13406 IoBuildDeviceIoControlRequest(
13407 _In_ ULONG IoControlCode,
13408 _In_ PDEVICE_OBJECT DeviceObject,
13409 _In_opt_ PVOID InputBuffer,
13410 _In_ ULONG InputBufferLength,
13411 _Out_opt_ PVOID OutputBuffer,
13412 _In_ ULONG OutputBufferLength,
13413 _In_ BOOLEAN InternalDeviceIoControl,
13414 _In_opt_ PKEVENT Event,
13415 _Out_ PIO_STATUS_BLOCK IoStatusBlock);
13416
13417 _IRQL_requires_max_(DISPATCH_LEVEL)
13418 NTKERNELAPI
13419 VOID
13420 NTAPI
13421 IoBuildPartialMdl(
13422 _In_ PMDL SourceMdl,
13423 _Inout_ PMDL TargetMdl,
13424 _In_ PVOID VirtualAddress,
13425 _In_ ULONG Length);
13426
13427 _Must_inspect_result_
13428 __drv_aliasesMem
13429 _IRQL_requires_max_(PASSIVE_LEVEL)
13430 NTKERNELAPI
13431 PIRP
13432 NTAPI
13433 IoBuildSynchronousFsdRequest(
13434 _In_ ULONG MajorFunction,
13435 _In_ PDEVICE_OBJECT DeviceObject,
13436 _Inout_opt_ PVOID Buffer,
13437 _In_opt_ ULONG Length,
13438 _In_opt_ PLARGE_INTEGER StartingOffset,
13439 _In_ PKEVENT Event,
13440 _Out_ PIO_STATUS_BLOCK IoStatusBlock);
13441
13442 _IRQL_requires_max_(DISPATCH_LEVEL)
13443 _Success_(TRUE)
13444 NTKERNELAPI
13445 NTSTATUS
13446 FASTCALL
13447 IofCallDriver(
13448 _In_ PDEVICE_OBJECT DeviceObject,
13449 _Inout_ __drv_aliasesMem PIRP Irp);
13450 #define IoCallDriver IofCallDriver
13451
13452 _IRQL_requires_max_(DISPATCH_LEVEL)
13453 NTKERNELAPI
13454 VOID
13455 FASTCALL
13456 IofCompleteRequest(
13457 _In_ PIRP Irp,
13458 _In_ CCHAR PriorityBoost);
13459 #define IoCompleteRequest IofCompleteRequest
13460
13461 _IRQL_requires_max_(DISPATCH_LEVEL)
13462 NTKERNELAPI
13463 BOOLEAN
13464 NTAPI
13465 IoCancelIrp(
13466 _In_ PIRP Irp);
13467
13468 _IRQL_requires_max_(PASSIVE_LEVEL)
13469 NTKERNELAPI
13470 NTSTATUS
13471 NTAPI
13472 IoCheckShareAccess(
13473 _In_ ACCESS_MASK DesiredAccess,
13474 _In_ ULONG DesiredShareAccess,
13475 _Inout_ PFILE_OBJECT FileObject,
13476 _Inout_ PSHARE_ACCESS ShareAccess,
13477 _In_ BOOLEAN Update);
13478
13479 _IRQL_requires_max_(DISPATCH_LEVEL)
13480 NTKERNELAPI
13481 VOID
13482 FASTCALL
13483 IofCompleteRequest(
13484 _In_ PIRP Irp,
13485 _In_ CCHAR PriorityBoost);
13486
13487 _IRQL_requires_max_(PASSIVE_LEVEL)
13488 NTKERNELAPI
13489 NTSTATUS
13490 NTAPI
13491 IoConnectInterrupt(
13492 _Out_ PKINTERRUPT *InterruptObject,
13493 _In_ PKSERVICE_ROUTINE ServiceRoutine,
13494 _In_opt_ PVOID ServiceContext,
13495 _In_opt_ PKSPIN_LOCK SpinLock,
13496 _In_ ULONG Vector,
13497 _In_ KIRQL Irql,
13498 _In_ KIRQL SynchronizeIrql,
13499 _In_ KINTERRUPT_MODE InterruptMode,
13500 _In_ BOOLEAN ShareVector,
13501 _In_ KAFFINITY ProcessorEnableMask,
13502 _In_ BOOLEAN FloatingSave);
13503
13504 _IRQL_requires_max_(APC_LEVEL)
13505 _Ret_range_(<=, 0)
13506 NTKERNELAPI
13507 NTSTATUS
13508 NTAPI
13509 IoCreateDevice(
13510 _In_ PDRIVER_OBJECT DriverObject,
13511 _In_ ULONG DeviceExtensionSize,
13512 _In_opt_ PUNICODE_STRING DeviceName,
13513 _In_ DEVICE_TYPE DeviceType,
13514 _In_ ULONG DeviceCharacteristics,
13515 _In_ BOOLEAN Exclusive,
13516 _Outptr_result_nullonfailure_
13517 _At_(*DeviceObject,
13518 __drv_allocatesMem(Mem)
13519 _When_(((_In_function_class_(DRIVER_INITIALIZE))
13520 ||(_In_function_class_(DRIVER_DISPATCH))),
13521 __drv_aliasesMem))
13522 PDEVICE_OBJECT *DeviceObject);
13523
13524 _IRQL_requires_max_(PASSIVE_LEVEL)
13525 NTKERNELAPI
13526 NTSTATUS
13527 NTAPI
13528 IoCreateFile(
13529 _Out_ PHANDLE FileHandle,
13530 _In_ ACCESS_MASK DesiredAccess,
13531 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
13532 _Out_ PIO_STATUS_BLOCK IoStatusBlock,
13533 _In_opt_ PLARGE_INTEGER AllocationSize,
13534 _In_ ULONG FileAttributes,
13535 _In_ ULONG ShareAccess,
13536 _In_ ULONG Disposition,
13537 _In_ ULONG CreateOptions,
13538 _In_opt_ PVOID EaBuffer,
13539 _In_ ULONG EaLength,
13540 _In_ CREATE_FILE_TYPE CreateFileType,
13541 _In_opt_ PVOID InternalParameters,
13542 _In_ ULONG Options);
13543
13544 _IRQL_requires_max_(PASSIVE_LEVEL)
13545 NTKERNELAPI
13546 PKEVENT
13547 NTAPI
13548 IoCreateNotificationEvent(
13549 _In_ PUNICODE_STRING EventName,
13550 _Out_ PHANDLE EventHandle);
13551
13552 _IRQL_requires_max_(PASSIVE_LEVEL)
13553 NTKERNELAPI
13554 NTSTATUS
13555 NTAPI
13556 IoCreateSymbolicLink(
13557 _In_ PUNICODE_STRING SymbolicLinkName,
13558 _In_ PUNICODE_STRING DeviceName);
13559
13560 _IRQL_requires_max_(PASSIVE_LEVEL)
13561 NTKERNELAPI
13562 PKEVENT
13563 NTAPI
13564 IoCreateSynchronizationEvent(
13565 _In_ PUNICODE_STRING EventName,
13566 _Out_ PHANDLE EventHandle);
13567
13568 _IRQL_requires_max_(PASSIVE_LEVEL)
13569 NTKERNELAPI
13570 NTSTATUS
13571 NTAPI
13572 IoCreateUnprotectedSymbolicLink(
13573 _In_ PUNICODE_STRING SymbolicLinkName,
13574 _In_ PUNICODE_STRING DeviceName);
13575
13576 _IRQL_requires_max_(APC_LEVEL)
13577 _Kernel_clear_do_init_(__yes)
13578 NTKERNELAPI
13579 VOID
13580 NTAPI
13581 IoDeleteDevice(
13582 _In_ _Kernel_requires_resource_held_(Memory) __drv_freesMem(Mem)
13583 PDEVICE_OBJECT DeviceObject);
13584
13585 _IRQL_requires_max_(PASSIVE_LEVEL)
13586 NTKERNELAPI
13587 NTSTATUS
13588 NTAPI
13589 IoDeleteSymbolicLink(
13590 _In_ PUNICODE_STRING SymbolicLinkName);
13591
13592 _IRQL_requires_max_(PASSIVE_LEVEL)
13593 NTKERNELAPI
13594 VOID
13595 NTAPI
13596 IoDetachDevice(
13597 _Inout_ PDEVICE_OBJECT TargetDevice);
13598
13599 _IRQL_requires_max_(PASSIVE_LEVEL)
13600 NTKERNELAPI
13601 VOID
13602 NTAPI
13603 IoDisconnectInterrupt(
13604 _In_ PKINTERRUPT InterruptObject);
13605
13606 __drv_freesMem(Mem)
13607 _IRQL_requires_max_(DISPATCH_LEVEL)
13608 NTKERNELAPI
13609 VOID
13610 NTAPI
13611 IoFreeIrp(
13612 _In_ PIRP Irp);
13613
13614 _IRQL_requires_max_(DISPATCH_LEVEL)
13615 NTKERNELAPI
13616 VOID
13617 NTAPI
13618 IoFreeMdl(
13619 PMDL Mdl);
13620
13621 _IRQL_requires_max_(DISPATCH_LEVEL)
13622 NTKERNELAPI
13623 VOID
13624 NTAPI
13625 IoFreeWorkItem(
13626 _In_ __drv_freesMem(Mem) PIO_WORKITEM IoWorkItem);
13627
13628 NTKERNELAPI
13629 PDEVICE_OBJECT
13630 NTAPI
13631 IoGetAttachedDevice(
13632 IN PDEVICE_OBJECT DeviceObject);
13633
13634 _IRQL_requires_max_(DISPATCH_LEVEL)
13635 NTKERNELAPI
13636 PDEVICE_OBJECT
13637 NTAPI
13638 IoGetAttachedDeviceReference(
13639 _In_ PDEVICE_OBJECT DeviceObject);
13640
13641 NTKERNELAPI
13642 NTSTATUS
13643 NTAPI
13644 IoGetBootDiskInformation(
13645 _Inout_ PBOOTDISK_INFORMATION BootDiskInformation,
13646 _In_ ULONG Size);
13647
13648 _IRQL_requires_max_(PASSIVE_LEVEL)
13649 _Must_inspect_result_
13650 NTKERNELAPI
13651 NTSTATUS
13652 NTAPI
13653 IoGetDeviceInterfaceAlias(
13654 _In_ PUNICODE_STRING SymbolicLinkName,
13655 _In_ CONST GUID *AliasInterfaceClassGuid,
13656 _Out_
13657 _When_(return==0, _At_(AliasSymbolicLinkName->Buffer, __drv_allocatesMem(Mem)))
13658 PUNICODE_STRING AliasSymbolicLinkName);
13659
13660 NTKERNELAPI
13661 PEPROCESS
13662 NTAPI
13663 IoGetCurrentProcess(VOID);
13664
13665 _IRQL_requires_max_(PASSIVE_LEVEL)
13666 _Must_inspect_result_
13667 NTKERNELAPI
13668 NTSTATUS
13669 NTAPI
13670 IoGetDeviceInterfaces(
13671 _In_ CONST GUID *InterfaceClassGuid,
13672 _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject,
13673 _In_ ULONG Flags,
13674 _Outptr_result_nullonfailure_
13675 _At_(*SymbolicLinkList, _When_(return==0, __drv_allocatesMem(Mem)))
13676 PZZWSTR *SymbolicLinkList);
13677
13678 _IRQL_requires_max_(PASSIVE_LEVEL)
13679 NTKERNELAPI
13680 NTSTATUS
13681 NTAPI
13682 IoGetDeviceObjectPointer(
13683 _In_ PUNICODE_STRING ObjectName,
13684 _In_ ACCESS_MASK DesiredAccess,
13685 _Out_ PFILE_OBJECT *FileObject,
13686 _Out_ PDEVICE_OBJECT *DeviceObject);
13687
13688 _IRQL_requires_max_(PASSIVE_LEVEL)
13689 _When_((DeviceProperty & __string_type),
13690 _At_(PropertyBuffer, _Post_z_))
13691 _When_((DeviceProperty & __multiString_type),
13692 _At_(PropertyBuffer, _Post_ _NullNull_terminated_))
13693 NTKERNELAPI
13694 NTSTATUS
13695 NTAPI
13696 IoGetDeviceProperty(
13697 _In_ PDEVICE_OBJECT DeviceObject,
13698 _In_ DEVICE_REGISTRY_PROPERTY DeviceProperty,
13699 _In_ ULONG BufferLength,
13700 _Out_writes_bytes_opt_(BufferLength) PVOID PropertyBuffer,
13701 _Deref_out_range_(<=, BufferLength) PULONG ResultLength);
13702
13703 _Must_inspect_result_
13704 _IRQL_requires_max_(PASSIVE_LEVEL)
13705 NTKERNELAPI
13706 PDMA_ADAPTER
13707 NTAPI
13708 IoGetDmaAdapter(
13709 _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject,
13710 _In_ PDEVICE_DESCRIPTION DeviceDescription,
13711 _Out_ _When_(return!=0, _Kernel_IoGetDmaAdapter_ _At_(*NumberOfMapRegisters, _Must_inspect_result_))
13712 PULONG NumberOfMapRegisters);
13713
13714 __drv_aliasesMem
13715 _IRQL_requires_max_(DISPATCH_LEVEL)
13716 NTKERNELAPI
13717 PVOID
13718 NTAPI
13719 IoGetDriverObjectExtension(
13720 _In_ PDRIVER_OBJECT DriverObject,
13721 _In_ PVOID ClientIdentificationAddress);
13722
13723 _IRQL_requires_max_(APC_LEVEL)
13724 NTKERNELAPI
13725 PVOID
13726 NTAPI
13727 IoGetInitialStack(VOID);
13728
13729 NTKERNELAPI
13730 PDEVICE_OBJECT
13731 NTAPI
13732 IoGetRelatedDeviceObject(
13733 _In_ PFILE_OBJECT FileObject);
13734
13735 _IRQL_requires_max_(DISPATCH_LEVEL)
13736 NTKERNELAPI
13737 VOID
13738 NTAPI
13739 IoQueueWorkItem(
13740 _Inout_ PIO_WORKITEM IoWorkItem,
13741 _In_ PIO_WORKITEM_ROUTINE WorkerRoutine,
13742 _In_ WORK_QUEUE_TYPE QueueType,
13743 _In_opt_ __drv_aliasesMem PVOID Context);
13744
13745 _IRQL_requires_max_(DISPATCH_LEVEL)
13746 NTKERNELAPI
13747 VOID
13748 NTAPI
13749 IoInitializeIrp(
13750 _Inout_ PIRP Irp,
13751 _In_ USHORT PacketSize,
13752 _In_ CCHAR StackSize);
13753
13754 _IRQL_requires_max_(PASSIVE_LEVEL)
13755 NTKERNELAPI
13756 VOID
13757 NTAPI
13758 IoInitializeRemoveLockEx(
13759 _Out_ PIO_REMOVE_LOCK Lock,
13760 _In_ ULONG AllocateTag,
13761 _In_ ULONG MaxLockedMinutes,
13762 _In_ ULONG HighWatermark,
13763 _In_ ULONG RemlockSize);
13764
13765 _IRQL_requires_max_(PASSIVE_LEVEL)
13766 NTKERNELAPI
13767 NTSTATUS
13768 NTAPI
13769 IoInitializeTimer(
13770 _In_ PDEVICE_OBJECT DeviceObject,
13771 _In_ PIO_TIMER_ROUTINE TimerRoutine,
13772 _In_opt_ __drv_aliasesMem PVOID Context);
13773
13774 _IRQL_requires_max_(DISPATCH_LEVEL)
13775 NTKERNELAPI
13776 VOID
13777 NTAPI
13778 IoInvalidateDeviceRelations(
13779 _In_ PDEVICE_OBJECT DeviceObject,
13780 _In_ DEVICE_RELATION_TYPE Type);
13781
13782 _IRQL_requires_max_(DISPATCH_LEVEL)
13783 NTKERNELAPI
13784 VOID
13785 NTAPI
13786 IoInvalidateDeviceState(
13787 _In_ PDEVICE_OBJECT PhysicalDeviceObject);
13788
13789 _IRQL_requires_max_(PASSIVE_LEVEL)
13790 NTKERNELAPI
13791 BOOLEAN
13792 NTAPI
13793 IoIsWdmVersionAvailable(
13794 _When_(MajorVersion!=1&&MajorVersion!=6, _In_ __drv_reportError("MajorVersion must be 1 or 6"))
13795 UCHAR MajorVersion,
13796 _In_ _When_(MinorVersion!=0 && MinorVersion!=5 &&
13797 MinorVersion!=16 && MinorVersion!=32 &&
13798 MinorVersion!=48, __drv_reportError("MinorVersion must be 0, 0x5, 0x10, 0x20, or 0x30"))
13799 UCHAR MinorVersion);
13800
13801 _IRQL_requires_max_(PASSIVE_LEVEL)
13802 _Must_inspect_result_
13803 NTKERNELAPI
13804 NTSTATUS
13805 NTAPI
13806 IoOpenDeviceInterfaceRegistryKey(
13807 _In_ PUNICODE_STRING SymbolicLinkName,
13808 _In_ ACCESS_MASK DesiredAccess,
13809 _Out_ PHANDLE DeviceInterfaceKey);
13810
13811 _IRQL_requires_max_(PASSIVE_LEVEL)
13812 _Must_inspect_result_
13813 NTKERNELAPI
13814 NTSTATUS
13815 NTAPI
13816 IoOpenDeviceRegistryKey(
13817 _In_ PDEVICE_OBJECT DeviceObject,
13818 _In_ ULONG DevInstKeyType,
13819 _In_ ACCESS_MASK DesiredAccess,
13820 _Out_ PHANDLE DevInstRegKey);
13821
13822 _IRQL_requires_max_(PASSIVE_LEVEL)
13823 _Must_inspect_result_
13824 NTKERNELAPI
13825 NTSTATUS
13826 NTAPI
13827 IoRegisterDeviceInterface(
13828 _In_ PDEVICE_OBJECT PhysicalDeviceObject,
13829 _In_ CONST GUID *InterfaceClassGuid,
13830 _In_opt_ PUNICODE_STRING ReferenceString,
13831 _Out_ _When_(return==0, _At_(SymbolicLinkName->Buffer, __drv_allocatesMem(Mem)))
13832 PUNICODE_STRING SymbolicLinkName);
13833
13834 _IRQL_requires_max_(PASSIVE_LEVEL)
13835 _Must_inspect_result_
13836 NTKERNELAPI
13837 NTSTATUS
13838 NTAPI
13839 IoRegisterPlugPlayNotification(
13840 _In_ IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
13841 _In_ ULONG EventCategoryFlags,
13842 _In_opt_ PVOID EventCategoryData,
13843 _In_ PDRIVER_OBJECT DriverObject,
13844 _In_ PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
13845 _Inout_opt_ __drv_aliasesMem PVOID Context,
13846 _Outptr_result_nullonfailure_
13847 _At_(*NotificationEntry, _When_(return==0, __drv_allocatesMem(Mem)))
13848 PVOID *NotificationEntry);
13849
13850 _IRQL_requires_max_(PASSIVE_LEVEL)
13851 NTKERNELAPI
13852 NTSTATUS
13853 NTAPI
13854 IoRegisterShutdownNotification(
13855 _In_ PDEVICE_OBJECT DeviceObject);
13856
13857 _Requires_lock_held_(_Global_cancel_spin_lock_)
13858 _Releases_lock_(_Global_cancel_spin_lock_)
13859 _IRQL_requires_max_(DISPATCH_LEVEL)
13860 _IRQL_requires_min_(DISPATCH_LEVEL)
13861 NTKERNELAPI
13862 VOID
13863 NTAPI
13864 IoReleaseCancelSpinLock(
13865 _In_ _IRQL_restores_ _IRQL_uses_cancel_ KIRQL Irql);
13866
13867 _IRQL_requires_max_(PASSIVE_LEVEL)
13868 NTKERNELAPI
13869 VOID
13870 NTAPI
13871 IoReleaseRemoveLockAndWaitEx(
13872 _Inout_ PIO_REMOVE_LOCK RemoveLock,
13873 _In_opt_ PVOID Tag,
13874 _In_ ULONG RemlockSize);
13875
13876 NTKERNELAPI
13877 VOID
13878 NTAPI
13879 IoReleaseRemoveLockEx(
13880 _Inout_ PIO_REMOVE_LOCK RemoveLock,
13881 _In_opt_ PVOID Tag,
13882 _In_ ULONG RemlockSize);
13883
13884 _IRQL_requires_max_(PASSIVE_LEVEL)
13885 NTKERNELAPI
13886 VOID
13887 NTAPI
13888 IoRemoveShareAccess(
13889 _In_ PFILE_OBJECT FileObject,
13890 _Inout_ PSHARE_ACCESS ShareAccess);
13891
13892 _IRQL_requires_max_(PASSIVE_LEVEL)
13893 NTKERNELAPI
13894 NTSTATUS
13895 NTAPI
13896 IoReportTargetDeviceChange(
13897 _In_ PDEVICE_OBJECT PhysicalDeviceObject,
13898 _In_ PVOID NotificationStructure);
13899
13900 _IRQL_requires_max_(DISPATCH_LEVEL)
13901 NTKERNELAPI
13902 NTSTATUS
13903 NTAPI
13904 IoReportTargetDeviceChangeAsynchronous(
13905 _In_ PDEVICE_OBJECT PhysicalDeviceObject,
13906 _In_ PVOID NotificationStructure,
13907 _In_opt_ PDEVICE_CHANGE_COMPLETE_CALLBACK Callback,
13908 _In_opt_ PVOID Context);
13909
13910 _IRQL_requires_max_(DISPATCH_LEVEL)
13911 NTKERNELAPI
13912 VOID
13913 NTAPI
13914 IoRequestDeviceEject(
13915 _In_ PDEVICE_OBJECT PhysicalDeviceObject);
13916
13917 _IRQL_requires_max_(DISPATCH_LEVEL)
13918 NTKERNELAPI
13919 VOID
13920 NTAPI
13921 IoReuseIrp(
13922 _Inout_ PIRP Irp,
13923 _In_ NTSTATUS Status);
13924
13925 _IRQL_requires_max_(PASSIVE_LEVEL)
13926 _Must_inspect_result_
13927 NTKERNELAPI
13928 NTSTATUS
13929 NTAPI
13930 IoSetDeviceInterfaceState(
13931 _In_ PUNICODE_STRING SymbolicLinkName,
13932 _In_ BOOLEAN Enable);
13933
13934 NTKERNELAPI
13935 VOID
13936 NTAPI
13937 IoSetShareAccess(
13938 _In_ ACCESS_MASK DesiredAccess,
13939 _In_ ULONG DesiredShareAccess,
13940 _Inout_ PFILE_OBJECT FileObject,
13941 _Out_ PSHARE_ACCESS ShareAccess);
13942
13943 _IRQL_requires_max_(DISPATCH_LEVEL)
13944 _IRQL_requires_min_(DISPATCH_LEVEL)
13945 NTKERNELAPI
13946 VOID
13947 NTAPI
13948 IoStartNextPacket(
13949 _In_ PDEVICE_OBJECT DeviceObject,
13950 _In_ BOOLEAN Cancelable);
13951
13952 _IRQL_requires_max_(DISPATCH_LEVEL)
13953 NTKERNELAPI
13954 VOID
13955 NTAPI
13956 IoStartNextPacketByKey(
13957 _In_ PDEVICE_OBJECT DeviceObject,
13958 _In_ BOOLEAN Cancelable,
13959 _In_ ULONG Key);
13960
13961 _IRQL_requires_max_(DISPATCH_LEVEL)
13962 NTKERNELAPI
13963 VOID
13964 NTAPI
13965 IoStartPacket(
13966 _In_ PDEVICE_OBJECT DeviceObject,
13967 _In_ PIRP Irp,
13968 _In_opt_ PULONG Key,
13969 _In_opt_ PDRIVER_CANCEL CancelFunction);
13970
13971 _IRQL_requires_max_(DISPATCH_LEVEL)
13972 NTKERNELAPI
13973 VOID
13974 NTAPI
13975 IoStartTimer(
13976 _In_ PDEVICE_OBJECT DeviceObject);
13977
13978 _IRQL_requires_max_(DISPATCH_LEVEL)
13979 NTKERNELAPI
13980 VOID
13981 NTAPI
13982 IoStopTimer(
13983 _In_ PDEVICE_OBJECT DeviceObject);
13984
13985 _IRQL_requires_max_(PASSIVE_LEVEL)
13986 __drv_freesMem(Pool)
13987 NTKERNELAPI
13988 NTSTATUS
13989 NTAPI
13990 IoUnregisterPlugPlayNotification(
13991 _In_ PVOID NotificationEntry);
13992
13993 _IRQL_requires_max_(PASSIVE_LEVEL)
13994 NTKERNELAPI
13995 VOID
13996 NTAPI
13997 IoUnregisterShutdownNotification(
13998 _In_ PDEVICE_OBJECT DeviceObject);
13999
14000 _IRQL_requires_max_(PASSIVE_LEVEL)
14001 NTKERNELAPI
14002 VOID
14003 NTAPI
14004 IoUpdateShareAccess(
14005 _In_ PFILE_OBJECT FileObject,
14006 _Inout_ PSHARE_ACCESS ShareAccess);
14007
14008 _IRQL_requires_max_(PASSIVE_LEVEL)
14009 NTKERNELAPI
14010 NTSTATUS
14011 NTAPI
14012 IoWMIAllocateInstanceIds(
14013 _In_ GUID *Guid,
14014 _In_ ULONG InstanceCount,
14015 _Out_ ULONG *FirstInstanceId);
14016
14017 NTKERNELAPI
14018 NTSTATUS
14019 NTAPI
14020 IoWMIQuerySingleInstanceMultiple(
14021 _In_reads_(ObjectCount) PVOID *DataBlockObjectList,
14022 _In_reads_(ObjectCount) PUNICODE_STRING InstanceNames,
14023 _In_ ULONG ObjectCount,
14024 _Inout_ ULONG *InOutBufferSize,
14025 _Out_writes_bytes_opt_(*InOutBufferSize) PVOID OutBuffer);
14026
14027 _IRQL_requires_max_(PASSIVE_LEVEL)
14028 NTKERNELAPI
14029 NTSTATUS
14030 NTAPI
14031 IoWMIRegistrationControl(
14032 _In_ PDEVICE_OBJECT DeviceObject,
14033 _In_ ULONG Action);
14034
14035 NTKERNELAPI
14036 NTSTATUS
14037 NTAPI
14038 IoWMISuggestInstanceName(
14039 _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject,
14040 _In_opt_ PUNICODE_STRING SymbolicLinkName,
14041 _In_ BOOLEAN CombineNames,
14042 _Out_ PUNICODE_STRING SuggestedInstanceName);
14043
14044 _Must_inspect_result_
14045 _IRQL_requires_max_(DISPATCH_LEVEL)
14046 _Ret_range_(<=, 0)
14047 NTKERNELAPI
14048 NTSTATUS
14049 NTAPI
14050 IoWMIWriteEvent(
14051 _Inout_ _When_(return==0, __drv_aliasesMem) PVOID WnodeEventItem);
14052
14053 _IRQL_requires_max_(DISPATCH_LEVEL)
14054 NTKERNELAPI
14055 VOID
14056 NTAPI
14057 IoWriteErrorLogEntry(
14058 _In_ PVOID ElEntry);
14059
14060 NTKERNELAPI
14061 PIRP
14062 NTAPI
14063 IoGetTopLevelIrp(VOID);
14064
14065 _IRQL_requires_max_(PASSIVE_LEVEL)
14066 NTKERNELAPI
14067 NTSTATUS
14068 NTAPI
14069 IoRegisterLastChanceShutdownNotification(
14070 _In_ PDEVICE_OBJECT DeviceObject);
14071
14072 NTKERNELAPI
14073 VOID
14074 NTAPI
14075 IoSetTopLevelIrp(
14076 _In_opt_ PIRP Irp);
14077
14078
14079 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14080
14081
14082 #if (NTDDI_VERSION >= NTDDI_WINXP)
14083
14084 NTKERNELAPI
14085 NTSTATUS
14086 NTAPI
14087 IoCsqInitialize(
14088 _Out_ PIO_CSQ Csq,
14089 _In_ PIO_CSQ_INSERT_IRP CsqInsertIrp,
14090 _In_ PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
14091 _In_ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
14092 _In_ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
14093 _In_ PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
14094 _In_ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
14095
14096 NTKERNELAPI
14097 VOID
14098 NTAPI
14099 IoCsqInsertIrp(
14100 _Inout_ PIO_CSQ Csq,
14101 _Inout_ PIRP Irp,
14102 _Out_opt_ PIO_CSQ_IRP_CONTEXT Context);
14103
14104 NTKERNELAPI
14105 PIRP
14106 NTAPI
14107 IoCsqRemoveIrp(
14108 _Inout_ PIO_CSQ Csq,
14109 _Inout_ PIO_CSQ_IRP_CONTEXT Context);
14110
14111 NTKERNELAPI
14112 PIRP
14113 NTAPI
14114 IoCsqRemoveNextIrp(
14115 _Inout_ PIO_CSQ Csq,
14116 _In_opt_ PVOID PeekContext);
14117
14118 NTKERNELAPI
14119 BOOLEAN
14120 NTAPI
14121 IoForwardIrpSynchronously(
14122 _In_ PDEVICE_OBJECT DeviceObject,
14123 _In_ PIRP Irp);
14124
14125 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
14126
14127 NTKERNELAPI
14128 VOID
14129 NTAPI
14130 IoFreeErrorLogEntry(
14131 _In_ PVOID ElEntry);
14132
14133 _IRQL_requires_max_(DISPATCH_LEVEL)
14134 _Must_inspect_result_
14135 NTKERNELAPI
14136 NTSTATUS
14137 NTAPI
14138 IoSetCompletionRoutineEx(
14139 _In_ PDEVICE_OBJECT DeviceObject,
14140 _In_ PIRP Irp,
14141 _In_ PIO_COMPLETION_ROUTINE CompletionRoutine,
14142 _In_opt_ PVOID Context,
14143 _In_ BOOLEAN InvokeOnSuccess,
14144 _In_ BOOLEAN InvokeOnError,
14145 _In_ BOOLEAN InvokeOnCancel);
14146
14147 VOID
14148 NTAPI
14149 IoSetStartIoAttributes(
14150 _In_ PDEVICE_OBJECT DeviceObject,
14151 _In_ BOOLEAN DeferredStartIo,
14152 _In_ BOOLEAN NonCancelable);
14153
14154 NTKERNELAPI
14155 NTSTATUS
14156 NTAPI
14157 IoWMIDeviceObjectToInstanceName(
14158 _In_ PVOID DataBlockObject,
14159 _In_ PDEVICE_OBJECT DeviceObject,
14160 _Out_ PUNICODE_STRING InstanceName);
14161
14162 NTKERNELAPI
14163 NTSTATUS
14164 NTAPI
14165 IoWMIExecuteMethod(
14166 _In_ PVOID DataBlockObject,
14167 _In_ PUNICODE_STRING InstanceName,
14168 _In_ ULONG MethodId,
14169 _In_ ULONG InBufferSize,
14170 _Inout_ PULONG OutBufferSize,
14171 _Inout_updates_bytes_to_opt_(*OutBufferSize, InBufferSize) PUCHAR InOutBuffer);
14172
14173 NTKERNELAPI
14174 NTSTATUS
14175 NTAPI
14176 IoWMIHandleToInstanceName(
14177 _In_ PVOID DataBlockObject,
14178 _In_ HANDLE FileHandle,
14179 _Out_ PUNICODE_STRING InstanceName);
14180
14181 NTKERNELAPI
14182 NTSTATUS
14183 NTAPI
14184 IoWMIOpenBlock(
14185 _In_ LPCGUID DataBlockGuid,
14186 _In_ ULONG DesiredAccess,
14187 _Out_ PVOID *DataBlockObject);
14188
14189 NTKERNELAPI
14190 NTSTATUS
14191 NTAPI
14192 IoWMIQueryAllData(
14193 _In_ PVOID DataBlockObject,
14194 _Inout_ ULONG *InOutBufferSize,
14195 _Out_writes_bytes_opt_(*InOutBufferSize) PVOID OutBuffer);
14196
14197 NTKERNELAPI
14198 NTSTATUS
14199 NTAPI
14200 IoWMIQueryAllDataMultiple(
14201 _In_reads_(ObjectCount) PVOID *DataBlockObjectList,
14202 _In_ ULONG ObjectCount,
14203 _Inout_ ULONG *InOutBufferSize,
14204 _Out_writes_bytes_opt_(*InOutBufferSize) PVOID OutBuffer);
14205
14206 NTKERNELAPI
14207 NTSTATUS
14208 NTAPI
14209 IoWMIQuerySingleInstance(
14210 _In_ PVOID DataBlockObject,
14211 _In_ PUNICODE_STRING InstanceName,
14212 _Inout_ ULONG *InOutBufferSize,
14213 _Out_writes_bytes_opt_(*InOutBufferSize) PVOID OutBuffer);
14214
14215 NTKERNELAPI
14216 NTSTATUS
14217 NTAPI
14218 IoWMISetNotificationCallback(
14219 _Inout_ PVOID Object,
14220 _In_ WMI_NOTIFICATION_CALLBACK Callback,
14221 _In_opt_ PVOID Context);
14222
14223 NTKERNELAPI
14224 NTSTATUS
14225 NTAPI
14226 IoWMISetSingleInstance(
14227 _In_ PVOID DataBlockObject,
14228 _In_ PUNICODE_STRING InstanceName,
14229 _In_ ULONG Version,
14230 _In_ ULONG ValueBufferSize,
14231 _In_reads_bytes_(ValueBufferSize) PVOID ValueBuffer);
14232
14233 NTKERNELAPI
14234 NTSTATUS
14235 NTAPI
14236 IoWMISetSingleItem(
14237 _In_ PVOID DataBlockObject,
14238 _In_ PUNICODE_STRING InstanceName,
14239 _In_ ULONG DataItemId,
14240 _In_ ULONG Version,
14241 _In_ ULONG ValueBufferSize,
14242 _In_reads_bytes_(ValueBufferSize) PVOID ValueBuffer);
14243
14244 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
14245
14246 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
14247 NTKERNELAPI
14248 NTSTATUS
14249 NTAPI
14250 IoValidateDeviceIoControlAccess(
14251 _In_ PIRP Irp,
14252 _In_ ULONG RequiredAccess);
14253 #endif
14254
14255 #if (NTDDI_VERSION >= NTDDI_WS03)
14256 NTKERNELAPI
14257 NTSTATUS
14258 NTAPI
14259 IoCsqInitializeEx(
14260 _Out_ PIO_CSQ Csq,
14261 _In_ PIO_CSQ_INSERT_IRP_EX CsqInsertIrp,
14262 _In_ PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
14263 _In_ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
14264 _In_ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
14265 _In_ PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
14266 _In_ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
14267
14268 NTKERNELAPI
14269 NTSTATUS
14270 NTAPI
14271 IoCsqInsertIrpEx(
14272 _Inout_ PIO_CSQ Csq,
14273 _Inout_ PIRP Irp,
14274 _Out_opt_ PIO_CSQ_IRP_CONTEXT Context,
14275 _In_opt_ PVOID InsertContext);
14276 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
14277
14278
14279 #if (NTDDI_VERSION >= NTDDI_VISTA)
14280 NTKERNELAPI
14281 NTSTATUS
14282 NTAPI
14283 IoGetBootDiskInformationLite(
14284 _Outptr_ PBOOTDISK_INFORMATION_LITE *BootDiskInformation);
14285
14286 NTKERNELAPI
14287 NTSTATUS
14288 NTAPI
14289 IoCheckShareAccessEx(
14290 _In_ ACCESS_MASK DesiredAccess,
14291 _In_ ULONG DesiredShareAccess,
14292 _Inout_ PFILE_OBJECT FileObject,
14293 _Inout_ PSHARE_ACCESS ShareAccess,
14294 _In_ BOOLEAN Update,
14295 _In_ PBOOLEAN WritePermission);
14296
14297 NTKERNELAPI
14298 NTSTATUS
14299 NTAPI
14300 IoConnectInterruptEx(
14301 _Inout_ PIO_CONNECT_INTERRUPT_PARAMETERS Parameters);
14302
14303 NTKERNELAPI
14304 VOID
14305 NTAPI
14306 IoDisconnectInterruptEx(
14307 _In_ PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters);
14308
14309 LOGICAL
14310 NTAPI
14311 IoWithinStackLimits(
14312 _In_ ULONG_PTR RegionStart,
14313 _In_ SIZE_T RegionSize);
14314
14315 NTKERNELAPI
14316 VOID
14317 NTAPI
14318 IoSetShareAccessEx(
14319 _In_ ACCESS_MASK DesiredAccess,
14320 _In_ ULONG DesiredShareAccess,
14321 _Inout_ PFILE_OBJECT FileObject,
14322 _Out_ PSHARE_ACCESS ShareAccess,
14323 _In_ PBOOLEAN WritePermission);
14324
14325 ULONG
14326 NTAPI
14327 IoSizeofWorkItem(VOID);
14328
14329 VOID
14330 NTAPI
14331 IoInitializeWorkItem(
14332 _In_ PVOID IoObject,
14333 _Out_ PIO_WORKITEM IoWorkItem);
14334
14335 VOID
14336 NTAPI
14337 IoUninitializeWorkItem(
14338 _Inout_ PIO_WORKITEM IoWorkItem);
14339
14340 _IRQL_requires_max_(DISPATCH_LEVEL)
14341 VOID
14342 NTAPI
14343 IoQueueWorkItemEx(
14344 _Inout_ PIO_WORKITEM IoWorkItem,
14345 _In_ PIO_WORKITEM_ROUTINE_EX WorkerRoutine,
14346 _In_ WORK_QUEUE_TYPE QueueType,
14347 _In_opt_ __drv_aliasesMem PVOID Context);
14348
14349 IO_PRIORITY_HINT
14350 NTAPI
14351 IoGetIoPriorityHint(
14352 _In_ PIRP Irp);
14353
14354 NTSTATUS
14355 NTAPI
14356 IoSetIoPriorityHint(
14357 _In_ PIRP Irp,
14358 _In_ IO_PRIORITY_HINT PriorityHint);
14359
14360 NTSTATUS
14361 NTAPI
14362 IoAllocateSfioStreamIdentifier(
14363 _In_ PFILE_OBJECT FileObject,
14364 _In_ ULONG Length,
14365 _In_ PVOID Signature,
14366 _Out_ PVOID *StreamIdentifier);
14367
14368 PVOID
14369 NTAPI
14370 IoGetSfioStreamIdentifier(
14371 _In_ PFILE_OBJECT FileObject,
14372 _In_ PVOID Signature);
14373
14374 NTSTATUS
14375 NTAPI
14376 IoFreeSfioStreamIdentifier(
14377 _In_ PFILE_OBJECT FileObject,
14378 _In_ PVOID Signature);
14379
14380 _IRQL_requires_max_(DISPATCH_LEVEL)
14381 _Must_inspect_result_
14382 NTKERNELAPI
14383 NTSTATUS
14384 NTAPI
14385 IoRequestDeviceEjectEx(
14386 _In_ PDEVICE_OBJECT PhysicalDeviceObject,
14387 _In_opt_ PIO_DEVICE_EJECT_CALLBACK Callback,
14388 _In_opt_ PVOID Context,
14389 _In_opt_ PDRIVER_OBJECT DriverObject);
14390
14391 _IRQL_requires_max_(PASSIVE_LEVEL)
14392 _Must_inspect_result_
14393 NTKERNELAPI
14394 NTSTATUS
14395 NTAPI
14396 IoSetDevicePropertyData(
14397 _In_ PDEVICE_OBJECT Pdo,
14398 _In_ CONST DEVPROPKEY *PropertyKey,
14399 _In_ LCID Lcid,
14400 _In_ ULONG Flags,
14401 _In_ DEVPROPTYPE Type,
14402 _In_ ULONG Size,
14403 _In_opt_ PVOID Data);
14404
14405 _IRQL_requires_max_(PASSIVE_LEVEL)
14406 _Must_inspect_result_
14407 NTKERNELAPI
14408 NTSTATUS
14409 NTAPI
14410 IoGetDevicePropertyData(
14411 _In_ PDEVICE_OBJECT Pdo,
14412 _In_ CONST DEVPROPKEY *PropertyKey,
14413 _In_ LCID Lcid,
14414 _Reserved_ ULONG Flags,
14415 _In_ ULONG Size,
14416 _Out_ PVOID Data,
14417 _Out_ PULONG RequiredSize,
14418 _Out_ PDEVPROPTYPE Type);
14419
14420 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
14421
14422 #define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b)
14423
14424 #if (NTDDI_VERSION >= NTDDI_WS08)
14425 _IRQL_requires_max_(PASSIVE_LEVEL)
14426 _Must_inspect_result_
14427 NTKERNELAPI
14428 NTSTATUS
14429 NTAPI
14430 IoReplacePartitionUnit(
14431 _In_ PDEVICE_OBJECT TargetPdo,
14432 _In_ PDEVICE_OBJECT SparePdo,
14433 _In_ ULONG Flags);
14434 #endif
14435
14436 #if (NTDDI_VERSION >= NTDDI_WIN7)
14437
14438 NTKERNELAPI
14439 NTSTATUS
14440 NTAPI
14441 IoGetAffinityInterrupt(
14442 _In_ PKINTERRUPT InterruptObject,
14443 _Out_ PGROUP_AFFINITY GroupAffinity);
14444
14445 NTSTATUS
14446 NTAPI
14447 IoGetContainerInformation(
14448 _In_ IO_CONTAINER_INFORMATION_CLASS InformationClass,
14449 _In_opt_ PVOID ContainerObject,
14450 _Inout_updates_bytes_opt_(BufferLength) PVOID Buffer,
14451 _In_ ULONG BufferLength);
14452
14453 NTSTATUS
14454 NTAPI
14455 IoRegisterContainerNotification(
14456 _In_ IO_CONTAINER_NOTIFICATION_CLASS NotificationClass,
14457 _In_ PIO_CONTAINER_NOTIFICATION_FUNCTION CallbackFunction,
14458 _In_reads_bytes_opt_(NotificationInformationLength) PVOID NotificationInformation,
14459 _In_ ULONG NotificationInformationLength,
14460 _Out_ PVOID CallbackRegistration);
14461
14462 VOID
14463 NTAPI
14464 IoUnregisterContainerNotification(
14465 _In_ PVOID CallbackRegistration);
14466
14467 _IRQL_requires_max_(PASSIVE_LEVEL)
14468 __drv_freesMem(Pool)
14469 NTKERNELAPI
14470 NTSTATUS
14471 NTAPI
14472 IoUnregisterPlugPlayNotificationEx(
14473 _In_ PVOID NotificationEntry);
14474
14475 _IRQL_requires_max_(PASSIVE_LEVEL)
14476 _Must_inspect_result_
14477 NTKERNELAPI
14478 NTSTATUS
14479 NTAPI
14480 IoGetDeviceNumaNode(
14481 _In_ PDEVICE_OBJECT Pdo,
14482 _Out_ PUSHORT NodeNumber);
14483
14484 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
14485
14486 #if defined(_WIN64)
14487 NTKERNELAPI
14488 ULONG
14489 NTAPI
14490 IoWMIDeviceObjectToProviderId(
14491 _In_ PDEVICE_OBJECT DeviceObject);
14492 #else
14493 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
14494 #endif
14495
14496 /*
14497 * USHORT
14498 * IoSizeOfIrp(
14499 * IN CCHAR StackSize)
14500 */
14501 #define IoSizeOfIrp(_StackSize) \
14502 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
14503
14504 FORCEINLINE
14505 VOID
14506 IoSkipCurrentIrpStackLocation(
14507 _Inout_ PIRP Irp)
14508 {
14509 ASSERT(Irp->CurrentLocation <= Irp->StackCount);
14510 Irp->CurrentLocation++;
14511 #ifdef NONAMELESSUNION
14512 Irp->Tail.Overlay.s.u.CurrentStackLocation++;
14513 #else
14514 Irp->Tail.Overlay.CurrentStackLocation++;
14515 #endif
14516 }
14517
14518 FORCEINLINE
14519 VOID
14520 IoSetNextIrpStackLocation(
14521 _Inout_ PIRP Irp)
14522 {
14523 ASSERT(Irp->CurrentLocation > 0);
14524 Irp->CurrentLocation--;
14525 #ifdef NONAMELESSUNION
14526 Irp->Tail.Overlay.s.u.CurrentStackLocation--;
14527 #else
14528 Irp->Tail.Overlay.CurrentStackLocation--;
14529 #endif
14530 }
14531
14532 __drv_aliasesMem
14533 FORCEINLINE
14534 PIO_STACK_LOCATION
14535 IoGetNextIrpStackLocation(
14536 _In_ PIRP Irp)
14537 {
14538 ASSERT(Irp->CurrentLocation > 0);
14539 #ifdef NONAMELESSUNION
14540 return ((Irp)->Tail.Overlay.s.u.CurrentStackLocation - 1 );
14541 #else
14542 return ((Irp)->Tail.Overlay.CurrentStackLocation - 1 );
14543 #endif
14544 }
14545
14546 _IRQL_requires_max_(DISPATCH_LEVEL)
14547 FORCEINLINE
14548 VOID
14549 IoSetCompletionRoutine(
14550 _In_ PIRP Irp,
14551 _In_opt_ PIO_COMPLETION_ROUTINE CompletionRoutine,
14552 _In_opt_ __drv_aliasesMem PVOID Context,
14553 _In_ BOOLEAN InvokeOnSuccess,
14554 _In_ BOOLEAN InvokeOnError,
14555 _In_ BOOLEAN InvokeOnCancel)
14556 {
14557 PIO_STACK_LOCATION irpSp;
14558 ASSERT( (InvokeOnSuccess || InvokeOnError || InvokeOnCancel) ? (CompletionRoutine != NULL) : TRUE );
14559 irpSp = IoGetNextIrpStackLocation(Irp);
14560 irpSp->CompletionRoutine = CompletionRoutine;
14561 irpSp->Context = Context;
14562 irpSp->Control = 0;
14563
14564 if (InvokeOnSuccess) {
14565 irpSp->Control = SL_INVOKE_ON_SUCCESS;
14566 }
14567
14568 if (InvokeOnError) {
14569 irpSp->Control |= SL_INVOKE_ON_ERROR;
14570 }
14571
14572 if (InvokeOnCancel) {
14573 irpSp->Control |= SL_INVOKE_ON_CANCEL;
14574 }
14575 }
14576
14577 _IRQL_requires_max_(DISPATCH_LEVEL)
14578 _Ret_maybenull_
14579 FORCEINLINE
14580 PDRIVER_CANCEL
14581 IoSetCancelRoutine(
14582 _Inout_ PIRP Irp,
14583 _In_opt_ PDRIVER_CANCEL CancelRoutine)
14584 {
14585 return (PDRIVER_CANCEL)(ULONG_PTR) InterlockedExchangePointer((PVOID *)&(Irp)->CancelRoutine, (PVOID)(ULONG_PTR)(CancelRoutine));
14586 }
14587
14588 FORCEINLINE
14589 VOID
14590 IoRequestDpc(
14591 _Inout_ PDEVICE_OBJECT DeviceObject,
14592 _In_opt_ PIRP Irp,
14593 _In_opt_ __drv_aliasesMem PVOID Context)
14594 {
14595 KeInsertQueueDpc(&DeviceObject->Dpc, Irp, Context);
14596 }
14597
14598 /*
14599 * VOID
14600 * IoReleaseRemoveLock(
14601 * IN PIO_REMOVE_LOCK RemoveLock,
14602 * IN PVOID Tag)
14603 */
14604 #define IoReleaseRemoveLock(_RemoveLock, \
14605 _Tag) \
14606 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
14607
14608 /*
14609 * VOID
14610 * IoReleaseRemoveLockAndWait(
14611 * IN PIO_REMOVE_LOCK RemoveLock,
14612 * IN PVOID Tag)
14613 */
14614 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
14615 _Tag) \
14616 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
14617
14618 #if defined(_WIN64)
14619 _IRQL_requires_max_(DISPATCH_LEVEL)
14620 NTKERNELAPI
14621 BOOLEAN
14622 IoIs32bitProcess(
14623 _In_opt_ PIRP Irp);
14624 #endif
14625
14626 #define PLUGPLAY_REGKEY_DEVICE 1
14627 #define PLUGPLAY_REGKEY_DRIVER 2
14628 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
14629
14630 __drv_aliasesMem
14631 FORCEINLINE
14632 PIO_STACK_LOCATION
14633 IoGetCurrentIrpStackLocation(
14634 _In_ PIRP Irp)
14635 {
14636 ASSERT(Irp->CurrentLocation <= Irp->StackCount + 1);
14637 #ifdef NONAMELESSUNION
14638 return Irp->Tail.Overlay.s.u.CurrentStackLocation;
14639 #else
14640 return Irp->Tail.Overlay.CurrentStackLocation;
14641 #endif
14642 }
14643
14644 FORCEINLINE
14645 VOID
14646 IoMarkIrpPending(
14647 _Inout_ PIRP Irp)
14648 {
14649 IoGetCurrentIrpStackLocation((Irp))->Control |= SL_PENDING_RETURNED;
14650 }
14651
14652 /*
14653 * BOOLEAN
14654 * IoIsErrorUserInduced(
14655 * IN NTSTATUS Status);
14656 */
14657 #define IoIsErrorUserInduced(Status) \
14658 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
14659 ((Status) == STATUS_IO_TIMEOUT) || \
14660 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
14661 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
14662 ((Status) == STATUS_VERIFY_REQUIRED) || \
14663 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
14664 ((Status) == STATUS_WRONG_VOLUME)))
14665
14666 /* VOID
14667 * IoInitializeRemoveLock(
14668 * IN PIO_REMOVE_LOCK Lock,
14669 * IN ULONG AllocateTag,
14670 * IN ULONG MaxLockedMinutes,
14671 * IN ULONG HighWatermark)
14672 */
14673 #define IoInitializeRemoveLock( \
14674 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
14675 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
14676 HighWatermark, sizeof(IO_REMOVE_LOCK))
14677
14678 FORCEINLINE
14679 VOID
14680 IoInitializeDpcRequest(
14681 _In_ PDEVICE_OBJECT DeviceObject,
14682 _In_ PIO_DPC_ROUTINE DpcRoutine)
14683 {
14684 #ifdef _MSC_VER
14685 #pragma warning(push)
14686 #pragma warning(disable:28024)
14687 #endif
14688 KeInitializeDpc(&DeviceObject->Dpc,
14689 (PKDEFERRED_ROUTINE) DpcRoutine,
14690 DeviceObject);
14691 #ifdef _MSC_VER
14692 #pragma warning(pop)
14693 #endif
14694 }
14695
14696 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
14697
14698 /*
14699 * ULONG
14700 * IoGetFunctionCodeFromCtlCode(
14701 * IN ULONG ControlCode)
14702 */
14703 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
14704 (((_ControlCode) >> 2) & 0x00000FFF)
14705
14706 FORCEINLINE
14707 VOID
14708 IoCopyCurrentIrpStackLocationToNext(
14709 _Inout_ PIRP Irp)
14710 {
14711 PIO_STACK_LOCATION irpSp;
14712 PIO_STACK_LOCATION nextIrpSp;
14713 irpSp = IoGetCurrentIrpStackLocation(Irp);
14714 nextIrpSp = IoGetNextIrpStackLocation(Irp);
14715 RtlCopyMemory(nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine));
14716 nextIrpSp->Control = 0;
14717 }
14718
14719 _IRQL_requires_max_(APC_LEVEL)
14720 NTKERNELAPI
14721 VOID
14722 NTAPI
14723 IoGetStackLimits(
14724 _Out_ PULONG_PTR LowLimit,
14725 _Out_ PULONG_PTR HighLimit);
14726
14727 _IRQL_requires_max_(APC_LEVEL)
14728 FORCEINLINE
14729 ULONG_PTR
14730 IoGetRemainingStackSize(VOID)
14731 {
14732 ULONG_PTR End, Begin;
14733 ULONG_PTR Result;
14734
14735 IoGetStackLimits(&Begin, &End);
14736 Result = (ULONG_PTR)(&End) - Begin;
14737 return Result;
14738 }
14739
14740 #if (NTDDI_VERSION >= NTDDI_WS03)
14741 FORCEINLINE
14742 VOID
14743 IoInitializeThreadedDpcRequest(
14744 _In_ PDEVICE_OBJECT DeviceObject,
14745 _In_ PIO_DPC_ROUTINE DpcRoutine)
14746 {
14747 #ifdef _MSC_VER
14748 #pragma warning(push)
14749 #pragma warning(disable:28024)
14750 #pragma warning(disable:28128)
14751 #endif
14752 KeInitializeThreadedDpc(&DeviceObject->Dpc,
14753 (PKDEFERRED_ROUTINE) DpcRoutine,
14754 DeviceObject );
14755 #ifdef _MSC_VER
14756 #pragma warning(pop)
14757 #endif
14758 }
14759 #endif
14760
14761 /******************************************************************************
14762 * Power Management Support Functions *
14763 ******************************************************************************/
14764
14765 #define PoSetDeviceBusy(IdlePointer) ((void)(*(IdlePointer) = 0))
14766
14767 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14768
14769 _IRQL_requires_max_(DISPATCH_LEVEL)
14770 NTKERNELAPI
14771 NTSTATUS
14772 NTAPI
14773 PoCallDriver(
14774 _In_ struct _DEVICE_OBJECT *DeviceObject,
14775 _Inout_ __drv_aliasesMem struct _IRP *Irp);
14776
14777 _IRQL_requires_max_(APC_LEVEL)
14778 NTKERNELAPI
14779 PULONG
14780 NTAPI
14781 PoRegisterDeviceForIdleDetection(
14782 _In_ struct _DEVICE_OBJECT *DeviceObject,
14783 _In_ ULONG ConservationIdleTime,
14784 _In_ ULONG PerformanceIdleTime,
14785 _In_ DEVICE_POWER_STATE State);
14786
14787 _IRQL_requires_max_(APC_LEVEL)
14788 NTKERNELAPI
14789 PVOID
14790 NTAPI
14791 PoRegisterSystemState(
14792 _Inout_opt_ PVOID StateHandle,
14793 _In_ EXECUTION_STATE Flags);
14794
14795 _IRQL_requires_max_(DISPATCH_LEVEL)
14796 NTKERNELAPI
14797 NTSTATUS
14798 NTAPI
14799 PoRequestPowerIrp(
14800 _In_ struct _DEVICE_OBJECT *DeviceObject,
14801 _In_ UCHAR MinorFunction,
14802 _In_ POWER_STATE PowerState,
14803 _In_opt_ PREQUEST_POWER_COMPLETE CompletionFunction,
14804 _In_opt_ __drv_aliasesMem PVOID Context,
14805 _Outptr_opt_ struct _IRP **Irp);
14806
14807 _IRQL_requires_max_(DISPATCH_LEVEL)
14808 NTKERNELAPI
14809 POWER_STATE
14810 NTAPI
14811 PoSetPowerState(
14812 _In_ struct _DEVICE_OBJECT *DeviceObject,
14813 _In_ POWER_STATE_TYPE Type,
14814 _In_ POWER_STATE State);
14815
14816 _IRQL_requires_max_(DISPATCH_LEVEL)
14817 NTKERNELAPI
14818 VOID
14819 NTAPI
14820 PoSetSystemState(
14821 _In_ EXECUTION_STATE Flags);
14822
14823 _IRQL_requires_max_(DISPATCH_LEVEL)
14824 NTKERNELAPI
14825 VOID
14826 NTAPI
14827 PoStartNextPowerIrp(
14828 _Inout_ struct _IRP *Irp);
14829
14830 _IRQL_requires_max_(APC_LEVEL)
14831 NTKERNELAPI
14832 VOID
14833 NTAPI
14834 PoUnregisterSystemState(
14835 _Inout_ PVOID StateHandle);
14836
14837 NTKERNELAPI
14838 NTSTATUS
14839 NTAPI
14840 PoRequestShutdownEvent(
14841 OUT PVOID *Event);
14842
14843 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
14844
14845 #if (NTDDI_VERSION >= NTDDI_VISTA)
14846
14847 _IRQL_requires_max_(DISPATCH_LEVEL)
14848 NTKERNELAPI
14849 VOID
14850 NTAPI
14851 PoSetSystemWake(
14852 _Inout_ struct _IRP *Irp);
14853
14854 _IRQL_requires_max_(DISPATCH_LEVEL)
14855 NTKERNELAPI
14856 BOOLEAN
14857 NTAPI
14858 PoGetSystemWake(
14859 _In_ struct _IRP *Irp);
14860
14861 _IRQL_requires_max_(APC_LEVEL)
14862 NTKERNELAPI
14863 NTSTATUS
14864 NTAPI
14865 PoRegisterPowerSettingCallback(
14866 _In_opt_ PDEVICE_OBJECT DeviceObject,
14867 _In_ LPCGUID SettingGuid,
14868 _In_ PPOWER_SETTING_CALLBACK Callback,
14869 _In_opt_ PVOID Context,
14870 _Outptr_opt_ PVOID *Handle);
14871
14872 _IRQL_requires_max_(APC_LEVEL)
14873 NTKERNELAPI
14874 NTSTATUS
14875 NTAPI
14876 PoUnregisterPowerSettingCallback(
14877 _Inout_ PVOID Handle);
14878
14879 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
14880
14881 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
14882 NTKERNELAPI
14883 VOID
14884 NTAPI
14885 PoSetDeviceBusyEx(
14886 _Inout_ PULONG IdlePointer);
14887 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
14888
14889 #if (NTDDI_VERSION >= NTDDI_WIN7)
14890
14891 NTKERNELAPI
14892 VOID
14893 NTAPI
14894 PoStartDeviceBusy(
14895 _Inout_ PULONG IdlePointer);
14896
14897 NTKERNELAPI
14898 VOID
14899 NTAPI
14900 PoEndDeviceBusy(
14901 _Inout_ PULONG IdlePointer);
14902
14903 _IRQL_requires_max_(DISPATCH_LEVEL)
14904 NTKERNELAPI
14905 BOOLEAN
14906 NTAPI
14907 PoQueryWatchdogTime(
14908 _In_ PDEVICE_OBJECT Pdo,
14909 _Out_ PULONG SecondsRemaining);
14910
14911 _IRQL_requires_max_(APC_LEVEL)
14912 NTKERNELAPI
14913 VOID
14914 NTAPI
14915 PoDeletePowerRequest(
14916 _Inout_ PVOID PowerRequest);
14917
14918 _IRQL_requires_max_(DISPATCH_LEVEL)
14919 NTKERNELAPI
14920 NTSTATUS
14921 NTAPI
14922 PoSetPowerRequest(
14923 _Inout_ PVOID PowerRequest,
14924 _In_ POWER_REQUEST_TYPE Type);
14925
14926 _IRQL_requires_max_(DISPATCH_LEVEL)
14927 NTKERNELAPI
14928 NTSTATUS
14929 NTAPI
14930 PoClearPowerRequest(
14931 _Inout_ PVOID PowerRequest,
14932 _In_ POWER_REQUEST_TYPE Type);
14933
14934 _IRQL_requires_max_(APC_LEVEL)
14935 NTKERNELAPI
14936 NTSTATUS
14937 NTAPI
14938 PoCreatePowerRequest(
14939 _Outptr_ PVOID *PowerRequest,
14940 _In_ PDEVICE_OBJECT DeviceObject,
14941 _In_opt_ PCOUNTED_REASON_CONTEXT Context);
14942
14943 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
14944
14945 /******************************************************************************
14946 * Executive Functions *
14947 ******************************************************************************/
14948
14949 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
14950 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
14951 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
14952
14953 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
14954 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
14955 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
14956 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
14957
14958 #define ExInitializeSListHead InitializeSListHead
14959
14960 #if defined(_NTHAL_) && defined(_X86_)
14961
14962 NTKERNELAPI
14963 VOID
14964 FASTCALL
14965 ExiAcquireFastMutex(
14966 IN OUT PFAST_MUTEX FastMutex);
14967
14968 NTKERNELAPI
14969 VOID
14970 FASTCALL
14971 ExiReleaseFastMutex(
14972 IN OUT PFAST_MUTEX FastMutex);
14973
14974 NTKERNELAPI
14975 BOOLEAN
14976 FASTCALL
14977 ExiTryToAcquireFastMutex(
14978 IN OUT PFAST_MUTEX FastMutex);
14979
14980 #define ExAcquireFastMutex ExiAcquireFastMutex
14981 #define ExReleaseFastMutex ExiReleaseFastMutex
14982 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
14983
14984 #else
14985
14986 #if (NTDDI_VERSION >= NTDDI_WIN2K)
14987
14988 _IRQL_raises_(APC_LEVEL)
14989 _IRQL_saves_global_(OldIrql, FastMutex)
14990 NTKERNELAPI
14991 VOID
14992 FASTCALL
14993 ExAcquireFastMutex(
14994 _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_)
14995 PFAST_MUTEX FastMutex);
14996
14997 _IRQL_requires_(APC_LEVEL)
14998 _IRQL_restores_global_(OldIrql, FastMutex)
14999 NTKERNELAPI
15000 VOID
15001 FASTCALL
15002 ExReleaseFastMutex(
15003 _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_)
15004 PFAST_MUTEX FastMutex);
15005
15006 _Must_inspect_result_
15007 _Success_(return!=FALSE)
15008 _IRQL_raises_(APC_LEVEL)
15009 _IRQL_saves_global_(OldIrql, FastMutex)
15010 NTKERNELAPI
15011 BOOLEAN
15012 FASTCALL
15013 ExTryToAcquireFastMutex(
15014 _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_)
15015 PFAST_MUTEX FastMutex);
15016
15017 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15018
15019 #endif /* defined(_NTHAL_) && defined(_X86_) */
15020
15021 #if defined(_X86_)
15022 #define ExInterlockedAddUlong ExfInterlockedAddUlong
15023 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
15024 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
15025 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
15026 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
15027 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
15028 #endif /* defined(_X86_) */
15029
15030 #ifdef _X86_
15031
15032 #ifdef _WIN2K_COMPAT_SLIST_USAGE
15033
15034 NTKERNELAPI
15035 PSLIST_ENTRY
15036 FASTCALL
15037 ExInterlockedPushEntrySList(
15038 _Inout_ PSLIST_HEADER SListHead,
15039 _Inout_ __drv_aliasesMem PSLIST_ENTRY SListEntry,
15040 _Inout_opt_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
15041
15042 NTKERNELAPI
15043 PSLIST_ENTRY
15044 FASTCALL
15045 ExInterlockedPopEntrySList(
15046 _Inout_ PSLIST_HEADER SListHead,
15047 _Inout_opt_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
15048
15049 #else /* !_WIN2K_COMPAT_SLIST_USAGE */
15050
15051 #define ExInterlockedPushEntrySList(SListHead, SListEntry, Lock) \
15052 InterlockedPushEntrySList(SListHead, SListEntry)
15053
15054 #define ExInterlockedPopEntrySList(SListHead, Lock) \
15055 InterlockedPopEntrySList(SListHead)
15056
15057 #endif /* _WIN2K_COMPAT_SLIST_USAGE */
15058
15059 NTKERNELAPI
15060 PSLIST_ENTRY
15061 FASTCALL
15062 ExInterlockedFlushSList(
15063 _Inout_ PSLIST_HEADER SListHead);
15064
15065 #ifdef NONAMELESSUNION
15066 #define ExQueryDepthSList(SListHead) (SListHead)->s.Depth
15067 #else
15068 #define ExQueryDepthSList(SListHead) (SListHead)->Depth
15069 #endif
15070
15071 #else /* !_X86_ */
15072
15073 NTKERNELAPI
15074 PSLIST_ENTRY
15075 ExpInterlockedPushEntrySList(
15076 _Inout_ PSLIST_HEADER SListHead,
15077 _Inout_ __drv_aliasesMem PSLIST_ENTRY SListEntry);
15078
15079 NTKERNELAPI
15080 PSLIST_ENTRY
15081 ExpInterlockedPopEntrySList(
15082 _Inout_ PSLIST_HEADER SListHead);
15083
15084 NTKERNELAPI
15085 PSLIST_ENTRY
15086 ExpInterlockedFlushSList(
15087 _Inout_ PSLIST_HEADER SListHead);
15088
15089 #if !defined(_NTSYSTEM_) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
15090 NTKERNELAPI
15091 USHORT
15092 ExQueryDepthSList(_In_ PSLIST_HEADER SListHead);
15093 #else
15094 FORCEINLINE
15095 USHORT
15096 ExQueryDepthSList(_In_ PSLIST_HEADER SListHead)
15097 {
15098 #ifdef _WIN64
15099 return (USHORT)(SListHead->Alignment & 0xffff);
15100 #else /* !_WIN64 */
15101 return (USHORT)SListHead->Depth;
15102 #endif /* _WIN64 */
15103 }
15104 #endif
15105
15106 #define ExInterlockedPushEntrySList(SListHead, SListEntry, Lock) \
15107 ExpInterlockedPushEntrySList(SListHead, SListEntry)
15108
15109 #define ExInterlockedPopEntrySList(SListHead, Lock) \
15110 ExpInterlockedPopEntrySList(SListHead)
15111
15112 #define ExInterlockedFlushSList(SListHead) \
15113 ExpInterlockedFlushSList(SListHead)
15114
15115 #endif /* _X86_ */
15116
15117
15118 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
15119
15120 _IRQL_requires_max_(APC_LEVEL)
15121 NTKERNELAPI
15122 PVOID
15123 NTAPI
15124 ExAllocateFromPagedLookasideList(
15125 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside);
15126
15127 _IRQL_requires_max_(APC_LEVEL)
15128 NTKERNELAPI
15129 VOID
15130 NTAPI
15131 ExFreeToPagedLookasideList(
15132 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside,
15133 _In_ PVOID Entry);
15134
15135 #else /* !_WIN2K_COMPAT_SLIST_USAGE */
15136
15137 _IRQL_requires_max_(APC_LEVEL)
15138 static __inline
15139 PVOID
15140 ExAllocateFromPagedLookasideList(
15141 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside)
15142 {
15143 PVOID Entry;
15144
15145 Lookaside->L.TotalAllocates++;
15146 #ifdef NONAMELESSUNION
15147 Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
15148 if (Entry == NULL) {
15149 Lookaside->L.u2.AllocateMisses++;
15150 Entry = (Lookaside->L.u4.Allocate)(Lookaside->L.Type,
15151 Lookaside->L.Size,
15152 Lookaside->L.Tag);
15153 }
15154 #else /* NONAMELESSUNION */
15155 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
15156 if (Entry == NULL) {
15157 Lookaside->L.AllocateMisses++;
15158 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
15159 Lookaside->L.Size,
15160 Lookaside->L.Tag);
15161 }
15162 #endif /* NONAMELESSUNION */
15163 return Entry;
15164 }
15165
15166 _IRQL_requires_max_(APC_LEVEL)
15167 static __inline
15168 VOID
15169 ExFreeToPagedLookasideList(
15170 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside,
15171 _In_ PVOID Entry)
15172 {
15173 Lookaside->L.TotalFrees++;
15174 #ifdef NONAMELESSUNION
15175 if (ExQueryDepthSList(&Lookaside->L.u.ListHead) >= Lookaside->L.Depth) {
15176 Lookaside->L.u3.FreeMisses++;
15177 (Lookaside->L.u5.Free)(Entry);
15178 } else {
15179 InterlockedPushEntrySList(&Lookaside->L.u.ListHead, (PSLIST_ENTRY)Entry);
15180 }
15181 #else /* NONAMELESSUNION */
15182 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
15183 Lookaside->L.FreeMisses++;
15184 (Lookaside->L.Free)(Entry);
15185 } else {
15186 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
15187 }
15188 #endif /* NONAMELESSUNION */
15189 }
15190
15191 #endif /* _WIN2K_COMPAT_SLIST_USAGE */
15192
15193
15194 /* ERESOURCE_THREAD
15195 * ExGetCurrentResourceThread(
15196 * VOID);
15197 */
15198 #define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread())
15199
15200 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
15201
15202 /* VOID
15203 * ExInitializeWorkItem(
15204 * IN PWORK_QUEUE_ITEM Item,
15205 * IN PWORKER_THREAD_ROUTINE Routine,
15206 * IN PVOID Context)
15207 */
15208 #define ExInitializeWorkItem(Item, Routine, Context) \
15209 { \
15210 (Item)->WorkerRoutine = Routine; \
15211 (Item)->Parameter = Context; \
15212 (Item)->List.Flink = NULL; \
15213 }
15214
15215 FORCEINLINE
15216 VOID
15217 ExInitializeFastMutex(
15218 _Out_ PFAST_MUTEX FastMutex)
15219 {
15220 FastMutex->Count = FM_LOCK_BIT;
15221 FastMutex->Owner = NULL;
15222 FastMutex->Contention = 0;
15223 KeInitializeEvent(&FastMutex->Event, SynchronizationEvent, FALSE);
15224 return;
15225 }
15226
15227
15228 #if (NTDDI_VERSION >= NTDDI_WIN2K)
15229 _IRQL_requires_max_(APC_LEVEL)
15230 _Requires_lock_held_(_Global_critical_region_)
15231 NTKERNELAPI
15232 VOID
15233 FASTCALL
15234 ExAcquireFastMutexUnsafe(
15235 _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_)
15236 PFAST_MUTEX FastMutex);
15237
15238 _IRQL_requires_max_(APC_LEVEL)
15239 _Requires_lock_held_(_Global_critical_region_)
15240 NTKERNELAPI
15241 VOID
15242 FASTCALL
15243 ExReleaseFastMutexUnsafe(
15244 _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_)
15245 PFAST_MUTEX FastMutex);
15246
15247 _Requires_lock_held_(_Global_critical_region_)
15248 _Requires_lock_not_held_(*Resource)
15249 _When_(Wait!=0, _Acquires_exclusive_lock_(*Resource))
15250 _IRQL_requires_max_(APC_LEVEL)
15251 _When_(Wait!=0, _Post_satisfies_(return == 1))
15252 _When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_)
15253 NTKERNELAPI
15254 BOOLEAN
15255 NTAPI
15256 ExAcquireResourceExclusiveLite(
15257 _Inout_ PERESOURCE Resource,
15258 _In_ _Literal_ BOOLEAN Wait);
15259
15260 _IRQL_requires_max_(APC_LEVEL)
15261 _Requires_lock_held_(_Global_critical_region_)
15262 _When_(Wait!=0, _Post_satisfies_(return == 1))
15263 _When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_)
15264 NTKERNELAPI
15265 BOOLEAN
15266 NTAPI
15267 ExAcquireResourceSharedLite(
15268 _Inout_ _Requires_lock_not_held_(*_Curr_)
15269 _When_(return!=0, _Acquires_shared_lock_(*_Curr_))
15270 PERESOURCE Resource,
15271 _In_ BOOLEAN Wait);
15272
15273 _IRQL_requires_max_(APC_LEVEL)
15274 _Requires_lock_held_(_Global_critical_region_)
15275 _When_(Wait!=0, _Post_satisfies_(return == 1))
15276 _When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_)
15277 NTKERNELAPI
15278 BOOLEAN
15279 NTAPI
15280 ExAcquireSharedStarveExclusive(
15281 _Inout_ _Requires_lock_not_held_(*_Curr_)
15282 _When_(return!=0, _Acquires_shared_lock_(*_Curr_))
15283 PERESOURCE Resource,
15284 _In_ BOOLEAN Wait);
15285
15286 _IRQL_requires_max_(APC_LEVEL)
15287 _Requires_lock_held_(_Global_critical_region_)
15288 _When_(Wait!=0, _Post_satisfies_(return == 1))
15289 _When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_)
15290 NTKERNELAPI
15291 BOOLEAN
15292 NTAPI
15293 ExAcquireSharedWaitForExclusive(
15294 _Inout_ _Requires_lock_not_held_(*_Curr_)
15295 _When_(return!=0, _Acquires_lock_(*_Curr_))
15296 PERESOURCE Resource,
15297 _In_ BOOLEAN Wait);
15298
15299 __drv_preferredFunction("ExAllocatePoolWithTag",
15300 "No tag interferes with debugging.")
15301 __drv_allocatesMem(Mem)
15302 _When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL))
15303 _When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL))
15304 _When_((PoolType & NonPagedPoolMustSucceed) != 0,
15305 __drv_reportError("Must succeed pool allocations are forbidden. "
15306 "Allocation failures cause a system crash"))
15307 _When_((PoolType & (NonPagedPoolMustSucceed |
15308 POOL_RAISE_IF_ALLOCATION_FAILURE)) == 0,
15309 _Post_maybenull_ _Must_inspect_result_)
15310 _When_((PoolType & (NonPagedPoolMustSucceed |
15311 POOL_RAISE_IF_ALLOCATION_FAILURE)) != 0,
15312 _Post_notnull_)
15313 _Post_writable_byte_size_(NumberOfBytes)
15314 NTKERNELAPI
15315 PVOID
15316 NTAPI
15317 ExAllocatePool(
15318 __drv_strictTypeMatch(__drv_typeExpr) _In_ POOL_TYPE PoolType,
15319 _In_ SIZE_T NumberOfBytes);
15320
15321 __drv_preferredFunction("ExAllocatePoolWithQuotaTag",
15322 "No tag interferes with debugging.")
15323 __drv_allocatesMem(Mem)
15324 _When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL))
15325 _When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL))
15326 _When_((PoolType & NonPagedPoolMustSucceed) != 0,
15327 __drv_reportError("Must succeed pool allocations are forbidden. "
15328 "Allocation failures cause a system crash"))
15329 _When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) != 0,
15330 _Post_maybenull_ _Must_inspect_result_)
15331 _When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) == 0, _Post_notnull_)
15332 _Post_writable_byte_size_(NumberOfBytes)
15333 NTKERNELAPI
15334 PVOID
15335 NTAPI
15336 ExAllocatePoolWithQuota(
15337 __drv_strictTypeMatch(__drv_typeExpr) _In_ POOL_TYPE PoolType,
15338 _In_ SIZE_T NumberOfBytes);
15339
15340 __drv_allocatesMem(Mem)
15341 _When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL))
15342 _When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL))
15343 _When_((PoolType & NonPagedPoolMustSucceed) != 0,
15344 __drv_reportError("Must succeed pool allocations are forbidden. "
15345 "Allocation failures cause a system crash"))
15346 _When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) != 0,
15347 _Post_maybenull_ _Must_inspect_result_)
15348 _When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) == 0, _Post_notnull_)
15349 _Post_writable_byte_size_(NumberOfBytes)
15350 NTKERNELAPI
15351 PVOID
15352 NTAPI
15353 ExAllocatePoolWithQuotaTag(
15354 _In_ __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType,
15355 _In_ SIZE_T NumberOfBytes,
15356 _In_ ULONG Tag);
15357
15358 #ifndef POOL_TAGGING
15359 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
15360 #endif
15361
15362 __drv_allocatesMem(Mem)
15363 _When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL))
15364 _When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL))
15365 _When_((PoolType & NonPagedPoolMustSucceed) != 0,
15366 __drv_reportError("Must succeed pool allocations are forbidden. "
15367 "Allocation failures cause a system crash"))
15368 _When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) == 0,
15369 _Post_maybenull_ _Must_inspect_result_)
15370 _When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) != 0,
15371 _Post_notnull_)
15372 _Post_writable_byte_size_(NumberOfBytes)
15373 _Function_class_(ALLOCATE_FUNCTION)
15374 NTKERNELAPI
15375 PVOID
15376 NTAPI
15377 ExAllocatePoolWithTag(
15378 _In_ __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType,
15379 _In_ SIZE_T NumberOfBytes,
15380 _In_ ULONG Tag);
15381
15382 #ifndef POOL_TAGGING
15383 #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
15384 #endif
15385
15386 __drv_allocatesMem(Mem)
15387 _When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL))
15388 _When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL))
15389 _When_((PoolType & NonPagedPoolMustSucceed) != 0,
15390 __drv_reportError("Must succeed pool allocations are forbidden. "
15391 "Allocation failures cause a system crash"))
15392 _When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) == 0,
15393 _Post_maybenull_ _Must_inspect_result_)
15394 _When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) != 0,
15395 _Post_notnull_)
15396 _Post_writable_byte_size_(NumberOfBytes)
15397 NTKERNELAPI
15398 PVOID
15399 NTAPI
15400 ExAllocatePoolWithTagPriority(
15401 _In_ __drv_strictTypeMatch(__drv_typeCond) POOL_TYPE PoolType,
15402 _In_ SIZE_T NumberOfBytes,
15403 _In_ ULONG Tag,
15404 _In_ __drv_strictTypeMatch(__drv_typeExpr) EX_POOL_PRIORITY Priority);
15405
15406 _IRQL_requires_max_(DISPATCH_LEVEL)
15407 NTKERNELAPI
15408 VOID
15409 NTAPI
15410 ExConvertExclusiveToSharedLite(
15411 _Inout_ _Requires_lock_held_(*_Curr_) PERESOURCE Resource);
15412
15413 _IRQL_requires_max_(APC_LEVEL)
15414 NTKERNELAPI
15415 NTSTATUS
15416 NTAPI
15417 ExCreateCallback(
15418 _Outptr_ PCALLBACK_OBJECT *CallbackObject,
15419 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
15420 _In_ BOOLEAN Create,
15421 _In_ BOOLEAN AllowMultipleCallbacks);
15422
15423 NTKERNELAPI
15424 VOID
15425 NTAPI
15426 ExDeleteNPagedLookasideList(
15427 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside);
15428
15429 _IRQL_requires_max_(APC_LEVEL)
15430 NTKERNELAPI
15431 VOID
15432 NTAPI
15433 ExDeletePagedLookasideList(
15434 _Inout_ PPAGED_LOOKASIDE_LIST Lookaside);
15435
15436 _IRQL_requires_max_(DISPATCH_LEVEL)
15437 NTKERNELAPI
15438 NTSTATUS
15439 NTAPI
15440 ExDeleteResourceLite(
15441 _Inout_ PERESOURCE Resource);
15442
15443 _IRQL_requires_max_(DISPATCH_LEVEL)
15444 _Function_class_(FREE_FUNCTION)
15445 NTKERNELAPI
15446 VOID
15447 NTAPI
15448 ExFreePool(
15449 _Pre_notnull_ __drv_freesMem(Mem) PVOID P);
15450
15451 _IRQL_requires_max_(DISPATCH_LEVEL)
15452 NTKERNELAPI
15453 VOID
15454 NTAPI
15455 ExFreePoolWithTag(
15456 _Pre_notnull_ __drv_freesMem(Mem) PVOID P,
15457 _In_ ULONG Tag);
15458
15459 _IRQL_requires_max_(DISPATCH_LEVEL)
15460 NTKERNELAPI
15461 ULONG
15462 NTAPI
15463 ExGetExclusiveWaiterCount(
15464 _In_ PERESOURCE Resource);
15465
15466 _IRQL_requires_max_(DISPATCH_LEVEL)
15467 NTKERNELAPI
15468 KPROCESSOR_MODE
15469 NTAPI
15470 ExGetPreviousMode(VOID);
15471
15472 _IRQL_requires_max_(DISPATCH_LEVEL)
15473 NTKERNELAPI
15474 ULONG
15475 NTAPI
15476 ExGetSharedWaiterCount(
15477 _In_ PERESOURCE Resource);
15478
15479 _IRQL_requires_max_(DISPATCH_LEVEL)
15480 NTKERNELAPI
15481 VOID
15482 NTAPI
15483 ExInitializeNPagedLookasideList(
15484 _Out_ PNPAGED_LOOKASIDE_LIST Lookaside,
15485 _In_opt_ PALLOCATE_FUNCTION Allocate,
15486 _In_opt_ PFREE_FUNCTION Free,
15487 _In_ ULONG Flags,
15488 _In_ SIZE_T Size,
15489 _In_ ULONG Tag,
15490 _In_ USHORT Depth);
15491
15492 _IRQL_requires_max_(APC_LEVEL)
15493 NTKERNELAPI
15494 VOID
15495 NTAPI
15496 ExInitializePagedLookasideList(
15497 _Out_ PPAGED_LOOKASIDE_LIST Lookaside,
15498 _In_opt_ PALLOCATE_FUNCTION Allocate,
15499 _In_opt_ PFREE_FUNCTION Free,
15500 _In_ ULONG Flags,
15501 _In_ SIZE_T Size,
15502 _In_ ULONG Tag,
15503 _In_ USHORT Depth);
15504
15505 _IRQL_requires_max_(DISPATCH_LEVEL)
15506 NTKERNELAPI
15507 NTSTATUS
15508 NTAPI
15509 ExInitializeResourceLite(
15510 _Out_ PERESOURCE Resource);
15511
15512 NTKERNELAPI
15513 LARGE_INTEGER
15514 NTAPI
15515 ExInterlockedAddLargeInteger(
15516 _Inout_ PLARGE_INTEGER Addend,
15517 _In_ LARGE_INTEGER Increment,
15518 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
15519
15520 #if !defined(_M_IX86)
15521 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
15522 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
15523 #else
15524 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
15525 (VOID)_InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
15526 #endif
15527
15528 NTKERNELAPI
15529 ULONG
15530 FASTCALL
15531 ExInterlockedAddUlong(
15532 _Inout_ PULONG Addend,
15533 _In_ ULONG Increment,
15534 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
15535
15536 #if defined(_M_IX86)
15537
15538 NTKERNELAPI
15539 LONGLONG
15540 FASTCALL
15541 ExfInterlockedCompareExchange64(
15542 _Inout_ _Interlocked_operand_ LONGLONG volatile *Destination,
15543 _In_ PLONGLONG Exchange,
15544 _In_ PLONGLONG Comperand);
15545
15546 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
15547 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
15548
15549 #else
15550
15551 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
15552 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
15553
15554 #endif /* defined(_M_IX86) */
15555
15556 NTKERNELAPI
15557 PLIST_ENTRY
15558 FASTCALL
15559 ExInterlockedInsertHeadList(
15560 _Inout_ PLIST_ENTRY ListHead,
15561 _Inout_ __drv_aliasesMem PLIST_ENTRY ListEntry,
15562 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
15563
15564 NTKERNELAPI
15565 PLIST_ENTRY
15566 FASTCALL
15567 ExInterlockedInsertTailList(
15568 _Inout_ PLIST_ENTRY ListHead,
15569 _Inout_ __drv_aliasesMem PLIST_ENTRY ListEntry,
15570 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
15571
15572 NTKERNELAPI
15573 PSINGLE_LIST_ENTRY
15574 FASTCALL
15575 ExInterlockedPopEntryList(
15576 _Inout_ PSINGLE_LIST_ENTRY ListHead,
15577 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
15578
15579 NTKERNELAPI
15580 PSINGLE_LIST_ENTRY
15581 FASTCALL
15582 ExInterlockedPushEntryList(
15583 _Inout_ PSINGLE_LIST_ENTRY ListHead,
15584 _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY ListEntry,
15585 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
15586
15587 NTKERNELAPI
15588 PLIST_ENTRY
15589 FASTCALL
15590 ExInterlockedRemoveHeadList(
15591 _Inout_ PLIST_ENTRY ListHead,
15592 _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock);
15593
15594 _IRQL_requires_max_(PASSIVE_LEVEL)
15595 NTKERNELAPI
15596 BOOLEAN
15597 NTAPI
15598 ExIsProcessorFeaturePresent(
15599 _In_ ULONG ProcessorFeature);
15600
15601 _IRQL_requires_max_(DISPATCH_LEVEL)
15602 NTKERNELAPI
15603 BOOLEAN
15604 NTAPI
15605 ExIsResourceAcquiredExclusiveLite(
15606 _In_ PERESOURCE Resource);
15607
15608 _IRQL_requires_max_(DISPATCH_LEVEL)
15609 NTKERNELAPI
15610 ULONG
15611 NTAPI
15612 ExIsResourceAcquiredSharedLite(
15613 _In_ PERESOURCE Resource);
15614
15615 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
15616
15617 NTKERNELAPI
15618 VOID
15619 NTAPI
15620 ExLocalTimeToSystemTime(
15621 _In_ PLARGE_INTEGER LocalTime,
15622 _Out_ PLARGE_INTEGER SystemTime);
15623
15624 _IRQL_requires_max_(DISPATCH_LEVEL)
15625 NTKERNELAPI
15626 VOID
15627 NTAPI
15628 ExNotifyCallback(
15629 _In_ PCALLBACK_OBJECT CallbackObject,
15630 _In_opt_ PVOID Argument1,
15631 _In_opt_ PVOID Argument2);
15632
15633 _IRQL_requires_max_(DISPATCH_LEVEL)
15634 NTKERNELAPI
15635 VOID
15636 NTAPI
15637 ExQueueWorkItem(
15638 _Inout_ __drv_aliasesMem PWORK_QUEUE_ITEM WorkItem,
15639 __drv_strictTypeMatch(__drv_typeExpr) _In_ WORK_QUEUE_TYPE QueueType);
15640
15641 _IRQL_requires_max_(APC_LEVEL)
15642 NTKERNELAPI
15643 DECLSPEC_NORETURN
15644 VOID
15645 NTAPI
15646 ExRaiseStatus(
15647 _In_ NTSTATUS Status);
15648
15649 _IRQL_requires_max_(APC_LEVEL)
15650 NTKERNELAPI
15651 PVOID
15652 NTAPI
15653 ExRegisterCallback(
15654 _Inout_ PCALLBACK_OBJECT CallbackObject,
15655 _In_ PCALLBACK_FUNCTION CallbackFunction,
15656 _In_opt_ PVOID CallbackContext);
15657
15658 _IRQL_requires_max_(DISPATCH_LEVEL)
15659 NTKERNELAPI
15660 NTSTATUS
15661 NTAPI
15662 ExReinitializeResourceLite(
15663 _Inout_ PERESOURCE Resource);
15664
15665 _IRQL_requires_max_(DISPATCH_LEVEL)
15666 _Requires_lock_held_(_Global_critical_region_)
15667 NTKERNELAPI
15668 VOID
15669 NTAPI
15670 ExReleaseResourceForThreadLite(
15671 _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_)
15672 PERESOURCE Resource,
15673 _In_ ERESOURCE_THREAD ResourceThreadId);
15674
15675 _Requires_lock_held_(_Global_critical_region_)
15676 _Requires_lock_held_(*Resource)
15677 _Releases_lock_(*Resource)
15678 _IRQL_requires_max_(DISPATCH_LEVEL)
15679 NTKERNELAPI
15680 VOID
15681 FASTCALL
15682 ExReleaseResourceLite(
15683 _Inout_ PERESOURCE Resource);
15684
15685 _IRQL_requires_max_(DISPATCH_LEVEL)
15686 NTKERNELAPI
15687 VOID
15688 NTAPI
15689 ExSetResourceOwnerPointer(
15690 _Inout_ PERESOURCE Resource,
15691 _In_ PVOID OwnerPointer);
15692
15693 _IRQL_requires_max_(APC_LEVEL)
15694 NTKERNELAPI
15695 ULONG
15696 NTAPI
15697 ExSetTimerResolution(
15698 _In_ ULONG DesiredTime,
15699 _In_ BOOLEAN SetResolution);
15700
15701 NTKERNELAPI
15702 VOID
15703 NTAPI
15704 ExSystemTimeToLocalTime(
15705 _In_ PLARGE_INTEGER SystemTime,
15706 _Out_ PLARGE_INTEGER LocalTime);
15707
15708 _IRQL_requires_max_(APC_LEVEL)
15709 NTKERNELAPI
15710 VOID
15711 NTAPI
15712 ExUnregisterCallback(
15713 _Inout_ PVOID CbRegistration);
15714
15715 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
15716
15717 #if (NTDDI_VERSION >= NTDDI_WINXP)
15718
15719 _Must_inspect_result_
15720 _Post_satisfies_(return == 0 || return == 1)
15721 NTKERNELAPI
15722 BOOLEAN
15723 FASTCALL
15724 ExAcquireRundownProtection(
15725 _Inout_ PEX_RUNDOWN_REF RunRef);
15726
15727 NTKERNELAPI
15728 VOID
15729 FASTCALL
15730 ExInitializeRundownProtection(
15731 _Out_ PEX_RUNDOWN_REF RunRef);
15732
15733 NTKERNELAPI
15734 VOID
15735 FASTCALL
15736 ExReInitializeRundownProtection(
15737 _Inout_ PEX_RUNDOWN_REF RunRef);
15738
15739 NTKERNELAPI
15740 VOID
15741 FASTCALL
15742 ExReleaseRundownProtection(
15743 _Inout_ PEX_RUNDOWN_REF RunRef);
15744
15745 NTKERNELAPI
15746 VOID
15747 FASTCALL
15748 ExRundownCompleted(
15749 _Out_ PEX_RUNDOWN_REF RunRef);
15750
15751 NTKERNELAPI
15752 BOOLEAN
15753 NTAPI
15754 ExVerifySuite(
15755 __drv_strictTypeMatch(__drv_typeExpr) _In_ SUITE_TYPE SuiteType);
15756
15757 NTKERNELAPI
15758 VOID
15759 FASTCALL
15760 ExWaitForRundownProtectionRelease(
15761 _Inout_ PEX_RUNDOWN_REF RunRef);
15762 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
15763
15764 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
15765
15766 _Must_inspect_result_
15767 _Post_satisfies_(return == 0 || return == 1)
15768 NTKERNELAPI
15769 BOOLEAN
15770 FASTCALL
15771 ExAcquireRundownProtectionEx(
15772 _Inout_ PEX_RUNDOWN_REF RunRef,
15773 _In_ ULONG Count);
15774
15775 NTKERNELAPI
15776 VOID
15777 FASTCALL
15778 ExReleaseRundownProtectionEx(
15779 _Inout_ PEX_RUNDOWN_REF RunRef,
15780 _In_ ULONG Count);
15781
15782 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
15783
15784 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
15785
15786 _Must_inspect_result_
15787 _IRQL_requires_max_(APC_LEVEL)
15788 NTKERNELAPI
15789 PEX_RUNDOWN_REF_CACHE_AWARE
15790 NTAPI
15791 ExAllocateCacheAwareRundownProtection(
15792 __drv_strictTypeMatch(__drv_typeExpr) _In_ POOL_TYPE PoolType,
15793 _In_ ULONG PoolTag);
15794
15795 _IRQL_requires_max_(APC_LEVEL)
15796 NTKERNELAPI
15797 SIZE_T
15798 NTAPI
15799 ExSizeOfRundownProtectionCacheAware(VOID);
15800
15801 _IRQL_requires_max_(APC_LEVEL)
15802 _Acquires_lock_(_Global_critical_region_)
15803 NTKERNELAPI
15804 PVOID
15805 NTAPI
15806 ExEnterCriticalRegionAndAcquireResourceShared(
15807 _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_shared_lock_(*_Curr_)
15808 PERESOURCE Resource);
15809
15810 _IRQL_requires_max_(APC_LEVEL)
15811 _Acquires_lock_(_Global_critical_region_)
15812 NTKERNELAPI
15813 PVOID
15814 NTAPI
15815 ExEnterCriticalRegionAndAcquireResourceExclusive(
15816 _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_exclusive_lock_(*_Curr_)
15817 PERESOURCE Resource);
15818
15819 _IRQL_requires_max_(APC_LEVEL)
15820 _Acquires_lock_(_Global_critical_region_)
15821 NTKERNELAPI
15822 PVOID
15823 NTAPI
15824 ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(
15825 _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_)
15826 PERESOURCE Resource);
15827
15828 _IRQL_requires_max_(DISPATCH_LEVEL)
15829 _Releases_lock_(_Global_critical_region_)
15830 NTKERNELAPI
15831 VOID
15832 FASTCALL
15833 ExReleaseResourceAndLeaveCriticalRegion(
15834 _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_)
15835 PERESOURCE Resource);
15836
15837 _IRQL_requires_max_(APC_LEVEL)
15838 NTKERNELAPI
15839 VOID
15840 NTAPI
15841 ExInitializeRundownProtectionCacheAware(
15842 _Out_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
15843 _In_ SIZE_T RunRefSize);
15844
15845 _IRQL_requires_max_(APC_LEVEL)
15846 NTKERNELAPI
15847 VOID
15848 NTAPI
15849 ExFreeCacheAwareRundownProtection(
15850 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
15851
15852 _Must_inspect_result_
15853 _Post_satisfies_(return == 0 || return == 1)
15854 NTKERNELAPI
15855 BOOLEAN
15856 FASTCALL
15857 ExAcquireRundownProtectionCacheAware(
15858 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
15859
15860 NTKERNELAPI
15861 VOID
15862 FASTCALL
15863 ExReleaseRundownProtectionCacheAware(
15864 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
15865
15866 _Must_inspect_result_
15867 _Post_satisfies_(return == 0 || return == 1)
15868 NTKERNELAPI
15869 BOOLEAN
15870 FASTCALL
15871 ExAcquireRundownProtectionCacheAwareEx(
15872 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware,
15873 _In_ ULONG Count);
15874
15875 NTKERNELAPI
15876 VOID
15877 FASTCALL
15878 ExReleaseRundownProtectionCacheAwareEx(
15879 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRef,
15880 _In_ ULONG Count);
15881
15882 NTKERNELAPI
15883 VOID
15884 FASTCALL
15885 ExWaitForRundownProtectionReleaseCacheAware(
15886 IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef);
15887
15888 NTKERNELAPI
15889 VOID
15890 FASTCALL
15891 ExReInitializeRundownProtectionCacheAware(
15892 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
15893
15894 NTKERNELAPI
15895 VOID
15896 FASTCALL
15897 ExRundownCompletedCacheAware(
15898 _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware);
15899
15900 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
15901
15902 #if (NTDDI_VERSION >= NTDDI_VISTA)
15903
15904 _IRQL_requires_max_(DISPATCH_LEVEL)
15905 NTKERNELAPI
15906 NTSTATUS
15907 NTAPI
15908 ExInitializeLookasideListEx(
15909 _Out_ PLOOKASIDE_LIST_EX Lookaside,
15910 _In_opt_ PALLOCATE_FUNCTION_EX Allocate,
15911 _In_opt_ PFREE_FUNCTION_EX Free,
15912 _In_ POOL_TYPE PoolType,
15913 _In_ ULONG Flags,
15914 _In_ SIZE_T Size,
15915 _In_ ULONG Tag,
15916 _In_ USHORT Depth);
15917
15918 _IRQL_requires_max_(DISPATCH_LEVEL)
15919 NTKERNELAPI
15920 VOID
15921 NTAPI
15922 ExDeleteLookasideListEx(
15923 _Inout_ PLOOKASIDE_LIST_EX Lookaside);
15924
15925 _IRQL_requires_max_(DISPATCH_LEVEL)
15926 NTKERNELAPI
15927 VOID
15928 NTAPI
15929 ExFlushLookasideListEx(
15930 _Inout_ PLOOKASIDE_LIST_EX Lookaside);
15931
15932 #ifdef _MSC_VER
15933 #pragma warning(push)
15934 #pragma warning(disable:__WARNING_MEMORY_NOT_ACQUIRED)
15935 #endif
15936
15937 __drv_allocatesMem(Mem)
15938 _Must_inspect_result_
15939 _IRQL_requires_max_(DISPATCH_LEVEL)
15940 FORCEINLINE
15941 PVOID
15942 ExAllocateFromLookasideListEx(
15943 _Inout_ PLOOKASIDE_LIST_EX Lookaside)
15944 {
15945 PVOID Entry;
15946
15947 Lookaside->L.TotalAllocates += 1;
15948 #ifdef NONAMELESSUNION
15949 Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
15950 if (Entry == NULL) {
15951 Lookaside->L.u2.AllocateMisses += 1;
15952 Entry = (Lookaside->L.u4.AllocateEx)(Lookaside->L.Type,
15953 Lookaside->L.Size,
15954 Lookaside->L.Tag,
15955 Lookaside);
15956 }
15957 #else /* NONAMELESSUNION */
15958 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
15959 if (Entry == NULL) {
15960 Lookaside->L.AllocateMisses += 1;
15961 Entry = (Lookaside->L.AllocateEx)(Lookaside->L.Type,
15962 Lookaside->L.Size,
15963 Lookaside->L.Tag,
15964 Lookaside);
15965 }
15966 #endif /* NONAMELESSUNION */
15967 return Entry;
15968 }
15969
15970 #ifdef _MSC_VER
15971 #pragma warning(pop)
15972 #endif
15973
15974 _IRQL_requires_max_(DISPATCH_LEVEL)
15975 FORCEINLINE
15976 VOID
15977 ExFreeToLookasideListEx(
15978 _Inout_ PLOOKASIDE_LIST_EX Lookaside,
15979 _In_ __drv_freesMem(Entry) PVOID Entry)
15980 {
15981 Lookaside->L.TotalFrees += 1;
15982 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
15983 Lookaside->L.FreeMisses += 1;
15984 (Lookaside->L.FreeEx)(Entry, Lookaside);
15985 } else {
15986 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
15987 }
15988 return;
15989 }
15990
15991 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
15992
15993 #if (NTDDI_VERSION >= NTDDI_WIN7)
15994
15995 _IRQL_requires_max_(DISPATCH_LEVEL)
15996 NTKERNELAPI
15997 VOID
15998 NTAPI
15999 ExSetResourceOwnerPointerEx(
16000 _Inout_ PERESOURCE Resource,
16001 _In_ PVOID OwnerPointer,
16002 _In_ ULONG Flags);
16003
16004 #define FLAG_OWNER_POINTER_IS_THREAD 0x1
16005
16006 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
16007
16008 __drv_allocatesMem(Mem)
16009 _IRQL_requires_max_(DISPATCH_LEVEL)
16010 _Ret_maybenull_
16011 _Post_writable_byte_size_(Lookaside->L.Size)
16012 static __inline
16013 PVOID
16014 ExAllocateFromNPagedLookasideList(
16015 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside)
16016 {
16017 PVOID Entry;
16018
16019 Lookaside->L.TotalAllocates++;
16020 #ifdef NONAMELESSUNION
16021 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
16022 Entry = ExInterlockedPopEntrySList(&Lookaside->L.u.ListHead,
16023 &Lookaside->Lock__ObsoleteButDoNotDelete);
16024 #else
16025 Entry = InterlockedPopEntrySList(&Lookaside->L.u.ListHead);
16026 #endif
16027 if (Entry == NULL) {
16028 Lookaside->L.u2.AllocateMisses++;
16029 Entry = (Lookaside->L.u4.Allocate)(Lookaside->L.Type,
16030 Lookaside->L.Size,
16031 Lookaside->L.Tag);
16032 }
16033 #else /* NONAMELESSUNION */
16034 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
16035 Entry = ExInterlockedPopEntrySList(&Lookaside->L.ListHead,
16036 &Lookaside->Lock__ObsoleteButDoNotDelete);
16037 #else
16038 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
16039 #endif
16040 if (Entry == NULL) {
16041 Lookaside->L.AllocateMisses++;
16042 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
16043 Lookaside->L.Size,
16044 Lookaside->L.Tag);
16045 }
16046 #endif /* NONAMELESSUNION */
16047 return Entry;
16048 }
16049
16050 _IRQL_requires_max_(DISPATCH_LEVEL)
16051 static __inline
16052 VOID
16053 ExFreeToNPagedLookasideList(
16054 _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside,
16055 _In_ __drv_freesMem(Mem) PVOID Entry)
16056 {
16057 Lookaside->L.TotalFrees++;
16058 #ifdef NONAMELESSUNION
16059 if (ExQueryDepthSList(&Lookaside->L.u.ListHead) >= Lookaside->L.Depth) {
16060 Lookaside->L.u3.FreeMisses++;
16061 (Lookaside->L.u5.Free)(Entry);
16062 } else {
16063 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
16064 ExInterlockedPushEntrySList(&Lookaside->L.u.ListHead,
16065 (PSLIST_ENTRY)Entry,
16066 &Lookaside->Lock__ObsoleteButDoNotDelete);
16067 #else
16068 InterlockedPushEntrySList(&Lookaside->L.u.ListHead, (PSLIST_ENTRY)Entry);
16069 #endif
16070 }
16071 #else /* NONAMELESSUNION */
16072 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
16073 Lookaside->L.FreeMisses++;
16074 (Lookaside->L.Free)(Entry);
16075 } else {
16076 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
16077 ExInterlockedPushEntrySList(&Lookaside->L.ListHead,
16078 (PSLIST_ENTRY)Entry,
16079 &Lookaside->Lock__ObsoleteButDoNotDelete);
16080 #else
16081 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
16082 #endif
16083 }
16084 #endif /* NONAMELESSUNION */
16085 }
16086
16087 /******************************************************************************
16088 * Object Manager Functions *
16089 ******************************************************************************/
16090
16091 #if (NTDDI_VERSION >= NTDDI_WIN2K)
16092 _IRQL_requires_max_(DISPATCH_LEVEL)
16093 NTKERNELAPI
16094 LONG_PTR
16095 FASTCALL
16096 ObfDereferenceObject(
16097 _In_ PVOID Object);
16098 #define ObDereferenceObject ObfDereferenceObject
16099
16100 _IRQL_requires_max_(APC_LEVEL)
16101 NTKERNELAPI
16102 NTSTATUS
16103 NTAPI
16104 ObGetObjectSecurity(
16105 _In_ PVOID Object,
16106 _Out_ PSECURITY_DESCRIPTOR *SecurityDescriptor,
16107 _Out_ PBOOLEAN MemoryAllocated);
16108
16109 _IRQL_requires_max_(DISPATCH_LEVEL)
16110 NTKERNELAPI
16111 LONG_PTR
16112 FASTCALL
16113 ObfReferenceObject(
16114 _In_ PVOID Object);
16115 #define ObReferenceObject ObfReferenceObject
16116
16117 _IRQL_requires_max_(APC_LEVEL)
16118 NTKERNELAPI
16119 NTSTATUS
16120 NTAPI
16121 ObReferenceObjectByHandle(
16122 _In_ HANDLE Handle,
16123 _In_ ACCESS_MASK DesiredAccess,
16124 _In_opt_ POBJECT_TYPE ObjectType,
16125 _In_ KPROCESSOR_MODE AccessMode,
16126 _Out_ PVOID *Object,
16127 _Out_opt_ POBJECT_HANDLE_INFORMATION HandleInformation);
16128
16129 _IRQL_requires_max_(DISPATCH_LEVEL)
16130 NTKERNELAPI
16131 NTSTATUS
16132 NTAPI
16133 ObReferenceObjectByPointer(
16134 _In_ PVOID Object,
16135 _In_ ACCESS_MASK DesiredAccess,
16136 _In_opt_ POBJECT_TYPE ObjectType,
16137 _In_ KPROCESSOR_MODE AccessMode);
16138
16139 _IRQL_requires_max_(APC_LEVEL)
16140 NTKERNELAPI
16141 VOID
16142 NTAPI
16143 ObReleaseObjectSecurity(
16144 _In_ PSECURITY_DESCRIPTOR SecurityDescriptor,
16145 _In_ BOOLEAN MemoryAllocated);
16146 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
16147
16148 #if (NTDDI_VERSION >= NTDDI_VISTA)
16149 NTKERNELAPI
16150 VOID
16151 NTAPI
16152 ObDereferenceObjectDeferDelete(
16153 _In_ PVOID Object);
16154 #endif
16155
16156 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
16157 NTKERNELAPI
16158 NTSTATUS
16159 NTAPI
16160 ObRegisterCallbacks(
16161 _In_ POB_CALLBACK_REGISTRATION CallbackRegistration,
16162 _Outptr_ PVOID *RegistrationHandle);
16163
16164 NTKERNELAPI
16165 VOID
16166 NTAPI
16167 ObUnRegisterCallbacks(
16168 _In_ PVOID RegistrationHandle);
16169
16170 NTKERNELAPI
16171 USHORT
16172 NTAPI
16173 ObGetFilterVersion(VOID);
16174
16175 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
16176
16177 #if (NTDDI_VERSION >= NTDDI_WIN7)
16178 _IRQL_requires_max_(APC_LEVEL)
16179 NTKERNELAPI
16180 NTSTATUS
16181 NTAPI
16182 ObReferenceObjectByHandleWithTag(
16183 _In_ HANDLE Handle,
16184 _In_ ACCESS_MASK DesiredAccess,
16185 _In_opt_ POBJECT_TYPE ObjectType,
16186 _In_ KPROCESSOR_MODE AccessMode,
16187 _In_ ULONG Tag,
16188 _Out_ PVOID *Object,
16189 _Out_opt_ POBJECT_HANDLE_INFORMATION HandleInformation);
16190
16191 _IRQL_requires_max_(DISPATCH_LEVEL)
16192 NTKERNELAPI
16193 LONG_PTR
16194 FASTCALL
16195 ObfReferenceObjectWithTag(
16196 _In_ PVOID Object,
16197 _In_ ULONG Tag);
16198
16199 _IRQL_requires_max_(DISPATCH_LEVEL)
16200 NTKERNELAPI
16201 NTSTATUS
16202 NTAPI
16203 ObReferenceObjectByPointerWithTag(
16204 _In_ PVOID Object,
16205 _In_ ACCESS_MASK DesiredAccess,
16206 _In_opt_ POBJECT_TYPE ObjectType,
16207 _In_ KPROCESSOR_MODE AccessMode,
16208 _In_ ULONG Tag);
16209
16210 _IRQL_requires_max_(DISPATCH_LEVEL)
16211 NTKERNELAPI
16212 LONG_PTR
16213 FASTCALL
16214 ObfDereferenceObjectWithTag(
16215 _In_ PVOID Object,
16216 _In_ ULONG Tag);
16217
16218 NTKERNELAPI
16219 VOID
16220 NTAPI
16221 ObDereferenceObjectDeferDeleteWithTag(
16222 _In_ PVOID Object,
16223 _In_ ULONG Tag);
16224
16225 #define ObDereferenceObject ObfDereferenceObject
16226 #define ObReferenceObject ObfReferenceObject
16227 #define ObDereferenceObjectWithTag ObfDereferenceObjectWithTag
16228 #define ObReferenceObjectWithTag ObfReferenceObjectWithTag
16229 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
16230
16231 /******************************************************************************
16232 * Process Manager Functions *
16233 ******************************************************************************/
16234
16235 NTKERNELAPI
16236 NTSTATUS
16237 NTAPI
16238 PsWrapApcWow64Thread(
16239 _Inout_ PVOID *ApcContext,
16240 _Inout_ PVOID *ApcRoutine);
16241
16242 /*
16243 * PEPROCESS
16244 * PsGetCurrentProcess(VOID)
16245 */
16246 #define PsGetCurrentProcess IoGetCurrentProcess
16247
16248 #if !defined(_PSGETCURRENTTHREAD_)
16249 #define _PSGETCURRENTTHREAD_
16250 _IRQL_requires_max_(DISPATCH_LEVEL)
16251 FORCEINLINE
16252 PETHREAD
16253 NTAPI
16254 PsGetCurrentThread(VOID)
16255 {
16256 return (PETHREAD)KeGetCurrentThread();
16257 }
16258 #endif /* !_PSGETCURRENTTHREAD_ */
16259
16260
16261 #if (NTDDI_VERSION >= NTDDI_WIN2K)
16262
16263 _IRQL_requires_max_(APC_LEVEL)
16264 _Post_satisfies_(return <= 0)
16265 _Must_inspect_result_
16266 NTKERNELAPI
16267 NTSTATUS
16268 NTAPI
16269 PsCreateSystemThread(
16270 _Out_ PHANDLE ThreadHandle,
16271 _In_ ULONG DesiredAccess,
16272 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16273 _In_opt_ HANDLE ProcessHandle,
16274 _Out_opt_ PCLIENT_ID ClientId,
16275 _In_ PKSTART_ROUTINE StartRoutine,
16276 _In_opt_ _When_(return==0, __drv_aliasesMem) PVOID StartContext);
16277
16278 _IRQL_requires_max_(PASSIVE_LEVEL)
16279 NTKERNELAPI
16280 NTSTATUS
16281 NTAPI
16282 PsTerminateSystemThread(
16283 _In_ NTSTATUS ExitStatus);
16284
16285 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
16286
16287
16288 /******************************************************************************
16289 * WMI Library Support Functions *
16290 ******************************************************************************/
16291
16292 #ifdef RUN_WPP
16293 #if (NTDDI_VERSION >= NTDDI_WINXP)
16294 _IRQL_requires_max_(HIGH_LEVEL)
16295 NTKERNELAPI
16296 NTSTATUS
16297 __cdecl
16298 WmiTraceMessage(
16299 _In_ TRACEHANDLE LoggerHandle,
16300 _In_ ULONG MessageFlags,
16301 _In_ LPGUID MessageGuid,
16302 _In_ USHORT MessageNumber,
16303 ...);
16304 #endif
16305 #endif /* RUN_WPP */
16306
16307 #if (NTDDI_VERSION >= NTDDI_WINXP)
16308
16309 _IRQL_requires_max_(APC_LEVEL)
16310 NTKERNELAPI
16311 NTSTATUS
16312 NTAPI
16313 WmiQueryTraceInformation(
16314 _In_ TRACE_INFORMATION_CLASS TraceInformationClass,
16315 _Out_writes_bytes_(TraceInformationLength) PVOID TraceInformation,
16316 _In_ ULONG TraceInformationLength,
16317 _Out_opt_ PULONG RequiredLength,
16318 _In_opt_ PVOID Buffer);
16319
16320 #if 0
16321 /* FIXME: Get va_list from where? */
16322 _IRQL_requires_max_(HIGH_LEVEL)
16323 NTKERNELAPI
16324 NTSTATUS
16325 NTAPI
16326 WmiTraceMessageVa(
16327 _In_ TRACEHANDLE LoggerHandle,
16328 _In_ ULONG MessageFlags,
16329 _In_ LPGUID MessageGuid,
16330 _In_ USHORT MessageNumber,
16331 _In_ va_list MessageArgList);
16332 #endif
16333
16334 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
16335
16336 #ifndef TRACE_INFORMATION_CLASS_DEFINE
16337
16338 #if (NTDDI_VERSION >= NTDDI_WINXP)
16339 _IRQL_requires_max_(APC_LEVEL)
16340 NTKERNELAPI
16341 NTSTATUS
16342 NTAPI
16343 WmiQueryTraceInformation(
16344 _In_ TRACE_INFORMATION_CLASS TraceInformationClass,
16345 _Out_writes_bytes_(TraceInformationLength) PVOID TraceInformation,
16346 _In_ ULONG TraceInformationLength,
16347 _Out_opt_ PULONG RequiredLength,
16348 _In_opt_ PVOID Buffer);
16349 #endif
16350
16351 #define TRACE_INFORMATION_CLASS_DEFINE
16352
16353 #endif /* TRACE_INFOPRMATION_CLASS_DEFINE */
16354
16355 #if (NTDDI_VERSION >= NTDDI_VISTA)
16356
16357 _IRQL_requires_max_(PASSIVE_LEVEL)
16358 NTSTATUS
16359 NTKERNELAPI
16360 NTAPI
16361 EtwRegister(
16362 _In_ LPCGUID ProviderId,
16363 _In_opt_ PETWENABLECALLBACK EnableCallback,
16364 _In_opt_ PVOID CallbackContext,
16365 _Out_ PREGHANDLE RegHandle);
16366
16367 _IRQL_requires_max_(PASSIVE_LEVEL)
16368 NTSTATUS
16369 NTKERNELAPI
16370 NTAPI
16371 EtwUnregister(
16372 _In_ REGHANDLE RegHandle);
16373
16374 _IRQL_requires_max_(HIGH_LEVEL)
16375 BOOLEAN
16376 NTKERNELAPI
16377 NTAPI
16378 EtwEventEnabled(
16379 _In_ REGHANDLE RegHandle,
16380 _In_ PCEVENT_DESCRIPTOR EventDescriptor);
16381
16382 _IRQL_requires_max_(HIGH_LEVEL)
16383 BOOLEAN
16384 NTKERNELAPI
16385 NTAPI
16386 EtwProviderEnabled(
16387 _In_ REGHANDLE RegHandle,
16388 _In_ UCHAR Level,
16389 _In_ ULONGLONG Keyword);
16390
16391 _When_(ControlCode==EVENT_ACTIVITY_CTRL_CREATE_ID, _IRQL_requires_max_(HIGH_LEVEL))
16392 _When_(ControlCode!=EVENT_ACTIVITY_CTRL_CREATE_ID, _IRQL_requires_max_(APC_LEVEL))
16393 NTSTATUS
16394 NTKERNELAPI
16395 NTAPI
16396 EtwActivityIdControl(
16397 _In_ ULONG ControlCode,
16398 _Inout_updates_bytes_(sizeof(GUID)) LPGUID ActivityId);
16399
16400 _IRQL_requires_max_(HIGH_LEVEL)
16401 NTSTATUS
16402 NTKERNELAPI
16403 NTAPI
16404 EtwWrite(
16405 _In_ REGHANDLE RegHandle,
16406 _In_ PCEVENT_DESCRIPTOR EventDescriptor,
16407 _In_opt_ LPCGUID ActivityId,
16408 _In_ ULONG UserDataCount,
16409 _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData);
16410
16411 _IRQL_requires_max_(HIGH_LEVEL)
16412 NTSTATUS
16413 NTKERNELAPI
16414 NTAPI
16415 EtwWriteTransfer(
16416 _In_ REGHANDLE RegHandle,
16417 _In_ PCEVENT_DESCRIPTOR EventDescriptor,
16418 _In_opt_ LPCGUID ActivityId,
16419 _In_opt_ LPCGUID RelatedActivityId,
16420 _In_ ULONG UserDataCount,
16421 _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData);
16422
16423 _IRQL_requires_max_(HIGH_LEVEL)
16424 NTSTATUS
16425 NTKERNELAPI
16426 NTAPI
16427 EtwWriteString(
16428 _In_ REGHANDLE RegHandle,
16429 _In_ UCHAR Level,
16430 _In_ ULONGLONG Keyword,
16431 _In_opt_ LPCGUID ActivityId,
16432 _In_ PCWSTR String);
16433
16434 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
16435
16436 #if (NTDDI_VERSION >= NTDDI_WIN7)
16437 _IRQL_requires_max_(HIGH_LEVEL)
16438 NTSTATUS
16439 NTKERNELAPI
16440 NTAPI
16441 EtwWriteEx(
16442 _In_ REGHANDLE RegHandle,
16443 _In_ PCEVENT_DESCRIPTOR EventDescriptor,
16444 _In_ ULONG64 Filter,
16445 _In_ ULONG Flags,
16446 _In_opt_ LPCGUID ActivityId,
16447 _In_opt_ LPCGUID RelatedActivityId,
16448 _In_ ULONG UserDataCount,
16449 _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData);
16450 #endif
16451
16452
16453
16454 /******************************************************************************
16455 * Kernel Debugger Functions *
16456 ******************************************************************************/
16457
16458 #ifndef _DBGNT_
16459
16460 ULONG
16461 __cdecl
16462 DbgPrint(
16463 _In_z_ _Printf_format_string_ PCSTR Format,
16464 ...);
16465
16466 #if (NTDDI_VERSION >= NTDDI_WIN2K)
16467 NTSYSAPI
16468 ULONG
16469 __cdecl
16470 DbgPrintReturnControlC(
16471 _In_z_ _Printf_format_string_ PCCH Format,
16472 ...);
16473 #endif
16474
16475 #if (NTDDI_VERSION >= NTDDI_WINXP)
16476
16477 NTSYSAPI
16478 ULONG
16479 __cdecl
16480 DbgPrintEx(
16481 _In_ ULONG ComponentId,
16482 _In_ ULONG Level,
16483 _In_z_ _Printf_format_string_ PCSTR Format,
16484 ...);
16485
16486 #ifdef _VA_LIST_DEFINED
16487
16488 NTSYSAPI
16489 ULONG
16490 NTAPI
16491 vDbgPrintEx(
16492 _In_ ULONG ComponentId,
16493 _In_ ULONG Level,
16494 _In_z_ PCCH Format,
16495 _In_ va_list ap);
16496
16497 NTSYSAPI
16498 ULONG
16499 NTAPI
16500 vDbgPrintExWithPrefix(
16501 _In_z_ PCCH Prefix,
16502 _In_ ULONG ComponentId,
16503 _In_ ULONG Level,
16504 _In_z_ PCCH Format,
16505 _In_ va_list ap);
16506
16507 #endif /* _VA_LIST_DEFINED */
16508
16509 NTSYSAPI
16510 NTSTATUS
16511 NTAPI
16512 DbgQueryDebugFilterState(
16513 _In_ ULONG ComponentId,
16514 _In_ ULONG Level);
16515
16516 NTSYSAPI
16517 NTSTATUS
16518 NTAPI
16519 DbgSetDebugFilterState(
16520 _In_ ULONG ComponentId,
16521 _In_ ULONG Level,
16522 _In_ BOOLEAN State);
16523
16524 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
16525
16526 #if (NTDDI_VERSION >= NTDDI_VISTA)
16527
16528 typedef VOID
16529 (*PDEBUG_PRINT_CALLBACK)(
16530 _In_ PSTRING Output,
16531 _In_ ULONG ComponentId,
16532 _In_ ULONG Level);
16533
16534 NTSYSAPI
16535 NTSTATUS
16536 NTAPI
16537 DbgSetDebugPrintCallback(
16538 _In_ PDEBUG_PRINT_CALLBACK DebugPrintCallback,
16539 _In_ BOOLEAN Enable);
16540
16541 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
16542
16543 #endif /* _DBGNT_ */
16544
16545 #if DBG
16546
16547 #define KdPrint(_x_) DbgPrint _x_
16548 #define KdPrintEx(_x_) DbgPrintEx _x_
16549 #define vKdPrintEx(_x_) vDbgPrintEx _x_
16550 #define vKdPrintExWithPrefix(_x_) vDbgPrintExWithPrefix _x_
16551 #define KdBreakPoint() DbgBreakPoint()
16552 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
16553
16554 #else /* !DBG */
16555
16556 #define KdPrint(_x_)
16557 #define KdPrintEx(_x_)
16558 #define vKdPrintEx(_x_)
16559 #define vKdPrintExWithPrefix(_x_)
16560 #define KdBreakPoint()
16561 #define KdBreakPointWithStatus(s)
16562
16563 #endif /* !DBG */
16564
16565 #ifdef _NTSYSTEM_
16566 extern BOOLEAN KdDebuggerEnabled;
16567 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
16568 extern BOOLEAN KdDebuggerNotPresent;
16569 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
16570 #else
16571 __CREATE_NTOS_DATA_IMPORT_ALIAS(KdDebuggerEnabled)
16572 extern BOOLEAN *KdDebuggerEnabled;
16573 #define KD_DEBUGGER_ENABLED (*KdDebuggerEnabled)
16574 __CREATE_NTOS_DATA_IMPORT_ALIAS(KdDebuggerNotPresent)
16575 extern BOOLEAN *KdDebuggerNotPresent;
16576 #define KD_DEBUGGER_NOT_PRESENT (*KdDebuggerNotPresent)
16577 #endif
16578
16579 #if (NTDDI_VERSION >= NTDDI_WIN2K)
16580
16581 NTKERNELAPI
16582 NTSTATUS
16583 NTAPI
16584 KdDisableDebugger(VOID);
16585
16586 NTKERNELAPI
16587 NTSTATUS
16588 NTAPI
16589 KdEnableDebugger(VOID);
16590
16591 #if (_MSC_FULL_VER >= 150030729) && !defined(IMPORT_NATIVE_DBG_BREAK)
16592 #define DbgBreakPoint __debugbreak
16593 #else
16594 __analysis_noreturn
16595 VOID
16596 NTAPI
16597 DbgBreakPoint(VOID);
16598 #endif
16599
16600 __analysis_noreturn
16601 NTSYSAPI
16602 VOID
16603 NTAPI
16604 DbgBreakPointWithStatus(
16605 _In_ ULONG Status);
16606
16607 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
16608
16609 #if (NTDDI_VERSION >= NTDDI_WS03)
16610 NTKERNELAPI
16611 BOOLEAN
16612 NTAPI
16613 KdRefreshDebuggerNotPresent(VOID);
16614 #endif
16615
16616 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
16617 NTKERNELAPI
16618 NTSTATUS
16619 NTAPI
16620 KdChangeOption(
16621 _In_ KD_OPTION Option,
16622 _In_opt_ ULONG InBufferBytes,
16623 _In_ PVOID InBuffer,
16624 _In_opt_ ULONG OutBufferBytes,
16625 _Out_ PVOID OutBuffer,
16626 _Out_opt_ PULONG OutBufferNeeded);
16627 #endif
16628 /* Hardware Abstraction Layer Functions */
16629
16630 #if (NTDDI_VERSION >= NTDDI_WIN2K)
16631
16632 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
16633
16634 __drv_preferredFunction("AllocateCommonBuffer","Obsolete")
16635 FORCEINLINE
16636 PVOID
16637 NTAPI
16638 HalAllocateCommonBuffer(
16639 _In_ PDMA_ADAPTER DmaAdapter,
16640 _In_ ULONG Length,
16641 _Out_ PPHYSICAL_ADDRESS LogicalAddress,
16642 _In_ BOOLEAN CacheEnabled)
16643 {
16644 PALLOCATE_COMMON_BUFFER allocateCommonBuffer;
16645 PVOID commonBuffer;
16646
16647 allocateCommonBuffer = *(DmaAdapter)->DmaOperations->AllocateCommonBuffer;
16648 ASSERT( allocateCommonBuffer != NULL );
16649 commonBuffer = allocateCommonBuffer( DmaAdapter, Length, LogicalAddress, CacheEnabled );
16650 return commonBuffer;
16651 }
16652
16653 __drv_preferredFunction("FreeCommonBuffer","Obsolete")
16654 FORCEINLINE
16655 VOID
16656 NTAPI
16657 HalFreeCommonBuffer(
16658 _In_ PDMA_ADAPTER DmaAdapter,
16659 _In_ ULONG Length,
16660 _In_ PHYSICAL_ADDRESS LogicalAddress,
16661 _In_ PVOID VirtualAddress,
16662 _In_ BOOLEAN CacheEnabled)
16663 {
16664 PFREE_COMMON_BUFFER freeCommonBuffer;
16665
16666 freeCommonBuffer = *(DmaAdapter)->DmaOperations->FreeCommonBuffer;
16667 ASSERT( freeCommonBuffer != NULL );
16668 freeCommonBuffer( DmaAdapter, Length, LogicalAddress, VirtualAddress, CacheEnabled );
16669 }
16670
16671 __drv_preferredFunction("ReadDmaCounter","Obsolete")
16672 FORCEINLINE
16673 ULONG
16674 NTAPI
16675 HalReadDmaCounter(
16676 _In_ PDMA_ADAPTER DmaAdapter)
16677 {
16678 PREAD_DMA_COUNTER readDmaCounter;
16679 ULONG counter;
16680
16681 readDmaCounter = *(DmaAdapter)->DmaOperations->ReadDmaCounter;
16682 ASSERT( readDmaCounter != NULL );
16683 counter = readDmaCounter( DmaAdapter );
16684 return counter;
16685 }
16686
16687 FORCEINLINE
16688 ULONG
16689 HalGetDmaAlignment(
16690 _In_ PDMA_ADAPTER DmaAdapter)
16691 {
16692 PGET_DMA_ALIGNMENT getDmaAlignment;
16693 ULONG alignment;
16694
16695 getDmaAlignment = *(DmaAdapter)->DmaOperations->GetDmaAlignment;
16696 ASSERT( getDmaAlignment != NULL );
16697 alignment = getDmaAlignment( DmaAdapter );
16698 return alignment;
16699 }
16700
16701 #endif /* USE_DMA_MACROS ... */
16702
16703 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
16704
16705 #ifndef _NTTMAPI_
16706 #define _NTTMAPI_
16707
16708 #include <ktmtypes.h>
16709
16710 #define TRANSACTIONMANAGER_QUERY_INFORMATION (0x0001)
16711 #define TRANSACTIONMANAGER_SET_INFORMATION (0x0002)
16712 #define TRANSACTIONMANAGER_RECOVER (0x0004)
16713 #define TRANSACTIONMANAGER_RENAME (0x0008)
16714 #define TRANSACTIONMANAGER_CREATE_RM (0x0010)
16715 #define TRANSACTIONMANAGER_BIND_TRANSACTION (0x0020)
16716
16717 #define TRANSACTIONMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\
16718 TRANSACTIONMANAGER_QUERY_INFORMATION)
16719
16720 #define TRANSACTIONMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
16721 TRANSACTIONMANAGER_SET_INFORMATION |\
16722 TRANSACTIONMANAGER_RECOVER |\
16723 TRANSACTIONMANAGER_RENAME |\
16724 TRANSACTIONMANAGER_CREATE_RM)
16725
16726 #define TRANSACTIONMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE)
16727
16728 #define TRANSACTIONMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
16729 TRANSACTIONMANAGER_GENERIC_READ |\
16730 TRANSACTIONMANAGER_GENERIC_WRITE |\
16731 TRANSACTIONMANAGER_GENERIC_EXECUTE |\
16732 TRANSACTIONMANAGER_BIND_TRANSACTION)
16733
16734 #define TRANSACTION_QUERY_INFORMATION (0x0001)
16735 #define TRANSACTION_SET_INFORMATION (0x0002)
16736 #define TRANSACTION_ENLIST (0x0004)
16737 #define TRANSACTION_COMMIT (0x0008)
16738 #define TRANSACTION_ROLLBACK (0x0010)
16739 #define TRANSACTION_PROPAGATE (0x0020)
16740 #define TRANSACTION_RIGHT_RESERVED1 (0x0040)
16741
16742 #define TRANSACTION_GENERIC_READ (STANDARD_RIGHTS_READ |\
16743 TRANSACTION_QUERY_INFORMATION |\
16744 SYNCHRONIZE)
16745
16746 #define TRANSACTION_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
16747 TRANSACTION_SET_INFORMATION |\
16748 TRANSACTION_COMMIT |\
16749 TRANSACTION_ENLIST |\
16750 TRANSACTION_ROLLBACK |\
16751 TRANSACTION_PROPAGATE |\
16752 SYNCHRONIZE)
16753
16754 #define TRANSACTION_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
16755 TRANSACTION_COMMIT |\
16756 TRANSACTION_ROLLBACK |\
16757 SYNCHRONIZE)
16758
16759 #define TRANSACTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
16760 TRANSACTION_GENERIC_READ |\
16761 TRANSACTION_GENERIC_WRITE |\
16762 TRANSACTION_GENERIC_EXECUTE)
16763
16764 #define TRANSACTION_RESOURCE_MANAGER_RIGHTS (TRANSACTION_GENERIC_READ |\
16765 STANDARD_RIGHTS_WRITE |\
16766 TRANSACTION_SET_INFORMATION |\
16767 TRANSACTION_ENLIST |\
16768 TRANSACTION_ROLLBACK |\
16769 TRANSACTION_PROPAGATE |\
16770 SYNCHRONIZE)
16771
16772 #define RESOURCEMANAGER_QUERY_INFORMATION (0x0001)
16773 #define RESOURCEMANAGER_SET_INFORMATION (0x0002)
16774 #define RESOURCEMANAGER_RECOVER (0x0004)
16775 #define RESOURCEMANAGER_ENLIST (0x0008)
16776 #define RESOURCEMANAGER_GET_NOTIFICATION (0x0010)
16777 #define RESOURCEMANAGER_REGISTER_PROTOCOL (0x0020)
16778 #define RESOURCEMANAGER_COMPLETE_PROPAGATION (0x0040)
16779
16780 #define RESOURCEMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\
16781 RESOURCEMANAGER_QUERY_INFORMATION |\
16782 SYNCHRONIZE)
16783
16784 #define RESOURCEMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
16785 RESOURCEMANAGER_SET_INFORMATION |\
16786 RESOURCEMANAGER_RECOVER |\
16787 RESOURCEMANAGER_ENLIST |\
16788 RESOURCEMANAGER_GET_NOTIFICATION |\
16789 RESOURCEMANAGER_REGISTER_PROTOCOL |\
16790 RESOURCEMANAGER_COMPLETE_PROPAGATION |\
16791 SYNCHRONIZE)
16792
16793 #define RESOURCEMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
16794 RESOURCEMANAGER_RECOVER |\
16795 RESOURCEMANAGER_ENLIST |\
16796 RESOURCEMANAGER_GET_NOTIFICATION |\
16797 RESOURCEMANAGER_COMPLETE_PROPAGATION |\
16798 SYNCHRONIZE)
16799
16800 #define RESOURCEMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
16801 RESOURCEMANAGER_GENERIC_READ |\
16802 RESOURCEMANAGER_GENERIC_WRITE |\
16803 RESOURCEMANAGER_GENERIC_EXECUTE)
16804
16805 #define ENLISTMENT_QUERY_INFORMATION (0x0001)
16806 #define ENLISTMENT_SET_INFORMATION (0x0002)
16807 #define ENLISTMENT_RECOVER (0x0004)
16808 #define ENLISTMENT_SUBORDINATE_RIGHTS (0x0008)
16809 #define ENLISTMENT_SUPERIOR_RIGHTS (0x0010)
16810
16811 #define ENLISTMENT_GENERIC_READ (STANDARD_RIGHTS_READ |\
16812 ENLISTMENT_QUERY_INFORMATION)
16813
16814 #define ENLISTMENT_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
16815 ENLISTMENT_SET_INFORMATION |\
16816 ENLISTMENT_RECOVER |\
16817 ENLISTMENT_SUBORDINATE_RIGHTS |\
16818 ENLISTMENT_SUPERIOR_RIGHTS)
16819
16820 #define ENLISTMENT_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
16821 ENLISTMENT_RECOVER |\
16822 ENLISTMENT_SUBORDINATE_RIGHTS |\
16823 ENLISTMENT_SUPERIOR_RIGHTS)
16824
16825 #define ENLISTMENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\
16826 ENLISTMENT_GENERIC_READ |\
16827 ENLISTMENT_GENERIC_WRITE |\
16828 ENLISTMENT_GENERIC_EXECUTE)
16829
16830 typedef enum _TRANSACTION_OUTCOME {
16831 TransactionOutcomeUndetermined = 1,
16832 TransactionOutcomeCommitted,
16833 TransactionOutcomeAborted,
16834 } TRANSACTION_OUTCOME;
16835
16836
16837 typedef enum _TRANSACTION_STATE {
16838 TransactionStateNormal = 1,
16839 TransactionStateIndoubt,
16840 TransactionStateCommittedNotify,
16841 } TRANSACTION_STATE;
16842
16843
16844 typedef struct _TRANSACTION_BASIC_INFORMATION {
16845 GUID TransactionId;
16846 ULONG State;
16847 ULONG Outcome;
16848 } TRANSACTION_BASIC_INFORMATION, *PTRANSACTION_BASIC_INFORMATION;
16849
16850 typedef struct _TRANSACTIONMANAGER_BASIC_INFORMATION {
16851 GUID TmIdentity;
16852 LARGE_INTEGER VirtualClock;
16853 } TRANSACTIONMANAGER_BASIC_INFORMATION, *PTRANSACTIONMANAGER_BASIC_INFORMATION;
16854
16855 typedef struct _TRANSACTIONMANAGER_LOG_INFORMATION {
16856 GUID LogIdentity;
16857 } TRANSACTIONMANAGER_LOG_INFORMATION, *PTRANSACTIONMANAGER_LOG_INFORMATION;
16858
16859 typedef struct _TRANSACTIONMANAGER_LOGPATH_INFORMATION {
16860 ULONG LogPathLength;
16861 _Field_size_(LogPathLength) WCHAR LogPath[1];
16862 } TRANSACTIONMANAGER_LOGPATH_INFORMATION, *PTRANSACTIONMANAGER_LOGPATH_INFORMATION;
16863
16864 typedef struct _TRANSACTIONMANAGER_RECOVERY_INFORMATION {
16865 ULONGLONG LastRecoveredLsn;
16866 } TRANSACTIONMANAGER_RECOVERY_INFORMATION, *PTRANSACTIONMANAGER_RECOVERY_INFORMATION;
16867
16868 typedef struct _TRANSACTION_PROPERTIES_INFORMATION {
16869 ULONG IsolationLevel;
16870 ULONG IsolationFlags;
16871 LARGE_INTEGER Timeout;
16872 ULONG Outcome;
16873 ULONG DescriptionLength;
16874 WCHAR Description[1];
16875 } TRANSACTION_PROPERTIES_INFORMATION, *PTRANSACTION_PROPERTIES_INFORMATION;
16876
16877 typedef struct _TRANSACTION_BIND_INFORMATION {
16878 HANDLE TmHandle;
16879 } TRANSACTION_BIND_INFORMATION, *PTRANSACTION_BIND_INFORMATION;
16880
16881 typedef struct _TRANSACTION_ENLISTMENT_PAIR {
16882 GUID EnlistmentId;
16883 GUID ResourceManagerId;
16884 } TRANSACTION_ENLISTMENT_PAIR, *PTRANSACTION_ENLISTMENT_PAIR;
16885
16886 typedef struct _TRANSACTION_ENLISTMENTS_INFORMATION {
16887 ULONG NumberOfEnlistments;
16888 TRANSACTION_ENLISTMENT_PAIR EnlistmentPair[1];
16889 } TRANSACTION_ENLISTMENTS_INFORMATION, *PTRANSACTION_ENLISTMENTS_INFORMATION;
16890
16891 typedef struct _TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION {
16892 TRANSACTION_ENLISTMENT_PAIR SuperiorEnlistmentPair;
16893 } TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION, *PTRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION;
16894
16895 typedef struct _RESOURCEMANAGER_BASIC_INFORMATION {
16896 GUID ResourceManagerId;
16897 ULONG DescriptionLength;
16898 WCHAR Description[1];
16899 } RESOURCEMANAGER_BASIC_INFORMATION, *PRESOURCEMANAGER_BASIC_INFORMATION;
16900
16901 typedef struct _RESOURCEMANAGER_COMPLETION_INFORMATION {
16902 HANDLE IoCompletionPortHandle;
16903 ULONG_PTR CompletionKey;
16904 } RESOURCEMANAGER_COMPLETION_INFORMATION, *PRESOURCEMANAGER_COMPLETION_INFORMATION;
16905
16906 typedef enum _KTMOBJECT_TYPE {
16907 KTMOBJECT_TRANSACTION,
16908 KTMOBJECT_TRANSACTION_MANAGER,
16909 KTMOBJECT_RESOURCE_MANAGER,
16910 KTMOBJECT_ENLISTMENT,
16911 KTMOBJECT_INVALID
16912 } KTMOBJECT_TYPE, *PKTMOBJECT_TYPE;
16913
16914 typedef struct _KTMOBJECT_CURSOR {
16915 GUID LastQuery;
16916 ULONG ObjectIdCount;
16917 GUID ObjectIds[1];
16918 } KTMOBJECT_CURSOR, *PKTMOBJECT_CURSOR;
16919
16920 typedef enum _TRANSACTION_INFORMATION_CLASS {
16921 TransactionBasicInformation,
16922 TransactionPropertiesInformation,
16923 TransactionEnlistmentInformation,
16924 TransactionSuperiorEnlistmentInformation
16925 } TRANSACTION_INFORMATION_CLASS;
16926
16927 typedef enum _TRANSACTIONMANAGER_INFORMATION_CLASS {
16928 TransactionManagerBasicInformation,
16929 TransactionManagerLogInformation,
16930 TransactionManagerLogPathInformation,
16931 TransactionManagerRecoveryInformation = 4
16932 } TRANSACTIONMANAGER_INFORMATION_CLASS;
16933
16934 typedef enum _RESOURCEMANAGER_INFORMATION_CLASS {
16935 ResourceManagerBasicInformation,
16936 ResourceManagerCompletionInformation,
16937 } RESOURCEMANAGER_INFORMATION_CLASS;
16938
16939 typedef struct _ENLISTMENT_BASIC_INFORMATION {
16940 GUID EnlistmentId;
16941 GUID TransactionId;
16942 GUID ResourceManagerId;
16943 } ENLISTMENT_BASIC_INFORMATION, *PENLISTMENT_BASIC_INFORMATION;
16944
16945 typedef struct _ENLISTMENT_CRM_INFORMATION {
16946 GUID CrmTransactionManagerId;
16947 GUID CrmResourceManagerId;
16948 GUID CrmEnlistmentId;
16949 } ENLISTMENT_CRM_INFORMATION, *PENLISTMENT_CRM_INFORMATION;
16950
16951 typedef enum _ENLISTMENT_INFORMATION_CLASS {
16952 EnlistmentBasicInformation,
16953 EnlistmentRecoveryInformation,
16954 EnlistmentCrmInformation
16955 } ENLISTMENT_INFORMATION_CLASS;
16956
16957 typedef struct _TRANSACTION_LIST_ENTRY {
16958 #if defined(__cplusplus)
16959 ::UOW UOW;
16960 #else
16961 UOW UOW;
16962 #endif
16963 } TRANSACTION_LIST_ENTRY, *PTRANSACTION_LIST_ENTRY;
16964
16965 typedef struct _TRANSACTION_LIST_INFORMATION {
16966 ULONG NumberOfTransactions;
16967 TRANSACTION_LIST_ENTRY TransactionInformation[1];
16968 } TRANSACTION_LIST_INFORMATION, *PTRANSACTION_LIST_INFORMATION;
16969
16970 typedef NTSTATUS
16971 (NTAPI *PFN_NT_CREATE_TRANSACTION)(
16972 _Out_ PHANDLE TransactionHandle,
16973 _In_ ACCESS_MASK DesiredAccess,
16974 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
16975 _In_opt_ LPGUID Uow,
16976 _In_opt_ HANDLE TmHandle,
16977 _In_opt_ ULONG CreateOptions,
16978 _In_opt_ ULONG IsolationLevel,
16979 _In_opt_ ULONG IsolationFlags,
16980 _In_opt_ PLARGE_INTEGER Timeout,
16981 _In_opt_ PUNICODE_STRING Description);
16982
16983 typedef NTSTATUS
16984 (NTAPI *PFN_NT_OPEN_TRANSACTION)(
16985 _Out_ PHANDLE TransactionHandle,
16986 _In_ ACCESS_MASK DesiredAccess,
16987 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
16988 _In_opt_ LPGUID Uow,
16989 _In_opt_ HANDLE TmHandle);
16990
16991 typedef NTSTATUS
16992 (NTAPI *PFN_NT_QUERY_INFORMATION_TRANSACTION)(
16993 _In_ HANDLE TransactionHandle,
16994 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
16995 _Out_writes_bytes_(TransactionInformationLength) PVOID TransactionInformation,
16996 _In_ ULONG TransactionInformationLength,
16997 _Out_opt_ PULONG ReturnLength);
16998
16999 typedef NTSTATUS
17000 (NTAPI *PFN_NT_SET_INFORMATION_TRANSACTION)(
17001 _In_ HANDLE TransactionHandle,
17002 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
17003 _In_ PVOID TransactionInformation,
17004 _In_ ULONG TransactionInformationLength);
17005
17006 typedef NTSTATUS
17007 (NTAPI *PFN_NT_COMMIT_TRANSACTION)(
17008 _In_ HANDLE TransactionHandle,
17009 _In_ BOOLEAN Wait);
17010
17011 typedef NTSTATUS
17012 (NTAPI *PFN_NT_ROLLBACK_TRANSACTION)(
17013 _In_ HANDLE TransactionHandle,
17014 _In_ BOOLEAN Wait);
17015
17016 #if (NTDDI_VERSION >= NTDDI_VISTA)
17017
17018 _Must_inspect_result_
17019 _IRQL_requires_max_ (APC_LEVEL)
17020 __kernel_entry
17021 NTSYSCALLAPI
17022 NTSTATUS
17023 NTAPI
17024 NtCreateTransactionManager(
17025 _Out_ PHANDLE TmHandle,
17026 _In_ ACCESS_MASK DesiredAccess,
17027 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
17028 _In_opt_ PUNICODE_STRING LogFileName,
17029 _In_opt_ ULONG CreateOptions,
17030 _In_opt_ ULONG CommitStrength);
17031
17032 _Must_inspect_result_
17033 _IRQL_requires_max_ (APC_LEVEL)
17034 __kernel_entry
17035 NTSYSCALLAPI
17036 NTSTATUS
17037 NTAPI
17038 NtOpenTransactionManager(
17039 _Out_ PHANDLE TmHandle,
17040 _In_ ACCESS_MASK DesiredAccess,
17041 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
17042 _In_opt_ PUNICODE_STRING LogFileName,
17043 _In_opt_ LPGUID TmIdentity,
17044 _In_opt_ ULONG OpenOptions);
17045
17046 _Must_inspect_result_
17047 _IRQL_requires_max_ (APC_LEVEL)
17048 __kernel_entry
17049 NTSYSCALLAPI
17050 NTSTATUS
17051 NTAPI
17052 NtRenameTransactionManager(
17053 _In_ PUNICODE_STRING LogFileName,
17054 _In_ LPGUID ExistingTransactionManagerGuid);
17055
17056 _Must_inspect_result_
17057 _IRQL_requires_max_ (APC_LEVEL)
17058 __kernel_entry
17059 NTSYSCALLAPI
17060 NTSTATUS
17061 NTAPI
17062 NtRollforwardTransactionManager(
17063 _In_ HANDLE TransactionManagerHandle,
17064 _In_opt_ PLARGE_INTEGER TmVirtualClock);
17065
17066 _Must_inspect_result_
17067 _IRQL_requires_max_ (APC_LEVEL)
17068 __kernel_entry
17069 NTSYSCALLAPI
17070 NTSTATUS
17071 NTAPI
17072 NtRecoverTransactionManager(
17073 _In_ HANDLE TransactionManagerHandle);
17074
17075 _Must_inspect_result_
17076 _IRQL_requires_max_ (APC_LEVEL)
17077 __kernel_entry
17078 NTSYSCALLAPI
17079 NTSTATUS
17080 NTAPI
17081 NtQueryInformationTransactionManager(
17082 _In_ HANDLE TransactionManagerHandle,
17083 _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
17084 _Out_writes_bytes_(TransactionManagerInformationLength) PVOID TransactionManagerInformation,
17085 _In_ ULONG TransactionManagerInformationLength,
17086 _Out_ PULONG ReturnLength);
17087
17088 _Must_inspect_result_
17089 _IRQL_requires_max_ (APC_LEVEL)
17090 __kernel_entry
17091 NTSYSCALLAPI
17092 NTSTATUS
17093 NTAPI
17094 NtSetInformationTransactionManager(
17095 _In_opt_ HANDLE TmHandle,
17096 _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
17097 _In_reads_bytes_(TransactionManagerInformationLength) PVOID TransactionManagerInformation,
17098 _In_ ULONG TransactionManagerInformationLength);
17099
17100 _Must_inspect_result_
17101 _IRQL_requires_max_ (APC_LEVEL)
17102 __kernel_entry
17103 NTSYSCALLAPI
17104 NTSTATUS
17105 NTAPI
17106 NtEnumerateTransactionObject(
17107 _In_opt_ HANDLE RootObjectHandle,
17108 _In_ KTMOBJECT_TYPE QueryType,
17109 _Inout_updates_bytes_(ObjectCursorLength) PKTMOBJECT_CURSOR ObjectCursor,
17110 _In_ ULONG ObjectCursorLength,
17111 _Out_ PULONG ReturnLength);
17112
17113 _Must_inspect_result_
17114 _IRQL_requires_max_ (APC_LEVEL)
17115 __kernel_entry
17116 NTSYSCALLAPI
17117 NTSTATUS
17118 NTAPI
17119 NtCreateTransaction(
17120 _Out_ PHANDLE TransactionHandle,
17121 _In_ ACCESS_MASK DesiredAccess,
17122 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
17123 _In_opt_ LPGUID Uow,
17124 _In_opt_ HANDLE TmHandle,
17125 _In_opt_ ULONG CreateOptions,
17126 _In_opt_ ULONG IsolationLevel,
17127 _In_opt_ ULONG IsolationFlags,
17128 _In_opt_ PLARGE_INTEGER Timeout,
17129 _In_opt_ PUNICODE_STRING Description);
17130
17131 _Must_inspect_result_
17132 _IRQL_requires_max_ (APC_LEVEL)
17133 __kernel_entry
17134 NTSYSCALLAPI
17135 NTSTATUS
17136 NTAPI
17137 NtOpenTransaction(
17138 _Out_ PHANDLE TransactionHandle,
17139 _In_ ACCESS_MASK DesiredAccess,
17140 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
17141 _In_ LPGUID Uow,
17142 _In_opt_ HANDLE TmHandle);
17143
17144 _Must_inspect_result_
17145 _IRQL_requires_max_ (APC_LEVEL)
17146 __kernel_entry
17147 NTSYSCALLAPI
17148 NTSTATUS
17149 NTAPI
17150 NtQueryInformationTransaction(
17151 _In_ HANDLE TransactionHandle,
17152 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
17153 _Out_writes_bytes_(TransactionInformationLength) PVOID TransactionInformation,
17154 _In_ ULONG TransactionInformationLength,
17155 _Out_opt_ PULONG ReturnLength);
17156
17157 _Must_inspect_result_
17158 _IRQL_requires_max_ (APC_LEVEL)
17159 __kernel_entry
17160 NTSYSCALLAPI
17161 NTSTATUS
17162 NTAPI
17163 NtSetInformationTransaction(
17164 _In_ HANDLE TransactionHandle,
17165 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
17166 _In_reads_bytes_(TransactionInformationLength) PVOID TransactionInformation,
17167 _In_ ULONG TransactionInformationLength);
17168
17169 _IRQL_requires_max_ (APC_LEVEL)
17170 __kernel_entry
17171 NTSYSCALLAPI
17172 NTSTATUS
17173 NTAPI
17174 NtCommitTransaction(
17175 _In_ HANDLE TransactionHandle,
17176 _In_ BOOLEAN Wait);
17177
17178 _IRQL_requires_max_ (APC_LEVEL)
17179 __kernel_entry
17180 NTSYSCALLAPI
17181 NTSTATUS
17182 NTAPI
17183 NtRollbackTransaction(
17184 _In_ HANDLE TransactionHandle,
17185 _In_ BOOLEAN Wait);
17186
17187 _Must_inspect_result_
17188 _IRQL_requires_max_ (APC_LEVEL)
17189 __kernel_entry
17190 NTSYSCALLAPI
17191 NTSTATUS
17192 NTAPI
17193 NtCreateEnlistment(
17194 _Out_ PHANDLE EnlistmentHandle,
17195 _In_ ACCESS_MASK DesiredAccess,
17196 _In_ HANDLE ResourceManagerHandle,
17197 _In_ HANDLE TransactionHandle,
17198 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
17199 _In_opt_ ULONG CreateOptions,
17200 _In_ NOTIFICATION_MASK NotificationMask,
17201 _In_opt_ PVOID EnlistmentKey);
17202
17203 _Must_inspect_result_
17204 _IRQL_requires_max_ (APC_LEVEL)
17205 __kernel_entry
17206 NTSYSCALLAPI
17207 NTSTATUS
17208 NTAPI
17209 NtOpenEnlistment(
17210 _Out_ PHANDLE EnlistmentHandle,
17211 _In_ ACCESS_MASK DesiredAccess,
17212 _In_ HANDLE ResourceManagerHandle,
17213 _In_ LPGUID EnlistmentGuid,
17214 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes);
17215
17216 _Must_inspect_result_
17217 _IRQL_requires_max_ (APC_LEVEL)
17218 __kernel_entry
17219 NTSYSCALLAPI
17220 NTSTATUS
17221 NTAPI
17222 NtQueryInformationEnlistment(
17223 _In_ HANDLE EnlistmentHandle,
17224 _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
17225 _Out_writes_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation,
17226 _In_ ULONG EnlistmentInformationLength,
17227 _Out_ PULONG ReturnLength);
17228
17229 _Must_inspect_result_
17230 _IRQL_requires_max_ (APC_LEVEL)
17231 __kernel_entry
17232 NTSYSCALLAPI
17233 NTSTATUS
17234 NTAPI
17235 NtSetInformationEnlistment(
17236 _In_opt_ HANDLE EnlistmentHandle,
17237 _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
17238 _In_reads_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation,
17239 _In_ ULONG EnlistmentInformationLength);
17240
17241 _Must_inspect_result_
17242 _IRQL_requires_max_ (APC_LEVEL)
17243 __kernel_entry
17244 NTSYSCALLAPI
17245 NTSTATUS
17246 NTAPI
17247 NtRecoverEnlistment(
17248 _In_ HANDLE EnlistmentHandle,
17249 _In_opt_ PVOID EnlistmentKey);
17250
17251 _Must_inspect_result_
17252 _IRQL_requires_max_ (APC_LEVEL)
17253 __kernel_entry
17254 NTSYSCALLAPI
17255 NTSTATUS
17256 NTAPI
17257 NtPrePrepareEnlistment(
17258 _In_ HANDLE EnlistmentHandle,
17259 _In_opt_ PLARGE_INTEGER TmVirtualClock);
17260
17261 _Must_inspect_result_
17262 _IRQL_requires_max_ (APC_LEVEL)
17263 __kernel_entry
17264 NTSYSCALLAPI
17265 NTSTATUS
17266 NTAPI
17267 NtPrepareEnlistment(
17268 _In_ HANDLE EnlistmentHandle,
17269 _In_opt_ PLARGE_INTEGER TmVirtualClock);
17270
17271 _Must_inspect_result_
17272 _IRQL_requires_max_ (APC_LEVEL)
17273 __kernel_entry
17274 NTSYSCALLAPI
17275 NTSTATUS
17276 NTAPI
17277 NtCommitEnlistment(
17278 _In_ HANDLE EnlistmentHandle,
17279 _In_opt_ PLARGE_INTEGER TmVirtualClock);
17280
17281 _IRQL_requires_max_ (APC_LEVEL)
17282 __kernel_entry
17283 NTSYSCALLAPI
17284 NTSTATUS
17285 NTAPI
17286 NtRollbackEnlistment(
17287 _In_ HANDLE EnlistmentHandle,
17288 _In_opt_ PLARGE_INTEGER TmVirtualClock);
17289
17290 _IRQL_requires_max_ (APC_LEVEL)
17291 __kernel_entry
17292 NTSYSCALLAPI
17293 NTSTATUS
17294 NTAPI
17295 NtPrePrepareComplete(
17296 _In_ HANDLE EnlistmentHandle,
17297 _In_opt_ PLARGE_INTEGER TmVirtualClock);
17298
17299 _IRQL_requires_max_ (APC_LEVEL)
17300 __kernel_entry
17301 NTSYSCALLAPI
17302 NTSTATUS
17303 NTAPI
17304 NtPrepareComplete(
17305 _In_ HANDLE EnlistmentHandle,
17306 _In_opt_ PLARGE_INTEGER TmVirtualClock);
17307
17308 _IRQL_requires_max_ (APC_LEVEL)
17309 __kernel_entry
17310 NTSYSCALLAPI
17311 NTSTATUS
17312 NTAPI
17313 NtCommitComplete(
17314 _In_ HANDLE EnlistmentHandle,
17315 _In_opt_ PLARGE_INTEGER TmVirtualClock);
17316
17317 _IRQL_requires_max_ (APC_LEVEL)
17318 __kernel_entry
17319 NTSYSCALLAPI
17320 NTSTATUS
17321 NTAPI
17322 NtReadOnlyEnlistment(
17323 _In_ HANDLE EnlistmentHandle,
17324 _In_opt_ PLARGE_INTEGER TmVirtualClock);
17325
17326 _IRQL_requires_max_ (APC_LEVEL)
17327 __kernel_entry
17328 NTSYSCALLAPI
17329 NTSTATUS
17330 NTAPI
17331 NtRollbackComplete(
17332 _In_ HANDLE EnlistmentHandle,
17333 _In_opt_ PLARGE_INTEGER TmVirtualClock);
17334
17335 _IRQL_requires_max_ (APC_LEVEL)
17336 __kernel_entry
17337 NTSYSCALLAPI
17338 NTSTATUS
17339 NTAPI
17340 NtSinglePhaseReject(
17341 _In_ HANDLE EnlistmentHandle,
17342 _In_opt_ PLARGE_INTEGER TmVirtualClock);
17343
17344 _Must_inspect_result_
17345 _IRQL_requires_max_ (APC_LEVEL)
17346 __kernel_entry
17347 NTSYSCALLAPI
17348 NTSTATUS
17349 NTAPI
17350 NtCreateResourceManager(
17351 _Out_ PHANDLE ResourceManagerHandle,
17352 _In_ ACCESS_MASK DesiredAccess,
17353 _In_ HANDLE TmHandle,
17354 _In_ LPGUID RmGuid,
17355 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
17356 _In_opt_ ULONG CreateOptions,
17357 _In_opt_ PUNICODE_STRING Description);
17358
17359 _Must_inspect_result_
17360 _IRQL_requires_max_ (APC_LEVEL)
17361 __kernel_entry
17362 NTSYSCALLAPI
17363 NTSTATUS
17364 NTAPI
17365 NtOpenResourceManager(
17366 _Out_ PHANDLE ResourceManagerHandle,
17367 _In_ ACCESS_MASK DesiredAccess,
17368 _In_ HANDLE TmHandle,
17369 _In_opt_ LPGUID ResourceManagerGuid,
17370 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes);
17371
17372 _Must_inspect_result_
17373 _IRQL_requires_max_ (APC_LEVEL)
17374 __kernel_entry
17375 NTSYSCALLAPI
17376 NTSTATUS
17377 NTAPI
17378 NtRecoverResourceManager(
17379 _In_ HANDLE ResourceManagerHandle);
17380
17381 _Must_inspect_result_
17382 _IRQL_requires_max_ (APC_LEVEL)
17383 __kernel_entry
17384 NTSYSCALLAPI
17385 NTSTATUS
17386 NTAPI
17387 NtGetNotificationResourceManager(
17388 _In_ HANDLE ResourceManagerHandle,
17389 _Out_ PTRANSACTION_NOTIFICATION TransactionNotification,
17390 _In_ ULONG NotificationLength,
17391 _In_opt_ PLARGE_INTEGER Timeout,
17392 _Out_opt_ PULONG ReturnLength,
17393 _In_ ULONG Asynchronous,
17394 _In_opt_ ULONG_PTR AsynchronousContext);
17395
17396 _Must_inspect_result_
17397 _IRQL_requires_max_ (APC_LEVEL)
17398 __kernel_entry
17399 NTSYSCALLAPI
17400 NTSTATUS
17401 NTAPI
17402 NtQueryInformationResourceManager(
17403 _In_ HANDLE ResourceManagerHandle,
17404 _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
17405 _Out_writes_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation,
17406 _In_ ULONG ResourceManagerInformationLength,
17407 _Out_opt_ PULONG ReturnLength);
17408
17409 _Must_inspect_result_
17410 _IRQL_requires_max_ (APC_LEVEL)
17411 __kernel_entry
17412 NTSYSCALLAPI
17413 NTSTATUS
17414 NTAPI
17415 NtSetInformationResourceManager(
17416 _In_ HANDLE ResourceManagerHandle,
17417 _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
17418 _In_reads_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation,
17419 _In_ ULONG ResourceManagerInformationLength);
17420
17421 _Must_inspect_result_
17422 _IRQL_requires_max_ (APC_LEVEL)
17423 __kernel_entry
17424 NTSYSCALLAPI
17425 NTSTATUS
17426 NTAPI
17427 NtRegisterProtocolAddressInformation(
17428 _In_ HANDLE ResourceManager,
17429 _In_ PCRM_PROTOCOL_ID ProtocolId,
17430 _In_ ULONG ProtocolInformationSize,
17431 _In_ PVOID ProtocolInformation,
17432 _In_opt_ ULONG CreateOptions);
17433
17434 _IRQL_requires_max_ (APC_LEVEL)
17435 __kernel_entry
17436 NTSYSCALLAPI
17437 NTSTATUS
17438 NTAPI
17439 NtPropagationComplete(
17440 _In_ HANDLE ResourceManagerHandle,
17441 _In_ ULONG RequestCookie,
17442 _In_ ULONG BufferLength,
17443 _In_ PVOID Buffer);
17444
17445 _IRQL_requires_max_ (APC_LEVEL)
17446 __kernel_entry
17447 NTSYSCALLAPI
17448 NTSTATUS
17449 NTAPI
17450 NtPropagationFailed(
17451 _In_ HANDLE ResourceManagerHandle,
17452 _In_ ULONG RequestCookie,
17453 _In_ NTSTATUS PropStatus);
17454
17455 #endif /* NTDDI_VERSION >= NTDDI_VISTA */
17456
17457 #endif /* !_NTTMAPI_ */
17458 /******************************************************************************
17459 * ZwXxx Functions *
17460 ******************************************************************************/
17461
17462
17463 /* Constants */
17464 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
17465 #define ZwCurrentProcess() NtCurrentProcess()
17466 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
17467 #define ZwCurrentThread() NtCurrentThread()
17468
17469
17470 #if (NTDDI_VERSION >= NTDDI_WIN2K)
17471
17472 _IRQL_requires_max_(PASSIVE_LEVEL)
17473 NTSYSAPI
17474 NTSTATUS
17475 NTAPI
17476 ZwClose(
17477 _In_ HANDLE Handle);
17478
17479 _IRQL_requires_max_(PASSIVE_LEVEL)
17480 NTSYSAPI
17481 NTSTATUS
17482 NTAPI
17483 ZwCreateDirectoryObject(
17484 _Out_ PHANDLE DirectoryHandle,
17485 _In_ ACCESS_MASK DesiredAccess,
17486 _In_ POBJECT_ATTRIBUTES ObjectAttributes);
17487
17488 _IRQL_requires_max_(PASSIVE_LEVEL)
17489 NTSYSAPI
17490 NTSTATUS
17491 NTAPI
17492 ZwCreateFile(
17493 _Out_ PHANDLE FileHandle,
17494 _In_ ACCESS_MASK DesiredAccess,
17495 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
17496 _Out_ PIO_STATUS_BLOCK IoStatusBlock,
17497 _In_opt_ PLARGE_INTEGER AllocationSize,
17498 _In_ ULONG FileAttributes,
17499 _In_ ULONG ShareAccess,
17500 _In_ ULONG CreateDisposition,
17501 _In_ ULONG CreateOptions,
17502 _In_reads_bytes_opt_(EaLength) PVOID EaBuffer,
17503 _In_ ULONG EaLength
17504 );
17505
17506 _IRQL_requires_max_(PASSIVE_LEVEL)
17507 NTSYSAPI
17508 NTSTATUS
17509 NTAPI
17510 ZwCreateKey(
17511 _Out_ PHANDLE KeyHandle,
17512 _In_ ACCESS_MASK DesiredAccess,
17513 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
17514 _Reserved_ ULONG TitleIndex,
17515 _In_opt_ PUNICODE_STRING Class,
17516 _In_ ULONG CreateOptions,
17517 _Out_opt_ PULONG Disposition);
17518
17519 _IRQL_requires_max_(APC_LEVEL)
17520 NTSYSAPI
17521 NTSTATUS
17522 NTAPI
17523 ZwCreateSection(
17524 _Out_ PHANDLE SectionHandle,
17525 _In_ ACCESS_MASK DesiredAccess,
17526 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
17527 _In_opt_ PLARGE_INTEGER MaximumSize,
17528 _In_ ULONG SectionPageProtection,
17529 _In_ ULONG AllocationAttributes,
17530 _In_opt_ HANDLE FileHandle);
17531
17532 _IRQL_requires_max_(PASSIVE_LEVEL)
17533 NTSYSAPI
17534 NTSTATUS
17535 NTAPI
17536 ZwDeleteKey(
17537 _In_ HANDLE KeyHandle);
17538
17539 _IRQL_requires_max_(PASSIVE_LEVEL)
17540 NTSYSAPI
17541 NTSTATUS
17542 NTAPI
17543 ZwDeleteValueKey(
17544 _In_ HANDLE KeyHandle,
17545 _In_ PUNICODE_STRING ValueName);
17546
17547 _IRQL_requires_max_(PASSIVE_LEVEL)
17548 _When_(Length == 0, _Post_satisfies_(return < 0))
17549 _When_(Length > 0, _Post_satisfies_(return <= 0))
17550 NTSYSAPI
17551 NTSTATUS
17552 NTAPI
17553 ZwEnumerateKey(
17554 _In_ HANDLE KeyHandle,
17555 _In_ ULONG Index,
17556 _In_ KEY_INFORMATION_CLASS KeyInformationClass,
17557 _Out_writes_bytes_opt_(Length) PVOID KeyInformation,
17558 _In_ ULONG Length,
17559 _Out_ PULONG ResultLength);
17560
17561 _IRQL_requires_max_(PASSIVE_LEVEL)
17562 _When_(Length == 0, _Post_satisfies_(return < 0))
17563 _When_(Length > 0, _Post_satisfies_(return <= 0))
17564 NTSYSAPI
17565 NTSTATUS
17566 NTAPI
17567 ZwEnumerateValueKey(
17568 _In_ HANDLE KeyHandle,
17569 _In_ ULONG Index,
17570 _In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
17571 _Out_writes_bytes_opt_(Length) PVOID KeyValueInformation,
17572 _In_ ULONG Length,
17573 _Out_ PULONG ResultLength);
17574
17575 _IRQL_requires_max_(PASSIVE_LEVEL)
17576 NTSYSAPI
17577 NTSTATUS
17578 NTAPI
17579 ZwFlushKey(
17580 _In_ HANDLE KeyHandle);
17581
17582 _IRQL_requires_max_(PASSIVE_LEVEL)
17583 NTSYSAPI
17584 NTSTATUS
17585 NTAPI
17586 ZwLoadDriver(
17587 _In_ PUNICODE_STRING DriverServiceName);
17588
17589 _IRQL_requires_max_(PASSIVE_LEVEL)
17590 NTSYSAPI
17591 NTSTATUS
17592 NTAPI
17593 ZwMakeTemporaryObject(
17594 _In_ HANDLE Handle);
17595
17596 _IRQL_requires_max_(PASSIVE_LEVEL)
17597 NTSYSAPI
17598 NTSTATUS
17599 NTAPI
17600 ZwMapViewOfSection(
17601 _In_ HANDLE SectionHandle,
17602 _In_ HANDLE ProcessHandle,
17603 _Outptr_result_bytebuffer_(*ViewSize) PVOID *BaseAddress,
17604 _In_ ULONG_PTR ZeroBits,
17605 _In_ SIZE_T CommitSize,
17606 _Inout_opt_ PLARGE_INTEGER SectionOffset,
17607 _Inout_ PSIZE_T ViewSize,
17608 _In_ SECTION_INHERIT InheritDisposition,
17609 _In_ ULONG AllocationType,
17610 _In_ ULONG Protect);
17611
17612 _IRQL_requires_max_(PASSIVE_LEVEL)
17613 NTSYSAPI
17614 NTSTATUS
17615 NTAPI
17616 ZwOpenFile(
17617 _Out_ PHANDLE FileHandle,
17618 _In_ ACCESS_MASK DesiredAccess,
17619 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
17620 _Out_ PIO_STATUS_BLOCK IoStatusBlock,
17621 _In_ ULONG ShareAccess,
17622 _In_ ULONG OpenOptions);
17623
17624 _IRQL_requires_max_(PASSIVE_LEVEL)
17625 NTSYSAPI
17626 NTSTATUS
17627 NTAPI
17628 ZwOpenKey(
17629 _Out_ PHANDLE KeyHandle,
17630 _In_ ACCESS_MASK DesiredAccess,
17631 _In_ POBJECT_ATTRIBUTES ObjectAttributes);
17632
17633 _IRQL_requires_max_(PASSIVE_LEVEL)
17634 NTSYSAPI
17635 NTSTATUS
17636 NTAPI
17637 ZwOpenSection(
17638 _Out_ PHANDLE SectionHandle,
17639 _In_ ACCESS_MASK DesiredAccess,
17640 _In_ POBJECT_ATTRIBUTES ObjectAttributes);
17641
17642 _IRQL_requires_max_(PASSIVE_LEVEL)
17643 NTSYSAPI
17644 NTSTATUS
17645 NTAPI
17646 ZwOpenSymbolicLinkObject(
17647 _Out_ PHANDLE LinkHandle,
17648 _In_ ACCESS_MASK DesiredAccess,
17649 _In_ POBJECT_ATTRIBUTES ObjectAttributes);
17650
17651 _IRQL_requires_max_(PASSIVE_LEVEL)
17652 NTSYSAPI
17653 NTSTATUS
17654 NTAPI
17655 ZwQueryInformationFile(
17656 _In_ HANDLE FileHandle,
17657 _Out_ PIO_STATUS_BLOCK IoStatusBlock,
17658 _Out_writes_bytes_(Length) PVOID FileInformation,
17659 _In_ ULONG Length,
17660 _In_ FILE_INFORMATION_CLASS FileInformationClass);
17661
17662 _IRQL_requires_max_(PASSIVE_LEVEL)
17663 _When_(Length == 0, _Post_satisfies_(return < 0))
17664 _When_(Length > 0, _Post_satisfies_(return <= 0))
17665 NTSYSAPI
17666 NTSTATUS
17667 NTAPI
17668 ZwQueryKey(
17669 _In_ HANDLE KeyHandle,
17670 _In_ KEY_INFORMATION_CLASS KeyInformationClass,
17671 _Out_writes_bytes_opt_(Length) PVOID KeyInformation,
17672 _In_ ULONG Length,
17673 _Out_ PULONG ResultLength);
17674
17675 _IRQL_requires_max_(PASSIVE_LEVEL)
17676 NTSYSAPI
17677 NTSTATUS
17678 NTAPI
17679 ZwQuerySymbolicLinkObject(
17680 _In_ HANDLE LinkHandle,
17681 _Inout_ PUNICODE_STRING LinkTarget,
17682 _Out_opt_ PULONG ReturnedLength);
17683
17684 _IRQL_requires_max_(PASSIVE_LEVEL)
17685 _When_(Length == 0, _Post_satisfies_(return < 0))
17686 _When_(Length > 0, _Post_satisfies_(return <= 0))
17687 NTSYSAPI
17688 NTSTATUS
17689 NTAPI
17690 ZwQueryValueKey(
17691 _In_ HANDLE KeyHandle,
17692 _In_ PUNICODE_STRING ValueName,
17693 _In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
17694 _Out_writes_bytes_opt_(Length) PVOID KeyValueInformation,
17695 _In_ ULONG Length,
17696 _Out_ PULONG ResultLength);
17697
17698 _IRQL_requires_max_(PASSIVE_LEVEL)
17699 NTSYSAPI
17700 NTSTATUS
17701 NTAPI
17702 ZwReadFile(
17703 _In_ HANDLE FileHandle,
17704 _In_opt_ HANDLE Event,
17705 _In_opt_ PIO_APC_ROUTINE ApcRoutine,
17706 _In_opt_ PVOID ApcContext,
17707 _Out_ PIO_STATUS_BLOCK IoStatusBlock,
17708 _Out_writes_bytes_(Length) PVOID Buffer,
17709 _In_ ULONG Length,
17710 _In_opt_ PLARGE_INTEGER ByteOffset,
17711 _In_opt_ PULONG Key);
17712
17713 _IRQL_requires_max_(PASSIVE_LEVEL)
17714 NTSYSAPI
17715 NTSTATUS
17716 NTAPI
17717 ZwSetInformationFile(
17718 _In_ HANDLE FileHandle,
17719 _Out_ PIO_STATUS_BLOCK IoStatusBlock,
17720 _In_reads_bytes_(Length) PVOID FileInformation,
17721 _In_ ULONG Length,
17722 _In_ FILE_INFORMATION_CLASS FileInformationClass);
17723
17724 _IRQL_requires_max_(PASSIVE_LEVEL)
17725 NTSYSAPI
17726 NTSTATUS
17727 NTAPI
17728 ZwSetValueKey(
17729 _In_ HANDLE KeyHandle,
17730 _In_ PUNICODE_STRING ValueName,
17731 _In_opt_ ULONG TitleIndex,
17732 _In_ ULONG Type,
17733 _In_reads_bytes_opt_(DataSize) PVOID Data,
17734 _In_ ULONG DataSize);
17735
17736 _IRQL_requires_max_(PASSIVE_LEVEL)
17737 NTSYSAPI
17738 NTSTATUS
17739 NTAPI
17740 ZwUnloadDriver(
17741 _In_ PUNICODE_STRING DriverServiceName);
17742
17743 _IRQL_requires_max_(PASSIVE_LEVEL)
17744 NTSYSAPI
17745 NTSTATUS
17746 NTAPI
17747 ZwUnmapViewOfSection(
17748 _In_ HANDLE ProcessHandle,
17749 _In_opt_ PVOID BaseAddress);
17750
17751 _IRQL_requires_max_(PASSIVE_LEVEL)
17752 NTSYSAPI
17753 NTSTATUS
17754 NTAPI
17755 ZwWriteFile(
17756 _In_ HANDLE FileHandle,
17757 _In_opt_ HANDLE Event,
17758 _In_opt_ PIO_APC_ROUTINE ApcRoutine,
17759 _In_opt_ PVOID ApcContext,
17760 _Out_ PIO_STATUS_BLOCK IoStatusBlock,
17761 _In_reads_bytes_(Length) PVOID Buffer,
17762 _In_ ULONG Length,
17763 _In_opt_ PLARGE_INTEGER ByteOffset,
17764 _In_opt_ PULONG Key);
17765
17766 _IRQL_requires_max_(PASSIVE_LEVEL)
17767 NTSYSAPI
17768 NTSTATUS
17769 NTAPI
17770 ZwQueryFullAttributesFile(
17771 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
17772 _Out_ PFILE_NETWORK_OPEN_INFORMATION FileInformation);
17773
17774 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
17775
17776
17777 #if (NTDDI_VERSION >= NTDDI_WS03)
17778 _IRQL_requires_max_(PASSIVE_LEVEL)
17779 NTSYSCALLAPI
17780 NTSTATUS
17781 NTAPI
17782 ZwOpenEvent(
17783 _Out_ PHANDLE EventHandle,
17784 _In_ ACCESS_MASK DesiredAccess,
17785 _In_ POBJECT_ATTRIBUTES ObjectAttributes);
17786 #endif
17787
17788 #if (NTDDI_VERSION >= NTDDI_VISTA)
17789
17790 _IRQL_requires_max_(PASSIVE_LEVEL)
17791 NTSYSAPI
17792 NTSTATUS
17793 ZwCreateKeyTransacted(
17794 _Out_ PHANDLE KeyHandle,
17795 _In_ ACCESS_MASK DesiredAccess,
17796 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
17797 _Reserved_ ULONG TitleIndex,
17798 _In_opt_ PUNICODE_STRING Class,
17799 _In_ ULONG CreateOptions,
17800 _In_ HANDLE TransactionHandle,
17801 _Out_opt_ PULONG Disposition);
17802
17803 _IRQL_requires_max_(PASSIVE_LEVEL)
17804 NTSYSAPI
17805 NTSTATUS
17806 NTAPI
17807 ZwOpenKeyTransacted(
17808 _Out_ PHANDLE KeyHandle,
17809 _In_ ACCESS_MASK DesiredAccess,
17810 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
17811 _In_ HANDLE TransactionHandle);
17812
17813 _IRQL_requires_max_(PASSIVE_LEVEL)
17814 NTSYSCALLAPI
17815 NTSTATUS
17816 NTAPI
17817 ZwCreateTransactionManager(
17818 _Out_ PHANDLE TmHandle,
17819 _In_ ACCESS_MASK DesiredAccess,
17820 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
17821 _In_opt_ PUNICODE_STRING LogFileName,
17822 _In_opt_ ULONG CreateOptions,
17823 _In_opt_ ULONG CommitStrength);
17824
17825 _IRQL_requires_max_(PASSIVE_LEVEL)
17826 NTSYSCALLAPI
17827 NTSTATUS
17828 NTAPI
17829 ZwOpenTransactionManager(
17830 _Out_ PHANDLE TmHandle,
17831 _In_ ACCESS_MASK DesiredAccess,
17832 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
17833 _In_opt_ PUNICODE_STRING LogFileName,
17834 _In_opt_ LPGUID TmIdentity,
17835 _In_opt_ ULONG OpenOptions);
17836
17837 _IRQL_requires_max_(PASSIVE_LEVEL)
17838 NTSYSCALLAPI
17839 NTSTATUS
17840 NTAPI
17841 ZwRollforwardTransactionManager(
17842 _In_ HANDLE TransactionManagerHandle,
17843 _In_opt_ PLARGE_INTEGER TmVirtualClock);
17844
17845 _IRQL_requires_max_(PASSIVE_LEVEL)
17846 NTSYSCALLAPI
17847 NTSTATUS
17848 NTAPI
17849 ZwRecoverTransactionManager(
17850 _In_ HANDLE TransactionManagerHandle);
17851
17852 _IRQL_requires_max_(PASSIVE_LEVEL)
17853 NTSYSCALLAPI
17854 NTSTATUS
17855 NTAPI
17856 ZwQueryInformationTransactionManager(
17857 _In_ HANDLE TransactionManagerHandle,
17858 _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
17859 _Out_writes_bytes_(TransactionManagerInformationLength) PVOID TransactionManagerInformation,
17860 _In_ ULONG TransactionManagerInformationLength,
17861 _Out_opt_ PULONG ReturnLength);
17862
17863 _IRQL_requires_max_(PASSIVE_LEVEL)
17864 NTSYSCALLAPI
17865 NTSTATUS
17866 NTAPI
17867 ZwSetInformationTransactionManager(
17868 _In_ HANDLE TmHandle,
17869 _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
17870 _In_ PVOID TransactionManagerInformation,
17871 _In_ ULONG TransactionManagerInformationLength);
17872
17873 _IRQL_requires_max_(PASSIVE_LEVEL)
17874 NTSYSCALLAPI
17875 NTSTATUS
17876 NTAPI
17877 ZwEnumerateTransactionObject(
17878 _In_opt_ HANDLE RootObjectHandle,
17879 _In_ KTMOBJECT_TYPE QueryType,
17880 _Inout_updates_bytes_(ObjectCursorLength) PKTMOBJECT_CURSOR ObjectCursor,
17881 _In_ ULONG ObjectCursorLength,
17882 _Out_ PULONG ReturnLength);
17883
17884 _IRQL_requires_max_(PASSIVE_LEVEL)
17885 NTSYSCALLAPI
17886 NTSTATUS
17887 NTAPI
17888 ZwCreateTransaction(
17889 _Out_ PHANDLE TransactionHandle,
17890 _In_ ACCESS_MASK DesiredAccess,
17891 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
17892 _In_opt_ LPGUID Uow,
17893 _In_opt_ HANDLE TmHandle,
17894 _In_opt_ ULONG CreateOptions,
17895 _In_opt_ ULONG IsolationLevel,
17896 _In_opt_ ULONG IsolationFlags,
17897 _In_opt_ PLARGE_INTEGER Timeout,
17898 _In_opt_ PUNICODE_STRING Description);
17899
17900 _IRQL_requires_max_(PASSIVE_LEVEL)
17901 NTSYSCALLAPI
17902 NTSTATUS
17903 NTAPI
17904 ZwOpenTransaction(
17905 _Out_ PHANDLE TransactionHandle,
17906 _In_ ACCESS_MASK DesiredAccess,
17907 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
17908 _In_ LPGUID Uow,
17909 _In_opt_ HANDLE TmHandle);
17910
17911 _IRQL_requires_max_(PASSIVE_LEVEL)
17912 NTSYSCALLAPI
17913 NTSTATUS
17914 NTAPI
17915 ZwQueryInformationTransaction(
17916 _In_ HANDLE TransactionHandle,
17917 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
17918 _Out_writes_bytes_(TransactionInformationLength) PVOID TransactionInformation,
17919 _In_ ULONG TransactionInformationLength,
17920 _Out_opt_ PULONG ReturnLength);
17921
17922 _IRQL_requires_max_(PASSIVE_LEVEL)
17923 NTSYSCALLAPI
17924 NTSTATUS
17925 NTAPI
17926 ZwSetInformationTransaction(
17927 _In_ HANDLE TransactionHandle,
17928 _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
17929 _In_ PVOID TransactionInformation,
17930 _In_ ULONG TransactionInformationLength);
17931
17932 _IRQL_requires_max_(PASSIVE_LEVEL)
17933 NTSYSCALLAPI
17934 NTSTATUS
17935 NTAPI
17936 ZwCommitTransaction(
17937 _In_ HANDLE TransactionHandle,
17938 _In_ BOOLEAN Wait);
17939
17940 _IRQL_requires_max_(PASSIVE_LEVEL)
17941 NTSYSCALLAPI
17942 NTSTATUS
17943 NTAPI
17944 ZwRollbackTransaction(
17945 _In_ HANDLE TransactionHandle,
17946 _In_ BOOLEAN Wait);
17947
17948 _IRQL_requires_max_(PASSIVE_LEVEL)
17949 NTSYSCALLAPI
17950 NTSTATUS
17951 NTAPI
17952 ZwCreateResourceManager(
17953 _Out_ PHANDLE ResourceManagerHandle,
17954 _In_ ACCESS_MASK DesiredAccess,
17955 _In_ HANDLE TmHandle,
17956 _In_opt_ LPGUID ResourceManagerGuid,
17957 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
17958 _In_opt_ ULONG CreateOptions,
17959 _In_opt_ PUNICODE_STRING Description);
17960
17961 _IRQL_requires_max_(PASSIVE_LEVEL)
17962 NTSYSCALLAPI
17963 NTSTATUS
17964 NTAPI
17965 ZwOpenResourceManager(
17966 _Out_ PHANDLE ResourceManagerHandle,
17967 _In_ ACCESS_MASK DesiredAccess,
17968 _In_ HANDLE TmHandle,
17969 _In_ LPGUID ResourceManagerGuid,
17970 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes);
17971
17972 _IRQL_requires_max_(PASSIVE_LEVEL)
17973 NTSYSCALLAPI
17974 NTSTATUS
17975 NTAPI
17976 ZwRecoverResourceManager(
17977 _In_ HANDLE ResourceManagerHandle);
17978
17979 _IRQL_requires_max_(PASSIVE_LEVEL)
17980 NTSYSCALLAPI
17981 NTSTATUS
17982 NTAPI
17983 ZwGetNotificationResourceManager(
17984 _In_ HANDLE ResourceManagerHandle,
17985 _Out_ PTRANSACTION_NOTIFICATION TransactionNotification,
17986 _In_ ULONG NotificationLength,
17987 _In_ PLARGE_INTEGER Timeout,
17988 _Out_opt_ PULONG ReturnLength,
17989 _In_ ULONG Asynchronous,
17990 _In_opt_ ULONG_PTR AsynchronousContext);
17991
17992 _IRQL_requires_max_(PASSIVE_LEVEL)
17993 NTSYSCALLAPI
17994 NTSTATUS
17995 NTAPI
17996 ZwQueryInformationResourceManager(
17997 _In_ HANDLE ResourceManagerHandle,
17998 _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
17999 _Out_writes_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation,
18000 _In_ ULONG ResourceManagerInformationLength,
18001 _Out_opt_ PULONG ReturnLength);
18002
18003 _IRQL_requires_max_(PASSIVE_LEVEL)
18004 NTSYSCALLAPI
18005 NTSTATUS
18006 NTAPI
18007 ZwSetInformationResourceManager(
18008 _In_ HANDLE ResourceManagerHandle,
18009 _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
18010 _In_reads_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation,
18011 _In_ ULONG ResourceManagerInformationLength);
18012
18013 _IRQL_requires_max_(PASSIVE_LEVEL)
18014 NTSYSCALLAPI
18015 NTSTATUS
18016 NTAPI
18017 ZwCreateEnlistment(
18018 _Out_ PHANDLE EnlistmentHandle,
18019 _In_ ACCESS_MASK DesiredAccess,
18020 _In_ HANDLE ResourceManagerHandle,
18021 _In_ HANDLE TransactionHandle,
18022 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
18023 _In_opt_ ULONG CreateOptions,
18024 _In_ NOTIFICATION_MASK NotificationMask,
18025 _In_opt_ PVOID EnlistmentKey);
18026
18027 _IRQL_requires_max_(PASSIVE_LEVEL)
18028 NTSYSCALLAPI
18029 NTSTATUS
18030 NTAPI
18031 ZwOpenEnlistment(
18032 _Out_ PHANDLE EnlistmentHandle,
18033 _In_ ACCESS_MASK DesiredAccess,
18034 _In_ HANDLE RmHandle,
18035 _In_ LPGUID EnlistmentGuid,
18036 _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes);
18037
18038 _IRQL_requires_max_(PASSIVE_LEVEL)
18039 NTSYSCALLAPI
18040 NTSTATUS
18041 NTAPI
18042 ZwQueryInformationEnlistment(
18043 _In_ HANDLE EnlistmentHandle,
18044 _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
18045 _Out_writes_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation,
18046 _In_ ULONG EnlistmentInformationLength,
18047 _Out_opt_ PULONG ReturnLength);
18048
18049 _IRQL_requires_max_(PASSIVE_LEVEL)
18050 NTSYSCALLAPI
18051 NTSTATUS
18052 NTAPI
18053 ZwSetInformationEnlistment(
18054 _In_ HANDLE EnlistmentHandle,
18055 _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
18056 _In_reads_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation,
18057 _In_ ULONG EnlistmentInformationLength);
18058
18059 _IRQL_requires_max_(PASSIVE_LEVEL)
18060 NTSYSCALLAPI
18061 NTSTATUS
18062 NTAPI
18063 ZwRecoverEnlistment(
18064 _In_ HANDLE EnlistmentHandle,
18065 _In_opt_ PVOID EnlistmentKey);
18066
18067 _IRQL_requires_max_(PASSIVE_LEVEL)
18068 NTSYSCALLAPI
18069 NTSTATUS
18070 NTAPI
18071 ZwPrePrepareEnlistment(
18072 _In_ HANDLE EnlistmentHandle,
18073 _In_opt_ PLARGE_INTEGER TmVirtualClock);
18074
18075 _IRQL_requires_max_(PASSIVE_LEVEL)
18076 NTSYSCALLAPI
18077 NTSTATUS
18078 NTAPI
18079 ZwPrepareEnlistment(
18080 _In_ HANDLE EnlistmentHandle,
18081 _In_opt_ PLARGE_INTEGER TmVirtualClock);
18082
18083 _IRQL_requires_max_(PASSIVE_LEVEL)
18084 NTSYSCALLAPI
18085 NTSTATUS
18086 NTAPI
18087 ZwCommitEnlistment(
18088 _In_ HANDLE EnlistmentHandle,
18089 _In_opt_ PLARGE_INTEGER TmVirtualClock);
18090
18091 _IRQL_requires_max_(PASSIVE_LEVEL)
18092 NTSYSCALLAPI
18093 NTSTATUS
18094 NTAPI
18095 ZwRollbackEnlistment(
18096 _In_ HANDLE EnlistmentHandle,
18097 _In_opt_ PLARGE_INTEGER TmVirtualClock);
18098
18099 _IRQL_requires_max_(PASSIVE_LEVEL)
18100 NTSYSCALLAPI
18101 NTSTATUS
18102 NTAPI
18103 ZwPrePrepareComplete(
18104 _In_ HANDLE EnlistmentHandle,
18105 _In_opt_ PLARGE_INTEGER TmVirtualClock);
18106
18107 _IRQL_requires_max_(PASSIVE_LEVEL)
18108 NTSYSCALLAPI
18109 NTSTATUS
18110 NTAPI
18111 ZwPrepareComplete(
18112 _In_ HANDLE EnlistmentHandle,
18113 _In_opt_ PLARGE_INTEGER TmVirtualClock);
18114
18115 _IRQL_requires_max_(PASSIVE_LEVEL)
18116 NTSYSCALLAPI
18117 NTSTATUS
18118 NTAPI
18119 ZwCommitComplete(
18120 _In_ HANDLE EnlistmentHandle,
18121 _In_opt_ PLARGE_INTEGER TmVirtualClock);
18122
18123 _IRQL_requires_max_(PASSIVE_LEVEL)
18124 NTSYSCALLAPI
18125 NTSTATUS
18126 NTAPI
18127 ZwReadOnlyEnlistment(
18128 _In_ HANDLE EnlistmentHandle,
18129 _In_opt_ PLARGE_INTEGER TmVirtualClock);
18130
18131 NTSYSCALLAPI
18132 NTSTATUS
18133 NTAPI
18134 ZwRollbackComplete(
18135 _In_ HANDLE EnlistmentHandle,
18136 _In_opt_ PLARGE_INTEGER TmVirtualClock);
18137
18138 NTSYSCALLAPI
18139 NTSTATUS
18140 NTAPI
18141 ZwSinglePhaseReject(
18142 _In_ HANDLE EnlistmentHandle,
18143 _In_opt_ PLARGE_INTEGER TmVirtualClock);
18144 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
18145 #if (NTDDI_VERSION >= NTDDI_WIN7)
18146
18147 _IRQL_requires_max_(PASSIVE_LEVEL)
18148 NTSYSAPI
18149 NTSTATUS
18150 NTAPI
18151 ZwOpenKeyEx(
18152 _Out_ PHANDLE KeyHandle,
18153 _In_ ACCESS_MASK DesiredAccess,
18154 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
18155 _In_ ULONG OpenOptions);
18156
18157 _IRQL_requires_max_(PASSIVE_LEVEL)
18158 NTSYSAPI
18159 NTSTATUS
18160 NTAPI
18161 ZwOpenKeyTransactedEx(
18162 _Out_ PHANDLE KeyHandle,
18163 _In_ ACCESS_MASK DesiredAccess,
18164 _In_ POBJECT_ATTRIBUTES ObjectAttributes,
18165 _In_ ULONG OpenOptions,
18166 _In_ HANDLE TransactionHandle);
18167
18168 NTSYSAPI
18169 NTSTATUS
18170 NTAPI
18171 ZwNotifyChangeMultipleKeys(
18172 _In_ HANDLE MasterKeyHandle,
18173 _In_opt_ ULONG Count,
18174 _In_opt_ OBJECT_ATTRIBUTES SubordinateObjects[],
18175 _In_opt_ HANDLE Event,
18176 _In_opt_ PIO_APC_ROUTINE ApcRoutine,
18177 _In_opt_ PVOID ApcContext,
18178 _Out_ PIO_STATUS_BLOCK IoStatusBlock,
18179 _In_ ULONG CompletionFilter,
18180 _In_ BOOLEAN WatchTree,
18181 _Out_opt_ PVOID Buffer,
18182 _In_ ULONG BufferSize,
18183 _In_ BOOLEAN Asynchronous);
18184
18185 NTSYSAPI
18186 NTSTATUS
18187 NTAPI
18188 ZwQueryMultipleValueKey(
18189 _In_ HANDLE KeyHandle,
18190 _Inout_ PKEY_VALUE_ENTRY ValueEntries,
18191 _In_ ULONG EntryCount,
18192 _Out_ PVOID ValueBuffer,
18193 _Inout_ PULONG BufferLength,
18194 _Out_opt_ PULONG RequiredBufferLength);
18195
18196 _IRQL_requires_max_(PASSIVE_LEVEL)
18197 NTSYSAPI
18198 NTSTATUS
18199 NTAPI
18200 ZwRenameKey(
18201 _In_ HANDLE KeyHandle,
18202 _In_ PUNICODE_STRING NewName);
18203
18204 _IRQL_requires_max_(PASSIVE_LEVEL)
18205 NTSYSAPI
18206 NTSTATUS
18207 NTAPI
18208 ZwSetInformationKey(
18209 _In_ HANDLE KeyHandle,
18210 _In_ __drv_strictTypeMatch(__drv_typeConst) KEY_SET_INFORMATION_CLASS KeySetInformationClass,
18211 _In_reads_bytes_(KeySetInformationLength) PVOID KeySetInformation,
18212 _In_ ULONG KeySetInformationLength);
18213
18214 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
18215
18216
18217 #ifdef __cplusplus
18218 }
18219 #endif
18220
18221 #endif /* !_WDMDDK_ */