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