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