31f309f61464a1d097adcda7bd5ffb73dc4b20d9
[reactos.git] / include / ddk / wdm.h
1 #ifndef _WDMDDK_
2 #define _WDMDDK_
3
4 /* Helper macro to enable gcc's extension. */
5 #ifndef __GNU_EXTENSION
6 #ifdef __GNUC__
7 #define __GNU_EXTENSION __extension__
8 #else
9 #define __GNU_EXTENSION
10 #endif
11 #endif
12
13 //
14 // Dependencies
15 //
16 #define NT_INCLUDED
17 #include <excpt.h>
18 #include <ntdef.h>
19 #include <ntstatus.h>
20
21 #ifndef GUID_DEFINED
22 #include <guiddef.h>
23 #endif /* GUID_DEFINED */
24
25 #include "intrin.h"
26
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30
31 #define NTKERNELAPI DECLSPEC_IMPORT
32
33 #ifdef _WIN64
34 #define PORT_MAXIMUM_MESSAGE_LENGTH 512
35 #else
36 #define PORT_MAXIMUM_MESSAGE_LENGTH 256
37 #endif
38
39
40 #if defined(_MSC_VER)
41
42 //
43 // Indicate if #pragma alloc_text() is supported
44 //
45 #if defined(_M_IX86) || defined(_M_AMD64) || defined(_M_IA64)
46 #define ALLOC_PRAGMA 1
47 #endif
48
49 //
50 // Indicate if #pragma data_seg() is supported
51 //
52 #if defined(_M_IX86) || defined(_M_AMD64)
53 #define ALLOC_DATA_PRAGMA 1
54 #endif
55
56 #endif
57
58
59 /*
60 * Alignment Macros
61 */
62 #define ALIGN_DOWN(s, t) \
63 ((ULONG)(s) & ~(sizeof(t) - 1))
64
65 #define ALIGN_UP(s, t) \
66 (ALIGN_DOWN(((ULONG)(s) + sizeof(t) - 1), t))
67
68 #define ALIGN_DOWN_POINTER(p, t) \
69 ((PVOID)((ULONG_PTR)(p) & ~((ULONG_PTR)sizeof(t) - 1)))
70
71 #define ALIGN_UP_POINTER(p, t) \
72 (ALIGN_DOWN_POINTER(((ULONG_PTR)(p) + sizeof(t) - 1), t))
73
74 /*
75 * GUID Comparison
76 */
77
78 #ifndef __IID_ALIGNED__
79 #define __IID_ALIGNED__
80 #ifdef __cplusplus
81 inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2)
82 {
83 return ((*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) && (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)));
84 }
85 #else
86 #define IsEqualGUIDAligned(guid1, guid2) \
87 ((*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)))
88 #endif
89 #endif
90
91 #if defined(_WIN64)
92 #define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
93 #else
94 #define POINTER_ALIGNMENT
95 #endif
96
97 /*
98 ** Forward declarations
99 */
100
101 struct _IRP;
102 struct _MDL;
103 struct _KAPC;
104 struct _KDPC;
105 struct _FILE_OBJECT;
106 struct _DMA_ADAPTER;
107 struct _DEVICE_OBJECT;
108 struct _DRIVER_OBJECT;
109 struct _IO_STATUS_BLOCK;
110 struct _DEVICE_DESCRIPTION;
111 struct _SCATTER_GATHER_LIST;
112 struct _DRIVE_LAYOUT_INFORMATION;
113
114 struct _COMPRESSED_DATA_INFO;
115
116 typedef PVOID PSID;
117
118 /* Simple types */
119 typedef UCHAR KPROCESSOR_MODE;
120 typedef LONG KPRIORITY;
121 typedef PVOID PSECURITY_DESCRIPTOR;
122 typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;
123
124 /* Structures not exposed to drivers */
125 typedef struct _OBJECT_TYPE *POBJECT_TYPE;
126 typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
127 typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
128 typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT;
129 typedef struct _BUS_HANDLER *PBUS_HANDLER;
130
131 typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT;
132 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
133 typedef struct _ETHREAD *PETHREAD;
134 typedef struct _EPROCESS *PEPROCESS;
135 typedef struct _IO_TIMER *PIO_TIMER;
136 typedef struct _KINTERRUPT *PKINTERRUPT;
137 typedef struct _KPROCESS *PKPROCESS;
138 typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
139
140
141 typedef struct _CONTEXT *PCONTEXT;
142
143 /*
144 ** Simple structures
145 */
146
147 typedef UCHAR KIRQL, *PKIRQL;
148
149 typedef enum _MODE {
150 KernelMode,
151 UserMode,
152 MaximumMode
153 } MODE;
154
155 //
156 // Power States/Levels
157 //
158 typedef enum _SYSTEM_POWER_STATE {
159 PowerSystemUnspecified,
160 PowerSystemWorking,
161 PowerSystemSleeping1,
162 PowerSystemSleeping2,
163 PowerSystemSleeping3,
164 PowerSystemHibernate,
165 PowerSystemShutdown,
166 PowerSystemMaximum
167 } SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
168
169 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
170
171 typedef enum _POWER_INFORMATION_LEVEL {
172 SystemPowerPolicyAc,
173 SystemPowerPolicyDc,
174 VerifySystemPolicyAc,
175 VerifySystemPolicyDc,
176 SystemPowerCapabilities,
177 SystemBatteryState,
178 SystemPowerStateHandler,
179 ProcessorStateHandler,
180 SystemPowerPolicyCurrent,
181 AdministratorPowerPolicy,
182 SystemReserveHiberFile,
183 ProcessorInformation,
184 SystemPowerInformation,
185 ProcessorStateHandler2,
186 LastWakeTime,
187 LastSleepTime,
188 SystemExecutionState,
189 SystemPowerStateNotifyHandler,
190 ProcessorPowerPolicyAc,
191 ProcessorPowerPolicyDc,
192 VerifyProcessorPowerPolicyAc,
193 VerifyProcessorPowerPolicyDc,
194 ProcessorPowerPolicyCurrent
195 } POWER_INFORMATION_LEVEL;
196
197 typedef enum {
198 PowerActionNone,
199 PowerActionReserved,
200 PowerActionSleep,
201 PowerActionHibernate,
202 PowerActionShutdown,
203 PowerActionShutdownReset,
204 PowerActionShutdownOff,
205 PowerActionWarmEject
206 } POWER_ACTION, *PPOWER_ACTION;
207
208 typedef enum _DEVICE_POWER_STATE {
209 PowerDeviceUnspecified,
210 PowerDeviceD0,
211 PowerDeviceD1,
212 PowerDeviceD2,
213 PowerDeviceD3,
214 PowerDeviceMaximum
215 } DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
216
217 #define ES_SYSTEM_REQUIRED 0x00000001
218 #define ES_DISPLAY_REQUIRED 0x00000002
219 #define ES_USER_PRESENT 0x00000004
220 #define ES_CONTINUOUS 0x80000000
221
222 typedef ULONG EXECUTION_STATE;
223
224 typedef enum {
225 LT_DONT_CARE,
226 LT_LOWEST_LATENCY
227 } LATENCY_TIME;
228
229 /* Constants */
230 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
231 #define ZwCurrentProcess() NtCurrentProcess()
232 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
233 #define ZwCurrentThread() NtCurrentThread()
234
235 #if (_M_IX86)
236 #define KIP0PCRADDRESS 0xffdff000
237 #endif
238
239 #if defined(_WIN64)
240 #define MAXIMUM_PROCESSORS 64
241 #else
242 #define MAXIMUM_PROCESSORS 32
243 #endif
244
245 #define MAXIMUM_WAIT_OBJECTS 64
246
247 #define EX_RUNDOWN_ACTIVE 0x1
248 #define EX_RUNDOWN_COUNT_SHIFT 0x1
249 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
250
251 #define METHOD_BUFFERED 0
252 #define METHOD_IN_DIRECT 1
253 #define METHOD_OUT_DIRECT 2
254 #define METHOD_NEITHER 3
255
256 #define LOW_PRIORITY 0
257 #define LOW_REALTIME_PRIORITY 16
258 #define HIGH_PRIORITY 31
259 #define MAXIMUM_PRIORITY 32
260
261 #define MAXIMUM_SUSPEND_COUNT MAXCHAR
262
263 #define MAXIMUM_FILENAME_LENGTH 256
264
265 #define FILE_SUPERSEDED 0x00000000
266 #define FILE_OPENED 0x00000001
267 #define FILE_CREATED 0x00000002
268 #define FILE_OVERWRITTEN 0x00000003
269 #define FILE_EXISTS 0x00000004
270 #define FILE_DOES_NOT_EXIST 0x00000005
271
272 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
273 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
274
275 /* also in winnt.h */
276 #define FILE_LIST_DIRECTORY 0x00000001
277 #define FILE_READ_DATA 0x00000001
278 #define FILE_ADD_FILE 0x00000002
279 #define FILE_WRITE_DATA 0x00000002
280 #define FILE_ADD_SUBDIRECTORY 0x00000004
281 #define FILE_APPEND_DATA 0x00000004
282 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
283 #define FILE_READ_EA 0x00000008
284 #define FILE_WRITE_EA 0x00000010
285 #define FILE_EXECUTE 0x00000020
286 #define FILE_TRAVERSE 0x00000020
287 #define FILE_DELETE_CHILD 0x00000040
288 #define FILE_READ_ATTRIBUTES 0x00000080
289 #define FILE_WRITE_ATTRIBUTES 0x00000100
290
291 #define FILE_SHARE_READ 0x00000001
292 #define FILE_SHARE_WRITE 0x00000002
293 #define FILE_SHARE_DELETE 0x00000004
294 #define FILE_SHARE_VALID_FLAGS 0x00000007
295
296 #define FILE_ATTRIBUTE_READONLY 0x00000001
297 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
298 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
299 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
300 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
301 #define FILE_ATTRIBUTE_DEVICE 0x00000040
302 #define FILE_ATTRIBUTE_NORMAL 0x00000080
303 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
304 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
305 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
306 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
307 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
308 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
309 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
310
311 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
312 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
313
314 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
315 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
316 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
317 #define FILE_VALID_SET_FLAGS 0x00000036
318
319 #define FILE_SUPERSEDE 0x00000000
320 #define FILE_OPEN 0x00000001
321 #define FILE_CREATE 0x00000002
322 #define FILE_OPEN_IF 0x00000003
323 #define FILE_OVERWRITE 0x00000004
324 #define FILE_OVERWRITE_IF 0x00000005
325 #define FILE_MAXIMUM_DISPOSITION 0x00000005
326
327 #define FILE_DIRECTORY_FILE 0x00000001
328 #define FILE_WRITE_THROUGH 0x00000002
329 #define FILE_SEQUENTIAL_ONLY 0x00000004
330 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
331 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
332 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
333 #define FILE_NON_DIRECTORY_FILE 0x00000040
334 #define FILE_CREATE_TREE_CONNECTION 0x00000080
335 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
336 #define FILE_NO_EA_KNOWLEDGE 0x00000200
337 #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
338 #define FILE_RANDOM_ACCESS 0x00000800
339 #define FILE_DELETE_ON_CLOSE 0x00001000
340 #define FILE_OPEN_BY_FILE_ID 0x00002000
341 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
342 #define FILE_NO_COMPRESSION 0x00008000
343 #define FILE_RESERVE_OPFILTER 0x00100000
344 #define FILE_OPEN_REPARSE_POINT 0x00200000
345 #define FILE_OPEN_NO_RECALL 0x00400000
346 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
347
348 #define FILE_ANY_ACCESS 0x00000000
349 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
350 #define FILE_READ_ACCESS 0x00000001
351 #define FILE_WRITE_ACCESS 0x00000002
352
353 #define FILE_ALL_ACCESS \
354 (STANDARD_RIGHTS_REQUIRED | \
355 SYNCHRONIZE | \
356 0x1FF)
357
358 #define FILE_GENERIC_EXECUTE \
359 (STANDARD_RIGHTS_EXECUTE | \
360 FILE_READ_ATTRIBUTES | \
361 FILE_EXECUTE | \
362 SYNCHRONIZE)
363
364 #define FILE_GENERIC_READ \
365 (STANDARD_RIGHTS_READ | \
366 FILE_READ_DATA | \
367 FILE_READ_ATTRIBUTES | \
368 FILE_READ_EA | \
369 SYNCHRONIZE)
370
371 #define FILE_GENERIC_WRITE \
372 (STANDARD_RIGHTS_WRITE | \
373 FILE_WRITE_DATA | \
374 FILE_WRITE_ATTRIBUTES | \
375 FILE_WRITE_EA | \
376 FILE_APPEND_DATA | \
377 SYNCHRONIZE)
378
379 /* end winnt.h */
380
381 #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
382
383 #define OBJECT_TYPE_CREATE (0x0001)
384 #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
385
386 #define DIRECTORY_QUERY (0x0001)
387 #define DIRECTORY_TRAVERSE (0x0002)
388 #define DIRECTORY_CREATE_OBJECT (0x0004)
389 #define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
390 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
391
392 #define EVENT_QUERY_STATE (0x0001)
393 #define EVENT_MODIFY_STATE (0x0002)
394 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
395
396 #define SEMAPHORE_QUERY_STATE (0x0001)
397 #define SEMAPHORE_MODIFY_STATE (0x0002)
398 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
399
400 #define FM_LOCK_BIT (0x1)
401 #define FM_LOCK_BIT_V (0x0)
402 #define FM_LOCK_WAITER_WOKEN (0x2)
403 #define FM_LOCK_WAITER_INC (0x4)
404
405 /*
406 ** System structures
407 */
408
409 #define SYMBOLIC_LINK_QUERY 0x0001
410 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
411
412 /* also in winnt,h */
413 #define DUPLICATE_CLOSE_SOURCE 0x00000001
414 #define DUPLICATE_SAME_ACCESS 0x00000002
415 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
416 /* end winnt.h */
417
418 typedef struct _OBJECT_NAME_INFORMATION {
419 UNICODE_STRING Name;
420 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
421
422 //
423 // Resource list definitions
424 //
425 typedef int CM_RESOURCE_TYPE;
426
427 #define CmResourceTypeNull 0
428 #define CmResourceTypePort 1
429 #define CmResourceTypeInterrupt 2
430 #define CmResourceTypeMemory 3
431 #define CmResourceTypeDma 4
432 #define CmResourceTypeDeviceSpecific 5
433 #define CmResourceTypeBusNumber 6
434 #define CmResourceTypeNonArbitrated 128
435 #define CmResourceTypeConfigData 128
436 #define CmResourceTypeDevicePrivate 129
437 #define CmResourceTypePcCardConfig 130
438 #define CmResourceTypeMfCardConfig 131
439
440 //
441 // Global debug flag
442 //
443 extern ULONG NtGlobalFlag;
444
445 //
446 // Section map options
447 //
448 typedef enum _SECTION_INHERIT {
449 ViewShare = 1,
450 ViewUnmap = 2
451 } SECTION_INHERIT;
452
453 //
454 // Section access rights
455 //
456 #define SECTION_QUERY 0x0001
457 #define SECTION_MAP_WRITE 0x0002
458 #define SECTION_MAP_READ 0x0004
459 #define SECTION_MAP_EXECUTE 0x0008
460 #define SECTION_EXTEND_SIZE 0x0010
461 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
462
463 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
464 SECTION_MAP_WRITE | \
465 SECTION_MAP_READ | \
466 SECTION_MAP_EXECUTE | \
467 SECTION_EXTEND_SIZE)
468
469 #define SESSION_QUERY_ACCESS 0x0001
470 #define SESSION_MODIFY_ACCESS 0x0002
471
472 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
473 SESSION_QUERY_ACCESS | \
474 SESSION_MODIFY_ACCESS)
475
476
477
478 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
479
480 #define PAGE_NOACCESS 0x01
481 #define PAGE_READONLY 0x02
482 #define PAGE_READWRITE 0x04
483 #define PAGE_WRITECOPY 0x08
484 #define PAGE_EXECUTE 0x10
485 #define PAGE_EXECUTE_READ 0x20
486 #define PAGE_EXECUTE_READWRITE 0x40
487 #define PAGE_EXECUTE_WRITECOPY 0x80
488 #define PAGE_GUARD 0x100
489 #define PAGE_NOCACHE 0x200
490 #define PAGE_WRITECOMBINE 0x400
491
492 #define MEM_COMMIT 0x1000
493 #define MEM_RESERVE 0x2000
494 #define MEM_DECOMMIT 0x4000
495 #define MEM_RELEASE 0x8000
496 #define MEM_FREE 0x10000
497 #define MEM_PRIVATE 0x20000
498 #define MEM_MAPPED 0x40000
499 #define MEM_RESET 0x80000
500 #define MEM_TOP_DOWN 0x100000
501 #define MEM_LARGE_PAGES 0x20000000
502 #define MEM_4MB_PAGES 0x80000000
503
504 #define SEC_RESERVE 0x4000000
505 #define SEC_LARGE_PAGES 0x80000000
506
507 #define PROCESS_DUP_HANDLE (0x0040)
508
509 #if (NTDDI_VERSION >= NTDDI_VISTA)
510 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
511 0xFFFF)
512 #else
513 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
514 0xFFF)
515 #endif
516
517
518
519 //
520 // Processor features
521 //
522 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
523 #define PF_FLOATING_POINT_EMULATED 1
524 #define PF_COMPARE_EXCHANGE_DOUBLE 2
525 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
526 #define PF_PPC_MOVEMEM_64BIT_OK 4
527 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
528 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
529 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
530 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
531 #define PF_PAE_ENABLED 9
532 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
533 #define PF_SSE_DAZ_MODE_AVAILABLE 11
534 #define PF_NX_ENABLED 12
535 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
536 #define PF_COMPARE_EXCHANGE128 14
537 #define PF_COMPARE64_EXCHANGE128 15
538 #define PF_CHANNELS_ENABLED 16
539
540
541
542 //
543 // Intrinsics (note: taken from our winnt.h)
544 // FIXME: 64-bit
545 //
546 #if defined(__GNUC__)
547
548 static __inline__ BOOLEAN
549 InterlockedBitTestAndSet(IN LONG volatile *Base,
550 IN LONG Bit)
551 {
552 #if defined(_M_IX86)
553 LONG OldBit;
554 __asm__ __volatile__("lock "
555 "btsl %2,%1\n\t"
556 "sbbl %0,%0\n\t"
557 :"=r" (OldBit),"+m" (*Base)
558 :"Ir" (Bit)
559 : "memory");
560 return OldBit;
561 #else
562 return (_InterlockedOr(Base, 1 << Bit) >> Bit) & 1;
563 #endif
564 }
565
566 static __inline__ BOOLEAN
567 InterlockedBitTestAndReset(IN LONG volatile *Base,
568 IN LONG Bit)
569 {
570 #if defined(_M_IX86)
571 LONG OldBit;
572 __asm__ __volatile__("lock "
573 "btrl %2,%1\n\t"
574 "sbbl %0,%0\n\t"
575 :"=r" (OldBit),"+m" (*Base)
576 :"Ir" (Bit)
577 : "memory");
578 return OldBit;
579 #else
580 return (_InterlockedAnd(Base, ~(1 << Bit)) >> Bit) & 1;
581 #endif
582 }
583
584 #endif
585
586 #define BitScanForward _BitScanForward
587 #define BitScanReverse _BitScanReverse
588
589 #define BitTest _bittest
590 #define BitTestAndComplement _bittestandcomplement
591 #define BitTestAndSet _bittestandset
592 #define BitTestAndReset _bittestandreset
593 #define InterlockedBitTestAndSet _interlockedbittestandset
594 #define InterlockedBitTestAndReset _interlockedbittestandreset
595
596
597 /** INTERLOCKED FUNCTIONS *****************************************************/
598
599 #if !defined(__INTERLOCKED_DECLARED)
600 #define __INTERLOCKED_DECLARED
601
602 #if defined (_X86_)
603 #if defined(NO_INTERLOCKED_INTRINSICS)
604 NTKERNELAPI
605 LONG
606 FASTCALL
607 InterlockedIncrement(
608 IN OUT LONG volatile *Addend);
609
610 NTKERNELAPI
611 LONG
612 FASTCALL
613 InterlockedDecrement(
614 IN OUT LONG volatile *Addend);
615
616 NTKERNELAPI
617 LONG
618 FASTCALL
619 InterlockedCompareExchange(
620 IN OUT LONG volatile *Destination,
621 IN LONG Exchange,
622 IN LONG Comparand);
623
624 NTKERNELAPI
625 LONG
626 FASTCALL
627 InterlockedExchange(
628 IN OUT LONG volatile *Destination,
629 IN LONG Value);
630
631 NTKERNELAPI
632 LONG
633 FASTCALL
634 InterlockedExchangeAdd(
635 IN OUT LONG volatile *Addend,
636 IN LONG Value);
637
638 #else // !defined(NO_INTERLOCKED_INTRINSICS)
639
640 #define InterlockedExchange _InterlockedExchange
641 #define InterlockedIncrement _InterlockedIncrement
642 #define InterlockedDecrement _InterlockedDecrement
643 #define InterlockedExchangeAdd _InterlockedExchangeAdd
644 #define InterlockedCompareExchange _InterlockedCompareExchange
645 #define InterlockedOr _InterlockedOr
646 #define InterlockedAnd _InterlockedAnd
647 #define InterlockedXor _InterlockedXor
648
649 #endif // !defined(NO_INTERLOCKED_INTRINSICS)
650
651 #endif // defined (_X86_)
652
653 #if !defined (_WIN64)
654 /*
655 * PVOID
656 * InterlockedExchangePointer(
657 * IN OUT PVOID volatile *Target,
658 * IN PVOID Value)
659 */
660 #define InterlockedExchangePointer(Target, Value) \
661 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
662
663 /*
664 * PVOID
665 * InterlockedCompareExchangePointer(
666 * IN OUT PVOID *Destination,
667 * IN PVOID Exchange,
668 * IN PVOID Comparand)
669 */
670 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
671 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
672
673 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
674 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
675 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
676
677 #endif // !defined (_WIN64)
678
679 #if defined (_M_AMD64)
680
681 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
682 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
683 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
684 #define InterlockedAnd _InterlockedAnd
685 #define InterlockedOr _InterlockedOr
686 #define InterlockedXor _InterlockedXor
687 #define InterlockedIncrement _InterlockedIncrement
688 #define InterlockedDecrement _InterlockedDecrement
689 #define InterlockedAdd _InterlockedAdd
690 #define InterlockedExchange _InterlockedExchange
691 #define InterlockedExchangeAdd _InterlockedExchangeAdd
692 #define InterlockedCompareExchange _InterlockedCompareExchange
693 #define InterlockedAnd64 _InterlockedAnd64
694 #define InterlockedOr64 _InterlockedOr64
695 #define InterlockedXor64 _InterlockedXor64
696 #define InterlockedIncrement64 _InterlockedIncrement64
697 #define InterlockedDecrement64 _InterlockedDecrement64
698 #define InterlockedAdd64 _InterlockedAdd64
699 #define InterlockedExchange64 _InterlockedExchange64
700 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
701 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
702 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
703 #define InterlockedExchangePointer _InterlockedExchangePointer
704 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
705 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
706
707 #endif // _M_AMD64
708
709 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
710 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
711 FORCEINLINE
712 LONG64
713 InterlockedAdd64(
714 IN OUT LONG64 volatile *Addend,
715 IN LONG64 Value)
716 {
717 return InterlockedExchangeAdd64(Addend, Value) + Value;
718 }
719 //#endif
720 #endif
721
722 #endif /* !__INTERLOCKED_DECLARED */
723
724 #if defined(_M_IX86)
725 #define YieldProcessor _mm_pause
726 #elif defined (_M_AMD64)
727 #define YieldProcessor _mm_pause
728 #elif defined(_M_PPC)
729 #define YieldProcessor() __asm__ __volatile__("nop");
730 #elif defined(_M_MIPS)
731 #define YieldProcessor() __asm__ __volatile__("nop");
732 #elif defined(_M_ARM)
733 #define YieldProcessor()
734 #else
735 #error Unknown architecture
736 #endif
737
738 //
739 // Slist Header
740 //
741 #ifndef _SLIST_HEADER_
742 #define _SLIST_HEADER_
743
744 #if defined(_WIN64)
745 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY *PSLIST_ENTRY;
746 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY {
747 PSLIST_ENTRY Next;
748 } SLIST_ENTRY;
749 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
750 struct {
751 ULONGLONG Alignment;
752 ULONGLONG Region;
753 } DUMMYSTRUCTNAME;
754 struct {
755 ULONGLONG Depth:16;
756 ULONGLONG Sequence:9;
757 ULONGLONG NextEntry:39;
758 ULONGLONG HeaderType:1;
759 ULONGLONG Init:1;
760 ULONGLONG Reserved:59;
761 ULONGLONG Region:3;
762 } Header8;
763 struct {
764 ULONGLONG Depth:16;
765 ULONGLONG Sequence:48;
766 ULONGLONG HeaderType:1;
767 ULONGLONG Init:1;
768 ULONGLONG Reserved:2;
769 ULONGLONG NextEntry:60;
770 } Header16;
771 } SLIST_HEADER, *PSLIST_HEADER;
772 #else
773 #define SLIST_ENTRY SINGLE_LIST_ENTRY
774 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
775 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
776 typedef union _SLIST_HEADER {
777 ULONGLONG Alignment;
778 struct {
779 SLIST_ENTRY Next;
780 USHORT Depth;
781 USHORT Sequence;
782 } DUMMYSTRUCTNAME;
783 } SLIST_HEADER, *PSLIST_HEADER;
784 #endif
785
786 #endif /* _SLIST_HEADER_ */
787
788 //
789 // Thread Access Rights
790 //
791 #define THREAD_TERMINATE (0x0001)
792 #define THREAD_SUSPEND_RESUME (0x0002)
793 #define THREAD_ALERT (0x0004)
794 #define THREAD_GET_CONTEXT (0x0008)
795 #define THREAD_SET_CONTEXT (0x0010)
796 #define THREAD_SET_INFORMATION (0x0020)
797 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
798 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
799 #if (NTDDI_VERSION >= NTDDI_VISTA)
800 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
801 0xFFFF)
802 #else
803 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
804 0x3FF)
805 #endif
806
807 //
808 // Service Start Types
809 //
810 #define SERVICE_BOOT_START 0x00000000
811 #define SERVICE_SYSTEM_START 0x00000001
812 #define SERVICE_AUTO_START 0x00000002
813 #define SERVICE_DEMAND_START 0x00000003
814 #define SERVICE_DISABLED 0x00000004
815
816 //
817 // Exception Records
818 //
819 #define EXCEPTION_NONCONTINUABLE 1
820 #define EXCEPTION_MAXIMUM_PARAMETERS 15
821
822 typedef struct _EXCEPTION_RECORD {
823 NTSTATUS ExceptionCode;
824 ULONG ExceptionFlags;
825 struct _EXCEPTION_RECORD *ExceptionRecord;
826 PVOID ExceptionAddress;
827 ULONG NumberParameters;
828 ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
829 } EXCEPTION_RECORD, *PEXCEPTION_RECORD;
830
831 typedef struct _EXCEPTION_RECORD32 {
832 NTSTATUS ExceptionCode;
833 ULONG ExceptionFlags;
834 ULONG ExceptionRecord;
835 ULONG ExceptionAddress;
836 ULONG NumberParameters;
837 ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
838 } EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
839
840 typedef struct _EXCEPTION_RECORD64 {
841 NTSTATUS ExceptionCode;
842 ULONG ExceptionFlags;
843 ULONG64 ExceptionRecord;
844 ULONG64 ExceptionAddress;
845 ULONG NumberParameters;
846 ULONG __unusedAlignment;
847 ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
848 } EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
849
850 typedef struct _EXCEPTION_POINTERS {
851 PEXCEPTION_RECORD ExceptionRecord;
852 PCONTEXT ContextRecord;
853 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
854
855
856
857 //
858 // Process Qoutas
859 //
860 typedef struct _QUOTA_LIMITS {
861 SIZE_T PagedPoolLimit;
862 SIZE_T NonPagedPoolLimit;
863 SIZE_T MinimumWorkingSetSize;
864 SIZE_T MaximumWorkingSetSize;
865 SIZE_T PagefileLimit;
866 LARGE_INTEGER TimeLimit;
867 } QUOTA_LIMITS, *PQUOTA_LIMITS;
868
869 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
870 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
871 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
872 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
873 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
874
875
876 /******************************************************************************
877 * WINBASE Functions *
878 ******************************************************************************/
879 #if !defined(_WINBASE_)
880
881 #if defined(_WIN64)
882
883 #define InterlockedPopEntrySList(Head) \
884 ExpInterlockedPopEntrySList(Head)
885
886 #define InterlockedPushEntrySList(Head, Entry) \
887 ExpInterlockedPushEntrySList(Head, Entry)
888
889 #define InterlockedFlushSList(Head) \
890 ExpInterlockedFlushSList(Head)
891
892 #define QueryDepthSList(Head) \
893 ExQueryDepthSList(Head)
894
895 #else // !defined(_WIN64)
896
897 NTKERNELAPI
898 PSLIST_ENTRY
899 FASTCALL
900 InterlockedPopEntrySList(
901 IN PSLIST_HEADER ListHead);
902
903 NTKERNELAPI
904 PSLIST_ENTRY
905 FASTCALL
906 InterlockedPushEntrySList(
907 IN PSLIST_HEADER ListHead,
908 IN PSLIST_ENTRY ListEntry);
909
910 #define InterlockedFlushSList(ListHead) \
911 ExInterlockedFlushSList(ListHead)
912
913 #define QueryDepthSList(Head) \
914 ExQueryDepthSList(Head)
915
916 #endif // !defined(_WIN64)
917
918 #endif // !defined(_WINBASE_)
919
920 /******************************************************************************
921 * Kernel Types *
922 ******************************************************************************/
923
924 #define ASSERT_APC(Object) \
925 ASSERT((Object)->Type == ApcObject)
926
927 #define ASSERT_DPC(Object) \
928 ASSERT(((Object)->Type == 0) || \
929 ((Object)->Type == DpcObject) || \
930 ((Object)->Type == ThreadedDpcObject))
931
932 #define ASSERT_DEVICE_QUEUE(Object) \
933 ASSERT((Object)->Type == DeviceQueueObject)
934
935 #define DPC_NORMAL 0
936 #define DPC_THREADED 1
937
938 #define GM_LOCK_BIT 0x1
939 #define GM_LOCK_BIT_V 0x0
940 #define GM_LOCK_WAITER_WOKEN 0x2
941 #define GM_LOCK_WAITER_INC 0x4
942
943 #define LOCK_QUEUE_WAIT 1
944 #define LOCK_QUEUE_OWNER 2
945 #define LOCK_QUEUE_TIMER_LOCK_SHIFT 4
946 #define LOCK_QUEUE_TIMER_TABLE_LOCKS (1 << (8 - LOCK_QUEUE_TIMER_LOCK_SHIFT))
947
948 #define PROCESSOR_FEATURE_MAX 64
949
950 typedef enum _KINTERRUPT_POLARITY {
951 InterruptPolarityUnknown,
952 InterruptActiveHigh,
953 InterruptActiveLow
954 } KINTERRUPT_POLARITY, *PKINTERRUPT_POLARITY;
955
956 typedef enum _KPROFILE_SOURCE {
957 ProfileTime,
958 ProfileAlignmentFixup,
959 ProfileTotalIssues,
960 ProfilePipelineDry,
961 ProfileLoadInstructions,
962 ProfilePipelineFrozen,
963 ProfileBranchInstructions,
964 ProfileTotalNonissues,
965 ProfileDcacheMisses,
966 ProfileIcacheMisses,
967 ProfileCacheMisses,
968 ProfileBranchMispredictions,
969 ProfileStoreInstructions,
970 ProfileFpInstructions,
971 ProfileIntegerInstructions,
972 Profile2Issue,
973 Profile3Issue,
974 Profile4Issue,
975 ProfileSpecialInstructions,
976 ProfileTotalCycles,
977 ProfileIcacheIssues,
978 ProfileDcacheAccesses,
979 ProfileMemoryBarrierCycles,
980 ProfileLoadLinkedIssues,
981 ProfileMaximum
982 } KPROFILE_SOURCE;
983
984 typedef enum _KWAIT_REASON {
985 Executive,
986 FreePage,
987 PageIn,
988 PoolAllocation,
989 DelayExecution,
990 Suspended,
991 UserRequest,
992 WrExecutive,
993 WrFreePage,
994 WrPageIn,
995 WrPoolAllocation,
996 WrDelayExecution,
997 WrSuspended,
998 WrUserRequest,
999 WrEventPair,
1000 WrQueue,
1001 WrLpcReceive,
1002 WrLpcReply,
1003 WrVirtualMemory,
1004 WrPageOut,
1005 WrRendezvous,
1006 WrKeyedEvent,
1007 WrTerminated,
1008 WrProcessInSwap,
1009 WrCpuRateControl,
1010 WrCalloutStack,
1011 WrKernel,
1012 WrResource,
1013 WrPushLock,
1014 WrMutex,
1015 WrQuantumEnd,
1016 WrDispatchInt,
1017 WrPreempted,
1018 WrYieldExecution,
1019 WrFastMutex,
1020 WrGuardedMutex,
1021 WrRundown,
1022 MaximumWaitReason
1023 } KWAIT_REASON;
1024
1025 typedef enum _KD_OPTION {
1026 KD_OPTION_SET_BLOCK_ENABLE,
1027 } KD_OPTION;
1028
1029 typedef enum _INTERFACE_TYPE {
1030 InterfaceTypeUndefined = -1,
1031 Internal,
1032 Isa,
1033 Eisa,
1034 MicroChannel,
1035 TurboChannel,
1036 PCIBus,
1037 VMEBus,
1038 NuBus,
1039 PCMCIABus,
1040 CBus,
1041 MPIBus,
1042 MPSABus,
1043 ProcessorInternal,
1044 InternalPowerBus,
1045 PNPISABus,
1046 PNPBus,
1047 MaximumInterfaceType
1048 } INTERFACE_TYPE, *PINTERFACE_TYPE;
1049
1050 typedef VOID
1051 (DDKAPI *PKNORMAL_ROUTINE)(
1052 IN PVOID NormalContext,
1053 IN PVOID SystemArgument1,
1054 IN PVOID SystemArgument2);
1055
1056 typedef VOID
1057 (DDKAPI *PKRUNDOWN_ROUTINE)(
1058 IN struct _KAPC *Apc);
1059
1060 typedef VOID
1061 (DDKAPI *PKKERNEL_ROUTINE)(
1062 IN struct _KAPC *Apc,
1063 IN OUT PKNORMAL_ROUTINE *NormalRoutine,
1064 IN OUT PVOID *NormalContext,
1065 IN OUT PVOID *SystemArgument1,
1066 IN OUT PVOID *SystemArgument2);
1067
1068 typedef struct _KAPC
1069 {
1070 UCHAR Type;
1071 UCHAR SpareByte0;
1072 UCHAR Size;
1073 UCHAR SpareByte1;
1074 ULONG SpareLong0;
1075 struct _KTHREAD *Thread;
1076 LIST_ENTRY ApcListEntry;
1077 PKKERNEL_ROUTINE KernelRoutine;
1078 PKRUNDOWN_ROUTINE RundownRoutine;
1079 PKNORMAL_ROUTINE NormalRoutine;
1080 PVOID NormalContext;
1081 PVOID SystemArgument1;
1082 PVOID SystemArgument2;
1083 CCHAR ApcStateIndex;
1084 KPROCESSOR_MODE ApcMode;
1085 BOOLEAN Inserted;
1086 } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;
1087
1088 typedef struct _KDEVICE_QUEUE_ENTRY {
1089 LIST_ENTRY DeviceListEntry;
1090 ULONG SortKey;
1091 BOOLEAN Inserted;
1092 } KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY,
1093 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
1094
1095 typedef PVOID PKIPI_CONTEXT;
1096
1097 typedef
1098 VOID
1099 (NTAPI *PKIPI_WORKER)(
1100 IN PKIPI_CONTEXT PacketContext,
1101 IN PVOID Parameter1,
1102 IN PVOID Parameter2,
1103 IN PVOID Parameter3
1104 );
1105
1106 typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
1107
1108 typedef struct _KSPIN_LOCK_QUEUE {
1109 struct _KSPIN_LOCK_QUEUE *volatile Next;
1110 PKSPIN_LOCK volatile Lock;
1111 } KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;
1112
1113 typedef struct _KLOCK_QUEUE_HANDLE {
1114 KSPIN_LOCK_QUEUE LockQueue;
1115 KIRQL OldIrql;
1116 } KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;
1117
1118 #if defined(_AMD64_)
1119
1120 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER;
1121
1122 #define LockQueueDispatcherLock 0
1123 #define LockQueueExpansionLock 1
1124 #define LockQueuePfnLock 2
1125 #define LockQueueSystemSpaceLock 3
1126 #define LockQueueVacbLock 4
1127 #define LockQueueMasterLock 5
1128 #define LockQueueNonPagedPoolLock 6
1129 #define LockQueueIoCancelLock 7
1130 #define LockQueueWorkQueueLock 8
1131 #define LockQueueIoVpbLock 9
1132 #define LockQueueIoDatabaseLock 10
1133 #define LockQueueIoCompletionLock 11
1134 #define LockQueueNtfsStructLock 12
1135 #define LockQueueAfdWorkQueueLock 13
1136 #define LockQueueBcbLock 14
1137 #define LockQueueMmNonPagedPoolLock 15
1138 #define LockQueueUnusedSpare16 16
1139 #define LockQueueTimerTableLock 17
1140 #define LockQueueMaximumLock (LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS)
1141
1142 #else
1143
1144 typedef enum _KSPIN_LOCK_QUEUE_NUMBER {
1145 LockQueueDispatcherLock,
1146 LockQueueExpansionLock,
1147 LockQueuePfnLock,
1148 LockQueueSystemSpaceLock,
1149 LockQueueVacbLock,
1150 LockQueueMasterLock,
1151 LockQueueNonPagedPoolLock,
1152 LockQueueIoCancelLock,
1153 LockQueueWorkQueueLock,
1154 LockQueueIoVpbLock,
1155 LockQueueIoDatabaseLock,
1156 LockQueueIoCompletionLock,
1157 LockQueueNtfsStructLock,
1158 LockQueueAfdWorkQueueLock,
1159 LockQueueBcbLock,
1160 LockQueueMmNonPagedPoolLock,
1161 LockQueueUnusedSpare16,
1162 LockQueueTimerTableLock,
1163 LockQueueMaximumLock = LockQueueTimerTableLock + LOCK_QUEUE_TIMER_TABLE_LOCKS
1164 } KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER;
1165
1166 #endif
1167
1168 typedef VOID
1169 (DDKAPI *PKDEFERRED_ROUTINE)(
1170 IN struct _KDPC *Dpc,
1171 IN PVOID DeferredContext,
1172 IN PVOID SystemArgument1,
1173 IN PVOID SystemArgument2);
1174
1175 typedef struct _KDPC
1176 {
1177 UCHAR Type;
1178 UCHAR Importance;
1179 volatile USHORT Number;
1180 LIST_ENTRY DpcListEntry;
1181 PKDEFERRED_ROUTINE DeferredRoutine;
1182 PVOID DeferredContext;
1183 PVOID SystemArgument1;
1184 PVOID SystemArgument2;
1185 volatile PVOID DpcData;
1186 } KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;
1187
1188 typedef enum _IO_ALLOCATION_ACTION {
1189 KeepObject = 1,
1190 DeallocateObject,
1191 DeallocateObjectKeepRegisters
1192 } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
1193
1194 typedef IO_ALLOCATION_ACTION
1195 (DDKAPI *PDRIVER_CONTROL)(
1196 IN struct _DEVICE_OBJECT *DeviceObject,
1197 IN struct _IRP *Irp,
1198 IN PVOID MapRegisterBase,
1199 IN PVOID Context);
1200
1201 typedef struct _WAIT_CONTEXT_BLOCK {
1202 KDEVICE_QUEUE_ENTRY WaitQueueEntry;
1203 PDRIVER_CONTROL DeviceRoutine;
1204 PVOID DeviceContext;
1205 ULONG NumberOfMapRegisters;
1206 PVOID DeviceObject;
1207 PVOID CurrentIrp;
1208 PKDPC BufferChainingDpc;
1209 } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
1210
1211 typedef struct _KDEVICE_QUEUE {
1212 CSHORT Type;
1213 CSHORT Size;
1214 LIST_ENTRY DeviceListHead;
1215 KSPIN_LOCK Lock;
1216 #if defined(_AMD64_)
1217 union {
1218 BOOLEAN Busy;
1219 struct {
1220 LONG64 Reserved : 8;
1221 LONG64 Hint : 56;
1222 };
1223 };
1224 #else
1225 BOOLEAN Busy;
1226 #endif
1227
1228 } KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
1229
1230 typedef struct _DISPATCHER_HEADER
1231 {
1232 __GNU_EXTENSION union
1233 {
1234 __GNU_EXTENSION struct
1235 {
1236 UCHAR Type;
1237 __GNU_EXTENSION union
1238 {
1239 UCHAR Absolute;
1240 UCHAR NpxIrql;
1241 };
1242 __GNU_EXTENSION union
1243 {
1244 UCHAR Size;
1245 UCHAR Hand;
1246 };
1247 __GNU_EXTENSION union
1248 {
1249 UCHAR Inserted;
1250 BOOLEAN DebugActive;
1251 };
1252 };
1253 volatile LONG Lock;
1254 };
1255 LONG SignalState;
1256 LIST_ENTRY WaitListHead;
1257 } DISPATCHER_HEADER, *PDISPATCHER_HEADER;
1258
1259 typedef struct _KGATE
1260 {
1261 DISPATCHER_HEADER Header;
1262 } KGATE, *PKGATE, *RESTRICTED_POINTER PRKGATE;
1263
1264 typedef struct _KGUARDED_MUTEX
1265 {
1266 volatile LONG Count;
1267 PKTHREAD Owner;
1268 ULONG Contention;
1269 KGATE Gate;
1270 __GNU_EXTENSION union
1271 {
1272 __GNU_EXTENSION struct
1273 {
1274 SHORT KernelApcDisable;
1275 SHORT SpecialApcDisable;
1276 };
1277 ULONG CombinedApcDisable;
1278 };
1279 } KGUARDED_MUTEX, *PKGUARDED_MUTEX;
1280
1281 typedef struct _KMUTANT {
1282 DISPATCHER_HEADER Header;
1283 LIST_ENTRY MutantListEntry;
1284 struct _KTHREAD *RESTRICTED_POINTER OwnerThread;
1285 BOOLEAN Abandoned;
1286 UCHAR ApcDisable;
1287 } KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;
1288
1289 typedef struct _KTIMER {
1290 DISPATCHER_HEADER Header;
1291 ULARGE_INTEGER DueTime;
1292 LIST_ENTRY TimerListEntry;
1293 struct _KDPC *Dpc;
1294 #if !defined(_X86_)
1295 ULONG Processor;
1296 #endif
1297 ULONG Period;
1298 } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
1299
1300 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
1301 {
1302 StandardDesign,
1303 NEC98x86,
1304 EndAlternatives
1305 } ALTERNATIVE_ARCHITECTURE_TYPE;
1306
1307 typedef struct _KSYSTEM_TIME
1308 {
1309 ULONG LowPart;
1310 LONG High1Time;
1311 LONG High2Time;
1312 } KSYSTEM_TIME, *PKSYSTEM_TIME;
1313
1314 typedef struct _KEVENT {
1315 DISPATCHER_HEADER Header;
1316 } KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
1317
1318 typedef struct _KSEMAPHORE {
1319 DISPATCHER_HEADER Header;
1320 LONG Limit;
1321 } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
1322
1323 typedef struct _PNP_BUS_INFORMATION {
1324 GUID BusTypeGuid;
1325 INTERFACE_TYPE LegacyBusType;
1326 ULONG BusNumber;
1327 } PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;
1328
1329 /******************************************************************************
1330 * Memory manager Types *
1331 ******************************************************************************/
1332
1333 #define MDL_MAPPED_TO_SYSTEM_VA 0x0001
1334 #define MDL_PAGES_LOCKED 0x0002
1335 #define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
1336 #define MDL_ALLOCATED_FIXED_SIZE 0x0008
1337 #define MDL_PARTIAL 0x0010
1338 #define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
1339 #define MDL_IO_PAGE_READ 0x0040
1340 #define MDL_WRITE_OPERATION 0x0080
1341 #define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
1342 #define MDL_FREE_EXTRA_PTES 0x0200
1343 #define MDL_DESCRIBES_AWE 0x0400
1344 #define MDL_IO_SPACE 0x0800
1345 #define MDL_NETWORK_HEADER 0x1000
1346 #define MDL_MAPPING_CAN_FAIL 0x2000
1347 #define MDL_ALLOCATED_MUST_SUCCEED 0x4000
1348 #define MDL_INTERNAL 0x8000
1349
1350 #define MDL_MAPPING_FLAGS ( \
1351 MDL_MAPPED_TO_SYSTEM_VA | \
1352 MDL_PAGES_LOCKED | \
1353 MDL_SOURCE_IS_NONPAGED_POOL | \
1354 MDL_PARTIAL_HAS_BEEN_MAPPED | \
1355 MDL_PARENT_MAPPED_SYSTEM_VA | \
1356 MDL_SYSTEM_VA | \
1357 MDL_IO_SPACE)
1358
1359 typedef struct _MDL {
1360 struct _MDL *Next;
1361 CSHORT Size;
1362 CSHORT MdlFlags;
1363 struct _EPROCESS *Process;
1364 PVOID MappedSystemVa;
1365 PVOID StartVa;
1366 ULONG ByteCount;
1367 ULONG ByteOffset;
1368 } MDL, *PMDL;
1369
1370
1371 /******************************************************************************
1372 * Memory manager Functions *
1373 ******************************************************************************/
1374
1375 /* PVOID MmGetSystemAddressForMdl(
1376 * IN PMDL Mdl);
1377 */
1378 #define MmGetSystemAddressForMdl(Mdl) \
1379 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
1380 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
1381 ((Mdl)->MappedSystemVa) : \
1382 (MmMapLockedPages((Mdl), KernelMode)))
1383
1384 /* PVOID
1385 * MmGetSystemAddressForMdlSafe(
1386 * IN PMDL Mdl,
1387 * IN MM_PAGE_PRIORITY Priority)
1388 */
1389 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
1390 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
1391 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
1392 (_Mdl)->MappedSystemVa : \
1393 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
1394 KernelMode, MmCached, NULL, FALSE, (_Priority)))
1395
1396 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1397 NTKERNELAPI
1398 PMDL
1399 NTAPI
1400 MmCreateMdl(
1401 IN PMDL MemoryDescriptorList OPTIONAL,
1402 IN PVOID Base,
1403 IN SIZE_T Length);
1404
1405 #endif
1406
1407 /******************************************************************************
1408 * Security Manager Types *
1409 ******************************************************************************/
1410
1411 //
1412 // Access/Security Stuff
1413 //
1414 typedef ULONG ACCESS_MASK, *PACCESS_MASK;
1415 typedef PVOID PACCESS_TOKEN;
1416
1417 #define DELETE 0x00010000L
1418 #define READ_CONTROL 0x00020000L
1419 #define WRITE_DAC 0x00040000L
1420 #define WRITE_OWNER 0x00080000L
1421 #define SYNCHRONIZE 0x00100000L
1422 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
1423 #define STANDARD_RIGHTS_READ READ_CONTROL
1424 #define STANDARD_RIGHTS_WRITE READ_CONTROL
1425 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
1426 #define STANDARD_RIGHTS_ALL 0x001F0000L
1427 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
1428 #define ACCESS_SYSTEM_SECURITY 0x01000000L
1429 #define MAXIMUM_ALLOWED 0x02000000L
1430 #define GENERIC_READ 0x80000000L
1431 #define GENERIC_WRITE 0x40000000L
1432 #define GENERIC_EXECUTE 0x20000000L
1433 #define GENERIC_ALL 0x10000000L
1434
1435 typedef struct _GENERIC_MAPPING {
1436 ACCESS_MASK GenericRead;
1437 ACCESS_MASK GenericWrite;
1438 ACCESS_MASK GenericExecute;
1439 ACCESS_MASK GenericAll;
1440 } GENERIC_MAPPING, *PGENERIC_MAPPING;
1441
1442 #define ACL_REVISION 2
1443 #define ACL_REVISION_DS 4
1444
1445 #define ACL_REVISION1 1
1446 #define ACL_REVISION2 2
1447 #define ACL_REVISION3 3
1448 #define ACL_REVISION4 4
1449 #define MIN_ACL_REVISION ACL_REVISION2
1450 #define MAX_ACL_REVISION ACL_REVISION4
1451
1452 typedef struct _ACL {
1453 UCHAR AclRevision;
1454 UCHAR Sbz1;
1455 USHORT AclSize;
1456 USHORT AceCount;
1457 USHORT Sbz2;
1458 } ACL, *PACL;
1459
1460 //
1461 // Current security descriptor revision value
1462 //
1463 #define SECURITY_DESCRIPTOR_REVISION (1)
1464 #define SECURITY_DESCRIPTOR_REVISION1 (1)
1465
1466 //
1467 // Privilege attributes
1468 //
1469 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
1470 #define SE_PRIVILEGE_ENABLED (0x00000002L)
1471 #define SE_PRIVILEGE_REMOVED (0X00000004L)
1472 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
1473
1474 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
1475 SE_PRIVILEGE_ENABLED | \
1476 SE_PRIVILEGE_REMOVED | \
1477 SE_PRIVILEGE_USED_FOR_ACCESS)
1478
1479 #include <pshpack4.h>
1480 typedef struct _LUID_AND_ATTRIBUTES {
1481 LUID Luid;
1482 ULONG Attributes;
1483 } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
1484 #include <poppack.h>
1485
1486 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
1487 typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
1488
1489 //
1490 // Privilege sets
1491 //
1492 #define PRIVILEGE_SET_ALL_NECESSARY (1)
1493
1494 typedef struct _PRIVILEGE_SET {
1495 ULONG PrivilegeCount;
1496 ULONG Control;
1497 LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
1498 } PRIVILEGE_SET,*PPRIVILEGE_SET;
1499
1500 typedef enum _SECURITY_IMPERSONATION_LEVEL {
1501 SecurityAnonymous,
1502 SecurityIdentification,
1503 SecurityImpersonation,
1504 SecurityDelegation
1505 } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
1506
1507 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
1508 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
1509 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
1510 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
1511
1512 #define SECURITY_DYNAMIC_TRACKING (TRUE)
1513 #define SECURITY_STATIC_TRACKING (FALSE)
1514
1515 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE;
1516
1517 typedef struct _SECURITY_QUALITY_OF_SERVICE {
1518 ULONG Length;
1519 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
1520 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
1521 BOOLEAN EffectiveOnly;
1522 } SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
1523
1524 typedef struct _SE_IMPERSONATION_STATE {
1525 PACCESS_TOKEN Token;
1526 BOOLEAN CopyOnOpen;
1527 BOOLEAN EffectiveOnly;
1528 SECURITY_IMPERSONATION_LEVEL Level;
1529 } SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
1530
1531 #define OWNER_SECURITY_INFORMATION (0x00000001L)
1532 #define GROUP_SECURITY_INFORMATION (0x00000002L)
1533 #define DACL_SECURITY_INFORMATION (0x00000004L)
1534 #define SACL_SECURITY_INFORMATION (0x00000008L)
1535 #define LABEL_SECURITY_INFORMATION (0x00000010L)
1536
1537 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
1538 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
1539 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
1540 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
1541
1542 typedef enum _SECURITY_OPERATION_CODE {
1543 SetSecurityDescriptor,
1544 QuerySecurityDescriptor,
1545 DeleteSecurityDescriptor,
1546 AssignSecurityDescriptor
1547 } SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
1548
1549 #define INITIAL_PRIVILEGE_COUNT 3
1550
1551 typedef struct _INITIAL_PRIVILEGE_SET {
1552 ULONG PrivilegeCount;
1553 ULONG Control;
1554 LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT];
1555 } INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
1556
1557 #define SE_MIN_WELL_KNOWN_PRIVILEGE 2
1558 #define SE_CREATE_TOKEN_PRIVILEGE 2
1559 #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3
1560 #define SE_LOCK_MEMORY_PRIVILEGE 4
1561 #define SE_INCREASE_QUOTA_PRIVILEGE 5
1562 #define SE_MACHINE_ACCOUNT_PRIVILEGE 6
1563 #define SE_TCB_PRIVILEGE 7
1564 #define SE_SECURITY_PRIVILEGE 8
1565 #define SE_TAKE_OWNERSHIP_PRIVILEGE 9
1566 #define SE_LOAD_DRIVER_PRIVILEGE 10
1567 #define SE_SYSTEM_PROFILE_PRIVILEGE 11
1568 #define SE_SYSTEMTIME_PRIVILEGE 12
1569 #define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13
1570 #define SE_INC_BASE_PRIORITY_PRIVILEGE 14
1571 #define SE_CREATE_PAGEFILE_PRIVILEGE 15
1572 #define SE_CREATE_PERMANENT_PRIVILEGE 16
1573 #define SE_BACKUP_PRIVILEGE 17
1574 #define SE_RESTORE_PRIVILEGE 18
1575 #define SE_SHUTDOWN_PRIVILEGE 19
1576 #define SE_DEBUG_PRIVILEGE 20
1577 #define SE_AUDIT_PRIVILEGE 21
1578 #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22
1579 #define SE_CHANGE_NOTIFY_PRIVILEGE 23
1580 #define SE_REMOTE_SHUTDOWN_PRIVILEGE 24
1581 #define SE_UNDOCK_PRIVILEGE 25
1582 #define SE_SYNC_AGENT_PRIVILEGE 26
1583 #define SE_ENABLE_DELEGATION_PRIVILEGE 27
1584 #define SE_MANAGE_VOLUME_PRIVILEGE 28
1585 #define SE_IMPERSONATE_PRIVILEGE 29
1586 #define SE_CREATE_GLOBAL_PRIVILEGE 30
1587 #define SE_TRUSTED_CREDMAN_ACCESS_PRIVILEGE 31
1588 #define SE_RELABEL_PRIVILEGE 32
1589 #define SE_INC_WORKING_SET_PRIVILEGE 33
1590 #define SE_TIME_ZONE_PRIVILEGE 34
1591 #define SE_CREATE_SYMBOLIC_LINK_PRIVILEGE 35
1592 #define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
1593
1594 typedef struct _SECURITY_SUBJECT_CONTEXT {
1595 PACCESS_TOKEN ClientToken;
1596 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
1597 PACCESS_TOKEN PrimaryToken;
1598 PVOID ProcessAuditId;
1599 } SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
1600
1601 #include <pshpack4.h>
1602 typedef struct _ACCESS_STATE {
1603 LUID OperationID;
1604 BOOLEAN SecurityEvaluated;
1605 BOOLEAN GenerateAudit;
1606 BOOLEAN GenerateOnClose;
1607 BOOLEAN PrivilegesAllocated;
1608 ULONG Flags;
1609 ACCESS_MASK RemainingDesiredAccess;
1610 ACCESS_MASK PreviouslyGrantedAccess;
1611 ACCESS_MASK OriginalDesiredAccess;
1612 SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
1613 PSECURITY_DESCRIPTOR SecurityDescriptor;
1614 PVOID AuxData;
1615 union {
1616 INITIAL_PRIVILEGE_SET InitialPrivilegeSet;
1617 PRIVILEGE_SET PrivilegeSet;
1618 } Privileges;
1619
1620 BOOLEAN AuditPrivileges;
1621 UNICODE_STRING ObjectName;
1622 UNICODE_STRING ObjectTypeName;
1623 } ACCESS_STATE, *PACCESS_STATE;
1624 #include <poppack.h>
1625
1626 /******************************************************************************
1627 * Configuration Manager Types *
1628 ******************************************************************************/
1629
1630 /* KEY_VALUE_Xxx.Type */
1631
1632 #define REG_NONE 0
1633 #define REG_SZ 1
1634 #define REG_EXPAND_SZ 2
1635 #define REG_BINARY 3
1636 #define REG_DWORD 4
1637 #define REG_DWORD_LITTLE_ENDIAN 4
1638 #define REG_DWORD_BIG_ENDIAN 5
1639 #define REG_LINK 6
1640 #define REG_MULTI_SZ 7
1641 #define REG_RESOURCE_LIST 8
1642 #define REG_FULL_RESOURCE_DESCRIPTOR 9
1643 #define REG_RESOURCE_REQUIREMENTS_LIST 10
1644 #define REG_QWORD 11
1645 #define REG_QWORD_LITTLE_ENDIAN 11
1646
1647 //
1648 // Registry Access Rights
1649 //
1650 #define KEY_QUERY_VALUE (0x0001)
1651 #define KEY_SET_VALUE (0x0002)
1652 #define KEY_CREATE_SUB_KEY (0x0004)
1653 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
1654 #define KEY_NOTIFY (0x0010)
1655 #define KEY_CREATE_LINK (0x0020)
1656 #define KEY_WOW64_32KEY (0x0200)
1657 #define KEY_WOW64_64KEY (0x0100)
1658 #define KEY_WOW64_RES (0x0300)
1659
1660 #define KEY_READ ((STANDARD_RIGHTS_READ |\
1661 KEY_QUERY_VALUE |\
1662 KEY_ENUMERATE_SUB_KEYS |\
1663 KEY_NOTIFY) \
1664 & \
1665 (~SYNCHRONIZE))
1666
1667 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
1668 KEY_SET_VALUE |\
1669 KEY_CREATE_SUB_KEY) \
1670 & \
1671 (~SYNCHRONIZE))
1672
1673 #define KEY_EXECUTE ((KEY_READ) \
1674 & \
1675 (~SYNCHRONIZE))
1676
1677 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
1678 KEY_QUERY_VALUE |\
1679 KEY_SET_VALUE |\
1680 KEY_CREATE_SUB_KEY |\
1681 KEY_ENUMERATE_SUB_KEYS |\
1682 KEY_NOTIFY |\
1683 KEY_CREATE_LINK) \
1684 & \
1685 (~SYNCHRONIZE))
1686
1687 //
1688 // Registry Open/Create Options
1689 //
1690 #define REG_OPTION_RESERVED (0x00000000L)
1691 #define REG_OPTION_NON_VOLATILE (0x00000000L)
1692 #define REG_OPTION_VOLATILE (0x00000001L)
1693 #define REG_OPTION_CREATE_LINK (0x00000002L)
1694 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
1695 #define REG_OPTION_OPEN_LINK (0x00000008L)
1696
1697 #define REG_LEGAL_OPTION \
1698 (REG_OPTION_RESERVED |\
1699 REG_OPTION_NON_VOLATILE |\
1700 REG_OPTION_VOLATILE |\
1701 REG_OPTION_CREATE_LINK |\
1702 REG_OPTION_BACKUP_RESTORE |\
1703 REG_OPTION_OPEN_LINK)
1704
1705 //
1706 // Key creation/open disposition
1707 //
1708 #define REG_CREATED_NEW_KEY (0x00000001L)
1709 #define REG_OPENED_EXISTING_KEY (0x00000002L)
1710
1711 //
1712 // Key restore & hive load flags
1713 //
1714 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
1715 #define REG_REFRESH_HIVE (0x00000002L)
1716 #define REG_NO_LAZY_FLUSH (0x00000004L)
1717 #define REG_FORCE_RESTORE (0x00000008L)
1718 #define REG_APP_HIVE (0x00000010L)
1719 #define REG_PROCESS_PRIVATE (0x00000020L)
1720 #define REG_START_JOURNAL (0x00000040L)
1721 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
1722 #define REG_HIVE_NO_RM (0x00000100L)
1723 #define REG_HIVE_SINGLE_LOG (0x00000200L)
1724
1725 //
1726 // Unload Flags
1727 //
1728 #define REG_FORCE_UNLOAD 1
1729
1730 //
1731 // Notify Filter Values
1732 //
1733 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
1734 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
1735 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
1736 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
1737
1738 #define REG_LEGAL_CHANGE_FILTER \
1739 (REG_NOTIFY_CHANGE_NAME |\
1740 REG_NOTIFY_CHANGE_ATTRIBUTES |\
1741 REG_NOTIFY_CHANGE_LAST_SET |\
1742 REG_NOTIFY_CHANGE_SECURITY)
1743
1744 typedef struct _CM_FLOPPY_DEVICE_DATA {
1745 USHORT Version;
1746 USHORT Revision;
1747 CHAR Size[8];
1748 ULONG MaxDensity;
1749 ULONG MountDensity;
1750 UCHAR StepRateHeadUnloadTime;
1751 UCHAR HeadLoadTime;
1752 UCHAR MotorOffTime;
1753 UCHAR SectorLengthCode;
1754 UCHAR SectorPerTrack;
1755 UCHAR ReadWriteGapLength;
1756 UCHAR DataTransferLength;
1757 UCHAR FormatGapLength;
1758 UCHAR FormatFillCharacter;
1759 UCHAR HeadSettleTime;
1760 UCHAR MotorSettleTime;
1761 UCHAR MaximumTrackValue;
1762 UCHAR DataTransferRate;
1763 } CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA;
1764
1765 #include <pshpack4.h>
1766 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
1767 UCHAR Type;
1768 UCHAR ShareDisposition;
1769 USHORT Flags;
1770 union {
1771 struct {
1772 PHYSICAL_ADDRESS Start;
1773 ULONG Length;
1774 } Generic;
1775 struct {
1776 PHYSICAL_ADDRESS Start;
1777 ULONG Length;
1778 } Port;
1779 struct {
1780 ULONG Level;
1781 ULONG Vector;
1782 KAFFINITY Affinity;
1783 } Interrupt;
1784 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1785 struct {
1786 __GNU_EXTENSION union {
1787 struct {
1788 USHORT Reserved;
1789 USHORT MessageCount;
1790 ULONG Vector;
1791 KAFFINITY Affinity;
1792 } Raw;
1793 struct {
1794 ULONG Level;
1795 ULONG Vector;
1796 KAFFINITY Affinity;
1797 } Translated;
1798 };
1799 } MessageInterrupt;
1800 #endif
1801 struct {
1802 PHYSICAL_ADDRESS Start;
1803 ULONG Length;
1804 } Memory;
1805 struct {
1806 ULONG Channel;
1807 ULONG Port;
1808 ULONG Reserved1;
1809 } Dma;
1810 struct {
1811 ULONG Data[3];
1812 } DevicePrivate;
1813 struct {
1814 ULONG Start;
1815 ULONG Length;
1816 ULONG Reserved;
1817 } BusNumber;
1818 struct {
1819 ULONG DataSize;
1820 ULONG Reserved1;
1821 ULONG Reserved2;
1822 } DeviceSpecificData;
1823 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1824 struct {
1825 PHYSICAL_ADDRESS Start;
1826 ULONG Length40;
1827 } Memory40;
1828 struct {
1829 PHYSICAL_ADDRESS Start;
1830 ULONG Length48;
1831 } Memory48;
1832 struct {
1833 PHYSICAL_ADDRESS Start;
1834 ULONG Length64;
1835 } Memory64;
1836 #endif
1837 } u;
1838 } CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
1839 #include <poppack.h>
1840
1841 #include <pshpack1.h>
1842 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Type */
1843
1844 #define CmResourceTypeNull 0
1845 #define CmResourceTypePort 1
1846 #define CmResourceTypeInterrupt 2
1847 #define CmResourceTypeMemory 3
1848 #define CmResourceTypeDma 4
1849 #define CmResourceTypeDeviceSpecific 5
1850 #define CmResourceTypeBusNumber 6
1851 #define CmResourceTypeMemoryLarge 7
1852 #define CmResourceTypeNonArbitrated 128
1853 #define CmResourceTypeConfigData 128
1854 #define CmResourceTypeDevicePrivate 129
1855 #define CmResourceTypePcCardConfig 130
1856 #define CmResourceTypeMfCardConfig 131
1857
1858 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
1859
1860 typedef enum _CM_SHARE_DISPOSITION {
1861 CmResourceShareUndetermined,
1862 CmResourceShareDeviceExclusive,
1863 CmResourceShareDriverExclusive,
1864 CmResourceShareShared
1865 } CM_SHARE_DISPOSITION;
1866
1867 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypePort */
1868
1869 #define CM_RESOURCE_PORT_MEMORY 0x0000
1870 #define CM_RESOURCE_PORT_IO 0x0001
1871 #define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004
1872 #define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008
1873 #define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010
1874 #define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020
1875 #define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040
1876 #define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080
1877 #define CM_RESOURCE_PORT_BAR 0x0100
1878
1879 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeInterrupt */
1880
1881 #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000
1882 #define CM_RESOURCE_INTERRUPT_LATCHED 0x0001
1883 #define CM_RESOURCE_INTERRUPT_MESSAGE 0x0002
1884 #define CM_RESOURCE_INTERRUPT_POLICY_INCLUDED 0x0004
1885
1886 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeMemory */
1887
1888 #define CM_RESOURCE_MEMORY_READ_WRITE 0x0000
1889 #define CM_RESOURCE_MEMORY_READ_ONLY 0x0001
1890 #define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002
1891 #define CM_RESOURCE_MEMORY_WRITEABILITY_MASK 0x0003
1892 #define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004
1893 #define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008
1894 #define CM_RESOURCE_MEMORY_24 0x0010
1895 #define CM_RESOURCE_MEMORY_CACHEABLE 0x0020
1896 #define CM_RESOURCE_MEMORY_WINDOW_DECODE 0x0040
1897 #define CM_RESOURCE_MEMORY_BAR 0x0080
1898 #define CM_RESOURCE_MEMORY_COMPAT_FOR_INACCESSIBLE_RANGE 0x0100
1899
1900 /* CM_PARTIAL_RESOURCE_DESCRIPTOR.Flags if Type = CmResourceTypeDma */
1901
1902 #define CM_RESOURCE_DMA_8 0x0000
1903 #define CM_RESOURCE_DMA_16 0x0001
1904 #define CM_RESOURCE_DMA_32 0x0002
1905 #define CM_RESOURCE_DMA_8_AND_16 0x0004
1906 #define CM_RESOURCE_DMA_BUS_MASTER 0x0008
1907 #define CM_RESOURCE_DMA_TYPE_A 0x0010
1908 #define CM_RESOURCE_DMA_TYPE_B 0x0020
1909 #define CM_RESOURCE_DMA_TYPE_F 0x0040
1910
1911 typedef struct _CM_PARTIAL_RESOURCE_LIST {
1912 USHORT Version;
1913 USHORT Revision;
1914 ULONG Count;
1915 CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
1916 } CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
1917
1918 typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
1919 INTERFACE_TYPE InterfaceType;
1920 ULONG BusNumber;
1921 CM_PARTIAL_RESOURCE_LIST PartialResourceList;
1922 } CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
1923
1924 typedef struct _CM_RESOURCE_LIST {
1925 ULONG Count;
1926 CM_FULL_RESOURCE_DESCRIPTOR List[1];
1927 } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
1928
1929 typedef struct _CM_INT13_DRIVE_PARAMETER {
1930 USHORT DriveSelect;
1931 ULONG MaxCylinders;
1932 USHORT SectorsPerTrack;
1933 USHORT MaxHeads;
1934 USHORT NumberDrives;
1935 } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
1936
1937 typedef struct _CM_PNP_BIOS_DEVICE_NODE
1938 {
1939 USHORT Size;
1940 UCHAR Node;
1941 ULONG ProductId;
1942 UCHAR DeviceType[3];
1943 USHORT DeviceAttributes;
1944 } CM_PNP_BIOS_DEVICE_NODE,*PCM_PNP_BIOS_DEVICE_NODE;
1945
1946 typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK
1947 {
1948 UCHAR Signature[4];
1949 UCHAR Revision;
1950 UCHAR Length;
1951 USHORT ControlField;
1952 UCHAR Checksum;
1953 ULONG EventFlagAddress;
1954 USHORT RealModeEntryOffset;
1955 USHORT RealModeEntrySegment;
1956 USHORT ProtectedModeEntryOffset;
1957 ULONG ProtectedModeCodeBaseAddress;
1958 ULONG OemDeviceId;
1959 USHORT RealModeDataBaseAddress;
1960 ULONG ProtectedModeDataBaseAddress;
1961 } CM_PNP_BIOS_INSTALLATION_CHECK, *PCM_PNP_BIOS_INSTALLATION_CHECK;
1962
1963 #include <poppack.h>
1964
1965 typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA
1966 {
1967 ULONG BytesPerSector;
1968 ULONG NumberOfCylinders;
1969 ULONG SectorsPerTrack;
1970 ULONG NumberOfHeads;
1971 } CM_DISK_GEOMETRY_DEVICE_DATA, *PCM_DISK_GEOMETRY_DEVICE_DATA;
1972
1973 typedef struct _CM_KEYBOARD_DEVICE_DATA {
1974 USHORT Version;
1975 USHORT Revision;
1976 UCHAR Type;
1977 UCHAR Subtype;
1978 USHORT KeyboardFlags;
1979 } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
1980
1981 typedef struct _CM_MCA_POS_DATA {
1982 USHORT AdapterId;
1983 UCHAR PosData1;
1984 UCHAR PosData2;
1985 UCHAR PosData3;
1986 UCHAR PosData4;
1987 } CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
1988
1989 #if (NTDDI_VERSION >= NTDDI_WINXP)
1990 typedef struct CM_Power_Data_s {
1991 ULONG PD_Size;
1992 DEVICE_POWER_STATE PD_MostRecentPowerState;
1993 ULONG PD_Capabilities;
1994 ULONG PD_D1Latency;
1995 ULONG PD_D2Latency;
1996 ULONG PD_D3Latency;
1997 DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum];
1998 SYSTEM_POWER_STATE PD_DeepestSystemWake;
1999 } CM_POWER_DATA, *PCM_POWER_DATA;
2000
2001 #define PDCAP_D0_SUPPORTED 0x00000001
2002 #define PDCAP_D1_SUPPORTED 0x00000002
2003 #define PDCAP_D2_SUPPORTED 0x00000004
2004 #define PDCAP_D3_SUPPORTED 0x00000008
2005 #define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010
2006 #define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020
2007 #define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040
2008 #define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080
2009 #define PDCAP_WARM_EJECT_SUPPORTED 0x00000100
2010
2011 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
2012
2013 typedef struct _CM_SCSI_DEVICE_DATA {
2014 USHORT Version;
2015 USHORT Revision;
2016 UCHAR HostIdentifier;
2017 } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
2018
2019 typedef struct _CM_SERIAL_DEVICE_DATA {
2020 USHORT Version;
2021 USHORT Revision;
2022 ULONG BaudClock;
2023 } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
2024
2025 typedef enum _KEY_INFORMATION_CLASS {
2026 KeyBasicInformation,
2027 KeyNodeInformation,
2028 KeyFullInformation,
2029 KeyNameInformation,
2030 KeyCachedInformation,
2031 KeyFlagsInformation
2032 } KEY_INFORMATION_CLASS;
2033
2034 typedef struct _KEY_BASIC_INFORMATION {
2035 LARGE_INTEGER LastWriteTime;
2036 ULONG TitleIndex;
2037 ULONG NameLength;
2038 WCHAR Name[1];
2039 } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
2040
2041 typedef struct _KEY_FULL_INFORMATION {
2042 LARGE_INTEGER LastWriteTime;
2043 ULONG TitleIndex;
2044 ULONG ClassOffset;
2045 ULONG ClassLength;
2046 ULONG SubKeys;
2047 ULONG MaxNameLen;
2048 ULONG MaxClassLen;
2049 ULONG Values;
2050 ULONG MaxValueNameLen;
2051 ULONG MaxValueDataLen;
2052 WCHAR Class[1];
2053 } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
2054
2055 typedef struct _KEY_NODE_INFORMATION {
2056 LARGE_INTEGER LastWriteTime;
2057 ULONG TitleIndex;
2058 ULONG ClassOffset;
2059 ULONG ClassLength;
2060 ULONG NameLength;
2061 WCHAR Name[1];
2062 } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
2063
2064 typedef struct _KEY_VALUE_BASIC_INFORMATION {
2065 ULONG TitleIndex;
2066 ULONG Type;
2067 ULONG NameLength;
2068 WCHAR Name[1];
2069 } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
2070
2071 typedef struct _KEY_VALUE_FULL_INFORMATION {
2072 ULONG TitleIndex;
2073 ULONG Type;
2074 ULONG DataOffset;
2075 ULONG DataLength;
2076 ULONG NameLength;
2077 WCHAR Name[1];
2078 } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
2079
2080 typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
2081 ULONG TitleIndex;
2082 ULONG Type;
2083 ULONG DataLength;
2084 UCHAR Data[1];
2085 } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
2086
2087 typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
2088 ULONG Type;
2089 ULONG DataLength;
2090 UCHAR Data[1];
2091 } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
2092
2093 typedef struct _KEY_VALUE_ENTRY {
2094 PUNICODE_STRING ValueName;
2095 ULONG DataLength;
2096 ULONG DataOffset;
2097 ULONG Type;
2098 } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
2099
2100 typedef enum _KEY_VALUE_INFORMATION_CLASS {
2101 KeyValueBasicInformation,
2102 KeyValueFullInformation,
2103 KeyValuePartialInformation,
2104 KeyValueFullInformationAlign64,
2105 KeyValuePartialInformationAlign64
2106 } KEY_VALUE_INFORMATION_CLASS;
2107
2108 typedef struct _KEY_WRITE_TIME_INFORMATION {
2109 LARGE_INTEGER LastWriteTime;
2110 } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;
2111
2112 typedef enum _KEY_SET_INFORMATION_CLASS {
2113 KeyWriteTimeInformation,
2114 KeyWow64FlagsInformation,
2115 KeyControlFlagsInformation,
2116 KeySetVirtualizationInformation,
2117 KeySetDebugInformation,
2118 KeySetHandleTagsInformation,
2119 MaxKeySetInfoClass
2120 } KEY_SET_INFORMATION_CLASS;
2121
2122 /******************************************************************************
2123 * I/O Manager Functions *
2124 ******************************************************************************/
2125
2126 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
2127 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
2128
2129 #define DMA_MACROS_DEFINED
2130
2131 FORCEINLINE
2132 NTSTATUS
2133 IoAllocateAdapterChannel(
2134 IN PADAPTER_OBJECT AdapterObject,
2135 IN PDEVICE_OBJECT DeviceObject,
2136 IN ULONG NumberOfMapRegisters,
2137 IN PDRIVER_CONTROL ExecutionRoutine,
2138 IN PVOID Context)
2139 {
2140 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
2141 AllocateAdapterChannel =
2142 *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
2143 ASSERT(AllocateAdapterChannel);
2144 return AllocateAdapterChannel(DmaAdapter,
2145 DeviceObject,
2146 NumberOfMapRegisters,
2147 ExecutionRoutine,
2148 Context );
2149 }
2150
2151 FORCEINLINE
2152 BOOLEAN
2153 IoFlushAdapterBuffers(
2154 IN PADAPTER_OBJECT AdapterObject,
2155 IN PMDL Mdl,
2156 IN PVOID MapRegisterBase,
2157 IN PVOID CurrentVa,
2158 IN ULONG Length,
2159 IN BOOLEAN WriteToDevice)
2160 {
2161 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
2162 FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
2163 ASSERT(FlushAdapterBuffers);
2164 return FlushAdapterBuffers(DmaAdapter,
2165 Mdl,
2166 MapRegisterBase,
2167 CurrentVa,
2168 Length,
2169 WriteToDevice );
2170 }
2171
2172 FORCEINLINE
2173 VOID
2174 IoFreeAdapterChannel(
2175 IN PADAPTER_OBJECT AdapterObject)
2176 {
2177 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
2178 FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
2179 ASSERT(FreeAdapterChannel);
2180 FreeAdapterChannel(DmaAdapter);
2181 }
2182
2183 FORCEINLINE
2184 VOID
2185 IoFreeMapRegisters(
2186 IN PADAPTER_OBJECT AdapterObject,
2187 IN PVOID MapRegisterBase,
2188 IN ULONG NumberOfMapRegisters)
2189 {
2190 PFREE_MAP_REGISTERS FreeMapRegisters;
2191 FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
2192 ASSERT(FreeMapRegisters);
2193 FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
2194 }
2195
2196 FORCEINLINE
2197 PHYSICAL_ADDRESS
2198 IoMapTransfer(
2199 IN PDMA_ADAPTER DmaAdapter,
2200 IN PMDL Mdl,
2201 IN PVOID MapRegisterBase,
2202 IN PVOID CurrentVa,
2203 IN OUT PULONG Length,
2204 IN BOOLEAN WriteToDevice)
2205 {
2206 PMAP_TRANSFER MapTransfer;
2207
2208 MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
2209 ASSERT(MapTransfer);
2210 return MapTransfer(DmaAdapter,
2211 Mdl,
2212 MapRegisterBase,
2213 CurrentVa,
2214 Length,
2215 WriteToDevice);
2216 }
2217 #endif
2218
2219 /* PCI_COMMON_CONFIG.Command */
2220
2221 #define PCI_ENABLE_IO_SPACE 0x0001
2222 #define PCI_ENABLE_MEMORY_SPACE 0x0002
2223 #define PCI_ENABLE_BUS_MASTER 0x0004
2224 #define PCI_ENABLE_SPECIAL_CYCLES 0x0008
2225 #define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010
2226 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020
2227 #define PCI_ENABLE_PARITY 0x0040
2228 #define PCI_ENABLE_WAIT_CYCLE 0x0080
2229 #define PCI_ENABLE_SERR 0x0100
2230 #define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200
2231 #define PCI_DISABLE_LEVEL_INTERRUPT 0x0400
2232
2233 /* PCI_COMMON_CONFIG.Status */
2234
2235 #define PCI_STATUS_INTERRUPT_PENDING 0x0008
2236 #define PCI_STATUS_CAPABILITIES_LIST 0x0010
2237 #define PCI_STATUS_66MHZ_CAPABLE 0x0020
2238 #define PCI_STATUS_UDF_SUPPORTED 0x0040
2239 #define PCI_STATUS_FAST_BACK_TO_BACK 0x0080
2240 #define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
2241 #define PCI_STATUS_DEVSEL 0x0600
2242 #define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800
2243 #define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000
2244 #define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000
2245 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000
2246 #define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000
2247
2248 /* PCI_COMMON_CONFIG.HeaderType */
2249
2250 #define PCI_MULTIFUNCTION 0x80
2251 #define PCI_DEVICE_TYPE 0x00
2252 #define PCI_BRIDGE_TYPE 0x01
2253 #define PCI_CARDBUS_BRIDGE_TYPE 0x02
2254
2255 #define PCI_CONFIGURATION_TYPE(PciData) \
2256 (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION)
2257
2258 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
2259 ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
2260
2261 /* PCI device classes */
2262
2263 #define PCI_CLASS_PRE_20 0x00
2264 #define PCI_CLASS_MASS_STORAGE_CTLR 0x01
2265 #define PCI_CLASS_NETWORK_CTLR 0x02
2266 #define PCI_CLASS_DISPLAY_CTLR 0x03
2267 #define PCI_CLASS_MULTIMEDIA_DEV 0x04
2268 #define PCI_CLASS_MEMORY_CTLR 0x05
2269 #define PCI_CLASS_BRIDGE_DEV 0x06
2270 #define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07
2271 #define PCI_CLASS_BASE_SYSTEM_DEV 0x08
2272 #define PCI_CLASS_INPUT_DEV 0x09
2273 #define PCI_CLASS_DOCKING_STATION 0x0a
2274 #define PCI_CLASS_PROCESSOR 0x0b
2275 #define PCI_CLASS_SERIAL_BUS_CTLR 0x0c
2276 #define PCI_CLASS_WIRELESS_CTLR 0x0d
2277 #define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e
2278 #define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f
2279 #define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10
2280 #define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11
2281
2282 /* PCI device subclasses for class 0 */
2283
2284 #define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
2285 #define PCI_SUBCLASS_PRE_20_VGA 0x01
2286
2287 /* PCI device subclasses for class 1 (mass storage controllers)*/
2288
2289 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00
2290 #define PCI_SUBCLASS_MSC_IDE_CTLR 0x01
2291 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02
2292 #define PCI_SUBCLASS_MSC_IPI_CTLR 0x03
2293 #define PCI_SUBCLASS_MSC_RAID_CTLR 0x04
2294 #define PCI_SUBCLASS_MSC_OTHER 0x80
2295
2296 /* PCI device subclasses for class 2 (network controllers)*/
2297
2298 #define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00
2299 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01
2300 #define PCI_SUBCLASS_NET_FDDI_CTLR 0x02
2301 #define PCI_SUBCLASS_NET_ATM_CTLR 0x03
2302 #define PCI_SUBCLASS_NET_ISDN_CTLR 0x04
2303 #define PCI_SUBCLASS_NET_OTHER 0x80
2304
2305 /* PCI device subclasses for class 3 (display controllers)*/
2306
2307 #define PCI_SUBCLASS_VID_VGA_CTLR 0x00
2308 #define PCI_SUBCLASS_VID_XGA_CTLR 0x01
2309 #define PCI_SUBCLASS_VID_3D_CTLR 0x02
2310 #define PCI_SUBCLASS_VID_OTHER 0x80
2311
2312 /* PCI device subclasses for class 4 (multimedia device)*/
2313
2314 #define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
2315 #define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
2316 #define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02
2317 #define PCI_SUBCLASS_MM_OTHER 0x80
2318
2319 /* PCI device subclasses for class 5 (memory controller)*/
2320
2321 #define PCI_SUBCLASS_MEM_RAM 0x00
2322 #define PCI_SUBCLASS_MEM_FLASH 0x01
2323 #define PCI_SUBCLASS_MEM_OTHER 0x80
2324
2325 /* PCI device subclasses for class 6 (bridge device)*/
2326
2327 #define PCI_SUBCLASS_BR_HOST 0x00
2328 #define PCI_SUBCLASS_BR_ISA 0x01
2329 #define PCI_SUBCLASS_BR_EISA 0x02
2330 #define PCI_SUBCLASS_BR_MCA 0x03
2331 #define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
2332 #define PCI_SUBCLASS_BR_PCMCIA 0x05
2333 #define PCI_SUBCLASS_BR_NUBUS 0x06
2334 #define PCI_SUBCLASS_BR_CARDBUS 0x07
2335 #define PCI_SUBCLASS_BR_RACEWAY 0x08
2336 #define PCI_SUBCLASS_BR_OTHER 0x80
2337
2338 /* PCI device subclasses for class C (serial bus controller)*/
2339
2340 #define PCI_SUBCLASS_SB_IEEE1394 0x00
2341 #define PCI_SUBCLASS_SB_ACCESS 0x01
2342 #define PCI_SUBCLASS_SB_SSA 0x02
2343 #define PCI_SUBCLASS_SB_USB 0x03
2344 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04
2345 #define PCI_SUBCLASS_SB_SMBUS 0x05
2346
2347 #define PCI_MAX_DEVICES 32
2348 #define PCI_MAX_FUNCTION 8
2349 #define PCI_MAX_BRIDGE_NUMBER 0xFF
2350 #define PCI_INVALID_VENDORID 0xFFFF
2351 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific))
2352
2353 #define PCI_ADDRESS_IO_SPACE 0x00000001
2354 #define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006
2355 #define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008
2356 #define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc
2357 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0
2358 #define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800
2359
2360 #define PCI_TYPE_32BIT 0
2361 #define PCI_TYPE_20BIT 2
2362 #define PCI_TYPE_64BIT 4
2363
2364 #define POOL_COLD_ALLOCATION 256
2365 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8
2366 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16
2367
2368 #define PCI_TYPE0_ADDRESSES 6
2369 #define PCI_TYPE1_ADDRESSES 2
2370 #define PCI_TYPE2_ADDRESSES 5
2371
2372 #define IO_TYPE_ADAPTER 1
2373 #define IO_TYPE_CONTROLLER 2
2374 #define IO_TYPE_DEVICE 3
2375 #define IO_TYPE_DRIVER 4
2376 #define IO_TYPE_FILE 5
2377 #define IO_TYPE_IRP 6
2378 #define IO_TYPE_MASTER_ADAPTER 7
2379 #define IO_TYPE_OPEN_PACKET 8
2380 #define IO_TYPE_TIMER 9
2381 #define IO_TYPE_VPB 10
2382 #define IO_TYPE_ERROR_LOG 11
2383 #define IO_TYPE_ERROR_MESSAGE 12
2384 #define IO_TYPE_DEVICE_OBJECT_EXTENSION 13
2385
2386 #define IO_TYPE_CSQ_IRP_CONTEXT 1
2387 #define IO_TYPE_CSQ 2
2388 #define IO_TYPE_CSQ_EX 3
2389
2390 /* IO_RESOURCE_DESCRIPTOR.Option */
2391
2392 #define IO_RESOURCE_PREFERRED 0x01
2393 #define IO_RESOURCE_DEFAULT 0x02
2394 #define IO_RESOURCE_ALTERNATIVE 0x08
2395
2396 /* DEVICE_OBJECT.Flags */
2397
2398 #define DO_VERIFY_VOLUME 0x00000002
2399 #define DO_BUFFERED_IO 0x00000004
2400 #define DO_EXCLUSIVE 0x00000008
2401 #define DO_DIRECT_IO 0x00000010
2402 #define DO_MAP_IO_BUFFER 0x00000020
2403 #define DO_DEVICE_INITIALIZING 0x00000080
2404 #define DO_SHUTDOWN_REGISTERED 0x00000800
2405 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
2406 #define DO_POWER_PAGABLE 0x00002000
2407 #define DO_POWER_INRUSH 0x00004000
2408
2409 /* DEVICE_OBJECT.Characteristics */
2410
2411 #define FILE_REMOVABLE_MEDIA 0x00000001
2412 #define FILE_READ_ONLY_DEVICE 0x00000002
2413 #define FILE_FLOPPY_DISKETTE 0x00000004
2414 #define FILE_WRITE_ONCE_MEDIA 0x00000008
2415 #define FILE_REMOTE_DEVICE 0x00000010
2416 #define FILE_DEVICE_IS_MOUNTED 0x00000020
2417 #define FILE_VIRTUAL_VOLUME 0x00000040
2418 #define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080
2419 #define FILE_DEVICE_SECURE_OPEN 0x00000100
2420 #define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800
2421 #define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000
2422 #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
2423
2424 /* DEVICE_OBJECT.AlignmentRequirement */
2425
2426 #define FILE_BYTE_ALIGNMENT 0x00000000
2427 #define FILE_WORD_ALIGNMENT 0x00000001
2428 #define FILE_LONG_ALIGNMENT 0x00000003
2429 #define FILE_QUAD_ALIGNMENT 0x00000007
2430 #define FILE_OCTA_ALIGNMENT 0x0000000f
2431 #define FILE_32_BYTE_ALIGNMENT 0x0000001f
2432 #define FILE_64_BYTE_ALIGNMENT 0x0000003f
2433 #define FILE_128_BYTE_ALIGNMENT 0x0000007f
2434 #define FILE_256_BYTE_ALIGNMENT 0x000000ff
2435 #define FILE_512_BYTE_ALIGNMENT 0x000001ff
2436
2437 /* DEVICE_OBJECT.DeviceType */
2438
2439 #define DEVICE_TYPE ULONG
2440
2441 #define FILE_DEVICE_BEEP 0x00000001
2442 #define FILE_DEVICE_CD_ROM 0x00000002
2443 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
2444 #define FILE_DEVICE_CONTROLLER 0x00000004
2445 #define FILE_DEVICE_DATALINK 0x00000005
2446 #define FILE_DEVICE_DFS 0x00000006
2447 #define FILE_DEVICE_DISK 0x00000007
2448 #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
2449 #define FILE_DEVICE_FILE_SYSTEM 0x00000009
2450 #define FILE_DEVICE_INPORT_PORT 0x0000000a
2451 #define FILE_DEVICE_KEYBOARD 0x0000000b
2452 #define FILE_DEVICE_MAILSLOT 0x0000000c
2453 #define FILE_DEVICE_MIDI_IN 0x0000000d
2454 #define FILE_DEVICE_MIDI_OUT 0x0000000e
2455 #define FILE_DEVICE_MOUSE 0x0000000f
2456 #define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010
2457 #define FILE_DEVICE_NAMED_PIPE 0x00000011
2458 #define FILE_DEVICE_NETWORK 0x00000012
2459 #define FILE_DEVICE_NETWORK_BROWSER 0x00000013
2460 #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
2461 #define FILE_DEVICE_NULL 0x00000015
2462 #define FILE_DEVICE_PARALLEL_PORT 0x00000016
2463 #define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017
2464 #define FILE_DEVICE_PRINTER 0x00000018
2465 #define FILE_DEVICE_SCANNER 0x00000019
2466 #define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a
2467 #define FILE_DEVICE_SERIAL_PORT 0x0000001b
2468 #define FILE_DEVICE_SCREEN 0x0000001c
2469 #define FILE_DEVICE_SOUND 0x0000001d
2470 #define FILE_DEVICE_STREAMS 0x0000001e
2471 #define FILE_DEVICE_TAPE 0x0000001f
2472 #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
2473 #define FILE_DEVICE_TRANSPORT 0x00000021
2474 #define FILE_DEVICE_UNKNOWN 0x00000022
2475 #define FILE_DEVICE_VIDEO 0x00000023
2476 #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
2477 #define FILE_DEVICE_WAVE_IN 0x00000025
2478 #define FILE_DEVICE_WAVE_OUT 0x00000026
2479 #define FILE_DEVICE_8042_PORT 0x00000027
2480 #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
2481 #define FILE_DEVICE_BATTERY 0x00000029
2482 #define FILE_DEVICE_BUS_EXTENDER 0x0000002a
2483 #define FILE_DEVICE_MODEM 0x0000002b
2484 #define FILE_DEVICE_VDM 0x0000002c
2485 #define FILE_DEVICE_MASS_STORAGE 0x0000002d
2486 #define FILE_DEVICE_SMB 0x0000002e
2487 #define FILE_DEVICE_KS 0x0000002f
2488 #define FILE_DEVICE_CHANGER 0x00000030
2489 #define FILE_DEVICE_SMARTCARD 0x00000031
2490 #define FILE_DEVICE_ACPI 0x00000032
2491 #define FILE_DEVICE_DVD 0x00000033
2492 #define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034
2493 #define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035
2494 #define FILE_DEVICE_DFS_VOLUME 0x00000036
2495 #define FILE_DEVICE_SERENUM 0x00000037
2496 #define FILE_DEVICE_TERMSRV 0x00000038
2497 #define FILE_DEVICE_KSEC 0x00000039
2498 #define FILE_DEVICE_FIPS 0x0000003a
2499 #define FILE_DEVICE_INFINIBAND 0x0000003b
2500 #define FILE_DEVICE_VMBUS 0x0000003e
2501 #define FILE_DEVICE_CRYPT_PROVIDER 0x0000003f
2502 #define FILE_DEVICE_WPD 0x00000040
2503 #define FILE_DEVICE_BLUETOOTH 0x00000041
2504 #define FILE_DEVICE_MT_COMPOSITE 0x00000042
2505 #define FILE_DEVICE_MT_TRANSPORT 0x00000043
2506 #define FILE_DEVICE_BIOMETRIC 0x00000044
2507 #define FILE_DEVICE_PMI 0x00000045
2508
2509 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
2510
2511 typedef struct _VPB {
2512 CSHORT Type;
2513 CSHORT Size;
2514 USHORT Flags;
2515 USHORT VolumeLabelLength;
2516 struct _DEVICE_OBJECT *DeviceObject;
2517 struct _DEVICE_OBJECT *RealDevice;
2518 ULONG SerialNumber;
2519 ULONG ReferenceCount;
2520 WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
2521 } VPB, *PVPB;
2522
2523 typedef struct _DEVICE_OBJECT {
2524 CSHORT Type;
2525 USHORT Size;
2526 LONG ReferenceCount;
2527 struct _DRIVER_OBJECT *DriverObject;
2528 struct _DEVICE_OBJECT *NextDevice;
2529 struct _DEVICE_OBJECT *AttachedDevice;
2530 struct _IRP *CurrentIrp;
2531 PIO_TIMER Timer;
2532 ULONG Flags;
2533 ULONG Characteristics;
2534 volatile PVPB Vpb;
2535 PVOID DeviceExtension;
2536 DEVICE_TYPE DeviceType;
2537 CCHAR StackSize;
2538 union {
2539 LIST_ENTRY ListEntry;
2540 WAIT_CONTEXT_BLOCK Wcb;
2541 } Queue;
2542 ULONG AlignmentRequirement;
2543 KDEVICE_QUEUE DeviceQueue;
2544 KDPC Dpc;
2545 ULONG ActiveThreadCount;
2546 PSECURITY_DESCRIPTOR SecurityDescriptor;
2547 KEVENT DeviceLock;
2548 USHORT SectorSize;
2549 USHORT Spare1;
2550 struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
2551 PVOID Reserved;
2552 } DEVICE_OBJECT, *PDEVICE_OBJECT;
2553
2554 typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
2555
2556 typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
2557 BOOLEAN Removed;
2558 BOOLEAN Reserved[3];
2559 volatile LONG IoCount;
2560 KEVENT RemoveEvent;
2561 } IO_REMOVE_LOCK_COMMON_BLOCK;
2562
2563 typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
2564 LONG Signature;
2565 LONG HighWatermark;
2566 LONGLONG MaxLockedTicks;
2567 LONG AllocateTag;
2568 LIST_ENTRY LockList;
2569 KSPIN_LOCK Spin;
2570 volatile LONG LowMemoryCount;
2571 ULONG Reserved1[4];
2572 PVOID Reserved2;
2573 PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
2574 } IO_REMOVE_LOCK_DBG_BLOCK;
2575
2576 typedef struct _IO_REMOVE_LOCK {
2577 IO_REMOVE_LOCK_COMMON_BLOCK Common;
2578 #if DBG
2579 IO_REMOVE_LOCK_DBG_BLOCK Dbg;
2580 #endif
2581 } IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
2582
2583 typedef struct _IO_WORKITEM *PIO_WORKITEM;
2584
2585 typedef VOID
2586 (DDKAPI IO_WORKITEM_ROUTINE)(
2587 IN PDEVICE_OBJECT DeviceObject,
2588 IN PVOID Context);
2589 typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE;
2590
2591 typedef struct _SHARE_ACCESS {
2592 ULONG OpenCount;
2593 ULONG Readers;
2594 ULONG Writers;
2595 ULONG Deleters;
2596 ULONG SharedRead;
2597 ULONG SharedWrite;
2598 ULONG SharedDelete;
2599 } SHARE_ACCESS, *PSHARE_ACCESS;
2600
2601 typedef struct _PCI_COMMON_HEADER {
2602 USHORT VendorID;
2603 USHORT DeviceID;
2604 USHORT Command;
2605 USHORT Status;
2606 UCHAR RevisionID;
2607 UCHAR ProgIf;
2608 UCHAR SubClass;
2609 UCHAR BaseClass;
2610 UCHAR CacheLineSize;
2611 UCHAR LatencyTimer;
2612 UCHAR HeaderType;
2613 UCHAR BIST;
2614 union {
2615 struct _PCI_HEADER_TYPE_0 {
2616 ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
2617 ULONG CIS;
2618 USHORT SubVendorID;
2619 USHORT SubSystemID;
2620 ULONG ROMBaseAddress;
2621 UCHAR CapabilitiesPtr;
2622 UCHAR Reserved1[3];
2623 ULONG Reserved2;
2624 UCHAR InterruptLine;
2625 UCHAR InterruptPin;
2626 UCHAR MinimumGrant;
2627 UCHAR MaximumLatency;
2628 } type0;
2629 struct _PCI_HEADER_TYPE_1 {
2630 ULONG BaseAddresses[PCI_TYPE1_ADDRESSES];
2631 UCHAR PrimaryBus;
2632 UCHAR SecondaryBus;
2633 UCHAR SubordinateBus;
2634 UCHAR SecondaryLatency;
2635 UCHAR IOBase;
2636 UCHAR IOLimit;
2637 USHORT SecondaryStatus;
2638 USHORT MemoryBase;
2639 USHORT MemoryLimit;
2640 USHORT PrefetchBase;
2641 USHORT PrefetchLimit;
2642 ULONG PrefetchBaseUpper32;
2643 ULONG PrefetchLimitUpper32;
2644 USHORT IOBaseUpper16;
2645 USHORT IOLimitUpper16;
2646 UCHAR CapabilitiesPtr;
2647 UCHAR Reserved1[3];
2648 ULONG ROMBaseAddress;
2649 UCHAR InterruptLine;
2650 UCHAR InterruptPin;
2651 USHORT BridgeControl;
2652 } type1;
2653 struct _PCI_HEADER_TYPE_2 {
2654 ULONG SocketRegistersBaseAddress;
2655 UCHAR CapabilitiesPtr;
2656 UCHAR Reserved;
2657 USHORT SecondaryStatus;
2658 UCHAR PrimaryBus;
2659 UCHAR SecondaryBus;
2660 UCHAR SubordinateBus;
2661 UCHAR SecondaryLatency;
2662 struct {
2663 ULONG Base;
2664 ULONG Limit;
2665 } Range[PCI_TYPE2_ADDRESSES-1];
2666 UCHAR InterruptLine;
2667 UCHAR InterruptPin;
2668 USHORT BridgeControl;
2669 } type2;
2670 } u;
2671 } PCI_COMMON_HEADER, *PPCI_COMMON_HEADER;
2672
2673 #ifdef __cplusplus
2674
2675 typedef struct _PCI_COMMON_CONFIG : PCI_COMMON_HEADER {
2676 UCHAR DeviceSpecific[192];
2677 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
2678
2679 #else
2680
2681 typedef struct _PCI_COMMON_CONFIG {
2682 PCI_COMMON_HEADER DUMMYSTRUCTNAME;
2683 UCHAR DeviceSpecific[192];
2684 } PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
2685
2686 #endif
2687
2688 typedef struct _PCI_SLOT_NUMBER {
2689 union {
2690 struct {
2691 ULONG DeviceNumber : 5;
2692 ULONG FunctionNumber : 3;
2693 ULONG Reserved : 24;
2694 } bits;
2695 ULONG AsULONG;
2696 } u;
2697 } PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER;
2698
2699 typedef struct _IO_STATUS_BLOCK {
2700 _ANONYMOUS_UNION union {
2701 NTSTATUS Status;
2702 PVOID Pointer;
2703 } DUMMYUNIONNAME;
2704 ULONG_PTR Information;
2705 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
2706
2707 typedef VOID
2708 (DDKAPI *PIO_APC_ROUTINE)(
2709 IN PVOID ApcContext,
2710 IN PIO_STATUS_BLOCK IoStatusBlock,
2711 IN ULONG Reserved);
2712
2713 #define EVENT_INCREMENT 1
2714 #define IO_NO_INCREMENT 0
2715 #define IO_CD_ROM_INCREMENT 1
2716 #define IO_DISK_INCREMENT 1
2717 #define IO_KEYBOARD_INCREMENT 6
2718 #define IO_MAILSLOT_INCREMENT 2
2719 #define IO_MOUSE_INCREMENT 6
2720 #define IO_NAMED_PIPE_INCREMENT 2
2721 #define IO_NETWORK_INCREMENT 2
2722 #define IO_PARALLEL_INCREMENT 1
2723 #define IO_SERIAL_INCREMENT 2
2724 #define IO_SOUND_INCREMENT 8
2725 #define IO_VIDEO_INCREMENT 1
2726 #define SEMAPHORE_INCREMENT 1
2727
2728 #define MM_MAXIMUM_DISK_IO_SIZE (0x10000)
2729
2730 typedef struct _BOOTDISK_INFORMATION {
2731 LONGLONG BootPartitionOffset;
2732 LONGLONG SystemPartitionOffset;
2733 ULONG BootDeviceSignature;
2734 ULONG SystemDeviceSignature;
2735 } BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
2736
2737 typedef struct _BOOTDISK_INFORMATION_EX {
2738 LONGLONG BootPartitionOffset;
2739 LONGLONG SystemPartitionOffset;
2740 ULONG BootDeviceSignature;
2741 ULONG SystemDeviceSignature;
2742 GUID BootDeviceGuid;
2743 GUID SystemDeviceGuid;
2744 BOOLEAN BootDeviceIsGpt;
2745 BOOLEAN SystemDeviceIsGpt;
2746 } BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
2747
2748 typedef struct _EISA_MEMORY_TYPE {
2749 UCHAR ReadWrite : 1;
2750 UCHAR Cached : 1;
2751 UCHAR Reserved0 : 1;
2752 UCHAR Type : 2;
2753 UCHAR Shared : 1;
2754 UCHAR Reserved1 : 1;
2755 UCHAR MoreEntries : 1;
2756 } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
2757
2758 #include <pshpack1.h>
2759 typedef struct _EISA_MEMORY_CONFIGURATION {
2760 EISA_MEMORY_TYPE ConfigurationByte;
2761 UCHAR DataSize;
2762 USHORT AddressLowWord;
2763 UCHAR AddressHighByte;
2764 USHORT MemorySize;
2765 } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
2766 #include <poppack.h>
2767
2768 typedef struct _EISA_IRQ_DESCRIPTOR {
2769 UCHAR Interrupt : 4;
2770 UCHAR Reserved : 1;
2771 UCHAR LevelTriggered : 1;
2772 UCHAR Shared : 1;
2773 UCHAR MoreEntries : 1;
2774 } EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
2775
2776 typedef struct _EISA_IRQ_CONFIGURATION {
2777 EISA_IRQ_DESCRIPTOR ConfigurationByte;
2778 UCHAR Reserved;
2779 } EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
2780
2781 typedef struct _DMA_CONFIGURATION_BYTE0 {
2782 UCHAR Channel : 3;
2783 UCHAR Reserved : 3;
2784 UCHAR Shared : 1;
2785 UCHAR MoreEntries : 1;
2786 } DMA_CONFIGURATION_BYTE0;
2787
2788 typedef struct _DMA_CONFIGURATION_BYTE1 {
2789 UCHAR Reserved0 : 2;
2790 UCHAR TransferSize : 2;
2791 UCHAR Timing : 2;
2792 UCHAR Reserved1 : 2;
2793 } DMA_CONFIGURATION_BYTE1;
2794
2795 typedef struct _EISA_DMA_CONFIGURATION {
2796 DMA_CONFIGURATION_BYTE0 ConfigurationByte0;
2797 DMA_CONFIGURATION_BYTE1 ConfigurationByte1;
2798 } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
2799
2800 #include <pshpack1.h>
2801 typedef struct _EISA_PORT_DESCRIPTOR {
2802 UCHAR NumberPorts : 5;
2803 UCHAR Reserved : 1;
2804 UCHAR Shared : 1;
2805 UCHAR MoreEntries : 1;
2806 } EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
2807
2808 typedef struct _EISA_PORT_CONFIGURATION {
2809 EISA_PORT_DESCRIPTOR Configuration;
2810 USHORT PortAddress;
2811 } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
2812 #include <poppack.h>
2813
2814 typedef struct _CM_EISA_FUNCTION_INFORMATION {
2815 ULONG CompressedId;
2816 UCHAR IdSlotFlags1;
2817 UCHAR IdSlotFlags2;
2818 UCHAR MinorRevision;
2819 UCHAR MajorRevision;
2820 UCHAR Selections[26];
2821 UCHAR FunctionFlags;
2822 UCHAR TypeString[80];
2823 EISA_MEMORY_CONFIGURATION EisaMemory[9];
2824 EISA_IRQ_CONFIGURATION EisaIrq[7];
2825 EISA_DMA_CONFIGURATION EisaDma[4];
2826 EISA_PORT_CONFIGURATION EisaPort[20];
2827 UCHAR InitializationData[60];
2828 } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
2829
2830 /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */
2831
2832 #define EISA_FUNCTION_ENABLED 0x80
2833 #define EISA_FREE_FORM_DATA 0x40
2834 #define EISA_HAS_PORT_INIT_ENTRY 0x20
2835 #define EISA_HAS_PORT_RANGE 0x10
2836 #define EISA_HAS_DMA_ENTRY 0x08
2837 #define EISA_HAS_IRQ_ENTRY 0x04
2838 #define EISA_HAS_MEMORY_ENTRY 0x02
2839 #define EISA_HAS_TYPE_ENTRY 0x01
2840 #define EISA_HAS_INFORMATION \
2841 (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \
2842 + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY)
2843
2844 typedef struct _CM_EISA_SLOT_INFORMATION {
2845 UCHAR ReturnCode;
2846 UCHAR ReturnFlags;
2847 UCHAR MajorRevision;
2848 UCHAR MinorRevision;
2849 USHORT Checksum;
2850 UCHAR NumberFunctions;
2851 UCHAR FunctionInformation;
2852 ULONG CompressedId;
2853 } CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
2854
2855 /* CM_EISA_SLOT_INFORMATION.ReturnCode */
2856
2857 #define EISA_INVALID_SLOT 0x80
2858 #define EISA_INVALID_FUNCTION 0x81
2859 #define EISA_INVALID_CONFIGURATION 0x82
2860 #define EISA_EMPTY_SLOT 0x83
2861 #define EISA_INVALID_BIOS_CALL 0x86
2862
2863 /*
2864 ** Plug and Play structures
2865 */
2866
2867 typedef VOID
2868 (DDKAPI *PINTERFACE_REFERENCE)(
2869 PVOID Context);
2870
2871 typedef VOID
2872 (DDKAPI *PINTERFACE_DEREFERENCE)(
2873 PVOID Context);
2874
2875 typedef BOOLEAN
2876 (DDKAPI *PTRANSLATE_BUS_ADDRESS)(
2877 IN PVOID Context,
2878 IN PHYSICAL_ADDRESS BusAddress,
2879 IN ULONG Length,
2880 IN OUT PULONG AddressSpace,
2881 OUT PPHYSICAL_ADDRESS TranslatedAddress);
2882
2883 typedef struct _DMA_ADAPTER*
2884 (DDKAPI *PGET_DMA_ADAPTER)(
2885 IN PVOID Context,
2886 IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
2887 OUT PULONG NumberOfMapRegisters);
2888
2889 typedef ULONG
2890 (DDKAPI *PGET_SET_DEVICE_DATA)(
2891 IN PVOID Context,
2892 IN ULONG DataType,
2893 IN PVOID Buffer,
2894 IN ULONG Offset,
2895 IN ULONG Length);
2896
2897 /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
2898 #define PCI_USE_SUBSYSTEM_IDS 0x00000001
2899 #define PCI_USE_REVISION 0x00000002
2900 #define PCI_USE_VENDEV_IDS 0x00000004
2901 #define PCI_USE_CLASS_SUBCLASS 0x00000008
2902 #define PCI_USE_PROGIF 0x00000010
2903 #define PCI_USE_LOCAL_BUS 0x00000020
2904 #define PCI_USE_LOCAL_DEVICE 0x00000040
2905
2906 typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS {
2907 ULONG Size;
2908 ULONG Flags;
2909 USHORT VendorID;
2910 USHORT DeviceID;
2911 UCHAR RevisionID;
2912 USHORT SubVendorID;
2913 USHORT SubSystemID;
2914 UCHAR BaseClass;
2915 UCHAR SubClass;
2916 UCHAR ProgIf;
2917 } PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS;
2918
2919 typedef BOOLEAN
2920 (DDKAPI *PPCI_IS_DEVICE_PRESENT)(
2921 IN USHORT VendorID,
2922 IN USHORT DeviceID,
2923 IN UCHAR RevisionID,
2924 IN USHORT SubVendorID,
2925 IN USHORT SubSystemID,
2926 IN ULONG Flags);
2927
2928 typedef BOOLEAN
2929 (DDKAPI *PPCI_IS_DEVICE_PRESENT_EX)(
2930 IN PVOID Context,
2931 IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters);
2932
2933 typedef union _POWER_STATE {
2934 SYSTEM_POWER_STATE SystemState;
2935 DEVICE_POWER_STATE DeviceState;
2936 } POWER_STATE, *PPOWER_STATE;
2937
2938 typedef enum _POWER_STATE_TYPE {
2939 SystemPowerState = 0,
2940 DevicePowerState
2941 } POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
2942
2943 typedef struct _BUS_INTERFACE_STANDARD {
2944 USHORT Size;
2945 USHORT Version;
2946 PVOID Context;
2947 PINTERFACE_REFERENCE InterfaceReference;
2948 PINTERFACE_DEREFERENCE InterfaceDereference;
2949 PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
2950 PGET_DMA_ADAPTER GetDmaAdapter;
2951 PGET_SET_DEVICE_DATA SetBusData;
2952 PGET_SET_DEVICE_DATA GetBusData;
2953 } BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
2954
2955 typedef struct _PCI_DEVICE_PRESENT_INTERFACE {
2956 USHORT Size;
2957 USHORT Version;
2958 PVOID Context;
2959 PINTERFACE_REFERENCE InterfaceReference;
2960 PINTERFACE_DEREFERENCE InterfaceDereference;
2961 PPCI_IS_DEVICE_PRESENT IsDevicePresent;
2962 PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx;
2963 } PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE;
2964
2965 typedef struct _DEVICE_CAPABILITIES {
2966 USHORT Size;
2967 USHORT Version;
2968 ULONG DeviceD1 : 1;
2969 ULONG DeviceD2 : 1;
2970 ULONG LockSupported : 1;
2971 ULONG EjectSupported : 1;
2972 ULONG Removable : 1;
2973 ULONG DockDevice : 1;
2974 ULONG UniqueID : 1;
2975 ULONG SilentInstall : 1;
2976 ULONG RawDeviceOK : 1;
2977 ULONG SurpriseRemovalOK : 1;
2978 ULONG WakeFromD0 : 1;
2979 ULONG WakeFromD1 : 1;
2980 ULONG WakeFromD2 : 1;
2981 ULONG WakeFromD3 : 1;
2982 ULONG HardwareDisabled : 1;
2983 ULONG NonDynamic : 1;
2984 ULONG WarmEjectSupported : 1;
2985 ULONG NoDisplayInUI : 1;
2986 ULONG Reserved : 14;
2987 ULONG Address;
2988 ULONG UINumber;
2989 DEVICE_POWER_STATE DeviceState[PowerSystemMaximum];
2990 SYSTEM_POWER_STATE SystemWake;
2991 DEVICE_POWER_STATE DeviceWake;
2992 ULONG D1Latency;
2993 ULONG D2Latency;
2994 ULONG D3Latency;
2995 } DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
2996
2997 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
2998 USHORT Version;
2999 USHORT Size;
3000 GUID Event;
3001 GUID InterfaceClassGuid;
3002 PUNICODE_STRING SymbolicLinkName;
3003 } DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
3004
3005 typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
3006 USHORT Version;
3007 USHORT Size;
3008 GUID Event;
3009 } HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
3010
3011 #undef INTERFACE
3012
3013 typedef struct _INTERFACE {
3014 USHORT Size;
3015 USHORT Version;
3016 PVOID Context;
3017 PINTERFACE_REFERENCE InterfaceReference;
3018 PINTERFACE_DEREFERENCE InterfaceDereference;
3019 } INTERFACE, *PINTERFACE;
3020
3021 typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
3022 USHORT Version;
3023 USHORT Size;
3024 GUID Event;
3025 } PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
3026
3027 typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
3028
3029 /* PNP_DEVICE_STATE */
3030
3031 #define PNP_DEVICE_DISABLED 0x00000001
3032 #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
3033 #define PNP_DEVICE_FAILED 0x00000004
3034 #define PNP_DEVICE_REMOVED 0x00000008
3035 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
3036 #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
3037
3038 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
3039 USHORT Version;
3040 USHORT Size;
3041 GUID Event;
3042 struct _FILE_OBJECT *FileObject;
3043 LONG NameBufferOffset;
3044 UCHAR CustomDataBuffer[1];
3045 } TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
3046
3047 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
3048 USHORT Version;
3049 USHORT Size;
3050 GUID Event;
3051 struct _FILE_OBJECT *FileObject;
3052 } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
3053
3054 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
3055 DeviceUsageTypeUndefined,
3056 DeviceUsageTypePaging,
3057 DeviceUsageTypeHibernation,
3058 DeviceUsageTypeDumpFile
3059 } DEVICE_USAGE_NOTIFICATION_TYPE;
3060
3061 typedef struct _POWER_SEQUENCE {
3062 ULONG SequenceD1;
3063 ULONG SequenceD2;
3064 ULONG SequenceD3;
3065 } POWER_SEQUENCE, *PPOWER_SEQUENCE;
3066
3067 typedef enum {
3068 DevicePropertyDeviceDescription = 0x0,
3069 DevicePropertyHardwareID = 0x1,
3070 DevicePropertyCompatibleIDs = 0x2,
3071 DevicePropertyBootConfiguration = 0x3,
3072 DevicePropertyBootConfigurationTranslated = 0x4,
3073 DevicePropertyClassName = 0x5,
3074 DevicePropertyClassGuid = 0x6,
3075 DevicePropertyDriverKeyName = 0x7,
3076 DevicePropertyManufacturer = 0x8,
3077 DevicePropertyFriendlyName = 0x9,
3078 DevicePropertyLocationInformation = 0xa,
3079 DevicePropertyPhysicalDeviceObjectName = 0xb,
3080 DevicePropertyBusTypeGuid = 0xc,
3081 DevicePropertyLegacyBusType = 0xd,
3082 DevicePropertyBusNumber = 0xe,
3083 DevicePropertyEnumeratorName = 0xf,
3084 DevicePropertyAddress = 0x10,
3085 DevicePropertyUINumber = 0x11,
3086 DevicePropertyInstallState = 0x12,
3087 DevicePropertyRemovalPolicy = 0x13,
3088 DevicePropertyResourceRequirements = 0x14,
3089 DevicePropertyAllocatedResources = 0x15,
3090 DevicePropertyContainerID = 0x16
3091 } DEVICE_REGISTRY_PROPERTY;
3092
3093 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
3094 EventCategoryReserved,
3095 EventCategoryHardwareProfileChange,
3096 EventCategoryDeviceInterfaceChange,
3097 EventCategoryTargetDeviceChange
3098 } IO_NOTIFICATION_EVENT_CATEGORY;
3099
3100 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
3101
3102 typedef NTSTATUS
3103 (DDKAPI *PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
3104 IN PVOID NotificationStructure,
3105 IN PVOID Context);
3106
3107 typedef VOID
3108 (DDKAPI *PDEVICE_CHANGE_COMPLETE_CALLBACK)(
3109 IN PVOID Context);
3110
3111 typedef enum _FILE_INFORMATION_CLASS {
3112 FileDirectoryInformation = 1,
3113 FileFullDirectoryInformation,
3114 FileBothDirectoryInformation,
3115 FileBasicInformation,
3116 FileStandardInformation,
3117 FileInternalInformation,
3118 FileEaInformation,
3119 FileAccessInformation,
3120 FileNameInformation,
3121 FileRenameInformation,
3122 FileLinkInformation,
3123 FileNamesInformation,
3124 FileDispositionInformation,
3125 FilePositionInformation,
3126 FileFullEaInformation,
3127 FileModeInformation,
3128 FileAlignmentInformation,
3129 FileAllInformation,
3130 FileAllocationInformation,
3131 FileEndOfFileInformation,
3132 FileAlternateNameInformation,
3133 FileStreamInformation,
3134 FilePipeInformation,
3135 FilePipeLocalInformation,
3136 FilePipeRemoteInformation,
3137 FileMailslotQueryInformation,
3138 FileMailslotSetInformation,
3139 FileCompressionInformation,
3140 FileObjectIdInformation,
3141 FileCompletionInformation,
3142 FileMoveClusterInformation,
3143 FileQuotaInformation,
3144 FileReparsePointInformation,
3145 FileNetworkOpenInformation,
3146 FileAttributeTagInformation,
3147 FileTrackingInformation,
3148 FileIdBothDirectoryInformation,
3149 FileIdFullDirectoryInformation,
3150 FileValidDataLengthInformation,
3151 FileShortNameInformation,
3152 FileIoCompletionNotificationInformation,
3153 FileIoStatusBlockRangeInformation,
3154 FileIoPriorityHintInformation,
3155 FileSfioReserveInformation,
3156 FileSfioVolumeInformation,
3157 FileHardLinkInformation,
3158 FileProcessIdsUsingFileInformation,
3159 FileNormalizedNameInformation,
3160 FileNetworkPhysicalNameInformation,
3161 FileIdGlobalTxDirectoryInformation,
3162 FileIsRemoteDeviceInformation,
3163 FileAttributeCacheInformation,
3164 FileNumaNodeInformation,
3165 FileStandardLinkInformation,
3166 FileRemoteProtocolInformation,
3167 FileMaximumInformation
3168 } FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
3169
3170 typedef struct _FILE_POSITION_INFORMATION {
3171 LARGE_INTEGER CurrentByteOffset;
3172 } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
3173
3174 #include <pshpack8.h>
3175 typedef struct _FILE_BASIC_INFORMATION {
3176 LARGE_INTEGER CreationTime;
3177 LARGE_INTEGER LastAccessTime;
3178 LARGE_INTEGER LastWriteTime;
3179 LARGE_INTEGER ChangeTime;
3180 ULONG FileAttributes;
3181 } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
3182 #include <poppack.h>
3183
3184 typedef struct _FILE_STANDARD_INFORMATION {
3185 LARGE_INTEGER AllocationSize;
3186 LARGE_INTEGER EndOfFile;
3187 ULONG NumberOfLinks;
3188 BOOLEAN DeletePending;
3189 BOOLEAN Directory;
3190 } FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
3191
3192 typedef struct _FILE_NETWORK_OPEN_INFORMATION {
3193 LARGE_INTEGER CreationTime;
3194 LARGE_INTEGER LastAccessTime;
3195 LARGE_INTEGER LastWriteTime;
3196 LARGE_INTEGER ChangeTime;
3197 LARGE_INTEGER AllocationSize;
3198 LARGE_INTEGER EndOfFile;
3199 ULONG FileAttributes;
3200 } FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
3201
3202 typedef enum _FSINFOCLASS {
3203 FileFsVolumeInformation = 1,
3204 FileFsLabelInformation,
3205 FileFsSizeInformation,
3206 FileFsDeviceInformation,
3207 FileFsAttributeInformation,
3208 FileFsControlInformation,
3209 FileFsFullSizeInformation,
3210 FileFsObjectIdInformation,
3211 FileFsDriverPathInformation,
3212 FileFsVolumeFlagsInformation,
3213 FileFsMaximumInformation
3214 } FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
3215
3216 typedef struct _FILE_FS_DEVICE_INFORMATION {
3217 DEVICE_TYPE DeviceType;
3218 ULONG Characteristics;
3219 } FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
3220
3221 typedef struct _FILE_FULL_EA_INFORMATION {
3222 ULONG NextEntryOffset;
3223 UCHAR Flags;
3224 UCHAR EaNameLength;
3225 USHORT EaValueLength;
3226 CHAR EaName[1];
3227 } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
3228
3229 typedef struct _FAST_MUTEX
3230 {
3231 LONG Count;
3232 PKTHREAD Owner;
3233 ULONG Contention;
3234 KEVENT Gate;
3235 ULONG OldIrql;
3236 } FAST_MUTEX, *PFAST_MUTEX;
3237
3238 typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD;
3239
3240 typedef struct _OWNER_ENTRY {
3241 ERESOURCE_THREAD OwnerThread;
3242 _ANONYMOUS_UNION union {
3243 LONG OwnerCount;
3244 ULONG TableSize;
3245 } DUMMYUNIONNAME;
3246 } OWNER_ENTRY, *POWNER_ENTRY;
3247
3248 typedef struct _ERESOURCE
3249 {
3250 LIST_ENTRY SystemResourcesList;
3251 POWNER_ENTRY OwnerTable;
3252 SHORT ActiveCount;
3253 USHORT Flag;
3254 volatile PKSEMAPHORE SharedWaiters;
3255 volatile PKEVENT ExclusiveWaiters;
3256 OWNER_ENTRY OwnerEntry;
3257 ULONG ActiveEntries;
3258 ULONG ContentionCount;
3259 ULONG NumberOfSharedWaiters;
3260 ULONG NumberOfExclusiveWaiters;
3261 __GNU_EXTENSION union
3262 {
3263 PVOID Address;
3264 ULONG_PTR CreatorBackTraceIndex;
3265 };
3266 KSPIN_LOCK SpinLock;
3267 } ERESOURCE, *PERESOURCE;
3268
3269 /* ERESOURCE.Flag */
3270
3271 #define ResourceNeverExclusive 0x0010
3272 #define ResourceReleaseByOtherThread 0x0020
3273 #define ResourceOwnedExclusive 0x0080
3274
3275 #define RESOURCE_HASH_TABLE_SIZE 64
3276
3277 typedef BOOLEAN
3278 (DDKAPI *PFAST_IO_CHECK_IF_POSSIBLE)(
3279 IN struct _FILE_OBJECT *FileObject,
3280 IN PLARGE_INTEGER FileOffset,
3281 IN ULONG Length,
3282 IN BOOLEAN Wait,
3283 IN ULONG LockKey,
3284 IN BOOLEAN CheckForReadOperation,
3285 OUT PIO_STATUS_BLOCK IoStatus,
3286 IN struct _DEVICE_OBJECT *DeviceObject);
3287
3288 typedef BOOLEAN
3289 (DDKAPI *PFAST_IO_READ)(
3290 IN struct _FILE_OBJECT *FileObject,
3291 IN PLARGE_INTEGER FileOffset,
3292 IN ULONG Length,
3293 IN BOOLEAN Wait,
3294 IN ULONG LockKey,
3295 OUT PVOID Buffer,
3296 OUT PIO_STATUS_BLOCK IoStatus,
3297 IN struct _DEVICE_OBJECT *DeviceObject);
3298
3299 typedef BOOLEAN
3300 (DDKAPI *PFAST_IO_WRITE)(
3301 IN struct _FILE_OBJECT *FileObject,
3302 IN PLARGE_INTEGER FileOffset,
3303 IN ULONG Length,
3304 IN BOOLEAN Wait,
3305 IN ULONG LockKey,
3306 IN PVOID Buffer,
3307 OUT PIO_STATUS_BLOCK IoStatus,
3308 IN struct _DEVICE_OBJECT *DeviceObject);
3309
3310 typedef BOOLEAN
3311 (DDKAPI *PFAST_IO_QUERY_BASIC_INFO)(
3312 IN struct _FILE_OBJECT *FileObject,
3313 IN BOOLEAN Wait,
3314 OUT PFILE_BASIC_INFORMATION Buffer,
3315 OUT PIO_STATUS_BLOCK IoStatus,
3316 IN struct _DEVICE_OBJECT *DeviceObject);
3317
3318 typedef BOOLEAN
3319 (DDKAPI *PFAST_IO_QUERY_STANDARD_INFO)(
3320 IN struct _FILE_OBJECT *FileObject,
3321 IN BOOLEAN Wait,
3322 OUT PFILE_STANDARD_INFORMATION Buffer,
3323 OUT PIO_STATUS_BLOCK IoStatus,
3324 IN struct _DEVICE_OBJECT *DeviceObject);
3325
3326 typedef BOOLEAN
3327 (DDKAPI *PFAST_IO_LOCK)(
3328 IN struct _FILE_OBJECT *FileObject,
3329 IN PLARGE_INTEGER FileOffset,
3330 IN PLARGE_INTEGER Length,
3331 PEPROCESS ProcessId,
3332 ULONG Key,
3333 BOOLEAN FailImmediately,
3334 BOOLEAN ExclusiveLock,
3335 OUT PIO_STATUS_BLOCK IoStatus,
3336 IN struct _DEVICE_OBJECT *DeviceObject);
3337
3338 typedef BOOLEAN
3339 (DDKAPI *PFAST_IO_UNLOCK_SINGLE)(
3340 IN struct _FILE_OBJECT *FileObject,
3341 IN PLARGE_INTEGER FileOffset,
3342 IN PLARGE_INTEGER Length,
3343 PEPROCESS ProcessId,
3344 ULONG Key,
3345 OUT PIO_STATUS_BLOCK IoStatus,
3346 IN struct _DEVICE_OBJECT *DeviceObject);
3347
3348 typedef BOOLEAN
3349 (DDKAPI *PFAST_IO_UNLOCK_ALL)(
3350 IN struct _FILE_OBJECT *FileObject,
3351 PEPROCESS ProcessId,
3352 OUT PIO_STATUS_BLOCK IoStatus,
3353 IN struct _DEVICE_OBJECT *DeviceObject);
3354
3355 typedef BOOLEAN
3356 (DDKAPI *PFAST_IO_UNLOCK_ALL_BY_KEY)(
3357 IN struct _FILE_OBJECT *FileObject,
3358 PVOID ProcessId,
3359 ULONG Key,
3360 OUT PIO_STATUS_BLOCK IoStatus,
3361 IN struct _DEVICE_OBJECT *DeviceObject);
3362
3363 typedef BOOLEAN
3364 (DDKAPI *PFAST_IO_DEVICE_CONTROL)(
3365 IN struct _FILE_OBJECT *FileObject,
3366 IN BOOLEAN Wait,
3367 IN PVOID InputBuffer OPTIONAL,
3368 IN ULONG InputBufferLength,
3369 OUT PVOID OutputBuffer OPTIONAL,
3370 IN ULONG OutputBufferLength,
3371 IN ULONG IoControlCode,
3372 OUT PIO_STATUS_BLOCK IoStatus,
3373 IN struct _DEVICE_OBJECT *DeviceObject);
3374
3375 typedef VOID
3376 (DDKAPI *PFAST_IO_ACQUIRE_FILE)(
3377 IN struct _FILE_OBJECT *FileObject);
3378
3379 typedef VOID
3380 (DDKAPI *PFAST_IO_RELEASE_FILE)(
3381 IN struct _FILE_OBJECT *FileObject);
3382
3383 typedef VOID
3384 (DDKAPI *PFAST_IO_DETACH_DEVICE)(
3385 IN struct _DEVICE_OBJECT *SourceDevice,
3386 IN struct _DEVICE_OBJECT *TargetDevice);
3387
3388 typedef BOOLEAN
3389 (DDKAPI *PFAST_IO_QUERY_NETWORK_OPEN_INFO)(
3390 IN struct _FILE_OBJECT *FileObject,
3391 IN BOOLEAN Wait,
3392 OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
3393 OUT struct _IO_STATUS_BLOCK *IoStatus,
3394 IN struct _DEVICE_OBJECT *DeviceObject);
3395
3396 typedef NTSTATUS
3397 (DDKAPI *PFAST_IO_ACQUIRE_FOR_MOD_WRITE)(
3398 IN struct _FILE_OBJECT *FileObject,
3399 IN PLARGE_INTEGER EndingOffset,
3400 OUT struct _ERESOURCE **ResourceToRelease,
3401 IN struct _DEVICE_OBJECT *DeviceObject);
3402
3403 typedef BOOLEAN
3404 (DDKAPI *PFAST_IO_MDL_READ)(
3405 IN struct _FILE_OBJECT *FileObject,
3406 IN PLARGE_INTEGER FileOffset,
3407 IN ULONG Length,
3408 IN ULONG LockKey,
3409 OUT PMDL *MdlChain,
3410 OUT PIO_STATUS_BLOCK IoStatus,
3411 IN struct _DEVICE_OBJECT *DeviceObject);
3412
3413 typedef BOOLEAN
3414 (DDKAPI *PFAST_IO_MDL_READ_COMPLETE)(
3415 IN struct _FILE_OBJECT *FileObject,
3416 IN PMDL MdlChain,
3417 IN struct _DEVICE_OBJECT *DeviceObject);
3418
3419 typedef BOOLEAN
3420 (DDKAPI *PFAST_IO_PREPARE_MDL_WRITE)(
3421 IN struct _FILE_OBJECT *FileObject,
3422 IN PLARGE_INTEGER FileOffset,
3423 IN ULONG Length,
3424 IN ULONG LockKey,
3425 OUT PMDL *MdlChain,
3426 OUT PIO_STATUS_BLOCK IoStatus,
3427 IN struct _DEVICE_OBJECT *DeviceObject);
3428
3429 typedef BOOLEAN
3430 (DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE)(
3431 IN struct _FILE_OBJECT *FileObject,
3432 IN PLARGE_INTEGER FileOffset,
3433 IN PMDL MdlChain,
3434 IN struct _DEVICE_OBJECT *DeviceObject);
3435
3436 typedef BOOLEAN
3437 (DDKAPI *PFAST_IO_READ_COMPRESSED)(
3438 IN struct _FILE_OBJECT *FileObject,
3439 IN PLARGE_INTEGER FileOffset,
3440 IN ULONG Length,
3441 IN ULONG LockKey,
3442 OUT PVOID Buffer,
3443 OUT PMDL *MdlChain,
3444 OUT PIO_STATUS_BLOCK IoStatus,
3445 OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
3446 IN ULONG CompressedDataInfoLength,
3447 IN struct _DEVICE_OBJECT *DeviceObject);
3448
3449 typedef BOOLEAN
3450 (DDKAPI *PFAST_IO_WRITE_COMPRESSED)(
3451 IN struct _FILE_OBJECT *FileObject,
3452 IN PLARGE_INTEGER FileOffset,
3453 IN ULONG Length,
3454 IN ULONG LockKey,
3455 IN PVOID Buffer,
3456 OUT PMDL *MdlChain,
3457 OUT PIO_STATUS_BLOCK IoStatus,
3458 IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
3459 IN ULONG CompressedDataInfoLength,
3460 IN struct _DEVICE_OBJECT *DeviceObject);
3461
3462 typedef BOOLEAN
3463 (DDKAPI *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
3464 IN struct _FILE_OBJECT *FileObject,
3465 IN PMDL MdlChain,
3466 IN struct _DEVICE_OBJECT *DeviceObject);
3467
3468 typedef BOOLEAN
3469 (DDKAPI *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
3470 IN struct _FILE_OBJECT *FileObject,
3471 IN PLARGE_INTEGER FileOffset,
3472 IN PMDL MdlChain,
3473 IN struct _DEVICE_OBJECT *DeviceObject);
3474
3475 typedef BOOLEAN
3476 (DDKAPI *PFAST_IO_QUERY_OPEN)(
3477 IN struct _IRP *Irp,
3478 OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
3479 IN struct _DEVICE_OBJECT *DeviceObject);
3480
3481 typedef NTSTATUS
3482 (DDKAPI *PFAST_IO_RELEASE_FOR_MOD_WRITE)(
3483 IN struct _FILE_OBJECT *FileObject,
3484 IN struct _ERESOURCE *ResourceToRelease,
3485 IN struct _DEVICE_OBJECT *DeviceObject);
3486
3487 typedef NTSTATUS
3488 (DDKAPI *PFAST_IO_ACQUIRE_FOR_CCFLUSH)(
3489 IN struct _FILE_OBJECT *FileObject,
3490 IN struct _DEVICE_OBJECT *DeviceObject);
3491
3492 typedef NTSTATUS
3493 (DDKAPI *PFAST_IO_RELEASE_FOR_CCFLUSH) (
3494 IN struct _FILE_OBJECT *FileObject,
3495 IN struct _DEVICE_OBJECT *DeviceObject);
3496
3497 typedef struct _FAST_IO_DISPATCH {
3498 ULONG SizeOfFastIoDispatch;
3499 PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible;
3500 PFAST_IO_READ FastIoRead;
3501 PFAST_IO_WRITE FastIoWrite;
3502 PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo;
3503 PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo;
3504 PFAST_IO_LOCK FastIoLock;
3505 PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle;
3506 PFAST_IO_UNLOCK_ALL FastIoUnlockAll;
3507 PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey;
3508 PFAST_IO_DEVICE_CONTROL FastIoDeviceControl;
3509 PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection;
3510 PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection;
3511 PFAST_IO_DETACH_DEVICE FastIoDetachDevice;
3512 PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo;
3513 PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite;
3514 PFAST_IO_MDL_READ MdlRead;
3515 PFAST_IO_MDL_READ_COMPLETE MdlReadComplete;
3516 PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite;
3517 PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete;
3518 PFAST_IO_READ_COMPRESSED FastIoReadCompressed;
3519 PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed;
3520 PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed;
3521 PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed;
3522 PFAST_IO_QUERY_OPEN FastIoQueryOpen;
3523 PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite;
3524 PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush;
3525 PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush;
3526 } FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
3527
3528 typedef struct _SECTION_OBJECT_POINTERS {
3529 PVOID DataSectionObject;
3530 PVOID SharedCacheMap;
3531 PVOID ImageSectionObject;
3532 } SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
3533
3534 typedef struct _IO_COMPLETION_CONTEXT {
3535 PVOID Port;
3536 PVOID Key;
3537 } IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
3538
3539 /* FILE_OBJECT.Flags */
3540
3541 #define FO_FILE_OPEN 0x00000001
3542 #define FO_SYNCHRONOUS_IO 0x00000002
3543 #define FO_ALERTABLE_IO 0x00000004
3544 #define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
3545 #define FO_WRITE_THROUGH 0x00000010
3546 #define FO_SEQUENTIAL_ONLY 0x00000020
3547 #define FO_CACHE_SUPPORTED 0x00000040
3548 #define FO_NAMED_PIPE 0x00000080
3549 #define FO_STREAM_FILE 0x00000100
3550 #define FO_MAILSLOT 0x00000200
3551 #define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
3552 #define FO_QUEUE_IRP_TO_THREAD 0x00000400
3553 #define FO_DIRECT_DEVICE_OPEN 0x00000800
3554 #define FO_FILE_MODIFIED 0x00001000
3555 #define FO_FILE_SIZE_CHANGED 0x00002000
3556 #define FO_CLEANUP_COMPLETE 0x00004000
3557 #define FO_TEMPORARY_FILE 0x00008000
3558 #define FO_DELETE_ON_CLOSE 0x00010000
3559 #define FO_OPENED_CASE_SENSITIVE 0x00020000
3560 #define FO_HANDLE_CREATED 0x00040000
3561 #define FO_FILE_FAST_IO_READ 0x00080000
3562 #define FO_RANDOM_ACCESS 0x00100000
3563 #define FO_FILE_OPEN_CANCELLED 0x00200000
3564 #define FO_VOLUME_OPEN 0x00400000
3565 #define FO_REMOTE_ORIGIN 0x01000000
3566 #define FO_DISALLOW_EXCLUSIVE 0x02000000
3567 #define FO_SKIP_COMPLETION_PORT 0x02000000
3568 #define FO_SKIP_SET_EVENT 0x04000000
3569 #define FO_SKIP_SET_FAST_IO 0x08000000
3570
3571 /* VPB.Flags */
3572 #define VPB_MOUNTED 0x0001
3573 #define VPB_LOCKED 0x0002
3574 #define VPB_PERSISTENT 0x0004
3575 #define VPB_REMOVE_PENDING 0x0008
3576 #define VPB_RAW_MOUNT 0x0010
3577 #define VPB_DIRECT_WRITES_ALLOWED 0x0020
3578
3579 /* IRP.Flags */
3580
3581 #define SL_FORCE_ACCESS_CHECK 0x01
3582 #define SL_OPEN_PAGING_FILE 0x02
3583 #define SL_OPEN_TARGET_DIRECTORY 0x04
3584 #define SL_CASE_SENSITIVE 0x80
3585
3586 #define SL_KEY_SPECIFIED 0x01
3587 #define SL_OVERRIDE_VERIFY_VOLUME 0x02
3588 #define SL_WRITE_THROUGH 0x04
3589 #define SL_FT_SEQUENTIAL_WRITE 0x08
3590
3591 #define SL_FAIL_IMMEDIATELY 0x01
3592 #define SL_EXCLUSIVE_LOCK 0x02
3593
3594 #define SL_RESTART_SCAN 0x01
3595 #define SL_RETURN_SINGLE_ENTRY 0x02
3596 #define SL_INDEX_SPECIFIED 0x04
3597
3598 #define SL_WATCH_TREE 0x01
3599
3600 #define SL_ALLOW_RAW_MOUNT 0x01
3601
3602 #define CTL_CODE(DeviceType, Function, Method, Access)( \
3603 ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
3604
3605 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
3606
3607 #define IRP_NOCACHE 0x00000001
3608 #define IRP_PAGING_IO 0x00000002
3609 #define IRP_MOUNT_COMPLETION 0x00000002
3610 #define IRP_SYNCHRONOUS_API 0x00000004
3611 #define IRP_ASSOCIATED_IRP 0x00000008
3612 #define IRP_BUFFERED_IO 0x00000010
3613 #define IRP_DEALLOCATE_BUFFER 0x00000020
3614 #define IRP_INPUT_OPERATION 0x00000040
3615 #define IRP_SYNCHRONOUS_PAGING_IO 0x00000040
3616 #define IRP_CREATE_OPERATION 0x00000080
3617 #define IRP_READ_OPERATION 0x00000100
3618 #define IRP_WRITE_OPERATION 0x00000200
3619 #define IRP_CLOSE_OPERATION 0x00000400
3620 #define IRP_DEFER_IO_COMPLETION 0x00000800
3621 #define IRP_OB_QUERY_NAME 0x00001000
3622 #define IRP_HOLD_DEVICE_QUEUE 0x00002000
3623
3624 #define IRP_QUOTA_CHARGED 0x01
3625 #define IRP_ALLOCATED_MUST_SUCCEED 0x02
3626 #define IRP_ALLOCATED_FIXED_SIZE 0x04
3627 #define IRP_LOOKASIDE_ALLOCATION 0x08
3628
3629 /*
3630 ** IRP function codes
3631 */
3632
3633 #define IRP_MJ_CREATE 0x00
3634 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
3635 #define IRP_MJ_CLOSE 0x02
3636 #define IRP_MJ_READ 0x03
3637 #define IRP_MJ_WRITE 0x04
3638 #define IRP_MJ_QUERY_INFORMATION 0x05
3639 #define IRP_MJ_SET_INFORMATION 0x06
3640 #define IRP_MJ_QUERY_EA 0x07
3641 #define IRP_MJ_SET_EA 0x08
3642 #define IRP_MJ_FLUSH_BUFFERS 0x09
3643 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
3644 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
3645 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
3646 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
3647 #define IRP_MJ_DEVICE_CONTROL 0x0e
3648 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
3649 #define IRP_MJ_SCSI 0x0f
3650 #define IRP_MJ_SHUTDOWN 0x10
3651 #define IRP_MJ_LOCK_CONTROL 0x11
3652 #define IRP_MJ_CLEANUP 0x12
3653 #define IRP_MJ_CREATE_MAILSLOT 0x13
3654 #define IRP_MJ_QUERY_SECURITY 0x14
3655 #define IRP_MJ_SET_SECURITY 0x15
3656 #define IRP_MJ_POWER 0x16
3657 #define IRP_MJ_SYSTEM_CONTROL 0x17
3658 #define IRP_MJ_DEVICE_CHANGE 0x18
3659 #define IRP_MJ_QUERY_QUOTA 0x19
3660 #define IRP_MJ_SET_QUOTA 0x1a
3661 #define IRP_MJ_PNP 0x1b
3662 #define IRP_MJ_PNP_POWER 0x1b
3663 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
3664
3665 #define IRP_MN_SCSI_CLASS 0x01
3666
3667 #define IRP_MN_START_DEVICE 0x00
3668 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
3669 #define IRP_MN_REMOVE_DEVICE 0x02
3670 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
3671 #define IRP_MN_STOP_DEVICE 0x04
3672 #define IRP_MN_QUERY_STOP_DEVICE 0x05
3673 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
3674
3675 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
3676 #define IRP_MN_QUERY_INTERFACE 0x08
3677 #define IRP_MN_QUERY_CAPABILITIES 0x09
3678 #define IRP_MN_QUERY_RESOURCES 0x0A
3679 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
3680 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
3681 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
3682
3683 #define IRP_MN_READ_CONFIG 0x0F
3684 #define IRP_MN_WRITE_CONFIG 0x10
3685 #define IRP_MN_EJECT 0x11
3686 #define IRP_MN_SET_LOCK 0x12
3687 #define IRP_MN_QUERY_ID 0x13
3688 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
3689 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
3690 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
3691 #define IRP_MN_SURPRISE_REMOVAL 0x17
3692
3693 #define IRP_MN_WAIT_WAKE 0x00
3694 #define IRP_MN_POWER_SEQUENCE 0x01
3695 #define IRP_MN_SET_POWER 0x02
3696 #define IRP_MN_QUERY_POWER 0x03
3697
3698 #define IRP_MN_QUERY_ALL_DATA 0x00
3699 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
3700 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
3701 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
3702 #define IRP_MN_ENABLE_EVENTS 0x04
3703 #define IRP_MN_DISABLE_EVENTS 0x05
3704 #define IRP_MN_ENABLE_COLLECTION 0x06
3705 #define IRP_MN_DISABLE_COLLECTION 0x07
3706 #define IRP_MN_REGINFO 0x08
3707 #define IRP_MN_EXECUTE_METHOD 0x09
3708
3709 #define IRP_MN_REGINFO_EX 0x0b
3710
3711 typedef struct _FILE_OBJECT
3712 {
3713 CSHORT Type;
3714 CSHORT Size;
3715 PDEVICE_OBJECT DeviceObject;
3716 PVPB Vpb;
3717 PVOID FsContext;
3718 PVOID FsContext2;
3719 PSECTION_OBJECT_POINTERS SectionObjectPointer;
3720 PVOID PrivateCacheMap;
3721 NTSTATUS FinalStatus;
3722 struct _FILE_OBJECT *RelatedFileObject;
3723 BOOLEAN LockOperation;
3724 BOOLEAN DeletePending;
3725 BOOLEAN ReadAccess;
3726 BOOLEAN WriteAccess;
3727 BOOLEAN DeleteAccess;
3728 BOOLEAN SharedRead;
3729 BOOLEAN SharedWrite;
3730 BOOLEAN SharedDelete;
3731 ULONG Flags;
3732 UNICODE_STRING FileName;
3733 LARGE_INTEGER CurrentByteOffset;
3734 volatile ULONG Waiters;
3735 volatile ULONG Busy;
3736 PVOID LastLock;
3737 KEVENT Lock;
3738 KEVENT Event;
3739 volatile PIO_COMPLETION_CONTEXT CompletionContext;
3740 KSPIN_LOCK IrpListLock;
3741 LIST_ENTRY IrpList;
3742 volatile PVOID FileObjectExtension;
3743 } FILE_OBJECT;
3744 typedef struct _FILE_OBJECT *PFILE_OBJECT;
3745
3746 typedef struct _IO_ERROR_LOG_PACKET {
3747 UCHAR MajorFunctionCode;
3748 UCHAR RetryCount;
3749 USHORT DumpDataSize;
3750 USHORT NumberOfStrings;
3751 USHORT StringOffset;
3752 USHORT EventCategory;
3753 NTSTATUS ErrorCode;
3754 ULONG UniqueErrorValue;
3755 NTSTATUS FinalStatus;
3756 ULONG SequenceNumber;
3757 ULONG IoControlCode;
3758 LARGE_INTEGER DeviceOffset;
3759 ULONG DumpData[1];
3760 } IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
3761
3762 typedef struct _IO_ERROR_LOG_MESSAGE {
3763 USHORT Type;
3764 USHORT Size;
3765 USHORT DriverNameLength;
3766 LARGE_INTEGER TimeStamp;
3767 ULONG DriverNameOffset;
3768 IO_ERROR_LOG_PACKET EntryData;
3769 } IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
3770
3771 #define ERROR_LOG_LIMIT_SIZE 240
3772 #define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
3773 sizeof(IO_ERROR_LOG_PACKET) + \
3774 (sizeof(WCHAR) * 40))
3775 #define ERROR_LOG_MESSAGE_LIMIT_SIZE \
3776 (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
3777 #define IO_ERROR_LOG_MESSAGE_LENGTH \
3778 ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \
3779 ERROR_LOG_MESSAGE_LIMIT_SIZE : \
3780 PORT_MAXIMUM_MESSAGE_LENGTH)
3781 #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \
3782 IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
3783
3784 typedef enum _DMA_WIDTH {
3785 Width8Bits,
3786 Width16Bits,
3787 Width32Bits,
3788 MaximumDmaWidth
3789 } DMA_WIDTH, *PDMA_WIDTH;
3790
3791 typedef enum _DMA_SPEED {
3792 Compatible,
3793 TypeA,
3794 TypeB,
3795 TypeC,
3796 TypeF,
3797 MaximumDmaSpeed
3798 } DMA_SPEED, *PDMA_SPEED;
3799
3800 /* DEVICE_DESCRIPTION.Version */
3801
3802 #define DEVICE_DESCRIPTION_VERSION 0x0000
3803 #define DEVICE_DESCRIPTION_VERSION1 0x0001
3804 #define DEVICE_DESCRIPTION_VERSION2 0x0002
3805
3806 typedef struct _DEVICE_DESCRIPTION {
3807 ULONG Version;
3808 BOOLEAN Master;
3809 BOOLEAN ScatterGather;
3810 BOOLEAN DemandMode;
3811 BOOLEAN AutoInitialize;
3812 BOOLEAN Dma32BitAddresses;
3813 BOOLEAN IgnoreCount;
3814 BOOLEAN Reserved1;
3815 BOOLEAN Dma64BitAddresses;
3816 ULONG BusNumber;
3817 ULONG DmaChannel;
3818 INTERFACE_TYPE InterfaceType;
3819 DMA_WIDTH DmaWidth;
3820 DMA_SPEED DmaSpeed;
3821 ULONG MaximumLength;
3822 ULONG DmaPort;
3823 } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
3824
3825 typedef enum _DEVICE_RELATION_TYPE {
3826 BusRelations,
3827 EjectionRelations,
3828 PowerRelations,
3829 RemovalRelations,
3830 TargetDeviceRelation,
3831 SingleBusRelations,
3832 TransportRelations
3833 } DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
3834
3835 typedef struct _DEVICE_RELATIONS {
3836 ULONG Count;
3837 PDEVICE_OBJECT Objects[1];
3838 } DEVICE_RELATIONS, *PDEVICE_RELATIONS;
3839
3840 typedef struct _DEVOBJ_EXTENSION
3841 {
3842 CSHORT Type;
3843 USHORT Size;
3844 PDEVICE_OBJECT DeviceObject;
3845 } DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
3846
3847 typedef struct _SCATTER_GATHER_ELEMENT {
3848 PHYSICAL_ADDRESS Address;
3849 ULONG Length;
3850 ULONG_PTR Reserved;
3851 } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
3852
3853 #if defined(_MSC_EXTENSIONS)
3854
3855 #if _MSC_VER >= 1200
3856 #pragma warning(push)
3857 #endif
3858 #pragma warning(disable:4200)
3859 typedef struct _SCATTER_GATHER_LIST {
3860 ULONG NumberOfElements;
3861 ULONG_PTR Reserved;
3862 SCATTER_GATHER_ELEMENT Elements[1];
3863 } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
3864
3865 #if _MSC_VER >= 1200
3866 #pragma warning(pop)
3867 #else
3868 #pragma warning(default:4200)
3869 #endif
3870
3871 #else
3872
3873 struct _SCATTER_GATHER_LIST;
3874 typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
3875
3876 #endif
3877
3878 typedef NTSTATUS
3879 (DDKAPI DRIVER_ADD_DEVICE)(
3880 IN struct _DRIVER_OBJECT *DriverObject,
3881 IN struct _DEVICE_OBJECT *PhysicalDeviceObject);
3882 typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
3883
3884 typedef struct _DRIVER_EXTENSION {
3885 struct _DRIVER_OBJECT *DriverObject;
3886 PDRIVER_ADD_DEVICE AddDevice;
3887 ULONG Count;
3888 UNICODE_STRING ServiceKeyName;
3889 } DRIVER_EXTENSION, *PDRIVER_EXTENSION;
3890
3891 #define DRVO_UNLOAD_INVOKED 0x00000001
3892 #define DRVO_LEGACY_DRIVER 0x00000002
3893 #define DRVO_BUILTIN_DRIVER 0x00000004
3894
3895 typedef NTSTATUS
3896 (DDKAPI DRIVER_INITIALIZE)(
3897 IN struct _DRIVER_OBJECT *DriverObject,
3898 IN PUNICODE_STRING RegistryPath);
3899 typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
3900
3901 typedef VOID
3902 (DDKAPI DRIVER_STARTIO)(
3903 IN struct _DEVICE_OBJECT *DeviceObject,
3904 IN struct _IRP *Irp);
3905 typedef DRIVER_STARTIO *PDRIVER_STARTIO;
3906
3907 typedef VOID
3908 (DDKAPI DRIVER_UNLOAD)(
3909 IN struct _DRIVER_OBJECT *DriverObject);
3910 typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
3911
3912 typedef NTSTATUS
3913 (DDKAPI DRIVER_DISPATCH)(
3914 IN struct _DEVICE_OBJECT *DeviceObject,
3915 IN struct _IRP *Irp);
3916 typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
3917
3918 typedef struct _DRIVER_OBJECT {
3919 CSHORT Type;
3920 CSHORT Size;
3921 PDEVICE_OBJECT DeviceObject;
3922 ULONG Flags;
3923 PVOID DriverStart;
3924 ULONG DriverSize;
3925 PVOID DriverSection;
3926 PDRIVER_EXTENSION DriverExtension;
3927 UNICODE_STRING DriverName;
3928 PUNICODE_STRING HardwareDatabase;
3929 struct _FAST_IO_DISPATCH *FastIoDispatch;
3930 PDRIVER_INITIALIZE DriverInit;
3931 PDRIVER_STARTIO DriverStartIo;
3932 PDRIVER_UNLOAD DriverUnload;
3933 PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
3934 } DRIVER_OBJECT;
3935 typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;
3936
3937 typedef struct _DMA_ADAPTER {
3938 USHORT Version;
3939 USHORT Size;
3940 struct _DMA_OPERATIONS* DmaOperations;
3941 } DMA_ADAPTER, *PDMA_ADAPTER;
3942
3943 typedef VOID
3944 (DDKAPI *PPUT_DMA_ADAPTER)(
3945 IN PDMA_ADAPTER DmaAdapter);
3946
3947 typedef PVOID
3948 (DDKAPI *PALLOCATE_COMMON_BUFFER)(
3949 IN PDMA_ADAPTER DmaAdapter,
3950 IN ULONG Length,
3951 OUT PPHYSICAL_ADDRESS LogicalAddress,
3952 IN BOOLEAN CacheEnabled);
3953
3954 typedef VOID
3955 (DDKAPI *PFREE_COMMON_BUFFER)(
3956 IN PDMA_ADAPTER DmaAdapter,
3957 IN ULONG Length,
3958 IN PHYSICAL_ADDRESS LogicalAddress,
3959 IN PVOID VirtualAddress,
3960 IN BOOLEAN CacheEnabled);
3961
3962 typedef NTSTATUS
3963 (DDKAPI *PALLOCATE_ADAPTER_CHANNEL)(
3964 IN PDMA_ADAPTER DmaAdapter,
3965 IN PDEVICE_OBJECT DeviceObject,
3966 IN ULONG NumberOfMapRegisters,
3967 IN PDRIVER_CONTROL ExecutionRoutine,
3968 IN PVOID Context);
3969
3970 typedef BOOLEAN
3971 (DDKAPI *PFLUSH_ADAPTER_BUFFERS)(
3972 IN PDMA_ADAPTER DmaAdapter,
3973 IN PMDL Mdl,
3974 IN PVOID MapRegisterBase,
3975 IN PVOID CurrentVa,
3976 IN ULONG Length,
3977 IN BOOLEAN WriteToDevice);
3978
3979 typedef VOID
3980 (DDKAPI *PFREE_ADAPTER_CHANNEL)(
3981 IN PDMA_ADAPTER DmaAdapter);
3982
3983 typedef VOID
3984 (DDKAPI *PFREE_MAP_REGISTERS)(
3985 IN PDMA_ADAPTER DmaAdapter,
3986 PVOID MapRegisterBase,
3987 ULONG NumberOfMapRegisters);
3988
3989 typedef PHYSICAL_ADDRESS
3990 (DDKAPI *PMAP_TRANSFER)(
3991 IN PDMA_ADAPTER DmaAdapter,
3992 IN PMDL Mdl,
3993 IN PVOID MapRegisterBase,
3994 IN PVOID CurrentVa,
3995 IN OUT PULONG Length,
3996 IN BOOLEAN WriteToDevice);
3997
3998 typedef ULONG
3999 (DDKAPI *PGET_DMA_ALIGNMENT)(
4000 IN PDMA_ADAPTER DmaAdapter);
4001
4002 typedef ULONG
4003 (DDKAPI *PREAD_DMA_COUNTER)(
4004 IN PDMA_ADAPTER DmaAdapter);
4005
4006 typedef VOID
4007 (DDKAPI *PDRIVER_LIST_CONTROL)(
4008 IN struct _DEVICE_OBJECT *DeviceObject,
4009 IN struct _IRP *Irp,
4010 IN struct _SCATTER_GATHER_LIST *ScatterGather,
4011 IN PVOID Context);
4012
4013 typedef NTSTATUS
4014 (DDKAPI *PGET_SCATTER_GATHER_LIST)(
4015 IN PDMA_ADAPTER DmaAdapter,
4016 IN PDEVICE_OBJECT DeviceObject,
4017 IN PMDL Mdl,
4018 IN PVOID CurrentVa,
4019 IN ULONG Length,
4020 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
4021 IN PVOID Context,
4022 IN BOOLEAN WriteToDevice);
4023
4024 typedef VOID
4025 (DDKAPI *PPUT_SCATTER_GATHER_LIST)(
4026 IN PDMA_ADAPTER DmaAdapter,
4027 IN PSCATTER_GATHER_LIST ScatterGather,
4028 IN BOOLEAN WriteToDevice);
4029
4030 typedef NTSTATUS
4031 (DDKAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
4032 IN PDMA_ADAPTER DmaAdapter,
4033 IN PMDL Mdl OPTIONAL,
4034 IN PVOID CurrentVa,
4035 IN ULONG Length,
4036 OUT PULONG ScatterGatherListSize,
4037 OUT PULONG pNumberOfMapRegisters OPTIONAL);
4038
4039 typedef NTSTATUS
4040 (DDKAPI *PBUILD_SCATTER_GATHER_LIST)(
4041 IN PDMA_ADAPTER DmaAdapter,
4042 IN PDEVICE_OBJECT DeviceObject,
4043 IN PMDL Mdl,
4044 IN PVOID CurrentVa,
4045 IN ULONG Length,
4046 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
4047 IN PVOID Context,
4048 IN BOOLEAN WriteToDevice,
4049 IN PVOID ScatterGatherBuffer,
4050 IN ULONG ScatterGatherLength);
4051
4052 typedef NTSTATUS
4053 (DDKAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
4054 IN PDMA_ADAPTER DmaAdapter,
4055 IN PSCATTER_GATHER_LIST ScatterGather,
4056 IN PMDL OriginalMdl,
4057 OUT PMDL *TargetMdl);
4058
4059 typedef struct _DMA_OPERATIONS {
4060 ULONG Size;
4061 PPUT_DMA_ADAPTER PutDmaAdapter;
4062 PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
4063 PFREE_COMMON_BUFFER FreeCommonBuffer;
4064 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
4065 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
4066 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
4067 PFREE_MAP_REGISTERS FreeMapRegisters;
4068 PMAP_TRANSFER MapTransfer;
4069 PGET_DMA_ALIGNMENT GetDmaAlignment;
4070 PREAD_DMA_COUNTER ReadDmaCounter;
4071 PGET_SCATTER_GATHER_LIST GetScatterGatherList;
4072 PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
4073 PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList;
4074 PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList;
4075 PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList;
4076 } DMA_OPERATIONS, *PDMA_OPERATIONS;
4077
4078 typedef struct _IO_RESOURCE_DESCRIPTOR {
4079 UCHAR Option;
4080 UCHAR Type;
4081 UCHAR ShareDisposition;
4082 UCHAR Spare1;
4083 USHORT Flags;
4084 USHORT Spare2;
4085 union {
4086 struct {
4087 ULONG Length;
4088 ULONG Alignment;
4089 PHYSICAL_ADDRESS MinimumAddress;
4090 PHYSICAL_ADDRESS MaximumAddress;
4091 } Port;
4092 struct {
4093 ULONG Length;
4094 ULONG Alignment;
4095 PHYSICAL_ADDRESS MinimumAddress;
4096 PHYSICAL_ADDRESS MaximumAddress;
4097 } Memory;
4098 struct {
4099 ULONG MinimumVector;
4100 ULONG MaximumVector;
4101 } Interrupt;
4102 struct {
4103 ULONG MinimumChannel;
4104 ULONG MaximumChannel;
4105 } Dma;
4106 struct {
4107 ULONG Length;
4108 ULONG Alignment;
4109 PHYSICAL_ADDRESS MinimumAddress;
4110 PHYSICAL_ADDRESS MaximumAddress;
4111 } Generic;
4112 struct {
4113 ULONG Data[3];
4114 } DevicePrivate;
4115 struct {
4116 ULONG Length;
4117 ULONG MinBusNumber;
4118 ULONG MaxBusNumber;
4119 ULONG Reserved;
4120 } BusNumber;
4121 struct {
4122 ULONG Priority;
4123 ULONG Reserved1;
4124 ULONG Reserved2;
4125 } ConfigData;
4126 } u;
4127 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
4128
4129 typedef struct _IO_RESOURCE_LIST {
4130 USHORT Version;
4131 USHORT Revision;
4132 ULONG Count;
4133 IO_RESOURCE_DESCRIPTOR Descriptors[1];
4134 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
4135
4136 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
4137 ULONG ListSize;
4138 INTERFACE_TYPE InterfaceType;
4139 ULONG BusNumber;
4140 ULONG SlotNumber;
4141 ULONG Reserved[3];
4142 ULONG AlternativeLists;
4143 IO_RESOURCE_LIST List[1];
4144 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
4145
4146 typedef VOID
4147 (DDKAPI DRIVER_CANCEL)(
4148 IN struct _DEVICE_OBJECT *DeviceObject,
4149 IN struct _IRP *Irp);
4150 typedef DRIVER_CANCEL *PDRIVER_CANCEL;
4151
4152 typedef struct _IRP {
4153 CSHORT Type;
4154 USHORT Size;
4155 struct _MDL *MdlAddress;
4156 ULONG Flags;
4157 union {
4158 struct _IRP *MasterIrp;
4159 volatile LONG IrpCount;
4160 PVOID SystemBuffer;
4161 } AssociatedIrp;
4162 LIST_ENTRY ThreadListEntry;
4163 IO_STATUS_BLOCK IoStatus;
4164 KPROCESSOR_MODE RequestorMode;
4165 BOOLEAN PendingReturned;
4166 CHAR StackCount;
4167 CHAR CurrentLocation;
4168 BOOLEAN Cancel;
4169 KIRQL CancelIrql;
4170 CCHAR ApcEnvironment;
4171 UCHAR AllocationFlags;
4172 PIO_STATUS_BLOCK UserIosb;
4173 PKEVENT UserEvent;
4174 union {
4175 struct {
4176 _ANONYMOUS_UNION union {
4177 PIO_APC_ROUTINE UserApcRoutine;
4178 PVOID IssuingProcess;
4179 } DUMMYUNIONNAME;
4180 PVOID UserApcContext;
4181 } AsynchronousParameters;
4182 LARGE_INTEGER AllocationSize;
4183 } Overlay;
4184 volatile PDRIVER_CANCEL CancelRoutine;
4185 PVOID UserBuffer;
4186 union {
4187 struct {
4188 _ANONYMOUS_UNION union {
4189 KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
4190 _ANONYMOUS_STRUCT struct {
4191 PVOID DriverContext[4];
4192 } DUMMYSTRUCTNAME;
4193 } DUMMYUNIONNAME;
4194 PETHREAD Thread;
4195 PCHAR AuxiliaryBuffer;
4196 _ANONYMOUS_STRUCT struct {
4197 LIST_ENTRY ListEntry;
4198 _ANONYMOUS_UNION union {
4199 struct _IO_STACK_LOCATION *CurrentStackLocation;
4200 ULONG PacketType;
4201 } DUMMYUNIONNAME;
4202 } DUMMYSTRUCTNAME;
4203 struct _FILE_OBJECT *OriginalFileObject;
4204 } Overlay;
4205 KAPC Apc;
4206 PVOID CompletionKey;
4207 } Tail;
4208 } IRP;
4209 typedef struct _IRP *PIRP;
4210
4211 typedef enum _IO_PAGING_PRIORITY {
4212 IoPagingPriorityInvalid,
4213 IoPagingPriorityNormal,
4214 IoPagingPriorityHigh,
4215 IoPagingPriorityReserved1,
4216 IoPagingPriorityReserved2
4217 } IO_PAGING_PRIORITY;
4218
4219 typedef NTSTATUS
4220 (DDKAPI IO_COMPLETION_ROUTINE)(
4221 IN struct _DEVICE_OBJECT *DeviceObject,
4222 IN struct _IRP *Irp,
4223 IN PVOID Context);
4224 typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
4225
4226 typedef VOID
4227 (DDKAPI *PIO_DPC_ROUTINE)(
4228 IN struct _KDPC *Dpc,
4229 IN struct _DEVICE_OBJECT *DeviceObject,
4230 IN struct _IRP *Irp,
4231 IN PVOID Context);
4232
4233 typedef NTSTATUS
4234 (DDKAPI *PMM_DLL_INITIALIZE)(
4235 IN PUNICODE_STRING RegistryPath);
4236
4237 typedef NTSTATUS
4238 (DDKAPI *PMM_DLL_UNLOAD)(
4239 VOID);
4240
4241 typedef BOOLEAN
4242 (DDKAPI KSERVICE_ROUTINE)(
4243 IN struct _KINTERRUPT *Interrupt,
4244 IN PVOID ServiceContext);
4245 typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE;
4246
4247 typedef VOID
4248 (DDKAPI *PIO_TIMER_ROUTINE)(
4249 IN struct _DEVICE_OBJECT *DeviceObject,
4250 IN PVOID Context);
4251
4252 typedef BOOLEAN
4253 (DDKAPI *PKSYNCHRONIZE_ROUTINE)(
4254 IN PVOID SynchronizeContext);
4255
4256 typedef struct _IO_SECURITY_CONTEXT {
4257 PSECURITY_QUALITY_OF_SERVICE SecurityQos;
4258 PACCESS_STATE AccessState;
4259 ACCESS_MASK DesiredAccess;
4260 ULONG FullCreateOptions;
4261 } IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
4262
4263 struct _IO_CSQ;
4264
4265 typedef struct _IO_CSQ_IRP_CONTEXT {
4266 ULONG Type;
4267 struct _IRP *Irp;
4268 struct _IO_CSQ *Csq;
4269 } IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
4270
4271 typedef VOID
4272 (DDKAPI *PIO_CSQ_INSERT_IRP)(
4273 IN struct _IO_CSQ *Csq,
4274 IN PIRP Irp);
4275
4276 typedef VOID
4277 (DDKAPI *PIO_CSQ_REMOVE_IRP)(
4278 IN struct _IO_CSQ *Csq,
4279 IN PIRP Irp);
4280
4281 typedef PIRP
4282 (DDKAPI *PIO_CSQ_PEEK_NEXT_IRP)(
4283 IN struct _IO_CSQ *Csq,
4284 IN PIRP Irp,
4285 IN PVOID PeekContext);
4286
4287 typedef VOID
4288 (DDKAPI *PIO_CSQ_ACQUIRE_LOCK)(
4289 IN struct _IO_CSQ *Csq,
4290 OUT PKIRQL Irql);
4291
4292 typedef VOID
4293 (DDKAPI *PIO_CSQ_RELEASE_LOCK)(
4294 IN struct _IO_CSQ *Csq,
4295 IN KIRQL Irql);
4296
4297 typedef VOID
4298 (DDKAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
4299 IN struct _IO_CSQ *Csq,
4300 IN PIRP Irp);
4301
4302 typedef struct _IO_CSQ {
4303 ULONG Type;
4304 PIO_CSQ_INSERT_IRP CsqInsertIrp;
4305 PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
4306 PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
4307 PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
4308 PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
4309 PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
4310 PVOID ReservePointer;
4311 } IO_CSQ, *PIO_CSQ;
4312
4313 typedef enum _BUS_QUERY_ID_TYPE {
4314 BusQueryDeviceID,
4315 BusQueryHardwareIDs,
4316 BusQueryCompatibleIDs,
4317 BusQueryInstanceID,
4318 BusQueryDeviceSerialNumber
4319 } BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
4320
4321 typedef enum _DEVICE_TEXT_TYPE {
4322 DeviceTextDescription,
4323 DeviceTextLocationInformation
4324 } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
4325
4326 #if !defined(_ALPHA_)
4327 #include <pshpack4.h>
4328 #endif
4329 typedef struct _IO_STACK_LOCATION {
4330 UCHAR MajorFunction;
4331 UCHAR MinorFunction;
4332 UCHAR Flags;
4333 UCHAR Control;
4334 union {
4335 struct {
4336 PIO_SECURITY_CONTEXT SecurityContext;
4337 ULONG Options;
4338 USHORT POINTER_ALIGNMENT FileAttributes;
4339 USHORT ShareAccess;
4340 ULONG POINTER_ALIGNMENT EaLength;
4341 } Create;
4342 struct {
4343 ULONG Length;
4344 ULONG POINTER_ALIGNMENT Key;
4345 LARGE_INTEGER ByteOffset;
4346 } Read;
4347 struct {
4348 ULONG Length;
4349 ULONG POINTER_ALIGNMENT Key;
4350 LARGE_INTEGER ByteOffset;
4351 } Write;
4352 struct {
4353 ULONG Length;
4354 PUNICODE_STRING FileName;
4355 FILE_INFORMATION_CLASS FileInformationClass;
4356 ULONG FileIndex;
4357 } QueryDirectory;
4358 struct {
4359 ULONG Length;
4360 ULONG CompletionFilter;
4361 } NotifyDirectory;
4362 struct {
4363 ULONG Length;
4364 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
4365 } QueryFile;
4366 struct {
4367 ULONG Length;
4368 FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
4369 PFILE_OBJECT FileObject;
4370 _ANONYMOUS_UNION union {
4371 _ANONYMOUS_STRUCT struct {
4372 BOOLEAN ReplaceIfExists;
4373 BOOLEAN AdvanceOnly;
4374 } DUMMYSTRUCTNAME;
4375 ULONG ClusterCount;
4376 HANDLE DeleteHandle;
4377 } DUMMYUNIONNAME;
4378 } SetFile;
4379 struct {
4380 ULONG Length;
4381 PVOID EaList;
4382 ULONG EaListLength;
4383 ULONG EaIndex;
4384 } QueryEa;
4385 struct {
4386 ULONG Length;
4387 } SetEa;
4388 struct {
4389 ULONG Length;
4390 FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
4391 } QueryVolume;
4392 struct {
4393 ULONG Length;
4394 FS_INFORMATION_CLASS FsInformationClass;
4395 } SetVolume;
4396 struct {
4397 ULONG OutputBufferLength;
4398 ULONG InputBufferLength;
4399 ULONG FsControlCode;
4400 PVOID Type3InputBuffer;
4401 } FileSystemControl;
4402 struct {
4403 PLARGE_INTEGER Length;
4404 ULONG Key;
4405 LARGE_INTEGER ByteOffset;
4406 } LockControl;
4407 struct {
4408 ULONG OutputBufferLength;
4409 ULONG POINTER_ALIGNMENT InputBufferLength;
4410 ULONG POINTER_ALIGNMENT IoControlCode;
4411 PVOID Type3InputBuffer;
4412 } DeviceIoControl;
4413 struct {
4414 SECURITY_INFORMATION SecurityInformation;
4415 ULONG POINTER_ALIGNMENT Length;
4416 } QuerySecurity;
4417 struct {
4418 SECURITY_INFORMATION SecurityInformation;
4419 PSECURITY_DESCRIPTOR SecurityDescriptor;
4420 } SetSecurity;
4421 struct {
4422 PVPB Vpb;
4423 PDEVICE_OBJECT DeviceObject;
4424 } MountVolume;
4425 struct {
4426 PVPB Vpb;
4427 PDEVICE_OBJECT DeviceObject;
4428 } VerifyVolume;
4429 struct {
4430 struct _SCSI_REQUEST_BLOCK *Srb;
4431 } Scsi;
4432 struct {
4433 ULONG Length;
4434 PSID StartSid;
4435 struct _FILE_GET_QUOTA_INFORMATION *SidList;
4436 ULONG SidListLength;
4437 } QueryQuota;
4438 struct {
4439 ULONG Length;
4440 } SetQuota;
4441 struct {
4442 DEVICE_RELATION_TYPE Type;
4443 } QueryDeviceRelations;
4444 struct {
4445 CONST GUID *InterfaceType;
4446 USHORT Size;
4447 USHORT Version;
4448 PINTERFACE Interface;
4449 PVOID InterfaceSpecificData;
4450 } QueryInterface;
4451 struct {
4452 PDEVICE_CAPABILITIES Capabilities;
4453 } DeviceCapabilities;
4454 struct {
4455 PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
4456 } FilterResourceRequirements;
4457 struct {
4458 ULONG WhichSpace;
4459 PVOID Buffer;
4460 ULONG Offset;
4461 ULONG POINTER_ALIGNMENT Length;
4462 } ReadWriteConfig;
4463 struct {
4464 BOOLEAN Lock;
4465 } SetLock;
4466 struct {
4467 BUS_QUERY_ID_TYPE IdType;
4468 } QueryId;
4469 struct {
4470 DEVICE_TEXT_TYPE DeviceTextType;
4471 LCID POINTER_ALIGNMENT LocaleId;
4472 } QueryDeviceText;
4473 struct {
4474 BOOLEAN InPath;
4475 BOOLEAN Reserved[3];
4476 DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
4477 } UsageNotification;
4478 struct {
4479 SYSTEM_POWER_STATE PowerState;
4480 } WaitWake;
4481 struct {
4482 PPOWER_SEQUENCE PowerSequence;
4483 } PowerSequence;
4484 struct {
4485 ULONG SystemContext;
4486 POWER_STATE_TYPE POINTER_ALIGNMENT Type;
4487 POWER_STATE POINTER_ALIGNMENT State;
4488 POWER_ACTION POINTER_ALIGNMENT ShutdownType;
4489 } Power;
4490 struct {
4491 PCM_RESOURCE_LIST AllocatedResources;
4492 PCM_RESOURCE_LIST AllocatedResourcesTranslated;
4493 } StartDevice;
4494 struct {
4495 ULONG_PTR ProviderId;
4496 PVOID DataPath;
4497 ULONG BufferSize;
4498 PVOID Buffer;
4499 } WMI;
4500 struct {
4501 PVOID Argument1;
4502 PVOID Argument2;
4503 PVOID Argument3;
4504 PVOID Argument4;
4505 } Others;
4506 } Parameters;
4507 PDEVICE_OBJECT DeviceObject;
4508 PFILE_OBJECT FileObject;
4509 PIO_COMPLETION_ROUTINE CompletionRoutine;
4510 PVOID Context;
4511 } IO_STACK_LOCATION, *PIO_STACK_LOCATION;
4512 #if !defined(_ALPHA_)
4513 #include <poppack.h>
4514 #endif
4515
4516 /* IO_STACK_LOCATION.Control */
4517
4518 #define SL_PENDING_RETURNED 0x01
4519 #define SL_ERROR_RETURNED 0x02
4520 #define SL_INVOKE_ON_CANCEL 0x20
4521 #define SL_INVOKE_ON_SUCCESS 0x40
4522 #define SL_INVOKE_ON_ERROR 0x80
4523
4524 /* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */
4525
4526 #define PCI_WHICHSPACE_CONFIG 0x0
4527 #define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */
4528
4529 /******************************************************************************
4530 * RTL Types *
4531 ******************************************************************************/
4532
4533 #define RTL_REGISTRY_ABSOLUTE 0
4534 #define RTL_REGISTRY_SERVICES 1
4535 #define RTL_REGISTRY_CONTROL 2
4536 #define RTL_REGISTRY_WINDOWS_NT 3
4537 #define RTL_REGISTRY_DEVICEMAP 4
4538 #define RTL_REGISTRY_USER 5
4539 #define RTL_REGISTRY_MAXIMUM 6
4540 #define RTL_REGISTRY_HANDLE 0x40000000
4541 #define RTL_REGISTRY_OPTIONAL 0x80000000
4542
4543 /* RTL_QUERY_REGISTRY_TABLE.Flags */
4544 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
4545 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
4546 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
4547 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
4548 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
4549 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
4550 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
4551
4552 typedef struct _RTL_BITMAP {
4553 ULONG SizeOfBitMap;
4554 PULONG Buffer;
4555 } RTL_BITMAP, *PRTL_BITMAP;
4556
4557 typedef struct _RTL_BITMAP_RUN {
4558 ULONG StartingIndex;
4559 ULONG NumberOfBits;
4560 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
4561
4562 typedef NTSTATUS
4563 (DDKAPI *PRTL_QUERY_REGISTRY_ROUTINE)(
4564 IN PWSTR ValueName,
4565 IN ULONG ValueType,
4566 IN PVOID ValueData,
4567 IN ULONG ValueLength,
4568 IN PVOID Context,
4569 IN PVOID EntryContext);
4570
4571 typedef struct _RTL_QUERY_REGISTRY_TABLE {
4572 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
4573 ULONG Flags;
4574 PCWSTR Name;
4575 PVOID EntryContext;
4576 ULONG DefaultType;
4577 PVOID DefaultData;
4578 ULONG DefaultLength;
4579 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
4580
4581 typedef struct _TIME_FIELDS {
4582 CSHORT Year;
4583 CSHORT Month;
4584 CSHORT Day;
4585 CSHORT Hour;
4586 CSHORT Minute;
4587 CSHORT Second;
4588 CSHORT Milliseconds;
4589 CSHORT Weekday;
4590 } TIME_FIELDS, *PTIME_FIELDS;
4591
4592
4593 /******************************************************************************
4594 * RTL Functions *
4595 ******************************************************************************/
4596
4597 NTSYSAPI
4598 VOID
4599 NTAPI
4600 RtlAssert(
4601 IN PVOID FailedAssertion,
4602 IN PVOID FileName,
4603 IN ULONG LineNumber,
4604 IN PCHAR Message);
4605
4606 /* VOID
4607 * RtlCopyMemory(
4608 * IN VOID UNALIGNED *Destination,
4609 * IN CONST VOID UNALIGNED *Source,
4610 * IN SIZE_T Length)
4611 */
4612 #define RtlCopyMemory(Destination, Source, Length) \
4613 memcpy(Destination, Source, Length)
4614
4615 #define RtlCopyBytes RtlCopyMemory
4616
4617 #if defined(_M_AMD64)
4618 NTSYSAPI
4619 VOID
4620 NTAPI
4621 RtlCopyMemoryNonTemporal(
4622 VOID UNALIGNED *Destination,
4623 CONST VOID UNALIGNED *Source,
4624 SIZE_T Length);
4625 #else
4626 #define RtlCopyMemoryNonTemporal RtlCopyMemory
4627 #endif
4628
4629 /* BOOLEAN
4630 * RtlEqualLuid(
4631 * IN PLUID Luid1,
4632 * IN PLUID Luid2)
4633 */
4634 #define RtlEqualLuid(Luid1, Luid2) \
4635 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
4636
4637 /* ULONG
4638 * RtlEqualMemory(
4639 * IN VOID UNALIGNED *Destination,
4640 * IN CONST VOID UNALIGNED *Source,
4641 * IN SIZE_T Length)
4642 */
4643 #define RtlEqualMemory(Destination, Source, Length) \
4644 (!memcmp(Destination, Source, Length))
4645
4646 /* VOID
4647 * RtlFillMemory(
4648 * IN VOID UNALIGNED *Destination,
4649 * IN SIZE_T Length,
4650 * IN UCHAR Fill)
4651 */
4652 #define RtlFillMemory(Destination, Length, Fill) \
4653 memset(Destination, Fill, Length)
4654
4655 #define RtlFillBytes RtlFillMemory
4656
4657 NTSYSAPI
4658 VOID
4659 NTAPI
4660 RtlFreeUnicodeString(
4661 IN PUNICODE_STRING UnicodeString);
4662
4663 NTSYSAPI
4664 NTSTATUS
4665 NTAPI
4666 RtlGUIDFromString(
4667 IN PUNICODE_STRING GuidString,
4668 OUT GUID *Guid);
4669
4670 NTSYSAPI
4671 VOID
4672 NTAPI
4673 RtlInitUnicodeString(
4674 IN OUT PUNICODE_STRING DestinationString,
4675 IN PCWSTR SourceString);
4676
4677 /* VOID
4678 * RtlMoveMemory(
4679 * IN VOID UNALIGNED *Destination,
4680 * IN CONST VOID UNALIGNED *Source,
4681 * IN SIZE_T Length)
4682 */
4683 #define RtlMoveMemory(Destination, Source, Length) \
4684 memmove(Destination, Source, Length)
4685
4686 NTSYSAPI
4687 NTSTATUS
4688 NTAPI
4689 RtlStringFromGUID(
4690 IN REFGUID Guid,
4691 OUT PUNICODE_STRING GuidString);
4692
4693 /* VOID
4694 * RtlZeroMemory(
4695 * IN VOID UNALIGNED *Destination,
4696 * IN SIZE_T Length)
4697 */
4698 #define RtlZeroMemory(Destination, Length) \
4699 memset(Destination, 0, Length)
4700
4701 #define RtlZeroBytes RtlZeroMemory
4702
4703
4704 #if (NTDDI_VERSION >= NTDDI_WIN2K)
4705 NTSYSAPI
4706 BOOLEAN
4707 NTAPI
4708 RtlAreBitsClear(
4709 IN PRTL_BITMAP BitMapHeader,
4710 IN ULONG StartingIndex,
4711 IN ULONG Length);
4712
4713 NTSYSAPI
4714 BOOLEAN
4715 NTAPI
4716 RtlAreBitsSet(
4717 IN PRTL_BITMAP BitMapHeader,
4718 IN ULONG StartingIndex,
4719 IN ULONG Length);
4720
4721 NTSYSAPI
4722 NTSTATUS
4723 NTAPI
4724 RtlAnsiStringToUnicodeString(
4725 IN OUT PUNICODE_STRING DestinationString,
4726 IN PANSI_STRING SourceString,
4727 IN BOOLEAN AllocateDestinationString);
4728
4729 NTSYSAPI
4730 ULONG
4731 NTAPI
4732 RtlxAnsiStringToUnicodeSize(
4733 IN PCANSI_STRING AnsiString);
4734
4735 #define RtlAnsiStringToUnicodeSize(String) ( \
4736 NLS_MB_CODE_PAGE_TAG ? \
4737 RtlxAnsiStringToUnicodeSize(String) : \
4738 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
4739 )
4740
4741 NTSYSAPI
4742 NTSTATUS
4743 NTAPI
4744 RtlAppendUnicodeStringToString(
4745 IN OUT PUNICODE_STRING Destination,
4746 IN PCUNICODE_STRING Source);
4747
4748 NTSYSAPI
4749 NTSTATUS
4750 NTAPI
4751 RtlAppendUnicodeToString(
4752 IN OUT PUNICODE_STRING Destination,
4753 IN PCWSTR Source);
4754
4755 NTSYSAPI
4756 NTSTATUS
4757 NTAPI
4758 RtlCheckRegistryKey(
4759 IN ULONG RelativeTo,
4760 IN PWSTR Path);
4761
4762 NTSYSAPI
4763 VOID
4764 NTAPI
4765 RtlClearAllBits(
4766 IN PRTL_BITMAP BitMapHeader);
4767
4768 NTSYSAPI
4769 VOID
4770 NTAPI
4771 RtlClearBits(
4772 IN PRTL_BITMAP BitMapHeader,
4773 IN ULONG StartingIndex,
4774 IN ULONG NumberToClear);
4775
4776 NTSYSAPI
4777 SIZE_T
4778 NTAPI
4779 RtlCompareMemory(
4780 IN CONST VOID *Source1,
4781 IN CONST VOID *Source2,
4782 IN SIZE_T Length);
4783
4784 NTSYSAPI
4785 LONG
4786 NTAPI
4787 RtlCompareUnicodeString(
4788 IN PCUNICODE_STRING String1,
4789 IN PCUNICODE_STRING String2,
4790 IN BOOLEAN CaseInSensitive);
4791
4792 NTSYSAPI
4793 LONG
4794 NTAPI
4795 RtlCompareUnicodeStrings(
4796 IN PCWCH String1,
4797 IN SIZE_T String1Length,
4798 IN PCWCH String2,
4799 IN SIZE_T String2Length,
4800 IN BOOLEAN CaseInSensitive);
4801
4802 NTSYSAPI
4803 VOID
4804 NTAPI
4805 RtlCopyUnicodeString(
4806 IN OUT PUNICODE_STRING DestinationString,
4807 IN PCUNICODE_STRING SourceString);
4808
4809 NTSYSAPI
4810 NTSTATUS
4811 NTAPI
4812 RtlCreateRegistryKey(
4813 IN ULONG RelativeTo,
4814 IN PWSTR Path);
4815
4816 NTSYSAPI
4817 NTSTATUS
4818 NTAPI
4819 RtlCreateSecurityDescriptor(
4820 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
4821 IN ULONG Revision);
4822
4823 NTSYSAPI
4824 NTSTATUS
4825 NTAPI
4826 RtlDeleteRegistryValue(
4827 IN ULONG RelativeTo,
4828 IN PCWSTR Path,
4829 IN PCWSTR ValueName);
4830
4831 NTSYSAPI
4832 BOOLEAN
4833 NTAPI
4834 RtlEqualUnicodeString(
4835 IN CONST UNICODE_STRING *String1,
4836 IN CONST UNICODE_STRING *String2,
4837 IN BOOLEAN CaseInSensitive);
4838
4839 #if !defined(_AMD64_) && !defined(_IA64_)
4840 NTSYSAPI
4841 LARGE_INTEGER
4842 NTAPI
4843 RtlExtendedIntegerMultiply(
4844 IN LARGE_INTEGER Multiplicand,
4845 IN LONG Multiplier);
4846
4847 NTSYSAPI
4848 LARGE_INTEGER
4849 NTAPI
4850 RtlExtendedLargeIntegerDivide(
4851 IN LARGE_INTEGER Dividend,
4852 IN ULONG Divisor,
4853 IN OUT PULONG Remainder);
4854 #endif
4855
4856 #if defined(_X86_) || defined(_IA64_)
4857 NTSYSAPI
4858 LARGE_INTEGER
4859 NTAPI
4860 RtlExtendedMagicDivide(
4861 IN LARGE_INTEGER Dividend,
4862 IN LARGE_INTEGER MagicDivisor,
4863 IN CCHAR ShiftCount);
4864 #endif
4865
4866 NTSYSAPI
4867 VOID
4868 NTAPI
4869 RtlFreeAnsiString(
4870 IN PANSI_STRING AnsiString);
4871
4872 NTSYSAPI
4873 ULONG
4874 NTAPI
4875 RtlFindClearBits(
4876 IN PRTL_BITMAP BitMapHeader,
4877 IN ULONG NumberToFind,
4878 IN ULONG HintIndex);
4879
4880 NTSYSAPI
4881 ULONG
4882 NTAPI
4883 RtlFindClearBitsAndSet(
4884 IN PRTL_BITMAP BitMapHeader,
4885 IN ULONG NumberToFind,
4886 IN ULONG HintIndex);
4887
4888 NTSYSAPI
4889 ULONG
4890 NTAPI
4891 RtlFindFirstRunClear(
4892 IN PRTL_BITMAP BitMapHeader,
4893 OUT PULONG StartingIndex);
4894
4895 NTSYSAPI
4896 ULONG
4897 NTAPI
4898 RtlFindClearRuns(
4899 IN PRTL_BITMAP BitMapHeader,
4900 OUT PRTL_BITMAP_RUN RunArray,
4901 IN ULONG SizeOfRunArray,
4902 IN BOOLEAN LocateLongestRuns);
4903
4904 NTSYSAPI
4905 ULONG
4906 NTAPI
4907 RtlFindLastBackwardRunClear(
4908 IN PRTL_BITMAP BitMapHeader,
4909 IN ULONG FromIndex,
4910 OUT PULONG StartingRunIndex);
4911
4912 NTSYSAPI
4913 CCHAR
4914 NTAPI
4915 RtlFindLeastSignificantBit(
4916 IN ULONGLONG Set);
4917
4918 NTSYSAPI
4919 ULONG
4920 NTAPI
4921 RtlFindLongestRunClear(
4922 IN PRTL_BITMAP BitMapHeader,
4923 OUT PULONG StartingIndex);
4924
4925 NTSYSAPI
4926 CCHAR
4927 NTAPI
4928 RtlFindMostSignificantBit(
4929 IN ULONGLONG Set);
4930
4931 NTSYSAPI
4932 ULONG
4933 NTAPI
4934 RtlFindNextForwardRunClear(
4935 IN PRTL_BITMAP BitMapHeader,
4936 IN ULONG FromIndex,
4937 OUT PULONG StartingRunIndex);
4938
4939 NTSYSAPI
4940 ULONG
4941 NTAPI
4942 RtlFindSetBits(
4943 IN PRTL_BITMAP BitMapHeader,
4944 IN ULONG NumberToFind,
4945 IN ULONG HintIndex);
4946
4947 NTSYSAPI
4948 ULONG
4949 NTAPI
4950 RtlFindSetBitsAndClear(
4951 IN PRTL_BITMAP BitMapHeader,
4952 IN ULONG NumberToFind,
4953 IN ULONG HintIndex);
4954
4955 NTSYSAPI
4956 NTSTATUS
4957 NTAPI
4958 RtlHashUnicodeString(
4959 IN CONST UNICODE_STRING *String,
4960 IN BOOLEAN CaseInSensitive,
4961 IN ULONG HashAlgorithm,
4962 OUT PULONG HashValue);
4963
4964 NTSYSAPI
4965 VOID
4966 NTAPI
4967 RtlInitAnsiString(
4968 IN OUT PANSI_STRING DestinationString,
4969 IN PCSZ SourceString);
4970
4971 NTSYSAPI
4972 VOID
4973 NTAPI
4974 RtlInitializeBitMap(
4975 IN PRTL_BITMAP BitMapHeader,
4976 IN PULONG BitMapBuffer,
4977 IN ULONG SizeOfBitMap);
4978
4979 NTSYSAPI
4980 VOID
4981 NTAPI
4982 RtlInitString(
4983 IN OUT PSTRING DestinationString,
4984 IN PCSZ SourceString);
4985
4986 NTSYSAPI
4987 NTSTATUS
4988 NTAPI
4989 RtlIntegerToUnicodeString(
4990 IN ULONG Value,
4991 IN ULONG Base OPTIONAL,
4992 IN OUT PUNICODE_STRING String);
4993
4994 NTSYSAPI
4995 NTSTATUS
4996 NTAPI
4997 RtlInt64ToUnicodeString(
4998 IN ULONGLONG Value,
4999 IN ULONG Base OPTIONAL,
5000 IN OUT PUNICODE_STRING String);
5001
5002 #ifdef _WIN64
5003 #define RtlIntPtrToUnicodeString(Value, Base, String) \
5004 RtlInt64ToUnicodeString(Value, Base, String)
5005 #else
5006 #define RtlIntPtrToUnicodeString(Value, Base, String) \
5007 RtlIntegerToUnicodeString(Value, Base, String)
5008 #endif
5009
5010 /* BOOLEAN
5011 * RtlIsZeroLuid(
5012 * IN PLUID L1);
5013 */
5014 #define RtlIsZeroLuid(_L1) \
5015 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
5016
5017 NTSYSAPI
5018 ULONG
5019 NTAPI
5020 RtlLengthSecurityDescriptor(
5021 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
5022
5023 NTSYSAPI
5024 ULONG
5025 NTAPI
5026 RtlNumberOfClearBits(
5027 IN PRTL_BITMAP BitMapHeader);
5028
5029 NTSYSAPI
5030 ULONG
5031 NTAPI
5032 RtlNumberOfSetBits(
5033 IN PRTL_BITMAP BitMapHeader);
5034
5035 NTSYSAPI
5036 NTSTATUS
5037 NTAPI
5038 RtlQueryRegistryValues(
5039 IN ULONG RelativeTo,
5040 IN PCWSTR Path,
5041 IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
5042 IN PVOID Context,
5043 IN PVOID Environment OPTIONAL);
5044
5045 #define LONG_SIZE (sizeof(LONG))
5046 #define LONG_MASK (LONG_SIZE - 1)
5047
5048 /* VOID
5049 * RtlRetrieveUlong(
5050 * PULONG DestinationAddress,
5051 * PULONG SourceAddress);
5052 */
5053 #if defined(_AMD64_)
5054 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
5055 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
5056 #else
5057 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
5058 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
5059 { \
5060 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
5061 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
5062 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
5063 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
5064 } \
5065 else \
5066 { \
5067 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
5068 }
5069 #endif
5070
5071 /* VOID
5072 * RtlRetrieveUshort(
5073 * PUSHORT DestinationAddress,
5074 * PUSHORT SourceAddress);
5075 */
5076 #if defined(_AMD64_)
5077 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
5078 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
5079 #else
5080 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
5081 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
5082 { \
5083 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
5084 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
5085 } \
5086 else \
5087 { \
5088 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
5089 }
5090 #endif
5091
5092 NTSYSAPI
5093 VOID
5094 NTAPI
5095 RtlSetAllBits(
5096 IN PRTL_BITMAP BitMapHeader);
5097
5098 NTSYSAPI
5099 VOID
5100 NTAPI
5101 RtlSetBits(
5102 IN PRTL_BITMAP BitMapHeader,
5103 IN ULONG StartingIndex,
5104 IN ULONG NumberToSet);
5105
5106 NTSYSAPI
5107 NTSTATUS
5108 NTAPI
5109 RtlSetDaclSecurityDescriptor(
5110 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
5111 IN BOOLEAN DaclPresent,
5112 IN PACL Dacl OPTIONAL,
5113 IN BOOLEAN DaclDefaulted OPTIONAL);
5114
5115 /* VOID
5116 * RtlStoreUlong(
5117 * IN PULONG Address,
5118 * IN ULONG Value);
5119 */
5120 #if defined(_AMD64_)
5121 #define RtlStoreUlong(Address,Value) \
5122 *(ULONG UNALIGNED *)(Address) = (Value)
5123 #else
5124 #define RtlStoreUlong(Address,Value) \
5125 if ((ULONG_PTR)(Address) & LONG_MASK) { \
5126 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
5127 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
5128 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
5129 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
5130 } \
5131 else { \
5132 *((PULONG)(Address)) = (ULONG) (Value); \
5133 }
5134 #endif
5135
5136 /* VOID
5137 * RtlStoreUlonglong(
5138 * IN OUT PULONGLONG Address,
5139 * ULONGLONG Value);
5140 */
5141 #if defined(_AMD64_)
5142 #define RtlStoreUlonglong(Address,Value) \
5143 *(ULONGLONG UNALIGNED *)(Address) = (Value)
5144 #else
5145 #define RtlStoreUlonglong(Address,Value) \
5146 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
5147 RtlStoreUlong((ULONG_PTR)(Address), \
5148 (ULONGLONG)(Value) & 0xFFFFFFFF); \
5149 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
5150 (ULONGLONG)(Value) >> 32); \
5151 } else { \
5152 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
5153 }
5154 #endif
5155
5156 /* VOID
5157 * RtlStoreUlongPtr(
5158 * IN OUT PULONG_PTR Address,
5159 * IN ULONG_PTR Value);
5160 */
5161 #ifdef _WIN64
5162 #define RtlStoreUlongPtr(Address,Value) \
5163 RtlStoreUlonglong(Address,Value)
5164 #else
5165 #define RtlStoreUlongPtr(Address,Value) \
5166 RtlStoreUlong(Address,Value)
5167 #endif
5168
5169 /* VOID
5170 * RtlStoreUshort(
5171 * IN PUSHORT Address,
5172 * IN USHORT Value);
5173 */
5174 #if defined(_AMD64_)
5175 #define RtlStoreUshort(Address,Value) \
5176 *(USHORT UNALIGNED *)(Address) = (Value)
5177 #else
5178 #define RtlStoreUshort(Address,Value) \
5179 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
5180 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
5181 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
5182 } \
5183 else { \
5184 *((PUSHORT) (Address)) = (USHORT)Value; \
5185 }
5186 #endif
5187
5188 NTSYSAPI
5189 BOOLEAN
5190 NTAPI
5191 RtlTimeFieldsToTime(
5192 IN PTIME_FIELDS TimeFields,
5193 IN PLARGE_INTEGER Time);
5194
5195 NTSYSAPI
5196 VOID
5197 NTAPI
5198 RtlTimeToTimeFields(
5199 IN PLARGE_INTEGER Time,
5200 IN PTIME_FIELDS TimeFields);
5201
5202 NTSYSAPI
5203 ULONG
5204 FASTCALL
5205 RtlUlongByteSwap(
5206 IN ULONG Source);
5207
5208 NTSYSAPI
5209 ULONGLONG
5210 FASTCALL
5211 RtlUlonglongByteSwap(
5212 IN ULONGLONG Source);
5213
5214 NTSYSAPI
5215 NTSTATUS
5216 NTAPI
5217 RtlUnicodeStringToAnsiString(
5218 IN OUT PANSI_STRING DestinationString,
5219 IN PCUNICODE_STRING SourceString,
5220 IN BOOLEAN AllocateDestinationString);
5221
5222 NTSYSAPI
5223 ULONG
5224 NTAPI
5225 RtlxUnicodeStringToAnsiSize(
5226 IN PCUNICODE_STRING UnicodeString);
5227
5228 #define RtlUnicodeStringToAnsiSize(String) ( \
5229 NLS_MB_CODE_PAGE_TAG ? \
5230 RtlxUnicodeStringToAnsiSize(String) : \
5231 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
5232 )
5233
5234 NTSYSAPI
5235 NTSTATUS
5236 NTAPI
5237 RtlUnicodeStringToInteger(
5238 IN PCUNICODE_STRING String,
5239 IN ULONG Base OPTIONAL,
5240 OUT PULONG Value);
5241
5242 NTSYSAPI
5243 WCHAR
5244 NTAPI
5245 RtlUpcaseUnicodeChar(
5246 IN WCHAR SourceCharacter);
5247
5248 NTSYSAPI
5249 USHORT
5250 FASTCALL
5251 RtlUshortByteSwap(
5252 IN USHORT Source);
5253
5254 NTSYSAPI
5255 BOOLEAN
5256 NTAPI
5257 RtlValidRelativeSecurityDescriptor(
5258 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
5259 IN ULONG SecurityDescriptorLength,
5260 IN SECURITY_INFORMATION RequiredInformation);
5261
5262 NTSYSAPI
5263 BOOLEAN
5264 NTAPI
5265 RtlValidSecurityDescriptor(
5266 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
5267
5268 NTSYSAPI
5269 NTSTATUS
5270 NTAPI
5271 RtlWriteRegistryValue(
5272 IN ULONG RelativeTo,
5273 IN PCWSTR Path,
5274 IN PCWSTR ValueName,
5275 IN ULONG ValueType,
5276 IN PVOID ValueData,
5277 IN ULONG ValueLength);
5278
5279 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
5280
5281 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
5282 NTSYSAPI
5283 VOID
5284 FASTCALL
5285 RtlPrefetchMemoryNonTemporal(
5286 IN PVOID Source,
5287 IN SIZE_T Length);
5288 #endif
5289
5290 #if (NTDDI_VERSION >= NTDDI_WINXP)
5291 NTSYSAPI
5292 VOID
5293 NTAPI
5294 RtlClearBit(
5295 PRTL_BITMAP BitMapHeader,
5296 ULONG BitNumber);
5297
5298 NTSYSAPI
5299 WCHAR
5300 NTAPI
5301 RtlDowncaseUnicodeChar(
5302 IN WCHAR SourceCharacter);
5303
5304 NTSYSAPI
5305 VOID
5306 NTAPI
5307 RtlSetBit(
5308 PRTL_BITMAP BitMapHeader,
5309 ULONG BitNumber);
5310
5311 NTSYSAPI
5312 BOOLEAN
5313 NTAPI
5314 RtlTestBit(
5315 IN PRTL_BITMAP BitMapHeader,
5316 IN ULONG BitNumber);
5317
5318 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
5319
5320 #if (NTDDI_VERSION >= NTDDI_VISTA)
5321 NTSYSAPI
5322 ULONG
5323 NTAPI
5324 RtlNumberOfSetBitsUlongPtr(
5325 IN ULONG_PTR Target);
5326
5327 NTSYSAPI
5328 ULONGLONG
5329 NTAPI
5330 RtlIoDecodeMemIoResource (
5331 IN PIO_RESOURCE_DESCRIPTOR Descriptor,
5332 OUT PULONGLONG Alignment OPTIONAL,
5333 OUT PULONGLONG MinimumAddress OPTIONAL,
5334 OUT PULONGLONG MaximumAddress OPTIONAL);
5335
5336 NTSYSAPI
5337 NTSTATUS
5338 NTAPI
5339 RtlIoEncodeMemIoResource(
5340 IN PIO_RESOURCE_DESCRIPTOR Descriptor,
5341 IN UCHAR Type,
5342 IN ULONGLONG Length,
5343 IN ULONGLONG Alignment,
5344 IN ULONGLONG MinimumAddress,
5345 IN ULONGLONG MaximumAddress);
5346
5347 NTSYSAPI
5348 ULONGLONG
5349 NTAPI
5350 RtlCmDecodeMemIoResource(
5351 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor,
5352 OUT PULONGLONG Start OPTIONAL);
5353
5354 NTSYSAPI
5355 NTSTATUS
5356 NTAPI
5357 RtlFindClosestEncodableLength(
5358 IN ULONGLONG SourceLength,
5359 OUT PULONGLONG TargetLength);
5360
5361 #endif
5362
5363 #if !defined(MIDL_PASS)
5364 /* inline funftions */
5365 //DECLSPEC_DEPRECATED_DDK_WINXP
5366 static __inline
5367 LARGE_INTEGER
5368 NTAPI_INLINE
5369 RtlConvertLongToLargeInteger(LONG SignedInteger)
5370 {
5371 LARGE_INTEGER ret;
5372 ret.QuadPart = SignedInteger;
5373 return ret;
5374 }
5375
5376 //DECLSPEC_DEPRECATED_DDK_WINXP
5377 static __inline
5378 LARGE_INTEGER
5379 NTAPI_INLINE
5380 RtlConvertUlongToLargeInteger(
5381 ULONG UnsignedInteger)
5382 {
5383 LARGE_INTEGER ret;
5384 ret.QuadPart = UnsignedInteger;
5385 return ret;
5386 }
5387
5388 //DECLSPEC_DEPRECATED_DDK
5389 static __inline
5390 ULONG
5391 NTAPI_INLINE
5392 RtlEnlargedUnsignedDivide(
5393 IN ULARGE_INTEGER Dividend,
5394 IN ULONG Divisor,
5395 IN OUT PULONG Remainder)
5396 {
5397 if (Remainder)
5398 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
5399 return (ULONG)(Dividend.QuadPart / Divisor);
5400 }
5401
5402 //DECLSPEC_DEPRECATED_DDK
5403 static __inline
5404 LARGE_INTEGER
5405 NTAPI_INLINE
5406 RtlEnlargedUnsignedMultiply(
5407 IN ULONG Multiplicand,
5408 IN ULONG Multiplier)
5409 {
5410 LARGE_INTEGER ret;
5411 ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
5412 return ret;
5413 }
5414
5415 //DECLSPEC_DEPRECATED_DDK
5416 static __inline
5417 LARGE_INTEGER
5418 NTAPI_INLINE
5419 RtlEnlargedIntegerMultiply(
5420 IN LONG Multiplicand,
5421 IN LONG Multiplier)
5422 {
5423 LARGE_INTEGER ret;
5424 ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
5425 return ret;
5426 }
5427
5428 FORCEINLINE
5429 VOID
5430 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString,
5431 IN PCHAR Buffer,
5432 IN USHORT BufferSize)
5433 {
5434 AnsiString->Length = 0;
5435 AnsiString->MaximumLength = BufferSize;
5436 AnsiString->Buffer = Buffer;
5437 }
5438
5439 FORCEINLINE
5440 VOID
5441 RtlInitEmptyUnicodeString(
5442 OUT PUNICODE_STRING UnicodeString,
5443 IN PWSTR Buffer,
5444 IN USHORT BufferSize)
5445 {
5446 UnicodeString->Length = 0;
5447 UnicodeString->MaximumLength = BufferSize;
5448 UnicodeString->Buffer = Buffer;
5449 }
5450
5451 #if defined(_AMD64_) || defined(_IA64_)
5452 static __inline
5453 LARGE_INTEGER
5454 NTAPI_INLINE
5455 RtlExtendedIntegerMultiply(
5456 LARGE_INTEGER Multiplicand,
5457 LONG Multiplier)
5458 {
5459 LARGE_INTEGER ret;
5460 ret.QuadPart = Multiplicand.QuadPart * Multiplier;
5461 return ret;
5462 }
5463
5464 static __inline
5465 LARGE_INTEGER
5466 NTAPI_INLINE
5467 RtlExtendedLargeIntegerDivide(
5468 LARGE_INTEGER Dividend,
5469 ULONG Divisor,
5470 PULONG Remainder)
5471 {
5472 LARGE_INTEGER ret;
5473 ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
5474 if (Remainder)
5475 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
5476 return ret;
5477 }
5478 #endif
5479
5480 #if defined(_AMD64_)
5481
5482 #define MultiplyHigh __mulh
5483 #define UnsignedMultiplyHigh __umulh
5484
5485 //DECLSPEC_DEPRECATED_DDK
5486 static __inline
5487 LARGE_INTEGER
5488 NTAPI_INLINE
5489 RtlExtendedMagicDivide(
5490 IN LARGE_INTEGER Dividend,
5491 IN LARGE_INTEGER MagicDivisor,
5492 IN CCHAR ShiftCount)
5493 {
5494 LARGE_INTEGER ret;
5495 ULONG64 ret64;
5496 BOOLEAN Pos;
5497 Pos = (Dividend.QuadPart >= 0);
5498 ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,
5499 MagicDivisor.QuadPart);
5500 ret64 >>= ShiftCount;
5501 ret.QuadPart = Pos ? ret64 : -ret64;
5502 return ret;
5503 }
5504 #endif
5505
5506 //DECLSPEC_DEPRECATED_DDK
5507 static __inline
5508 LARGE_INTEGER
5509 NTAPI_INLINE
5510 RtlLargeIntegerAdd(
5511 IN LARGE_INTEGER Addend1,
5512 IN LARGE_INTEGER Addend2)
5513 {
5514 LARGE_INTEGER ret;
5515 ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
5516 return ret;
5517 }
5518
5519 /* VOID
5520 * RtlLargeIntegerAnd(
5521 * IN OUT LARGE_INTEGER Result,
5522 * IN LARGE_INTEGER Source,
5523 * IN LARGE_INTEGER Mask);
5524 */
5525 #define RtlLargeIntegerAnd(Result, Source, Mask) \
5526 Result.QuadPart = Source.QuadPart & Mask.QuadPart
5527
5528 //DECLSPEC_DEPRECATED_DDK
5529 static __inline
5530 LARGE_INTEGER
5531 NTAPI_INLINE
5532 RtlLargeIntegerArithmeticShift(
5533 IN LARGE_INTEGER LargeInteger,
5534 IN CCHAR ShiftCount)
5535 {
5536 LARGE_INTEGER ret;
5537 ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;
5538 return ret;
5539 }
5540
5541 /* BOOLEAN
5542 * RtlLargeIntegerEqualTo(
5543 * IN LARGE_INTEGER Operand1,
5544 * IN LARGE_INTEGER Operand2);
5545 */
5546 #define RtlLargeIntegerEqualTo(X,Y) \
5547 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
5548
5549 FORCEINLINE
5550 PVOID
5551 RtlSecureZeroMemory(
5552 OUT PVOID Pointer,
5553 IN SIZE_T Size)
5554 {
5555 volatile char* vptr = (volatile char*)Pointer;
5556 #if defined(_M_AMD64)
5557 __stosb((PUCHAR)vptr, 0, Size);
5558 #else
5559 char * endptr = (char *)vptr + Size;
5560 while (vptr < endptr)
5561 {
5562 *vptr = 0; vptr++;
5563 }
5564 #endif
5565 return Pointer;
5566 }
5567
5568 #if defined(_M_AMD64)
5569 FORCEINLINE
5570 ULONG
5571 RtlCheckBit(
5572 IN PRTL_BITMAP BitMapHeader,
5573 IN ULONG BitPosition)
5574 {
5575 return BitTest((LONG CONST*)BitMapHeader->Buffer, BitPosition);
5576 }
5577 #else
5578 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
5579 #endif // defined(_M_AMD64)
5580
5581 #endif // !defined(MIDL_PASS)
5582
5583 //
5584 // Byte Swap Functions
5585 //
5586 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
5587 ((defined(_M_AMD64) || defined(_M_IA64)) \
5588 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
5589
5590 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
5591 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
5592 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
5593
5594 #endif
5595
5596 /******************************************************************************
5597 * Executive Types *
5598 ******************************************************************************/
5599
5600 typedef enum _POOL_TYPE {
5601 NonPagedPool,
5602 PagedPool,
5603 NonPagedPoolMustSucceed,
5604 DontUseThisType,
5605 NonPagedPoolCacheAligned,
5606 PagedPoolCacheAligned,
5607 NonPagedPoolCacheAlignedMustS,
5608 MaxPoolType,
5609 NonPagedPoolSession = 32,
5610 PagedPoolSession,
5611 NonPagedPoolMustSucceedSession,
5612 DontUseThisTypeSession,
5613 NonPagedPoolCacheAlignedSession,
5614 PagedPoolCacheAlignedSession,
5615 NonPagedPoolCacheAlignedMustSSession
5616 } POOL_TYPE;
5617
5618 typedef enum _SUITE_TYPE {
5619 SmallBusiness,
5620 Enterprise,
5621 BackOffice,
5622 CommunicationServer,
5623 TerminalServer,
5624 SmallBusinessRestricted,
5625 EmbeddedNT,
5626 DataCenter,
5627 SingleUserTS,
5628 Personal,
5629 Blade,
5630 MaxSuiteType
5631 } SUITE_TYPE;
5632
5633 typedef enum _EX_POOL_PRIORITY {
5634 LowPoolPriority,
5635 LowPoolPrioritySpecialPoolOverrun = 8,
5636 LowPoolPrioritySpecialPoolUnderrun = 9,
5637 NormalPoolPriority = 16,
5638 NormalPoolPrioritySpecialPoolOverrun = 24,
5639 NormalPoolPrioritySpecialPoolUnderrun = 25,
5640 HighPoolPriority = 32,
5641 HighPoolPrioritySpecialPoolOverrun = 40,
5642 HighPoolPrioritySpecialPoolUnderrun = 41
5643 } EX_POOL_PRIORITY;
5644
5645 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
5646 #define LOOKASIDE_ALIGN
5647 #else
5648 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
5649 #endif
5650
5651 typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;
5652
5653 typedef PVOID
5654 (DDKAPI *PALLOCATE_FUNCTION)(
5655 IN POOL_TYPE PoolType,
5656 IN SIZE_T NumberOfBytes,
5657 IN ULONG Tag);
5658
5659 typedef PVOID
5660 (DDKAPI *PALLOCATE_FUNCTION_EX)(
5661 IN POOL_TYPE PoolType,
5662 IN SIZE_T NumberOfBytes,
5663 IN ULONG Tag,
5664 IN OUT PLOOKASIDE_LIST_EX Lookaside);
5665
5666 typedef VOID
5667 (DDKAPI *PFREE_FUNCTION)(
5668 IN PVOID Buffer);
5669
5670 typedef VOID
5671 (DDKAPI *PFREE_FUNCTION_EX)(
5672 IN PVOID Buffer,
5673 IN OUT PLOOKASIDE_LIST_EX Lookaside);
5674
5675 typedef VOID
5676 (DDKAPI *PCALLBACK_FUNCTION)(
5677 IN PVOID CallbackContext,
5678 IN PVOID Argument1,
5679 IN PVOID Argument2);
5680
5681 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE {
5682 union {
5683 SLIST_HEADER ListHead;
5684 SINGLE_LIST_ENTRY SingleListHead;
5685 } DUMMYUNIONNAME;
5686 USHORT Depth;
5687 USHORT MaximumDepth;
5688 ULONG TotalAllocates;
5689 union {
5690 ULONG AllocateMisses;
5691 ULONG AllocateHits;
5692 } DUMMYUNIONNAME2;
5693 ULONG TotalFrees;
5694 union {
5695 ULONG FreeMisses;
5696 ULONG FreeHits;
5697 } DUMMYUNIONNAME3;
5698 POOL_TYPE Type;
5699 ULONG Tag;
5700 ULONG Size;
5701 union {
5702 PALLOCATE_FUNCTION_EX AllocateEx;
5703 PALLOCATE_FUNCTION Allocate;
5704 } DUMMYUNIONNAME4;
5705 union {
5706 PFREE_FUNCTION_EX FreeEx;
5707 PFREE_FUNCTION Free;
5708 } DUMMYUNIONNAME5;
5709 LIST_ENTRY ListEntry;
5710 ULONG LastTotalAllocates;
5711 union {
5712 ULONG LastAllocateMisses;
5713 ULONG LastAllocateHits;
5714 } DUMMYUNIONNAME6;
5715 ULONG Future[2];
5716 } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
5717
5718 typedef struct _PAGED_LOOKASIDE_LIST {
5719 GENERAL_LOOKASIDE L;
5720 #if !defined(_AMD64_) && !defined(_IA64_)
5721 FAST_MUTEX Lock__ObsoleteButDoNotDelete;
5722 #endif
5723 } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
5724
5725 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST {
5726 GENERAL_LOOKASIDE L;
5727 #if !defined(_AMD64_) && !defined(_IA64_)
5728 KSPIN_LOCK Lock__ObsoleteButDoNotDelete;
5729 #endif
5730 } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
5731
5732 //typedef struct _LOOKASIDE_LIST_EX {
5733 // GENERAL_LOOKASIDE_POOL L;
5734 //} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
5735
5736 typedef struct _EX_RUNDOWN_REF {
5737 __GNU_EXTENSION union {
5738 volatile ULONG_PTR Count;
5739 volatile PVOID Ptr;
5740 };
5741 } EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
5742
5743 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE;
5744
5745 typedef enum _WORK_QUEUE_TYPE {
5746 CriticalWorkQueue,
5747 DelayedWorkQueue,
5748 HyperCriticalWorkQueue,
5749 MaximumWorkQueue
5750 } WORK_QUEUE_TYPE;
5751
5752 typedef VOID
5753 (DDKAPI *PWORKER_THREAD_ROUTINE)(
5754 IN PVOID Parameter);
5755
5756 typedef struct _WORK_QUEUE_ITEM {
5757 LIST_ENTRY List;
5758 PWORKER_THREAD_ROUTINE WorkerRoutine;
5759 volatile PVOID Parameter;
5760 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
5761
5762
5763 /******************************************************************************
5764 * Executive Functions *
5765 ******************************************************************************/
5766
5767 #if defined(_X86_)
5768 #if defined(_NTHAL_)
5769 #define ExAcquireFastMutex ExiAcquireFastMutex
5770 #define ExReleaseFastMutex ExiReleaseFastMutex
5771 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
5772 #endif
5773 #define ExInterlockedAddUlong ExfInterlockedAddUlong
5774 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
5775 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
5776 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
5777 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
5778 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
5779 #endif
5780
5781 #if defined(_WIN64)
5782
5783 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
5784 defined(_NTHAL_) || defined(_NTOSP_)
5785 NTKERNELAPI
5786 USHORT
5787 ExQueryDepthSList(IN PSLIST_HEADER ListHead);
5788 #else
5789 FORCEINLINE
5790 USHORT
5791 ExQueryDepthSList(IN PSLIST_HEADER ListHead)
5792 {
5793 return (USHORT)(ListHead->Alignment & 0xffff);
5794 }
5795 #endif
5796
5797 NTKERNELAPI
5798 PSLIST_ENTRY
5799 ExpInterlockedFlushSList(
5800 PSLIST_HEADER ListHead);
5801
5802 NTKERNELAPI
5803 PSLIST_ENTRY
5804 ExpInterlockedPopEntrySList(
5805 PSLIST_HEADER ListHead);
5806
5807 NTKERNELAPI
5808 PSLIST_ENTRY
5809 ExpInterlockedPushEntrySList(
5810 PSLIST_HEADER ListHead,
5811 PSLIST_ENTRY ListEntry);
5812
5813 #define ExInterlockedFlushSList(Head) \
5814 ExpInterlockedFlushSList(Head)
5815 #define ExInterlockedPopEntrySList(Head, Lock) \
5816 ExpInterlockedPopEntrySList(Head)
5817 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
5818 ExpInterlockedPushEntrySList(Head, Entry)
5819
5820 #else // !defined(_WIN64)
5821
5822 #define ExQueryDepthSList(listhead) (listhead)->Depth
5823
5824 NTKERNELAPI
5825 PSINGLE_LIST_ENTRY
5826 FASTCALL
5827 ExInterlockedFlushSList(
5828 IN PSLIST_HEADER ListHead);
5829
5830 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
5831 NTKERNELAPI
5832 PSINGLE_LIST_ENTRY
5833 FASTCALL
5834 ExInterlockedPopEntrySList(
5835 IN PSLIST_HEADER ListHead,
5836 IN PKSPIN_LOCK Lock);
5837
5838 NTKERNELAPI
5839 PSINGLE_LIST_ENTRY
5840 FASTCALL
5841 ExInterlockedPushEntrySList(
5842 IN PSLIST_HEADER ListHead,
5843 IN PSINGLE_LIST_ENTRY ListEntry,
5844 IN PKSPIN_LOCK Lock);
5845 #else
5846 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
5847 InterlockedPopEntrySList(_ListHead)
5848 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
5849 InterlockedPushEntrySList(_ListHead, _ListEntry)
5850 #endif // _WIN2K_COMPAT_SLIST_USAGE
5851
5852 #endif // !defined(_WIN64)
5853
5854 /* ERESOURCE_THREAD
5855 * ExGetCurrentResourceThread(
5856 * VOID);
5857 */
5858 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
5859
5860 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
5861
5862 /* VOID
5863 * ExInitializeWorkItem(
5864 * IN PWORK_QUEUE_ITEM Item,
5865 * IN PWORKER_THREAD_ROUTINE Routine,
5866 * IN PVOID Context)
5867 */
5868 #define ExInitializeWorkItem(Item, Routine, Context) \
5869 { \
5870 (Item)->WorkerRoutine = Routine; \
5871 (Item)->Parameter = Context; \
5872 (Item)->List.Flink = NULL; \
5873 }
5874
5875 #if (NTDDI_VERSION >= NTDDI_WIN2K)
5876
5877 NTKERNELAPI
5878 VOID
5879 FASTCALL
5880 ExAcquireFastMutex(
5881 IN OUT PFAST_MUTEX FastMutex);
5882
5883 NTKERNELAPI
5884 VOID
5885 FASTCALL
5886 ExReleaseFastMutex(
5887 IN OUT PFAST_MUTEX FastMutex);
5888
5889 NTKERNELAPI
5890 BOOLEAN
5891 FASTCALL
5892 ExTryToAcquireFastMutex(
5893 IN OUT PFAST_MUTEX FastMutex);
5894
5895 NTKERNELAPI
5896 VOID
5897 FASTCALL
5898 ExAcquireFastMutexUnsafe(
5899 IN OUT PFAST_MUTEX FastMutex);
5900
5901 NTKERNELAPI
5902 VOID
5903 FASTCALL
5904 ExReleaseFastMutexUnsafe(
5905 IN OUT PFAST_MUTEX FastMutex);
5906
5907 NTKERNELAPI
5908 BOOLEAN
5909 NTAPI
5910 ExAcquireResourceExclusiveLite(
5911 IN PERESOURCE Resource,
5912 IN BOOLEAN Wait);
5913
5914 NTKERNELAPI
5915 BOOLEAN
5916 NTAPI
5917 ExAcquireResourceSharedLite(
5918 IN PERESOURCE Resource,
5919 IN BOOLEAN Wait);
5920
5921 NTKERNELAPI
5922 BOOLEAN
5923 NTAPI
5924 ExAcquireSharedStarveExclusive(
5925 IN PERESOURCE Resource,
5926 IN BOOLEAN Wait);
5927
5928 NTKERNELAPI
5929 BOOLEAN
5930 NTAPI
5931 ExAcquireSharedWaitForExclusive(
5932 IN PERESOURCE Resource,
5933 IN BOOLEAN Wait);
5934
5935 NTKERNELAPI
5936 PVOID
5937 NTAPI
5938 ExAllocatePool(
5939 IN POOL_TYPE PoolType,
5940 IN SIZE_T NumberOfBytes);
5941
5942 #ifdef POOL_TAGGING
5943 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
5944 #endif /* POOL_TAGGING */
5945
5946 NTKERNELAPI
5947 PVOID
5948 NTAPI
5949 ExAllocatePoolWithQuota(
5950 IN POOL_TYPE PoolType,
5951 IN SIZE_T NumberOfBytes);
5952
5953 #ifdef POOL_TAGGING
5954 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
5955 #endif /* POOL_TAGGING */
5956
5957 NTKERNELAPI
5958 PVOID
5959 NTAPI
5960 ExAllocatePoolWithQuotaTag(
5961 IN POOL_TYPE PoolType,
5962 IN SIZE_T NumberOfBytes,
5963 IN ULONG Tag);
5964
5965 #ifndef POOL_TAGGING
5966 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
5967 #endif /* POOL_TAGGING */
5968
5969 NTKERNELAPI
5970 PVOID
5971 NTAPI
5972 ExAllocatePoolWithTag(
5973 IN POOL_TYPE PoolType,
5974 IN SIZE_T NumberOfBytes,
5975 IN ULONG Tag);
5976
5977 NTKERNELAPI
5978 PVOID
5979 NTAPI
5980 ExAllocatePoolWithTagPriority(
5981 IN POOL_TYPE PoolType,
5982 IN SIZE_T NumberOfBytes,
5983 IN ULONG Tag,
5984 IN EX_POOL_PRIORITY Priority);
5985
5986 NTKERNELAPI
5987 VOID
5988 NTAPI
5989 ExConvertExclusiveToSharedLite(
5990 IN PERESOURCE Resource);
5991
5992 NTKERNELAPI
5993 NTSTATUS
5994 NTAPI
5995 ExCreateCallback(
5996 OUT PCALLBACK_OBJECT *CallbackObject,
5997 IN POBJECT_ATTRIBUTES ObjectAttributes,
5998 IN BOOLEAN Create,
5999 IN BOOLEAN AllowMultipleCallbacks);
6000
6001 NTKERNELAPI
6002 VOID
6003 NTAPI
6004 ExDeleteNPagedLookasideList(
6005 IN PNPAGED_LOOKASIDE_LIST Lookaside);
6006
6007 NTKERNELAPI
6008 VOID
6009 NTAPI
6010 ExDeletePagedLookasideList(
6011 IN PPAGED_LOOKASIDE_LIST Lookaside);
6012
6013 NTKERNELAPI
6014 NTSTATUS
6015 NTAPI
6016 ExDeleteResourceLite(
6017 IN PERESOURCE Resource);
6018
6019 NTKERNELAPI
6020 VOID
6021 NTAPI
6022 ExFreePool(
6023 IN PVOID P);
6024
6025 #ifdef POOL_TAGGING
6026 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
6027 #endif
6028
6029 NTKERNELAPI
6030 VOID
6031 NTAPI
6032 ExFreePoolWithTag(
6033 IN PVOID P,
6034 IN ULONG Tag);
6035
6036 NTKERNELAPI
6037 ULONG
6038 NTAPI
6039 ExGetExclusiveWaiterCount(
6040 IN PERESOURCE Resource);
6041
6042 NTKERNELAPI
6043 KPROCESSOR_MODE
6044 NTAPI
6045 ExGetPreviousMode(
6046 VOID);
6047
6048 NTKERNELAPI
6049 ULONG
6050 NTAPI
6051 ExGetSharedWaiterCount(
6052 IN PERESOURCE Resource);
6053
6054 NTKERNELAPI
6055 VOID
6056 NTAPI
6057 ExInitializeNPagedLookasideList(
6058 IN PNPAGED_LOOKASIDE_LIST Lookaside,
6059 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
6060 IN PFREE_FUNCTION Free OPTIONAL,
6061 IN ULONG Flags,
6062 IN SIZE_T Size,
6063 IN ULONG Tag,
6064 IN USHORT Depth);
6065
6066 NTKERNELAPI
6067 VOID
6068 NTAPI
6069 ExInitializePagedLookasideList(
6070 IN PPAGED_LOOKASIDE_LIST Lookaside,
6071 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
6072 IN PFREE_FUNCTION Free OPTIONAL,
6073 IN ULONG Flags,
6074 IN SIZE_T Size,
6075 IN ULONG Tag,
6076 IN USHORT Depth);
6077
6078 NTKERNELAPI
6079 NTSTATUS
6080 NTAPI
6081 ExInitializeResourceLite(
6082 IN PERESOURCE Resource);
6083
6084 NTKERNELAPI
6085 LARGE_INTEGER
6086 NTAPI
6087 ExInterlockedAddLargeInteger(
6088 IN PLARGE_INTEGER Addend,
6089 IN LARGE_INTEGER Increment,
6090 IN PKSPIN_LOCK Lock);
6091
6092 #if defined(_WIN64)
6093 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
6094 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
6095 #else
6096 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
6097 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
6098 #endif
6099
6100 NTKERNELAPI
6101 ULONG
6102 FASTCALL
6103 ExInterlockedAddUlong(
6104 IN PULONG Addend,
6105 IN ULONG Increment,
6106 PKSPIN_LOCK Lock);
6107
6108 #if defined(_AMD64_) || defined(_IA64_)
6109 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
6110 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
6111 #elif defined(_X86_)
6112 NTKERNELAPI
6113 LONGLONG
6114 FASTCALL
6115 ExfInterlockedCompareExchange64(
6116 IN OUT LONGLONG volatile *Destination,
6117 IN PLONGLONG Exchange,
6118 IN PLONGLONG Comperand);
6119 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
6120 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
6121 #else
6122 NTKERNELAPI
6123 LONGLONG
6124 FASTCALL
6125 ExInterlockedCompareExchange64(
6126 IN OUT LONGLONG volatile *Destination,
6127 IN PLONGLONG Exchange,
6128 IN PLONGLONG Comparand,
6129 IN PKSPIN_LOCK Lock);
6130 #endif
6131
6132 NTKERNELAPI
6133 PLIST_ENTRY
6134 FASTCALL
6135 ExInterlockedInsertHeadList(
6136 IN PLIST_ENTRY ListHead,
6137 IN PLIST_ENTRY ListEntry,
6138 IN PKSPIN_LOCK Lock);
6139
6140 NTKERNELAPI
6141 PLIST_ENTRY
6142 FASTCALL
6143 ExInterlockedInsertTailList(
6144 IN PLIST_ENTRY ListHead,
6145 IN PLIST_ENTRY ListEntry,
6146 IN PKSPIN_LOCK Lock);
6147
6148 NTKERNELAPI
6149 PSINGLE_LIST_ENTRY
6150 FASTCALL
6151 ExInterlockedPopEntryList(
6152 IN PSINGLE_LIST_ENTRY ListHead,
6153 IN PKSPIN_LOCK Lock);
6154
6155 NTKERNELAPI
6156 PSINGLE_LIST_ENTRY
6157 FASTCALL
6158 ExInterlockedPushEntryList(
6159 IN PSINGLE_LIST_ENTRY ListHead,
6160 IN PSINGLE_LIST_ENTRY ListEntry,
6161 IN PKSPIN_LOCK Lock);
6162
6163 NTKERNELAPI
6164 PLIST_ENTRY
6165 FASTCALL
6166 ExInterlockedRemoveHeadList(
6167 IN PLIST_ENTRY ListHead,
6168 IN PKSPIN_LOCK Lock);
6169
6170 NTKERNELAPI
6171 BOOLEAN
6172 NTAPI
6173 ExIsProcessorFeaturePresent(
6174 IN ULONG ProcessorFeature);
6175
6176 NTKERNELAPI
6177 BOOLEAN
6178 NTAPI
6179 ExIsResourceAcquiredExclusiveLite(
6180 IN PERESOURCE Resource);
6181
6182 NTKERNELAPI
6183 ULONG
6184 NTAPI
6185 ExIsResourceAcquiredSharedLite(
6186 IN PERESOURCE Resource);
6187
6188 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
6189
6190 NTKERNELAPI
6191 VOID
6192 NTAPI
6193 ExLocalTimeToSystemTime(
6194 IN PLARGE_INTEGER LocalTime,
6195 OUT PLARGE_INTEGER SystemTime);
6196
6197 NTKERNELAPI
6198 VOID
6199 NTAPI
6200 ExNotifyCallback(
6201 IN PCALLBACK_OBJECT CallbackObject,
6202 IN PVOID Argument1,
6203 IN PVOID Argument2);
6204
6205 NTKERNELAPI
6206 VOID
6207 NTAPI
6208 ExQueueWorkItem(
6209 IN PWORK_QUEUE_ITEM WorkItem,
6210 IN WORK_QUEUE_TYPE QueueType);
6211
6212 NTKERNELAPI
6213 DECLSPEC_NORETURN
6214 VOID
6215 NTAPI
6216 ExRaiseStatus(
6217 IN NTSTATUS Status);
6218
6219 NTKERNELAPI
6220 PVOID
6221 NTAPI
6222 ExRegisterCallback(
6223 IN PCALLBACK_OBJECT CallbackObject,
6224 IN PCALLBACK_FUNCTION CallbackFunction,
6225 IN PVOID CallbackContext);
6226
6227 NTKERNELAPI
6228 NTSTATUS
6229 NTAPI
6230 ExReinitializeResourceLite(
6231 IN PERESOURCE Resource);
6232
6233 NTKERNELAPI
6234 VOID
6235 NTAPI
6236 ExReleaseResourceForThreadLite(
6237 IN PERESOURCE Resource,
6238 IN ERESOURCE_THREAD ResourceThreadId);
6239
6240 NTKERNELAPI
6241 VOID
6242 FASTCALL
6243 ExReleaseResourceLite(
6244 IN PERESOURCE Resource);
6245
6246 NTKERNELAPI
6247 VOID
6248 NTAPI
6249 ExSetResourceOwnerPointer(
6250 IN PERESOURCE Resource,
6251 IN PVOID OwnerPointer);
6252
6253 NTKERNELAPI
6254 ULONG
6255 NTAPI
6256 ExSetTimerResolution(
6257 IN ULONG DesiredTime,
6258 IN BOOLEAN SetResolution);
6259
6260 NTKERNELAPI
6261 VOID
6262 NTAPI
6263 ExSystemTimeToLocalTime(
6264 IN PLARGE_INTEGER SystemTime,
6265 OUT PLARGE_INTEGER LocalTime);
6266
6267 NTKERNELAPI
6268 VOID
6269 NTAPI
6270 ExUnregisterCallback(
6271 IN PVOID CbRegistration);
6272
6273
6274 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
6275
6276 #if (NTDDI_VERSION >= NTDDI_WINXP)
6277 NTKERNELAPI
6278 BOOLEAN
6279 FASTCALL
6280 ExAcquireRundownProtection(
6281 IN OUT PEX_RUNDOWN_REF RunRef);
6282
6283 NTKERNELAPI
6284 VOID
6285 FASTCALL
6286 ExInitializeRundownProtection(
6287 OUT PEX_RUNDOWN_REF RunRef);
6288
6289 NTKERNELAPI
6290 VOID
6291 FASTCALL
6292 ExReInitializeRundownProtection(
6293 OUT PEX_RUNDOWN_REF RunRef);
6294
6295 NTKERNELAPI
6296 VOID
6297 FASTCALL
6298 ExReleaseRundownProtection(
6299 IN OUT PEX_RUNDOWN_REF RunRef);
6300
6301 NTKERNELAPI
6302 VOID
6303 FASTCALL
6304 ExRundownCompleted(
6305 OUT PEX_RUNDOWN_REF RunRef);
6306
6307 NTKERNELAPI
6308 BOOLEAN
6309 NTAPI
6310 ExVerifySuite(
6311 IN SUITE_TYPE SuiteType);
6312
6313 NTKERNELAPI
6314 VOID
6315 FASTCALL
6316 ExWaitForRundownProtectionRelease(
6317 IN OUT PEX_RUNDOWN_REF RunRef);
6318
6319 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
6320
6321 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
6322 NTKERNELAPI
6323 BOOLEAN
6324 FASTCALL
6325 ExAcquireRundownProtectionEx(
6326 IN OUT PEX_RUNDOWN_REF RunRef,
6327 IN ULONG Count);
6328
6329 NTKERNELAPI
6330 VOID
6331 FASTCALL
6332 ExReleaseRundownProtectionEx(
6333 IN OUT PEX_RUNDOWN_REF RunRef,
6334 IN ULONG Count);
6335 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
6336
6337 #if (NTDDI_VERSION >= NTDDI_WS03)
6338
6339 #endif // (NTDDI_VERSION >= NTDDI_WS03)
6340
6341 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
6342 NTKERNELAPI
6343 PEX_RUNDOWN_REF_CACHE_AWARE
6344 ExAllocateCacheAwareRundownProtection(
6345 IN POOL_TYPE PoolType,
6346 IN ULONG PoolTag);
6347
6348 NTKERNELAPI
6349 SIZE_T
6350 ExSizeOfRundownProtectionCacheAware(VOID);
6351
6352 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
6353
6354 #if (NTDDI_VERSION >= NTDDI_VISTA)
6355 NTKERNELAPI
6356 NTSTATUS
6357 ExInitializeLookasideListEx(
6358 OUT PLOOKASIDE_LIST_EX Lookaside,
6359 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,
6360 IN PFREE_FUNCTION_EX Free OPTIONAL,
6361 IN POOL_TYPE PoolType,
6362 IN ULONG Flags,
6363 IN SIZE_T Size,
6364 IN ULONG Tag,
6365 IN USHORT Depth);
6366 #endif
6367
6368
6369 #if !defined(MIDL_PASS)
6370
6371 static __inline PVOID
6372 ExAllocateFromNPagedLookasideList(
6373 IN PNPAGED_LOOKASIDE_LIST Lookaside)
6374 {
6375 PVOID Entry;
6376
6377 Lookaside->L.TotalAllocates++;
6378 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
6379 if (Entry == NULL) {
6380 Lookaside->L.AllocateMisses++;
6381 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
6382 Lookaside->L.Size,
6383 Lookaside->L.Tag);
6384 }
6385 return Entry;
6386 }
6387
6388 static __inline PVOID
6389 ExAllocateFromPagedLookasideList(
6390 IN PPAGED_LOOKASIDE_LIST Lookaside)
6391 {
6392 PVOID Entry;
6393
6394 Lookaside->L.TotalAllocates++;
6395 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
6396 if (Entry == NULL) {
6397 Lookaside->L.AllocateMisses++;
6398 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
6399 Lookaside->L.Size,
6400 Lookaside->L.Tag);
6401 }
6402 return Entry;
6403 }
6404
6405 static __inline VOID
6406 ExFreeToNPagedLookasideList(
6407 IN PNPAGED_LOOKASIDE_LIST Lookaside,
6408 IN PVOID Entry)
6409 {
6410 Lookaside->L.TotalFrees++;
6411 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
6412 Lookaside->L.FreeMisses++;
6413 (Lookaside->L.Free)(Entry);
6414 } else {
6415 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
6416 }
6417 }
6418
6419 static __inline VOID
6420 ExFreeToPagedLookasideList(
6421 IN PPAGED_LOOKASIDE_LIST Lookaside,
6422 IN PVOID Entry)
6423 {
6424 Lookaside->L.TotalFrees++;
6425 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
6426 Lookaside->L.FreeMisses++;
6427 (Lookaside->L.Free)(Entry);
6428 } else {
6429 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
6430 }
6431 }
6432
6433
6434 #endif // !defined(MIDL_PASS)
6435
6436
6437 #ifdef __cplusplus
6438 }
6439 #endif
6440
6441 #endif // _WDMDDK_