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