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