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