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