Sync with trunk head
[reactos.git] / 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
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 /* Included via ntddk.h? */
29 #ifndef _NTDDK_
30 #define _NTDDK_
31 #define _WDM_INCLUDED_
32 #define _DDK_DRIVER_
33 #define NO_INTERLOCKED_INTRINSICS
34 #endif /* _NTDDK_ */
35
36 /* Dependencies */
37 #define NT_INCLUDED
38 #include <excpt.h>
39 #include <ntdef.h>
40 #include <ntstatus.h>
41
42 #ifndef GUID_DEFINED
43 #include <guiddef.h>
44 #endif /* GUID_DEFINED */
45
46 #include "intrin.h"
47
48 #ifdef __cplusplus
49 extern "C" {
50 #endif
51
52 #if !defined(_NTHALDLL_) && !defined(_BLDR_)
53 #define NTHALAPI DECLSPEC_IMPORT
54 #else
55 #define NTHALAPI
56 #endif
57
58 #if !defined(_NTOSKRNL_) /* For ReactOS */
59 #define NTKERNELAPI DECLSPEC_IMPORT
60 #else
61 #define NTKERNELAPI
62 #endif
63
64 #if defined(_WIN64)
65 #define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
66 #else
67 #define POINTER_ALIGNMENT
68 #endif
69
70 /* Helper macro to enable gcc's extension. */
71 #ifndef __GNU_EXTENSION
72 #ifdef __GNUC__
73 #define __GNU_EXTENSION __extension__
74 #else
75 #define __GNU_EXTENSION
76 #endif
77 #endif
78
79 #if defined(_MSC_VER)
80
81 /* Indicate if #pragma alloc_text() is supported */
82 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
83 #define ALLOC_PRAGMA 1
84 #endif
85
86 /* Indicate if #pragma data_seg() is supported */
87 #if defined(_M_IX86) || defined(_M_AMD64)
88 #define ALLOC_DATA_PRAGMA 1
89 #endif
90
91 #endif
92
93 /* Forward declarations */
94 struct _IRP;
95 struct _MDL;
96 struct _KAPC;
97 struct _KDPC;
98 struct _FILE_OBJECT;
99 struct _DMA_ADAPTER;
100 struct _DEVICE_OBJECT;
101 struct _DRIVER_OBJECT;
102 struct _IO_STATUS_BLOCK;
103 struct _DEVICE_DESCRIPTION;
104 struct _SCATTER_GATHER_LIST;
105 struct _DRIVE_LAYOUT_INFORMATION;
106 struct _COMPRESSED_DATA_INFO;
107 struct _IO_RESOURCE_DESCRIPTOR;
108
109 /* Structures not exposed to drivers */
110 typedef struct _OBJECT_TYPE *POBJECT_TYPE;
111 typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
112 typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
113 typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT;
114 typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT;
115 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
116 typedef struct _ETHREAD *PETHREAD;
117 typedef struct _EPROCESS *PEPROCESS;
118 typedef struct _IO_TIMER *PIO_TIMER;
119 typedef struct _KINTERRUPT *PKINTERRUPT;
120 typedef struct _KPROCESS *PKPROCESS;
121 typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
122 typedef struct _CONTEXT *PCONTEXT;
123
124
125 /******************************************************************************
126 * INTERLOCKED Functions *
127 ******************************************************************************/
128 //
129 // Intrinsics (note: taken from our winnt.h)
130 // FIXME: 64-bit
131 //
132 #if defined(__GNUC__)
133
134 static __inline__ BOOLEAN
135 InterlockedBitTestAndSet(IN LONG volatile *Base,
136 IN LONG Bit)
137 {
138 #if defined(_M_IX86)
139 LONG OldBit;
140 __asm__ __volatile__("lock "
141 "btsl %2,%1\n\t"
142 "sbbl %0,%0\n\t"
143 :"=r" (OldBit),"+m" (*Base)
144 :"Ir" (Bit)
145 : "memory");
146 return OldBit;
147 #else
148 return (_InterlockedOr(Base, 1 << Bit) >> Bit) & 1;
149 #endif
150 }
151
152 static __inline__ BOOLEAN
153 InterlockedBitTestAndReset(IN LONG volatile *Base,
154 IN LONG Bit)
155 {
156 #if defined(_M_IX86)
157 LONG OldBit;
158 __asm__ __volatile__("lock "
159 "btrl %2,%1\n\t"
160 "sbbl %0,%0\n\t"
161 :"=r" (OldBit),"+m" (*Base)
162 :"Ir" (Bit)
163 : "memory");
164 return OldBit;
165 #else
166 return (_InterlockedAnd(Base, ~(1 << Bit)) >> Bit) & 1;
167 #endif
168 }
169
170 #endif
171
172 #define BitScanForward _BitScanForward
173 #define BitScanReverse _BitScanReverse
174 #define BitTest _bittest
175 #define BitTestAndComplement _bittestandcomplement
176 #define BitTestAndSet _bittestandset
177 #define BitTestAndReset _bittestandreset
178 #define InterlockedBitTestAndSet _interlockedbittestandset
179 #define InterlockedBitTestAndReset _interlockedbittestandreset
180
181 #ifdef _M_AMD64
182 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
183 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
184 #endif
185
186 #if !defined(__INTERLOCKED_DECLARED)
187 #define __INTERLOCKED_DECLARED
188
189 #if defined (_X86_)
190 #if defined(NO_INTERLOCKED_INTRINSICS)
191 NTKERNELAPI
192 LONG
193 FASTCALL
194 InterlockedIncrement(
195 IN OUT LONG volatile *Addend);
196
197 NTKERNELAPI
198 LONG
199 FASTCALL
200 InterlockedDecrement(
201 IN OUT LONG volatile *Addend);
202
203 NTKERNELAPI
204 LONG
205 FASTCALL
206 InterlockedCompareExchange(
207 IN OUT LONG volatile *Destination,
208 IN LONG Exchange,
209 IN LONG Comparand);
210
211 NTKERNELAPI
212 LONG
213 FASTCALL
214 InterlockedExchange(
215 IN OUT LONG volatile *Destination,
216 IN LONG Value);
217
218 NTKERNELAPI
219 LONG
220 FASTCALL
221 InterlockedExchangeAdd(
222 IN OUT LONG volatile *Addend,
223 IN LONG Value);
224
225 #else // !defined(NO_INTERLOCKED_INTRINSICS)
226
227 #define InterlockedExchange _InterlockedExchange
228 #define InterlockedIncrement _InterlockedIncrement
229 #define InterlockedDecrement _InterlockedDecrement
230 #define InterlockedExchangeAdd _InterlockedExchangeAdd
231 #define InterlockedCompareExchange _InterlockedCompareExchange
232 #define InterlockedOr _InterlockedOr
233 #define InterlockedAnd _InterlockedAnd
234 #define InterlockedXor _InterlockedXor
235
236 #endif // !defined(NO_INTERLOCKED_INTRINSICS)
237
238 #endif // defined (_X86_)
239
240 #if !defined (_WIN64)
241 /*
242 * PVOID
243 * InterlockedExchangePointer(
244 * IN OUT PVOID volatile *Target,
245 * IN PVOID Value)
246 */
247 #define InterlockedExchangePointer(Target, Value) \
248 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
249
250 /*
251 * PVOID
252 * InterlockedCompareExchangePointer(
253 * IN OUT PVOID *Destination,
254 * IN PVOID Exchange,
255 * IN PVOID Comparand)
256 */
257 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
258 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
259
260 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
261 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
262 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
263
264 #endif // !defined (_WIN64)
265
266 #if defined (_M_AMD64)
267
268 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
269 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
270 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
271 #define InterlockedAnd _InterlockedAnd
272 #define InterlockedOr _InterlockedOr
273 #define InterlockedXor _InterlockedXor
274 #define InterlockedIncrement _InterlockedIncrement
275 #define InterlockedDecrement _InterlockedDecrement
276 #define InterlockedAdd _InterlockedAdd
277 #define InterlockedExchange _InterlockedExchange
278 #define InterlockedExchangeAdd _InterlockedExchangeAdd
279 #define InterlockedCompareExchange _InterlockedCompareExchange
280 #define InterlockedAnd64 _InterlockedAnd64
281 #define InterlockedOr64 _InterlockedOr64
282 #define InterlockedXor64 _InterlockedXor64
283 #define InterlockedIncrement64 _InterlockedIncrement64
284 #define InterlockedDecrement64 _InterlockedDecrement64
285 #define InterlockedAdd64 _InterlockedAdd64
286 #define InterlockedExchange64 _InterlockedExchange64
287 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
288 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
289 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
290 #define InterlockedExchangePointer _InterlockedExchangePointer
291 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
292 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
293
294 #endif // _M_AMD64
295
296 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
297 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
298 FORCEINLINE
299 LONG64
300 InterlockedAdd64(
301 IN OUT LONG64 volatile *Addend,
302 IN LONG64 Value)
303 {
304 return InterlockedExchangeAdd64(Addend, Value) + Value;
305 }
306 //#endif
307 #endif
308
309 #endif /* !__INTERLOCKED_DECLARED */
310
311
312 /******************************************************************************
313 * Kernel Types *
314 ******************************************************************************/
315
316 typedef UCHAR KIRQL, *PKIRQL;
317 typedef CCHAR KPROCESSOR_MODE;
318 typedef LONG KPRIORITY;
319
320 typedef ULONG EXECUTION_STATE;
321
322 typedef enum _MODE {
323 KernelMode,
324 UserMode,
325 MaximumMode
326 } MODE;
327
328 /* Processor features */
329 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
330 #define PF_FLOATING_POINT_EMULATED 1
331 #define PF_COMPARE_EXCHANGE_DOUBLE 2
332 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
333 #define PF_PPC_MOVEMEM_64BIT_OK 4
334 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
335 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
336 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
337 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
338 #define PF_PAE_ENABLED 9
339 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
340 #define PF_SSE_DAZ_MODE_AVAILABLE 11
341 #define PF_NX_ENABLED 12
342 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
343 #define PF_COMPARE_EXCHANGE128 14
344 #define PF_COMPARE64_EXCHANGE128 15
345 #define PF_CHANNELS_ENABLED 16
346 #define PF_XSAVE_ENABLED 17
347
348 #define MAXIMUM_SUPPORTED_EXTENSION 512
349 #define MAXIMUM_WAIT_OBJECTS 64
350
351 #define ASSERT_APC(Object) \
352 ASSERT((Object)->Type == ApcObject)
353
354 #define ASSERT_DPC(Object) \
355 ASSERT(((Object)->Type == 0) || \
356 ((Object)->Type == DpcObject) || \
357 ((Object)->Type == ThreadedDpcObject))
358
359 #define ASSERT_DEVICE_QUEUE(Object) \
360 ASSERT((Object)->Type == DeviceQueueObject)
361
362 #define DPC_NORMAL 0
363 #define DPC_THREADED 1
364
365 #define GM_LOCK_BIT 0x1
366 #define GM_LOCK_BIT_V 0x0
367 #define GM_LOCK_WAITER_WOKEN 0x2
368 #define GM_LOCK_WAITER_INC 0x4
369
370 #define LOCK_QUEUE_WAIT 1
371 #define LOCK_QUEUE_OWNER 2
372 #define LOCK_QUEUE_TIMER_LOCK_SHIFT 4
373 #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
374
375 #define PROCESSOR_FEATURE_MAX 64
376
377 #define DBG_STATUS_CONTROL_C 1
378 #define DBG_STATUS_SYSRQ 2
379 #define DBG_STATUS_BUGCHECK_FIRST 3
380 #define DBG_STATUS_BUGCHECK_SECOND 4
381 #define DBG_STATUS_FATAL 5
382 #define DBG_STATUS_DEBUG_CONTROL 6
383 #define DBG_STATUS_WORKER 7
384
385 #define KI_USER_SHARED_DATA 0xffdf0000
386 #define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
387
388 #define EFLAG_SIGN 0x8000
389 #define EFLAG_ZERO 0x4000
390 #define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
391
392 #define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
393 #define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
394 #define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
395
396 #if defined(_WIN64)
397 #define MAXIMUM_PROC_PER_GROUP 64
398 #else
399 #define MAXIMUM_PROC_PER_GROUP 32
400 #endif
401 #define MAXIMUM_PROCESSORS MAXIMUM_PROC_PER_GROUP
402
403 #if (_M_IX86)
404 #define KIP0PCRADDRESS 0xffdff000
405 #endif
406
407 #if defined(_X86_)
408
409 #define PASSIVE_LEVEL 0
410 #define LOW_LEVEL 0
411 #define APC_LEVEL 1
412 #define DISPATCH_LEVEL 2
413 #define CMCI_LEVEL 5
414 #define PROFILE_LEVEL 27
415 #define CLOCK1_LEVEL 28
416 #define CLOCK2_LEVEL 28
417 #define IPI_LEVEL 29
418 #define POWER_LEVEL 30
419 #define HIGH_LEVEL 31
420 #define CLOCK_LEVEL (CLOCK2_LEVEL)
421
422 typedef struct _KFLOATING_SAVE {
423 ULONG ControlWord;
424 ULONG StatusWord;
425 ULONG ErrorOffset;
426 ULONG ErrorSelector;
427 ULONG DataOffset;
428 ULONG DataSelector;
429 ULONG Cr0NpxState;
430 ULONG Spare1;
431 } KFLOATING_SAVE, *PKFLOATING_SAVE;
432
433 #endif
434
435 #if defined(_AMD64_)
436
437 #define PASSIVE_LEVEL 0
438 #define LOW_LEVEL 0
439 #define APC_LEVEL 1
440 #define DISPATCH_LEVEL 2
441 #define CMCI_LEVEL 5
442 #define CLOCK_LEVEL 13
443 #define IPI_LEVEL 14
444 #define DRS_LEVEL 14
445 #define POWER_LEVEL 14
446 #define PROFILE_LEVEL 15
447 #define HIGH_LEVEL 15
448
449 #endif
450
451 #if defined(_IA64_)
452
453 #define PASSIVE_LEVEL 0
454 #define LOW_LEVEL 0
455 #define APC_LEVEL 1
456 #define DISPATCH_LEVEL 2
457 #define CMC_LEVEL 3
458 #define DEVICE_LEVEL_BASE 4
459 #define PC_LEVEL 12
460 #define IPI_LEVEL 14
461 #define DRS_LEVEL 14
462 #define CLOCK_LEVEL 13
463 #define POWER_LEVEL 15
464 #define PROFILE_LEVEL 15
465 #define HIGH_LEVEL 15
466
467 #endif
468
469 /* Exception Records */
470 #define EXCEPTION_NONCONTINUABLE 1
471 #define EXCEPTION_MAXIMUM_PARAMETERS 15
472
473 typedef struct _EXCEPTION_RECORD {
474 NTSTATUS ExceptionCode;
475 ULONG ExceptionFlags;
476 struct _EXCEPTION_RECORD *ExceptionRecord;
477 PVOID ExceptionAddress;
478 ULONG NumberParameters;
479 ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
480 } EXCEPTION_RECORD, *PEXCEPTION_RECORD;
481
482 typedef struct _EXCEPTION_RECORD32 {
483 NTSTATUS ExceptionCode;
484 ULONG ExceptionFlags;
485 ULONG ExceptionRecord;
486 ULONG ExceptionAddress;
487 ULONG NumberParameters;
488 ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
489 } EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
490
491 typedef struct _EXCEPTION_RECORD64 {
492 NTSTATUS ExceptionCode;
493 ULONG ExceptionFlags;
494 ULONG64 ExceptionRecord;
495 ULONG64 ExceptionAddress;
496 ULONG NumberParameters;
497 ULONG __unusedAlignment;
498 ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
499 } EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
500
501 typedef struct _EXCEPTION_POINTERS {
502 PEXCEPTION_RECORD ExceptionRecord;
503 PCONTEXT ContextRecord;
504 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
505
506
507 typedef enum _KBUGCHECK_CALLBACK_REASON {
508 KbCallbackInvalid,
509 KbCallbackReserved1,
510 KbCallbackSecondaryDumpData,
511 KbCallbackDumpIo,
512 KbCallbackAddPages
513 } KBUGCHECK_CALLBACK_REASON;
514
515 struct _KBUGCHECK_REASON_CALLBACK_RECORD;
516
517 typedef VOID
518 (DDKAPI *PKBUGCHECK_REASON_CALLBACK_ROUTINE)(
519 IN KBUGCHECK_CALLBACK_REASON Reason,
520 IN struct _KBUGCHECK_REASON_CALLBACK_RECORD *Record,
521 IN OUT PVOID ReasonSpecificData,
522 IN ULONG ReasonSpecificDataLength);
523
524 typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD {
525 LIST_ENTRY Entry;
526 PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine;
527 PUCHAR Component;
528 ULONG_PTR Checksum;
529 KBUGCHECK_CALLBACK_REASON Reason;
530 UCHAR State;
531 } KBUGCHECK_REASON_CALLBACK_RECORD, *PKBUGCHECK_REASON_CALLBACK_RECORD;
532
533 typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
534 BufferEmpty,
535 BufferInserted,
536 BufferStarted,
537 BufferFinished,
538 BufferIncomplete
539 } KBUGCHECK_BUFFER_DUMP_STATE;
540
541 typedef VOID
542 (DDKAPI *PKBUGCHECK_CALLBACK_ROUTINE)(
543 IN PVOID Buffer,
544 IN ULONG Length);
545
546 typedef struct _KBUGCHECK_CALLBACK_RECORD {
547 LIST_ENTRY Entry;
548 PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
549 PVOID Buffer;
550 ULONG Length;
551 PUCHAR Component;
552 ULONG_PTR Checksum;
553 UCHAR State;
554 } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
555
556 typedef BOOLEAN
557 (DDKAPI *PNMI_CALLBACK)(
558 IN PVOID Context,
559 IN BOOLEAN Handled);
560
561 typedef enum _KDPC_IMPORTANCE {
562 LowImportance,
563 MediumImportance,
564 HighImportance,
565 MediumHighImportance
566 } KDPC_IMPORTANCE;
567
568 typedef enum _TRACE_INFORMATION_CLASS {
569 TraceIdClass,
570 TraceHandleClass,
571 TraceEnableFlagsClass,
572 TraceEnableLevelClass,
573 GlobalLoggerHandleClass,
574 EventLoggerHandleClass,
575 AllLoggerHandlesClass,
576 TraceHandleByNameClass,
577 LoggerEventsLostClass,
578 TraceSessionSettingsClass,
579 LoggerEventsLoggedClass,
580 MaxTraceInformationClass
581 } TRACE_INFORMATION_CLASS;
582
583 typedef enum _KINTERRUPT_POLARITY {
584 InterruptPolarityUnknown,
585 InterruptActiveHigh,
586 InterruptActiveLow
587 } KINTERRUPT_POLARITY, *PKINTERRUPT_POLARITY;
588
589 typedef enum _KPROFILE_SOURCE {
590 ProfileTime,
591 ProfileAlignmentFixup,
592 ProfileTotalIssues,
593 ProfilePipelineDry,
594 ProfileLoadInstructions,
595 ProfilePipelineFrozen,
596 ProfileBranchInstructions,
597 ProfileTotalNonissues,
598 ProfileDcacheMisses,
599 ProfileIcacheMisses,
600 ProfileCacheMisses,
601 ProfileBranchMispredictions,
602 ProfileStoreInstructions,
603 ProfileFpInstructions,
604 ProfileIntegerInstructions,
605 Profile2Issue,
606 Profile3Issue,
607 Profile4Issue,
608 ProfileSpecialInstructions,
609 ProfileTotalCycles,
610 ProfileIcacheIssues,
611 ProfileDcacheAccesses,
612 ProfileMemoryBarrierCycles,
613 ProfileLoadLinkedIssues,
614 ProfileMaximum
615 } KPROFILE_SOURCE;
616
617 typedef enum _KWAIT_REASON {
618 Executive,
619 FreePage,
620 PageIn,
621 PoolAllocation,
622 DelayExecution,
623 Suspended,
624 UserRequest,
625 WrExecutive,
626 WrFreePage,
627 WrPageIn,
628 WrPoolAllocation,
629 WrDelayExecution,
630 WrSuspended,
631 WrUserRequest,
632 WrEventPair,
633 WrQueue,
634 WrLpcReceive,
635 WrLpcReply,
636 WrVirtualMemory,
637 WrPageOut,
638 WrRendezvous,
639 WrKeyedEvent,
640 WrTerminated,
641 WrProcessInSwap,
642 WrCpuRateControl,
643 WrCalloutStack,
644 WrKernel,
645 WrResource,
646 WrPushLock,
647 WrMutex,
648 WrQuantumEnd,
649 WrDispatchInt,
650 WrPreempted,
651 WrYieldExecution,
652 WrFastMutex,
653 WrGuardedMutex,
654 WrRundown,
655 MaximumWaitReason
656 } KWAIT_REASON;
657
658 typedef struct _KWAIT_BLOCK {
659 LIST_ENTRY WaitListEntry;
660 struct _KTHREAD *Thread;
661 PVOID Object;
662 struct _KWAIT_BLOCK *NextWaitBlock;
663 USHORT WaitKey;
664 UCHAR WaitType;
665 volatile UCHAR BlockState;
666 #if defined(_WIN64)
667 LONG SpareLong;
668 #endif
669 } KWAIT_BLOCK, *PKWAIT_BLOCK, *PRKWAIT_BLOCK;
670
671 typedef enum _KINTERRUPT_MODE {
672 LevelSensitive,
673 Latched
674 } KINTERRUPT_MODE;
675
676 #define THREAD_WAIT_OBJECTS 3
677
678 typedef VOID
679 (DDKAPI *PKINTERRUPT_ROUTINE)(
680 VOID);
681
682 typedef enum _KD_OPTION {
683 KD_OPTION_SET_BLOCK_ENABLE,
684 } KD_OPTION;
685
686 typedef enum _INTERFACE_TYPE {
687 InterfaceTypeUndefined = -1,
688 Internal,
689 Isa,
690 Eisa,
691 MicroChannel,
692 TurboChannel,
693 PCIBus,
694 VMEBus,
695 NuBus,
696 PCMCIABus,
697 CBus,
698 MPIBus,
699 MPSABus,
700 ProcessorInternal,
701 InternalPowerBus,
702 PNPISABus,
703 PNPBus,
704 Vmcs,
705 MaximumInterfaceType
706 } INTERFACE_TYPE, *PINTERFACE_TYPE;
707
708 typedef VOID
709 (DDKAPI *PKNORMAL_ROUTINE)(
710 IN PVOID NormalContext,
711 IN PVOID SystemArgument1,
712 IN PVOID SystemArgument2);
713
714 typedef VOID
715 (DDKAPI *PKRUNDOWN_ROUTINE)(
716 IN struct _KAPC *Apc);
717
718 typedef VOID
719 (DDKAPI *PKKERNEL_ROUTINE)(
720 IN struct _KAPC *Apc,
721 IN OUT PKNORMAL_ROUTINE *NormalRoutine,
722 IN OUT PVOID *NormalContext,
723 IN OUT PVOID *SystemArgument1,
724 IN OUT PVOID *SystemArgument2);
725
726 typedef struct _KAPC
727 {
728 UCHAR Type;
729 UCHAR SpareByte0;
730 UCHAR Size;
731 UCHAR SpareByte1;
732 ULONG SpareLong0;
733 struct _KTHREAD *Thread;
734 LIST_ENTRY ApcListEntry;
735 PKKERNEL_ROUTINE KernelRoutine;
736 PKRUNDOWN_ROUTINE RundownRoutine;
737 PKNORMAL_ROUTINE NormalRoutine;
738 PVOID NormalContext;
739 PVOID SystemArgument1;
740 PVOID SystemArgument2;
741 CCHAR ApcStateIndex;
742 KPROCESSOR_MODE ApcMode;
743 BOOLEAN Inserted;
744 } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;
745
746 typedef struct _KDEVICE_QUEUE_ENTRY {
747 LIST_ENTRY DeviceListEntry;
748 ULONG SortKey;
749 BOOLEAN Inserted;
750 } KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY,
751 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
752
753 typedef PVOID PKIPI_CONTEXT;
754
755 typedef
756 VOID
757 (NTAPI *PKIPI_WORKER)(
758 IN PKIPI_CONTEXT PacketContext,
759 IN PVOID Parameter1,
760 IN PVOID Parameter2,
761 IN PVOID Parameter3
762 );
763
764 typedef
765 ULONG_PTR
766 (NTAPI *PKIPI_BROADCAST_WORKER)(
767 IN ULONG_PTR Argument);
768
769 typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
770
771 typedef struct _KSPIN_LOCK_QUEUE {
772 struct _KSPIN_LOCK_QUEUE *volatile Next;
773 PKSPIN_LOCK volatile Lock;
774 } KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;
775
776 typedef struct _KLOCK_QUEUE_HANDLE {
777 KSPIN_LOCK_QUEUE LockQueue;
778 KIRQL OldIrql;
779 } KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;
780
781 #if defined(_AMD64_)
782
783 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER;
784
785 #define LockQueueDispatcherLock 0
786 #define LockQueueExpansionLock 1
787 #define LockQueuePfnLock 2
788 #define LockQueueSystemSpaceLock 3
789 #define LockQueueVacbLock 4
790 #define LockQueueMasterLock 5
791 #define LockQueueNonPagedPoolLock 6
792 #define LockQueueIoCancelLock 7
793 #define LockQueueWorkQueueLock 8
794 #define LockQueueIoVpbLock 9
795 #define LockQueueIoDatabaseLock 10
796 #define LockQueueIoCompletionLock 11
797 #define LockQueueNtfsStructLock 12
798 #define LockQueueAfdWorkQueueLock 13
799 #define LockQueueBcbLock 14
800 #define LockQueueMmNonPagedPoolLock 15
801 #define LockQueueUnusedSpare16 16
802 #define LockQueueTimerTableLock 17
803 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
804
805 #else
806
807 typedef enum _KSPIN_LOCK_QUEUE_NUMBER {
808 LockQueueDispatcherLock,
809 LockQueueExpansionLock,
810 LockQueuePfnLock,
811 LockQueueSystemSpaceLock,
812 LockQueueVacbLock,
813 LockQueueMasterLock,
814 LockQueueNonPagedPoolLock,
815 LockQueueIoCancelLock,
816 LockQueueWorkQueueLock,
817 LockQueueIoVpbLock,
818 LockQueueIoDatabaseLock,
819 LockQueueIoCompletionLock,
820 LockQueueNtfsStructLock,
821 LockQueueAfdWorkQueueLock,
822 LockQueueBcbLock,
823 LockQueueMmNonPagedPoolLock,
824 LockQueueUnusedSpare16,
825 LockQueueTimerTableLock,
826 LockQueueMaximumLock = LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS
827 } KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER;
828
829 #endif
830
831 typedef VOID
832 (DDKAPI *PKDEFERRED_ROUTINE)(
833 IN struct _KDPC *Dpc,
834 IN PVOID DeferredContext,
835 IN PVOID SystemArgument1,
836 IN PVOID SystemArgument2);
837
838 typedef struct _KDPC
839 {
840 UCHAR Type;
841 UCHAR Importance;
842 volatile USHORT Number;
843 LIST_ENTRY DpcListEntry;
844 PKDEFERRED_ROUTINE DeferredRoutine;
845 PVOID DeferredContext;
846 PVOID SystemArgument1;
847 PVOID SystemArgument2;
848 volatile PVOID DpcData;
849 } KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;
850
851 typedef struct _KDEVICE_QUEUE {
852 CSHORT Type;
853 CSHORT Size;
854 LIST_ENTRY DeviceListHead;
855 KSPIN_LOCK Lock;
856 #if defined(_AMD64_)
857 union {
858 BOOLEAN Busy;
859 struct {
860 LONG64 Reserved : 8;
861 LONG64 Hint : 56;
862 };
863 };
864 #else
865 BOOLEAN Busy;
866 #endif
867
868 } KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
869
870 #define TIMER_EXPIRED_INDEX_BITS 6
871 #define TIMER_PROCESSOR_INDEX_BITS 5
872 typedef struct _DISPATCHER_HEADER {
873 _ANONYMOUS_UNION union {
874 _ANONYMOUS_STRUCT struct {
875 UCHAR Type;
876 _ANONYMOUS_UNION union {
877 _ANONYMOUS_UNION union {
878 UCHAR TimerControlFlags;
879 _ANONYMOUS_STRUCT struct {
880 UCHAR Absolute:1;
881 UCHAR Coalescable:1;
882 UCHAR KeepShifting:1;
883 UCHAR EncodedTolerableDelay:5;
884 } DUMMYSTRUCTNAME;
885 } DUMMYUNIONNAME;
886 UCHAR Abandoned;
887 #if (NTDDI_VERSION < NTDDI_WIN7)
888 UCHAR NpxIrql;
889 #endif
890 BOOLEAN Signalling;
891 } DUMMYUNIONNAME;
892 _ANONYMOUS_UNION union {
893 _ANONYMOUS_UNION union {
894 UCHAR ThreadControlFlags;
895 _ANONYMOUS_STRUCT struct {
896 UCHAR CpuThrottled:1;
897 UCHAR CycleProfiling:1;
898 UCHAR CounterProfiling:1;
899 UCHAR Reserved:5;
900 } DUMMYSTRUCTNAME;
901 } DUMMYUNIONNAME;
902 UCHAR Size;
903 UCHAR Hand;
904 } DUMMYUNIONNAME2;
905 _ANONYMOUS_UNION union {
906 #if (NTDDI_VERSION >= NTDDI_WIN7)
907 _ANONYMOUS_UNION union {
908 UCHAR TimerMiscFlags;
909 _ANONYMOUS_STRUCT struct {
910 #if !defined(_X86_)
911 UCHAR Index:TIMER_EXPIRED_INDEX_BITS;
912 #else
913 UCHAR Index:1;
914 UCHAR Processor:TIMER_PROCESSOR_INDEX_BITS;
915 #endif
916 UCHAR Inserted:1;
917 volatile UCHAR Expired:1;
918 } DUMMYSTRUCTNAME;
919 } DUMMYUNIONNAME;
920 #else
921 /* Pre Win7 compatibility fix to latest WDK */
922 UCHAR Inserted;
923 #endif
924 _ANONYMOUS_UNION union {
925 BOOLEAN DebugActive;
926 _ANONYMOUS_STRUCT struct {
927 BOOLEAN ActiveDR7:1;
928 BOOLEAN Instrumented:1;
929 BOOLEAN Reserved2:4;
930 BOOLEAN UmsScheduled:1;
931 BOOLEAN UmsPrimary:1;
932 } DUMMYSTRUCTNAME;
933 } DUMMYUNIONNAME; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
934 BOOLEAN DpcActive;
935 } DUMMYUNIONNAME3;
936 } DUMMYSTRUCTNAME;
937 volatile LONG Lock;
938 } DUMMYUNIONNAME;
939 LONG SignalState;
940 LIST_ENTRY WaitListHead;
941 } DISPATCHER_HEADER, *PDISPATCHER_HEADER;
942
943 typedef struct _KGATE
944 {
945 DISPATCHER_HEADER Header;
946 } KGATE, *PKGATE, *RESTRICTED_POINTER PRKGATE;
947
948 typedef struct _KGUARDED_MUTEX
949 {
950 volatile LONG Count;
951 PKTHREAD Owner;
952 ULONG Contention;
953 KGATE Gate;
954 __GNU_EXTENSION union
955 {
956 __GNU_EXTENSION struct
957 {
958 SHORT KernelApcDisable;
959 SHORT SpecialApcDisable;
960 };
961 ULONG CombinedApcDisable;
962 };
963 } KGUARDED_MUTEX, *PKGUARDED_MUTEX;
964
965 typedef struct _KMUTANT {
966 DISPATCHER_HEADER Header;
967 LIST_ENTRY MutantListEntry;
968 struct _KTHREAD *RESTRICTED_POINTER OwnerThread;
969 BOOLEAN Abandoned;
970 UCHAR ApcDisable;
971 } KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;
972
973 typedef struct _KTIMER {
974 DISPATCHER_HEADER Header;
975 ULARGE_INTEGER DueTime;
976 LIST_ENTRY TimerListEntry;
977 struct _KDPC *Dpc;
978 #if !defined(_X86_)
979 ULONG Processor;
980 #endif
981 ULONG Period;
982 } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
983
984 typedef BOOLEAN
985 (DDKAPI *PKSYNCHRONIZE_ROUTINE)(
986 IN PVOID SynchronizeContext);
987
988 typedef enum _POOL_TYPE {
989 NonPagedPool,
990 PagedPool,
991 NonPagedPoolMustSucceed,
992 DontUseThisType,
993 NonPagedPoolCacheAligned,
994 PagedPoolCacheAligned,
995 NonPagedPoolCacheAlignedMustS,
996 MaxPoolType,
997 NonPagedPoolSession = 32,
998 PagedPoolSession,
999 NonPagedPoolMustSucceedSession,
1000 DontUseThisTypeSession,
1001 NonPagedPoolCacheAlignedSession,
1002 PagedPoolCacheAlignedSession,
1003 NonPagedPoolCacheAlignedMustSSession
1004 } POOL_TYPE;
1005
1006 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
1007 {
1008 StandardDesign,
1009 NEC98x86,
1010 EndAlternatives
1011 } ALTERNATIVE_ARCHITECTURE_TYPE;
1012
1013 typedef struct _KSYSTEM_TIME
1014 {
1015 ULONG LowPart;
1016 LONG High1Time;
1017 LONG High2Time;
1018 } KSYSTEM_TIME, *PKSYSTEM_TIME;
1019
1020 typedef struct _KEVENT {
1021 DISPATCHER_HEADER Header;
1022 } KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
1023
1024 typedef struct _KSEMAPHORE {
1025 DISPATCHER_HEADER Header;
1026 LONG Limit;
1027 } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
1028
1029 typedef struct _PNP_BUS_INFORMATION {
1030 GUID BusTypeGuid;
1031 INTERFACE_TYPE LegacyBusType;
1032 ULONG BusNumber;
1033 } PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;
1034
1035 typedef struct DECLSPEC_ALIGN(16) _M128A {
1036 ULONGLONG Low;
1037 LONGLONG High;
1038 } M128A, *PM128A;
1039
1040 typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT {
1041 USHORT ControlWord;
1042 USHORT StatusWord;
1043 UCHAR TagWord;
1044 UCHAR Reserved1;
1045 USHORT ErrorOpcode;
1046 ULONG ErrorOffset;
1047 USHORT ErrorSelector;
1048 USHORT Reserved2;
1049 ULONG DataOffset;
1050 USHORT DataSelector;
1051 USHORT Reserved3;
1052 ULONG MxCsr;
1053 ULONG MxCsr_Mask;
1054 M128A FloatRegisters[8];
1055
1056 #if defined(_WIN64)
1057
1058 M128A XmmRegisters[16];
1059 UCHAR Reserved4[96];
1060
1061 #else
1062
1063 M128A XmmRegisters[8];
1064 UCHAR Reserved4[192];
1065
1066 ULONG StackControl[7];
1067 ULONG Cr0NpxState;
1068
1069 #endif
1070
1071 } XSAVE_FORMAT, *PXSAVE_FORMAT;
1072
1073 #ifdef _AMD64_
1074
1075 typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
1076
1077 #endif // _AMD64_
1078
1079
1080 /******************************************************************************
1081 * Kernel Functions *
1082 ******************************************************************************/
1083
1084 NTKERNELAPI
1085 VOID
1086 NTAPI
1087 KeInitializeEvent(
1088 OUT PRKEVENT Event,
1089 IN EVENT_TYPE Type,
1090 IN BOOLEAN State);
1091
1092 NTKERNELAPI
1093 VOID
1094 NTAPI
1095 KeClearEvent(
1096 IN OUT PRKEVENT Event);
1097
1098 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1099
1100 #if defined(SINGLE_GROUP_LEGACY_API)
1101 NTKERNELAPI
1102 VOID
1103 NTAPI
1104 KeRevertToUserAffinityThread(VOID);
1105
1106 NTKERNELAPI
1107 VOID
1108 NTAPI
1109 KeSetSystemAffinityThread(
1110 IN KAFFINITY Affinity);
1111
1112 NTKERNELAPI
1113 VOID
1114 NTAPI
1115 KeSetTargetProcessorDpc(
1116 IN OUT PRKDPC Dpc,
1117 IN CCHAR Number);
1118
1119 NTKERNELAPI
1120 KAFFINITY
1121 NTAPI
1122 KeQueryActiveProcessors(
1123 VOID);
1124 #endif
1125
1126 #if !defined(_M_AMD64)
1127 NTKERNELAPI
1128 ULONGLONG
1129 NTAPI
1130 KeQueryInterruptTime(
1131 VOID);
1132
1133 NTKERNELAPI
1134 VOID
1135 NTAPI
1136 KeQuerySystemTime(
1137 OUT PLARGE_INTEGER CurrentTime);
1138 #endif /* !_M_AMD64 */
1139
1140 NTKERNELAPI
1141 DECLSPEC_NORETURN
1142 VOID
1143 NTAPI
1144 KeBugCheckEx(
1145 IN ULONG BugCheckCode,
1146 IN ULONG_PTR BugCheckParameter1,
1147 IN ULONG_PTR BugCheckParameter2,
1148 IN ULONG_PTR BugCheckParameter3,
1149 IN ULONG_PTR BugCheckParameter4);
1150
1151 NTKERNELAPI
1152 BOOLEAN
1153 NTAPI
1154 KeCancelTimer(
1155 IN OUT PKTIMER);
1156
1157 NTKERNELAPI
1158 NTSTATUS
1159 NTAPI
1160 KeDelayExecutionThread(
1161 IN KPROCESSOR_MODE WaitMode,
1162 IN BOOLEAN Alertable,
1163 IN PLARGE_INTEGER Interval);
1164
1165 NTKERNELAPI
1166 BOOLEAN
1167 NTAPI
1168 KeDeregisterBugCheckCallback(
1169 IN OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord);
1170
1171 NTKERNELAPI
1172 VOID
1173 NTAPI
1174 KeEnterCriticalRegion(VOID);
1175
1176 NTKERNELAPI
1177 VOID
1178 NTAPI
1179 KeInitializeDeviceQueue(
1180 OUT PKDEVICE_QUEUE DeviceQueue);
1181
1182 NTKERNELAPI
1183 VOID
1184 NTAPI
1185 KeInitializeDpc(
1186 OUT PRKDPC Dpc,
1187 IN PKDEFERRED_ROUTINE DeferredRoutine,
1188 IN PVOID DeferredContext OPTIONAL);
1189
1190 NTKERNELAPI
1191 VOID
1192 NTAPI
1193 KeInitializeMutex(
1194 OUT PRKMUTEX Mutex,
1195 IN ULONG Level);
1196
1197 NTKERNELAPI
1198 VOID
1199 NTAPI
1200 KeInitializeSemaphore(
1201 OUT PRKSEMAPHORE Semaphore,
1202 IN LONG Count,
1203 IN LONG Limit);
1204
1205 NTKERNELAPI
1206 VOID
1207 NTAPI
1208 KeInitializeTimer(
1209 OUT PKTIMER Timer);
1210
1211 NTKERNELAPI
1212 VOID
1213 NTAPI
1214 KeInitializeTimerEx(
1215 OUT PKTIMER Timer,
1216 IN TIMER_TYPE Type);
1217
1218 NTKERNELAPI
1219 BOOLEAN
1220 NTAPI
1221 KeInsertByKeyDeviceQueue(
1222 IN OUT PKDEVICE_QUEUE DeviceQueue,
1223 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
1224 IN ULONG SortKey);
1225
1226 NTKERNELAPI
1227 BOOLEAN
1228 NTAPI
1229 KeInsertDeviceQueue(
1230 IN OUT PKDEVICE_QUEUE DeviceQueue,
1231 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
1232
1233 NTKERNELAPI
1234 BOOLEAN
1235 NTAPI
1236 KeInsertQueueDpc(
1237 IN OUT PRKDPC Dpc,
1238 IN PVOID SystemArgument1 OPTIONAL,
1239 IN PVOID SystemArgument2 OPTIONAL);
1240
1241 NTKERNELAPI
1242 VOID
1243 NTAPI
1244 KeLeaveCriticalRegion(VOID);
1245
1246 NTHALAPI
1247 LARGE_INTEGER
1248 NTAPI
1249 KeQueryPerformanceCounter(
1250 OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);
1251
1252 NTKERNELAPI
1253 KPRIORITY
1254 NTAPI
1255 KeQueryPriorityThread(
1256 IN PRKTHREAD Thread);
1257
1258 NTKERNELAPI
1259 ULONG
1260 NTAPI
1261 KeQueryTimeIncrement(
1262 VOID);
1263
1264 NTKERNELAPI
1265 LONG
1266 NTAPI
1267 KeReadStateEvent(
1268 IN PRKEVENT Event);
1269
1270 NTKERNELAPI
1271 LONG
1272 NTAPI
1273 KeReadStateMutex(
1274 IN PRKMUTEX Mutex);
1275
1276
1277 NTKERNELAPI
1278 LONG
1279 NTAPI
1280 KeReadStateSemaphore(
1281 IN PRKSEMAPHORE Semaphore);
1282
1283 NTKERNELAPI
1284 BOOLEAN
1285 NTAPI
1286 KeReadStateTimer(
1287 IN PKTIMER Timer);
1288
1289 NTKERNELAPI
1290 BOOLEAN
1291 NTAPI
1292 KeRegisterBugCheckCallback(
1293 OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
1294 IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
1295 IN PVOID Buffer,
1296 IN ULONG Length,
1297 IN PUCHAR Component);
1298
1299 NTKERNELAPI
1300 LONG
1301 NTAPI
1302 KeReleaseMutex(
1303 IN OUT PRKMUTEX Mutex,
1304 IN BOOLEAN Wait);
1305
1306 NTKERNELAPI
1307 LONG
1308 NTAPI
1309 KeReleaseSemaphore(
1310 IN OUT PRKSEMAPHORE Semaphore,
1311 IN KPRIORITY Increment,
1312 IN LONG Adjustment,
1313 IN BOOLEAN Wait);
1314
1315 NTKERNELAPI
1316 PKDEVICE_QUEUE_ENTRY
1317 NTAPI
1318 KeRemoveByKeyDeviceQueue(
1319 IN OUT PKDEVICE_QUEUE DeviceQueue,
1320 IN ULONG SortKey);
1321
1322 NTKERNELAPI
1323 PKDEVICE_QUEUE_ENTRY
1324 NTAPI
1325 KeRemoveDeviceQueue(
1326 IN OUT PKDEVICE_QUEUE DeviceQueue);
1327
1328 NTKERNELAPI
1329 BOOLEAN
1330 NTAPI
1331 KeRemoveEntryDeviceQueue(
1332 IN OUT PKDEVICE_QUEUE DeviceQueue,
1333 IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
1334
1335 NTKERNELAPI
1336 BOOLEAN
1337 NTAPI
1338 KeRemoveQueueDpc(
1339 IN OUT PRKDPC Dpc);
1340
1341 NTKERNELAPI
1342 LONG
1343 NTAPI
1344 KeResetEvent(
1345 IN OUT PRKEVENT Event);
1346
1347 NTKERNELAPI
1348 LONG
1349 NTAPI
1350 KeSetEvent(
1351 IN OUT PRKEVENT Event,
1352 IN KPRIORITY Increment,
1353 IN BOOLEAN Wait);
1354
1355 NTKERNELAPI
1356 VOID
1357 NTAPI
1358 KeSetImportanceDpc(
1359 IN OUT PRKDPC Dpc,
1360 IN KDPC_IMPORTANCE Importance);
1361
1362 NTKERNELAPI
1363 KPRIORITY
1364 NTAPI
1365 KeSetPriorityThread(
1366 IN OUT PKTHREAD Thread,
1367 IN KPRIORITY Priority);
1368
1369 NTKERNELAPI
1370 BOOLEAN
1371 NTAPI
1372 KeSetTimer(
1373 IN OUT PKTIMER Timer,
1374 IN LARGE_INTEGER DueTime,
1375 IN PKDPC Dpc OPTIONAL);
1376
1377 NTKERNELAPI
1378 BOOLEAN
1379 NTAPI
1380 KeSetTimerEx(
1381 IN OUT PKTIMER Timer,
1382 IN LARGE_INTEGER DueTime,
1383 IN LONG Period OPTIONAL,
1384 IN PKDPC Dpc OPTIONAL);
1385
1386 NTHALAPI
1387 VOID
1388 NTAPI
1389 KeStallExecutionProcessor(
1390 IN ULONG MicroSeconds);
1391
1392 NTKERNELAPI
1393 BOOLEAN
1394 NTAPI
1395 KeSynchronizeExecution(
1396 IN OUT PKINTERRUPT Interrupt,
1397 IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
1398 IN PVOID SynchronizeContext OPTIONAL);
1399
1400 NTKERNELAPI
1401 NTSTATUS
1402 NTAPI
1403 KeWaitForMultipleObjects(
1404 IN ULONG Count,
1405 IN PVOID Object[],
1406 IN WAIT_TYPE WaitType,
1407 IN KWAIT_REASON WaitReason,
1408 IN KPROCESSOR_MODE WaitMode,
1409 IN BOOLEAN Alertable,
1410 IN PLARGE_INTEGER Timeout OPTIONAL,
1411 OUT PKWAIT_BLOCK WaitBlockArray OPTIONAL);
1412
1413 #define KeWaitForMutexObject KeWaitForSingleObject
1414
1415 NTKERNELAPI
1416 NTSTATUS
1417 NTAPI
1418 KeWaitForSingleObject(
1419 IN PVOID Object,
1420 IN KWAIT_REASON WaitReason,
1421 IN KPROCESSOR_MODE WaitMode,
1422 IN BOOLEAN Alertable,
1423 IN PLARGE_INTEGER Timeout OPTIONAL);
1424
1425 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
1426
1427 #if (NTDDI_VERSION >= NTDDI_WINXP)
1428
1429 // _DECL_HAL_KE_IMPORT
1430 VOID
1431 FASTCALL
1432 KeAcquireInStackQueuedSpinLock(
1433 IN OUT PKSPIN_LOCK SpinLock,
1434 OUT PKLOCK_QUEUE_HANDLE LockHandle);
1435
1436 NTKERNELAPI
1437 VOID
1438 FASTCALL
1439 KeAcquireInStackQueuedSpinLockAtDpcLevel(
1440 IN OUT PKSPIN_LOCK SpinLock,
1441 OUT PKLOCK_QUEUE_HANDLE LockHandle);
1442
1443 NTKERNELAPI
1444 KIRQL
1445 NTAPI
1446 KeAcquireInterruptSpinLock(
1447 IN OUT PKINTERRUPT Interrupt);
1448
1449 NTKERNELAPI
1450 BOOLEAN
1451 NTAPI
1452 KeAreApcsDisabled(VOID);
1453
1454 NTKERNELAPI
1455 ULONG
1456 NTAPI
1457 KeGetRecommendedSharedDataAlignment(VOID);
1458
1459 NTKERNELAPI
1460 ULONG
1461 NTAPI
1462 KeQueryRuntimeThread(
1463 IN PKTHREAD Thread,
1464 OUT PULONG UserTime);
1465
1466 NTKERNELAPI
1467 VOID
1468 FASTCALL
1469 KeReleaseInStackQueuedSpinLockFromDpcLevel(
1470 IN PKLOCK_QUEUE_HANDLE LockHandle);
1471
1472 NTKERNELAPI
1473 VOID
1474 NTAPI
1475 KeReleaseInterruptSpinLock(
1476 IN OUT PKINTERRUPT Interrupt,
1477 IN KIRQL OldIrql);
1478
1479 NTKERNELAPI
1480 PKDEVICE_QUEUE_ENTRY
1481 NTAPI
1482 KeRemoveByKeyDeviceQueueIfBusy(
1483 IN OUT PKDEVICE_QUEUE DeviceQueue,
1484 IN ULONG SortKey);
1485
1486 //_DECL_HAL_KE_IMPORT
1487 VOID
1488 FASTCALL
1489 KeReleaseInStackQueuedSpinLock(
1490 IN PKLOCK_QUEUE_HANDLE LockHandle);
1491
1492 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
1493
1494 #if (NTDDI_VERSION >= NTDDI_WINXPSP1)
1495
1496 NTKERNELAPI
1497 BOOLEAN
1498 NTAPI
1499 KeDeregisterBugCheckReasonCallback(
1500 IN OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord);
1501
1502 NTKERNELAPI
1503 BOOLEAN
1504 NTAPI
1505 KeRegisterBugCheckReasonCallback(
1506 OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord,
1507 IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine,
1508 IN KBUGCHECK_CALLBACK_REASON Reason,
1509 IN PUCHAR Component);
1510
1511 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */
1512
1513 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
1514
1515 NTKERNELAPI
1516 VOID
1517 NTAPI
1518 KeFlushQueuedDpcs(
1519 VOID);
1520
1521 #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
1522
1523 #if (NTDDI_VERSION >= NTDDI_WS03)
1524
1525 NTKERNELAPI
1526 PVOID
1527 NTAPI
1528 KeRegisterNmiCallback(
1529 IN PNMI_CALLBACK CallbackRoutine,
1530 IN PVOID Context OPTIONAL);
1531
1532 NTKERNELAPI
1533 NTSTATUS
1534 NTAPI
1535 KeDeregisterNmiCallback(
1536 IN PVOID Handle);
1537
1538 NTKERNELAPI
1539 VOID
1540 NTAPI
1541 KeInitializeThreadedDpc(
1542 OUT PRKDPC Dpc,
1543 IN PKDEFERRED_ROUTINE DeferredRoutine,
1544 IN PVOID DeferredContext OPTIONAL);
1545
1546 NTKERNELAPI
1547 ULONG_PTR
1548 NTAPI
1549 KeIpiGenericCall(
1550 IN PKIPI_BROADCAST_WORKER BroadcastFunction,
1551 IN ULONG_PTR Context);
1552
1553 NTKERNELAPI
1554 KIRQL
1555 FASTCALL
1556 KeAcquireSpinLockForDpc(
1557 IN OUT PKSPIN_LOCK SpinLock);
1558
1559 NTKERNELAPI
1560 VOID
1561 FASTCALL
1562 KeReleaseSpinLockForDpc(
1563 IN OUT PKSPIN_LOCK SpinLock,
1564 IN KIRQL OldIrql);
1565
1566 #endif /* (NTDDI_VERSION >= NTDDI_WS03) */
1567
1568 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
1569
1570 NTKERNELAPI
1571 BOOLEAN
1572 FASTCALL
1573 KeTryToAcquireSpinLockAtDpcLevel(
1574 IN OUT PKSPIN_LOCK SpinLock);
1575
1576 NTKERNELAPI
1577 BOOLEAN
1578 NTAPI
1579 KeAreAllApcsDisabled(
1580 VOID);
1581
1582 NTKERNELAPI
1583 VOID
1584 FASTCALL
1585 KeAcquireGuardedMutex(
1586 IN OUT PKGUARDED_MUTEX GuardedMutex
1587 );
1588
1589 NTKERNELAPI
1590 VOID
1591 FASTCALL
1592 KeAcquireGuardedMutexUnsafe(
1593 IN OUT PKGUARDED_MUTEX GuardedMutex
1594 );
1595
1596 NTKERNELAPI
1597 VOID
1598 NTAPI
1599 KeEnterGuardedRegion(
1600 VOID
1601 );
1602
1603 NTKERNELAPI
1604 VOID
1605 NTAPI
1606 KeLeaveGuardedRegion(
1607 VOID
1608 );
1609
1610 NTKERNELAPI
1611 VOID
1612 FASTCALL
1613 KeInitializeGuardedMutex(
1614 OUT PKGUARDED_MUTEX GuardedMutex
1615 );
1616
1617 NTKERNELAPI
1618 VOID
1619 FASTCALL
1620 KeReleaseGuardedMutexUnsafe(
1621 IN OUT PKGUARDED_MUTEX GuardedMutex
1622 );
1623
1624 NTKERNELAPI
1625 VOID
1626 FASTCALL
1627 KeReleaseGuardedMutex(
1628 IN OUT PKGUARDED_MUTEX GuardedMutex
1629 );
1630
1631 NTKERNELAPI
1632 BOOLEAN
1633 FASTCALL
1634 KeTryToAcquireGuardedMutex(
1635 IN OUT PKGUARDED_MUTEX GuardedMutex
1636 );
1637
1638 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
1639
1640 #if (NTDDI_VERSION >= NTDDI_VISTA)
1641
1642 NTKERNELAPI
1643 VOID
1644 FASTCALL
1645 KeAcquireInStackQueuedSpinLockForDpc(
1646 IN OUT PKSPIN_LOCK SpinLock,
1647 OUT PKLOCK_QUEUE_HANDLE LockHandle);
1648
1649 NTKERNELAPI
1650 VOID
1651 FASTCALL
1652 KeReleaseInStackQueuedSpinLockForDpc(
1653 IN PKLOCK_QUEUE_HANDLE LockHandle);
1654
1655 NTKERNELAPI
1656 NTSTATUS
1657 NTAPI
1658 KeQueryDpcWatchdogInformation(
1659 OUT PKDPC_WATCHDOG_INFORMATION WatchdogInformation);
1660
1661 #if defined(SINGLE_GROUP_LEGACY_API)
1662 NTKERNELAPI
1663 KAFFINITY
1664 NTAPI
1665 KeSetSystemAffinityThreadEx(
1666 IN KAFFINITY Affinity);
1667
1668 NTKERNELAPI
1669 ULONG
1670 NTAPI
1671 KeQueryActiveProcessorCount(
1672 OUT PKAFFINITY ActiveProcessors OPTIONAL);
1673
1674 NTKERNELAPI
1675 ULONG
1676 NTAPI
1677 KeQueryMaximumProcessorCount(
1678 VOID);
1679 #endif
1680
1681 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1682
1683 #if (NTDDI_VERSION >= NTDDI_WS08)
1684
1685 PVOID
1686 KeRegisterProcessorChangeCallback(
1687 IN PPROCESSOR_CALLBACK_FUNCTION CallbackFunction,
1688 IN PVOID CallbackContext OPTIONAL,
1689 IN ULONG Flags);
1690
1691 VOID
1692 KeDeregisterProcessorChangeCallback(
1693 IN PVOID CallbackHandle);
1694
1695 #endif /* (NTDDI_VERSION >= NTDDI_WS08) */
1696
1697 #if (NTDDI_VERSION >= NTDDI_WIN7)
1698
1699 ULONG64
1700 NTAPI
1701 KeQueryTotalCycleTimeProcess(
1702 IN OUT PKPROCESS Process,
1703 OUT PULONG64 CycleTimeStamp);
1704
1705 ULONG64
1706 NTAPI
1707 KeQueryTotalCycleTimeThread(
1708 IN OUT PKTHREAD Thread,
1709 OUT PULONG64 CycleTimeStamp);
1710
1711 NTKERNELAPI
1712 NTSTATUS
1713 NTAPI
1714 KeSetTargetProcessorDpcEx(
1715 IN OUT PKDPC Dpc,
1716 IN PPROCESSOR_NUMBER ProcNumber);
1717
1718 NTKERNELAPI
1719 VOID
1720 NTAPI
1721 KeSetSystemGroupAffinityThread(
1722 IN PGROUP_AFFINITY Affinity,
1723 OUT PGROUP_AFFINITY PreviousAffinity OPTIONAL);
1724
1725 NTKERNELAPI
1726 VOID
1727 NTAPI
1728 KeRevertToUserGroupAffinityThread(
1729 IN PGROUP_AFFINITY PreviousAffinity);
1730
1731 NTKERNELAPI
1732 BOOLEAN
1733 NTAPI
1734 KeSetCoalescableTimer(
1735 IN OUT PKTIMER Timer,
1736 IN LARGE_INTEGER DueTime,
1737 IN ULONG Period,
1738 IN ULONG TolerableDelay,
1739 IN PKDPC Dpc OPTIONAL);
1740
1741 NTKERNELAPI
1742 ULONGLONG
1743 NTAPI
1744 KeQueryUnbiasedInterruptTime(
1745 VOID);
1746
1747 NTKERNELAPI
1748 ULONG
1749 NTAPI
1750 KeQueryActiveProcessorCountEx(
1751 IN USHORT GroupNumber);
1752
1753 NTKERNELAPI
1754 ULONG
1755 NTAPI
1756 KeQueryMaximumProcessorCountEx(
1757 IN USHORT GroupNumber);
1758
1759 NTKERNELAPI
1760 USHORT
1761 NTAPI
1762 KeQueryActiveGroupCount(
1763 VOID);
1764
1765 NTKERNELAPI
1766 USHORT
1767 NTAPI
1768 KeQueryMaximumGroupCount(
1769 VOID);
1770
1771 NTKERNELAPI
1772 KAFFINITY
1773 NTAPI
1774 KeQueryGroupAffinity
1775 IN USHORT GroupNumber);
1776
1777 NTKERNELAPI
1778 ULONG
1779 NTAPI
1780 KeGetCurrentProcessorNumberEx(
1781 OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL);
1782
1783 NTKERNELAPI
1784 VOID
1785 NTAPI
1786 KeQueryNodeActiveAffinity(
1787 IN USHORT NodeNumber,
1788 OUT PGROUP_AFFINITY Affinity OPTIONAL,
1789 OUT PUSHORT Count OPTIONAL);
1790
1791 NTKERNELAPI
1792 USHORT
1793 NTAPI
1794 KeQueryNodeMaximumProcessorCount(
1795 IN USHORT NodeNumber);
1796
1797 NTKERNELAPI
1798 USHORT
1799 NTAPI
1800 KeQueryHighestNodeNumber(
1801 VOID);
1802
1803 NTKERNELAPI
1804 USHORT
1805 NTAPI
1806 KeGetCurrentNodeNumber(
1807 VOID);
1808
1809 NTKERNELAPI
1810 NTSTATUS
1811 NTAPI
1812 KeQueryLogicalProcessorRelationship(
1813 IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL,
1814 IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,
1815 OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL,
1816 IN OUT PULONG Length);
1817
1818 NTKERNELAPI
1819 NTSTATUS
1820 NTAPI
1821 KeSaveExtendedProcessorState(
1822 IN ULONG64 Mask,
1823 OUT PXSTATE_SAVE XStateSave);
1824
1825 NTKERNELAPI
1826 VOID
1827 NTAPI
1828 KeRestoreExtendedProcessorState(
1829 IN PXSTATE_SAVE XStateSave);
1830
1831 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
1832
1833 #if defined(_X86_)
1834 NTKERNELAPI
1835 NTSTATUS
1836 NTAPI
1837 KeSaveFloatingPointState(
1838 OUT PKFLOATING_SAVE FloatSave);
1839
1840 NTKERNELAPI
1841 NTSTATUS
1842 NTAPI
1843 KeRestoreFloatingPointState(
1844 IN PKFLOATING_SAVE FloatSave);
1845 #endif
1846
1847 #if defined(_IA64_)
1848 FORCEINLINE
1849 VOID
1850 KeFlushWriteBuffer(VOID)
1851 {
1852 __mf ();
1853 return;
1854 }
1855 #else
1856 NTHALAPI
1857 VOID
1858 NTAPI
1859 KeFlushWriteBuffer(VOID);
1860 #endif
1861
1862 /*
1863 * VOID
1864 * KeFlushIoBuffers(
1865 * IN PMDL Mdl,
1866 * IN BOOLEAN ReadOperation,
1867 * IN BOOLEAN DmaOperation)
1868 */
1869 #define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation)
1870
1871 #define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
1872 #define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
1873 #define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
1874 #define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
1875
1876 #if (NTDDI_VERSION >= NTDDI_WS03)
1877 NTKERNELAPI
1878 BOOLEAN
1879 FASTCALL
1880 KeTestSpinLock(
1881 IN PKSPIN_LOCK SpinLock
1882 );
1883 #endif
1884
1885 NTHALAPI
1886 KIRQL
1887 NTAPI
1888 KeGetCurrentIrql(
1889 VOID);
1890
1891 #if defined(_M_AMD64)
1892 FORCEINLINE
1893 PKTHREAD
1894 KeGetCurrentThread (
1895 VOID)
1896 {
1897 return (struct _KTHREAD *)__readgsqword(0x188);
1898 }
1899 #endif
1900
1901 #if defined(_M_IX86) || defined(_M_IA64)
1902 NTSYSAPI
1903 PKTHREAD
1904 NTAPI
1905 KeGetCurrentThread(
1906 VOID);
1907 #endif
1908
1909 /*
1910 * VOID
1911 * KeInitializeCallbackRecord(
1912 * IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord)
1913 */
1914 #define KeInitializeCallbackRecord(CallbackRecord) \
1915 CallbackRecord->State = BufferEmpty;
1916
1917 #if DBG
1918
1919 #if (NTDDI_VERSION >= NTDDI_VISTA)
1920 #define PAGED_ASSERT( exp ) NT_ASSERT( exp )
1921 #else
1922 #define PAGED_ASSERT( exp ) ASSERT( exp )
1923 #endif
1924
1925 #define PAGED_CODE() { \
1926 if (KeGetCurrentIrql() > APC_LEVEL) { \
1927 KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
1928 PAGED_ASSERT(FALSE); \
1929 } \
1930 }
1931
1932 #else
1933
1934 #define PAGED_CODE()
1935
1936 #endif
1937
1938 #define PAGED_CODE_LOCKED() NOP_FUNCTION;
1939
1940
1941 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1942
1943 NTKERNELAPI
1944 VOID
1945 NTAPI
1946 ProbeForRead(
1947 IN CONST VOID *Address, /* CONST is added */
1948 IN SIZE_T Length,
1949 IN ULONG Alignment);
1950
1951 NTKERNELAPI
1952 VOID
1953 NTAPI
1954 ProbeForWrite(
1955 IN PVOID Address,
1956 IN SIZE_T Length,
1957 IN ULONG Alignment);
1958
1959 #endif
1960
1961 #if defined(_X86_) || defined(_AMD64_)
1962
1963 /* x86 and x64 performs a 0x2C interrupt */
1964 #define DbgRaiseAssertionFailure __int2c
1965
1966 #elif defined(_ARM_)
1967
1968 //
1969 // TODO
1970 //
1971
1972 #else
1973 #error Unsupported Architecture
1974 #endif
1975
1976
1977 /******************************************************************************
1978 * Memory manager Types *
1979 ******************************************************************************/
1980
1981 #define PAGE_SIZE 0x1000
1982 #define PAGE_SHIFT 12L
1983
1984 #define MM_DONT_ZERO_ALLOCATION 0x00000001
1985 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002
1986 #define MM_ALLOCATE_FULLY_REQUIRED 0x00000004
1987 #define MM_ALLOCATE_NO_WAIT 0x00000008
1988 #define MM_ALLOCATE_PREFER_CONTIGUOUS 0x00000010
1989 #define MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS 0x00000020
1990
1991 #define MDL_MAPPED_TO_SYSTEM_VA 0x0001
1992 #define MDL_PAGES_LOCKED 0x0002
1993 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
1994 #define MDL_ALLOCATED_FIXED_SIZE 0x0008
1995 #define MDL_PARTIAL 0x0010
1996 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
1997 #define MDL_IO_PAGE_READ 0x0040
1998 #define MDL_WRITE_OPERATION 0x0080
1999 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
2000 #define MDL_FREE_EXTRA_PTES 0x0200
2001 #define MDL_DESCRIBES_AWE 0x0400
2002 #define MDL_IO_SPACE 0x0800
2003 #define MDL_NETWORK_HEADER 0x1000
2004 #define MDL_MAPPING_CAN_FAIL 0x2000
2005 #define MDL_ALLOCATED_MUST_SUCCEED 0x4000
2006 #define MDL_INTERNAL 0x8000
2007
2008 #define MDL_MAPPING_FLAGS ( \
2009 MDL_MAPPED_TO_SYSTEM_VA | \
2010 MDL_PAGES_LOCKED | \
2011 MDL_SOURCE_IS_NONPAGED_POOL | \
2012 MDL_PARTIAL_HAS_BEEN_MAPPED | \
2013 MDL_PARENT_MAPPED_SYSTEM_VA | \
2014 MDL_SYSTEM_VA | \
2015 MDL_IO_SPACE)
2016
2017 #define FLUSH_MULTIPLE_MAXIMUM 32
2018
2019 /* Section access rights */
2020 #define SECTION_QUERY 0x0001
2021 #define SECTION_MAP_WRITE 0x0002
2022 #define SECTION_MAP_READ 0x0004
2023 #define SECTION_MAP_EXECUTE 0x0008
2024 #define SECTION_EXTEND_SIZE 0x0010
2025 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
2026
2027 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
2028 SECTION_MAP_WRITE | \
2029 SECTION_MAP_READ | \
2030 SECTION_MAP_EXECUTE | \
2031 SECTION_EXTEND_SIZE)
2032
2033 #define SESSION_QUERY_ACCESS 0x0001
2034 #define SESSION_MODIFY_ACCESS 0x0002
2035
2036 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
2037 SESSION_QUERY_ACCESS | \
2038 SESSION_MODIFY_ACCESS)
2039
2040 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
2041
2042 #define PAGE_NOACCESS 0x01
2043 #define PAGE_READONLY 0x02
2044 #define PAGE_READWRITE 0x04
2045 #define PAGE_WRITECOPY 0x08
2046 #define PAGE_EXECUTE 0x10
2047 #define PAGE_EXECUTE_READ 0x20
2048 #define PAGE_EXECUTE_READWRITE 0x40
2049 #define PAGE_EXECUTE_WRITECOPY 0x80
2050 #define PAGE_GUARD 0x100
2051 #define PAGE_NOCACHE 0x200
2052 #define PAGE_WRITECOMBINE 0x400
2053
2054 #define MEM_COMMIT 0x1000
2055 #define MEM_RESERVE 0x2000
2056 #define MEM_DECOMMIT 0x4000
2057 #define MEM_RELEASE 0x8000
2058 #define MEM_FREE 0x10000
2059 #define MEM_PRIVATE 0x20000
2060 #define MEM_MAPPED 0x40000
2061 #define MEM_RESET 0x80000
2062 #define MEM_TOP_DOWN 0x100000
2063 #define MEM_LARGE_PAGES 0x20000000
2064 #define MEM_4MB_PAGES 0x80000000
2065
2066 #define SEC_RESERVE 0x4000000
2067 #define SEC_COMMIT 0x8000000
2068 #define SEC_LARGE_PAGES 0x80000000
2069
2070 /* Section map options */
2071 typedef enum _SECTION_INHERIT {
2072 ViewShare = 1,
2073 ViewUnmap = 2
2074 } SECTION_INHERIT;
2075
2076 typedef ULONG PFN_COUNT;
2077 typedef LONG_PTR SPFN_NUMBER, *PSPFN_NUMBER;
2078 typedef ULONG_PTR PFN_NUMBER, *PPFN_NUMBER;
2079
2080 typedef struct _MDL {
2081 struct _MDL *Next;
2082 CSHORT Size;
2083 CSHORT MdlFlags;
2084 struct _EPROCESS *Process;
2085 PVOID MappedSystemVa;
2086 PVOID StartVa;
2087 ULONG ByteCount;
2088 ULONG ByteOffset;
2089 } MDL, *PMDL;
2090 typedef MDL *PMDLX;
2091
2092 typedef enum _MEMORY_CACHING_TYPE_ORIG {
2093 MmFrameBufferCached = 2
2094 } MEMORY_CACHING_TYPE_ORIG;
2095
2096 typedef enum _MEMORY_CACHING_TYPE {
2097 MmNonCached = FALSE,
2098 MmCached = TRUE,
2099 MmWriteCombined = MmFrameBufferCached,
2100 MmHardwareCoherentCached,
2101 MmNonCachedUnordered,
2102 MmUSWCCached,
2103 MmMaximumCacheType
2104 } MEMORY_CACHING_TYPE;
2105
2106 typedef enum _MM_PAGE_PRIORITY {
2107 LowPagePriority,
2108 NormalPagePriority = 16,
2109 HighPagePriority = 32
2110 } MM_PAGE_PRIORITY;
2111
2112 typedef enum _LOCK_OPERATION {
2113 IoReadAccess,
2114 IoWriteAccess,
2115 IoModifyAccess
2116 } LOCK_OPERATION;
2117
2118 typedef enum _MM_SYSTEM_SIZE {
2119 MmSmallSystem,
2120 MmMediumSystem,
2121 MmLargeSystem
2122 } MM_SYSTEMSIZE;
2123
2124
2125 /******************************************************************************
2126 * Memory manager Functions *
2127 ******************************************************************************/
2128
2129 /*
2130 * Alignment Macros
2131 */
2132 #define ALIGN_DOWN_BY(size, align) \
2133 ((ULONG_PTR)(size) & ~((ULONG_PTR)(align) - 1))
2134
2135 #define ALIGN_UP_BY(size, align) \
2136 (ALIGN_DOWN_BY(((ULONG_PTR)(size) + align - 1), align))
2137
2138 #define ALIGN_DOWN_POINTER_BY(ptr, align) \
2139 ((PVOID)ALIGN_DOWN_BY(ptr, align))
2140
2141 #define ALIGN_UP_POINTER_BY(ptr, alignment) \
2142 ((PVOID)ALIGN_UP_BY(ptr, align))
2143
2144 #define ALIGN_DOWN(size, type) \
2145 ALIGN_DOWN_BY(size, sizeof(type))
2146
2147 #define ALIGN_UP(size, type) \
2148 ALIGN_UP_BY(size, sizeof(type))
2149
2150 #define ALIGN_DOWN_POINTER(p, type) \
2151 ALIGN_DOWN_POINTER_BY(p, sizeof(type))
2152
2153 #define ALIGN_UP_POINTER(ptr, type) \
2154 ALIGN_UP_POINTER_BY(ptr, sizeof(type))
2155
2156 /* ULONG
2157 * BYTE_OFFSET(
2158 * IN PVOID Va)
2159 */
2160 #define BYTE_OFFSET(Va) \
2161 ((ULONG) ((ULONG_PTR) (Va) & (PAGE_SIZE - 1)))
2162
2163 /* ULONG
2164 * BYTES_TO_PAGES(
2165 * IN ULONG Size)
2166 */
2167 #define BYTES_TO_PAGES(Size) \
2168 (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0))
2169
2170 /* PVOID
2171 * PAGE_ALIGN(
2172 * IN PVOID Va)
2173 */
2174 #define PAGE_ALIGN(Va) \
2175 ((PVOID) ((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
2176
2177 /* ULONG_PTR
2178 * ROUND_TO_PAGES(
2179 * IN ULONG_PTR Size)
2180 */
2181 #define ROUND_TO_PAGES(Size) \
2182 (((ULONG_PTR) (Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
2183
2184 /*
2185 * ULONG
2186 * MmGetMdlByteCount(
2187 * IN PMDL Mdl)
2188 */
2189 #define MmGetMdlByteCount(_Mdl) \
2190 ((_Mdl)->ByteCount)
2191
2192 /*
2193 * ULONG
2194 * MmGetMdlByteOffset(
2195 * IN PMDL Mdl)
2196 */
2197 #define MmGetMdlByteOffset(_Mdl) \
2198 ((_Mdl)->ByteOffset)
2199
2200 /*
2201 * PPFN_NUMBER
2202 * MmGetMdlPfnArray(
2203 * IN PMDL Mdl)
2204 */
2205 #define MmGetMdlPfnArray(_Mdl) \
2206 ((PPFN_NUMBER) ((_Mdl) + 1))
2207
2208 /*
2209 * PVOID
2210 * MmGetMdlVirtualAddress(
2211 * IN PMDL Mdl)
2212 */
2213 #define MmGetMdlVirtualAddress(_Mdl) \
2214 ((PVOID) ((PCHAR) ((_Mdl)->StartVa) + (_Mdl)->ByteOffset))
2215
2216 #define MmGetProcedureAddress(Address) (Address)
2217
2218 /* PVOID MmGetSystemAddressForMdl(
2219 * IN PMDL Mdl);
2220 */
2221 #define MmGetSystemAddressForMdl(Mdl) \
2222 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
2223 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2224 ((Mdl)->MappedSystemVa) : \
2225 (MmMapLockedPages((Mdl), KernelMode)))
2226
2227 /* PVOID
2228 * MmGetSystemAddressForMdlSafe(
2229 * IN PMDL Mdl,
2230 * IN MM_PAGE_PRIORITY Priority)
2231 */
2232 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
2233 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
2234 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2235 (_Mdl)->MappedSystemVa : \
2236 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
2237 KernelMode, MmCached, NULL, FALSE, (_Priority)))
2238
2239 /*
2240 * VOID
2241 * MmInitializeMdl(
2242 * IN PMDL MemoryDescriptorList,
2243 * IN PVOID BaseVa,
2244 * IN SIZE_T Length)
2245 */
2246 #define MmInitializeMdl(_MemoryDescriptorList, \
2247 _BaseVa, \
2248 _Length) \
2249 { \
2250 (_MemoryDescriptorList)->Next = (PMDL) NULL; \
2251 (_MemoryDescriptorList)->Size = (CSHORT) (sizeof(MDL) + \
2252 (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES(_BaseVa, _Length))); \
2253 (_MemoryDescriptorList)->MdlFlags = 0; \
2254 (_MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN(_BaseVa); \
2255 (_MemoryDescriptorList)->ByteOffset = BYTE_OFFSET(_BaseVa); \
2256 (_MemoryDescriptorList)->ByteCount = (ULONG) _Length; \
2257 }
2258
2259 /*
2260 * VOID
2261 * MmPrepareMdlForReuse(
2262 * IN PMDL Mdl)
2263 */
2264 #define MmPrepareMdlForReuse(_Mdl) \
2265 { \
2266 if (((_Mdl)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
2267 ASSERT(((_Mdl)->MdlFlags & MDL_PARTIAL) != 0); \
2268 MmUnmapLockedPages((_Mdl)->MappedSystemVa, (_Mdl)); \
2269 } else if (((_Mdl)->MdlFlags & MDL_PARTIAL) == 0) { \
2270 ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
2271 } \
2272 }
2273
2274 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2275
2276 NTKERNELAPI
2277 PVOID
2278 NTAPI
2279 MmAllocateContiguousMemory(
2280 IN SIZE_T NumberOfBytes,
2281 IN PHYSICAL_ADDRESS HighestAcceptableAddress);
2282
2283 NTKERNELAPI
2284 PVOID
2285 NTAPI
2286 MmAllocateContiguousMemorySpecifyCache(
2287 IN SIZE_T NumberOfBytes,
2288 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
2289 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
2290 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
2291 IN MEMORY_CACHING_TYPE CacheType);
2292
2293 NTKERNELAPI
2294 PMDL
2295 NTAPI
2296 MmAllocatePagesForMdl(
2297 IN PHYSICAL_ADDRESS LowAddress,
2298 IN PHYSICAL_ADDRESS HighAddress,
2299 IN PHYSICAL_ADDRESS SkipBytes,
2300 IN SIZE_T TotalBytes);
2301
2302 NTKERNELAPI
2303 VOID
2304 NTAPI
2305 MmBuildMdlForNonPagedPool(
2306 IN OUT PMDLX MemoryDescriptorList);
2307
2308 //DECLSPEC_DEPRECATED_DDK
2309 NTKERNELAPI
2310 PMDL
2311 NTAPI
2312 MmCreateMdl(
2313 IN PMDL MemoryDescriptorList OPTIONAL,
2314 IN PVOID Base,
2315 IN SIZE_T Length);
2316
2317 NTKERNELAPI
2318 VOID
2319 NTAPI
2320 MmFreeContiguousMemory(
2321 IN PVOID BaseAddress);
2322
2323 NTKERNELAPI
2324 VOID
2325 NTAPI
2326 MmFreeContiguousMemorySpecifyCache(
2327 IN PVOID BaseAddress,
2328 IN SIZE_T NumberOfBytes,
2329 IN MEMORY_CACHING_TYPE CacheType);
2330
2331 NTKERNELAPI
2332 VOID
2333 NTAPI
2334 MmFreePagesFromMdl(
2335 IN PMDLX MemoryDescriptorList);
2336
2337 NTKERNELAPI
2338 PVOID
2339 NTAPI
2340 MmGetSystemRoutineAddress(
2341 IN PUNICODE_STRING SystemRoutineName);
2342
2343 NTKERNELAPI
2344 LOGICAL
2345 NTAPI
2346 MmIsDriverVerifying(
2347 IN struct _DRIVER_OBJECT *DriverObject);
2348
2349 NTKERNELAPI
2350 PVOID
2351 NTAPI
2352 MmLockPagableDataSection(
2353 IN PVOID AddressWithinSection);
2354
2355 NTKERNELAPI
2356 PVOID
2357 NTAPI
2358 MmMapIoSpace(
2359 IN PHYSICAL_ADDRESS PhysicalAddress,
2360 IN SIZE_T NumberOfBytes,
2361 IN MEMORY_CACHING_TYPE CacheEnable);
2362
2363 NTKERNELAPI
2364 PVOID
2365 NTAPI
2366 MmMapLockedPages(
2367 IN PMDL MemoryDescriptorList,
2368 IN KPROCESSOR_MODE AccessMode);
2369
2370 NTKERNELAPI
2371 PVOID
2372 NTAPI
2373 MmMapLockedPagesSpecifyCache(
2374 IN PMDLX MemoryDescriptorList,
2375 IN KPROCESSOR_MODE AccessMode,
2376 IN MEMORY_CACHING_TYPE CacheType,
2377 IN PVOID BaseAddress OPTIONAL,
2378 IN ULONG BugCheckOnFailure,
2379 IN MM_PAGE_PRIORITY Priority);
2380
2381 NTKERNELAPI
2382 PVOID
2383 NTAPI
2384 MmPageEntireDriver(
2385 IN PVOID AddressWithinSection);
2386
2387 NTKERNELAPI
2388 VOID
2389 NTAPI
2390 MmProbeAndLockPages(
2391 IN OUT PMDL MemoryDescriptorList,
2392 IN KPROCESSOR_MODE AccessMode,
2393 IN LOCK_OPERATION Operation);
2394
2395 NTKERNELAPI
2396 MM_SYSTEMSIZE
2397 NTAPI
2398 MmQuerySystemSize(
2399 VOID);
2400
2401 NTKERNELAPI
2402 VOID
2403 NTAPI
2404 MmResetDriverPaging(
2405 IN PVOID AddressWithinSection);
2406
2407 NTKERNELAPI
2408 SIZE_T
2409 NTAPI
2410 MmSizeOfMdl(
2411 IN PVOID Base,
2412 IN SIZE_T Length);
2413
2414 NTKERNELAPI
2415 VOID
2416 NTAPI
2417 MmUnlockPagableImageSection(
2418 IN PVOID ImageSectionHandle);
2419
2420 NTKERNELAPI
2421 VOID
2422 NTAPI
2423 MmUnlockPages(
2424 IN OUT PMDL MemoryDescriptorList);
2425
2426 NTKERNELAPI
2427 VOID
2428 NTAPI
2429 MmUnmapIoSpace(
2430 IN PVOID BaseAddress,
2431 IN SIZE_T NumberOfBytes);
2432
2433 NTKERNELAPI
2434 VOID
2435 NTAPI
2436 MmProbeAndLockProcessPages(
2437 IN OUT PMDL MemoryDescriptorList,
2438 IN PEPROCESS Process,
2439 IN KPROCESSOR_MODE AccessMode,
2440 IN LOCK_OPERATION Operation);
2441
2442 NTKERNELAPI
2443 VOID
2444 NTAPI
2445 MmUnmapLockedPages(
2446 IN PVOID BaseAddress,
2447 IN PMDL MemoryDescriptorList);
2448
2449 #endif
2450
2451 #if (NTDDI_VERSION >= NTDDI_WINXP)
2452
2453 NTKERNELAPI
2454 NTSTATUS
2455 NTAPI
2456 MmAdvanceMdl(
2457 IN OUT PMDL Mdl,
2458 IN ULONG NumberOfBytes);
2459
2460 NTKERNELAPI
2461 PVOID
2462 NTAPI
2463 MmAllocateMappingAddress(
2464 IN SIZE_T NumberOfBytes,
2465 IN ULONG PoolTag);
2466
2467 NTKERNELAPI
2468 VOID
2469 NTAPI
2470 MmFreeMappingAddress(
2471 IN PVOID BaseAddress,
2472 IN ULONG PoolTag);
2473
2474 NTKERNELAPI
2475 NTSTATUS
2476 NTAPI
2477 MmIsVerifierEnabled(
2478 OUT PULONG VerifierFlags);
2479
2480 NTKERNELAPI
2481 PVOID
2482 NTAPI
2483 MmMapLockedPagesWithReservedMapping(
2484 IN PVOID MappingAddress,
2485 IN ULONG PoolTag,
2486 IN PMDL MemoryDescriptorList,
2487 IN MEMORY_CACHING_TYPE CacheType);
2488
2489 NTKERNELAPI
2490 NTSTATUS
2491 NTAPI
2492 MmProtectMdlSystemAddress(
2493 IN PMDL MemoryDescriptorList,
2494 IN ULONG NewProtect);
2495
2496 NTKERNELAPI
2497 VOID
2498 NTAPI
2499 MmUnmapReservedMapping(
2500 IN PVOID BaseAddress,
2501 IN ULONG PoolTag,
2502 IN PMDL MemoryDescriptorList);
2503
2504 #endif
2505
2506 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
2507 NTKERNELAPI
2508 PMDL
2509 NTAPI
2510 MmAllocatePagesForMdlEx(
2511 IN PHYSICAL_ADDRESS LowAddress,
2512 IN PHYSICAL_ADDRESS HighAddress,
2513 IN PHYSICAL_ADDRESS SkipBytes,
2514 IN SIZE_T TotalBytes,
2515 IN MEMORY_CACHING_TYPE CacheType,
2516 IN ULONG Flags);
2517 #endif
2518
2519 /******************************************************************************
2520 * Security Manager Types *
2521 ******************************************************************************/
2522
2523 /* Simple types */
2524 typedef PVOID PSECURITY_DESCRIPTOR;
2525 typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;
2526 typedef ULONG ACCESS_MASK, *PACCESS_MASK;
2527 typedef PVOID PACCESS_TOKEN;
2528 typedef PVOID PSID;
2529
2530 #define DELETE 0x00010000L
2531 #define READ_CONTROL 0x00020000L
2532 #define WRITE_DAC 0x00040000L
2533 #define WRITE_OWNER 0x00080000L
2534 #define SYNCHRONIZE 0x00100000L
2535 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
2536 #define STANDARD_RIGHTS_READ READ_CONTROL
2537 #define STANDARD_RIGHTS_WRITE READ_CONTROL
2538 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
2539 #define STANDARD_RIGHTS_ALL 0x001F0000L
2540 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
2541 #define ACCESS_SYSTEM_SECURITY 0x01000000L
2542 #define MAXIMUM_ALLOWED 0x02000000L
2543 #define GENERIC_READ 0x80000000L
2544 #define GENERIC_WRITE 0x40000000L
2545 #define GENERIC_EXECUTE 0x20000000L
2546 #define GENERIC_ALL 0x10000000L
2547
2548 typedef struct _GENERIC_MAPPING {
2549 ACCESS_MASK GenericRead;
2550 ACCESS_MASK GenericWrite;
2551 ACCESS_MASK GenericExecute;
2552 ACCESS_MASK GenericAll;
2553 } GENERIC_MAPPING, *PGENERIC_MAPPING;
2554
2555 #define ACL_REVISION 2
2556 #define ACL_REVISION_DS 4
2557
2558 #define ACL_REVISION1 1
2559 #define ACL_REVISION2 2
2560 #define ACL_REVISION3 3
2561 #define ACL_REVISION4 4
2562 #define MIN_ACL_REVISION ACL_REVISION2
2563 #define MAX_ACL_REVISION ACL_REVISION4
2564
2565 typedef struct _ACL {
2566 UCHAR AclRevision;
2567 UCHAR Sbz1;
2568 USHORT AclSize;
2569 USHORT AceCount;
2570 USHORT Sbz2;
2571 } ACL, *PACL;
2572
2573 /* Current security descriptor revision value */
2574 #define SECURITY_DESCRIPTOR_REVISION (1)
2575 #define SECURITY_DESCRIPTOR_REVISION1 (1)
2576
2577 /* Privilege attributes */
2578 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
2579 #define SE_PRIVILEGE_ENABLED (0x00000002L)
2580 #define SE_PRIVILEGE_REMOVED (0X00000004L)
2581 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
2582
2583 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
2584 SE_PRIVILEGE_ENABLED | \
2585 SE_PRIVILEGE_REMOVED | \
2586 SE_PRIVILEGE_USED_FOR_ACCESS)
2587
2588 #include <pshpack4.h>
2589 typedef struct _LUID_AND_ATTRIBUTES {
2590 LUID Luid;
2591 ULONG Attributes;
2592 } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
2593 #include <poppack.h>
2594
2595 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
2596 typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
2597
2598 /* Privilege sets */
2599 #define PRIVILEGE_SET_ALL_NECESSARY (1)
2600
2601 typedef struct _PRIVILEGE_SET {
2602 ULONG PrivilegeCount;
2603 ULONG Control;
2604 LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
2605 } PRIVILEGE_SET,*PPRIVILEGE_SET;
2606
2607 typedef enum _SECURITY_IMPERSONATION_LEVEL {
2608 SecurityAnonymous,
2609 SecurityIdentification,
2610 SecurityImpersonation,
2611 SecurityDelegation
2612 } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
2613
2614 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
2615 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
2616 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
2617 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
2618
2619 #define SECURITY_DYNAMIC_TRACKING (TRUE)
2620 #define SECURITY_STATIC_TRACKING (FALSE)
2621
2622 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE;
2623
2624 typedef struct _SECURITY_QUALITY_OF_SERVICE {
2625 ULONG Length;
2626 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
2627 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
2628 BOOLEAN EffectiveOnly;
2629 } SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
2630
2631 typedef struct _SE_IMPERSONATION_STATE {
2632 PACCESS_TOKEN Token;
2633 BOOLEAN CopyOnOpen;
2634 BOOLEAN EffectiveOnly;
2635 SECURITY_IMPERSONATION_LEVEL Level;
2636 } SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
2637
2638 #define OWNER_SECURITY_INFORMATION (0x00000001L)
2639 #define GROUP_SECURITY_INFORMATION (0x00000002L)
2640 #define DACL_SECURITY_INFORMATION (0x00000004L)
2641 #define SACL_SECURITY_INFORMATION (0x00000008L)
2642 #define LABEL_SECURITY_INFORMATION (0x00000010L)
2643
2644 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
2645 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
2646 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
2647 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
2648
2649 typedef enum _SECURITY_OPERATION_CODE {
2650 SetSecurityDescriptor,
2651 QuerySecurityDescriptor,
2652 DeleteSecurityDescriptor,
2653 AssignSecurityDescriptor
2654 } SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
2655
2656 #define INITIAL_PRIVILEGE_COUNT 3
2657
2658 typedef struct _INITIAL_PRIVILEGE_SET {
2659 ULONG PrivilegeCount;
2660 ULONG Control;
2661 LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT];
2662 } INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
2663
2664 #define SE_MIN_WELL_KNOWN_PRIVILEGE 2
2665 #define SE_CREATE_TOKEN_PRIVILEGE 2
2666 #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3
2667 #define SE_LOCK_MEMORY_PRIVILEGE 4
2668 #define SE_INCREASE_QUOTA_PRIVILEGE 5
2669 #define SE_MACHINE_ACCOUNT_PRIVILEGE 6
2670 #define SE_TCB_PRIVILEGE 7
2671 #define SE_SECURITY_PRIVILEGE 8
2672 #define SE_TAKE_OWNERSHIP_PRIVILEGE 9
2673 #define SE_LOAD_DRIVER_PRIVILEGE 10
2674 #define SE_SYSTEM_PROFILE_PRIVILEGE 11
2675 #define SE_SYSTEMTIME_PRIVILEGE 12
2676 #define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13
2677 #define SE_INC_BASE_PRIORITY_PRIVILEGE 14
2678 #define SE_CREATE_PAGEFILE_PRIVILEGE 15
2679 #define SE_CREATE_PERMANENT_PRIVILEGE 16
2680 #define SE_BACKUP_PRIVILEGE 17
2681 #define SE_RESTORE_PRIVILEGE 18
2682 #define SE_SHUTDOWN_PRIVILEGE 19
2683 #define SE_DEBUG_PRIVILEGE 20
2684 #define SE_AUDIT_PRIVILEGE 21
2685 #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22
2686 #define SE_CHANGE_NOTIFY_PRIVILEGE 23
2687 #define SE_REMOTE_SHUTDOWN_PRIVILEGE 24
2688 #define SE_UNDOCK_PRIVILEGE 25
2689 #define SE_SYNC_AGENT_PRIVILEGE 26
2690 #define SE_ENABLE_DELEGATION_PRIVILEGE 27
2691 #define SE_MANAGE_VOLUME_PRIVILEGE 28
2692 #define SE_IMPERSONATE_PRIVILEGE 29
2693 #define SE_CREATE_GLOBAL_PRIVILEGE 30
2694 #define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE 31
2695 #define SE_RELABEL_PRIVILEGE 32
2696 #define SE_INC_WORKING_SET_PRIVILEGE 33
2697 #define SE_TIME_ZONE_PRIVILEGE 34
2698 #define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE 35
2699 #define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
2700
2701 typedef struct _SECURITY_SUBJECT_CONTEXT {
2702 PACCESS_TOKEN ClientToken;
2703 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
2704 PACCESS_TOKEN PrimaryToken;
2705 PVOID ProcessAuditId;
2706 } SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
2707
2708 typedef struct _ACCESS_STATE {
2709 LUID OperationID;
2710 BOOLEAN SecurityEvaluated;
2711 BOOLEAN GenerateAudit;
2712 BOOLEAN GenerateOnClose;
2713 BOOLEAN PrivilegesAllocated;
2714 ULONG Flags;
2715 ACCESS_MASK RemainingDesiredAccess;
2716 ACCESS_MASK PreviouslyGrantedAccess;
2717 ACCESS_MASK OriginalDesiredAccess;
2718 SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
2719 PSECURITY_DESCRIPTOR SecurityDescriptor;
2720 PVOID AuxData;
2721 union {
2722 INITIAL_PRIVILEGE_SET InitialPrivilegeSet;
2723 PRIVILEGE_SET PrivilegeSet;
2724 } Privileges;
2725
2726 BOOLEAN AuditPrivileges;
2727 UNICODE_STRING ObjectName;
2728 UNICODE_STRING ObjectTypeName;
2729 } ACCESS_STATE, *PACCESS_STATE;
2730
2731
2732 #ifndef _NTLSA_IFS_
2733
2734 #ifndef _NTLSA_AUDIT_
2735 #define _NTLSA_AUDIT_
2736
2737 #define SE_MAX_AUDIT_PARAMETERS 32
2738 #define SE_MAX_GENERIC_AUDIT_PARAMETERS 28
2739
2740 #define SE_ADT_OBJECT_ONLY 0x1
2741
2742 #define SE_ADT_PARAMETERS_SELF_RELATIVE 0x00000001
2743 #define SE_ADT_PARAMETERS_SEND_TO_LSA 0x00000002
2744 #define SE_ADT_PARAMETER_EXTENSIBLE_AUDIT 0x00000004
2745 #define SE_ADT_PARAMETER_GENERIC_AUDIT 0x00000008
2746 #define SE_ADT_PARAMETER_WRITE_SYNCHRONOUS 0x00000010
2747
2748 #define LSAP_SE_ADT_PARAMETER_ARRAY_TRUE_SIZE(Parameters) \
2749 ( sizeof(SE_ADT_PARAMETER_ARRAY) - sizeof(SE_ADT_PARAMETER_ARRAY_ENTRY) * \
2750 (SE_MAX_AUDIT_PARAMETERS - Parameters->ParameterCount) )
2751
2752 typedef enum _SE_ADT_PARAMETER_TYPE {
2753 SeAdtParmTypeNone = 0,
2754 SeAdtParmTypeString,
2755 SeAdtParmTypeFileSpec,
2756 SeAdtParmTypeUlong,
2757 SeAdtParmTypeSid,
2758 SeAdtParmTypeLogonId,
2759 SeAdtParmTypeNoLogonId,
2760 SeAdtParmTypeAccessMask,
2761 SeAdtParmTypePrivs,
2762 SeAdtParmTypeObjectTypes,
2763 SeAdtParmTypeHexUlong,
2764 SeAdtParmTypePtr,
2765 SeAdtParmTypeTime,
2766 SeAdtParmTypeGuid,
2767 SeAdtParmTypeLuid,
2768 SeAdtParmTypeHexInt64,
2769 SeAdtParmTypeStringList,
2770 SeAdtParmTypeSidList,
2771 SeAdtParmTypeDuration,
2772 SeAdtParmTypeUserAccountControl,
2773 SeAdtParmTypeNoUac,
2774 SeAdtParmTypeMessage,
2775 SeAdtParmTypeDateTime,
2776 SeAdtParmTypeSockAddr,
2777 SeAdtParmTypeSD,
2778 SeAdtParmTypeLogonHours,
2779 SeAdtParmTypeLogonIdNoSid,
2780 SeAdtParmTypeUlongNoConv,
2781 SeAdtParmTypeSockAddrNoPort,
2782 SeAdtParmTypeAccessReason
2783 } SE_ADT_PARAMETER_TYPE, *PSE_ADT_PARAMETER_TYPE;
2784
2785 typedef struct _SE_ADT_OBJECT_TYPE {
2786 GUID ObjectType;
2787 USHORT Flags;
2788 USHORT Level;
2789 ACCESS_MASK AccessMask;
2790 } SE_ADT_OBJECT_TYPE, *PSE_ADT_OBJECT_TYPE;
2791
2792 typedef struct _SE_ADT_PARAMETER_ARRAY_ENTRY {
2793 SE_ADT_PARAMETER_TYPE Type;
2794 ULONG Length;
2795 ULONG_PTR Data[2];
2796 PVOID Address;
2797 } SE_ADT_PARAMETER_ARRAY_ENTRY, *PSE_ADT_PARAMETER_ARRAY_ENTRY;
2798
2799 typedef struct _SE_ADT_ACCESS_REASON {
2800 ACCESS_MASK AccessMask;
2801 ULONG AccessReasons[32];
2802 ULONG ObjectTypeIndex;
2803 ULONG AccessGranted;
2804 PSECURITY_DESCRIPTOR SecurityDescriptor;
2805 } SE_ADT_ACCESS_REASON, *PSE_ADT_ACCESS_REASON;
2806
2807 typedef struct _SE_ADT_PARAMETER_ARRAY {
2808 ULONG CategoryId;
2809 ULONG AuditId;
2810 ULONG ParameterCount;
2811 ULONG Length;
2812 USHORT FlatSubCategoryId;
2813 USHORT Type;
2814 ULONG Flags;
2815 SE_ADT_PARAMETER_ARRAY_ENTRY Parameters[ SE_MAX_AUDIT_PARAMETERS ];
2816 } SE_ADT_PARAMETER_ARRAY, *PSE_ADT_PARAMETER_ARRAY;
2817
2818 #endif /* !_NTLSA_AUDIT_ */
2819 #endif /* !_NTLSA_IFS_ */
2820
2821
2822 /******************************************************************************
2823 * Security Manager Functions *
2824 ******************************************************************************/
2825
2826 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2827
2828 NTKERNELAPI
2829 BOOLEAN
2830 NTAPI
2831 SeAccessCheck(
2832 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
2833 IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
2834 IN BOOLEAN SubjectContextLocked,
2835 IN ACCESS_MASK DesiredAccess,
2836 IN ACCESS_MASK PreviouslyGrantedAccess,
2837 OUT PPRIVILEGE_SET *Privileges OPTIONAL,
2838 IN PGENERIC_MAPPING GenericMapping,
2839 IN KPROCESSOR_MODE AccessMode,
2840 OUT PACCESS_MASK GrantedAccess,
2841 OUT PNTSTATUS AccessStatus);
2842
2843 NTKERNELAPI
2844 NTSTATUS
2845 NTAPI
2846 SeAssignSecurity(
2847 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
2848 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
2849 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
2850 IN BOOLEAN IsDirectoryObject,
2851 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
2852 IN PGENERIC_MAPPING GenericMapping,
2853 IN POOL_TYPE PoolType);
2854
2855 NTKERNELAPI
2856 NTSTATUS
2857 NTAPI
2858 SeAssignSecurityEx(
2859 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
2860 IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
2861 OUT PSECURITY_DESCRIPTOR *NewDescriptor,
2862 IN GUID *ObjectType OPTIONAL,
2863 IN BOOLEAN IsDirectoryObject,
2864 IN ULONG AutoInheritFlags,
2865 IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
2866 IN PGENERIC_MAPPING GenericMapping,
2867 IN POOL_TYPE PoolType);
2868
2869 NTKERNELAPI
2870 NTSTATUS
2871 NTAPI
2872 SeDeassignSecurity(
2873 IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor);
2874
2875 NTKERNELAPI
2876 BOOLEAN
2877 NTAPI
2878 SeValidSecurityDescriptor(
2879 IN ULONG Length,
2880 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
2881
2882 NTKERNELAPI
2883 ULONG
2884 NTAPI
2885 SeObjectCreateSaclAccessBits(
2886 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
2887
2888 NTKERNELAPI
2889 VOID
2890 NTAPI
2891 SeReleaseSubjectContext(
2892 IN OUT PSECURITY_SUBJECT_CONTEXT SubjectContext);
2893
2894 NTKERNELAPI
2895 VOID
2896 NTAPI
2897 SeUnlockSubjectContext(
2898 IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
2899
2900 NTKERNELAPI
2901 VOID
2902 NTAPI
2903 SeCaptureSubjectContext(
2904 OUT PSECURITY_SUBJECT_CONTEXT SubjectContext);
2905
2906 NTKERNELAPI
2907 VOID
2908 NTAPI
2909 SeLockSubjectContext(
2910 IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
2911
2912 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
2913
2914 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
2915
2916 NTSTATUS
2917 NTAPI
2918 SeSetAuditParameter(
2919 IN OUT PSE_ADT_PARAMETER_ARRAY AuditParameters,
2920 IN SE_ADT_PARAMETER_TYPE Type,
2921 IN ULONG Index,
2922 IN PVOID Data);
2923
2924 NTSTATUS
2925 NTAPI
2926 SeReportSecurityEvent(
2927 IN ULONG Flags,
2928 IN PUNICODE_STRING SourceName,
2929 IN PSID UserSid OPTIONAL,
2930 IN PSE_ADT_PARAMETER_ARRAY AuditParameters);
2931
2932 #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
2933
2934 #if (NTDDI_VERSION >= NTDDI_VISTA)
2935
2936 NTKERNELAPI
2937 ULONG
2938 NTAPI
2939 SeComputeAutoInheritByObjectType(
2940 IN PVOID ObjectType,
2941 IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
2942 IN PSECURITY_DESCRIPTOR ParentSecurityDescriptor OPTIONAL);
2943
2944 #ifdef SE_NTFS_WORLD_CACHE
2945 VOID
2946 NTAPI
2947 SeGetWorldRights(
2948 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
2949 IN PGENERIC_MAPPING GenericMapping,
2950 OUT PACCESS_MASK GrantedAccess);
2951 #endif /* SE_NTFS_WORLD_CACHE */
2952
2953 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
2954
2955 /******************************************************************************
2956 * Power Management Support Types *
2957 ******************************************************************************/
2958
2959 typedef VOID
2960 (DDKAPI *PREQUEST_POWER_COMPLETE)(
2961 IN struct _DEVICE_OBJECT *DeviceObject,
2962 IN UCHAR MinorFunction,
2963 IN POWER_STATE PowerState,
2964 IN PVOID Context,
2965 IN struct _IO_STATUS_BLOCK *IoStatus);
2966
2967 /******************************************************************************
2968 * Power Management Support Functions *
2969 ******************************************************************************/
2970
2971 #define PoSetDeviceBusy(IdlePointer) ((void)(*(IdlePointer) = 0))
2972
2973 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2974
2975 NTKERNELAPI
2976 NTSTATUS
2977 NTAPI
2978 PoCallDriver(
2979 IN struct _DEVICE_OBJECT *DeviceObject,
2980 IN OUT struct _IRP *Irp);
2981
2982 NTKERNELAPI
2983 PULONG
2984 NTAPI
2985 PoRegisterDeviceForIdleDetection(
2986 IN struct _DEVICE_OBJECT *DeviceObject,
2987 IN ULONG ConservationIdleTime,
2988 IN ULONG PerformanceIdleTime,
2989 IN DEVICE_POWER_STATE State);
2990
2991 NTKERNELAPI
2992 PVOID
2993 NTAPI
2994 PoRegisterSystemState(
2995 IN OUT PVOID StateHandle OPTIONAL,
2996 IN EXECUTION_STATE Flags);
2997
2998 NTKERNELAPI
2999 NTSTATUS
3000 NTAPI
3001 PoRequestPowerIrp(
3002 IN struct _DEVICE_OBJECT *DeviceObject,
3003 IN UCHAR MinorFunction,
3004 IN POWER_STATE PowerState,
3005 IN PREQUEST_POWER_COMPLETE CompletionFunction OPTIONAL,
3006 IN PVOID Context OPTIONAL,
3007 OUT struct _IRP **Irp OPTIONAL);
3008
3009 NTKERNELAPI
3010 POWER_STATE
3011 NTAPI
3012 PoSetPowerState(
3013 IN struct _DEVICE_OBJECT *DeviceObject,
3014 IN POWER_STATE_TYPE Type,
3015 IN POWER_STATE State);
3016
3017 NTKERNELAPI
3018 VOID
3019 NTAPI
3020 PoSetSystemState(
3021 IN EXECUTION_STATE Flags);
3022
3023 NTKERNELAPI
3024 VOID
3025 NTAPI
3026 PoStartNextPowerIrp(
3027 IN OUT struct _IRP *Irp);
3028
3029 NTKERNELAPI
3030 VOID
3031 NTAPI
3032 PoUnregisterSystemState(
3033 IN OUT PVOID StateHandle);
3034
3035 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
3036
3037 #if (NTDDI_VERSION >= NTDDI_VISTA)
3038
3039 NTKERNELAPI
3040 VOID
3041 NTAPI
3042 PoSetSystemWake(
3043 IN OUT PIRP Irp);
3044
3045 NTKERNELAPI
3046 BOOLEAN
3047 NTAPI
3048 PoGetSystemWake(
3049 IN PIRP Irp);
3050
3051 NTKERNELAPI
3052 NTSTATUS
3053 NTAPI
3054 PoRegisterPowerSettingCallback(
3055 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
3056 IN LPCGUID SettingGuid,
3057 IN PPOWER_SETTING_CALLBACK Callback,
3058 IN PVOID Context OPTIONAL,
3059 OUT PVOID *Handle OPTIONAL);
3060
3061 NTKERNELAPI
3062 NTSTATUS
3063 NTAPI
3064 PoUnregisterPowerSettingCallback(
3065 IN OUT PVOID Handle);
3066
3067 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
3068
3069 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
3070
3071 NTKERNELAPI
3072 VOID
3073 NTAPI
3074 PoSetDeviceBusyEx(
3075 IN OUT PULONG IdlePointer);
3076
3077 #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
3078
3079 #if (NTDDI_VERSION >= NTDDI_WIN7)
3080 NTKERNELAPI
3081 VOID
3082 NTAPI
3083 PoStartDeviceBusy(
3084 IN OUT PULONG IdlePointer);
3085
3086 NTKERNELAPI
3087 VOID
3088 NTAPI
3089 PoEndDeviceBusy(
3090 IN OUT PULONG IdlePointer);
3091
3092 NTKERNELAPI
3093 BOOLEAN
3094 NTAPI
3095 PoQueryWatchdogTime(
3096 IN PDEVICE_OBJECT Pdo,
3097 OUT PULONG SecondsRemaining);
3098
3099 NTKERNELAPI
3100 VOID
3101 NTAPI
3102 PoDeletePowerRequest(
3103 IN OUT PVOID PowerRequest);
3104
3105 NTKERNELAPI
3106 NTSTATUS
3107 NTAPI
3108 PoSetPowerRequest(
3109 IN OUT PVOID PowerRequest,
3110 IN POWER_REQUEST_TYPE Type);
3111
3112 NTKERNELAPI
3113 NTSTATUS
3114 NTAPI
3115 PoClearPowerRequest(
3116 IN OUT PVOID PowerRequest,
3117 IN POWER_REQUEST_TYPE Type);
3118
3119 NTKERNELAPI
3120 NTSTATUS
3121 NTAPI
3122 PoCreatePowerRequest(
3123 OUT PVOID *PowerRequest,
3124 IN PDEVICE_OBJECT DeviceObject,
3125 IN PCOUNTED_REASON_CONTEXT Context);
3126
3127 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
3128
3129
3130 /******************************************************************************
3131 * Configuration Manager Types *
3132 ******************************************************************************/
3133
3134 /* Resource list definitions */
3135 typedef int CM_RESOURCE_TYPE;
3136
3137 #define CmResourceTypeNull 0
3138 #define CmResourceTypePort 1
3139 #define CmResourceTypeInterrupt 2
3140 #define CmResourceTypeMemory 3
3141 #define CmResourceTypeDma 4
3142 #define CmResourceTypeDeviceSpecific 5
3143 #define CmResourceTypeBusNumber 6
3144 #define CmResourceTypeNonArbitrated 128
3145 #define CmResourceTypeConfigData 128
3146 #define CmResourceTypeDevicePrivate 129
3147 #define CmResourceTypePcCardConfig 130
3148 #define CmResourceTypeMfCardConfig 131
3149
3150 /* KEY_VALUE_Xxx.Type */
3151 #define REG_NONE 0
3152 #define REG_SZ 1
3153 #define REG_EXPAND_SZ 2
3154 #define REG_BINARY 3
3155 #define REG_DWORD 4
3156 #define REG_DWORD_LITTLE_ENDIAN 4
3157 #define REG_DWORD_BIG_ENDIAN 5
3158 #define REG_LINK 6
3159 #define REG_MULTI_SZ 7
3160 #define REG_RESOURCE_LIST 8
3161 #define REG_FULL_RESOURCE_DESCRIPTOR 9
3162 #define REG_RESOURCE_REQUIREMENTS_LIST 10
3163 #define REG_QWORD 11
3164 #define REG_QWORD_LITTLE_ENDIAN 11
3165
3166 /* Registry Access Rights */
3167 #define KEY_QUERY_VALUE (0x0001)
3168 #define KEY_SET_VALUE (0x0002)
3169 #define KEY_CREATE_SUB_KEY (0x0004)
3170 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
3171 #define KEY_NOTIFY (0x0010)
3172 #define KEY_CREATE_LINK (0x0020)
3173 #define KEY_WOW64_32KEY (0x0200)
3174 #define KEY_WOW64_64KEY (0x0100)
3175 #define KEY_WOW64_RES (0x0300)
3176
3177 #define KEY_READ ((STANDARD_RIGHTS_READ |\
3178 KEY_QUERY_VALUE |\
3179 KEY_ENUMERATE_SUB_KEYS |\
3180 KEY_NOTIFY) \
3181 & \
3182 (~SYNCHRONIZE))
3183
3184 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
3185 KEY_SET_VALUE |\
3186 KEY_CREATE_SUB_KEY) \
3187 & \
3188 (~SYNCHRONIZE))
3189
3190 #define KEY_EXECUTE ((KEY_READ) \
3191 & \
3192 (~SYNCHRONIZE))
3193
3194 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
3195 KEY_QUERY_VALUE |\
3196 KEY_SET_VALUE |\
3197 KEY_CREATE_SUB_KEY |\
3198 KEY_ENUMERATE_SUB_KEYS |\
3199 KEY_NOTIFY |\
3200 KEY_CREATE_LINK) \
3201 & \
3202 (~SYNCHRONIZE))
3203
3204 /* Registry Open/Create Options */
3205 #define REG_OPTION_RESERVED (0x00000000L)
3206 #define REG_OPTION_NON_VOLATILE (0x00000000L)
3207 #define REG_OPTION_VOLATILE (0x00000001L)
3208 #define REG_OPTION_CREATE_LINK (0x00000002L)
3209 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
3210 #define REG_OPTION_OPEN_LINK (0x00000008L)
3211
3212 #define REG_LEGAL_OPTION \
3213 (REG_OPTION_RESERVED |\
3214 REG_OPTION_NON_VOLATILE |\
3215 REG_OPTION_VOLATILE |\
3216 REG_OPTION_CREATE_LINK |\
3217 REG_OPTION_BACKUP_RESTORE |\
3218 REG_OPTION_OPEN_LINK)
3219
3220 /* Key creation/open disposition */
3221 #define REG_CREATED_NEW_KEY (0x00000001L)
3222 #define REG_OPENED_EXISTING_KEY (0x00000002L)
3223
3224 /* Key restore & hive load flags */
3225 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
3226 #define REG_REFRESH_HIVE (0x00000002L)
3227 #define REG_NO_LAZY_FLUSH (0x00000004L)
3228 #define REG_FORCE_RESTORE (0x00000008L)
3229 #define REG_APP_HIVE (0x00000010L)
3230 #define REG_PROCESS_PRIVATE (0x00000020L)
3231 #define REG_START_JOURNAL (0x00000040L)
3232 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
3233 #define REG_HIVE_NO_RM (0x00000100L)
3234 #define REG_HIVE_SINGLE_LOG (0x00000200L)
3235
3236 /* Unload Flags */
3237 #define REG_FORCE_UNLOAD 1
3238
3239 /* Notify Filter Values */
3240 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
3241 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
3242 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
3243 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
3244
3245 #define REG_LEGAL_CHANGE_FILTER \
3246 (REG_NOTIFY_CHANGE_NAME |\
3247 REG_NOTIFY_CHANGE_ATTRIBUTES |\
3248 REG_NOTIFY_CHANGE_LAST_SET |\
3249 REG_NOTIFY_CHANGE_SECURITY)
3250
3251 typedef struct _CM_FLOPPY_DEVICE_DATA {
3252 USHORT Version;
3253 USHORT Revision;
3254 CHAR Size[8];
3255 ULONG MaxDensity;
3256 ULONG MountDensity;
3257 UCHAR StepRateHeadUnloadTime;
3258 UCHAR HeadLoadTime;
3259 UCHAR MotorOffTime;
3260 UCHAR SectorLengthCode;
3261 UCHAR SectorPerTrack;
3262 UCHAR ReadWriteGapLength;
3263 UCHAR DataTransferLength;
3264 UCHAR FormatGapLength;
3265 UCHAR FormatFillCharacter;
3266 UCHAR HeadSettleTime;
3267 UCHAR MotorSettleTime;
3268 UCHAR MaximumTrackValue;
3269 UCHAR DataTransferRate;
3270 } CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA;
3271
3272 #include <pshpack4.h>
3273 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
3274 UCHAR Type;
3275 UCHAR ShareDisposition;
3276 USHORT Flags;
3277 union {
3278 struct {
3279 PHYSICAL_ADDRESS Start;
3280 ULONG Length;
3281 } Generic;
3282 struct {
3283 PHYSICAL_ADDRESS Start;
3284 ULONG Length;
3285 } Port;
3286 struct {
3287 #if defined(NT_PROCESSOR_GROUPS)
3288 USHORT Level;
3289 USHORT Group;
3290 #else
3291 ULONG Level;
3292 #endif
3293 ULONG Vector;
3294 KAFFINITY Affinity;
3295 } Interrupt;
3296 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
3297 struct {
3298 __GNU_EXTENSION union {
3299 struct {
3300 #if defined(NT_PROCESSOR_GROUPS)
3301 USHORT Group;
3302 #else
3303 USHORT Reserved;
3304 #endif
3305 USHORT MessageCount;
3306 ULONG Vector;
3307 KAFFINITY Affinity;
3308 } Raw;
3309 struct {
3310 #if defined(NT_PROCESSOR_GROUPS)
3311 USHORT Level;
3312 USHORT Group;
3313 #else
3314 ULONG Level;
3315 #endif
3316 ULONG Vector;
3317 KAFFINITY Affinity;
3318 } Translated;
3319 } DUMMYUNIONNAME;
3320 } MessageInterrupt;
3321 #endif
3322 struct {
3323 PHYSICAL_ADDRESS Start;
3324 ULONG Length;
3325 } Memory;
3326 struct {
3327 ULONG Channel;
3328 ULONG Port;
3329 ULONG Reserved1;
3330 } Dma;
3331 struct {
3332 ULONG Data[3];
3333 } DevicePrivate;
3334 struct {
3335 ULONG Start;
3336 ULONG Length;
3337 ULONG Reserved;
3338 } BusNumber;
3339 struct {
3340 ULONG DataSize;
3341 ULONG Reserved1;
3342 ULONG Reserved2;
3343 } DeviceSpecificData;
3344 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
3345 struct {
3346 PHYSICAL_ADDRESS Start;
3347 ULONG Length40;
3348 } Memory40;
3349 struct {
3350 PHYSICAL_ADDRESS Start;
3351 ULONG Length48;
3352 } Memory48;
3353 struct {
3354 PHYSICAL_ADDRESS Start;
3355 ULONG Length64;
3356 } Memory64;
3357 #endif
3358 } u;
3359 } CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
3360 #include <poppack.h>
3361
3362 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
3363 #define CmResourceTypeNull 0
3364 #define CmResourceTypePort 1
3365 #define CmResourceTypeInterrupt 2
3366 #define CmResourceTypeMemory 3
3367 #define CmResourceTypeDma 4
3368 #define CmResourceTypeDeviceSpecific 5
3369 #define CmResourceTypeBusNumber 6
3370 #define CmResourceTypeMemoryLarge 7
3371 #define CmResourceTypeNonArbitrated 128
3372 #define CmResourceTypeConfigData 128
3373 #define CmResourceTypeDevicePrivate 129
3374 #define CmResourceTypePcCardConfig 130
3375 #define CmResourceTypeMfCardConfig 131
3376
3377 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
3378 typedef enum _CM_SHARE_DISPOSITION {
3379 CmResourceShareUndetermined,
3380 CmResourceShareDeviceExclusive,
3381 CmResourceShareDriverExclusive,
3382 CmResourceShareShared
3383 } CM_SHARE_DISPOSITION;
3384
3385 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
3386 #define CM_RESOURCE_PORT_MEMORY 0x0000
3387 #define CM_RESOURCE_PORT_IO 0x0001
3388 #define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004
3389 #define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008
3390 #define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010
3391 #define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020
3392 #define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040
3393 #define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080
3394 #define CM_RESOURCE_PORT_BAR 0x0100
3395
3396 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
3397 #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
3398 #define CM_RESOURCE_INTERRUPT_LATCHED 0x0001
3399 #define CM_RESOURCE_INTERRUPT_MESSAGE 0x0002
3400 #define CM_RESOURCE_INTERRUPT_POLICY_INCLUDED 0x0004
3401
3402 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
3403 #define CM_RESOURCE_MEMORY_READ_WRITE 0x0000
3404 #define CM_RESOURCE_MEMORY_READ_ONLY 0x0001
3405 #define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002
3406 #define CM_RESOURCE_MEMORY_WRITEABILITY_MASK 0x0003
3407 #define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004
3408 #define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008
3409 #define CM_RESOURCE_MEMORY_24 0x0010
3410 #define CM_RESOURCE_MEMORY_CACHEABLE 0x0020
3411 #define CM_RESOURCE_MEMORY_WINDOW_DECODE 0x0040
3412 #define CM_RESOURCE_MEMORY_BAR 0x0080
3413 #define CM_RESOURCE_MEMORY_COMPAT_FOR_INACCESSIBLE_RANGE 0x0100
3414
3415 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
3416 #define CM_RESOURCE_DMA_8 0x0000
3417 #define CM_RESOURCE_DMA_16 0x0001
3418 #define CM_RESOURCE_DMA_32 0x0002
3419 #define CM_RESOURCE_DMA_8_AND_16 0x0004
3420 #define CM_RESOURCE_DMA_BUS_MASTER 0x0008
3421 #define CM_RESOURCE_DMA_TYPE_A 0x0010
3422 #define CM_RESOURCE_DMA_TYPE_B 0x0020
3423 #define CM_RESOURCE_DMA_TYPE_F 0x0040
3424
3425 typedef struct _CM_PARTIAL_RESOURCE_LIST {
3426 USHORT Version;
3427 USHORT Revision;
3428 ULONG Count;
3429 CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
3430 } CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
3431
3432 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
3433 INTERFACE_TYPE InterfaceType;
3434 ULONG BusNumber;
3435 CM_PARTIAL_RESOURCE_LIST PartialResourceList;
3436 } CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
3437
3438 typedef struct _CM_RESOURCE_LIST {
3439 ULONG Count;
3440 CM_FULL_RESOURCE_DESCRIPTOR List[1];
3441 } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
3442
3443 #include <pshpack1.h>
3444 typedef struct _CM_INT13_DRIVE_PARAMETER {
3445 USHORT DriveSelect;
3446 ULONG MaxCylinders;
3447 USHORT SectorsPerTrack;
3448 USHORT MaxHeads;
3449 USHORT NumberDrives;
3450 } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
3451
3452 typedef struct _CM_PNP_BIOS_DEVICE_NODE {
3453 USHORT Size;
3454 UCHAR Node;
3455 ULONG ProductId;
3456 UCHAR DeviceType[3];
3457 USHORT DeviceAttributes;
3458 } CM_PNP_BIOS_DEVICE_NODE,*PCM_PNP_BIOS_DEVICE_NODE;
3459
3460 typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK {
3461 UCHAR Signature[4];
3462 UCHAR Revision;
3463 UCHAR Length;
3464 USHORT ControlField;
3465 UCHAR Checksum;
3466 ULONG EventFlagAddress;
3467 USHORT RealModeEntryOffset;
3468 USHORT RealModeEntrySegment;
3469 USHORT ProtectedModeEntryOffset;
3470 ULONG ProtectedModeCodeBaseAddress;
3471 ULONG OemDeviceId;
3472 USHORT RealModeDataBaseAddress;
3473 ULONG ProtectedModeDataBaseAddress;
3474 } CM_PNP_BIOS_INSTALLATION_CHECK, *PCM_PNP_BIOS_INSTALLATION_CHECK;
3475 #include <poppack.h>
3476
3477 typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA {
3478 ULONG BytesPerSector;
3479 ULONG NumberOfCylinders;
3480 ULONG SectorsPerTrack;
3481 ULONG NumberOfHeads;
3482 } CM_DISK_GEOMETRY_DEVICE_DATA, *PCM_DISK_GEOMETRY_DEVICE_DATA;
3483
3484 typedef struct _CM_KEYBOARD_DEVICE_DATA {
3485 USHORT Version;
3486 USHORT Revision;
3487 UCHAR Type;
3488 UCHAR Subtype;
3489 USHORT KeyboardFlags;
3490 } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
3491
3492 typedef struct _CM_MCA_POS_DATA {
3493 USHORT AdapterId;
3494 UCHAR PosData1;
3495 UCHAR PosData2;
3496 UCHAR PosData3;
3497 UCHAR PosData4;
3498 } CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
3499
3500 #if (NTDDI_VERSION >= NTDDI_WINXP)
3501 typedef struct CM_Power_Data_s {
3502 ULONG PD_Size;
3503 DEVICE_POWER_STATE PD_MostRecentPowerState;
3504 ULONG PD_Capabilities;
3505 ULONG PD_D1Latency;
3506 ULONG PD_D2Latency;
3507 ULONG PD_D3Latency;
3508 DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum];
3509 SYSTEM_POWER_STATE PD_DeepestSystemWake;
3510 } CM_POWER_DATA, *PCM_POWER_DATA;
3511
3512 #define PDCAP_D0_SUPPORTED 0x00000001
3513 #define PDCAP_D1_SUPPORTED 0x00000002
3514 #define PDCAP_D2_SUPPORTED 0x00000004
3515 #define PDCAP_D3_SUPPORTED 0x00000008
3516 #define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010
3517 #define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020
3518 #define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040
3519 #define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080
3520 #define PDCAP_WARM_EJECT_SUPPORTED 0x00000100
3521
3522 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
3523
3524 typedef struct _CM_SCSI_DEVICE_DATA {
3525 USHORT Version;
3526 USHORT Revision;
3527 UCHAR HostIdentifier;
3528 } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
3529
3530 typedef struct _CM_SERIAL_DEVICE_DATA {
3531 USHORT Version;
3532 USHORT Revision;
3533 ULONG BaudClock;
3534 } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
3535
3536 typedef enum _KEY_INFORMATION_CLASS {
3537 KeyBasicInformation,
3538 KeyNodeInformation,
3539 KeyFullInformation,
3540 KeyNameInformation,
3541 KeyCachedInformation,
3542 KeyFlagsInformation
3543 } KEY_INFORMATION_CLASS;
3544
3545 typedef struct _KEY_BASIC_INFORMATION {
3546 LARGE_INTEGER LastWriteTime;
3547 ULONG TitleIndex;
3548 ULONG NameLength;
3549 WCHAR Name[1];
3550 } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
3551
3552 typedef struct _KEY_FULL_INFORMATION {
3553 LARGE_INTEGER LastWriteTime;
3554 ULONG TitleIndex;
3555 ULONG ClassOffset;
3556 ULONG ClassLength;
3557 ULONG SubKeys;
3558 ULONG MaxNameLen;
3559 ULONG MaxClassLen;
3560 ULONG Values;
3561 ULONG MaxValueNameLen;
3562 ULONG MaxValueDataLen;
3563 WCHAR Class[1];
3564 } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
3565
3566 typedef struct _KEY_NODE_INFORMATION {
3567 LARGE_INTEGER LastWriteTime;
3568 ULONG TitleIndex;
3569 ULONG ClassOffset;
3570 ULONG ClassLength;
3571 ULONG NameLength;
3572 WCHAR Name[1];
3573 } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
3574
3575 typedef struct _KEY_VALUE_BASIC_INFORMATION {
3576 ULONG TitleIndex;
3577 ULONG Type;
3578 ULONG NameLength;
3579 WCHAR Name[1];
3580 } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
3581
3582 typedef struct _KEY_VALUE_FULL_INFORMATION {
3583 ULONG TitleIndex;
3584 ULONG Type;
3585 ULONG DataOffset;
3586 ULONG DataLength;
3587 ULONG NameLength;
3588 WCHAR Name[1];
3589 } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
3590
3591 typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
3592 ULONG TitleIndex;
3593 ULONG Type;
3594 ULONG DataLength;
3595 UCHAR Data[1];
3596 } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
3597
3598 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
3599 ULONG Type;
3600 ULONG DataLength;
3601 UCHAR Data[1];
3602 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
3603
3604 typedef struct _KEY_VALUE_ENTRY {
3605 PUNICODE_STRING ValueName;
3606 ULONG DataLength;
3607 ULONG DataOffset;
3608 ULONG Type;
3609 } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
3610
3611 typedef enum _KEY_VALUE_INFORMATION_CLASS {
3612 KeyValueBasicInformation,
3613 KeyValueFullInformation,
3614 KeyValuePartialInformation,
3615 KeyValueFullInformationAlign64,
3616 KeyValuePartialInformationAlign64
3617 } KEY_VALUE_INFORMATION_CLASS;
3618
3619 typedef struct _KEY_WRITE_TIME_INFORMATION {
3620 LARGE_INTEGER LastWriteTime;
3621 } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;
3622
3623 typedef enum _KEY_SET_INFORMATION_CLASS {
3624 KeyWriteTimeInformation,
3625 KeyWow64FlagsInformation,
3626 KeyControlFlagsInformation,
3627 KeySetVirtualizationInformation,
3628 KeySetDebugInformation,
3629 KeySetHandleTagsInformation,
3630 MaxKeySetInfoClass
3631 } KEY_SET_INFORMATION_CLASS;
3632
3633 typedef enum _REG_NOTIFY_CLASS {
3634 RegNtDeleteKey,
3635 RegNtPreDeleteKey = RegNtDeleteKey,
3636 RegNtSetValueKey,
3637 RegNtPreSetValueKey = RegNtSetValueKey,
3638 RegNtDeleteValueKey,
3639 RegNtPreDeleteValueKey = RegNtDeleteValueKey,
3640 RegNtSetInformationKey,
3641 RegNtPreSetInformationKey = RegNtSetInformationKey,
3642 RegNtRenameKey,
3643 RegNtPreRenameKey = RegNtRenameKey,
3644 RegNtEnumerateKey,
3645 RegNtPreEnumerateKey = RegNtEnumerateKey,
3646 RegNtEnumerateValueKey,
3647 RegNtPreEnumerateValueKey = RegNtEnumerateValueKey,
3648 RegNtQueryKey,
3649 RegNtPreQueryKey = RegNtQueryKey,
3650 RegNtQueryValueKey,
3651 RegNtPreQueryValueKey = RegNtQueryValueKey,
3652 RegNtQueryMultipleValueKey,
3653 RegNtPreQueryMultipleValueKey = RegNtQueryMultipleValueKey,
3654 RegNtPreCreateKey,
3655 RegNtPostCreateKey,
3656 RegNtPreOpenKey,
3657 RegNtPostOpenKey,
3658 RegNtKeyHandleClose,
3659 RegNtPreKeyHandleClose = RegNtKeyHandleClose,
3660 RegNtPostDeleteKey,
3661 RegNtPostSetValueKey,
3662 RegNtPostDeleteValueKey,
3663 RegNtPostSetInformationKey,
3664 RegNtPostRenameKey,
3665 RegNtPostEnumerateKey,
3666 RegNtPostEnumerateValueKey,
3667 RegNtPostQueryKey,
3668 RegNtPostQueryValueKey,
3669 RegNtPostQueryMultipleValueKey,
3670 RegNtPostKeyHandleClose,
3671 RegNtPreCreateKeyEx,
3672 RegNtPostCreateKeyEx,
3673 RegNtPreOpenKeyEx,
3674 RegNtPostOpenKeyEx,
3675 RegNtPreFlushKey,
3676 RegNtPostFlushKey,
3677 RegNtPreLoadKey,
3678 RegNtPostLoadKey,
3679 RegNtPreUnLoadKey,
3680 RegNtPostUnLoadKey,
3681 RegNtPreQueryKeySecurity,
3682 RegNtPostQueryKeySecurity,
3683 RegNtPreSetKeySecurity,
3684 RegNtPostSetKeySecurity,
3685 RegNtCallbackObjectContextCleanup,
3686 RegNtPreRestoreKey,
3687 RegNtPostRestoreKey,
3688 RegNtPreSaveKey,
3689 RegNtPostSaveKey,
3690 RegNtPreReplaceKey,
3691 RegNtPostReplaceKey,
3692 MaxRegNtNotifyClass
3693 } REG_NOTIFY_CLASS, *PREG_NOTIFY_CLASS;
3694
3695 typedef NTSTATUS
3696 (NTAPI *PEX_CALLBACK_FUNCTION)(
3697 IN PVOID CallbackContext,
3698 IN PVOID Argument1,
3699 IN PVOID Argument2
3700 );
3701
3702 typedef struct _REG_DELETE_KEY_INFORMATION {
3703 PVOID Object;
3704 PVOID CallContext;
3705 PVOID ObjectContext;
3706 PVOID Reserved;
3707 } REG_DELETE_KEY_INFORMATION, *PREG_DELETE_KEY_INFORMATION
3708 #if (NTDDI_VERSION >= NTDDI_VISTA)
3709 , REG_FLUSH_KEY_INFORMATION, *PREG_FLUSH_KEY_INFORMATION
3710 #endif
3711 ;
3712
3713 typedef struct _REG_SET_VALUE_KEY_INFORMATION {
3714 PVOID Object;
3715 PUNICODE_STRING ValueName;
3716 ULONG TitleIndex;
3717 ULONG Type;
3718 PVOID Data;
3719 ULONG DataSize;
3720 PVOID CallContext;
3721 PVOID ObjectContext;
3722 PVOID Reserved;
3723 } REG_SET_VALUE_KEY_INFORMATION, *PREG_SET_VALUE_KEY_INFORMATION;
3724
3725 typedef struct _REG_DELETE_VALUE_KEY_INFORMATION {
3726 PVOID Object;
3727 PUNICODE_STRING ValueName;
3728 PVOID CallContext;
3729 PVOID ObjectContext;
3730 PVOID Reserved;
3731 } REG_DELETE_VALUE_KEY_INFORMATION, *PREG_DELETE_VALUE_KEY_INFORMATION;
3732
3733 typedef struct _REG_SET_INFORMATION_KEY_INFORMATION {
3734 PVOID Object;
3735 KEY_SET_INFORMATION_CLASS KeySetInformationClass;
3736 PVOID KeySetInformation;
3737 ULONG KeySetInformationLength;
3738 PVOID CallContext;
3739 PVOID ObjectContext;
3740 PVOID Reserved;
3741 } REG_SET_INFORMATION_KEY_INFORMATION, *PREG_SET_INFORMATION_KEY_INFORMATION;
3742
3743 typedef struct _REG_ENUMERATE_KEY_INFORMATION {
3744 PVOID Object;
3745 ULONG Index;
3746 KEY_INFORMATION_CLASS KeyInformationClass;
3747 PVOID KeyInformation;
3748 ULONG Length;
3749 PULONG ResultLength;
3750 PVOID CallContext;
3751 PVOID ObjectContext;
3752 PVOID Reserved;
3753 } REG_ENUMERATE_KEY_INFORMATION, *PREG_ENUMERATE_KEY_INFORMATION;
3754
3755 typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION {
3756 PVOID Object;
3757 ULONG Index;
3758 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
3759 PVOID KeyValueInformation;
3760 ULONG Length;
3761 PULONG ResultLength;
3762 PVOID CallContext;
3763 PVOID ObjectContext;
3764 PVOID Reserved;
3765 } REG_ENUMERATE_VALUE_KEY_INFORMATION, *PREG_ENUMERATE_VALUE_KEY_INFORMATION;
3766
3767 typedef struct _REG_QUERY_KEY_INFORMATION {
3768 PVOID Object;
3769 KEY_INFORMATION_CLASS KeyInformationClass;
3770 PVOID KeyInformation;
3771 ULONG Length;
3772 PULONG ResultLength;
3773 PVOID CallContext;
3774 PVOID ObjectContext;
3775 PVOID Reserved;
3776 } REG_QUERY_KEY_INFORMATION, *PREG_QUERY_KEY_INFORMATION;
3777
3778 typedef struct _REG_QUERY_VALUE_KEY_INFORMATION {
3779 PVOID Object;
3780 PUNICODE_STRING ValueName;
3781 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
3782 PVOID KeyValueInformation;
3783 ULONG Length;
3784 PULONG ResultLength;
3785 PVOID CallContext;
3786 PVOID ObjectContext;
3787 PVOID Reserved;
3788 } REG_QUERY_VALUE_KEY_INFORMATION, *PREG_QUERY_VALUE_KEY_INFORMATION;
3789
3790 typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION {
3791 PVOID Object;
3792 PKEY_VALUE_ENTRY ValueEntries;
3793 ULONG EntryCount;
3794 PVOID ValueBuffer;
3795 PULONG BufferLength;
3796 PULONG RequiredBufferLength;
3797 PVOID CallContext;
3798 PVOID ObjectContext;
3799 PVOID Reserved;
3800 } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION;
3801
3802 typedef struct _REG_PRE_CREATE_KEY_INFORMATION {
3803 PUNICODE_STRING CompleteName;
3804 } REG_PRE_CREATE_KEY_INFORMATION, REG_PRE_OPEN_KEY_INFORMATION,*PREG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;;
3805
3806 typedef struct _REG_POST_CREATE_KEY_INFORMATION {
3807 PUNICODE_STRING CompleteName;
3808 PVOID Object;
3809 NTSTATUS Status;
3810 } REG_POST_CREATE_KEY_INFORMATION,REG_POST_OPEN_KEY_INFORMATION, *PREG_POST_CREATE_KEY_INFORMATION, *PREG_POST_OPEN_KEY_INFORMATION;
3811
3812 typedef struct _REG_POST_OPERATION_INFORMATION {
3813 PVOID Object;
3814 NTSTATUS Status;
3815 PVOID PreInformation;
3816 NTSTATUS ReturnStatus;
3817 PVOID CallContext;
3818 PVOID ObjectContext;
3819 PVOID Reserved;
3820 } REG_POST_OPERATION_INFORMATION,*PREG_POST_OPERATION_INFORMATION;
3821
3822 typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION {
3823 PVOID Object;
3824 PVOID CallContext;
3825 PVOID ObjectContext;
3826 PVOID Reserved;
3827 } REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION;
3828
3829
3830 /******************************************************************************
3831 * Configuration Manager Functions *
3832 ******************************************************************************/
3833
3834 #if (NTDDI_VERSION >= NTDDI_WINXP)
3835 NTKERNELAPI
3836 NTSTATUS
3837 NTAPI
3838 CmRegisterCallback(
3839 IN PEX_CALLBACK_FUNCTION Function,
3840 IN PVOID Context OPTIONAL,
3841 OUT PLARGE_INTEGER Cookie);
3842
3843 NTKERNELAPI
3844 NTSTATUS
3845 NTAPI
3846 CmUnRegisterCallback(
3847 IN LARGE_INTEGER Cookie);
3848 #endif
3849
3850
3851 /******************************************************************************
3852 * RTL Types *
3853 ******************************************************************************/
3854
3855 #define RTL_REGISTRY_ABSOLUTE 0
3856 #define RTL_REGISTRY_SERVICES 1
3857 #define RTL_REGISTRY_CONTROL 2
3858 #define RTL_REGISTRY_WINDOWS_NT 3
3859 #define RTL_REGISTRY_DEVICEMAP 4
3860 #define RTL_REGISTRY_USER 5
3861 #define RTL_REGISTRY_MAXIMUM 6
3862 #define RTL_REGISTRY_HANDLE 0x40000000
3863 #define RTL_REGISTRY_OPTIONAL 0x80000000
3864
3865 /* RTL_QUERY_REGISTRY_TABLE.Flags */
3866 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
3867 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
3868 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
3869 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
3870 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
3871 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
3872 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
3873
3874 #define HASH_STRING_ALGORITHM_DEFAULT 0
3875 #define HASH_STRING_ALGORITHM_X65599 1
3876 #define HASH_STRING_ALGORITHM_INVALID 0xffffffff
3877
3878 typedef struct _RTL_BITMAP {
3879 ULONG SizeOfBitMap;
3880 PULONG Buffer;
3881 } RTL_BITMAP, *PRTL_BITMAP;
3882
3883 typedef struct _RTL_BITMAP_RUN {
3884 ULONG StartingIndex;
3885 ULONG NumberOfBits;
3886 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
3887
3888 typedef NTSTATUS
3889 (DDKAPI *PRTL_QUERY_REGISTRY_ROUTINE)(
3890 IN PWSTR ValueName,
3891 IN ULONG ValueType,
3892 IN PVOID ValueData,
3893 IN ULONG ValueLength,
3894 IN PVOID Context,
3895 IN PVOID EntryContext);
3896
3897 typedef struct _RTL_QUERY_REGISTRY_TABLE {
3898 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
3899 ULONG Flags;
3900 PCWSTR Name;
3901 PVOID EntryContext;
3902 ULONG DefaultType;
3903 PVOID DefaultData;
3904 ULONG DefaultLength;
3905 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
3906
3907 typedef struct _TIME_FIELDS {
3908 CSHORT Year;
3909 CSHORT Month;
3910 CSHORT Day;
3911 CSHORT Hour;
3912 CSHORT Minute;
3913 CSHORT Second;
3914 CSHORT Milliseconds;
3915 CSHORT Weekday;
3916 } TIME_FIELDS, *PTIME_FIELDS;
3917
3918 /* Slist Header */
3919 #ifndef _SLIST_HEADER_
3920 #define _SLIST_HEADER_
3921
3922 #if defined(_WIN64)
3923 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY *PSLIST_ENTRY;
3924 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY {
3925 PSLIST_ENTRY Next;
3926 } SLIST_ENTRY;
3927 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
3928 struct {
3929 ULONGLONG Alignment;
3930 ULONGLONG Region;
3931 } DUMMYSTRUCTNAME;
3932 struct {
3933 ULONGLONG Depth:16;
3934 ULONGLONG Sequence:9;
3935 ULONGLONG NextEntry:39;
3936 ULONGLONG HeaderType:1;
3937 ULONGLONG Init:1;
3938 ULONGLONG Reserved:59;
3939 ULONGLONG Region:3;
3940 } Header8;
3941 struct {
3942 ULONGLONG Depth:16;
3943 ULONGLONG Sequence:48;
3944 ULONGLONG HeaderType:1;
3945 ULONGLONG Init:1;
3946 ULONGLONG Reserved:2;
3947 ULONGLONG NextEntry:60;
3948 } Header16;
3949 } SLIST_HEADER, *PSLIST_HEADER;
3950 #else
3951 #define SLIST_ENTRY SINGLE_LIST_ENTRY
3952 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
3953 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
3954 typedef union _SLIST_HEADER {
3955 ULONGLONG Alignment;
3956 struct {
3957 SLIST_ENTRY Next;
3958 USHORT Depth;
3959 USHORT Sequence;
3960 } DUMMYSTRUCTNAME;
3961 } SLIST_HEADER, *PSLIST_HEADER;
3962 #endif
3963
3964 #endif /* _SLIST_HEADER_ */
3965
3966
3967 /******************************************************************************
3968 * RTL Functions *
3969 ******************************************************************************/
3970
3971 FORCEINLINE
3972 VOID
3973 InitializeListHead(
3974 OUT PLIST_ENTRY ListHead)
3975 {
3976 ListHead->Flink = ListHead->Blink = ListHead;
3977 }
3978
3979 FORCEINLINE
3980 VOID
3981 InsertHeadList(
3982 IN OUT PLIST_ENTRY ListHead,
3983 IN OUT PLIST_ENTRY Entry)
3984 {
3985 PLIST_ENTRY OldFlink;
3986 OldFlink = ListHead->Flink;
3987 Entry->Flink = OldFlink;
3988 Entry->Blink = ListHead;
3989 OldFlink->Blink = Entry;
3990 ListHead->Flink = Entry;
3991 }
3992
3993 FORCEINLINE
3994 VOID
3995 InsertTailList(
3996 IN OUT PLIST_ENTRY ListHead,
3997 IN OUT PLIST_ENTRY Entry)
3998 {
3999 PLIST_ENTRY OldBlink;
4000 OldBlink = ListHead->Blink;
4001 Entry->Flink = ListHead;
4002 Entry->Blink = OldBlink;
4003 OldBlink->Flink = Entry;
4004 ListHead->Blink = Entry;
4005 }
4006
4007 BOOLEAN
4008 FORCEINLINE
4009 IsListEmpty(
4010 IN CONST LIST_ENTRY * ListHead)
4011 {
4012 return (BOOLEAN)(ListHead->Flink == ListHead);
4013 }
4014
4015 FORCEINLINE
4016 PSINGLE_LIST_ENTRY
4017 PopEntryList(
4018 IN OUT PSINGLE_LIST_ENTRY ListHead)
4019 {
4020 PSINGLE_LIST_ENTRY FirstEntry;
4021 FirstEntry = ListHead->Next;
4022 if (FirstEntry != NULL) {
4023 ListHead->Next = FirstEntry->Next;
4024 }
4025 return FirstEntry;
4026 }
4027
4028 FORCEINLINE
4029 VOID
4030 PushEntryList(
4031 IN OUT PSINGLE_LIST_ENTRY ListHead,
4032 IN OUT PSINGLE_LIST_ENTRY Entry)
4033 {
4034 Entry->Next = ListHead->Next;
4035 ListHead->Next = Entry;
4036 }
4037
4038 FORCEINLINE
4039 BOOLEAN
4040 RemoveEntryList(
4041 IN PLIST_ENTRY Entry)
4042 {
4043 PLIST_ENTRY OldFlink;
4044 PLIST_ENTRY OldBlink;
4045
4046 OldFlink = Entry->Flink;
4047 OldBlink = Entry->Blink;
4048 OldFlink->Blink = OldBlink;
4049 OldBlink->Flink = OldFlink;
4050 return (BOOLEAN)(OldFlink == OldBlink);
4051 }
4052
4053 FORCEINLINE
4054 PLIST_ENTRY
4055 RemoveHeadList(
4056 IN OUT PLIST_ENTRY ListHead)
4057 {
4058 PLIST_ENTRY Flink;
4059 PLIST_ENTRY Entry;
4060
4061 Entry = ListHead->Flink;
4062 Flink = Entry->Flink;
4063 ListHead->Flink = Flink;
4064 Flink->Blink = ListHead;
4065 return Entry;
4066 }
4067
4068 FORCEINLINE
4069 PLIST_ENTRY
4070 RemoveTailList(
4071 IN OUT PLIST_ENTRY ListHead)
4072 {
4073 PLIST_ENTRY Blink;
4074 PLIST_ENTRY Entry;
4075
4076 Entry = ListHead->Blink;
4077 Blink = Entry->Blink;
4078 ListHead->Blink = Blink;
4079 Blink->Flink = ListHead;
4080 return Entry;
4081 }
4082
4083 NTSYSAPI
4084 VOID
4085 NTAPI
4086 RtlAssert(
4087 IN PVOID FailedAssertion,
4088 IN PVOID FileName,
4089 IN ULONG LineNumber,
4090 IN PSTR Message);
4091
4092 /* VOID
4093 * RtlCopyMemory(
4094 * IN VOID UNALIGNED *Destination,
4095 * IN CONST VOID UNALIGNED *Source,
4096 * IN SIZE_T Length)
4097 */
4098 #define RtlCopyMemory(Destination, Source, Length) \
4099 memcpy(Destination, Source, Length)
4100
4101 #define RtlCopyBytes RtlCopyMemory
4102
4103 #if defined(_M_AMD64)
4104 NTSYSAPI
4105 VOID
4106 NTAPI
4107 RtlCopyMemoryNonTemporal(
4108 VOID UNALIGNED *Destination,
4109 CONST VOID UNALIGNED *Source,
4110 SIZE_T Length);
4111 #else
4112 #define RtlCopyMemoryNonTemporal RtlCopyMemory
4113 #endif
4114
4115 /* BOOLEAN
4116 * RtlEqualLuid(
4117 * IN PLUID Luid1,
4118 * IN PLUID Luid2)
4119 */
4120 #define RtlEqualLuid(Luid1, Luid2) \
4121 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
4122
4123 /* ULONG
4124 * RtlEqualMemory(
4125 * IN VOID UNALIGNED *Destination,
4126 * IN CONST VOID UNALIGNED *Source,
4127 * IN SIZE_T Length)
4128 */
4129 #define RtlEqualMemory(Destination, Source, Length) \
4130 (!memcmp(Destination, Source, Length))
4131
4132 /* VOID
4133 * RtlFillMemory(
4134 * IN VOID UNALIGNED *Destination,
4135 * IN SIZE_T Length,
4136 * IN UCHAR Fill)
4137 */
4138 #define RtlFillMemory(Destination, Length, Fill) \
4139 memset(Destination, Fill, Length)
4140
4141 #define RtlFillBytes RtlFillMemory
4142
4143 NTSYSAPI
4144 VOID
4145 NTAPI
4146 RtlFreeUnicodeString(
4147 IN OUT PUNICODE_STRING UnicodeString);
4148
4149 NTSYSAPI
4150 NTSTATUS
4151 NTAPI
4152 RtlGUIDFromString(
4153 IN PUNICODE_STRING GuidString,
4154 OUT GUID *Guid);
4155
4156 NTSYSAPI
4157 VOID
4158 NTAPI
4159 RtlInitUnicodeString(
4160 IN OUT PUNICODE_STRING DestinationString,
4161 IN PCWSTR SourceString OPTIONAL);
4162
4163 /* VOID
4164 * RtlMoveMemory(
4165 * IN VOID UNALIGNED *Destination,
4166 * IN CONST VOID UNALIGNED *Source,
4167 * IN SIZE_T Length)
4168 */
4169 #define RtlMoveMemory(Destination, Source, Length) \
4170 memmove(Destination, Source, Length)
4171
4172 NTSYSAPI
4173 NTSTATUS
4174 NTAPI
4175 RtlStringFromGUID(
4176 IN REFGUID Guid,
4177 OUT PUNICODE_STRING GuidString);
4178
4179 /* VOID
4180 * RtlZeroMemory(
4181 * IN VOID UNALIGNED *Destination,
4182 * IN SIZE_T Length)
4183 */
4184 #define RtlZeroMemory(Destination, Length) \
4185 memset(Destination, 0, Length)
4186
4187 #define RtlZeroBytes RtlZeroMemory
4188
4189
4190 #if (NTDDI_VERSION >= NTDDI_WIN2K)
4191 NTSYSAPI
4192 BOOLEAN
4193 NTAPI
4194 RtlAreBitsClear(
4195 IN PRTL_BITMAP BitMapHeader,
4196 IN ULONG StartingIndex,
4197 IN ULONG Length);
4198
4199 NTSYSAPI
4200 BOOLEAN
4201 NTAPI
4202 RtlAreBitsSet(
4203 IN PRTL_BITMAP BitMapHeader,
4204 IN ULONG StartingIndex,
4205 IN ULONG Length);
4206
4207 NTSYSAPI
4208 NTSTATUS
4209 NTAPI
4210 RtlAnsiStringToUnicodeString(
4211 IN OUT PUNICODE_STRING DestinationString,
4212 IN PANSI_STRING SourceString,
4213 IN BOOLEAN AllocateDestinationString);
4214
4215 NTSYSAPI
4216 ULONG
4217 NTAPI
4218 RtlxAnsiStringToUnicodeSize(
4219 IN PCANSI_STRING AnsiString);
4220
4221 #define RtlAnsiStringToUnicodeSize(String) ( \
4222 NLS_MB_CODE_PAGE_TAG ? \
4223 RtlxAnsiStringToUnicodeSize(String) : \
4224 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
4225 )
4226
4227 NTSYSAPI
4228 NTSTATUS
4229 NTAPI
4230 RtlAppendUnicodeStringToString(
4231 IN OUT PUNICODE_STRING Destination,
4232 IN PCUNICODE_STRING Source);
4233
4234 NTSYSAPI
4235 NTSTATUS
4236 NTAPI
4237 RtlAppendUnicodeToString(
4238 IN OUT PUNICODE_STRING Destination,
4239 IN PCWSTR Source);
4240
4241 NTSYSAPI
4242 NTSTATUS
4243 NTAPI
4244 RtlCheckRegistryKey(
4245 IN ULONG RelativeTo,
4246 IN PWSTR Path);
4247
4248 NTSYSAPI
4249 VOID
4250 NTAPI
4251 RtlClearAllBits(
4252 IN PRTL_BITMAP BitMapHeader);
4253
4254 NTSYSAPI
4255 VOID
4256 NTAPI
4257 RtlClearBits(
4258 IN PRTL_BITMAP BitMapHeader,
4259 IN ULONG StartingIndex,
4260 IN ULONG NumberToClear);
4261
4262 NTSYSAPI
4263 SIZE_T
4264 NTAPI
4265 RtlCompareMemory(
4266 IN CONST VOID *Source1,
4267 IN CONST VOID *Source2,
4268 IN SIZE_T Length);
4269
4270 NTSYSAPI
4271 LONG
4272 NTAPI
4273 RtlCompareUnicodeString(
4274 IN PCUNICODE_STRING String1,
4275 IN PCUNICODE_STRING String2,
4276 IN BOOLEAN CaseInSensitive);
4277
4278 NTSYSAPI
4279 LONG
4280 NTAPI
4281 RtlCompareUnicodeStrings(
4282 IN PCWCH String1,
4283 IN SIZE_T String1Length,
4284 IN PCWCH String2,
4285 IN SIZE_T String2Length,
4286 IN BOOLEAN CaseInSensitive);
4287
4288 NTSYSAPI
4289 VOID
4290 NTAPI
4291 RtlCopyUnicodeString(
4292 IN OUT PUNICODE_STRING DestinationString,
4293 IN PCUNICODE_STRING SourceString);
4294
4295 NTSYSAPI
4296 NTSTATUS
4297 NTAPI
4298 RtlCreateRegistryKey(
4299 IN ULONG RelativeTo,
4300 IN PWSTR Path);
4301
4302 NTSYSAPI
4303 NTSTATUS
4304 NTAPI
4305 RtlCreateSecurityDescriptor(
4306 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
4307 IN ULONG Revision);
4308
4309 NTSYSAPI
4310 NTSTATUS
4311 NTAPI
4312 RtlDeleteRegistryValue(
4313 IN ULONG RelativeTo,
4314 IN PCWSTR Path,
4315 IN PCWSTR ValueName);
4316
4317 NTSYSAPI
4318 BOOLEAN
4319 NTAPI
4320 RtlEqualUnicodeString(
4321 IN CONST UNICODE_STRING *String1,
4322 IN CONST UNICODE_STRING *String2,
4323 IN BOOLEAN CaseInSensitive);
4324
4325 #if !defined(_AMD64_) && !defined(_IA64_)
4326 NTSYSAPI
4327 LARGE_INTEGER
4328 NTAPI
4329 RtlExtendedIntegerMultiply(
4330 IN LARGE_INTEGER Multiplicand,
4331 IN LONG Multiplier);
4332
4333 NTSYSAPI
4334 LARGE_INTEGER
4335 NTAPI
4336 RtlExtendedLargeIntegerDivide(
4337 IN LARGE_INTEGER Dividend,
4338 IN ULONG Divisor,
4339 IN OUT PULONG Remainder);
4340 #endif
4341
4342 #if defined(_X86_) || defined(_IA64_)
4343 NTSYSAPI
4344 LARGE_INTEGER
4345 NTAPI
4346 RtlExtendedMagicDivide(
4347 IN LARGE_INTEGER Dividend,
4348 IN LARGE_INTEGER MagicDivisor,
4349 IN CCHAR ShiftCount);
4350 #endif
4351
4352 NTSYSAPI
4353 VOID
4354 NTAPI
4355 RtlFreeAnsiString(
4356 IN PANSI_STRING AnsiString);
4357
4358 NTSYSAPI
4359 ULONG
4360 NTAPI
4361 RtlFindClearBits(
4362 IN PRTL_BITMAP BitMapHeader,
4363 IN ULONG NumberToFind,
4364 IN ULONG HintIndex);
4365
4366 NTSYSAPI
4367 ULONG
4368 NTAPI
4369 RtlFindClearBitsAndSet(
4370 IN PRTL_BITMAP BitMapHeader,
4371 IN ULONG NumberToFind,
4372 IN ULONG HintIndex);
4373
4374 NTSYSAPI
4375 ULONG
4376 NTAPI
4377 RtlFindFirstRunClear(
4378 IN PRTL_BITMAP BitMapHeader,
4379 OUT PULONG StartingIndex);
4380
4381 NTSYSAPI
4382 ULONG
4383 NTAPI
4384 RtlFindClearRuns(
4385 IN PRTL_BITMAP BitMapHeader,
4386 OUT PRTL_BITMAP_RUN RunArray,
4387 IN ULONG SizeOfRunArray,
4388 IN BOOLEAN LocateLongestRuns);
4389
4390 NTSYSAPI
4391 ULONG
4392 NTAPI
4393 RtlFindLastBackwardRunClear(
4394 IN PRTL_BITMAP BitMapHeader,
4395 IN ULONG FromIndex,
4396 OUT PULONG StartingRunIndex);
4397
4398 NTSYSAPI
4399 CCHAR
4400 NTAPI
4401 RtlFindLeastSignificantBit(
4402 IN ULONGLONG Set);
4403
4404 NTSYSAPI
4405 ULONG
4406 NTAPI
4407 RtlFindLongestRunClear(
4408 IN PRTL_BITMAP BitMapHeader,
4409 OUT PULONG StartingIndex);
4410
4411 NTSYSAPI
4412 CCHAR
4413 NTAPI
4414 RtlFindMostSignificantBit(
4415 IN ULONGLONG Set);
4416
4417 NTSYSAPI
4418 ULONG
4419 NTAPI
4420 RtlFindNextForwardRunClear(
4421 IN PRTL_BITMAP BitMapHeader,
4422 IN ULONG FromIndex,
4423 OUT PULONG StartingRunIndex);
4424
4425 NTSYSAPI
4426 ULONG
4427 NTAPI
4428 RtlFindSetBits(
4429 IN PRTL_BITMAP BitMapHeader,
4430 IN ULONG NumberToFind,
4431 IN ULONG HintIndex);
4432
4433 NTSYSAPI
4434 ULONG
4435 NTAPI
4436 RtlFindSetBitsAndClear(
4437 IN PRTL_BITMAP BitMapHeader,
4438 IN ULONG NumberToFind,
4439 IN ULONG HintIndex);
4440
4441 NTSYSAPI
4442 NTSTATUS
4443 NTAPI
4444 RtlHashUnicodeString(
4445 IN CONST UNICODE_STRING *String,
4446 IN BOOLEAN CaseInSensitive,
4447 IN ULONG HashAlgorithm,
4448 OUT PULONG HashValue);
4449
4450 NTSYSAPI
4451 VOID
4452 NTAPI
4453 RtlInitAnsiString(
4454 IN OUT PANSI_STRING DestinationString,
4455 IN PCSZ SourceString);
4456
4457 NTSYSAPI
4458 VOID
4459 NTAPI
4460 RtlInitializeBitMap(
4461 IN PRTL_BITMAP BitMapHeader,
4462 IN PULONG BitMapBuffer,
4463 IN ULONG SizeOfBitMap);
4464
4465 NTSYSAPI
4466 VOID
4467 NTAPI
4468 RtlInitString(
4469 IN OUT PSTRING DestinationString,
4470 IN PCSZ SourceString);
4471
4472 NTSYSAPI
4473 NTSTATUS
4474 NTAPI
4475 RtlIntegerToUnicodeString(
4476 IN ULONG Value,
4477 IN ULONG Base OPTIONAL,
4478 IN OUT PUNICODE_STRING String);
4479
4480 NTSYSAPI
4481 NTSTATUS
4482 NTAPI
4483 RtlInt64ToUnicodeString(
4484 IN ULONGLONG Value,
4485 IN ULONG Base OPTIONAL,
4486 IN OUT PUNICODE_STRING String);
4487
4488 #ifdef _WIN64
4489 #define RtlIntPtrToUnicodeString(Value, Base, String) \
4490 RtlInt64ToUnicodeString(Value, Base, String)
4491 #else
4492 #define RtlIntPtrToUnicodeString(Value, Base, String) \
4493 RtlIntegerToUnicodeString(Value, Base, String)
4494 #endif
4495
4496 /* BOOLEAN
4497 * RtlIsZeroLuid(
4498 * IN PLUID L1);
4499 */
4500 #define RtlIsZeroLuid(_L1) \
4501 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
4502
4503 NTSYSAPI
4504 ULONG
4505 NTAPI
4506 RtlLengthSecurityDescriptor(
4507 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
4508
4509 NTSYSAPI
4510 ULONG
4511 NTAPI
4512 RtlNumberOfClearBits(
4513 IN PRTL_BITMAP BitMapHeader);
4514
4515 NTSYSAPI
4516 ULONG
4517 NTAPI
4518 RtlNumberOfSetBits(
4519 IN PRTL_BITMAP BitMapHeader);
4520
4521 NTSYSAPI
4522 NTSTATUS
4523 NTAPI
4524 RtlQueryRegistryValues(
4525 IN ULONG RelativeTo,
4526 IN PCWSTR Path,
4527 IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
4528 IN PVOID Context,
4529 IN PVOID Environment OPTIONAL);
4530
4531 #define LONG_SIZE (sizeof(LONG))
4532 #define LONG_MASK (LONG_SIZE - 1)
4533
4534 /* VOID
4535 * RtlRetrieveUlong(
4536 * PULONG DestinationAddress,
4537 * PULONG SourceAddress);
4538 */
4539 #if defined(_AMD64_)
4540 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
4541 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
4542 #else
4543 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
4544 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
4545 { \
4546 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
4547 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
4548 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
4549 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
4550 } \
4551 else \
4552 { \
4553 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
4554 }
4555 #endif
4556
4557 /* VOID
4558 * RtlRetrieveUshort(
4559 * PUSHORT DestinationAddress,
4560 * PUSHORT SourceAddress);
4561 */
4562 #if defined(_AMD64_)
4563 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
4564 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
4565 #else
4566 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
4567 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
4568 { \
4569 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
4570 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
4571 } \
4572 else \
4573 { \
4574 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
4575 }
4576 #endif
4577
4578 NTSYSAPI
4579 VOID
4580 NTAPI
4581 RtlSetAllBits(
4582 IN PRTL_BITMAP BitMapHeader);
4583
4584 NTSYSAPI
4585 VOID
4586 NTAPI
4587 RtlSetBits(
4588 IN PRTL_BITMAP BitMapHeader,
4589 IN ULONG StartingIndex,
4590 IN ULONG NumberToSet);
4591
4592 NTSYSAPI
4593 NTSTATUS
4594 NTAPI
4595 RtlSetDaclSecurityDescriptor(
4596 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
4597 IN BOOLEAN DaclPresent,
4598 IN PACL Dacl OPTIONAL,
4599 IN BOOLEAN DaclDefaulted OPTIONAL);
4600
4601 /* VOID
4602 * RtlStoreUlong(
4603 * IN PULONG Address,
4604 * IN ULONG Value);
4605 */
4606 #if defined(_AMD64_)
4607 #define RtlStoreUlong(Address,Value) \
4608 *(ULONG UNALIGNED *)(Address) = (Value)
4609 #else
4610 #define RtlStoreUlong(Address,Value) \
4611 if ((ULONG_PTR)(Address) & LONG_MASK) { \
4612 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
4613 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
4614 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
4615 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
4616 } \
4617 else { \
4618 *((PULONG)(Address)) = (ULONG) (Value); \
4619 }
4620 #endif
4621
4622 /* VOID
4623 * RtlStoreUlonglong(
4624 * IN OUT PULONGLONG Address,
4625 * ULONGLONG Value);
4626 */
4627 #if defined(_AMD64_)
4628 #define RtlStoreUlonglong(Address,Value) \
4629 *(ULONGLONG UNALIGNED *)(Address) = (Value)
4630 #else
4631 #define RtlStoreUlonglong(Address,Value) \
4632 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
4633 RtlStoreUlong((ULONG_PTR)(Address), \
4634 (ULONGLONG)(Value) & 0xFFFFFFFF); \
4635 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
4636 (ULONGLONG)(Value) >> 32); \
4637 } else { \
4638 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
4639 }
4640 #endif
4641
4642 /* VOID
4643 * RtlStoreUlongPtr(
4644 * IN OUT PULONG_PTR Address,
4645 * IN ULONG_PTR Value);
4646 */
4647 #ifdef _WIN64
4648 #define RtlStoreUlongPtr(Address,Value) \
4649 RtlStoreUlonglong(Address,Value)
4650 #else
4651 #define RtlStoreUlongPtr(Address,Value) \
4652 RtlStoreUlong(Address,Value)
4653 #endif
4654
4655 /* VOID
4656 * RtlStoreUshort(
4657 * IN PUSHORT Address,
4658 * IN USHORT Value);
4659 */
4660 #if defined(_AMD64_)
4661 #define RtlStoreUshort(Address,Value) \
4662 *(USHORT UNALIGNED *)(Address) = (Value)
4663 #else
4664 #define RtlStoreUshort(Address,Value) \
4665 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
4666 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
4667 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
4668 } \
4669 else { \
4670 *((PUSHORT) (Address)) = (USHORT)Value; \
4671 }
4672 #endif
4673
4674 NTSYSAPI
4675 BOOLEAN
4676 NTAPI
4677 RtlTimeFieldsToTime(
4678 IN PTIME_FIELDS TimeFields,
4679 IN PLARGE_INTEGER Time);
4680
4681 NTSYSAPI
4682 VOID
4683 NTAPI
4684 RtlTimeToTimeFields(
4685 IN PLARGE_INTEGER Time,
4686 IN PTIME_FIELDS TimeFields);
4687
4688 NTSYSAPI
4689 ULONG
4690 FASTCALL
4691 RtlUlongByteSwap(
4692 IN ULONG Source);
4693
4694 NTSYSAPI
4695 ULONGLONG
4696 FASTCALL
4697 RtlUlonglongByteSwap(
4698 IN ULONGLONG Source);
4699
4700 NTSYSAPI
4701 NTSTATUS
4702 NTAPI
4703 RtlUnicodeStringToAnsiString(
4704 IN OUT PANSI_STRING DestinationString,
4705 IN PCUNICODE_STRING SourceString,
4706 IN BOOLEAN AllocateDestinationString);
4707
4708 NTSYSAPI
4709 ULONG
4710 NTAPI
4711 RtlxUnicodeStringToAnsiSize(
4712 IN PCUNICODE_STRING UnicodeString);
4713
4714 #define RtlUnicodeStringToAnsiSize(String) ( \
4715 NLS_MB_CODE_PAGE_TAG ? \
4716 RtlxUnicodeStringToAnsiSize(String) : \
4717 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
4718 )
4719
4720 NTSYSAPI
4721 NTSTATUS
4722 NTAPI
4723 RtlUnicodeStringToInteger(
4724 IN PCUNICODE_STRING String,
4725 IN ULONG Base OPTIONAL,
4726 OUT PULONG Value);
4727
4728 NTSYSAPI
4729 WCHAR
4730 NTAPI
4731 RtlUpcaseUnicodeChar(
4732 IN WCHAR SourceCharacter);
4733
4734 NTSYSAPI
4735 USHORT
4736 FASTCALL
4737 RtlUshortByteSwap(
4738 IN USHORT Source);
4739
4740 NTSYSAPI
4741 BOOLEAN
4742 NTAPI
4743 RtlValidRelativeSecurityDescriptor(
4744 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
4745 IN ULONG SecurityDescriptorLength,
4746 IN SECURITY_INFORMATION RequiredInformation);
4747
4748 NTSYSAPI
4749 BOOLEAN
4750 NTAPI
4751 RtlValidSecurityDescriptor(
4752 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
4753
4754 NTSYSAPI
4755 NTSTATUS
4756 NTAPI
4757 RtlWriteRegistryValue(
4758 IN ULONG RelativeTo,
4759 IN PCWSTR Path,
4760 IN PCWSTR ValueName,
4761 IN ULONG ValueType,
4762 IN PVOID ValueData,
4763 IN ULONG ValueLength);
4764
4765 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
4766
4767 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
4768 NTSYSAPI
4769 VOID
4770 FASTCALL
4771 RtlPrefetchMemoryNonTemporal(
4772 IN PVOID Source,
4773 IN SIZE_T Length);
4774 #endif
4775
4776 #if (NTDDI_VERSION >= NTDDI_WINXP)
4777 NTSYSAPI
4778 VOID
4779 NTAPI
4780 RtlClearBit(
4781 PRTL_BITMAP BitMapHeader,
4782 ULONG BitNumber);
4783
4784 NTSYSAPI
4785 WCHAR
4786 NTAPI
4787 RtlDowncaseUnicodeChar(
4788 IN WCHAR SourceCharacter);
4789
4790 NTSYSAPI
4791 VOID
4792 NTAPI
4793 RtlSetBit(
4794 PRTL_BITMAP BitMapHeader,
4795 ULONG BitNumber);
4796
4797 NTSYSAPI
4798 BOOLEAN
4799 NTAPI
4800 RtlTestBit(
4801 IN PRTL_BITMAP BitMapHeader,
4802 IN ULONG BitNumber);
4803
4804 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
4805
4806 #if (NTDDI_VERSION >= NTDDI_VISTA)
4807 NTSYSAPI
4808 ULONG
4809 NTAPI
4810 RtlNumberOfSetBitsUlongPtr(
4811 IN ULONG_PTR Target);
4812
4813 NTSYSAPI
4814 ULONGLONG
4815 NTAPI
4816 RtlIoDecodeMemIoResource (
4817 IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
4818 OUT PULONGLONG Alignment OPTIONAL,
4819 OUT PULONGLONG MinimumAddress OPTIONAL,
4820 OUT PULONGLONG MaximumAddress OPTIONAL);
4821
4822 NTSYSAPI
4823 NTSTATUS
4824 NTAPI
4825 RtlIoEncodeMemIoResource(
4826 IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
4827 IN UCHAR Type,
4828 IN ULONGLONG Length,
4829 IN ULONGLONG Alignment,
4830 IN ULONGLONG MinimumAddress,
4831 IN ULONGLONG MaximumAddress);
4832
4833 NTSYSAPI
4834 ULONGLONG
4835 NTAPI
4836 RtlCmDecodeMemIoResource(
4837 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor,
4838 OUT PULONGLONG Start OPTIONAL);
4839
4840 NTSYSAPI
4841 NTSTATUS
4842 NTAPI
4843 RtlFindClosestEncodableLength(
4844 IN ULONGLONG SourceLength,
4845 OUT PULONGLONG TargetLength);
4846
4847 #endif
4848
4849 #if !defined(MIDL_PASS)
4850 /* inline funftions */
4851 //DECLSPEC_DEPRECATED_DDK_WINXP
4852 static __inline
4853 LARGE_INTEGER
4854 NTAPI_INLINE
4855 RtlConvertLongToLargeInteger(LONG SignedInteger)
4856 {
4857 LARGE_INTEGER ret;
4858 ret.QuadPart = SignedInteger;
4859 return ret;
4860 }
4861
4862 //DECLSPEC_DEPRECATED_DDK_WINXP
4863 static __inline
4864 LARGE_INTEGER
4865 NTAPI_INLINE
4866 RtlConvertUlongToLargeInteger(
4867 ULONG UnsignedInteger)
4868 {
4869 LARGE_INTEGER ret;
4870 ret.QuadPart = UnsignedInteger;
4871 return ret;
4872 }
4873
4874 //DECLSPEC_DEPRECATED_DDK
4875 static __inline
4876 ULONG
4877 NTAPI_INLINE
4878 RtlEnlargedUnsignedDivide(
4879 IN ULARGE_INTEGER Dividend,
4880 IN ULONG Divisor,
4881 IN OUT PULONG Remainder)
4882 {
4883 if (Remainder)
4884 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
4885 return (ULONG)(Dividend.QuadPart / Divisor);
4886 }
4887
4888 //DECLSPEC_DEPRECATED_DDK
4889 static __inline
4890 LARGE_INTEGER
4891 NTAPI_INLINE
4892 RtlEnlargedUnsignedMultiply(
4893 IN ULONG Multiplicand,
4894 IN ULONG Multiplier)
4895 {
4896 LARGE_INTEGER ret;
4897 ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
4898 return ret;
4899 }
4900
4901 //DECLSPEC_DEPRECATED_DDK
4902 static __inline
4903 LARGE_INTEGER
4904 NTAPI_INLINE
4905 RtlEnlargedIntegerMultiply(
4906 IN LONG Multiplicand,
4907 IN LONG Multiplier)
4908 {
4909 LARGE_INTEGER ret;
4910 ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
4911 return ret;
4912 }
4913
4914 FORCEINLINE
4915 VOID
4916 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString,
4917 IN PCHAR Buffer,
4918 IN USHORT BufferSize)
4919 {
4920 AnsiString->Length = 0;
4921 AnsiString->MaximumLength = BufferSize;
4922 AnsiString->Buffer = Buffer;
4923 }
4924
4925 FORCEINLINE
4926 VOID
4927 RtlInitEmptyUnicodeString(
4928 OUT PUNICODE_STRING UnicodeString,
4929 IN PWSTR Buffer,
4930 IN USHORT BufferSize)
4931 {
4932 UnicodeString->Length = 0;
4933 UnicodeString->MaximumLength = BufferSize;
4934 UnicodeString->Buffer = Buffer;
4935 }
4936
4937 #if defined(_AMD64_) || defined(_IA64_)
4938 static __inline
4939 LARGE_INTEGER
4940 NTAPI_INLINE
4941 RtlExtendedIntegerMultiply(
4942 LARGE_INTEGER Multiplicand,
4943 LONG Multiplier)
4944 {
4945 LARGE_INTEGER ret;
4946 ret.QuadPart = Multiplicand.QuadPart * Multiplier;
4947 return ret;
4948 }
4949
4950 static __inline
4951 LARGE_INTEGER
4952 NTAPI_INLINE
4953 RtlExtendedLargeIntegerDivide(
4954 LARGE_INTEGER Dividend,
4955 ULONG Divisor,
4956 PULONG Remainder)
4957 {
4958 LARGE_INTEGER ret;
4959 ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
4960 if (Remainder)
4961 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
4962 return ret;
4963 }
4964 #endif
4965
4966 #if defined(_AMD64_)
4967
4968 #define MultiplyHigh __mulh
4969 #define UnsignedMultiplyHigh __umulh
4970
4971 //DECLSPEC_DEPRECATED_DDK
4972 static __inline
4973 LARGE_INTEGER
4974 NTAPI_INLINE
4975 RtlExtendedMagicDivide(
4976 IN LARGE_INTEGER Dividend,
4977 IN LARGE_INTEGER MagicDivisor,
4978 IN CCHAR ShiftCount)
4979 {
4980 LARGE_INTEGER ret;
4981 ULONG64 ret64;
4982 BOOLEAN Pos;
4983 Pos = (Dividend.QuadPart >= 0);
4984 ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,
4985 MagicDivisor.QuadPart);
4986 ret64 >>= ShiftCount;
4987 ret.QuadPart = Pos ? ret64 : -ret64;
4988 return ret;
4989 }
4990 #endif
4991
4992 //DECLSPEC_DEPRECATED_DDK
4993 static __inline
4994 LARGE_INTEGER
4995 NTAPI_INLINE
4996 RtlLargeIntegerAdd(
4997 IN LARGE_INTEGER Addend1,
4998 IN LARGE_INTEGER Addend2)
4999 {
5000 LARGE_INTEGER ret;
5001 ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
5002 return ret;
5003 }
5004
5005 /* VOID
5006 * RtlLargeIntegerAnd(
5007 * IN OUT LARGE_INTEGER Result,
5008 * IN LARGE_INTEGER Source,
5009 * IN LARGE_INTEGER Mask);
5010 */
5011 #define RtlLargeIntegerAnd(Result, Source, Mask) \
5012 Result.QuadPart = Source.QuadPart & Mask.QuadPart
5013
5014 //DECLSPEC_DEPRECATED_DDK
5015 static __inline
5016 LARGE_INTEGER
5017 NTAPI_INLINE
5018 RtlLargeIntegerArithmeticShift(
5019 IN LARGE_INTEGER LargeInteger,
5020 IN CCHAR ShiftCount)
5021 {
5022 LARGE_INTEGER ret;
5023 ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;
5024 return ret;
5025 }
5026
5027 /* BOOLEAN
5028 * RtlLargeIntegerEqualTo(
5029 * IN LARGE_INTEGER Operand1,
5030 * IN LARGE_INTEGER Operand2);
5031 */
5032 #define RtlLargeIntegerEqualTo(X,Y) \
5033 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
5034
5035 FORCEINLINE
5036 PVOID
5037 RtlSecureZeroMemory(
5038 OUT PVOID Pointer,
5039 IN SIZE_T Size)
5040 {
5041 volatile char* vptr = (volatile char*)Pointer;
5042 #if defined(_M_AMD64)
5043 __stosb((PUCHAR)vptr, 0, Size);
5044 #else
5045 char * endptr = (char *)vptr + Size;
5046 while (vptr < endptr)
5047 {
5048 *vptr = 0; vptr++;
5049 }
5050 #endif
5051 return Pointer;
5052 }
5053
5054 #if defined(_M_AMD64)
5055 FORCEINLINE
5056 ULONG
5057 RtlCheckBit(
5058 IN PRTL_BITMAP BitMapHeader,
5059 IN ULONG BitPosition)
5060 {
5061 return BitTest((LONG CONST*)BitMapHeader->Buffer, BitPosition);
5062 }
5063 #else
5064 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
5065 #endif // defined(_M_AMD64)
5066
5067 #endif // !defined(MIDL_PASS)
5068
5069 /* Byte Swap Functions */
5070 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
5071 ((defined(_M_AMD64) || defined(_M_IA64)) \
5072 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
5073
5074 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
5075 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
5076 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
5077
5078 #endif
5079
5080 #if DBG
5081
5082 #define ASSERT(exp) \
5083 (VOID)((!(exp)) ? \
5084 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL ), FALSE : TRUE)
5085
5086 #define ASSERTMSG(msg, exp) \
5087 (VOID)((!(exp)) ? \
5088 RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
5089
5090 #define RTL_SOFT_ASSERT(exp) \
5091 (VOID)((!(exp)) ? \
5092 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #exp), FALSE : TRUE)
5093
5094 #define RTL_SOFT_ASSERTMSG(msg, exp) \
5095 (VOID)((!(exp)) ? \
5096 DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #exp, (msg)), FALSE : TRUE)
5097
5098 #define RTL_VERIFY(exp) ASSERT(exp)
5099 #define RTL_VERIFYMSG(msg, exp) ASSERTMSG(msg, exp)
5100
5101 #define RTL_SOFT_VERIFY(exp) RTL_SOFT_ASSERT(exp)
5102 #define RTL_SOFT_VERIFYMSG(msg, exp) RTL_SOFT_ASSERTMSG(msg, exp)
5103
5104 #if defined(_MSC_VER)
5105
5106 #define NT_ASSERT(exp) \
5107 ((!(exp)) ? \
5108 (__annotation(L"Debug", L"AssertFail", L#exp), \
5109 DbgRaiseAssertionFailure(), FALSE) : TRUE)
5110
5111 #define NT_ASSERTMSG(msg, exp) \
5112 ((!(exp)) ? \
5113 (__annotation(L"Debug", L"AssertFail", L##msg), \
5114 DbgRaiseAssertionFailure(), FALSE) : TRUE)
5115
5116 #define NT_ASSERTMSGW(msg, exp) \
5117 ((!(exp)) ? \
5118 (__annotation(L"Debug", L"AssertFail", msg), \
5119 DbgRaiseAssertionFailure(), FALSE) : TRUE)
5120
5121 #else
5122
5123 /* GCC doesn't support __annotation (nor PDB) */
5124 #define NT_ASSERT(exp) \
5125 (VOID)((!(exp)) ? (DbgRaiseAssertionFailure(), FALSE) : TRUE)
5126
5127 #define NT_ASSERTMSG NT_ASSERT
5128 #define NT_ASSERTMSGW NT_ASSERT
5129
5130 #endif
5131
5132 #else /* !DBG */
5133
5134 #define ASSERT(exp) ((VOID) 0)
5135 #define ASSERTMSG(msg, exp) ((VOID) 0)
5136
5137 #define RTL_SOFT_ASSERT(exp) ((VOID) 0)
5138 #define RTL_SOFT_ASSERTMSG(msg, exp) ((VOID) 0)
5139
5140 #define RTL_VERIFY(exp) ((exp) ? TRUE : FALSE)
5141 #define RTL_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
5142
5143 #define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
5144 #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
5145
5146 #define NT_ASSERT(exp) ((VOID)0)
5147 #define NT_ASSERTMSG(exp) ((VOID)0)
5148 #define NT_ASSERTMSGW(exp) ((VOID)0)
5149
5150 #endif /* DBG */
5151
5152
5153 /******************************************************************************
5154 * I/O Manager Types *
5155 ******************************************************************************/
5156
5157 /* PCI_COMMON_CONFIG.Command */
5158 #define PCI_ENABLE_IO_SPACE 0x0001
5159 #define PCI_ENABLE_MEMORY_SPACE 0x0002
5160 #define PCI_ENABLE_BUS_MASTER 0x0004
5161 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
5162 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
5163 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
5164 #define PCI_ENABLE_PARITY 0x0040
5165 #define PCI_ENABLE_WAIT_CYCLE 0x0080
5166 #define PCI_ENABLE_SERR 0x0100
5167 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
5168 #define PCI_DISABLE_LEVEL_INTERRUPT 0x0400
5169
5170 /* PCI_COMMON_CONFIG.Status */
5171 #define PCI_STATUS_INTERRUPT_PENDING 0x0008
5172 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
5173 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
5174 #define PCI_STATUS_UDF_SUPPORTED 0x0040
5175 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
5176 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
5177 #define PCI_STATUS_DEVSEL 0x0600
5178 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
5179 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
5180 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
5181 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
5182 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
5183
5184 /* PCI_COMMON_CONFIG.HeaderType */
5185 #define PCI_MULTIFUNCTION 0x80
5186 #define PCI_DEVICE_TYPE 0x00
5187 #define PCI_BRIDGE_TYPE 0x01
5188 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
5189
5190 #define PCI_CONFIGURATION_TYPE(PciData) \
5191 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
5192
5193 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
5194 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
5195
5196 /* PCI device classes */
5197 #define PCI_CLASS_PRE_20 0x00
5198 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
5199 #define PCI_CLASS_NETWORK_CTLR 0x02
5200 #define PCI_CLASS_DISPLAY_CTLR 0x03
5201 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
5202 #define PCI_CLASS_MEMORY_CTLR 0x05
5203 #define PCI_CLASS_BRIDGE_DEV 0x06
5204 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
5205 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
5206 #define PCI_CLASS_INPUT_DEV 0x09
5207 #define PCI_CLASS_DOCKING_STATION 0x0a
5208 #define PCI_CLASS_PROCESSOR 0x0b
5209 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
5210 #define PCI_CLASS_WIRELESS_CTLR 0x0d
5211 #define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e
5212 #define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f
5213 #define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10
5214 #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11
5215
5216 /* PCI device subclasses for class 0 */
5217 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
5218 #define PCI_SUBCLASS_PRE_20_VGA 0x01
5219
5220 /* PCI device subclasses for class 1 (mass storage controllers)*/
5221 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
5222 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
5223 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
5224 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
5225 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
5226 #define PCI_SUBCLASS_MSC_OTHER 0x80
5227
5228 /* PCI device subclasses for class 2 (network controllers)*/
5229 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
5230 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
5231 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
5232 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
5233 #define PCI_SUBCLASS_NET_ISDN_CTLR 0x04
5234 #define PCI_SUBCLASS_NET_OTHER 0x80
5235
5236 /* PCI device subclasses for class 3 (display controllers)*/
5237 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
5238 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
5239 #define PCI_SUBCLASS_VID_3D_CTLR 0x02
5240 #define PCI_SUBCLASS_VID_OTHER 0x80
5241
5242 /* PCI device subclasses for class 4 (multimedia device)*/
5243 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
5244 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
5245 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
5246 #define PCI_SUBCLASS_MM_OTHER 0x80
5247
5248 /* PCI device subclasses for class 5 (memory controller)*/
5249 #define PCI_SUBCLASS_MEM_RAM 0x00
5250 #define PCI_SUBCLASS_MEM_FLASH 0x01
5251 #define PCI_SUBCLASS_MEM_OTHER 0x80
5252
5253 /* PCI device subclasses for class 6 (bridge device)*/
5254 #define PCI_SUBCLASS_BR_HOST 0x00
5255 #define PCI_SUBCLASS_BR_ISA 0x01
5256 #define PCI_SUBCLASS_BR_EISA 0x02
5257 #define PCI_SUBCLASS_BR_MCA 0x03
5258 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
5259 #define PCI_SUBCLASS_BR_PCMCIA 0x05
5260 #define PCI_SUBCLASS_BR_NUBUS 0x06
5261 #define PCI_SUBCLASS_BR_CARDBUS 0x07
5262 #define PCI_SUBCLASS_BR_RACEWAY 0x08
5263 #define PCI_SUBCLASS_BR_OTHER 0x80
5264
5265 /* PCI device subclasses for class C (serial bus controller)*/
5266 #define PCI_SUBCLASS_SB_IEEE1394 0x00
5267 #define PCI_SUBCLASS_SB_ACCESS 0x01
5268 #define PCI_SUBCLASS_SB_SSA 0x02
5269 #define PCI_SUBCLASS_SB_USB 0x03
5270 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
5271 #define PCI_SUBCLASS_SB_SMBUS 0x05
5272
5273 #define PCI_MAX_DEVICES 32
5274 #define PCI_MAX_FUNCTION 8
5275 #define PCI_MAX_BRIDGE_NUMBER 0xFF
5276 #define PCI_INVALID_VENDORID 0xFFFF
5277 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
5278
5279 #define PCI_ADDRESS_IO_SPACE 0x00000001
5280 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006
5281 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008
5282 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
5283 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
5284 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
5285
5286 #define PCI_TYPE_32BIT 0
5287 #define PCI_TYPE_20BIT 2
5288 #define PCI_TYPE_64BIT 4
5289
5290 #define POOL_COLD_ALLOCATION 256
5291 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8
5292 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16
5293
5294 #define PCI_TYPE0_ADDRESSES 6
5295 #define PCI_TYPE1_ADDRESSES 2
5296 #define PCI_TYPE2_ADDRESSES 5
5297
5298 #define IO_TYPE_ADAPTER 1
5299 #define IO_TYPE_CONTROLLER 2
5300 #define IO_TYPE_DEVICE 3
5301 #define IO_TYPE_DRIVER 4
5302 #define IO_TYPE_FILE 5
5303 #define IO_TYPE_IRP 6
5304 #define IO_TYPE_MASTER_ADAPTER 7
5305 #define IO_TYPE_OPEN_PACKET 8
5306 #define IO_TYPE_TIMER 9
5307 #define IO_TYPE_VPB 10
5308 #define IO_TYPE_ERROR_LOG 11
5309 #define IO_TYPE_ERROR_MESSAGE 12
5310 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
5311
5312 #define IO_TYPE_CSQ_IRP_CONTEXT 1
5313 #define IO_TYPE_CSQ 2
5314 #define IO_TYPE_CSQ_EX 3
5315
5316 /* IO_RESOURCE_DESCRIPTOR.Option */
5317 #define IO_RESOURCE_PREFERRED 0x01
5318 #define IO_RESOURCE_DEFAULT 0x02
5319 #define IO_RESOURCE_ALTERNATIVE 0x08
5320
5321 /* DEVICE_OBJECT.Flags */
5322 #define DO_VERIFY_VOLUME 0x00000002
5323 #define DO_BUFFERED_IO 0x00000004
5324 #define DO_EXCLUSIVE 0x00000008
5325 #define DO_DIRECT_IO 0x00000010
5326 #define DO_MAP_IO_BUFFER 0x00000020
5327 #define DO_DEVICE_INITIALIZING 0x00000080
5328 #define DO_SHUTDOWN_REGISTERED 0x00000800
5329 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
5330 #define DO_POWER_PAGABLE 0x00002000
5331 #define DO_POWER_INRUSH 0x00004000
5332
5333 /* DEVICE_OBJECT.Characteristics */
5334 #define FILE_REMOVABLE_MEDIA 0x00000001
5335 #define FILE_READ_ONLY_DEVICE 0x00000002
5336 #define FILE_FLOPPY_DISKETTE 0x00000004
5337 #define FILE_WRITE_ONCE_MEDIA 0x00000008
5338 #define FILE_REMOTE_DEVICE 0x00000010
5339 #define FILE_DEVICE_IS_MOUNTED 0x00000020
5340 #define FILE_VIRTUAL_VOLUME 0x00000040
5341 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
5342 #define FILE_DEVICE_SECURE_OPEN 0x00000100
5343 #define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800
5344 #define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000
5345 #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
5346
5347 /* DEVICE_OBJECT.AlignmentRequirement */
5348 #define FILE_BYTE_ALIGNMENT 0x00000000
5349 #define FILE_WORD_ALIGNMENT 0x00000001
5350 #define FILE_LONG_ALIGNMENT 0x00000003
5351 #define FILE_QUAD_ALIGNMENT 0x00000007
5352 #define FILE_OCTA_ALIGNMENT 0x0000000f
5353 #define FILE_32_BYTE_ALIGNMENT 0x0000001f
5354 #define FILE_64_BYTE_ALIGNMENT 0x0000003f
5355 #define FILE_128_BYTE_ALIGNMENT 0x0000007f
5356 #define FILE_256_BYTE_ALIGNMENT 0x000000ff
5357 #define FILE_512_BYTE_ALIGNMENT 0x000001ff
5358
5359 /* DEVICE_OBJECT.DeviceType */
5360 #define DEVICE_TYPE ULONG
5361
5362 #define FILE_DEVICE_BEEP 0x00000001
5363 #define FILE_DEVICE_CD_ROM 0x00000002
5364 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
5365 #define FILE_DEVICE_CONTROLLER 0x00000004
5366 #define FILE_DEVICE_DATALINK 0x00000005
5367 #define FILE_DEVICE_DFS 0x00000006
5368 #define FILE_DEVICE_DISK 0x00000007
5369 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
5370 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
5371 #define FILE_DEVICE_INPORT_PORT 0x0000000a
5372 #define FILE_DEVICE_KEYBOARD 0x0000000b
5373 #define FILE_DEVICE_MAILSLOT 0x0000000c
5374 #define FILE_DEVICE_MIDI_IN 0x0000000d
5375 #define FILE_DEVICE_MIDI_OUT 0x0000000e
5376 #define FILE_DEVICE_MOUSE 0x0000000f
5377 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
5378 #define FILE_DEVICE_NAMED_PIPE 0x00000011
5379 #define FILE_DEVICE_NETWORK 0x00000012
5380 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
5381 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
5382 #define FILE_DEVICE_NULL 0x00000015
5383 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
5384 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
5385 #define FILE_DEVICE_PRINTER 0x00000018
5386 #define FILE_DEVICE_SCANNER 0x00000019
5387 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
5388 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
5389 #define FILE_DEVICE_SCREEN 0x0000001c
5390 #define FILE_DEVICE_SOUND 0x0000001d
5391 #define FILE_DEVICE_STREAMS 0x0000001e
5392 #define FILE_DEVICE_TAPE 0x0000001f
5393 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
5394 #define FILE_DEVICE_TRANSPORT 0x00000021
5395 #define FILE_DEVICE_UNKNOWN 0x00000022
5396 #define FILE_DEVICE_VIDEO 0x00000023
5397 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
5398 #define FILE_DEVICE_WAVE_IN 0x00000025
5399 #define FILE_DEVICE_WAVE_OUT 0x00000026
5400 #define FILE_DEVICE_8042_PORT 0x00000027
5401 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
5402 #define FILE_DEVICE_BATTERY 0x00000029
5403 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
5404 #define FILE_DEVICE_MODEM 0x0000002b
5405 #define FILE_DEVICE_VDM 0x0000002c
5406 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
5407 #define FILE_DEVICE_SMB 0x0000002e
5408 #define FILE_DEVICE_KS 0x0000002f
5409 #define FILE_DEVICE_CHANGER 0x00000030
5410 #define FILE_DEVICE_SMARTCARD 0x00000031
5411 #define FILE_DEVICE_ACPI 0x00000032
5412 #define FILE_DEVICE_DVD 0x00000033
5413 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
5414 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
5415 #define FILE_DEVICE_DFS_VOLUME 0x00000036
5416 #define FILE_DEVICE_SERENUM 0x00000037
5417 #define FILE_DEVICE_TERMSRV 0x00000038
5418 #define FILE_DEVICE_KSEC 0x00000039
5419 #define FILE_DEVICE_FIPS 0x0000003a
5420 #define FILE_DEVICE_INFINIBAND 0x0000003b
5421 #define FILE_DEVICE_VMBUS 0x0000003e
5422 #define FILE_DEVICE_CRYPT_PROVIDER 0x0000003f
5423 #define FILE_DEVICE_WPD 0x00000040
5424 #define FILE_DEVICE_BLUETOOTH 0x00000041
5425 #define FILE_DEVICE_MT_COMPOSITE 0x00000042
5426 #define FILE_DEVICE_MT_TRANSPORT 0x00000043
5427 #define FILE_DEVICE_BIOMETRIC 0x00000044
5428 #define FILE_DEVICE_PMI 0x00000045
5429
5430 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
5431
5432 typedef struct _OBJECT_HANDLE_INFORMATION {
5433 ULONG HandleAttributes;
5434 ACCESS_MASK GrantedAccess;
5435 } OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
5436
5437 typedef struct _CLIENT_ID {
5438 HANDLE UniqueProcess;
5439 HANDLE UniqueThread;
5440 } CLIENT_ID, *PCLIENT_ID;
5441
5442 typedef VOID
5443 (DDKAPI *PKSTART_ROUTINE)(
5444 IN PVOID StartContext);
5445
5446 typedef struct _VPB {
5447 CSHORT Type;
5448 CSHORT Size;
5449 USHORT Flags;
5450 USHORT VolumeLabelLength;
5451 struct _DEVICE_OBJECT *DeviceObject;
5452 struct _DEVICE_OBJECT *RealDevice;
5453 ULONG SerialNumber;
5454 ULONG ReferenceCount;
5455 WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
5456 } VPB, *PVPB;
5457
5458 typedef enum _IO_ALLOCATION_ACTION {
5459 KeepObject = 1,
5460 DeallocateObject,
5461 DeallocateObjectKeepRegisters
5462 } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
5463
5464 typedef IO_ALLOCATION_ACTION
5465 (DDKAPI *PDRIVER_CONTROL)(
5466 IN struct _DEVICE_OBJECT *DeviceObject,
5467 IN struct _IRP *Irp,
5468 IN PVOID MapRegisterBase,
5469 IN PVOID Context);
5470
5471 typedef struct _WAIT_CONTEXT_BLOCK {
5472 KDEVICE_QUEUE_ENTRY WaitQueueEntry;
5473 PDRIVER_CONTROL DeviceRoutine;
5474 PVOID DeviceContext;
5475 ULONG NumberOfMapRegisters;
5476 PVOID DeviceObject;
5477 PVOID CurrentIrp;
5478 PKDPC BufferChainingDpc;
5479 } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
5480
5481 typedef struct _DEVICE_OBJECT {
5482 CSHORT Type;
5483 USHORT Size;
5484 LONG ReferenceCount;
5485 struct _DRIVER_OBJECT *DriverObject;
5486 struct _DEVICE_OBJECT *NextDevice;
5487 struct _DEVICE_OBJECT *AttachedDevice;
5488 struct _IRP *CurrentIrp;
5489 PIO_TIMER Timer;
5490 ULONG Flags;
5491 ULONG Characteristics;
5492 volatile PVPB Vpb;
5493 PVOID DeviceExtension;
5494 DEVICE_TYPE DeviceType;
5495 CCHAR StackSize;
5496 union {
5497 LIST_ENTRY ListEntry;
5498 WAIT_CONTEXT_BLOCK Wcb;
5499 } Queue;
5500 ULONG AlignmentRequirement;
5501 KDEVICE_QUEUE DeviceQueue;
5502 KDPC Dpc;
5503 ULONG ActiveThreadCount;
5504 PSECURITY_DESCRIPTOR SecurityDescriptor;
5505 KEVENT DeviceLock;
5506 USHORT SectorSize;
5507 USHORT Spare1;
5508 struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
5509 PVOID Reserved;
5510 } DEVICE_OBJECT, *PDEVICE_OBJECT;
5511
5512 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
5513
5514 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
5515 BOOLEAN Removed;
5516 BOOLEAN Reserved[3];
5517 volatile LONG IoCount;
5518 KEVENT RemoveEvent;
5519 } IO_REMOVE_LOCK_COMMON_BLOCK;
5520
5521 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
5522 LONG Signature;
5523 LONG HighWatermark;
5524 LONGLONG MaxLockedTicks;
5525 LONG AllocateTag;
5526 LIST_ENTRY LockList;
5527 KSPIN_LOCK Spin;
5528 volatile LONG LowMemoryCount;
5529 ULONG Reserved1[4];
5530 PVOID Reserved2;
5531 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
5532 } IO_REMOVE_LOCK_DBG_BLOCK;
5533
5534 typedef struct _IO_REMOVE_LOCK {
5535 IO_REMOVE_LOCK_COMMON_BLOCK Common;
5536 #if DBG
5537 IO_REMOVE_LOCK_DBG_BLOCK Dbg;
5538 #endif
5539 } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
5540
5541 typedef struct _IO_WORKITEM *PIO_WORKITEM;
5542
5543 typedef VOID
5544 (DDKAPI IO_WORKITEM_ROUTINE)(
5545 IN PDEVICE_OBJECT DeviceObject,
5546 IN PVOID Context);
5547 typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE;
5548
5549 typedef struct _SHARE_ACCESS {
5550 ULONG OpenCount;
5551 ULONG Readers;
5552 ULONG Writers;
5553 ULONG Deleters;
5554 ULONG SharedRead;
5555 ULONG SharedWrite;
5556 ULONG SharedDelete;
5557 } SHARE_ACCESS, *PSHARE_ACCESS;
5558
5559 /* While MS WDK uses inheritance in C++, we cannot do this with gcc, as
5560 inheritance, even from a struct renders the type non-POD. So we use
5561 this hack */
5562 #define PCI_COMMON_HEADER_LAYOUT \
5563 USHORT VendorID; \
5564 USHORT DeviceID; \
5565 USHORT Command; \
5566 USHORT Status; \
5567 UCHAR RevisionID; \
5568 UCHAR ProgIf; \
5569 UCHAR SubClass; \
5570 UCHAR BaseClass; \
5571 UCHAR CacheLineSize; \
5572 UCHAR LatencyTimer; \
5573 UCHAR HeaderType; \
5574 UCHAR BIST; \
5575 union { \
5576 struct _PCI_HEADER_TYPE_0 { \
5577 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; \
5578 ULONG CIS; \
5579 USHORT SubVendorID; \
5580 USHORT SubSystemID; \
5581 ULONG ROMBaseAddress; \
5582 UCHAR CapabilitiesPtr; \
5583 UCHAR Reserved1[3]; \
5584 ULONG Reserved2; \
5585 UCHAR InterruptLine; \
5586 UCHAR InterruptPin; \
5587 UCHAR MinimumGrant; \
5588 UCHAR MaximumLatency; \
5589 } type0; \
5590 struct _PCI_HEADER_TYPE_1 { \
5591 ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; \
5592 UCHAR PrimaryBus; \
5593 UCHAR SecondaryBus; \
5594 UCHAR SubordinateBus; \
5595 UCHAR SecondaryLatency; \
5596 UCHAR IOBase; \
5597 UCHAR IOLimit; \
5598 USHORT SecondaryStatus; \
5599 USHORT MemoryBase; \
5600 USHORT MemoryLimit; \
5601 USHORT PrefetchBase; \
5602 USHORT PrefetchLimit; \
5603 ULONG PrefetchBaseUpper32; \
5604 ULONG PrefetchLimitUpper32; \
5605 USHORT IOBaseUpper16; \
5606 USHORT IOLimitUpper16; \
5607 UCHAR CapabilitiesPtr; \
5608 UCHAR Reserved1[3]; \
5609 ULONG ROMBaseAddress; \
5610 UCHAR InterruptLine; \
5611 UCHAR InterruptPin; \
5612 USHORT BridgeControl; \
5613 } type1; \
5614 struct _PCI_HEADER_TYPE_2 { \
5615 ULONG SocketRegistersBaseAddress; \
5616 UCHAR CapabilitiesPtr; \
5617 UCHAR Reserved; \
5618 USHORT SecondaryStatus; \
5619 UCHAR PrimaryBus; \
5620 UCHAR SecondaryBus; \
5621 UCHAR SubordinateBus; \
5622 UCHAR SecondaryLatency; \
5623 struct { \
5624 ULONG Base; \
5625 ULONG Limit; \
5626 } Range[PCI_TYPE2_ADDRESSES-1]; \
5627 UCHAR InterruptLine; \
5628 UCHAR InterruptPin; \
5629 USHORT BridgeControl; \
5630 } type2; \
5631 } u;
5632
5633 typedef struct _PCI_COMMON_HEADER {
5634 PCI_COMMON_HEADER_LAYOUT
5635 } PCI_COMMON_HEADER, *PPCI_COMMON_HEADER;
5636
5637 #ifdef __cplusplus
5638 typedef struct _PCI_COMMON_CONFIG {
5639 PCI_COMMON_HEADER_LAYOUT
5640 UCHAR DeviceSpecific[192];
5641 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
5642 #else
5643 typedef struct _PCI_COMMON_CONFIG {
5644 PCI_COMMON_HEADER DUMMYSTRUCTNAME;
5645 UCHAR DeviceSpecific[192];
5646 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
5647 #endif
5648
5649 typedef enum _CREATE_FILE_TYPE {
5650 CreateFileTypeNone,
5651 CreateFileTypeNamedPipe,
5652 CreateFileTypeMailslot
5653 } CREATE_FILE_TYPE;
5654
5655 #define IO_FORCE_ACCESS_CHECK 0x001
5656 #define IO_NO_PARAMETER_CHECKING 0x100
5657
5658 #define IO_REPARSE 0x0
5659 #define IO_REMOUNT 0x1
5660
5661 typedef struct _IO_STATUS_BLOCK {
5662 _ANONYMOUS_UNION union {
5663 NTSTATUS Status;
5664 PVOID Pointer;
5665 } DUMMYUNIONNAME;
5666 ULONG_PTR Information;
5667 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
5668
5669 typedef struct _PCI_SLOT_NUMBER {
5670 union {
5671 struct {
5672 ULONG DeviceNumber : 5;
5673 ULONG FunctionNumber : 3;
5674 ULONG Reserved : 24;
5675 } bits;
5676 ULONG AsULONG;
5677 } u;
5678 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
5679
5680 typedef VOID
5681 (DDKAPI *PIO_APC_ROUTINE)(
5682 IN PVOID ApcContext,
5683 IN PIO_STATUS_BLOCK IoStatusBlock,
5684 IN ULONG Reserved);
5685
5686 typedef VOID
5687 (DDKAPI *WMI_NOTIFICATION_CALLBACK)(
5688 PVOID Wnode,
5689 PVOID Context);
5690
5691 #define EVENT_INCREMENT 1
5692 #define IO_NO_INCREMENT 0
5693 #define IO_CD_ROM_INCREMENT 1
5694 #define IO_DISK_INCREMENT 1
5695 #define IO_KEYBOARD_INCREMENT 6
5696 #define IO_MAILSLOT_INCREMENT 2
5697 #define IO_MOUSE_INCREMENT 6
5698 #define IO_NAMED_PIPE_INCREMENT 2
5699 #define IO_NETWORK_INCREMENT 2
5700 #define IO_PARALLEL_INCREMENT 1
5701 #define IO_SERIAL_INCREMENT 2
5702 #define IO_SOUND_INCREMENT 8
5703 #define IO_VIDEO_INCREMENT 1
5704 #define SEMAPHORE_INCREMENT 1
5705
5706 #define MM_MAXIMUM_DISK_IO_SIZE (0x10000)
5707
5708 typedef struct _BOOTDISK_INFORMATION {
5709 LONGLONG BootPartitionOffset;
5710 LONGLONG SystemPartitionOffset;
5711 ULONG BootDeviceSignature;
5712 ULONG SystemDeviceSignature;
5713 } BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
5714
5715 typedef struct _BOOTDISK_INFORMATION_EX {
5716 LONGLONG BootPartitionOffset;
5717 LONGLONG SystemPartitionOffset;
5718 ULONG BootDeviceSignature;
5719 ULONG SystemDeviceSignature;
5720 GUID BootDeviceGuid;
5721 GUID SystemDeviceGuid;
5722 BOOLEAN BootDeviceIsGpt;
5723 BOOLEAN SystemDeviceIsGpt;
5724 } BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
5725
5726 typedef struct _EISA_MEMORY_TYPE {
5727 UCHAR ReadWrite : 1;
5728 UCHAR Cached : 1;
5729 UCHAR Reserved0 : 1;
5730 UCHAR Type : 2;
5731 UCHAR Shared : 1;
5732 UCHAR Reserved1 : 1;
5733 UCHAR MoreEntries : 1;
5734 } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
5735
5736 #include <pshpack1.h>
5737 typedef struct _EISA_MEMORY_CONFIGURATION {
5738 EISA_MEMORY_TYPE ConfigurationByte;
5739 UCHAR DataSize;
5740 USHORT AddressLowWord;
5741 UCHAR AddressHighByte;
5742 USHORT MemorySize;
5743 } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
5744 #include <poppack.h>
5745
5746 typedef struct _EISA_IRQ_DESCRIPTOR {
5747 UCHAR Interrupt : 4;
5748 UCHAR Reserved : 1;
5749 UCHAR LevelTriggered : 1;
5750 UCHAR Shared : 1;
5751 UCHAR MoreEntries : 1;
5752 } EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
5753
5754 typedef struct _EISA_IRQ_CONFIGURATION {
5755 EISA_IRQ_DESCRIPTOR ConfigurationByte;
5756 UCHAR Reserved;
5757 } EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
5758
5759 typedef struct _DMA_CONFIGURATION_BYTE0 {
5760 UCHAR Channel : 3;
5761 UCHAR Reserved : 3;
5762 UCHAR Shared : 1;
5763 UCHAR MoreEntries : 1;
5764 } DMA_CONFIGURATION_BYTE0;
5765
5766 typedef struct _DMA_CONFIGURATION_BYTE1 {
5767 UCHAR Reserved0 : 2;
5768 UCHAR TransferSize : 2;
5769 UCHAR Timing : 2;
5770 UCHAR Reserved1 : 2;
5771 } DMA_CONFIGURATION_BYTE1;
5772
5773 typedef struct _EISA_DMA_CONFIGURATION {
5774 DMA_CONFIGURATION_BYTE0 ConfigurationByte0;
5775 DMA_CONFIGURATION_BYTE1 ConfigurationByte1;
5776 } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
5777
5778 #include <pshpack1.h>
5779 typedef struct _EISA_PORT_DESCRIPTOR {
5780 UCHAR NumberPorts : 5;
5781 UCHAR Reserved : 1;
5782 UCHAR Shared : 1;
5783 UCHAR MoreEntries : 1;
5784 } EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
5785
5786 typedef struct _EISA_PORT_CONFIGURATION {
5787 EISA_PORT_DESCRIPTOR Configuration;
5788 USHORT PortAddress;
5789 } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
5790 #include <poppack.h>
5791
5792 typedef struct _CM_EISA_FUNCTION_INFORMATION {
5793 ULONG CompressedId;
5794 UCHAR IdSlotFlags1;
5795 UCHAR IdSlotFlags2;
5796 UCHAR MinorRevision;
5797 UCHAR MajorRevision;
5798 UCHAR Selections[26];
5799 UCHAR FunctionFlags;
5800 UCHAR TypeString[80];
5801 EISA_MEMORY_CONFIGURATION EisaMemory[9];
5802 EISA_IRQ_CONFIGURATION EisaIrq[7];
5803 EISA_DMA_CONFIGURATION EisaDma[4];
5804 EISA_PORT_CONFIGURATION EisaPort[20];
5805 UCHAR InitializationData[60];
5806 } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
5807
5808 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
5809
5810 #define EISA_FUNCTION_ENABLED 0x80
5811 #define EISA_FREE_FORM_DATA 0x40
5812 #define EISA_HAS_PORT_INIT_ENTRY 0x20
5813 #define EISA_HAS_PORT_RANGE 0x10
5814 #define EISA_HAS_DMA_ENTRY 0x08
5815 #define EISA_HAS_IRQ_ENTRY 0x04
5816 #define EISA_HAS_MEMORY_ENTRY 0x02
5817 #define EISA_HAS_TYPE_ENTRY 0x01
5818 #define EISA_HAS_INFORMATION \
5819 (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
5820 + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
5821
5822 typedef struct _CM_EISA_SLOT_INFORMATION {
5823 UCHAR ReturnCode;
5824 UCHAR ReturnFlags;
5825 UCHAR MajorRevision;
5826 UCHAR MinorRevision;
5827 USHORT Checksum;
5828 UCHAR NumberFunctions;
5829 UCHAR FunctionInformation;
5830 ULONG CompressedId;
5831 } CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
5832
5833 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
5834
5835 #define EISA_INVALID_SLOT 0x80
5836 #define EISA_INVALID_FUNCTION 0x81
5837 #define EISA_INVALID_CONFIGURATION 0x82
5838 #define EISA_EMPTY_SLOT 0x83
5839 #define EISA_INVALID_BIOS_CALL 0x86
5840
5841 /*
5842 ** Plug and Play structures
5843 */
5844
5845 typedef VOID
5846 (DDKAPI *PINTERFACE_REFERENCE)(
5847 PVOID Context);
5848
5849 typedef VOID
5850 (DDKAPI *PINTERFACE_DEREFERENCE)(
5851 PVOID Context);
5852
5853 typedef BOOLEAN
5854 (DDKAPI *PTRANSLATE_BUS_ADDRESS)(
5855 IN PVOID Context,
5856 IN PHYSICAL_ADDRESS BusAddress,
5857 IN ULONG Length,
5858 IN OUT PULONG AddressSpace,
5859 OUT PPHYSICAL_ADDRESS TranslatedAddress);
5860
5861 typedef struct _DMA_ADAPTER*
5862 (DDKAPI *PGET_DMA_ADAPTER)(
5863 IN PVOID Context,
5864 IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
5865 OUT PULONG NumberOfMapRegisters);
5866
5867 typedef ULONG
5868 (DDKAPI *PGET_SET_DEVICE_DATA)(
5869 IN PVOID Context,
5870 IN ULONG DataType,
5871 IN PVOID Buffer,
5872 IN ULONG Offset,
5873 IN ULONG Length);
5874
5875 /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
5876 #define PCI_USE_SUBSYSTEM_IDS 0x00000001
5877 #define PCI_USE_REVISION 0x00000002
5878 #define PCI_USE_VENDEV_IDS 0x00000004
5879 #define PCI_USE_CLASS_SUBCLASS 0x00000008
5880 #define PCI_USE_PROGIF 0x00000010
5881 #define PCI_USE_LOCAL_BUS 0x00000020
5882 #define PCI_USE_LOCAL_DEVICE 0x00000040
5883
5884 typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS {
5885 ULONG Size;
5886 ULONG Flags;
5887 USHORT VendorID;
5888 USHORT DeviceID;
5889 UCHAR RevisionID;
5890 USHORT SubVendorID;
5891 USHORT SubSystemID;
5892 UCHAR BaseClass;
5893 UCHAR SubClass;
5894 UCHAR ProgIf;
5895 } PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS;
5896
5897 typedef BOOLEAN
5898 (DDKAPI *PPCI_IS_DEVICE_PRESENT)(
5899 IN USHORT VendorID,
5900 IN USHORT DeviceID,
5901 IN UCHAR RevisionID,
5902 IN USHORT SubVendorID,
5903 IN USHORT SubSystemID,
5904 IN ULONG Flags);
5905
5906 typedef BOOLEAN
5907 (DDKAPI *PPCI_IS_DEVICE_PRESENT_EX)(
5908 IN PVOID Context,
5909 IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters);
5910
5911 typedef struct _BUS_INTERFACE_STANDARD {
5912 USHORT Size;
5913 USHORT Version;
5914 PVOID Context;
5915 PINTERFACE_REFERENCE InterfaceReference;
5916 PINTERFACE_DEREFERENCE InterfaceDereference;
5917 PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
5918 PGET_DMA_ADAPTER GetDmaAdapter;
5919 PGET_SET_DEVICE_DATA SetBusData;
5920 PGET_SET_DEVICE_DATA GetBusData;
5921 } BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
5922
5923 typedef struct _PCI_DEVICE_PRESENT_INTERFACE {
5924 USHORT Size;
5925 USHORT Version;
5926 PVOID Context;
5927 PINTERFACE_REFERENCE InterfaceReference;
5928 PINTERFACE_DEREFERENCE InterfaceDereference;
5929 PPCI_IS_DEVICE_PRESENT IsDevicePresent;
5930 PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx;
5931 } PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE;
5932
5933 typedef struct _DEVICE_CAPABILITIES {
5934 USHORT Size;
5935 USHORT Version;
5936 ULONG DeviceD1 : 1;
5937 ULONG DeviceD2 : 1;
5938 ULONG LockSupported : 1;
5939 ULONG EjectSupported : 1;
5940 ULONG Removable : 1;
5941 ULONG DockDevice : 1;
5942 ULONG UniqueID : 1;
5943 ULONG SilentInstall : 1;
5944 ULONG RawDeviceOK : 1;
5945 ULONG SurpriseRemovalOK : 1;
5946 ULONG WakeFromD0 : 1;
5947 ULONG WakeFromD1 : 1;
5948 ULONG WakeFromD2 : 1;
5949 ULONG WakeFromD3 : 1;
5950 ULONG HardwareDisabled : 1;
5951 ULONG NonDynamic : 1;
5952 ULONG WarmEjectSupported : 1;
5953 ULONG NoDisplayInUI : 1;
5954 ULONG Reserved : 14;
5955 ULONG Address;
5956 ULONG UINumber;
5957 DEVICE_POWER_STATE DeviceState[PowerSystemMaximum];
5958 SYSTEM_POWER_STATE SystemWake;
5959 DEVICE_POWER_STATE DeviceWake;
5960 ULONG D1Latency;
5961 ULONG D2Latency;
5962 ULONG D3Latency;
5963 } DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
5964
5965 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
5966 USHORT Version;
5967 USHORT Size;
5968 GUID Event;
5969 GUID InterfaceClassGuid;
5970 PUNICODE_STRING SymbolicLinkName;
5971 } DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
5972
5973 typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
5974 USHORT Version;
5975 USHORT Size;
5976 GUID Event;
5977 } HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
5978
5979 #undef INTERFACE
5980
5981 typedef struct _INTERFACE {
5982 USHORT Size;
5983 USHORT Version;
5984 PVOID Context;
5985 PINTERFACE_REFERENCE InterfaceReference;
5986 PINTERFACE_DEREFERENCE InterfaceDereference;
5987 } INTERFACE, *PINTERFACE;
5988
5989 typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
5990 USHORT Version;
5991 USHORT Size;
5992 GUID Event;
5993 } PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
5994
5995 typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
5996
5997 /* PNP_DEVICE_STATE */
5998
5999 #define PNP_DEVICE_DISABLED 0x00000001
6000 #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
6001 #define PNP_DEVICE_FAILED 0x00000004
6002 #define PNP_DEVICE_REMOVED 0x00000008
6003 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
6004 #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
6005
6006 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
6007 USHORT Version;
6008 USHORT Size;
6009 GUID Event;
6010 struct _FILE_OBJECT *FileObject;
6011 LONG NameBufferOffset;
6012 UCHAR CustomDataBuffer[1];
6013 } TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
6014
6015 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
6016 USHORT Version;
6017 USHORT Size;
6018 GUID Event;
6019 struct _FILE_OBJECT *FileObject;
6020 } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
6021
6022 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
6023 DeviceUsageTypeUndefined,
6024 DeviceUsageTypePaging,
6025 DeviceUsageTypeHibernation,
6026 DeviceUsageTypeDumpFile
6027 } DEVICE_USAGE_NOTIFICATION_TYPE;
6028
6029 typedef struct _POWER_SEQUENCE {
6030 ULONG SequenceD1;
6031 ULONG SequenceD2;
6032 ULONG SequenceD3;
6033 } POWER_SEQUENCE, *PPOWER_SEQUENCE;
6034
6035 typedef enum {
6036 DevicePropertyDeviceDescription = 0x0,
6037 DevicePropertyHardwareID = 0x1,
6038 DevicePropertyCompatibleIDs = 0x2,
6039 DevicePropertyBootConfiguration = 0x3,
6040 DevicePropertyBootConfigurationTranslated = 0x4,
6041 DevicePropertyClassName = 0x5,
6042 DevicePropertyClassGuid = 0x6,
6043 DevicePropertyDriverKeyName = 0x7,
6044 DevicePropertyManufacturer = 0x8,
6045 DevicePropertyFriendlyName = 0x9,
6046 DevicePropertyLocationInformation = 0xa,
6047 DevicePropertyPhysicalDeviceObjectName = 0xb,
6048 DevicePropertyBusTypeGuid = 0xc,
6049 DevicePropertyLegacyBusType = 0xd,
6050 DevicePropertyBusNumber = 0xe,
6051 DevicePropertyEnumeratorName = 0xf,
6052 DevicePropertyAddress = 0x10,
6053 DevicePropertyUINumber = 0x11,
6054 DevicePropertyInstallState = 0x12,
6055 DevicePropertyRemovalPolicy = 0x13,
6056 DevicePropertyResourceRequirements = 0x14,
6057 DevicePropertyAllocatedResources = 0x15,
6058 DevicePropertyContainerID = 0x16
6059 } DEVICE_REGISTRY_PROPERTY;
6060
6061 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
6062 EventCategoryReserved,
6063 EventCategoryHardwareProfileChange,
6064 EventCategoryDeviceInterfaceChange,
6065 EventCategoryTargetDeviceChange
6066 } IO_NOTIFICATION_EVENT_CATEGORY;
6067
6068 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
6069
6070 typedef NTSTATUS
6071 (DDKAPI *PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
6072 IN PVOID NotificationStructure,
6073 IN PVOID Context);
6074
6075 typedef VOID
6076 (DDKAPI *PDEVICE_CHANGE_COMPLETE_CALLBACK)(
6077 IN PVOID Context);
6078
6079 typedef enum _FILE_INFORMATION_CLASS {
6080 FileDirectoryInformation = 1,
6081 FileFullDirectoryInformation,
6082 FileBothDirectoryInformation,
6083 FileBasicInformation,
6084 FileStandardInformation,
6085 FileInternalInformation,
6086 FileEaInformation,
6087 FileAccessInformation,
6088 FileNameInformation,
6089 FileRenameInformation,
6090 FileLinkInformation,
6091 FileNamesInformation,
6092 FileDispositionInformation,
6093 FilePositionInformation,
6094 FileFullEaInformation,
6095 FileModeInformation,
6096 FileAlignmentInformation,
6097 FileAllInformation,
6098 FileAllocationInformation,
6099 FileEndOfFileInformation,
6100 FileAlternateNameInformation,
6101 FileStreamInformation,
6102 FilePipeInformation,
6103 FilePipeLocalInformation,
6104 FilePipeRemoteInformation,
6105 FileMailslotQueryInformation,
6106 FileMailslotSetInformation,
6107 FileCompressionInformation,
6108 FileObjectIdInformation,
6109 FileCompletionInformation,
6110 FileMoveClusterInformation,
6111 FileQuotaInformation,
6112 FileReparsePointInformation,
6113 FileNetworkOpenInformation,
6114 FileAttributeTagInformation,
6115 FileTrackingInformation,
6116 FileIdBothDirectoryInformation,
6117 FileIdFullDirectoryInformation,
6118 FileValidDataLengthInformation,
6119 FileShortNameInformation,
6120 FileIoCompletionNotificationInformation,
6121 FileIoStatusBlockRangeInformation,
6122 FileIoPriorityHintInformation,
6123 FileSfioReserveInformation,
6124 FileSfioVolumeInformation,
6125 FileHardLinkInformation,
6126 FileProcessIdsUsingFileInformation,
6127 FileNormalizedNameInformation,
6128 FileNetworkPhysicalNameInformation,
6129 FileIdGlobalTxDirectoryInformation,
6130 FileIsRemoteDeviceInformation,
6131 FileAttributeCacheInformation,
6132 FileNumaNodeInformation,
6133 FileStandardLinkInformation,
6134 FileRemoteProtocolInformation,
6135 FileMaximumInformation
6136 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
6137
6138 typedef struct _FILE_POSITION_INFORMATION {
6139 LARGE_INTEGER CurrentByteOffset;
6140 } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
6141
6142 #include <pshpack8.h>
6143 typedef struct _FILE_BASIC_INFORMATION {
6144 LARGE_INTEGER CreationTime;
6145 LARGE_INTEGER LastAccessTime;
6146 LARGE_INTEGER LastWriteTime;
6147 LARGE_INTEGER ChangeTime;
6148 ULONG FileAttributes;
6149 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
6150 #include <poppack.h>
6151
6152 typedef struct _FILE_STANDARD_INFORMATION {
6153 LARGE_INTEGER AllocationSize;
6154 LARGE_INTEGER EndOfFile;
6155 ULONG NumberOfLinks;
6156 BOOLEAN DeletePending;
6157 BOOLEAN Directory;
6158 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
6159
6160 typedef struct _FILE_NETWORK_OPEN_INFORMATION {
6161 LARGE_INTEGER CreationTime;
6162 LARGE_INTEGER LastAccessTime;
6163 LARGE_INTEGER LastWriteTime;
6164 LARGE_INTEGER ChangeTime;
6165 LARGE_INTEGER AllocationSize;
6166 LARGE_INTEGER EndOfFile;
6167 ULONG FileAttributes;
6168 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
6169
6170 typedef enum _FSINFOCLASS {
6171 FileFsVolumeInformation = 1,
6172 FileFsLabelInformation,
6173 FileFsSizeInformation,
6174 FileFsDeviceInformation,
6175 FileFsAttributeInformation,
6176 FileFsControlInformation,
6177 FileFsFullSizeInformation,
6178 FileFsObjectIdInformation,
6179 FileFsDriverPathInformation,
6180 FileFsVolumeFlagsInformation,
6181 FileFsMaximumInformation
6182 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
6183
6184 typedef struct _FILE_FS_DEVICE_INFORMATION {
6185 DEVICE_TYPE DeviceType;
6186 ULONG Characteristics;
6187 } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
6188
6189 typedef struct _FILE_FULL_EA_INFORMATION {
6190 ULONG NextEntryOffset;
6191 UCHAR Flags;
6192 UCHAR EaNameLength;
6193 USHORT EaValueLength;
6194 CHAR EaName[1];
6195 } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
6196
6197 #define FM_LOCK_BIT (0x1)
6198 #define FM_LOCK_BIT_V (0x0)
6199 #define FM_LOCK_WAITER_WOKEN (0x2)
6200 #define FM_LOCK_WAITER_INC (0x4)
6201
6202 typedef struct _FAST_MUTEX {
6203 volatile LONG Count;
6204 PKTHREAD Owner;
6205 ULONG Contention;
6206 KEVENT Event;
6207 ULONG OldIrql;
6208 } FAST_MUTEX, *PFAST_MUTEX;
6209
6210 typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD;
6211
6212 typedef struct _OWNER_ENTRY {
6213 ERESOURCE_THREAD OwnerThread;
6214 _ANONYMOUS_UNION union {
6215 LONG OwnerCount;
6216 ULONG TableSize;
6217 } DUMMYUNIONNAME;
6218 } OWNER_ENTRY, *POWNER_ENTRY;
6219
6220 typedef struct _ERESOURCE
6221 {
6222 LIST_ENTRY SystemResourcesList;
6223 POWNER_ENTRY OwnerTable;
6224 SHORT ActiveCount;
6225 USHORT Flag;
6226 volatile PKSEMAPHORE SharedWaiters;
6227 volatile PKEVENT ExclusiveWaiters;
6228 OWNER_ENTRY OwnerEntry;
6229 ULONG ActiveEntries;
6230 ULONG ContentionCount;
6231 ULONG NumberOfSharedWaiters;
6232 ULONG NumberOfExclusiveWaiters;
6233 __GNU_EXTENSION union
6234 {
6235 PVOID Address;
6236 ULONG_PTR CreatorBackTraceIndex;
6237 };
6238 KSPIN_LOCK SpinLock;
6239 } ERESOURCE, *PERESOURCE;
6240
6241 /* ERESOURCE.Flag */
6242 #define ResourceNeverExclusive 0x0010
6243 #define ResourceReleaseByOtherThread 0x0020
6244 #define ResourceOwnedExclusive 0x0080
6245
6246 #define RESOURCE_HASH_TABLE_SIZE 64
6247
6248 typedef BOOLEAN
6249 (DDKAPI *PFAST_IO_CHECK_IF_POSSIBLE)(
6250 IN struct _FILE_OBJECT *FileObject,
6251 IN PLARGE_INTEGER FileOffset,
6252 IN ULONG Length,
6253 IN BOOLEAN Wait,
6254 IN ULONG LockKey,
6255 IN BOOLEAN CheckForReadOperation,
6256 OUT PIO_STATUS_BLOCK IoStatus,
6257 IN struct _DEVICE_OBJECT *DeviceObject);
6258
6259 typedef BOOLEAN
6260 (DDKAPI *PFAST_IO_READ)(
6261 IN struct _FILE_OBJECT *FileObject,
6262 IN PLARGE_INTEGER FileOffset,
6263 IN ULONG Length,
6264 IN BOOLEAN Wait,
6265 IN ULONG LockKey,
6266 OUT PVOID Buffer,
6267 OUT PIO_STATUS_BLOCK IoStatus,
6268 IN struct _DEVICE_OBJECT *DeviceObject);
6269
6270 typedef BOOLEAN
6271 (DDKAPI *PFAST_IO_WRITE)(
6272 IN struct _FILE_OBJECT *FileObject,
6273 IN PLARGE_INTEGER FileOffset,
6274 IN ULONG Length,
6275 IN BOOLEAN Wait,
6276 IN ULONG LockKey,
6277 IN PVOID Buffer,
6278 OUT PIO_STATUS_BLOCK IoStatus,
6279 IN struct _DEVICE_OBJECT *DeviceObject);
6280
6281 typedef BOOLEAN
6282 (DDKAPI *PFAST_IO_QUERY_BASIC_INFO)(
6283 IN struct _FILE_OBJECT *FileObject,
6284 IN BOOLEAN Wait,
6285 OUT PFILE_BASIC_INFORMATION Buffer,
6286 OUT PIO_STATUS_BLOCK IoStatus,
6287 IN struct _DEVICE_OBJECT *DeviceObject);
6288
6289 typedef BOOLEAN
6290 (DDKAPI *PFAST_IO_QUERY_STANDARD_INFO)(
6291 IN struct _FILE_OBJECT *FileObject,
6292 IN BOOLEAN Wait,
6293 OUT PFILE_STANDARD_INFORMATION Buffer,
6294 OUT PIO_STATUS_BLOCK IoStatus,
6295 IN struct _DEVICE_OBJECT *DeviceObject);
6296
6297 typedef BOOLEAN
6298 (DDKAPI *PFAST_IO_LOCK)(
6299 IN struct _FILE_OBJECT *FileObject,
6300 IN PLARGE_INTEGER FileOffset,
6301 IN PLARGE_INTEGER Length,
6302 PEPROCESS ProcessId,
6303 ULONG Key,
6304 BOOLEAN FailImmediately,
6305 BOOLEAN ExclusiveLock,
6306 OUT PIO_STATUS_BLOCK IoStatus,
6307 IN struct _DEVICE_OBJECT *DeviceObject);
6308
6309 typedef BOOLEAN
6310 (DDKAPI *PFAST_IO_UNLOCK_SINGLE)(
6311 IN struct _FILE_OBJECT *FileObject,
6312 IN PLARGE_INTEGER FileOffset,
6313 IN PLARGE_INTEGER Length,
6314 PEPROCESS ProcessId,
6315 ULONG Key,
6316 OUT PIO_STATUS_BLOCK IoStatus,
6317 IN struct _DEVICE_OBJECT *DeviceObject);
6318
6319 typedef BOOLEAN
6320 (DDKAPI *PFAST_IO_UNLOCK_ALL)(
6321 IN struct _FILE_OBJECT *FileObject,
6322 PEPROCESS ProcessId,
6323 OUT PIO_STATUS_BLOCK IoStatus,
6324 IN struct _DEVICE_OBJECT *DeviceObject);
6325
6326 typedef BOOLEAN
6327 (DDKAPI *PFAST_IO_UNLOCK_ALL_BY_KEY)(
6328 IN struct _FILE_OBJECT *FileObject,
6329 PVOID ProcessId,
6330 ULONG Key,
6331 OUT PIO_STATUS_BLOCK IoStatus,
6332 IN struct _DEVICE_OBJECT *DeviceObject);
6333
6334 typedef BOOLEAN
6335 (DDKAPI *PFAST_IO_DEVICE_CONTROL)(
6336 IN struct _FILE_OBJECT *FileObject,
6337 IN BOOLEAN Wait,
6338 IN PVOID InputBuffer OPTIONAL,
6339 IN ULONG InputBufferLength,
6340 OUT PVOID OutputBuffer OPTIONAL,
6341 IN ULONG OutputBufferLength,
6342 IN ULONG IoControlCode,
6343 OUT PIO_STATUS_BLOCK IoStatus,
6344 IN struct _DEVICE_OBJECT *DeviceObject);
6345
6346 typedef VOID
6347 (DDKAPI *PFAST_IO_ACQUIRE_FILE)(
6348 IN struct _FILE_OBJECT *FileObject);
6349
6350 typedef VOID
6351 (DDKAPI *PFAST_IO_RELEASE_FILE)(
6352 IN struct _FILE_OBJECT *FileObject);
6353
6354 typedef VOID
6355 (DDKAPI *PFAST_IO_DETACH_DEVICE)(
6356 IN struct _DEVICE_OBJECT *SourceDevice,
6357 IN struct _DEVICE_OBJECT *TargetDevice);
6358
6359 typedef BOOLEAN
6360 (DDKAPI *PFAST_IO_QUERY_NETWORK_OPEN_INFO)(
6361 IN struct _FILE_OBJECT *FileObject,
6362 IN BOOLEAN Wait,
6363 OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
6364 OUT struct _IO_STATUS_BLOCK *IoStatus,
6365 IN struct _DEVICE_OBJECT *DeviceObject);
6366
6367 typedef NTSTATUS
6368 (DDKAPI *PFAST_IO_ACQUIRE_FOR_MOD_WRITE)(
6369 IN struct _FILE_OBJECT *FileObject,
6370 IN PLARGE_INTEGER EndingOffset,
6371 OUT struct _ERESOURCE **ResourceToRelease,
6372 IN struct _DEVICE_OBJECT *DeviceObject);
6373
6374 typedef BOOLEAN
6375 (DDKAPI *PFAST_IO_MDL_READ)(
6376 IN struct _FILE_OBJECT *FileObject,
6377 IN PLARGE_INTEGER FileOffset,
6378 IN ULONG Length,
6379 IN ULONG LockKey,
6380 OUT PMDL *MdlChain,
6381 OUT PIO_STATUS_BLOCK IoStatus,
6382 IN struct _DEVICE_OBJECT *DeviceObject);
6383
6384 typedef BOOLEAN
6385 (DDKAPI *PFAST_IO_MDL_READ_COMPLETE)(
6386 IN struct _FILE_OBJECT *FileObject,
6387 IN PMDL MdlChain,
6388 IN struct _DEVICE_OBJECT *DeviceObject);
6389
6390 typedef BOOLEAN
6391 (DDKAPI *PFAST_IO_PREPARE_MDL_WRITE)(
6392 IN struct _FILE_OBJECT *FileObject,
6393 IN PLARGE_INTEGER FileOffset,
6394 IN ULONG Length,
6395 IN ULONG LockKey,
6396 OUT PMDL *MdlChain,
6397 OUT PIO_STATUS_BLOCK IoStatus,
6398 IN struct _DEVICE_OBJECT *DeviceObject);
6399
6400 typedef BOOLEAN
6401 (DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE)(
6402 IN struct _FILE_OBJECT *FileObject,
6403 IN PLARGE_INTEGER FileOffset,
6404 IN PMDL MdlChain,
6405 IN struct _DEVICE_OBJECT *DeviceObject);
6406
6407 typedef BOOLEAN
6408 (DDKAPI *PFAST_IO_READ_COMPRESSED)(
6409 IN struct _FILE_OBJECT *FileObject,
6410 IN PLARGE_INTEGER FileOffset,
6411 IN ULONG Length,
6412 IN ULONG LockKey,
6413 OUT PVOID Buffer,
6414 OUT PMDL *MdlChain,
6415 OUT PIO_STATUS_BLOCK IoStatus,
6416 OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
6417 IN ULONG CompressedDataInfoLength,
6418 IN struct _DEVICE_OBJECT *DeviceObject);
6419
6420 typedef BOOLEAN
6421 (DDKAPI *PFAST_IO_WRITE_COMPRESSED)(
6422 IN struct _FILE_OBJECT *FileObject,
6423 IN PLARGE_INTEGER FileOffset,
6424 IN ULONG Length,
6425 IN ULONG LockKey,
6426 IN PVOID Buffer,
6427 OUT PMDL *MdlChain,
6428 OUT PIO_STATUS_BLOCK IoStatus,
6429 IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
6430 IN ULONG CompressedDataInfoLength,
6431 IN struct _DEVICE_OBJECT *DeviceObject);
6432
6433 typedef BOOLEAN
6434 (DDKAPI *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
6435 IN struct _FILE_OBJECT *FileObject,
6436 IN PMDL MdlChain,
6437 IN struct _DEVICE_OBJECT *DeviceObject);
6438
6439 typedef BOOLEAN
6440 (DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
6441 IN struct _FILE_OBJECT *FileObject,
6442 IN PLARGE_INTEGER FileOffset,
6443 IN PMDL MdlChain,
6444 IN struct _DEVICE_OBJECT *DeviceObject);
6445
6446 typedef BOOLEAN
6447 (DDKAPI *PFAST_IO_QUERY_OPEN)(
6448 IN struct _IRP *Irp,
6449 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
6450 IN struct _DEVICE_OBJECT *DeviceObject);
6451
6452 typedef NTSTATUS
6453 (DDKAPI *PFAST_IO_RELEASE_FOR_MOD_WRITE)(
6454 IN struct _FILE_OBJECT *FileObject,
6455 IN struct _ERESOURCE *ResourceToRelease,
6456 IN struct _DEVICE_OBJECT *DeviceObject);
6457
6458 typedef NTSTATUS
6459 (DDKAPI *PFAST_IO_ACQUIRE_FOR_CCFLUSH)(
6460 IN struct _FILE_OBJECT *FileObject,
6461 IN struct _DEVICE_OBJECT *DeviceObject);
6462
6463 typedef NTSTATUS
6464 (DDKAPI *PFAST_IO_RELEASE_FOR_CCFLUSH) (
6465 IN struct _FILE_OBJECT *FileObject,
6466 IN struct _DEVICE_OBJECT *DeviceObject);
6467
6468 typedef struct _FAST_IO_DISPATCH {
6469 ULONG SizeOfFastIoDispatch;
6470 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible;
6471 PFAST_IO_READ FastIoRead;
6472 PFAST_IO_WRITE FastIoWrite;
6473 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo;
6474 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo;
6475 PFAST_IO_LOCK FastIoLock;
6476 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle;
6477 PFAST_IO_UNLOCK_ALL FastIoUnlockAll;
6478 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey;
6479 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl;
6480 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection;
6481 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection;
6482 PFAST_IO_DETACH_DEVICE FastIoDetachDevice;
6483 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo;
6484 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite;
6485 PFAST_IO_MDL_READ MdlRead;
6486 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete;
6487 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite;
6488 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete;
6489 PFAST_IO_READ_COMPRESSED FastIoReadCompressed;
6490 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed;
6491 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed;
6492 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed;
6493 PFAST_IO_QUERY_OPEN FastIoQueryOpen;
6494 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite;
6495 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush;
6496 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush;
6497 } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
6498
6499 typedef struct _SECTION_OBJECT_POINTERS {
6500 PVOID DataSectionObject;
6501 PVOID SharedCacheMap;
6502 PVOID ImageSectionObject;
6503 } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
6504
6505 typedef struct _IO_COMPLETION_CONTEXT {
6506 PVOID Port;
6507 PVOID Key;
6508 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
6509
6510 /* FILE_OBJECT.Flags */
6511 #define FO_FILE_OPEN 0x00000001
6512 #define FO_SYNCHRONOUS_IO 0x00000002
6513 #define FO_ALERTABLE_IO 0x00000004
6514 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
6515 #define FO_WRITE_THROUGH 0x00000010
6516 #define FO_SEQUENTIAL_ONLY 0x00000020
6517 #define FO_CACHE_SUPPORTED 0x00000040
6518 #define FO_NAMED_PIPE 0x00000080
6519 #define FO_STREAM_FILE 0x00000100
6520 #define FO_MAILSLOT 0x00000200
6521 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
6522 #define FO_QUEUE_IRP_TO_THREAD 0x00000400
6523 #define FO_DIRECT_DEVICE_OPEN 0x00000800
6524 #define FO_FILE_MODIFIED 0x00001000
6525 #define FO_FILE_SIZE_CHANGED 0x00002000
6526 #define FO_CLEANUP_COMPLETE 0x00004000
6527 #define FO_TEMPORARY_FILE 0x00008000
6528 #define FO_DELETE_ON_CLOSE 0x00010000
6529 #define FO_OPENED_CASE_SENSITIVE 0x00020000
6530 #define FO_HANDLE_CREATED 0x00040000
6531 #define FO_FILE_FAST_IO_READ 0x00080000
6532 #define FO_RANDOM_ACCESS 0x00100000
6533 #define FO_FILE_OPEN_CANCELLED 0x00200000
6534 #define FO_VOLUME_OPEN 0x00400000
6535 #define FO_REMOTE_ORIGIN 0x01000000
6536 #define FO_DISALLOW_EXCLUSIVE 0x02000000
6537 #define FO_SKIP_COMPLETION_PORT 0x02000000
6538 #define FO_SKIP_SET_EVENT 0x04000000
6539 #define FO_SKIP_SET_FAST_IO 0x08000000
6540
6541 /* VPB.Flags */
6542 #define VPB_MOUNTED 0x0001
6543 #define VPB_LOCKED 0x0002
6544 #define VPB_PERSISTENT 0x0004
6545 #define VPB_REMOVE_PENDING 0x0008
6546 #define VPB_RAW_MOUNT 0x0010
6547 #define VPB_DIRECT_WRITES_ALLOWED 0x0020
6548
6549 /* IRP.Flags */
6550
6551 #define SL_FORCE_ACCESS_CHECK 0x01
6552 #define SL_OPEN_PAGING_FILE 0x02
6553 #define SL_OPEN_TARGET_DIRECTORY 0x04
6554 #define SL_CASE_SENSITIVE 0x80
6555
6556 #define SL_KEY_SPECIFIED 0x01
6557 #define SL_OVERRIDE_VERIFY_VOLUME 0x02
6558 #define SL_WRITE_THROUGH 0x04
6559 #define SL_FT_SEQUENTIAL_WRITE 0x08
6560
6561 #define SL_FAIL_IMMEDIATELY 0x01
6562 #define SL_EXCLUSIVE_LOCK 0x02
6563
6564 #define SL_RESTART_SCAN 0x01
6565 #define SL_RETURN_SINGLE_ENTRY 0x02
6566 #define SL_INDEX_SPECIFIED 0x04
6567
6568 #define SL_WATCH_TREE 0x01
6569
6570 #define SL_ALLOW_RAW_MOUNT 0x01
6571
6572 #define CTL_CODE(DeviceType, Function, Method, Access)( \
6573 ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
6574
6575 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
6576
6577 #define IRP_NOCACHE 0x00000001
6578 #define IRP_PAGING_IO 0x00000002
6579 #define IRP_MOUNT_COMPLETION 0x00000002
6580 #define IRP_SYNCHRONOUS_API 0x00000004
6581 #define IRP_ASSOCIATED_IRP 0x00000008
6582 #define IRP_BUFFERED_IO 0x00000010
6583 #define IRP_DEALLOCATE_BUFFER 0x00000020
6584 #define IRP_INPUT_OPERATION 0x00000040
6585 #define IRP_SYNCHRONOUS_PAGING_IO 0x00000040
6586 #define IRP_CREATE_OPERATION 0x00000080
6587 #define IRP_READ_OPERATION 0x00000100
6588 #define IRP_WRITE_OPERATION 0x00000200
6589 #define IRP_CLOSE_OPERATION 0x00000400
6590 #define IRP_DEFER_IO_COMPLETION 0x00000800
6591 #define IRP_OB_QUERY_NAME 0x00001000
6592 #define IRP_HOLD_DEVICE_QUEUE 0x00002000
6593
6594 #define IRP_QUOTA_CHARGED 0x01
6595 #define IRP_ALLOCATED_MUST_SUCCEED 0x02
6596 #define IRP_ALLOCATED_FIXED_SIZE 0x04
6597 #define IRP_LOOKASIDE_ALLOCATION 0x08
6598
6599 /*
6600 ** IRP function codes
6601 */
6602
6603 #define IRP_MJ_CREATE 0x00
6604 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
6605 #define IRP_MJ_CLOSE 0x02
6606 #define IRP_MJ_READ 0x03
6607 #define IRP_MJ_WRITE 0x04
6608 #define IRP_MJ_QUERY_INFORMATION 0x05
6609 #define IRP_MJ_SET_INFORMATION 0x06
6610 #define IRP_MJ_QUERY_EA 0x07
6611 #define IRP_MJ_SET_EA 0x08
6612 #define IRP_MJ_FLUSH_BUFFERS 0x09
6613 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
6614 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
6615 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
6616 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
6617 #define IRP_MJ_DEVICE_CONTROL 0x0e
6618 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
6619 #define IRP_MJ_SCSI 0x0f
6620 #define IRP_MJ_SHUTDOWN 0x10
6621 #define IRP_MJ_LOCK_CONTROL 0x11
6622 #define IRP_MJ_CLEANUP 0x12
6623 #define IRP_MJ_CREATE_MAILSLOT 0x13
6624 #define IRP_MJ_QUERY_SECURITY 0x14
6625 #define IRP_MJ_SET_SECURITY 0x15
6626 #define IRP_MJ_POWER 0x16
6627 #define IRP_MJ_SYSTEM_CONTROL 0x17
6628 #define IRP_MJ_DEVICE_CHANGE 0x18
6629 #define IRP_MJ_QUERY_QUOTA 0x19
6630 #define IRP_MJ_SET_QUOTA 0x1a
6631 #define IRP_MJ_PNP 0x1b
6632 #define IRP_MJ_PNP_POWER 0x1b
6633 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
6634
6635 #define IRP_MN_SCSI_CLASS 0x01
6636
6637 #define IRP_MN_START_DEVICE 0x00
6638 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
6639 #define IRP_MN_REMOVE_DEVICE 0x02
6640 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
6641 #define IRP_MN_STOP_DEVICE 0x04
6642 #define IRP_MN_QUERY_STOP_DEVICE 0x05
6643 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
6644
6645 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
6646 #define IRP_MN_QUERY_INTERFACE 0x08
6647 #define IRP_MN_QUERY_CAPABILITIES 0x09
6648 #define IRP_MN_QUERY_RESOURCES 0x0A
6649 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
6650 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
6651 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
6652
6653 #define IRP_MN_READ_CONFIG 0x0F
6654 #define IRP_MN_WRITE_CONFIG 0x10
6655 #define IRP_MN_EJECT 0x11
6656 #define IRP_MN_SET_LOCK 0x12
6657 #define IRP_MN_QUERY_ID 0x13
6658 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
6659 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
6660 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
6661 #define IRP_MN_SURPRISE_REMOVAL 0x17
6662
6663 #define IRP_MN_WAIT_WAKE 0x00
6664 #define IRP_MN_POWER_SEQUENCE 0x01
6665 #define IRP_MN_SET_POWER 0x02
6666 #define IRP_MN_QUERY_POWER 0x03
6667
6668 #define IRP_MN_QUERY_ALL_DATA 0x00
6669 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
6670 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
6671 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
6672 #define IRP_MN_ENABLE_EVENTS 0x04
6673 #define IRP_MN_DISABLE_EVENTS 0x05
6674 #define IRP_MN_ENABLE_COLLECTION 0x06
6675 #define IRP_MN_DISABLE_COLLECTION 0x07
6676 #define IRP_MN_REGINFO 0x08
6677 #define IRP_MN_EXECUTE_METHOD 0x09
6678
6679 #define IRP_MN_REGINFO_EX 0x0b
6680
6681 typedef struct _FILE_OBJECT
6682 {
6683 CSHORT Type;
6684 CSHORT Size;
6685 PDEVICE_OBJECT DeviceObject;
6686 PVPB Vpb;
6687 PVOID FsContext;
6688 PVOID FsContext2;
6689 PSECTION_OBJECT_POINTERS SectionObjectPointer;
6690 PVOID PrivateCacheMap;
6691 NTSTATUS FinalStatus;
6692 struct _FILE_OBJECT *RelatedFileObject;
6693 BOOLEAN LockOperation;
6694 BOOLEAN DeletePending;
6695 BOOLEAN ReadAccess;
6696 BOOLEAN WriteAccess;
6697 BOOLEAN DeleteAccess;
6698 BOOLEAN SharedRead;
6699 BOOLEAN SharedWrite;
6700 BOOLEAN SharedDelete;
6701 ULONG Flags;
6702 UNICODE_STRING FileName;
6703 LARGE_INTEGER CurrentByteOffset;
6704 volatile ULONG Waiters;
6705 volatile ULONG Busy;
6706 PVOID LastLock;
6707 KEVENT Lock;
6708 KEVENT Event;
6709 volatile PIO_COMPLETION_CONTEXT CompletionContext;
6710 KSPIN_LOCK IrpListLock;
6711 LIST_ENTRY IrpList;
6712 volatile PVOID FileObjectExtension;
6713 } FILE_OBJECT, *PFILE_OBJECT;
6714
6715 typedef struct _IO_ERROR_LOG_PACKET {
6716 UCHAR MajorFunctionCode;
6717 UCHAR RetryCount;
6718 USHORT DumpDataSize;
6719 USHORT NumberOfStrings;
6720 USHORT StringOffset;
6721 USHORT EventCategory;
6722 NTSTATUS ErrorCode;
6723 ULONG UniqueErrorValue;
6724 NTSTATUS FinalStatus;
6725 ULONG SequenceNumber;
6726 ULONG IoControlCode;
6727 LARGE_INTEGER DeviceOffset;
6728 ULONG DumpData[1];
6729 } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
6730
6731 typedef struct _IO_ERROR_LOG_MESSAGE {
6732 USHORT Type;
6733 USHORT Size;
6734 USHORT DriverNameLength;
6735 LARGE_INTEGER TimeStamp;
6736 ULONG DriverNameOffset;
6737 IO_ERROR_LOG_PACKET EntryData;
6738 } IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
6739
6740 #define ERROR_LOG_LIMIT_SIZE 240
6741 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
6742 sizeof(IO_ERROR_LOG_PACKET) + \
6743 (sizeof(WCHAR) * 40))
6744 #define ERROR_LOG_MESSAGE_LIMIT_SIZE \
6745 (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
6746 #define IO_ERROR_LOG_MESSAGE_LENGTH \
6747 ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \
6748 ERROR_LOG_MESSAGE_LIMIT_SIZE : \
6749 PORT_MAXIMUM_MESSAGE_LENGTH)
6750 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \
6751 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
6752
6753 typedef enum _DMA_WIDTH {
6754 Width8Bits,
6755 Width16Bits,
6756 Width32Bits,
6757 MaximumDmaWidth
6758 } DMA_WIDTH, *PDMA_WIDTH;
6759
6760 typedef enum _DMA_SPEED {
6761 Compatible,
6762 TypeA,
6763 TypeB,
6764 TypeC,
6765 TypeF,
6766 MaximumDmaSpeed
6767 } DMA_SPEED, *PDMA_SPEED;
6768
6769 /* DEVICE_DESCRIPTION.Version */
6770
6771 #define DEVICE_DESCRIPTION_VERSION 0x0000
6772 #define DEVICE_DESCRIPTION_VERSION1 0x0001
6773 #define DEVICE_DESCRIPTION_VERSION2 0x0002
6774
6775 typedef struct _DEVICE_DESCRIPTION {
6776 ULONG Version;
6777 BOOLEAN Master;
6778 BOOLEAN ScatterGather;
6779 BOOLEAN DemandMode;
6780 BOOLEAN AutoInitialize;
6781 BOOLEAN Dma32BitAddresses;
6782 BOOLEAN IgnoreCount;
6783 BOOLEAN Reserved1;
6784 BOOLEAN Dma64BitAddresses;
6785 ULONG BusNumber;
6786 ULONG DmaChannel;
6787 INTERFACE_TYPE InterfaceType;
6788 DMA_WIDTH DmaWidth;
6789 DMA_SPEED DmaSpeed;
6790 ULONG MaximumLength;
6791 ULONG DmaPort;
6792 } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
6793
6794 typedef enum _DEVICE_RELATION_TYPE {
6795 BusRelations,
6796 EjectionRelations,
6797 PowerRelations,
6798 RemovalRelations,
6799 TargetDeviceRelation,
6800 SingleBusRelations,
6801 TransportRelations
6802 } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
6803
6804 typedef struct _DEVICE_RELATIONS {
6805 ULONG Count;
6806 PDEVICE_OBJECT Objects[1];
6807 } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
6808
6809 typedef struct _DEVOBJ_EXTENSION
6810 {
6811 CSHORT Type;
6812 USHORT Size;
6813 PDEVICE_OBJECT DeviceObject;
6814 } DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
6815
6816 typedef struct _SCATTER_GATHER_ELEMENT {
6817 PHYSICAL_ADDRESS Address;
6818 ULONG Length;
6819 ULONG_PTR Reserved;
6820 } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
6821
6822 #if defined(_MSC_EXTENSIONS)
6823
6824 #if _MSC_VER >= 1200
6825 #pragma warning(push)
6826 #endif
6827 #pragma warning(disable:4200)
6828 typedef struct _SCATTER_GATHER_LIST {
6829 ULONG NumberOfElements;
6830 ULONG_PTR Reserved;
6831 SCATTER_GATHER_ELEMENT Elements[1];
6832 } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
6833
6834 #if _MSC_VER >= 1200
6835 #pragma warning(pop)
6836 #else
6837 #pragma warning(default:4200)
6838 #endif
6839
6840 #else
6841
6842 struct _SCATTER_GATHER_LIST;
6843 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
6844
6845 #endif
6846
6847 typedef NTSTATUS
6848 (DDKAPI DRIVER_ADD_DEVICE)(
6849 IN struct _DRIVER_OBJECT *DriverObject,
6850 IN struct _DEVICE_OBJECT *PhysicalDeviceObject);
6851 typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
6852
6853 typedef struct _DRIVER_EXTENSION {
6854 struct _DRIVER_OBJECT *DriverObject;
6855 PDRIVER_ADD_DEVICE AddDevice;
6856 ULONG Count;
6857 UNICODE_STRING ServiceKeyName;
6858 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
6859
6860 #define DRVO_UNLOAD_INVOKED 0x00000001
6861 #define DRVO_LEGACY_DRIVER 0x00000002
6862 #define DRVO_BUILTIN_DRIVER 0x00000004
6863
6864 typedef NTSTATUS
6865 (DDKAPI DRIVER_INITIALIZE)(
6866 IN struct _DRIVER_OBJECT *DriverObject,
6867 IN PUNICODE_STRING RegistryPath);
6868 typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
6869
6870 typedef VOID
6871 (DDKAPI DRIVER_STARTIO)(
6872 IN struct _DEVICE_OBJECT *DeviceObject,
6873 IN struct _IRP *Irp);
6874 typedef DRIVER_STARTIO *PDRIVER_STARTIO;
6875
6876 typedef VOID
6877 (DDKAPI DRIVER_UNLOAD)(
6878 IN struct _DRIVER_OBJECT *DriverObject);
6879 typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
6880
6881 typedef NTSTATUS
6882 (DDKAPI DRIVER_DISPATCH)(
6883 IN struct _DEVICE_OBJECT *DeviceObject,
6884 IN struct _IRP *Irp);
6885 typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
6886
6887 typedef struct _DRIVER_OBJECT {
6888 CSHORT Type;
6889 CSHORT Size;
6890 PDEVICE_OBJECT DeviceObject;
6891 ULONG Flags;
6892 PVOID DriverStart;
6893 ULONG DriverSize;
6894 PVOID DriverSection;
6895 PDRIVER_EXTENSION DriverExtension;
6896 UNICODE_STRING DriverName;
6897 PUNICODE_STRING HardwareDatabase;
6898 struct _FAST_IO_DISPATCH *FastIoDispatch;
6899 PDRIVER_INITIALIZE DriverInit;
6900 PDRIVER_STARTIO DriverStartIo;
6901 PDRIVER_UNLOAD DriverUnload;
6902 PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
6903 } DRIVER_OBJECT;
6904 typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
6905
6906 typedef struct _DMA_ADAPTER {
6907 USHORT Version;
6908 USHORT Size;
6909 struct _DMA_OPERATIONS* DmaOperations;
6910 } DMA_ADAPTER, *PDMA_ADAPTER;
6911
6912 typedef VOID
6913 (DDKAPI *PPUT_DMA_ADAPTER)(
6914 IN PDMA_ADAPTER DmaAdapter);
6915
6916 typedef PVOID
6917 (DDKAPI *PALLOCATE_COMMON_BUFFER)(
6918 IN PDMA_ADAPTER DmaAdapter,
6919 IN ULONG Length,
6920 OUT PPHYSICAL_ADDRESS LogicalAddress,
6921 IN BOOLEAN CacheEnabled);
6922
6923 typedef VOID
6924 (DDKAPI *PFREE_COMMON_BUFFER)(
6925 IN PDMA_ADAPTER DmaAdapter,
6926 IN ULONG Length,
6927 IN PHYSICAL_ADDRESS LogicalAddress,
6928 IN PVOID VirtualAddress,
6929 IN BOOLEAN CacheEnabled);
6930
6931 typedef NTSTATUS
6932 (DDKAPI *PALLOCATE_ADAPTER_CHANNEL)(
6933 IN PDMA_ADAPTER DmaAdapter,
6934 IN PDEVICE_OBJECT DeviceObject,
6935 IN ULONG NumberOfMapRegisters,
6936 IN PDRIVER_CONTROL ExecutionRoutine,
6937 IN PVOID Context);
6938
6939 typedef BOOLEAN
6940 (DDKAPI *PFLUSH_ADAPTER_BUFFERS)(
6941 IN PDMA_ADAPTER DmaAdapter,
6942 IN PMDL Mdl,
6943 IN PVOID MapRegisterBase,
6944 IN PVOID CurrentVa,
6945 IN ULONG Length,
6946 IN BOOLEAN WriteToDevice);
6947
6948 typedef VOID
6949 (DDKAPI *PFREE_ADAPTER_CHANNEL)(
6950 IN PDMA_ADAPTER DmaAdapter);
6951
6952 typedef VOID
6953 (DDKAPI *PFREE_MAP_REGISTERS)(
6954 IN PDMA_ADAPTER DmaAdapter,
6955 PVOID MapRegisterBase,
6956 ULONG NumberOfMapRegisters);
6957
6958 typedef PHYSICAL_ADDRESS
6959 (DDKAPI *PMAP_TRANSFER)(
6960 IN PDMA_ADAPTER DmaAdapter,
6961 IN PMDL Mdl,
6962 IN PVOID MapRegisterBase,
6963 IN PVOID CurrentVa,
6964 IN OUT PULONG Length,
6965 IN BOOLEAN WriteToDevice);
6966
6967 typedef ULONG
6968 (DDKAPI *PGET_DMA_ALIGNMENT)(
6969 IN PDMA_ADAPTER DmaAdapter);
6970
6971 typedef ULONG
6972 (DDKAPI *PREAD_DMA_COUNTER)(
6973 IN PDMA_ADAPTER DmaAdapter);
6974
6975 typedef VOID
6976 (DDKAPI *PDRIVER_LIST_CONTROL)(
6977 IN struct _DEVICE_OBJECT *DeviceObject,
6978 IN struct _IRP *Irp,
6979 IN struct _SCATTER_GATHER_LIST *ScatterGather,
6980 IN PVOID Context);
6981
6982 typedef NTSTATUS
6983 (DDKAPI *PGET_SCATTER_GATHER_LIST)(
6984 IN PDMA_ADAPTER DmaAdapter,
6985 IN PDEVICE_OBJECT DeviceObject,
6986 IN PMDL Mdl,
6987 IN PVOID CurrentVa,
6988 IN ULONG Length,
6989 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
6990 IN PVOID Context,
6991 IN BOOLEAN WriteToDevice);
6992
6993 typedef VOID
6994 (DDKAPI *PPUT_SCATTER_GATHER_LIST)(
6995 IN PDMA_ADAPTER DmaAdapter,
6996 IN PSCATTER_GATHER_LIST ScatterGather,
6997 IN BOOLEAN WriteToDevice);
6998
6999 typedef NTSTATUS
7000 (DDKAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
7001 IN PDMA_ADAPTER DmaAdapter,
7002 IN PMDL Mdl OPTIONAL,
7003 IN PVOID CurrentVa,
7004 IN ULONG Length,
7005 OUT PULONG ScatterGatherListSize,
7006 OUT PULONG pNumberOfMapRegisters OPTIONAL);
7007
7008 typedef NTSTATUS
7009 (DDKAPI *PBUILD_SCATTER_GATHER_LIST)(
7010 IN PDMA_ADAPTER DmaAdapter,
7011 IN PDEVICE_OBJECT DeviceObject,
7012 IN PMDL Mdl,
7013 IN PVOID CurrentVa,
7014 IN ULONG Length,
7015 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
7016 IN PVOID Context,
7017 IN BOOLEAN WriteToDevice,
7018 IN PVOID ScatterGatherBuffer,
7019 IN ULONG ScatterGatherLength);
7020
7021 typedef NTSTATUS
7022 (DDKAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
7023 IN PDMA_ADAPTER DmaAdapter,
7024 IN PSCATTER_GATHER_LIST ScatterGather,
7025 IN PMDL OriginalMdl,
7026 OUT PMDL *TargetMdl);
7027
7028 typedef struct _DMA_OPERATIONS {
7029 ULONG Size;
7030 PPUT_DMA_ADAPTER PutDmaAdapter;
7031 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
7032 PFREE_COMMON_BUFFER FreeCommonBuffer;
7033 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
7034 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
7035 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
7036 PFREE_MAP_REGISTERS FreeMapRegisters;
7037 PMAP_TRANSFER MapTransfer;
7038 PGET_DMA_ALIGNMENT GetDmaAlignment;
7039 PREAD_DMA_COUNTER ReadDmaCounter;
7040 PGET_SCATTER_GATHER_LIST GetScatterGatherList;
7041 PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
7042 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList;
7043 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList;
7044 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList;
7045 } DMA_OPERATIONS, *PDMA_OPERATIONS;
7046
7047 typedef struct _IO_RESOURCE_DESCRIPTOR {
7048 UCHAR Option;
7049 UCHAR Type;
7050 UCHAR ShareDisposition;
7051 UCHAR Spare1;
7052 USHORT Flags;
7053 USHORT Spare2;
7054 union {
7055 struct {
7056 ULONG Length;
7057 ULONG Alignment;
7058 PHYSICAL_ADDRESS MinimumAddress;
7059 PHYSICAL_ADDRESS MaximumAddress;
7060 } Port;
7061 struct {
7062 ULONG Length;
7063 ULONG Alignment;
7064 PHYSICAL_ADDRESS MinimumAddress;
7065 PHYSICAL_ADDRESS MaximumAddress;
7066 } Memory;
7067 struct {
7068 ULONG MinimumVector;
7069 ULONG MaximumVector;
7070 } Interrupt;
7071 struct {
7072 ULONG MinimumChannel;
7073 ULONG MaximumChannel;
7074 } Dma;
7075 struct {
7076 ULONG Length;
7077 ULONG Alignment;
7078 PHYSICAL_ADDRESS MinimumAddress;
7079 PHYSICAL_ADDRESS MaximumAddress;
7080 } Generic;
7081 struct {
7082 ULONG Data[3];
7083 } DevicePrivate;
7084 struct {
7085 ULONG Length;
7086 ULONG MinBusNumber;
7087 ULONG MaxBusNumber;
7088 ULONG Reserved;
7089 } BusNumber;
7090 struct {
7091 ULONG Priority;
7092 ULONG Reserved1;
7093 ULONG Reserved2;
7094 } ConfigData;
7095 } u;
7096 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
7097
7098 typedef struct _IO_RESOURCE_LIST {
7099 USHORT Version;
7100 USHORT Revision;
7101 ULONG Count;
7102 IO_RESOURCE_DESCRIPTOR Descriptors[1];
7103 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
7104
7105 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
7106 ULONG ListSize;
7107 INTERFACE_TYPE InterfaceType;
7108 ULONG BusNumber;
7109 ULONG SlotNumber;
7110 ULONG Reserved[3];
7111 ULONG AlternativeLists;
7112 IO_RESOURCE_LIST List[1];
7113 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
7114
7115 typedef VOID
7116 (DDKAPI DRIVER_CANCEL)(
7117 IN struct _DEVICE_OBJECT *DeviceObject,
7118 IN struct _IRP *Irp);
7119 typedef DRIVER_CANCEL *PDRIVER_CANCEL;
7120
7121 typedef struct _IRP {
7122 CSHORT Type;
7123 USHORT Size;
7124 struct _MDL *MdlAddress;
7125 ULONG Flags;
7126 union {
7127 struct _IRP *MasterIrp;
7128 volatile LONG IrpCount;
7129 PVOID SystemBuffer;
7130 } AssociatedIrp;
7131 LIST_ENTRY ThreadListEntry;
7132 IO_STATUS_BLOCK IoStatus;
7133 KPROCESSOR_MODE RequestorMode;
7134 BOOLEAN PendingReturned;
7135 CHAR StackCount;
7136 CHAR CurrentLocation;
7137 BOOLEAN Cancel;
7138 KIRQL CancelIrql;
7139 CCHAR ApcEnvironment;
7140 UCHAR AllocationFlags;
7141 PIO_STATUS_BLOCK UserIosb;
7142 PKEVENT UserEvent;
7143 union {
7144 struct {
7145 _ANONYMOUS_UNION union {
7146 PIO_APC_ROUTINE UserApcRoutine;
7147 PVOID IssuingProcess;
7148 } DUMMYUNIONNAME;
7149 PVOID UserApcContext;
7150 } AsynchronousParameters;
7151 LARGE_INTEGER AllocationSize;
7152 } Overlay;
7153 volatile PDRIVER_CANCEL CancelRoutine;
7154 PVOID UserBuffer;
7155 union {
7156 struct {
7157 _ANONYMOUS_UNION union {
7158 KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
7159 _ANONYMOUS_STRUCT struct {
7160 PVOID DriverContext[4];
7161 } DUMMYSTRUCTNAME;
7162 } DUMMYUNIONNAME;
7163 PETHREAD Thread;
7164 PCHAR AuxiliaryBuffer;
7165 _ANONYMOUS_STRUCT struct {
7166 LIST_ENTRY ListEntry;
7167 _ANONYMOUS_UNION union {
7168 struct _IO_STACK_LOCATION *CurrentStackLocation;
7169 ULONG PacketType;
7170 } DUMMYUNIONNAME;
7171 } DUMMYSTRUCTNAME;
7172 struct _FILE_OBJECT *OriginalFileObject;
7173 } Overlay;
7174 KAPC Apc;
7175 PVOID CompletionKey;
7176 } Tail;
7177 } IRP;
7178 typedef struct _IRP *PIRP;
7179
7180 typedef enum _IO_PAGING_PRIORITY {
7181 IoPagingPriorityInvalid,
7182 IoPagingPriorityNormal,
7183 IoPagingPriorityHigh,
7184 IoPagingPriorityReserved1,
7185 IoPagingPriorityReserved2
7186 } IO_PAGING_PRIORITY;
7187
7188 typedef NTSTATUS
7189 (DDKAPI IO_COMPLETION_ROUTINE)(
7190 IN struct _DEVICE_OBJECT *DeviceObject,
7191 IN struct _IRP *Irp,
7192 IN PVOID Context);
7193 typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
7194
7195 typedef VOID
7196 (DDKAPI *PIO_DPC_ROUTINE)(
7197 IN struct _KDPC *Dpc,
7198 IN struct _DEVICE_OBJECT *DeviceObject,
7199 IN struct _IRP *Irp,
7200 IN PVOID Context);
7201
7202 typedef NTSTATUS
7203 (DDKAPI *PMM_DLL_INITIALIZE)(
7204 IN PUNICODE_STRING RegistryPath);
7205
7206 typedef NTSTATUS
7207 (DDKAPI *PMM_DLL_UNLOAD)(
7208 VOID);
7209
7210 typedef BOOLEAN
7211 (DDKAPI KSERVICE_ROUTINE)(
7212 IN struct _KINTERRUPT *Interrupt,
7213 IN PVOID ServiceContext);
7214 typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE;
7215
7216 typedef VOID
7217 (DDKAPI *PIO_TIMER_ROUTINE)(
7218 IN struct _DEVICE_OBJECT *DeviceObject,
7219 IN PVOID Context);
7220
7221 typedef struct _IO_SECURITY_CONTEXT {
7222 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
7223 PACCESS_STATE AccessState;
7224 ACCESS_MASK DesiredAccess;
7225 ULONG FullCreateOptions;
7226 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
7227
7228 struct _IO_CSQ;
7229
7230 typedef struct _IO_CSQ_IRP_CONTEXT {
7231 ULONG Type;
7232 struct _IRP *Irp;
7233 struct _IO_CSQ *Csq;
7234 } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
7235
7236 typedef VOID
7237 (DDKAPI *PIO_CSQ_INSERT_IRP)(
7238 IN struct _IO_CSQ *Csq,
7239 IN PIRP Irp);
7240
7241 typedef VOID
7242 (DDKAPI *PIO_CSQ_REMOVE_IRP)(
7243 IN struct _IO_CSQ *Csq,
7244 IN PIRP Irp);
7245
7246 typedef PIRP
7247 (DDKAPI *PIO_CSQ_PEEK_NEXT_IRP)(
7248 IN struct _IO_CSQ *Csq,
7249 IN PIRP Irp,
7250 IN PVOID PeekContext);
7251
7252 typedef VOID
7253 (DDKAPI *PIO_CSQ_ACQUIRE_LOCK)(
7254 IN struct _IO_CSQ *Csq,
7255 OUT PKIRQL Irql);
7256
7257 typedef VOID
7258 (DDKAPI *PIO_CSQ_RELEASE_LOCK)(
7259 IN struct _IO_CSQ *Csq,
7260 IN KIRQL Irql);
7261
7262 typedef VOID
7263 (DDKAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
7264 IN struct _IO_CSQ *Csq,
7265 IN PIRP Irp);
7266
7267 typedef struct _IO_CSQ {
7268 ULONG Type;
7269 PIO_CSQ_INSERT_IRP CsqInsertIrp;
7270 PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
7271 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
7272 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
7273 PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
7274 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
7275 PVOID ReservePointer;
7276 } IO_CSQ, *PIO_CSQ;
7277
7278 typedef enum _BUS_QUERY_ID_TYPE {
7279 BusQueryDeviceID,
7280 BusQueryHardwareIDs,
7281 BusQueryCompatibleIDs,
7282 BusQueryInstanceID,
7283 BusQueryDeviceSerialNumber
7284 } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
7285
7286 typedef enum _DEVICE_TEXT_TYPE {
7287 DeviceTextDescription,
7288 DeviceTextLocationInformation
7289 } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
7290
7291 typedef enum _WORK_QUEUE_TYPE {
7292 CriticalWorkQueue,
7293 DelayedWorkQueue,
7294 HyperCriticalWorkQueue,
7295 MaximumWorkQueue
7296 } WORK_QUEUE_TYPE;
7297
7298 #if !defined(_AMD64_) && !defined(_IA64_)
7299 #include <pshpack4.h>
7300 #endif
7301 typedef struct _IO_STACK_LOCATION {
7302 UCHAR MajorFunction;
7303 UCHAR MinorFunction;
7304 UCHAR Flags;
7305 UCHAR Control;
7306 union {
7307 struct {
7308 PIO_SECURITY_CONTEXT SecurityContext;
7309 ULONG Options;
7310 USHORT POINTER_ALIGNMENT FileAttributes;
7311 USHORT ShareAccess;
7312 ULONG POINTER_ALIGNMENT EaLength;
7313 } Create;
7314 struct {
7315 ULONG Length;
7316 ULONG POINTER_ALIGNMENT Key;
7317 LARGE_INTEGER ByteOffset;
7318 } Read;
7319 struct {
7320 ULONG Length;
7321 ULONG POINTER_ALIGNMENT Key;
7322 LARGE_INTEGER ByteOffset;
7323 } Write;
7324 struct {
7325 ULONG Length;
7326 PUNICODE_STRING FileName;
7327 FILE_INFORMATION_CLASS FileInformationClass;
7328 ULONG FileIndex;
7329 } QueryDirectory;
7330 struct {
7331 ULONG Length;
7332 ULONG CompletionFilter;
7333 } NotifyDirectory;
7334 struct {
7335 ULONG Length;
7336 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
7337 } QueryFile;
7338 struct {
7339 ULONG Length;
7340 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
7341 PFILE_OBJECT FileObject;
7342 _ANONYMOUS_UNION union {
7343 _ANONYMOUS_STRUCT struct {
7344 BOOLEAN ReplaceIfExists;
7345 BOOLEAN AdvanceOnly;
7346 } DUMMYSTRUCTNAME;
7347 ULONG ClusterCount;
7348 HANDLE DeleteHandle;
7349 } DUMMYUNIONNAME;
7350 } SetFile;
7351 struct {
7352 ULONG Length;
7353 PVOID EaList;
7354 ULONG EaListLength;
7355 ULONG EaIndex;
7356 } QueryEa;
7357 struct {
7358 ULONG Length;
7359 } SetEa;
7360 struct {
7361 ULONG Length;
7362 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
7363 } QueryVolume;
7364 struct {
7365 ULONG Length;
7366 FS_INFORMATION_CLASS FsInformationClass;
7367 } SetVolume;
7368 struct {
7369 ULONG OutputBufferLength;
7370 ULONG InputBufferLength;
7371 ULONG FsControlCode;
7372 PVOID Type3InputBuffer;
7373 } FileSystemControl;
7374 struct {
7375 PLARGE_INTEGER Length;
7376 ULONG Key;
7377 LARGE_INTEGER ByteOffset;
7378 } LockControl;
7379 struct {
7380 ULONG OutputBufferLength;
7381 ULONG POINTER_ALIGNMENT InputBufferLength;
7382 ULONG POINTER_ALIGNMENT IoControlCode;
7383 PVOID Type3InputBuffer;
7384 } DeviceIoControl;
7385 struct {
7386 SECURITY_INFORMATION SecurityInformation;
7387 ULONG POINTER_ALIGNMENT Length;
7388 } QuerySecurity;
7389 struct {
7390 SECURITY_INFORMATION SecurityInformation;
7391 PSECURITY_DESCRIPTOR SecurityDescriptor;
7392 } SetSecurity;
7393 struct {
7394 PVPB Vpb;
7395 PDEVICE_OBJECT DeviceObject;
7396 } MountVolume;
7397 struct {
7398 PVPB Vpb;
7399 PDEVICE_OBJECT DeviceObject;
7400 } VerifyVolume;
7401 struct {
7402 struct _SCSI_REQUEST_BLOCK *Srb;
7403 } Scsi;
7404 struct {
7405 ULONG Length;
7406 PSID StartSid;
7407 struct _FILE_GET_QUOTA_INFORMATION *SidList;
7408 ULONG SidListLength;
7409 } QueryQuota;
7410 struct {
7411 ULONG Length;
7412 } SetQuota;
7413 struct {
7414 DEVICE_RELATION_TYPE Type;
7415 } QueryDeviceRelations;
7416 struct {
7417 CONST GUID *InterfaceType;
7418 USHORT Size;
7419 USHORT Version;
7420 PINTERFACE Interface;
7421 PVOID InterfaceSpecificData;
7422 } QueryInterface;
7423 struct {
7424 PDEVICE_CAPABILITIES Capabilities;
7425 } DeviceCapabilities;
7426 struct {
7427 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
7428 } FilterResourceRequirements;
7429 struct {
7430 ULONG WhichSpace;
7431 PVOID Buffer;
7432 ULONG Offset;
7433 ULONG POINTER_ALIGNMENT Length;
7434 } ReadWriteConfig;
7435 struct {
7436 BOOLEAN Lock;
7437 } SetLock;
7438 struct {
7439 BUS_QUERY_ID_TYPE IdType;
7440 } QueryId;
7441 struct {
7442 DEVICE_TEXT_TYPE DeviceTextType;
7443 LCID POINTER_ALIGNMENT LocaleId;
7444 } QueryDeviceText;
7445 struct {
7446 BOOLEAN InPath;
7447 BOOLEAN Reserved[3];
7448 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
7449 } UsageNotification;
7450 struct {
7451 SYSTEM_POWER_STATE PowerState;
7452 } WaitWake;
7453 struct {
7454 PPOWER_SEQUENCE PowerSequence;
7455 } PowerSequence;
7456 struct {
7457 ULONG SystemContext;
7458 POWER_STATE_TYPE POINTER_ALIGNMENT Type;
7459 POWER_STATE POINTER_ALIGNMENT State;
7460 POWER_ACTION POINTER_ALIGNMENT ShutdownType;
7461 } Power;
7462 struct {
7463 PCM_RESOURCE_LIST AllocatedResources;
7464 PCM_RESOURCE_LIST AllocatedResourcesTranslated;
7465 } StartDevice;
7466 struct {
7467 ULONG_PTR ProviderId;
7468 PVOID DataPath;
7469 ULONG BufferSize;
7470 PVOID Buffer;
7471 } WMI;
7472 struct {
7473 PVOID Argument1;
7474 PVOID Argument2;
7475 PVOID Argument3;
7476 PVOID Argument4;
7477 } Others;
7478 } Parameters;
7479 PDEVICE_OBJECT DeviceObject;
7480 PFILE_OBJECT FileObject;
7481 PIO_COMPLETION_ROUTINE CompletionRoutine;
7482 PVOID Context;
7483 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
7484 #if !defined(_AMD64_) && !defined(_IA64_)
7485 #include <poppack.h>
7486 #endif
7487
7488 /* IO_STACK_LOCATION.Control */
7489
7490 #define SL_PENDING_RETURNED 0x01
7491 #define SL_ERROR_RETURNED 0x02
7492 #define SL_INVOKE_ON_CANCEL 0x20
7493 #define SL_INVOKE_ON_SUCCESS 0x40
7494 #define SL_INVOKE_ON_ERROR 0x80
7495
7496 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
7497
7498 #define PCI_WHICHSPACE_CONFIG 0x0
7499 #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
7500
7501
7502 /******************************************************************************
7503 * I/O Manager Functions *
7504 ******************************************************************************/
7505
7506 #if !defined(_M_AMD64)
7507 NTHALAPI
7508 VOID
7509 NTAPI
7510 READ_PORT_BUFFER_UCHAR(
7511 IN PUCHAR Port,
7512 IN PUCHAR Buffer,
7513 IN ULONG Count);
7514
7515 NTHALAPI
7516 VOID
7517 NTAPI
7518 READ_PORT_BUFFER_ULONG(
7519 IN PULONG Port,
7520 IN PULONG Buffer,
7521 IN ULONG Count);
7522
7523 NTHALAPI
7524 VOID
7525 NTAPI
7526 READ_PORT_BUFFER_USHORT(
7527 IN PUSHORT Port,
7528 IN PUSHORT Buffer,
7529 IN ULONG Count);
7530
7531 NTHALAPI
7532 UCHAR
7533 NTAPI
7534 READ_PORT_UCHAR(
7535 IN PUCHAR Port);
7536
7537 NTHALAPI
7538 ULONG
7539 NTAPI
7540 READ_PORT_ULONG(
7541 IN PULONG Port);
7542
7543 NTHALAPI
7544 USHORT
7545 NTAPI
7546 READ_PORT_USHORT(
7547 IN PUSHORT Port);
7548
7549 NTKERNELAPI
7550 VOID
7551 NTAPI
7552 READ_REGISTER_BUFFER_UCHAR(
7553 IN PUCHAR Register,
7554 IN PUCHAR Buffer,
7555 IN ULONG Count);
7556
7557 NTKERNELAPI
7558 VOID
7559 NTAPI
7560 READ_REGISTER_BUFFER_ULONG(
7561 IN PULONG Register,
7562 IN PULONG Buffer,
7563 IN ULONG Count);
7564
7565 NTKERNELAPI
7566 VOID
7567 NTAPI
7568 READ_REGISTER_BUFFER_USHORT(
7569 IN PUSHORT Register,
7570 IN PUSHORT Buffer,
7571 IN ULONG Count);
7572
7573 NTKERNELAPI
7574 UCHAR
7575 NTAPI
7576 READ_REGISTER_UCHAR(
7577 IN PUCHAR Register);
7578
7579 NTKERNELAPI
7580 ULONG
7581 NTAPI
7582 READ_REGISTER_ULONG(
7583 IN PULONG Register);
7584
7585 NTKERNELAPI
7586 USHORT
7587 NTAPI
7588 READ_REGISTER_USHORT(
7589 IN PUSHORT Register);
7590
7591 NTHALAPI
7592 VOID
7593 NTAPI
7594 WRITE_PORT_BUFFER_UCHAR(
7595 IN PUCHAR Port,
7596 IN PUCHAR Buffer,
7597 IN ULONG Count);
7598
7599 NTHALAPI
7600 VOID
7601 NTAPI
7602 WRITE_PORT_BUFFER_ULONG(
7603 IN PULONG Port,
7604 IN PULONG Buffer,
7605 IN ULONG Count);
7606
7607 NTHALAPI
7608 VOID
7609 NTAPI
7610 WRITE_PORT_BUFFER_USHORT(
7611 IN PUSHORT Port,
7612 IN PUSHORT Buffer,
7613 IN ULONG Count);
7614
7615 NTHALAPI
7616 VOID
7617 NTAPI
7618 WRITE_PORT_UCHAR(
7619 IN PUCHAR Port,
7620 IN UCHAR Value);
7621
7622 NTHALAPI
7623 VOID
7624 NTAPI
7625 WRITE_PORT_ULONG(
7626 IN PULONG Port,
7627 IN ULONG Value);
7628
7629 NTHALAPI
7630 VOID
7631 NTAPI
7632 WRITE_PORT_USHORT(
7633 IN PUSHORT Port,
7634 IN USHORT Value);
7635
7636 NTKERNELAPI
7637 VOID
7638 NTAPI
7639 WRITE_REGISTER_BUFFER_UCHAR(
7640 IN PUCHAR Register,
7641 IN PUCHAR Buffer,
7642 IN ULONG Count);
7643
7644 NTKERNELAPI
7645 VOID
7646 NTAPI
7647 WRITE_REGISTER_BUFFER_ULONG(
7648 IN PULONG Register,
7649 IN PULONG Buffer,
7650 IN ULONG Count);
7651
7652 NTKERNELAPI
7653 VOID
7654 NTAPI
7655 WRITE_REGISTER_BUFFER_USHORT(
7656 IN PUSHORT Register,
7657 IN PUSHORT Buffer,
7658 IN ULONG Count);
7659
7660 NTKERNELAPI
7661 VOID
7662 NTAPI
7663 WRITE_REGISTER_UCHAR(
7664 IN PUCHAR Register,
7665 IN UCHAR Value);
7666
7667 NTKERNELAPI
7668 VOID
7669 NTAPI
7670 WRITE_REGISTER_ULONG(
7671 IN PULONG Register,
7672 IN ULONG Value);
7673
7674 NTKERNELAPI
7675 VOID
7676 NTAPI
7677 WRITE_REGISTER_USHORT(
7678 IN PUSHORT Register,
7679 IN USHORT Value);
7680
7681 #else
7682
7683 FORCEINLINE
7684 VOID
7685 READ_PORT_BUFFER_UCHAR(
7686 IN PUCHAR Port,
7687 IN PUCHAR Buffer,
7688 IN ULONG Count)
7689 {
7690 __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
7691 }
7692
7693 FORCEINLINE
7694 VOID
7695 READ_PORT_BUFFER_ULONG(
7696 IN PULONG Port,
7697 IN PULONG Buffer,
7698 IN ULONG Count)
7699 {
7700 __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
7701 }
7702
7703 FORCEINLINE
7704 VOID
7705 READ_PORT_BUFFER_USHORT(
7706 IN PUSHORT Port,
7707 IN PUSHORT Buffer,
7708 IN ULONG Count)
7709 {
7710 __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
7711 }
7712
7713 FORCEINLINE
7714 UCHAR
7715 READ_PORT_UCHAR(
7716 IN PUCHAR Port)
7717 {
7718 return __inbyte((USHORT)(ULONG_PTR)Port);
7719 }
7720
7721 FORCEINLINE
7722 ULONG
7723 READ_PORT_ULONG(
7724 IN PULONG Port)
7725 {
7726 return __indword((USHORT)(ULONG_PTR)Port);
7727 }
7728
7729 FORCEINLINE
7730 USHORT
7731 READ_PORT_USHORT(
7732 IN PUSHORT Port)
7733 {
7734 return __inword((USHORT)(ULONG_PTR)Port);
7735 }
7736
7737 FORCEINLINE
7738 VOID
7739 READ_REGISTER_BUFFER_UCHAR(
7740 IN PUCHAR Register,
7741 IN PUCHAR Buffer,
7742 IN ULONG Count)
7743 {
7744 __movsb(Register, Buffer, Count);
7745 }
7746
7747 FORCEINLINE
7748 VOID
7749 READ_REGISTER_BUFFER_ULONG(
7750 IN PULONG Register,
7751 IN PULONG Buffer,
7752 IN ULONG Count)
7753 {
7754 __movsd(Register, Buffer, Count);
7755 }
7756
7757 FORCEINLINE
7758 VOID
7759 READ_REGISTER_BUFFER_USHORT(
7760 IN PUSHORT Register,
7761 IN PUSHORT Buffer,
7762 IN ULONG Count)
7763 {
7764 __movsw(Register, Buffer, Count);
7765 }
7766
7767 FORCEINLINE
7768 UCHAR
7769 READ_REGISTER_UCHAR(
7770 IN volatile UCHAR *Register)
7771 {
7772 return *Register;
7773 }
7774
7775 FORCEINLINE
7776 ULONG
7777 READ_REGISTER_ULONG(
7778 IN volatile ULONG *Register)
7779 {
7780 return *Register;
7781 }
7782
7783 FORCEINLINE
7784 USHORT
7785 READ_REGISTER_USHORT(
7786 IN volatile USHORT *Register)
7787 {
7788 return *Register;
7789 }
7790
7791 FORCEINLINE
7792 VOID
7793 WRITE_PORT_BUFFER_UCHAR(
7794 IN PUCHAR Port,
7795 IN PUCHAR Buffer,
7796 IN ULONG Count)
7797 {
7798 __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
7799 }
7800
7801 FORCEINLINE
7802 VOID
7803 WRITE_PORT_BUFFER_ULONG(
7804 IN PULONG Port,
7805 IN PULONG Buffer,
7806 IN ULONG Count)
7807 {
7808 __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
7809 }
7810
7811 FORCEINLINE
7812 VOID
7813 WRITE_PORT_BUFFER_USHORT(
7814 IN PUSHORT Port,
7815 IN PUSHORT Buffer,
7816 IN ULONG Count)
7817 {
7818 __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
7819 }
7820
7821 FORCEINLINE
7822 VOID
7823 WRITE_PORT_UCHAR(
7824 IN PUCHAR Port,
7825 IN UCHAR Value)
7826 {
7827 __outbyte((USHORT)(ULONG_PTR)Port, Value);
7828 }
7829
7830 FORCEINLINE
7831 VOID
7832 WRITE_PORT_ULONG(
7833 IN PULONG Port,
7834 IN ULONG Value)
7835 {
7836 __outdword((USHORT)(ULONG_PTR)Port, Value);
7837 }
7838
7839 FORCEINLINE
7840 VOID
7841 WRITE_PORT_USHORT(
7842 IN PUSHORT Port,
7843 IN USHORT Value)
7844 {
7845 __outword((USHORT)(ULONG_PTR)Port, Value);
7846 }
7847
7848 FORCEINLINE
7849 VOID
7850 WRITE_REGISTER_BUFFER_UCHAR(
7851 IN PUCHAR Register,
7852 IN PUCHAR Buffer,
7853 IN ULONG Count)
7854 {
7855 LONG Synch;
7856 __movsb(Register, Buffer, Count);
7857 InterlockedOr(&Synch, 1);
7858 }
7859
7860 FORCEINLINE
7861 VOID
7862 WRITE_REGISTER_BUFFER_ULONG(
7863 IN PULONG Register,
7864 IN PULONG Buffer,
7865 IN ULONG Count)
7866 {
7867 LONG Synch;
7868 __movsd(Register, Buffer, Count);
7869 InterlockedOr(&Synch, 1);
7870 }
7871
7872 FORCEINLINE
7873 VOID
7874 WRITE_REGISTER_BUFFER_USHORT(
7875 IN PUSHORT Register,
7876 IN PUSHORT Buffer,
7877 IN ULONG Count)
7878 {
7879 LONG Synch;
7880 __movsw(Register, Buffer, Count);
7881 InterlockedOr(&Synch, 1);
7882 }
7883
7884 FORCEINLINE
7885 VOID
7886 WRITE_REGISTER_UCHAR(
7887 IN volatile UCHAR *Register,
7888 IN UCHAR Value)
7889 {
7890 LONG Synch;
7891 *Register = Value;
7892 InterlockedOr(&Synch, 1);
7893 }
7894
7895 FORCEINLINE
7896 VOID
7897 WRITE_REGISTER_ULONG(
7898 IN volatile ULONG *Register,
7899 IN ULONG Value)
7900 {
7901 LONG Synch;
7902 *Register = Value;
7903 InterlockedOr(&Synch, 1);
7904 }
7905
7906 FORCEINLINE
7907 VOID
7908 WRITE_REGISTER_USHORT(
7909 IN volatile USHORT *Register,
7910 IN USHORT Value)
7911 {
7912 LONG Sync;
7913 *Register = Value;
7914 InterlockedOr(&Sync, 1);
7915 }
7916 #endif
7917
7918 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
7919 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
7920
7921 #define DMA_MACROS_DEFINED
7922
7923 FORCEINLINE
7924 NTSTATUS
7925 IoAllocateAdapterChannel(
7926 IN PDMA_ADAPTER DmaAdapter,
7927 IN PDEVICE_OBJECT DeviceObject,
7928 IN ULONG NumberOfMapRegisters,
7929 IN PDRIVER_CONTROL ExecutionRoutine,
7930 IN PVOID Context)
7931 {
7932 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
7933 AllocateAdapterChannel =
7934 *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
7935 ASSERT(AllocateAdapterChannel);
7936 return AllocateAdapterChannel(DmaAdapter,
7937 DeviceObject,
7938 NumberOfMapRegisters,
7939 ExecutionRoutine,
7940 Context );
7941 }
7942
7943 FORCEINLINE
7944 BOOLEAN
7945 NTAPI
7946 IoFlushAdapterBuffers(
7947 IN PDMA_ADAPTER DmaAdapter,
7948 IN PMDL Mdl,
7949 IN PVOID MapRegisterBase,
7950 IN PVOID CurrentVa,
7951 IN ULONG Length,
7952 IN BOOLEAN WriteToDevice)
7953 {
7954 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
7955 FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
7956 ASSERT(FlushAdapterBuffers);
7957 return FlushAdapterBuffers(DmaAdapter,
7958 Mdl,
7959 MapRegisterBase,
7960 CurrentVa,
7961 Length,
7962 WriteToDevice);
7963 }
7964
7965 FORCEINLINE
7966 VOID
7967 NTAPI
7968 IoFreeAdapterChannel(
7969 IN PDMA_ADAPTER DmaAdapter)
7970 {
7971 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
7972 FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
7973 ASSERT(FreeAdapterChannel);
7974 FreeAdapterChannel(DmaAdapter);
7975 }
7976
7977 FORCEINLINE
7978 VOID
7979 NTAPI
7980 IoFreeMapRegisters(
7981 IN PDMA_ADAPTER DmaAdapter,
7982 IN PVOID MapRegisterBase,
7983 IN ULONG NumberOfMapRegisters)
7984 {
7985 PFREE_MAP_REGISTERS FreeMapRegisters;
7986 FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
7987 ASSERT(FreeMapRegisters);
7988 FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
7989 }
7990
7991 FORCEINLINE
7992 PHYSICAL_ADDRESS
7993 NTAPI
7994 IoMapTransfer(
7995 IN PDMA_ADAPTER DmaAdapter,
7996 IN PMDL Mdl,
7997 IN PVOID MapRegisterBase,
7998 IN PVOID CurrentVa,
7999 IN OUT PULONG Length,
8000 IN BOOLEAN WriteToDevice)
8001 {
8002 PMAP_TRANSFER MapTransfer;
8003
8004 MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
8005 ASSERT(MapTransfer);
8006 return MapTransfer(DmaAdapter,
8007 Mdl,
8008 MapRegisterBase,
8009 CurrentVa,
8010 Length,
8011 WriteToDevice);
8012 }
8013 #endif
8014
8015 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8016 NTKERNELAPI
8017 VOID
8018 NTAPI
8019 IoAcquireCancelSpinLock(
8020 OUT PKIRQL Irql);
8021
8022 NTKERNELAPI
8023 NTSTATUS
8024 NTAPI
8025 IoAcquireRemoveLockEx(
8026 IN PIO_REMOVE_LOCK RemoveLock,
8027 IN PVOID Tag OPTIONAL,
8028 IN PCSTR File,
8029 IN ULONG Line,
8030 IN ULONG RemlockSize);
8031 #endif
8032
8033 /*
8034 * NTSTATUS
8035 * IoAcquireRemoveLock(
8036 * IN PIO_REMOVE_LOCK RemoveLock,
8037 * IN OPTIONAL PVOID Tag)
8038 */
8039 #if DBG
8040 #define IoAcquireRemoveLock(RemoveLock, Tag) \
8041 IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
8042 #else
8043 #define IoAcquireRemoveLock(RemoveLock, Tag) \
8044 IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK))
8045 #endif
8046
8047 /*
8048 * VOID
8049 * IoAdjustPagingPathCount(
8050 * IN PLONG Count,
8051 * IN BOOLEAN Increment)
8052 */
8053 #define IoAdjustPagingPathCount(_Count, \
8054 _Increment) \
8055 { \
8056 if (_Increment) \
8057 { \
8058 InterlockedIncrement(_Count); \
8059 } \
8060 else \
8061 { \
8062 InterlockedDecrement(_Count); \
8063 } \
8064 }
8065
8066 #if (NTDDI_VERSION >= NTDDI_WIN2K)
8067
8068 NTKERNELAPI
8069 NTSTATUS
8070 NTAPI
8071 IoAllocateDriverObjectExtension(
8072 IN PDRIVER_OBJECT DriverObject,
8073 IN PVOID ClientIdentificationAddress,
8074 IN ULONG DriverObjectExtensionSize,
8075 OUT PVOID *DriverObjectExtension);
8076
8077 NTKERNELAPI
8078 PVOID
8079 NTAPI
8080 IoAllocateErrorLogEntry(
8081 IN PVOID IoObject,
8082 IN UCHAR EntrySize);
8083
8084 NTKERNELAPI
8085 PIRP
8086 NTAPI
8087 IoAllocateIrp(
8088 IN CCHAR StackSize,
8089 IN BOOLEAN ChargeQuota);
8090
8091 NTKERNELAPI
8092 PMDL
8093 NTAPI
8094 IoAllocateMdl(
8095 IN PVOID VirtualAddress OPTIONAL,
8096 IN ULONG Length,
8097 IN BOOLEAN SecondaryBuffer,
8098 IN BOOLEAN ChargeQuota,
8099 IN OUT PIRP Irp OPTIONAL);
8100
8101 NTKERNELAPI
8102 PIO_WORKITEM
8103 NTAPI
8104 IoAllocateWorkItem(
8105 IN PDEVICE_OBJECT DeviceObject);
8106
8107 NTKERNELAPI
8108 NTSTATUS
8109 NTAPI
8110 IoAttachDevice(
8111 IN PDEVICE_OBJECT SourceDevice,
8112 IN PUNICODE_STRING TargetDevice,
8113 OUT PDEVICE_OBJECT *AttachedDevice);
8114
8115 NTKERNELAPI
8116 PDEVICE_OBJECT
8117 NTAPI
8118 IoAttachDeviceToDeviceStack(
8119 IN PDEVICE_OBJECT SourceDevice,
8120 IN PDEVICE_OBJECT TargetDevice);
8121
8122 NTKERNELAPI
8123 PIRP
8124 NTAPI
8125 IoBuildAsynchronousFsdRequest(
8126 IN ULONG MajorFunction,
8127 IN PDEVICE_OBJECT DeviceObject,
8128 IN OUT PVOID Buffer OPTIONAL,
8129 IN ULONG Length OPTIONAL,
8130 IN PLARGE_INTEGER StartingOffset OPTIONAL,
8131 IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL);
8132
8133 NTKERNELAPI
8134 PIRP
8135 NTAPI
8136 IoBuildDeviceIoControlRequest(
8137 IN ULONG IoControlCode,
8138 IN PDEVICE_OBJECT DeviceObject,
8139 IN PVOID InputBuffer OPTIONAL,
8140 IN ULONG InputBufferLength,
8141 OUT PVOID OutputBuffer OPTIONAL,
8142 IN ULONG OutputBufferLength,
8143 IN BOOLEAN InternalDeviceIoControl,
8144 IN PKEVENT Event,
8145 OUT PIO_STATUS_BLOCK IoStatusBlock);
8146
8147 NTKERNELAPI
8148 VOID
8149 NTAPI
8150 IoBuildPartialMdl(
8151 IN PMDL SourceMdl,
8152 IN OUT PMDL TargetMdl,
8153 IN PVOID VirtualAddress,
8154 IN ULONG Length);
8155
8156 NTKERNELAPI
8157 PIRP
8158 NTAPI
8159 IoBuildSynchronousFsdRequest(
8160 IN ULONG MajorFunction,
8161 IN PDEVICE_OBJECT DeviceObject,
8162 IN OUT PVOID Buffer OPTIONAL,
8163 IN ULONG Length OPTIONAL,
8164 IN PLARGE_INTEGER StartingOffset OPTIONAL,
8165 IN PKEVENT Event,
8166 OUT PIO_STATUS_BLOCK IoStatusBlock);
8167
8168 NTKERNELAPI
8169 NTSTATUS
8170 FASTCALL
8171 IofCallDriver(
8172 IN PDEVICE_OBJECT DeviceObject,
8173 IN OUT PIRP Irp);
8174 #define IoCallDriver IofCallDriver
8175
8176 NTKERNELAPI
8177 VOID
8178 FASTCALL
8179 IofCompleteRequest(
8180 IN PIRP Irp,
8181 IN CCHAR PriorityBoost);
8182 #define IoCompleteRequest IofCompleteRequest
8183
8184 NTKERNELAPI
8185 BOOLEAN
8186 NTAPI
8187 IoCancelIrp(
8188 IN PIRP Irp);
8189
8190 NTKERNELAPI
8191 NTSTATUS
8192 NTAPI
8193 IoCheckShareAccess(
8194 IN ACCESS_MASK DesiredAccess,
8195 IN ULONG DesiredShareAccess,
8196 IN OUT PFILE_OBJECT FileObject,
8197 IN OUT PSHARE_ACCESS ShareAccess,
8198 IN BOOLEAN Update);
8199
8200 NTKERNELAPI
8201 VOID
8202 FASTCALL
8203 IofCompleteRequest(
8204 IN PIRP Irp,
8205 IN CCHAR PriorityBoost);
8206
8207 NTKERNELAPI
8208 NTSTATUS
8209 NTAPI
8210 IoConnectInterrupt(
8211 OUT PKINTERRUPT *InterruptObject,
8212 IN PKSERVICE_ROUTINE ServiceRoutine,
8213 IN PVOID ServiceContext OPTIONAL,
8214 IN PKSPIN_LOCK SpinLock OPTIONAL,
8215 IN ULONG Vector,
8216 IN KIRQL Irql,
8217 IN KIRQL SynchronizeIrql,
8218 IN KINTERRUPT_MODE InterruptMode,
8219 IN BOOLEAN ShareVector,
8220 IN KAFFINITY ProcessorEnableMask,
8221 IN BOOLEAN FloatingSave);
8222
8223 NTKERNELAPI
8224 NTSTATUS
8225 NTAPI
8226 IoCreateDevice(
8227 IN PDRIVER_OBJECT DriverObject,
8228 IN ULONG DeviceExtensionSize,
8229 IN PUNICODE_STRING DeviceName OPTIONAL,
8230 IN DEVICE_TYPE DeviceType,
8231 IN ULONG DeviceCharacteristics,
8232 IN BOOLEAN Exclusive,
8233 OUT PDEVICE_OBJECT *DeviceObject);
8234
8235 NTKERNELAPI
8236 NTSTATUS
8237 NTAPI
8238 IoCreateFile(
8239 OUT PHANDLE FileHandle,
8240 IN ACCESS_MASK DesiredAccess,
8241 IN POBJECT_ATTRIBUTES ObjectAttributes,
8242 OUT PIO_STATUS_BLOCK IoStatusBlock,
8243 IN PLARGE_INTEGER AllocationSize OPTIONAL,
8244 IN ULONG FileAttributes,
8245 IN ULONG ShareAccess,
8246 IN ULONG Disposition,
8247 IN ULONG CreateOptions,
8248 IN PVOID EaBuffer OPTIONAL,
8249 IN ULONG EaLength,
8250 IN CREATE_FILE_TYPE CreateFileType,
8251 IN PVOID InternalParameters OPTIONAL,
8252 IN ULONG Options);
8253
8254 NTKERNELAPI
8255 PKEVENT
8256 NTAPI
8257 IoCreateNotificationEvent(
8258 IN PUNICODE_STRING EventName,
8259 OUT PHANDLE EventHandle);
8260
8261 NTKERNELAPI
8262 NTSTATUS
8263 NTAPI
8264 IoCreateSymbolicLink(
8265 IN PUNICODE_STRING SymbolicLinkName,
8266 IN PUNICODE_STRING DeviceName);
8267
8268 NTKERNELAPI
8269 PKEVENT
8270 NTAPI
8271 IoCreateSynchronizationEvent(
8272 IN PUNICODE_STRING EventName,
8273 OUT PHANDLE EventHandle);
8274
8275 NTKERNELAPI
8276 NTSTATUS
8277 NTAPI
8278 IoCreateUnprotectedSymbolicLink(
8279 IN PUNICODE_STRING SymbolicLinkName,
8280 IN PUNICODE_STRING DeviceName);
8281
8282 NTKERNELAPI
8283 VOID
8284 NTAPI
8285 IoDeleteDevice(
8286 IN PDEVICE_OBJECT DeviceObject);
8287
8288 NTKERNELAPI
8289 NTSTATUS
8290 NTAPI
8291 IoDeleteSymbolicLink(
8292 IN PUNICODE_STRING SymbolicLinkName);
8293
8294 NTKERNELAPI
8295 VOID
8296 NTAPI
8297 IoDetachDevice(
8298 IN OUT PDEVICE_OBJECT TargetDevice);
8299
8300 NTKERNELAPI
8301 VOID
8302 NTAPI
8303 IoDisconnectInterrupt(
8304 IN PKINTERRUPT InterruptObject);
8305
8306 NTKERNELAPI
8307 VOID
8308 NTAPI
8309 IoFreeIrp(
8310 IN PIRP Irp);
8311
8312 NTKERNELAPI
8313 VOID
8314 NTAPI
8315 IoFreeMdl(
8316 IN PMDL Mdl);
8317
8318 NTKERNELAPI
8319 VOID
8320 NTAPI
8321 IoFreeWorkItem(
8322 IN PIO_WORKITEM IoWorkItem);
8323
8324 NTKERNELAPI
8325 PDEVICE_OBJECT
8326 NTAPI
8327 IoGetAttachedDevice(
8328 IN PDEVICE_OBJECT DeviceObject);
8329
8330 NTKERNELAPI
8331 PDEVICE_OBJECT
8332 NTAPI
8333 IoGetAttachedDeviceReference(
8334 IN PDEVICE_OBJECT DeviceObject);
8335
8336 NTKERNELAPI
8337 NTSTATUS
8338 NTAPI
8339 IoGetBootDiskInformation(
8340 IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
8341 IN ULONG Size);
8342
8343 NTKERNELAPI
8344 NTSTATUS
8345 NTAPI
8346 IoGetDeviceInterfaceAlias(
8347 IN PUNICODE_STRING SymbolicLinkName,
8348 IN CONST GUID *AliasInterfaceClassGuid,
8349 OUT PUNICODE_STRING AliasSymbolicLinkName);
8350
8351 NTKERNELAPI
8352 PEPROCESS
8353 NTAPI
8354 IoGetCurrentProcess(
8355 VOID);
8356
8357 NTKERNELAPI
8358 NTSTATUS
8359 NTAPI
8360 IoGetDeviceInterfaces(
8361 IN CONST GUID *InterfaceClassGuid,
8362 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
8363 IN ULONG Flags,
8364 OUT PWSTR *SymbolicLinkList);
8365
8366 NTKERNELAPI
8367 NTSTATUS
8368 NTAPI
8369 IoGetDeviceObjectPointer(
8370 IN PUNICODE_STRING ObjectName,
8371 IN ACCESS_MASK DesiredAccess,
8372 OUT PFILE_OBJECT *FileObject,
8373 OUT PDEVICE_OBJECT *DeviceObject);
8374
8375 NTKERNELAPI
8376 NTSTATUS
8377 NTAPI
8378 IoGetDeviceProperty(
8379 IN PDEVICE_OBJECT DeviceObject,
8380 IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
8381 IN ULONG BufferLength,
8382 OUT PVOID PropertyBuffer,
8383 OUT PULONG ResultLength);
8384
8385 NTKERNELAPI
8386 PDMA_ADAPTER
8387 NTAPI
8388 IoGetDmaAdapter(
8389 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
8390 IN PDEVICE_DESCRIPTION DeviceDescription,
8391 IN OUT PULONG NumberOfMapRegisters);
8392
8393 NTKERNELAPI
8394 PVOID
8395 NTAPI
8396 IoGetDriverObjectExtension(
8397 IN PDRIVER_OBJECT DriverObject,
8398 IN PVOID ClientIdentificationAddress);
8399
8400 NTKERNELAPI
8401 PVOID
8402 NTAPI
8403 IoGetInitialStack(
8404 VOID);
8405
8406 NTKERNELAPI
8407 PDEVICE_OBJECT
8408 NTAPI
8409 IoGetRelatedDeviceObject(
8410 IN PFILE_OBJECT FileObject);
8411
8412 NTKERNELAPI
8413 VOID
8414 NTAPI
8415 IoQueueWorkItem(
8416 IN PIO_WORKITEM IoWorkItem,
8417 IN PIO_WORKITEM_ROUTINE WorkerRoutine,
8418 IN WORK_QUEUE_TYPE QueueType,
8419 IN PVOID Context OPTIONAL);
8420
8421 NTKERNELAPI
8422 VOID
8423 NTAPI
8424 IoInitializeIrp(
8425 IN OUT PIRP Irp,
8426 IN USHORT PacketSize,
8427 IN CCHAR StackSize);
8428
8429 NTKERNELAPI
8430 VOID
8431 NTAPI
8432 IoInitializeRemoveLockEx(
8433 IN PIO_REMOVE_LOCK Lock,
8434 IN ULONG AllocateTag,
8435 IN ULONG MaxLockedMinutes,
8436 IN ULONG HighWatermark,
8437 IN ULONG RemlockSize);
8438
8439 NTKERNELAPI
8440 NTSTATUS
8441 NTAPI
8442 IoInitializeTimer(
8443 IN PDEVICE_OBJECT DeviceObject,
8444 IN PIO_TIMER_ROUTINE TimerRoutine,
8445 IN PVOID Context OPTIONAL);
8446
8447 NTKERNELAPI
8448 VOID
8449 NTAPI
8450 IoInvalidateDeviceRelations(
8451 IN PDEVICE_OBJECT DeviceObject,
8452 IN DEVICE_RELATION_TYPE Type);
8453
8454 NTKERNELAPI
8455 VOID
8456 NTAPI
8457 IoInvalidateDeviceState(
8458 IN PDEVICE_OBJECT PhysicalDeviceObject);
8459
8460 NTKERNELAPI
8461 BOOLEAN
8462 NTAPI
8463 IoIsWdmVersionAvailable(
8464 IN UCHAR MajorVersion,
8465 IN UCHAR MinorVersion);
8466
8467 NTKERNELAPI
8468 NTSTATUS
8469 NTAPI
8470 IoOpenDeviceInterfaceRegistryKey(
8471 IN PUNICODE_STRING SymbolicLinkName,
8472 IN ACCESS_MASK DesiredAccess,
8473 OUT PHANDLE DeviceInterfaceKey);
8474
8475 NTKERNELAPI
8476 NTSTATUS
8477 NTAPI
8478 IoOpenDeviceRegistryKey(
8479 IN PDEVICE_OBJECT DeviceObject,
8480 IN ULONG DevInstKeyType,
8481 IN ACCESS_MASK DesiredAccess,
8482 OUT PHANDLE DevInstRegKey);
8483
8484 NTKERNELAPI
8485 NTSTATUS
8486 NTAPI
8487 IoRegisterDeviceInterface(
8488 IN PDEVICE_OBJECT PhysicalDeviceObject,
8489 IN CONST GUID *InterfaceClassGuid,
8490 IN PUNICODE_STRING ReferenceString OPTIONAL,
8491 OUT PUNICODE_STRING SymbolicLinkName);
8492
8493 NTKERNELAPI
8494 NTSTATUS
8495 NTAPI
8496 IoRegisterPlugPlayNotification(
8497 IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
8498 IN ULONG EventCategoryFlags,
8499 IN PVOID EventCategoryData OPTIONAL,
8500 IN PDRIVER_OBJECT DriverObject,
8501 IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
8502 IN OUT PVOID Context OPTIONAL,
8503 OUT PVOID *NotificationEntry);
8504
8505 NTKERNELAPI
8506 NTSTATUS
8507 NTAPI
8508 IoRegisterShutdownNotification(
8509 IN PDEVICE_OBJECT DeviceObject);
8510
8511 NTKERNELAPI
8512 VOID
8513 NTAPI
8514 IoReleaseCancelSpinLock(
8515 IN KIRQL Irql);
8516
8517 NTKERNELAPI
8518 VOID
8519 NTAPI
8520 IoReleaseRemoveLockAndWaitEx(
8521 IN PIO_REMOVE_LOCK RemoveLock,
8522 IN PVOID Tag OPTIONAL,
8523 IN ULONG RemlockSize);
8524
8525 NTKERNELAPI
8526 VOID
8527 NTAPI
8528 IoReleaseRemoveLockEx(
8529 IN PIO_REMOVE_LOCK RemoveLock,
8530 IN PVOID Tag OPTIONAL,
8531 IN ULONG RemlockSize);
8532
8533 NTKERNELAPI
8534 VOID
8535 NTAPI
8536 IoRemoveShareAccess(
8537 IN PFILE_OBJECT FileObject,
8538 IN OUT PSHARE_ACCESS ShareAccess);
8539
8540 NTKERNELAPI
8541 NTSTATUS
8542 NTAPI
8543 IoReportTargetDeviceChange(
8544 IN PDEVICE_OBJECT PhysicalDeviceObject,
8545 IN PVOID NotificationStructure);
8546
8547 NTKERNELAPI
8548 NTSTATUS
8549 NTAPI
8550 IoReportTargetDeviceChangeAsynchronous(
8551 IN PDEVICE_OBJECT PhysicalDeviceObject,
8552 IN PVOID NotificationStructure,
8553 IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
8554 IN PVOID Context OPTIONAL);
8555
8556 NTKERNELAPI
8557 VOID
8558 NTAPI
8559 IoRequestDeviceEject(
8560 IN PDEVICE_OBJECT PhysicalDeviceObject);
8561
8562 NTKERNELAPI
8563 VOID
8564 NTAPI
8565 IoReuseIrp(
8566 IN OUT PIRP Irp,
8567 IN NTSTATUS Status);
8568
8569 NTKERNELAPI
8570 NTSTATUS
8571 NTAPI
8572 IoSetDeviceInterfaceState(
8573 IN PUNICODE_STRING SymbolicLinkName,
8574 IN BOOLEAN Enable);
8575
8576 NTKERNELAPI
8577 VOID
8578 NTAPI
8579 IoSetShareAccess(
8580 IN ACCESS_MASK DesiredAccess,
8581 IN ULONG DesiredShareAccess,
8582 IN OUT PFILE_OBJECT FileObject,
8583 OUT PSHARE_ACCESS ShareAccess);
8584
8585 NTKERNELAPI
8586 VOID
8587 NTAPI
8588 IoStartNextPacket(
8589 IN PDEVICE_OBJECT DeviceObject,
8590 IN BOOLEAN Cancelable);
8591
8592 NTKERNELAPI
8593 VOID
8594 NTAPI
8595 IoStartNextPacketByKey(
8596 IN PDEVICE_OBJECT DeviceObject,
8597 IN BOOLEAN Cancelable,
8598 IN ULONG Key);
8599
8600 NTKERNELAPI
8601 VOID
8602 NTAPI
8603 IoStartPacket(
8604 IN PDEVICE_OBJECT DeviceObject,
8605 IN PIRP Irp,
8606 IN PULONG Key OPTIONAL,
8607 IN PDRIVER_CANCEL CancelFunction OPTIONAL);
8608
8609 NTKERNELAPI
8610 VOID
8611 NTAPI
8612 IoStartTimer(
8613 IN PDEVICE_OBJECT DeviceObject);
8614
8615 NTKERNELAPI
8616 VOID
8617 NTAPI
8618 IoStopTimer(
8619 IN PDEVICE_OBJECT DeviceObject);
8620
8621 NTKERNELAPI
8622 NTSTATUS
8623 NTAPI
8624 IoUnregisterPlugPlayNotification(
8625 IN PVOID NotificationEntry);
8626
8627 NTKERNELAPI
8628 VOID
8629 NTAPI
8630 IoUnregisterShutdownNotification(
8631 IN PDEVICE_OBJECT DeviceObject);
8632
8633 NTKERNELAPI
8634 VOID
8635 NTAPI
8636 IoUpdateShareAccess(
8637 IN PFILE_OBJECT FileObject,
8638 IN OUT PSHARE_ACCESS ShareAccess);
8639
8640 NTKERNELAPI
8641 NTSTATUS
8642 NTAPI
8643 IoWMIAllocateInstanceIds(
8644 IN GUID *Guid,
8645 IN ULONG InstanceCount,
8646 OUT ULONG *FirstInstanceId);
8647
8648 NTKERNELAPI
8649 NTSTATUS
8650 NTAPI
8651 IoWMIQuerySingleInstanceMultiple(
8652 IN PVOID *DataBlockObjectList,
8653 IN PUNICODE_STRING InstanceNames,
8654 IN ULONG ObjectCount,
8655 IN OUT ULONG *InOutBufferSize,
8656 OUT PVOID OutBuffer);
8657
8658 NTKERNELAPI
8659 NTSTATUS
8660 NTAPI
8661 IoWMIRegistrationControl(
8662 IN PDEVICE_OBJECT DeviceObject,
8663 IN ULONG Action);
8664
8665 NTKERNELAPI
8666 NTSTATUS
8667 NTAPI
8668 IoWMISuggestInstanceName(
8669 IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
8670 IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
8671 IN BOOLEAN CombineNames,
8672 OUT PUNICODE_STRING SuggestedInstanceName);
8673
8674 NTKERNELAPI
8675 NTSTATUS
8676 NTAPI
8677 IoWMIWriteEvent(
8678 IN PVOID WnodeEventItem);
8679
8680 NTKERNELAPI
8681 VOID
8682 NTAPI
8683 IoWriteErrorLogEntry(
8684 IN PVOID ElEntry);
8685
8686 #endif
8687
8688 #if (NTDDI_VERSION >= NTDDI_WINXP)
8689
8690 NTKERNELAPI
8691 NTSTATUS
8692 NTAPI
8693 IoCsqInitialize(
8694 IN PIO_CSQ Csq,
8695 IN PIO_CSQ_INSERT_IRP CsqInsertIrp,
8696 IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp,
8697 IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp,
8698 IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock,
8699 IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock,
8700 IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp);
8701
8702 NTKERNELAPI
8703 VOID
8704 NTAPI
8705 IoCsqInsertIrp(
8706 IN PIO_CSQ Csq,
8707 IN PIRP Irp,
8708 IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL);
8709
8710 NTKERNELAPI
8711 PIRP
8712 NTAPI
8713 IoCsqRemoveIrp(
8714 IN PIO_CSQ Csq,
8715 IN PIO_CSQ_IRP_CONTEXT Context);
8716
8717 NTKERNELAPI
8718 PIRP
8719 NTAPI
8720 IoCsqRemoveNextIrp(
8721 IN PIO_CSQ Csq,
8722 IN PVOID PeekContext);
8723
8724 NTKERNELAPI
8725 BOOLEAN
8726 NTAPI
8727 IoForwardIrpSynchronously(
8728 IN PDEVICE_OBJECT DeviceObject,
8729 IN PIRP Irp);
8730
8731 #define IoForwardAndCatchIrp IoForwardIrpSynchronously
8732
8733 NTKERNELAPI
8734 VOID
8735 NTAPI
8736 IoFreeErrorLogEntry(
8737 PVOID ElEntry);
8738
8739 NTKERNELAPI
8740 NTSTATUS
8741 NTAPI
8742 IoSetCompletionRoutineEx(
8743 IN PDEVICE_OBJECT DeviceObject,
8744 IN PIRP Irp,
8745 IN PIO_COMPLETION_ROUTINE CompletionRoutine,
8746 IN PVOID Context,
8747 IN BOOLEAN InvokeOnSuccess,
8748 IN BOOLEAN InvokeOnError,
8749 IN BOOLEAN InvokeOnCancel);
8750
8751 NTKERNELAPI
8752 VOID
8753 NTAPI
8754 IoSetStartIoAttributes(
8755 IN PDEVICE_OBJECT DeviceObject,
8756 IN BOOLEAN DeferredStartIo,
8757 IN BOOLEAN NonCancelable);
8758
8759 NTKERNELAPI
8760 NTSTATUS
8761 NTAPI
8762 IoWMIDeviceObjectToInstanceName(
8763 IN PVOID DataBlockObject,
8764 IN PDEVICE_OBJECT DeviceObject,
8765 OUT PUNICODE_STRING InstanceName);
8766
8767 NTKERNELAPI
8768 NTSTATUS
8769 NTAPI
8770 IoWMIExecuteMethod(
8771 IN PVOID DataBlockObject,
8772 IN PUNICODE_STRING InstanceName,
8773 IN ULONG MethodId,
8774 IN ULONG InBufferSize,
8775 IN OUT PULONG OutBufferSize,
8776 IN OUT PUCHAR InOutBuffer);
8777
8778 NTKERNELAPI
8779 NTSTATUS
8780 NTAPI
8781 IoWMIHandleToInstanceName(
8782 IN PVOID DataBlockObject,
8783 IN HANDLE FileHandle,
8784 OUT PUNICODE_STRING InstanceName);
8785
8786 NTKERNELAPI
8787 NTSTATUS
8788 NTAPI
8789 IoWMIOpenBlock(
8790 IN GUID *DataBlockGuid,
8791 IN ULONG DesiredAccess,
8792 OUT PVOID *DataBlockObject);
8793
8794 NTKERNELAPI
8795 NTSTATUS
8796 NTAPI
8797 IoWMIQueryAllData(
8798 IN PVOID DataBlockObject,
8799 IN OUT ULONG *InOutBufferSize,
8800 OUT PVOID OutBuffer);
8801
8802 NTKERNELAPI
8803 NTSTATUS
8804 NTAPI
8805 IoWMIQueryAllDataMultiple(
8806 IN PVOID *DataBlockObjectList,
8807 IN ULONG ObjectCount,
8808 IN OUT ULONG *InOutBufferSize,
8809 OUT PVOID OutBuffer);
8810
8811 NTKERNELAPI
8812 NTSTATUS
8813 NTAPI
8814 IoWMIQuerySingleInstance(
8815 IN PVOID DataBlockObject,
8816 IN PUNICODE_STRING InstanceName,
8817 IN OUT ULONG *InOutBufferSize,
8818 OUT PVOID OutBuffer);
8819
8820 NTKERNELAPI
8821 NTSTATUS
8822 NTAPI
8823 IoWMISetNotificationCallback(
8824 IN OUT PVOID Object,
8825 IN WMI_NOTIFICATION_CALLBACK Callback,
8826 IN PVOID Context OPTIONAL);
8827
8828 NTKERNELAPI
8829 NTSTATUS
8830 NTAPI
8831 IoWMISetSingleInstance(
8832 IN PVOID DataBlockObject,
8833 IN PUNICODE_STRING InstanceName,
8834 IN ULONG Version,
8835 IN ULONG ValueBufferSize,
8836 IN PVOID ValueBuffer);
8837
8838 NTKERNELAPI
8839 NTSTATUS
8840 NTAPI
8841 IoWMISetSingleItem(
8842 IN PVOID DataBlockObject,
8843 IN PUNICODE_STRING InstanceName,
8844 IN ULONG DataItemId,
8845 IN ULONG Version,
8846 IN ULONG ValueBufferSize,
8847 IN PVOID ValueBuffer);
8848
8849 #endif
8850
8851 #if defined(_WIN64)
8852 NTKERNELAPI
8853 ULONG
8854 NTAPI
8855 IoWMIDeviceObjectToProviderId(
8856 IN PDEVICE_OBJECT DeviceObject);
8857 #else
8858 #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
8859 #endif
8860
8861 /*
8862 * USHORT
8863 * IoSizeOfIrp(
8864 * IN CCHAR StackSize)
8865 */
8866 #define IoSizeOfIrp(_StackSize) \
8867 ((USHORT) (sizeof(IRP) + ((_StackSize) * (sizeof(IO_STACK_LOCATION)))))
8868
8869 FORCEINLINE
8870 VOID
8871 IoSkipCurrentIrpStackLocation (
8872 IN OUT PIRP Irp)
8873 {
8874 ASSERT(Irp->CurrentLocation <= Irp->StackCount);
8875 Irp->CurrentLocation++;
8876 Irp->Tail.Overlay.CurrentStackLocation++;
8877 }
8878
8879 FORCEINLINE
8880 VOID
8881 IoSetNextIrpStackLocation (
8882 IN OUT PIRP Irp)
8883 {
8884 ASSERT(Irp->CurrentLocation > 0);
8885 Irp->CurrentLocation--;
8886 Irp->Tail.Overlay.CurrentStackLocation--;
8887 }
8888
8889 FORCEINLINE
8890 PIO_STACK_LOCATION
8891 IoGetNextIrpStackLocation(
8892 IN PIRP Irp)
8893 {
8894 ASSERT(Irp->CurrentLocation > 0);
8895 return ((Irp)->Tail.Overlay.CurrentStackLocation - 1 );
8896 }
8897
8898 FORCEINLINE
8899 VOID
8900 IoSetCompletionRoutine(
8901 IN PIRP Irp,
8902 IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL,
8903 IN PVOID Context OPTIONAL,
8904 IN BOOLEAN InvokeOnSuccess,
8905 IN BOOLEAN InvokeOnError,
8906 IN BOOLEAN InvokeOnCancel)
8907 {
8908 PIO_STACK_LOCATION irpSp;
8909 ASSERT( (InvokeOnSuccess || InvokeOnError || InvokeOnCancel) ? (CompletionRoutine != NULL) : TRUE );
8910 irpSp = IoGetNextIrpStackLocation(Irp);
8911 irpSp->CompletionRoutine = CompletionRoutine;
8912 irpSp->Context = Context;
8913 irpSp->Control = 0;
8914
8915 if (InvokeOnSuccess) {
8916 irpSp->Control = SL_INVOKE_ON_SUCCESS;
8917 }
8918
8919 if (InvokeOnError) {
8920 irpSp->Control |= SL_INVOKE_ON_ERROR;
8921 }
8922
8923 if (InvokeOnCancel) {
8924 irpSp->Control |= SL_INVOKE_ON_CANCEL;
8925 }
8926 }
8927
8928 /*
8929 * PDRIVER_CANCEL
8930 * IoSetCancelRoutine(
8931 * IN PIRP Irp,
8932 * IN PDRIVER_CANCEL CancelRoutine)
8933 */
8934 #define IoSetCancelRoutine(_Irp, \
8935 _CancelRoutine) \
8936 ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \
8937 (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine)))
8938
8939 /*
8940 * VOID
8941 * IoRequestDpc(
8942 * IN PDEVICE_OBJECT DeviceObject,
8943 * IN PIRP Irp,
8944 * IN PVOID Context);
8945 */
8946 #define IoRequestDpc(DeviceObject, Irp, Context)( \
8947 KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context)))
8948
8949 /*
8950 * VOID
8951 * IoReleaseRemoveLock(
8952 * IN PIO_REMOVE_LOCK RemoveLock,
8953 * IN PVOID Tag)
8954 */
8955 #define IoReleaseRemoveLock(_RemoveLock, \
8956 _Tag) \
8957 IoReleaseRemoveLockEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
8958
8959 /*
8960 * VOID
8961 * IoReleaseRemoveLockAndWait(
8962 * IN PIO_REMOVE_LOCK RemoveLock,
8963 * IN PVOID Tag)
8964 */
8965 #define IoReleaseRemoveLockAndWait(_RemoveLock, \
8966 _Tag) \
8967 IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK))
8968
8969 #if defined(_WIN64)
8970
8971 NTKERNELAPI
8972 BOOLEAN
8973 IoIs32bitProcess(
8974 IN PIRP Irp OPTIONAL);
8975
8976 #endif
8977
8978 #define PLUGPLAY_REGKEY_DEVICE 1
8979 #define PLUGPLAY_REGKEY_DRIVER 2
8980 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
8981
8982 FORCEINLINE
8983 PIO_STACK_LOCATION
8984 IoGetCurrentIrpStackLocation(
8985 IN PIRP Irp)
8986 {
8987 ASSERT(Irp->CurrentLocation <= Irp->StackCount + 1);
8988 return Irp->Tail.Overlay.CurrentStackLocation;
8989 }
8990
8991 FORCEINLINE
8992 VOID
8993 IoMarkIrpPending(
8994 IN OUT PIRP Irp)
8995 {
8996 IoGetCurrentIrpStackLocation( (Irp) )->Control |= SL_PENDING_RETURNED;
8997 }
8998
8999 /*
9000 * BOOLEAN
9001 * IoIsErrorUserInduced(
9002 * IN NTSTATUS Status);
9003 */
9004 #define IoIsErrorUserInduced(Status) \
9005 ((BOOLEAN)(((Status) == STATUS_DEVICE_NOT_READY) || \
9006 ((Status) == STATUS_IO_TIMEOUT) || \
9007 ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
9008 ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
9009 ((Status) == STATUS_VERIFY_REQUIRED) || \
9010 ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
9011 ((Status) == STATUS_WRONG_VOLUME)))
9012
9013 /* VOID
9014 * IoInitializeRemoveLock(
9015 * IN PIO_REMOVE_LOCK Lock,
9016 * IN ULONG AllocateTag,
9017 * IN ULONG MaxLockedMinutes,
9018 * IN ULONG HighWatermark)
9019 */
9020 #define IoInitializeRemoveLock( \
9021 Lock, AllocateTag, MaxLockedMinutes, HighWatermark) \
9022 IoInitializeRemoveLockEx(Lock, AllocateTag, MaxLockedMinutes, \
9023 HighWatermark, sizeof(IO_REMOVE_LOCK))
9024
9025 VOID
9026 FORCEINLINE
9027 IoInitializeDpcRequest(
9028 IN PDEVICE_OBJECT DeviceObject,
9029 IN PIO_DPC_ROUTINE DpcRoutine)
9030 {
9031 KeInitializeDpc( &DeviceObject->Dpc,
9032 (PKDEFERRED_ROUTINE) DpcRoutine,
9033 DeviceObject );
9034 }
9035
9036 #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
9037
9038 /*
9039 * ULONG
9040 * IoGetFunctionCodeFromCtlCode(
9041 * IN ULONG ControlCode)
9042 */
9043 #define IoGetFunctionCodeFromCtlCode(_ControlCode) \
9044 (((_ControlCode) >> 2) & 0x00000FFF)
9045
9046 FORCEINLINE
9047 VOID
9048 IoCopyCurrentIrpStackLocationToNext(
9049 IN PIRP Irp)
9050 {
9051 PIO_STACK_LOCATION irpSp;
9052 PIO_STACK_LOCATION nextIrpSp;
9053 irpSp = IoGetCurrentIrpStackLocation(Irp);
9054 nextIrpSp = IoGetNextIrpStackLocation(Irp);
9055 RtlCopyMemory( nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine));
9056 nextIrpSp->Control = 0;
9057 }
9058
9059 NTKERNELAPI
9060 VOID
9061 NTAPI
9062 IoGetStackLimits(
9063 OUT PULONG_PTR LowLimit,
9064 OUT PULONG_PTR HighLimit);
9065
9066 FORCEINLINE
9067 ULONG_PTR
9068 IoGetRemainingStackSize(
9069 VOID)
9070 {
9071 ULONG_PTR End, Begin;
9072 ULONG_PTR Result;
9073
9074 IoGetStackLimits(&Begin, &End);
9075 Result = (ULONG_PTR)(&End) - Begin;
9076 return Result;
9077 }
9078
9079
9080 /******************************************************************************
9081 * WINBASE Functions *
9082 ******************************************************************************/
9083 #if !defined(_WINBASE_)
9084
9085 #if defined(_WIN64) && (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_NTOSP_))
9086
9087 NTKERNELAPI
9088 VOID
9089 InitializeSListHead(
9090 OUT PSLIST_HEADER SListHead);
9091
9092 #else
9093
9094 VOID
9095 FORCEINLINE
9096 InitializeSListHead(
9097 OUT PSLIST_HEADER SListHead)
9098 {
9099 #if defined(_IA64_)
9100 ULONG64 FeatureBits;
9101 #endif
9102
9103 #if defined(_WIN64)
9104 if (((ULONG_PTR)SListHead & 0xf) != 0)
9105 {
9106 RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT);
9107 }
9108 #endif
9109
9110 RtlZeroMemory(SListHead, sizeof(SLIST_HEADER));
9111
9112 #if defined(_IA64_)
9113 FeatureBits = __getReg(CV_IA64_CPUID4);
9114 if ((FeatureBits & KF_16BYTE_INSTR) != 0)
9115 {
9116 SListHead->Header16.HeaderType = 1;
9117 SListHead->Header16.Init = 1;
9118 }
9119 #endif
9120 }
9121
9122 #endif
9123
9124 #if defined(_WIN64)
9125
9126 #define InterlockedPopEntrySList(Head) \
9127 ExpInterlockedPopEntrySList(Head)
9128
9129 #define InterlockedPushEntrySList(Head, Entry) \
9130 ExpInterlockedPushEntrySList(Head, Entry)
9131
9132 #define InterlockedFlushSList(Head) \
9133 ExpInterlockedFlushSList(Head)
9134
9135 #define QueryDepthSList(Head) \
9136 ExQueryDepthSList(Head)
9137
9138 #else // !defined(_WIN64)
9139
9140 NTKERNELAPI
9141 PSLIST_ENTRY
9142 FASTCALL
9143 InterlockedPopEntrySList(
9144 IN PSLIST_HEADER ListHead);
9145
9146 NTKERNELAPI
9147 PSLIST_ENTRY
9148 FASTCALL
9149 InterlockedPushEntrySList(
9150 IN PSLIST_HEADER ListHead,
9151 IN PSLIST_ENTRY ListEntry);
9152
9153 #define InterlockedFlushSList(ListHead) \
9154 ExInterlockedFlushSList(ListHead)
9155
9156 #define QueryDepthSList(Head) \
9157 ExQueryDepthSList(Head)
9158
9159 #endif // !defined(_WIN64)
9160
9161 #endif // !defined(_WINBASE_)
9162
9163
9164 /******************************************************************************
9165 * Executive Types *
9166 ******************************************************************************/
9167
9168 #define EX_RUNDOWN_ACTIVE 0x1
9169 #define EX_RUNDOWN_COUNT_SHIFT 0x1
9170 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
9171
9172 #ifdef _WIN64
9173 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
9174 #else
9175 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
9176 #endif
9177
9178 typedef enum _SUITE_TYPE {
9179 SmallBusiness,
9180 Enterprise,
9181 BackOffice,
9182 CommunicationServer,
9183 TerminalServer,
9184 SmallBusinessRestricted,
9185 EmbeddedNT,
9186 DataCenter,
9187 SingleUserTS,
9188 Personal,
9189 Blade,
9190 EmbeddedRestricted,
9191 SecurityAppliance,
9192 StorageServer,
9193 ComputeServer,
9194 WHServer,
9195 MaxSuiteType
9196 } SUITE_TYPE;
9197
9198 typedef enum _EX_POOL_PRIORITY {
9199 LowPoolPriority,
9200 LowPoolPrioritySpecialPoolOverrun = 8,
9201 LowPoolPrioritySpecialPoolUnderrun = 9,
9202 NormalPoolPriority = 16,
9203 NormalPoolPrioritySpecialPoolOverrun = 24,
9204 NormalPoolPrioritySpecialPoolUnderrun = 25,
9205 HighPoolPriority = 32,
9206 HighPoolPrioritySpecialPoolOverrun = 40,
9207 HighPoolPrioritySpecialPoolUnderrun = 41
9208 } EX_POOL_PRIORITY;
9209
9210 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
9211 #define LOOKASIDE_ALIGN
9212 #else
9213 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
9214 #endif
9215
9216 typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;
9217
9218 typedef PVOID
9219 (DDKAPI *PALLOCATE_FUNCTION)(
9220 IN POOL_TYPE PoolType,
9221 IN SIZE_T NumberOfBytes,
9222 IN ULONG Tag);
9223
9224 typedef PVOID
9225 (DDKAPI *PALLOCATE_FUNCTION_EX)(
9226 IN POOL_TYPE PoolType,
9227 IN SIZE_T NumberOfBytes,
9228 IN ULONG Tag,
9229 IN OUT PLOOKASIDE_LIST_EX Lookaside);
9230
9231 typedef VOID
9232 (DDKAPI *PFREE_FUNCTION)(
9233 IN PVOID Buffer);
9234
9235 typedef VOID
9236 (DDKAPI *PFREE_FUNCTION_EX)(
9237 IN PVOID Buffer,
9238 IN OUT PLOOKASIDE_LIST_EX Lookaside);
9239
9240 typedef VOID
9241 (DDKAPI *PCALLBACK_FUNCTION)(
9242 IN PVOID CallbackContext,
9243 IN PVOID Argument1,
9244 IN PVOID Argument2);
9245
9246 #define GENERAL_LOOKASIDE_LAYOUT \
9247 union { \
9248 SLIST_HEADER ListHead; \
9249 SINGLE_LIST_ENTRY SingleListHead; \
9250 } DUMMYUNIONNAME; \
9251 USHORT Depth; \
9252 USHORT MaximumDepth; \
9253 ULONG TotalAllocates; \
9254 union { \
9255 ULONG AllocateMisses; \
9256 ULONG AllocateHits; \
9257 } DUMMYUNIONNAME2; \
9258 \
9259 ULONG TotalFrees; \
9260 union { \
9261 ULONG FreeMisses; \
9262 ULONG FreeHits; \
9263 } DUMMYUNIONNAME3; \
9264 \
9265 POOL_TYPE Type; \
9266 ULONG Tag; \
9267 ULONG Size; \
9268 union { \
9269 PALLOCATE_FUNCTION_EX AllocateEx; \
9270 PALLOCATE_FUNCTION Allocate; \
9271 } DUMMYUNIONNAME4; \
9272 \
9273 union { \
9274 PFREE_FUNCTION_EX FreeEx; \
9275 PFREE_FUNCTION Free; \
9276 } DUMMYUNIONNAME5; \
9277 \
9278 LIST_ENTRY ListEntry; \
9279 ULONG LastTotalAllocates; \
9280 union { \
9281 ULONG LastAllocateMisses; \
9282 ULONG LastAllocateHits; \
9283 } DUMMYUNIONNAME6; \
9284 ULONG Future[2];
9285
9286 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE {
9287 GENERAL_LOOKASIDE_LAYOUT
9288 } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
9289
9290 typedef struct _GENERAL_LOOKASIDE_POOL {
9291 GENERAL_LOOKASIDE_LAYOUT
9292 } GENERAL_LOOKASIDE_POOL, *PGENERAL_LOOKASIDE_POOL;
9293
9294 typedef struct _PAGED_LOOKASIDE_LIST {
9295 GENERAL_LOOKASIDE L;
9296 #if !defined(_AMD64_) && !defined(_IA64_)
9297 FAST_MUTEX Lock__ObsoleteButDoNotDelete;
9298 #endif
9299 } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
9300
9301 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST {
9302 GENERAL_LOOKASIDE L;
9303 #if !defined(_AMD64_) && !defined(_IA64_)
9304 KSPIN_LOCK Lock__ObsoleteButDoNotDelete;
9305 #endif
9306 } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
9307
9308 typedef struct _LOOKASIDE_LIST_EX {
9309 GENERAL_LOOKASIDE_POOL L;
9310 } LOOKASIDE_LIST_EX;
9311
9312 typedef struct _EX_RUNDOWN_REF {
9313 __GNU_EXTENSION union {
9314 volatile ULONG_PTR Count;
9315 volatile PVOID Ptr;
9316 };
9317 } EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
9318
9319 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE;
9320
9321 typedef VOID
9322 (DDKAPI *PWORKER_THREAD_ROUTINE)(
9323 IN PVOID Parameter);
9324
9325 typedef struct _WORK_QUEUE_ITEM {
9326 LIST_ENTRY List;
9327 PWORKER_THREAD_ROUTINE WorkerRoutine;
9328 volatile PVOID Parameter;
9329 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
9330
9331
9332 /******************************************************************************
9333 * Executive Functions *
9334 ******************************************************************************/
9335
9336 #define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
9337 #define ExInterlockedDecrementLong(Addend,Lock) Exfi386InterlockedDecrementLong(Addend)
9338 #define ExInterlockedExchangeUlong(Target, Value, Lock) Exfi386InterlockedExchangeUlong(Target, Value)
9339
9340 #define ExInitializeSListHead InitializeSListHead
9341
9342 #if defined(_X86_)
9343 #if defined(_NTHAL_)
9344 #define ExAcquireFastMutex ExiAcquireFastMutex
9345 #define ExReleaseFastMutex ExiReleaseFastMutex
9346 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
9347 #endif
9348 #define ExInterlockedAddUlong ExfInterlockedAddUlong
9349 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
9350 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
9351 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
9352 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
9353 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
9354 #endif
9355
9356 #if defined(_WIN64)
9357
9358 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
9359 defined(_NTHAL_) || defined(_NTOSP_)
9360 NTKERNELAPI
9361 USHORT
9362 ExQueryDepthSList(IN PSLIST_HEADER ListHead);
9363 #else
9364 FORCEINLINE
9365 USHORT
9366 ExQueryDepthSList(IN PSLIST_HEADER ListHead)
9367 {
9368 return (USHORT)(ListHead->Alignment & 0xffff);
9369 }
9370 #endif
9371
9372 NTKERNELAPI
9373 PSLIST_ENTRY
9374 ExpInterlockedFlushSList(
9375 PSLIST_HEADER ListHead);
9376
9377 NTKERNELAPI
9378 PSLIST_ENTRY
9379 ExpInterlockedPopEntrySList(
9380 PSLIST_HEADER ListHead);
9381
9382 NTKERNELAPI
9383 PSLIST_ENTRY
9384 ExpInterlockedPushEntrySList(
9385 PSLIST_HEADER ListHead,
9386 PSLIST_ENTRY ListEntry);
9387
9388 #define ExInterlockedFlushSList(Head) \
9389 ExpInterlockedFlushSList(Head)
9390 #define ExInterlockedPopEntrySList(Head, Lock) \
9391 ExpInterlockedPopEntrySList(Head)
9392 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
9393 ExpInterlockedPushEntrySList(Head, Entry)
9394
9395 #else // !defined(_WIN64)
9396
9397 #define ExQueryDepthSList(listhead) (listhead)->Depth
9398
9399 NTKERNELAPI
9400 PSINGLE_LIST_ENTRY
9401 FASTCALL
9402 ExInterlockedFlushSList(
9403 IN PSLIST_HEADER ListHead);
9404
9405 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
9406 NTKERNELAPI
9407 PSINGLE_LIST_ENTRY
9408 FASTCALL
9409 ExInterlockedPopEntrySList(
9410 IN PSLIST_HEADER ListHead,
9411 IN PKSPIN_LOCK Lock);
9412
9413 NTKERNELAPI
9414 PSINGLE_LIST_ENTRY
9415 FASTCALL
9416 ExInterlockedPushEntrySList(
9417 IN PSLIST_HEADER ListHead,
9418 IN PSINGLE_LIST_ENTRY ListEntry,
9419 IN PKSPIN_LOCK Lock);
9420 #else
9421 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
9422 InterlockedPopEntrySList(_ListHead)
9423 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
9424 InterlockedPushEntrySList(_ListHead, _ListEntry)
9425 #endif // _WIN2K_COMPAT_SLIST_USAGE
9426
9427 #endif // !defined(_WIN64)
9428
9429 /* ERESOURCE_THREAD
9430 * ExGetCurrentResourceThread(
9431 * VOID);
9432 */
9433 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
9434
9435 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
9436
9437 /* VOID
9438 * ExInitializeWorkItem(
9439 * IN PWORK_QUEUE_ITEM Item,
9440 * IN PWORKER_THREAD_ROUTINE Routine,
9441 * IN PVOID Context)
9442 */
9443 #define ExInitializeWorkItem(Item, Routine, Context) \
9444 { \
9445 (Item)->WorkerRoutine = Routine; \
9446 (Item)->Parameter = Context; \
9447 (Item)->List.Flink = NULL; \
9448 }
9449
9450 FORCEINLINE
9451 VOID
9452 ExInitializeFastMutex(
9453 OUT PFAST_MUTEX FastMutex)
9454 {
9455 FastMutex->Count = FM_LOCK_BIT;
9456 FastMutex->Owner = NULL;
9457 FastMutex->Contention = 0;
9458 KeInitializeEvent(&FastMutex->Event, SynchronizationEvent, FALSE);
9459 return;
9460 }
9461
9462 #if (NTDDI_VERSION >= NTDDI_WIN2K)
9463
9464 NTKERNELAPI
9465 VOID
9466 FASTCALL
9467 ExAcquireFastMutex(
9468 IN OUT PFAST_MUTEX FastMutex);
9469
9470 NTKERNELAPI
9471 VOID
9472 FASTCALL
9473 ExReleaseFastMutex(
9474 IN OUT PFAST_MUTEX FastMutex);
9475
9476 NTKERNELAPI
9477 BOOLEAN
9478 FASTCALL
9479 ExTryToAcquireFastMutex(
9480 IN OUT PFAST_MUTEX FastMutex);
9481
9482 NTKERNELAPI
9483 VOID
9484 FASTCALL
9485 ExAcquireFastMutexUnsafe(
9486 IN OUT PFAST_MUTEX FastMutex);
9487
9488 NTKERNELAPI
9489 VOID
9490 FASTCALL
9491 ExReleaseFastMutexUnsafe(
9492 IN OUT PFAST_MUTEX FastMutex);
9493
9494 NTKERNELAPI
9495 BOOLEAN
9496 NTAPI
9497 ExAcquireResourceExclusiveLite(
9498 IN PERESOURCE Resource,
9499 IN BOOLEAN Wait);
9500
9501 NTKERNELAPI
9502 BOOLEAN
9503 NTAPI
9504 ExAcquireResourceSharedLite(
9505 IN PERESOURCE Resource,
9506 IN BOOLEAN Wait);
9507
9508 NTKERNELAPI
9509 BOOLEAN
9510 NTAPI
9511 ExAcquireSharedStarveExclusive(
9512 IN PERESOURCE Resource,
9513 IN BOOLEAN Wait);
9514
9515 NTKERNELAPI
9516 BOOLEAN
9517 NTAPI
9518 ExAcquireSharedWaitForExclusive(
9519 IN PERESOURCE Resource,
9520 IN BOOLEAN Wait);
9521
9522 NTKERNELAPI
9523 PVOID
9524 NTAPI
9525 ExAllocatePool(
9526 IN POOL_TYPE PoolType,
9527 IN SIZE_T NumberOfBytes);
9528
9529 #ifdef POOL_TAGGING
9530 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
9531 #endif /* POOL_TAGGING */
9532
9533 NTKERNELAPI
9534 PVOID
9535 NTAPI
9536 ExAllocatePoolWithQuota(
9537 IN POOL_TYPE PoolType,
9538 IN SIZE_T NumberOfBytes);
9539
9540 #ifdef POOL_TAGGING
9541 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
9542 #endif /* POOL_TAGGING */
9543
9544 NTKERNELAPI
9545 PVOID
9546 NTAPI
9547 ExAllocatePoolWithQuotaTag(
9548 IN POOL_TYPE PoolType,
9549 IN SIZE_T NumberOfBytes,
9550 IN ULONG Tag);
9551
9552 #ifndef POOL_TAGGING
9553 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
9554 #endif /* POOL_TAGGING */
9555
9556 NTKERNELAPI
9557 PVOID
9558 NTAPI
9559 ExAllocatePoolWithTag(
9560 IN POOL_TYPE PoolType,
9561 IN SIZE_T NumberOfBytes,
9562 IN ULONG Tag);
9563
9564 NTKERNELAPI
9565 PVOID
9566 NTAPI
9567 ExAllocatePoolWithTagPriority(
9568 IN POOL_TYPE PoolType,
9569 IN SIZE_T NumberOfBytes,
9570 IN ULONG Tag,
9571 IN EX_POOL_PRIORITY Priority);
9572
9573 NTKERNELAPI
9574 VOID
9575 NTAPI
9576 ExConvertExclusiveToSharedLite(
9577 IN PERESOURCE Resource);
9578
9579 NTKERNELAPI
9580 NTSTATUS
9581 NTAPI
9582 ExCreateCallback(
9583 OUT PCALLBACK_OBJECT *CallbackObject,
9584 IN POBJECT_ATTRIBUTES ObjectAttributes,
9585 IN BOOLEAN Create,
9586 IN BOOLEAN AllowMultipleCallbacks);
9587
9588 NTKERNELAPI
9589 VOID
9590 NTAPI
9591 ExDeleteNPagedLookasideList(
9592 IN PNPAGED_LOOKASIDE_LIST Lookaside);
9593
9594 NTKERNELAPI
9595 VOID
9596 NTAPI
9597 ExDeletePagedLookasideList(
9598 IN PPAGED_LOOKASIDE_LIST Lookaside);
9599
9600 NTKERNELAPI
9601 NTSTATUS
9602 NTAPI
9603 ExDeleteResourceLite(
9604 IN PERESOURCE Resource);
9605
9606 NTKERNELAPI
9607 VOID
9608 NTAPI
9609 ExFreePool(
9610 IN PVOID P);
9611
9612 #ifdef POOL_TAGGING
9613 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
9614 #endif
9615
9616 NTKERNELAPI
9617 VOID
9618 NTAPI
9619 ExFreePoolWithTag(
9620 IN PVOID P,
9621 IN ULONG Tag);
9622
9623 NTKERNELAPI
9624 ULONG
9625 NTAPI
9626 ExGetExclusiveWaiterCount(
9627 IN PERESOURCE Resource);
9628
9629 NTKERNELAPI
9630 KPROCESSOR_MODE
9631 NTAPI
9632 ExGetPreviousMode(
9633 VOID);
9634
9635 NTKERNELAPI
9636 ULONG
9637 NTAPI
9638 ExGetSharedWaiterCount(
9639 IN PERESOURCE Resource);
9640
9641 NTKERNELAPI
9642 VOID
9643 NTAPI
9644 ExInitializeNPagedLookasideList(
9645 IN PNPAGED_LOOKASIDE_LIST Lookaside,
9646 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
9647 IN PFREE_FUNCTION Free OPTIONAL,
9648 IN ULONG Flags,
9649 IN SIZE_T Size,
9650 IN ULONG Tag,
9651 IN USHORT Depth);
9652
9653 NTKERNELAPI
9654 VOID
9655 NTAPI
9656 ExInitializePagedLookasideList(
9657 IN PPAGED_LOOKASIDE_LIST Lookaside,
9658 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
9659 IN PFREE_FUNCTION Free OPTIONAL,
9660 IN ULONG Flags,
9661 IN SIZE_T Size,
9662 IN ULONG Tag,
9663 IN USHORT Depth);
9664
9665 NTKERNELAPI
9666 NTSTATUS
9667 NTAPI
9668 ExInitializeResourceLite(
9669 IN PERESOURCE Resource);
9670
9671 NTKERNELAPI
9672 LARGE_INTEGER
9673 NTAPI
9674 ExInterlockedAddLargeInteger(
9675 IN PLARGE_INTEGER Addend,
9676 IN LARGE_INTEGER Increment,
9677 IN PKSPIN_LOCK Lock);
9678
9679 #if defined(_WIN64)
9680 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
9681 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
9682 #else
9683 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
9684 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
9685 #endif
9686
9687 NTKERNELAPI
9688 ULONG
9689 FASTCALL
9690 ExInterlockedAddUlong(
9691 IN PULONG Addend,
9692 IN ULONG Increment,
9693 PKSPIN_LOCK Lock);
9694
9695 #if defined(_AMD64_) || defined(_IA64_)
9696 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
9697 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
9698 #elif defined(_X86_)
9699 NTKERNELAPI
9700 LONGLONG
9701 FASTCALL
9702 ExfInterlockedCompareExchange64(
9703 IN OUT LONGLONG volatile *Destination,
9704 IN PLONGLONG Exchange,
9705 IN PLONGLONG Comperand);
9706 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
9707 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
9708 #else
9709 NTKERNELAPI
9710 LONGLONG
9711 FASTCALL
9712 ExInterlockedCompareExchange64(
9713 IN OUT LONGLONG volatile *Destination,
9714 IN PLONGLONG Exchange,
9715 IN PLONGLONG Comparand,
9716 IN PKSPIN_LOCK Lock);
9717 #endif
9718
9719 NTKERNELAPI
9720 PLIST_ENTRY
9721 FASTCALL
9722 ExInterlockedInsertHeadList(
9723 IN PLIST_ENTRY ListHead,
9724 IN PLIST_ENTRY ListEntry,
9725 IN PKSPIN_LOCK Lock);
9726
9727 NTKERNELAPI
9728 PLIST_ENTRY
9729 FASTCALL
9730 ExInterlockedInsertTailList(
9731 IN PLIST_ENTRY ListHead,
9732 IN PLIST_ENTRY ListEntry,
9733 IN PKSPIN_LOCK Lock);
9734
9735 NTKERNELAPI
9736 PSINGLE_LIST_ENTRY
9737 FASTCALL
9738 ExInterlockedPopEntryList(
9739 IN PSINGLE_LIST_ENTRY ListHead,
9740 IN PKSPIN_LOCK Lock);
9741
9742 NTKERNELAPI
9743 PSINGLE_LIST_ENTRY
9744 FASTCALL
9745 ExInterlockedPushEntryList(
9746 IN PSINGLE_LIST_ENTRY ListHead,
9747 IN PSINGLE_LIST_ENTRY ListEntry,
9748 IN PKSPIN_LOCK Lock);
9749
9750 NTKERNELAPI
9751 PLIST_ENTRY
9752 FASTCALL
9753 ExInterlockedRemoveHeadList(
9754 IN PLIST_ENTRY ListHead,
9755 IN PKSPIN_LOCK Lock);
9756
9757 NTKERNELAPI
9758 BOOLEAN
9759 NTAPI
9760 ExIsProcessorFeaturePresent(
9761 IN ULONG ProcessorFeature);
9762
9763 NTKERNELAPI
9764 BOOLEAN
9765 NTAPI
9766 ExIsResourceAcquiredExclusiveLite(
9767 IN PERESOURCE Resource);
9768
9769 NTKERNELAPI
9770 ULONG
9771 NTAPI
9772 ExIsResourceAcquiredSharedLite(
9773 IN PERESOURCE Resource);
9774
9775 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
9776
9777 NTKERNELAPI
9778 VOID
9779 NTAPI
9780 ExLocalTimeToSystemTime(
9781 IN PLARGE_INTEGER LocalTime,
9782 OUT PLARGE_INTEGER SystemTime);
9783
9784 NTKERNELAPI
9785 VOID
9786 NTAPI
9787 ExNotifyCallback(
9788 IN PCALLBACK_OBJECT CallbackObject,
9789 IN PVOID Argument1,
9790 IN PVOID Argument2);
9791
9792 NTKERNELAPI
9793 VOID
9794 NTAPI
9795 ExQueueWorkItem(
9796 IN PWORK_QUEUE_ITEM WorkItem,
9797 IN WORK_QUEUE_TYPE QueueType);
9798
9799 NTKERNELAPI
9800 DECLSPEC_NORETURN
9801 VOID
9802 NTAPI
9803 ExRaiseStatus(
9804 IN NTSTATUS Status);
9805
9806 NTKERNELAPI
9807 PVOID
9808 NTAPI
9809 ExRegisterCallback(
9810 IN PCALLBACK_OBJECT CallbackObject,
9811 IN PCALLBACK_FUNCTION CallbackFunction,
9812 IN PVOID CallbackContext);
9813
9814 NTKERNELAPI
9815 NTSTATUS
9816 NTAPI
9817 ExReinitializeResourceLite(
9818 IN PERESOURCE Resource);
9819
9820 NTKERNELAPI
9821 VOID
9822 NTAPI
9823 ExReleaseResourceForThreadLite(
9824 IN PERESOURCE Resource,
9825 IN ERESOURCE_THREAD ResourceThreadId);
9826
9827 NTKERNELAPI
9828 VOID
9829 FASTCALL
9830 ExReleaseResourceLite(
9831 IN PERESOURCE Resource);
9832
9833 NTKERNELAPI
9834 VOID
9835 NTAPI
9836 ExSetResourceOwnerPointer(
9837 IN PERESOURCE Resource,
9838 IN PVOID OwnerPointer);
9839
9840 NTKERNELAPI
9841 ULONG
9842 NTAPI
9843 ExSetTimerResolution(
9844 IN ULONG DesiredTime,
9845 IN BOOLEAN SetResolution);
9846
9847 NTKERNELAPI
9848 VOID
9849 NTAPI
9850 ExSystemTimeToLocalTime(
9851 IN PLARGE_INTEGER SystemTime,
9852 OUT PLARGE_INTEGER LocalTime);
9853
9854 NTKERNELAPI
9855 VOID
9856 NTAPI
9857 ExUnregisterCallback(
9858 IN PVOID CbRegistration);
9859
9860
9861 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
9862
9863 #if (NTDDI_VERSION >= NTDDI_WINXP)
9864 NTKERNELAPI
9865 BOOLEAN
9866 FASTCALL
9867 ExAcquireRundownProtection(
9868 IN OUT PEX_RUNDOWN_REF RunRef);
9869
9870 NTKERNELAPI
9871 VOID
9872 FASTCALL
9873 ExInitializeRundownProtection(
9874 OUT PEX_RUNDOWN_REF RunRef);
9875
9876 NTKERNELAPI
9877 VOID
9878 FASTCALL
9879 ExReInitializeRundownProtection(
9880 OUT PEX_RUNDOWN_REF RunRef);
9881
9882 NTKERNELAPI
9883 VOID
9884 FASTCALL
9885 ExReleaseRundownProtection(
9886 IN OUT PEX_RUNDOWN_REF RunRef);
9887
9888 NTKERNELAPI
9889 VOID
9890 FASTCALL
9891 ExRundownCompleted(
9892 OUT PEX_RUNDOWN_REF RunRef);
9893
9894 NTKERNELAPI
9895 BOOLEAN
9896 NTAPI
9897 ExVerifySuite(
9898 IN SUITE_TYPE SuiteType);
9899
9900 NTKERNELAPI
9901 VOID
9902 FASTCALL
9903 ExWaitForRundownProtectionRelease(
9904 IN OUT PEX_RUNDOWN_REF RunRef);
9905
9906 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
9907
9908 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
9909 NTKERNELAPI
9910 BOOLEAN
9911 FASTCALL
9912 ExAcquireRundownProtectionEx(
9913 IN OUT PEX_RUNDOWN_REF RunRef,
9914 IN ULONG Count);
9915
9916 NTKERNELAPI
9917 VOID
9918 FASTCALL
9919 ExReleaseRundownProtectionEx(
9920 IN OUT PEX_RUNDOWN_REF RunRef,
9921 IN ULONG Count);
9922 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
9923
9924 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
9925 NTKERNELAPI
9926 PEX_RUNDOWN_REF_CACHE_AWARE
9927 NTAPI
9928 ExAllocateCacheAwareRundownProtection(
9929 IN POOL_TYPE PoolType,
9930 IN ULONG PoolTag);
9931
9932 NTKERNELAPI
9933 SIZE_T
9934 NTAPI
9935 ExSizeOfRundownProtectionCacheAware(VOID);
9936 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
9937
9938 #if (NTDDI_VERSION >= NTDDI_VISTA)
9939 NTKERNELAPI
9940 NTSTATUS
9941 NTAPI
9942 ExInitializeLookasideListEx(
9943 OUT PLOOKASIDE_LIST_EX Lookaside,
9944 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,
9945 IN PFREE_FUNCTION_EX Free OPTIONAL,
9946 IN POOL_TYPE PoolType,
9947 IN ULONG Flags,
9948 IN SIZE_T Size,
9949 IN ULONG Tag,
9950 IN USHORT Depth);
9951 #endif
9952
9953 #if !defined(MIDL_PASS)
9954
9955 static __inline PVOID
9956 ExAllocateFromNPagedLookasideList(
9957 IN PNPAGED_LOOKASIDE_LIST Lookaside)
9958 {
9959 PVOID Entry;
9960
9961 Lookaside->L.TotalAllocates++;
9962 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
9963 if (Entry == NULL) {
9964 Lookaside->L.AllocateMisses++;
9965 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
9966 Lookaside->L.Size,
9967 Lookaside->L.Tag);
9968 }
9969 return Entry;
9970 }
9971
9972 static __inline PVOID
9973 ExAllocateFromPagedLookasideList(
9974 IN PPAGED_LOOKASIDE_LIST Lookaside)
9975 {
9976 PVOID Entry;
9977
9978 Lookaside->L.TotalAllocates++;
9979 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
9980 if (Entry == NULL) {
9981 Lookaside->L.AllocateMisses++;
9982 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
9983 Lookaside->L.Size,
9984 Lookaside->L.Tag);
9985 }
9986 return Entry;
9987 }
9988
9989 static __inline VOID
9990 ExFreeToNPagedLookasideList(
9991 IN PNPAGED_LOOKASIDE_LIST Lookaside,
9992 IN PVOID Entry)
9993 {
9994 Lookaside->L.TotalFrees++;
9995 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
9996 Lookaside->L.FreeMisses++;
9997 (Lookaside->L.Free)(Entry);
9998 } else {
9999 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
10000 }
10001 }
10002
10003 static __inline VOID
10004 ExFreeToPagedLookasideList(
10005 IN PPAGED_LOOKASIDE_LIST Lookaside,
10006 IN PVOID Entry)
10007 {
10008 Lookaside->L.TotalFrees++;
10009 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
10010 Lookaside->L.FreeMisses++;
10011 (Lookaside->L.Free)(Entry);
10012 } else {
10013 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
10014 }
10015 }
10016
10017 #endif // !defined(MIDL_PASS)
10018
10019 /******************************************************************************
10020 * Object Manager Functions *
10021 ******************************************************************************/
10022
10023 /*
10024 * VOID
10025 * ObDereferenceObject(
10026 * IN PVOID Object)
10027 */
10028 #define ObDereferenceObject ObfDereferenceObject
10029
10030 /*
10031 * VOID
10032 * ObReferenceObject(
10033 * IN PVOID Object)
10034 */
10035 #define ObReferenceObject ObfReferenceObject
10036
10037 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10038
10039 NTKERNELAPI
10040 LONG_PTR
10041 FASTCALL
10042 ObfDereferenceObject(
10043 IN PVOID Object);
10044
10045 NTKERNELAPI
10046 NTSTATUS
10047 NTAPI
10048 ObGetObjectSecurity(
10049 IN PVOID Object,
10050 OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
10051 OUT PBOOLEAN MemoryAllocated);
10052
10053 NTKERNELAPI
10054 LONG_PTR
10055 FASTCALL
10056 ObfReferenceObject(
10057 IN PVOID Object);
10058
10059 NTKERNELAPI
10060 NTSTATUS
10061 NTAPI
10062 ObReferenceObjectByHandle(
10063 IN HANDLE Handle,
10064 IN ACCESS_MASK DesiredAccess,
10065 IN POBJECT_TYPE ObjectType OPTIONAL,
10066 IN KPROCESSOR_MODE AccessMode,
10067 OUT PVOID *Object,
10068 OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL);
10069
10070 NTKERNELAPI
10071 NTSTATUS
10072 NTAPI
10073 ObReferenceObjectByPointer(
10074 IN PVOID Object,
10075 IN ACCESS_MASK DesiredAccess,
10076 IN POBJECT_TYPE ObjectType OPTIONAL,
10077 IN KPROCESSOR_MODE AccessMode);
10078
10079 NTKERNELAPI
10080 VOID
10081 NTAPI
10082 ObReleaseObjectSecurity(
10083 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
10084 IN BOOLEAN MemoryAllocated);
10085
10086 #endif
10087
10088 /******************************************************************************
10089 * Process Manager Functions *
10090 ******************************************************************************/
10091
10092 /*
10093 * PEPROCESS
10094 * PsGetCurrentProcess(VOID)
10095 */
10096 #define PsGetCurrentProcess IoGetCurrentProcess
10097
10098 #if !defined(_PSGETCURRENTTHREAD_)
10099
10100 #define _PSGETCURRENTTHREAD_
10101
10102 FORCEINLINE
10103 PETHREAD
10104 NTAPI
10105 PsGetCurrentThread (
10106 VOID)
10107 {
10108 return (PETHREAD)KeGetCurrentThread();
10109 }
10110
10111 #endif
10112
10113 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10114
10115 NTKERNELAPI
10116 NTSTATUS
10117 NTAPI
10118 PsCreateSystemThread(
10119 OUT PHANDLE ThreadHandle,
10120 IN ULONG DesiredAccess,
10121 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
10122 IN HANDLE ProcessHandle OPTIONAL,
10123 OUT PCLIENT_ID ClientId OPTIONAL,
10124 IN PKSTART_ROUTINE StartRoutine,
10125 IN PVOID StartContext OPTIONAL);
10126
10127 NTKERNELAPI
10128 NTSTATUS
10129 NTAPI
10130 PsTerminateSystemThread(
10131 IN NTSTATUS ExitStatus);
10132
10133 #endif
10134
10135 /******************************************************************************
10136 * ZwXxx Functions *
10137 ******************************************************************************/
10138
10139 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10140
10141 NTSYSAPI
10142 NTSTATUS
10143 NTAPI
10144 ZwClose(
10145 IN HANDLE Handle);
10146
10147 NTSYSAPI
10148 NTSTATUS
10149 NTAPI
10150 ZwCreateDirectoryObject(
10151 OUT PHANDLE DirectoryHandle,
10152 IN ACCESS_MASK DesiredAccess,
10153 IN POBJECT_ATTRIBUTES ObjectAttributes);
10154
10155 NTSYSAPI
10156 NTSTATUS
10157 NTAPI
10158 ZwCreateFile(
10159 OUT PHANDLE FileHandle,
10160 IN ACCESS_MASK DesiredAccess,
10161 IN POBJECT_ATTRIBUTES ObjectAttributes,
10162 OUT PIO_STATUS_BLOCK IoStatusBlock,
10163 IN PLARGE_INTEGER AllocationSize OPTIONAL,
10164 IN ULONG FileAttributes,
10165 IN ULONG ShareAccess,
10166 IN ULONG CreateDisposition,
10167 IN ULONG CreateOptions,
10168 IN PVOID EaBuffer OPTIONAL,
10169 IN ULONG EaLength);
10170
10171 NTSYSAPI
10172 NTSTATUS
10173 NTAPI
10174 ZwCreateKey(
10175 OUT PHANDLE KeyHandle,
10176 IN ACCESS_MASK DesiredAccess,
10177 IN POBJECT_ATTRIBUTES ObjectAttributes,
10178 IN ULONG TitleIndex,
10179 IN PUNICODE_STRING Class OPTIONAL,
10180 IN ULONG CreateOptions,
10181 OUT PULONG Disposition OPTIONAL);
10182
10183 NTSYSAPI
10184 NTSTATUS
10185 NTAPI
10186 ZwCreateSection(
10187 OUT PHANDLE SectionHandle,
10188 IN ACCESS_MASK DesiredAccess,
10189 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
10190 IN PLARGE_INTEGER MaximumSize OPTIONAL,
10191 IN ULONG SectionPageProtection,
10192 IN ULONG AllocationAttributes,
10193 IN HANDLE FileHandle OPTIONAL);
10194
10195 NTSYSAPI
10196 NTSTATUS
10197 NTAPI
10198 ZwDeleteKey(
10199 IN HANDLE KeyHandle);
10200
10201 NTSYSAPI
10202 NTSTATUS
10203 NTAPI
10204 ZwDeleteValueKey(
10205 IN HANDLE KeyHandle,
10206 IN PUNICODE_STRING ValueName);
10207
10208 NTSYSAPI
10209 NTSTATUS
10210 NTAPI
10211 ZwEnumerateKey(
10212 IN HANDLE KeyHandle,
10213 IN ULONG Index,
10214 IN KEY_INFORMATION_CLASS KeyInformationClass,
10215 OUT PVOID KeyInformation OPTIONAL,
10216 IN ULONG Length,
10217 OUT PULONG ResultLength);
10218
10219 NTSYSAPI
10220 NTSTATUS
10221 NTAPI
10222 ZwEnumerateValueKey(
10223 IN HANDLE KeyHandle,
10224 IN ULONG Index,
10225 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
10226 OUT PVOID KeyValueInformation OPTIONAL,
10227 IN ULONG Length,
10228 OUT PULONG ResultLength);
10229
10230 NTSYSAPI
10231 NTSTATUS
10232 NTAPI
10233 ZwFlushKey(
10234 IN HANDLE KeyHandle);
10235
10236 NTSYSAPI
10237 NTSTATUS
10238 NTAPI
10239 ZwLoadDriver(
10240 IN PUNICODE_STRING DriverServiceName);
10241
10242 NTSYSAPI
10243 NTSTATUS
10244 NTAPI
10245 ZwMakeTemporaryObject(
10246 IN HANDLE Handle);
10247
10248 NTSYSAPI
10249 NTSTATUS
10250 NTAPI
10251 ZwMapViewOfSection(
10252 IN HANDLE SectionHandle,
10253 IN HANDLE ProcessHandle,
10254 IN OUT PVOID *BaseAddress,
10255 IN ULONG_PTR ZeroBits,
10256 IN SIZE_T CommitSize,
10257 IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
10258 IN OUT PSIZE_T ViewSize,
10259 IN SECTION_INHERIT InheritDisposition,
10260 IN ULONG AllocationType,
10261 IN ULONG Protect);
10262
10263 NTSYSAPI
10264 NTSTATUS
10265 NTAPI
10266 ZwOpenFile(
10267 OUT PHANDLE FileHandle,
10268 IN ACCESS_MASK DesiredAccess,
10269 IN POBJECT_ATTRIBUTES ObjectAttributes,
10270 OUT PIO_STATUS_BLOCK IoStatusBlock,
10271 IN ULONG ShareAccess,
10272 IN ULONG OpenOptions);
10273
10274 NTSYSAPI
10275 NTSTATUS
10276 NTAPI
10277 ZwOpenKey(
10278 OUT PHANDLE KeyHandle,
10279 IN ACCESS_MASK DesiredAccess,
10280 IN POBJECT_ATTRIBUTES ObjectAttributes);
10281
10282 NTSYSAPI
10283 NTSTATUS
10284 NTAPI
10285 ZwOpenSection(
10286 OUT PHANDLE SectionHandle,
10287 IN ACCESS_MASK DesiredAccess,
10288 IN POBJECT_ATTRIBUTES ObjectAttributes);
10289
10290 NTSYSAPI
10291 NTSTATUS
10292 NTAPI
10293 ZwOpenSymbolicLinkObject(
10294 OUT PHANDLE LinkHandle,
10295 IN ACCESS_MASK DesiredAccess,
10296 IN POBJECT_ATTRIBUTES ObjectAttributes);
10297
10298 NTSYSAPI
10299 NTSTATUS
10300 NTAPI
10301 ZwQueryInformationFile(
10302 IN HANDLE FileHandle,
10303 OUT PIO_STATUS_BLOCK IoStatusBlock,
10304 OUT PVOID FileInformation,
10305 IN ULONG Length,
10306 IN FILE_INFORMATION_CLASS FileInformationClass);
10307
10308 NTSYSAPI
10309 NTSTATUS
10310 NTAPI
10311 ZwQueryKey(
10312 IN HANDLE KeyHandle,
10313 IN KEY_INFORMATION_CLASS KeyInformationClass,
10314 OUT PVOID KeyInformation OPTIONAL,
10315 IN ULONG Length,
10316 OUT PULONG ResultLength);
10317
10318 NTSYSAPI
10319 NTSTATUS
10320 NTAPI
10321 ZwQuerySymbolicLinkObject(
10322 IN HANDLE LinkHandle,
10323 IN OUT PUNICODE_STRING LinkTarget,
10324 OUT PULONG ReturnedLength OPTIONAL);
10325
10326 NTSYSAPI
10327 NTSTATUS
10328 NTAPI
10329 ZwQueryValueKey(
10330 IN HANDLE KeyHandle,
10331 IN PUNICODE_STRING ValueName,
10332 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
10333 OUT PVOID KeyValueInformation OPTIONAL,
10334 IN ULONG Length,
10335 OUT PULONG ResultLength);
10336
10337 NTSYSAPI
10338 NTSTATUS
10339 NTAPI
10340 ZwReadFile(
10341 IN HANDLE FileHandle,
10342 IN HANDLE Event OPTIONAL,
10343 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
10344 IN PVOID ApcContext OPTIONAL,
10345 OUT PIO_STATUS_BLOCK IoStatusBlock,
10346 OUT PVOID Buffer,
10347 IN ULONG Length,
10348 IN PLARGE_INTEGER ByteOffset OPTIONAL,
10349 IN PULONG Key OPTIONAL);
10350
10351 NTSYSAPI
10352 NTSTATUS
10353 NTAPI
10354 ZwSetInformationFile(
10355 IN HANDLE FileHandle,
10356 OUT PIO_STATUS_BLOCK IoStatusBlock,
10357 IN PVOID FileInformation,
10358 IN ULONG Length,
10359 IN FILE_INFORMATION_CLASS FileInformationClass);
10360
10361 NTSYSAPI
10362 NTSTATUS
10363 NTAPI
10364 ZwSetValueKey(
10365 IN HANDLE KeyHandle,
10366 IN PUNICODE_STRING ValueName,
10367 IN ULONG TitleIndex OPTIONAL,
10368 IN ULONG Type,
10369 IN PVOID Data OPTIONAL,
10370 IN ULONG DataSize);
10371
10372 NTSYSAPI
10373 NTSTATUS
10374 NTAPI
10375 ZwUnloadDriver(
10376 IN PUNICODE_STRING DriverServiceName);
10377
10378 NTSYSAPI
10379 NTSTATUS
10380 NTAPI
10381 ZwUnmapViewOfSection(
10382 IN HANDLE ProcessHandle,
10383 IN PVOID BaseAddress OPTIONAL);
10384
10385 NTSYSAPI
10386 NTSTATUS
10387 NTAPI
10388 ZwWriteFile(
10389 IN HANDLE FileHandle,
10390 IN HANDLE Event OPTIONAL,
10391 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
10392 IN PVOID ApcContext OPTIONAL,
10393 OUT PIO_STATUS_BLOCK IoStatusBlock,
10394 IN PVOID Buffer,
10395 IN ULONG Length,
10396 IN PLARGE_INTEGER ByteOffset OPTIONAL,
10397 IN PULONG Key OPTIONAL);
10398
10399 NTSYSAPI
10400 NTSTATUS
10401 NTAPI
10402 ZwQueryFullAttributesFile(
10403 IN POBJECT_ATTRIBUTES ObjectAttributes,
10404 OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation);
10405
10406 #endif
10407
10408 #if (NTDDI_VERSION >= NTDDI_WIN2003)
10409
10410 NTSYSCALLAPI
10411 NTSTATUS
10412 NTAPI
10413 ZwOpenEvent(
10414 OUT PHANDLE EventHandle,
10415 IN ACCESS_MASK DesiredAccess,
10416 IN POBJECT_ATTRIBUTES ObjectAttributes);
10417
10418 #endif
10419
10420 #if (NTDDI_VERSION >= NTDDI_VISTA)
10421
10422 NTSYSAPI
10423 NTSTATUS
10424 ZwCreateKeyTransacted(
10425 OUT PHANDLE KeyHandle,
10426 IN ACCESS_MASK DesiredAccess,
10427 IN POBJECT_ATTRIBUTES ObjectAttributes,
10428 IN ULONG TitleIndex,
10429 IN PUNICODE_STRING Class OPTIONAL,
10430 IN ULONG CreateOptions,
10431 IN HANDLE TransactionHandle,
10432 OUT PULONG Disposition OPTIONAL);
10433
10434 NTSYSAPI
10435 NTSTATUS
10436 NTAPI
10437 ZwOpenKeyTransacted(
10438 OUT PHANDLE KeyHandle,
10439 IN ACCESS_MASK DesiredAccess,
10440 IN POBJECT_ATTRIBUTES ObjectAttributes,
10441 IN HANDLE TransactionHandle);
10442
10443 NTSYSCALLAPI
10444 NTSTATUS
10445 NTAPI
10446 ZwCreateTransactionManager(
10447 OUT PHANDLE TmHandle,
10448 IN ACCESS_MASK DesiredAccess,
10449 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
10450 IN PUNICODE_STRING LogFileName OPTIONAL,
10451 IN ULONG CreateOptions OPTIONAL,
10452 IN ULONG CommitStrength OPTIONAL);
10453
10454 NTSYSCALLAPI
10455 NTSTATUS
10456 NTAPI
10457 ZwOpenTransactionManager(
10458 OUT PHANDLE TmHandle,
10459 IN ACCESS_MASK DesiredAccess,
10460 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
10461 IN PUNICODE_STRING LogFileName OPTIONAL,
10462 IN LPGUID TmIdentity OPTIONAL,
10463 IN ULONG OpenOptions OPTIONAL);
10464
10465 NTSYSCALLAPI
10466 NTSTATUS
10467 NTAPI
10468 ZwRollforwardTransactionManager(
10469 IN HANDLE TransactionManagerHandle,
10470 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
10471
10472 NTSYSCALLAPI
10473 NTSTATUS
10474 NTAPI
10475 ZwRecoverTransactionManager(
10476 IN HANDLE TransactionManagerHandle);
10477
10478 NTSYSCALLAPI
10479 NTSTATUS
10480 NTAPI
10481 ZwQueryInformationTransactionManager(
10482 IN HANDLE TransactionManagerHandle,
10483 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
10484 OUT PVOID TransactionManagerInformation,
10485 IN ULONG TransactionManagerInformationLength,
10486 OUT PULONG ReturnLength OPTIONAL);
10487
10488 NTSYSCALLAPI
10489 NTSTATUS
10490 NTAPI
10491 ZwSetInformationTransactionManager(
10492 IN HANDLE TmHandle,
10493 IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass,
10494 IN PVOID TransactionManagerInformation,
10495 IN ULONG TransactionManagerInformationLength);
10496
10497 NTSYSCALLAPI
10498 NTSTATUS
10499 NTAPI
10500 ZwEnumerateTransactionObject(
10501 IN HANDLE RootObjectHandle OPTIONAL,
10502 IN KTMOBJECT_TYPE QueryType,
10503 IN OUT PKTMOBJECT_CURSOR ObjectCursor,
10504 IN ULONG ObjectCursorLength,
10505 OUT PULONG ReturnLength);
10506
10507 NTSYSCALLAPI
10508 NTSTATUS
10509 NTAPI
10510 ZwCreateTransaction(
10511 OUT PHANDLE TransactionHandle,
10512 IN ACCESS_MASK DesiredAccess,
10513 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
10514 IN LPGUID Uow OPTIONAL,
10515 IN HANDLE TmHandle OPTIONAL,
10516 IN ULONG CreateOptions OPTIONAL,
10517 IN ULONG IsolationLevel OPTIONAL,
10518 IN ULONG IsolationFlags OPTIONAL,
10519 IN PLARGE_INTEGER Timeout OPTIONAL,
10520 IN PUNICODE_STRING Description OPTIONAL);
10521
10522 NTSYSCALLAPI
10523 NTSTATUS
10524 NTAPI
10525 ZwOpenTransaction(
10526 OUT PHANDLE TransactionHandle,
10527 IN ACCESS_MASK DesiredAccess,
10528 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
10529 IN LPGUID Uow,
10530 IN HANDLE TmHandle OPTIONAL);
10531
10532 NTSYSCALLAPI
10533 NTSTATUS
10534 NTAPI
10535 ZwQueryInformationTransaction(
10536 IN HANDLE TransactionHandle,
10537 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
10538 OUT PVOID TransactionInformation,
10539 IN ULONG TransactionInformationLength,
10540 OUT PULONG ReturnLength OPTIONAL);
10541
10542 NTSYSCALLAPI
10543 NTSTATUS
10544 NTAPI
10545 ZwSetInformationTransaction(
10546 IN HANDLE TransactionHandle,
10547 IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass,
10548 IN PVOID TransactionInformation,
10549 IN ULONG TransactionInformationLength);
10550
10551 NTSYSCALLAPI
10552 NTSTATUS
10553 NTAPI
10554 ZwCommitTransaction(
10555 IN HANDLE TransactionHandle,
10556 IN BOOLEAN Wait);
10557
10558 NTSYSCALLAPI
10559 NTSTATUS
10560 NTAPI
10561 ZwRollbackTransaction(
10562 IN HANDLE TransactionHandle,
10563 IN BOOLEAN Wait);
10564
10565 NTSYSCALLAPI
10566 NTSTATUS
10567 NTAPI
10568 ZwCreateResourceManager(
10569 OUT PHANDLE ResourceManagerHandle,
10570 IN ACCESS_MASK DesiredAccess,
10571 IN HANDLE TmHandle,
10572 IN LPGUID ResourceManagerGuid OPTIONAL,
10573 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
10574 IN ULONG CreateOptions OPTIONAL,
10575 IN PUNICODE_STRING Description OPTIONAL);
10576
10577 NTSYSCALLAPI
10578 NTSTATUS
10579 NTAPI
10580 ZwOpenResourceManager(
10581 OUT PHANDLE ResourceManagerHandle,
10582 IN ACCESS_MASK DesiredAccess,
10583 IN HANDLE TmHandle,
10584 IN LPGUID ResourceManagerGuid,
10585 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
10586
10587 NTSYSCALLAPI
10588 NTSTATUS
10589 NTAPI
10590 ZwRecoverResourceManager(
10591 IN HANDLE ResourceManagerHandle);
10592
10593 NTSYSCALLAPI
10594 NTSTATUS
10595 NTAPI
10596 ZwGetNotificationResourceManager(
10597 IN HANDLE ResourceManagerHandle,
10598 OUT PTRANSACTION_NOTIFICATION TransactionNotification,
10599 IN ULONG NotificationLength,
10600 IN PLARGE_INTEGER Timeout,
10601 IN PULONG ReturnLength OPTIONAL,
10602 IN ULONG Asynchronous,
10603 IN ULONG_PTR AsynchronousContext OPTIONAL);
10604
10605 NTSYSCALLAPI
10606 NTSTATUS
10607 NTAPI
10608 ZwQueryInformationResourceManager(
10609 IN HANDLE ResourceManagerHandle,
10610 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
10611 OUT PVOID ResourceManagerInformation,
10612 IN ULONG ResourceManagerInformationLength,
10613 IN PULONG ReturnLength OPTIONAL);
10614
10615 NTSYSCALLAPI
10616 NTSTATUS
10617 NTAPI
10618 ZwSetInformationResourceManager(
10619 IN HANDLE ResourceManagerHandle,
10620 IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass,
10621 IN PVOID ResourceManagerInformation,
10622 IN ULONG ResourceManagerInformationLength);
10623
10624 NTSYSCALLAPI
10625 NTSTATUS
10626 NTAPI
10627 ZwCreateEnlistment(
10628 OUT PHANDLE EnlistmentHandle,
10629 IN ACCESS_MASK DesiredAccess,
10630 IN HANDLE ResourceManagerHandle,
10631 IN HANDLE TransactionHandle,
10632 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
10633 IN ULONG CreateOptions OPTIONAL,
10634 IN NOTIFICATION_MASK NotificationMask,
10635 IN PVOID EnlistmentKey OPTIONAL);
10636
10637 NTSYSCALLAPI
10638 NTSTATUS
10639 NTAPI
10640 ZwOpenEnlistment(
10641 OUT PHANDLE EnlistmentHandle,
10642 IN ACCESS_MASK DesiredAccess,
10643 IN HANDLE RmHandle,
10644 IN LPGUID EnlistmentGuid,
10645 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL);
10646
10647 NTSYSCALLAPI
10648 NTSTATUS
10649 NTAPI
10650 ZwQueryInformationEnlistment(
10651 IN HANDLE EnlistmentHandle,
10652 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
10653 OUT PVOID EnlistmentInformation,
10654 IN ULONG EnlistmentInformationLength,
10655 IN PULONG ReturnLength OPTIONAL);
10656
10657 NTSYSCALLAPI
10658 NTSTATUS
10659 NTAPI
10660 ZwSetInformationEnlistment(
10661 IN HANDLE EnlistmentHandle,
10662 IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass,
10663 IN PVOID EnlistmentInformation,
10664 IN ULONG EnlistmentInformationLength);
10665
10666 NTSYSCALLAPI
10667 NTSTATUS
10668 NTAPI
10669 ZwRecoverEnlistment(
10670 IN HANDLE EnlistmentHandle,
10671 IN PVOID EnlistmentKey OPTIONAL);
10672
10673 NTSYSCALLAPI
10674 NTSTATUS
10675 NTAPI
10676 ZwPrePrepareEnlistment(
10677 IN HANDLE EnlistmentHandle,
10678 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
10679
10680 NTSYSCALLAPI
10681 NTSTATUS
10682 NTAPI
10683 ZwPrepareEnlistment(
10684 IN HANDLE EnlistmentHandle,
10685 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
10686
10687 NTSYSCALLAPI
10688 NTSTATUS
10689 NTAPI
10690 ZwCommitEnlistment(
10691 IN HANDLE EnlistmentHandle,
10692 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
10693
10694 NTSYSCALLAPI
10695 NTSTATUS
10696 NTAPI
10697 ZwRollbackEnlistment(
10698 IN HANDLE EnlistmentHandle,
10699 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
10700
10701 NTSYSCALLAPI
10702 NTSTATUS
10703 NTAPI
10704 ZwPrePrepareComplete(
10705 IN HANDLE EnlistmentHandle,
10706 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
10707
10708 NTSYSCALLAPI
10709 NTSTATUS
10710 NTAPI
10711 ZwPrepareComplete(
10712 IN HANDLE EnlistmentHandle,
10713 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
10714
10715 NTSYSCALLAPI
10716 NTSTATUS
10717 NTAPI
10718 ZwCommitComplete(
10719 IN HANDLE EnlistmentHandle,
10720 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
10721
10722 NTSYSCALLAPI
10723 NTSTATUS
10724 NTAPI
10725 ZwReadOnlyEnlistment(
10726 IN HANDLE EnlistmentHandle,
10727 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
10728
10729 NTSYSCALLAPI
10730 NTSTATUS
10731 NTAPI
10732 ZwRollbackComplete(
10733 IN HANDLE EnlistmentHandle,
10734 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
10735
10736 NTSYSCALLAPI
10737 NTSTATUS
10738 NTAPI
10739 ZwSinglePhaseReject(
10740 IN HANDLE EnlistmentHandle,
10741 IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
10742
10743
10744 #endif
10745
10746 #if (NTDDI_VERSION >= NTDDI_WIN7)
10747
10748 NTSYSAPI
10749 NTSTATUS
10750 NTAPI
10751 ZwOpenKeyEx(
10752 OUT PHANDLE KeyHandle,
10753 IN ACCESS_MASK DesiredAccess,
10754 IN POBJECT_ATTRIBUTES ObjectAttributes,
10755 IN ULONG OpenOptions);
10756
10757 NTSYSAPI
10758 NTSTATUS
10759 NTAPI
10760 ZwOpenKeyTransactedEx(
10761 OUT PHANDLE KeyHandle,
10762 IN ACCESS_MASK DesiredAccess,
10763 IN POBJECT_ATTRIBUTES ObjectAttributes,
10764 IN ULONG OpenOptions,
10765 IN HANDLE TransactionHandle);
10766
10767 NTSYSAPI
10768 NTSTATUS
10769 NTAPI
10770 ZwNotifyChangeMultipleKeys(
10771 IN HANDLE MasterKeyHandle,
10772 IN ULONG Count OPTIONAL,
10773 IN OBJECT_ATTRIBUTES SubordinateObjects[] OPTIONAL,
10774 IN HANDLE Event OPTIONAL,
10775 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
10776 IN PVOID ApcContext OPTIONAL,
10777 OUT PIO_STATUS_BLOCK IoStatusBlock,
10778 IN ULONG CompletionFilter,
10779 IN BOOLEAN WatchTree,
10780 OUT PVOID Buffer OPTIONAL,
10781 IN ULONG BufferSize,
10782 IN BOOLEAN Asynchronous);
10783
10784 NTSYSAPI
10785 NTSTATUS
10786 NTAPI
10787 ZwQueryMultipleValueKey(
10788 IN HANDLE KeyHandle,
10789 IN OUT PKEY_VALUE_ENTRY ValueEntries,
10790 IN ULONG EntryCount,
10791 OUT PVOID ValueBuffer,
10792 IN OUT PULONG BufferLength,
10793 OUT PULONG RequiredBufferLength OPTIONAL);
10794
10795 NTSYSAPI
10796 NTSTATUS
10797 NTAPI
10798 ZwRenameKey(
10799 IN HANDLE KeyHandle,
10800 IN PUNICODE_STRING NewName);
10801
10802 NTSYSAPI
10803 NTSTATUS
10804 NTAPI
10805 ZwSetInformationKey(
10806 IN HANDLE KeyHandle,
10807 IN KEY_SET_INFORMATION_CLASS KeySetInformationClass,
10808 IN PVOID KeySetInformation,
10809 IN ULONG KeySetInformationLength);
10810
10811 #endif
10812
10813 /******************************************************************************
10814 * WMI Library Support Functions *
10815 ******************************************************************************/
10816
10817 #ifdef RUN_WPP
10818
10819 #if (NTDDI_VERSION >= NTDDI_WINXP)
10820 NTKERNELAPI
10821 NTSTATUS
10822 DDKCDECLAPI
10823 WmiTraceMessage(
10824 IN TRACEHANDLE LoggerHandle,
10825 IN ULONG MessageFlags,
10826 IN LPGUID MessageGuid,
10827 IN USHORT MessageNumber,
10828 IN ...);
10829 #endif
10830
10831 #endif
10832
10833 #if (NTDDI_VERSION >= NTDDI_WINXP)
10834
10835 NTKERNELAPI
10836 NTSTATUS
10837 NTAPI
10838 WmiQueryTraceInformation(
10839 IN TRACE_INFORMATION_CLASS TraceInformationClass,
10840 OUT PVOID TraceInformation,
10841 IN ULONG TraceInformationLength,
10842 OUT PULONG RequiredLength OPTIONAL,
10843 IN PVOID Buffer OPTIONAL);
10844
10845 #if 0
10846 /* FIXME: Get va_list from where? */
10847 NTKERNELAPI
10848 NTSTATUS
10849 DDKCDECLAPI
10850 WmiTraceMessageVa(
10851 IN TRACEHANDLE LoggerHandle,
10852 IN ULONG MessageFlags,
10853 IN LPGUID MessageGuid,
10854 IN USHORT MessageNumber,
10855 IN va_list MessageArgList);
10856 #endif
10857
10858 #endif
10859
10860 /******************************************************************************
10861 * Kernel Debugger Functions *
10862 ******************************************************************************/
10863
10864 #ifndef _DBGNT_
10865 ULONG
10866 DDKCDECLAPI
10867 DbgPrint(
10868 IN PCSTR Format,
10869 IN ...);
10870 #endif
10871
10872 #if DBG
10873
10874 #define KdPrint(_x_) DbgPrint _x_
10875 #define KdPrintEx(_x_) DbgPrintEx _x_
10876 #define vKdPrintExWithPrefix(_x_) vDbgPrintExWithPrefix _x_
10877 #define KdBreakPoint() DbgBreakPoint()
10878 #define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
10879
10880 #else /* !DBG */
10881
10882 #define KdPrint(_x_)
10883 #define KdPrintEx(_x_)
10884 #define vKdPrintExWithPrefix(_x_)
10885 #define KdBreakPoint()
10886 #define KdBreakPointWithStatus(s)
10887
10888 #endif /* !DBG */
10889
10890 #if defined(__GNUC__)
10891
10892 extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent;
10893 extern NTKERNELAPI BOOLEAN KdDebuggerEnabled;
10894 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
10895 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
10896
10897 #elif defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
10898
10899 extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
10900 extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
10901 #define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
10902 #define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
10903
10904 #else
10905
10906 extern BOOLEAN KdDebuggerNotPresent;
10907 extern BOOLEAN KdDebuggerEnabled;
10908 #define KD_DEBUGGER_ENABLED KdDebuggerEnabled
10909 #define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
10910
10911 #endif
10912
10913 #ifdef _VA_LIST_DEFINED
10914 #if (NTDDI_VERSION >= NTDDI_WINXP)
10915
10916 NTSYSAPI
10917 ULONG
10918 NTAPI
10919 vDbgPrintEx(
10920 IN ULONG ComponentId,
10921 IN ULONG Level,
10922 IN PCCH Format,
10923 IN va_list ap);
10924
10925 NTSYSAPI
10926 ULONG
10927 NTAPI
10928 vDbgPrintExWithPrefix(
10929 IN PCCH Prefix,
10930 IN ULONG ComponentId,
10931 IN ULONG Level,
10932 IN PCCH Format,
10933 IN va_list ap);
10934
10935 #endif
10936 #endif // _VA_LIST_DEFINED
10937
10938 #if (NTDDI_VERSION >= NTDDI_WIN2K)
10939
10940 NTKERNELAPI
10941 NTSTATUS
10942 NTAPI
10943 KdDisableDebugger(
10944 VOID);
10945
10946 NTKERNELAPI
10947 NTSTATUS
10948 NTAPI
10949 KdEnableDebugger(
10950 VOID);
10951
10952 #if (_MSC_FULL_VER >= 150030729) && !defined(IMPORT_NATIVE_DBG_BREAK)
10953 #define DbgBreakPoint __debugbreak
10954 #else
10955 VOID
10956 NTAPI
10957 DbgBreakPoint(
10958 VOID);
10959 #endif
10960
10961 NTSYSAPI
10962 VOID
10963 NTAPI
10964 DbgBreakPointWithStatus(
10965 IN ULONG Status);
10966
10967 NTSYSAPI
10968 ULONG
10969 DDKCDECLAPI
10970 DbgPrintReturnControlC(
10971 IN PCCH Format,
10972 IN ...);
10973
10974 #endif
10975
10976 #if (NTDDI_VERSION >= NTDDI_WINXP)
10977
10978 NTSYSAPI
10979 ULONG
10980 DDKCDECLAPI
10981 DbgPrintEx(
10982 IN ULONG ComponentId,
10983 IN ULONG Level,
10984 IN PCSTR Format,
10985 IN ...);
10986
10987 NTSYSAPI
10988 NTSTATUS
10989 NTAPI
10990 DbgQueryDebugFilterState(
10991 IN ULONG ComponentId,
10992 IN ULONG Level);
10993
10994 NTSYSAPI
10995 NTSTATUS
10996 NTAPI
10997 DbgSetDebugFilterState(
10998 IN ULONG ComponentId,
10999 IN ULONG Level,
11000 IN BOOLEAN State);
11001
11002 #endif
11003
11004 #if (NTDDI_VERSION >= NTDDI_WS03)
11005
11006 NTKERNELAPI
11007 BOOLEAN
11008 NTAPI
11009 KdRefreshDebuggerNotPresent(
11010 VOID
11011 );
11012
11013 #endif
11014
11015 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
11016 NTKERNELAPI
11017 NTSTATUS
11018 NTAPI
11019 KdChangeOption(
11020 IN KD_OPTION Option,
11021 IN ULONG InBufferBytes OPTIONAL,
11022 IN PVOID InBuffer,
11023 IN ULONG OutBufferBytes OPTIONAL,
11024 OUT PVOID OutBuffer,
11025 OUT PULONG OutBufferNeeded OPTIONAL);
11026 #endif
11027
11028
11029
11030 /******************************************************************************
11031 * Unsorted *
11032 ******************************************************************************/
11033
11034 /*
11035 * GUID Comparison
11036 */
11037 #ifndef __IID_ALIGNED__
11038 #define __IID_ALIGNED__
11039 #ifdef __cplusplus
11040 inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2)
11041 {
11042 return ((*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) && (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)));
11043 }
11044 #else
11045 #define IsEqualGUIDAligned(guid1, guid2) \
11046 ((*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)))
11047 #endif
11048 #endif
11049
11050 #define ES_SYSTEM_REQUIRED 0x00000001
11051 #define ES_DISPLAY_REQUIRED 0x00000002
11052 #define ES_USER_PRESENT 0x00000004
11053 #define ES_CONTINUOUS 0x80000000
11054
11055 typedef enum {
11056 LT_DONT_CARE,
11057 LT_LOWEST_LATENCY
11058 } LATENCY_TIME;
11059
11060 /* Constants */
11061 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
11062 #define ZwCurrentProcess() NtCurrentProcess()
11063 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
11064 #define ZwCurrentThread() NtCurrentThread()
11065
11066 #define METHOD_BUFFERED 0
11067 #define METHOD_IN_DIRECT 1
11068 #define METHOD_OUT_DIRECT 2
11069 #define METHOD_NEITHER 3
11070
11071 #define LOW_PRIORITY 0
11072 #define LOW_REALTIME_PRIORITY 16
11073 #define HIGH_PRIORITY 31
11074 #define MAXIMUM_PRIORITY 32
11075
11076 #define MAXIMUM_SUSPEND_COUNT MAXCHAR
11077
11078 #define MAXIMUM_FILENAME_LENGTH 256
11079
11080 #define FILE_SUPERSEDED 0x00000000
11081 #define FILE_OPENED 0x00000001
11082 #define FILE_CREATED 0x00000002
11083 #define FILE_OVERWRITTEN 0x00000003
11084 #define FILE_EXISTS 0x00000004
11085 #define FILE_DOES_NOT_EXIST 0x00000005
11086
11087 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
11088 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
11089
11090 /* also in winnt.h */
11091 #define FILE_LIST_DIRECTORY 0x00000001
11092 #define FILE_READ_DATA 0x00000001
11093 #define FILE_ADD_FILE 0x00000002
11094 #define FILE_WRITE_DATA 0x00000002
11095 #define FILE_ADD_SUBDIRECTORY 0x00000004
11096 #define FILE_APPEND_DATA 0x00000004
11097 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
11098 #define FILE_READ_EA 0x00000008
11099 #define FILE_WRITE_EA 0x00000010
11100 #define FILE_EXECUTE 0x00000020
11101 #define FILE_TRAVERSE 0x00000020
11102 #define FILE_DELETE_CHILD 0x00000040
11103 #define FILE_READ_ATTRIBUTES 0x00000080
11104 #define FILE_WRITE_ATTRIBUTES 0x00000100
11105
11106 #define FILE_SHARE_READ 0x00000001
11107 #define FILE_SHARE_WRITE 0x00000002
11108 #define FILE_SHARE_DELETE 0x00000004
11109 #define FILE_SHARE_VALID_FLAGS 0x00000007
11110
11111 #define FILE_ATTRIBUTE_READONLY 0x00000001
11112 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
11113 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
11114 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
11115 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
11116 #define FILE_ATTRIBUTE_DEVICE 0x00000040
11117 #define FILE_ATTRIBUTE_NORMAL 0x00000080
11118 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
11119 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
11120 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
11121 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
11122 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
11123 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
11124 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
11125
11126 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
11127 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
11128
11129 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
11130 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
11131 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
11132 #define FILE_VALID_SET_FLAGS 0x00000036
11133
11134 #define FILE_SUPERSEDE 0x00000000
11135 #define FILE_OPEN 0x00000001
11136 #define FILE_CREATE 0x00000002
11137 #define FILE_OPEN_IF 0x00000003
11138 #define FILE_OVERWRITE 0x00000004
11139 #define FILE_OVERWRITE_IF 0x00000005
11140 #define FILE_MAXIMUM_DISPOSITION 0x00000005
11141
11142 #define FILE_DIRECTORY_FILE 0x00000001
11143 #define FILE_WRITE_THROUGH 0x00000002
11144 #define FILE_SEQUENTIAL_ONLY 0x00000004
11145 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
11146 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
11147 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
11148 #define FILE_NON_DIRECTORY_FILE 0x00000040
11149 #define FILE_CREATE_TREE_CONNECTION 0x00000080
11150 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
11151 #define FILE_NO_EA_KNOWLEDGE 0x00000200
11152 #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
11153 #define FILE_RANDOM_ACCESS 0x00000800
11154 #define FILE_DELETE_ON_CLOSE 0x00001000
11155 #define FILE_OPEN_BY_FILE_ID 0x00002000
11156 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
11157 #define FILE_NO_COMPRESSION 0x00008000
11158 #define FILE_RESERVE_OPFILTER 0x00100000
11159 #define FILE_OPEN_REPARSE_POINT 0x00200000
11160 #define FILE_OPEN_NO_RECALL 0x00400000
11161 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
11162
11163 #define FILE_ANY_ACCESS 0x00000000
11164 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
11165 #define FILE_READ_ACCESS 0x00000001
11166 #define FILE_WRITE_ACCESS 0x00000002
11167
11168 #define FILE_ALL_ACCESS \
11169 (STANDARD_RIGHTS_REQUIRED | \
11170 SYNCHRONIZE | \
11171 0x1FF)
11172
11173 #define FILE_GENERIC_EXECUTE \
11174 (STANDARD_RIGHTS_EXECUTE | \
11175 FILE_READ_ATTRIBUTES | \
11176 FILE_EXECUTE | \
11177 SYNCHRONIZE)
11178
11179 #define FILE_GENERIC_READ \
11180 (STANDARD_RIGHTS_READ | \
11181 FILE_READ_DATA | \
11182 FILE_READ_ATTRIBUTES | \
11183 FILE_READ_EA | \
11184 SYNCHRONIZE)
11185
11186 #define FILE_GENERIC_WRITE \
11187 (STANDARD_RIGHTS_WRITE | \
11188 FILE_WRITE_DATA | \
11189 FILE_WRITE_ATTRIBUTES | \
11190 FILE_WRITE_EA | \
11191 FILE_APPEND_DATA | \
11192 SYNCHRONIZE)
11193
11194 /* end winnt.h */
11195
11196 #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
11197
11198 #define OBJECT_TYPE_CREATE (0x0001)
11199 #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
11200
11201 #define DIRECTORY_QUERY (0x0001)
11202 #define DIRECTORY_TRAVERSE (0x0002)
11203 #define DIRECTORY_CREATE_OBJECT (0x0004)
11204 #define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
11205 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
11206
11207 #define EVENT_QUERY_STATE (0x0001)
11208 #define EVENT_MODIFY_STATE (0x0002)
11209 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
11210
11211 #define SEMAPHORE_QUERY_STATE (0x0001)
11212 #define SEMAPHORE_MODIFY_STATE (0x0002)
11213 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
11214
11215
11216 /*
11217 ** System structures
11218 */
11219
11220 #define SYMBOLIC_LINK_QUERY 0x0001
11221 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
11222
11223 /* also in winnt,h */
11224 #define DUPLICATE_CLOSE_SOURCE 0x00000001
11225 #define DUPLICATE_SAME_ACCESS 0x00000002
11226 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
11227 /* end winnt.h */
11228
11229 typedef struct _OBJECT_NAME_INFORMATION {
11230 UNICODE_STRING Name;
11231 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
11232
11233 /* Global debug flag */
11234 extern ULONG NtGlobalFlag;
11235
11236 #define PROCESS_DUP_HANDLE (0x0040)
11237
11238 #if (NTDDI_VERSION >= NTDDI_VISTA)
11239 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
11240 0xFFFF)
11241 #else
11242 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
11243 0xFFF)
11244 #endif
11245
11246
11247 #if defined(_M_IX86)
11248 #define YieldProcessor _mm_pause
11249 #elif defined (_M_AMD64)
11250 #define YieldProcessor _mm_pause
11251 #elif defined(_M_PPC)
11252 #define YieldProcessor() __asm__ __volatile__("nop");
11253 #elif defined(_M_MIPS)
11254 #define YieldProcessor() __asm__ __volatile__("nop");
11255 #elif defined(_M_ARM)
11256 #define YieldProcessor()
11257 #else
11258 #error Unknown architecture
11259 #endif
11260
11261 /* Thread Access Rights */
11262 #define THREAD_TERMINATE (0x0001)
11263 #define THREAD_SUSPEND_RESUME (0x0002)
11264 #define THREAD_ALERT (0x0004)
11265 #define THREAD_GET_CONTEXT (0x0008)
11266 #define THREAD_SET_CONTEXT (0x0010)
11267 #define THREAD_SET_INFORMATION (0x0020)
11268 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
11269 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
11270 #if (NTDDI_VERSION >= NTDDI_VISTA)
11271 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
11272 0xFFFF)
11273 #else
11274 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
11275 0x3FF)
11276 #endif
11277
11278 /* Service Start Types */
11279 #define SERVICE_BOOT_START 0x00000000
11280 #define SERVICE_SYSTEM_START 0x00000001
11281 #define SERVICE_AUTO_START 0x00000002
11282 #define SERVICE_DEMAND_START 0x00000003
11283 #define SERVICE_DISABLED 0x00000004
11284
11285 /* Process Qoutas */
11286 typedef struct _QUOTA_LIMITS {
11287 SIZE_T PagedPoolLimit;
11288 SIZE_T NonPagedPoolLimit;
11289 SIZE_T MinimumWorkingSetSize;
11290 SIZE_T MaximumWorkingSetSize;
11291 SIZE_T PagefileLimit;
11292 LARGE_INTEGER TimeLimit;
11293 } QUOTA_LIMITS, *PQUOTA_LIMITS;
11294
11295 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
11296 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
11297 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
11298 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
11299 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
11300
11301 /* Exported object types */
11302 extern POBJECT_TYPE NTSYSAPI ExEventObjectType;
11303 extern POBJECT_TYPE NTSYSAPI ExSemaphoreObjectType;
11304 extern POBJECT_TYPE NTSYSAPI IoFileObjectType;
11305 extern POBJECT_TYPE NTSYSAPI PsThreadType;
11306 extern POBJECT_TYPE NTSYSAPI SeTokenObjectType;
11307 extern POBJECT_TYPE NTSYSAPI PsProcessType;
11308
11309 #if defined(_IA64_)
11310
11311 extern volatile LARGE_INTEGER KeTickCount;
11312
11313 #elif defined(_X86_)
11314
11315 extern volatile KSYSTEM_TIME KeTickCount;
11316
11317 #endif
11318
11319 /* HACK HACK HACK - GCC (or perhaps LD) is messing this up */
11320 #if defined(_NTSYSTEM_) || defined(__GNUC__)
11321 #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag
11322 #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag
11323 #else
11324 #define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag)
11325 #define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag)
11326 #endif /* _NT_SYSTEM */
11327 extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG;
11328 extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG;
11329
11330 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
11331 FORCEINLINE
11332 PVOID
11333 NTAPI
11334 HalAllocateCommonBuffer(
11335 IN PADAPTER_OBJECT AdapterObject,
11336 IN ULONG Length,
11337 OUT PPHYSICAL_ADDRESS LogicalAddress,
11338 IN BOOLEAN CacheEnabled)
11339 {
11340 PALLOCATE_COMMON_BUFFER allocateCommonBuffer;
11341 PVOID commonBuffer;
11342
11343 allocateCommonBuffer = *(DmaAdapter)->DmaOperations->AllocateCommonBuffer;
11344 ASSERT( allocateCommonBuffer != NULL );
11345 commonBuffer = allocateCommonBuffer( DmaAdapter, Length, LogicalAddress, CacheEnabled );
11346 return commonBuffer;
11347 }
11348
11349 FORCEINLINE
11350 VOID
11351 NTAPI
11352 HalFreeCommonBuffer(
11353 IN PDMA_ADAPTER DmaAdapter,
11354 IN ULONG Length,
11355 IN PHYSICAL_ADDRESS LogicalAddress,
11356 IN PVOID VirtualAddress,
11357 IN BOOLEAN CacheEnabled)
11358 {
11359 PFREE_COMMON_BUFFER freeCommonBuffer;
11360
11361 freeCommonBuffer = *(DmaAdapter)->DmaOperations->FreeCommonBuffer;
11362 ASSERT( freeCommonBuffer != NULL );
11363 freeCommonBuffer( DmaAdapter, Length, LogicalAddress, VirtualAddress, CacheEnabled );
11364 }
11365
11366 FORCEINLINE
11367 ULONG
11368 NTAPI
11369 HalReadDmaCounter(
11370 IN PDMA_ADAPTER DmaAdapter)
11371 {
11372 PREAD_DMA_COUNTER readDmaCounter;
11373 ULONG counter;
11374
11375 readDmaCounter = *(DmaAdapter)->DmaOperations->ReadDmaCounter;
11376 ASSERT( readDmaCounter != NULL );
11377 counter = readDmaCounter( DmaAdapter );
11378 return counter;
11379 }
11380
11381 #endif
11382
11383 #ifdef __cplusplus
11384 }
11385 #endif
11386
11387 #endif /* !_WDMDDK_ */