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