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