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