77973798a7a1b336b4f23f2afe7c6737168fd1de
[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 DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _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 typedef PVOID PSID;
115
116 /*
117 ** Simple structures
118 */
119
120 typedef UCHAR KIRQL, *PKIRQL;
121
122 typedef enum _MODE {
123 KernelMode,
124 UserMode,
125 MaximumMode
126 } MODE;
127
128 /* Constants */
129 #define NtCurrentProcess() ( (HANDLE)(LONG_PTR) -1 )
130 #define ZwCurrentProcess() NtCurrentProcess()
131 #define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
132 #define ZwCurrentThread() NtCurrentThread()
133
134 #if (_M_IX86)
135 #define KIP0PCRADDRESS 0xffdff000
136 #endif
137
138 #if defined(_WIN64)
139 #define MAXIMUM_PROCESSORS 64
140 #else
141 #define MAXIMUM_PROCESSORS 32
142 #endif
143
144 #define MAXIMUM_WAIT_OBJECTS 64
145
146 #define EX_RUNDOWN_ACTIVE 0x1
147 #define EX_RUNDOWN_COUNT_SHIFT 0x1
148 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
149
150 #define METHOD_BUFFERED 0
151 #define METHOD_IN_DIRECT 1
152 #define METHOD_OUT_DIRECT 2
153 #define METHOD_NEITHER 3
154
155 #define LOW_PRIORITY 0
156 #define LOW_REALTIME_PRIORITY 16
157 #define HIGH_PRIORITY 31
158 #define MAXIMUM_PRIORITY 32
159
160 #define MAXIMUM_SUSPEND_COUNT MAXCHAR
161
162 #define MAXIMUM_FILENAME_LENGTH 256
163
164 #define FILE_SUPERSEDED 0x00000000
165 #define FILE_OPENED 0x00000001
166 #define FILE_CREATED 0x00000002
167 #define FILE_OVERWRITTEN 0x00000003
168 #define FILE_EXISTS 0x00000004
169 #define FILE_DOES_NOT_EXIST 0x00000005
170
171 #define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
172 #define FILE_WRITE_TO_END_OF_FILE 0xffffffff
173
174 /* also in winnt.h */
175 #define FILE_LIST_DIRECTORY 0x00000001
176 #define FILE_READ_DATA 0x00000001
177 #define FILE_ADD_FILE 0x00000002
178 #define FILE_WRITE_DATA 0x00000002
179 #define FILE_ADD_SUBDIRECTORY 0x00000004
180 #define FILE_APPEND_DATA 0x00000004
181 #define FILE_CREATE_PIPE_INSTANCE 0x00000004
182 #define FILE_READ_EA 0x00000008
183 #define FILE_WRITE_EA 0x00000010
184 #define FILE_EXECUTE 0x00000020
185 #define FILE_TRAVERSE 0x00000020
186 #define FILE_DELETE_CHILD 0x00000040
187 #define FILE_READ_ATTRIBUTES 0x00000080
188 #define FILE_WRITE_ATTRIBUTES 0x00000100
189
190 #define FILE_SHARE_READ 0x00000001
191 #define FILE_SHARE_WRITE 0x00000002
192 #define FILE_SHARE_DELETE 0x00000004
193 #define FILE_SHARE_VALID_FLAGS 0x00000007
194
195 #define FILE_ATTRIBUTE_READONLY 0x00000001
196 #define FILE_ATTRIBUTE_HIDDEN 0x00000002
197 #define FILE_ATTRIBUTE_SYSTEM 0x00000004
198 #define FILE_ATTRIBUTE_DIRECTORY 0x00000010
199 #define FILE_ATTRIBUTE_ARCHIVE 0x00000020
200 #define FILE_ATTRIBUTE_DEVICE 0x00000040
201 #define FILE_ATTRIBUTE_NORMAL 0x00000080
202 #define FILE_ATTRIBUTE_TEMPORARY 0x00000100
203 #define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200
204 #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400
205 #define FILE_ATTRIBUTE_COMPRESSED 0x00000800
206 #define FILE_ATTRIBUTE_OFFLINE 0x00001000
207 #define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000
208 #define FILE_ATTRIBUTE_ENCRYPTED 0x00004000
209
210 #define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
211 #define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
212
213 #define FILE_VALID_OPTION_FLAGS 0x00ffffff
214 #define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
215 #define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
216 #define FILE_VALID_SET_FLAGS 0x00000036
217
218 #define FILE_SUPERSEDE 0x00000000
219 #define FILE_OPEN 0x00000001
220 #define FILE_CREATE 0x00000002
221 #define FILE_OPEN_IF 0x00000003
222 #define FILE_OVERWRITE 0x00000004
223 #define FILE_OVERWRITE_IF 0x00000005
224 #define FILE_MAXIMUM_DISPOSITION 0x00000005
225
226 #define FILE_DIRECTORY_FILE 0x00000001
227 #define FILE_WRITE_THROUGH 0x00000002
228 #define FILE_SEQUENTIAL_ONLY 0x00000004
229 #define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
230 #define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
231 #define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
232 #define FILE_NON_DIRECTORY_FILE 0x00000040
233 #define FILE_CREATE_TREE_CONNECTION 0x00000080
234 #define FILE_COMPLETE_IF_OPLOCKED 0x00000100
235 #define FILE_NO_EA_KNOWLEDGE 0x00000200
236 #define FILE_OPEN_REMOTE_INSTANCE 0x00000400
237 #define FILE_RANDOM_ACCESS 0x00000800
238 #define FILE_DELETE_ON_CLOSE 0x00001000
239 #define FILE_OPEN_BY_FILE_ID 0x00002000
240 #define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
241 #define FILE_NO_COMPRESSION 0x00008000
242 #define FILE_RESERVE_OPFILTER 0x00100000
243 #define FILE_OPEN_REPARSE_POINT 0x00200000
244 #define FILE_OPEN_NO_RECALL 0x00400000
245 #define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
246
247 #define FILE_ANY_ACCESS 0x00000000
248 #define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
249 #define FILE_READ_ACCESS 0x00000001
250 #define FILE_WRITE_ACCESS 0x00000002
251
252 #define FILE_ALL_ACCESS \
253 (STANDARD_RIGHTS_REQUIRED | \
254 SYNCHRONIZE | \
255 0x1FF)
256
257 #define FILE_GENERIC_EXECUTE \
258 (STANDARD_RIGHTS_EXECUTE | \
259 FILE_READ_ATTRIBUTES | \
260 FILE_EXECUTE | \
261 SYNCHRONIZE)
262
263 #define FILE_GENERIC_READ \
264 (STANDARD_RIGHTS_READ | \
265 FILE_READ_DATA | \
266 FILE_READ_ATTRIBUTES | \
267 FILE_READ_EA | \
268 SYNCHRONIZE)
269
270 #define FILE_GENERIC_WRITE \
271 (STANDARD_RIGHTS_WRITE | \
272 FILE_WRITE_DATA | \
273 FILE_WRITE_ATTRIBUTES | \
274 FILE_WRITE_EA | \
275 FILE_APPEND_DATA | \
276 SYNCHRONIZE)
277
278 /* end winnt.h */
279
280 #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
281
282 #define OBJECT_TYPE_CREATE (0x0001)
283 #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
284
285 #define DIRECTORY_QUERY (0x0001)
286 #define DIRECTORY_TRAVERSE (0x0002)
287 #define DIRECTORY_CREATE_OBJECT (0x0004)
288 #define DIRECTORY_CREATE_SUBDIRECTORY (0x0008)
289 #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
290
291 #define EVENT_QUERY_STATE (0x0001)
292 #define EVENT_MODIFY_STATE (0x0002)
293 #define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
294
295 #define SEMAPHORE_QUERY_STATE (0x0001)
296 #define SEMAPHORE_MODIFY_STATE (0x0002)
297 #define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3)
298
299 #define FM_LOCK_BIT (0x1)
300 #define FM_LOCK_BIT_V (0x0)
301 #define FM_LOCK_WAITER_WOKEN (0x2)
302 #define FM_LOCK_WAITER_INC (0x4)
303
304 #define PROCESSOR_FEATURE_MAX 64
305
306 typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE
307 {
308 StandardDesign,
309 NEC98x86,
310 EndAlternatives
311 } ALTERNATIVE_ARCHITECTURE_TYPE;
312
313 typedef struct _KSYSTEM_TIME
314 {
315 ULONG LowPart;
316 LONG High1Time;
317 LONG High2Time;
318 } KSYSTEM_TIME, *PKSYSTEM_TIME;
319
320 /*
321 ** IRP function codes
322 */
323
324 #define IRP_MJ_CREATE 0x00
325 #define IRP_MJ_CREATE_NAMED_PIPE 0x01
326 #define IRP_MJ_CLOSE 0x02
327 #define IRP_MJ_READ 0x03
328 #define IRP_MJ_WRITE 0x04
329 #define IRP_MJ_QUERY_INFORMATION 0x05
330 #define IRP_MJ_SET_INFORMATION 0x06
331 #define IRP_MJ_QUERY_EA 0x07
332 #define IRP_MJ_SET_EA 0x08
333 #define IRP_MJ_FLUSH_BUFFERS 0x09
334 #define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
335 #define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
336 #define IRP_MJ_DIRECTORY_CONTROL 0x0c
337 #define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
338 #define IRP_MJ_DEVICE_CONTROL 0x0e
339 #define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
340 #define IRP_MJ_SCSI 0x0f
341 #define IRP_MJ_SHUTDOWN 0x10
342 #define IRP_MJ_LOCK_CONTROL 0x11
343 #define IRP_MJ_CLEANUP 0x12
344 #define IRP_MJ_CREATE_MAILSLOT 0x13
345 #define IRP_MJ_QUERY_SECURITY 0x14
346 #define IRP_MJ_SET_SECURITY 0x15
347 #define IRP_MJ_POWER 0x16
348 #define IRP_MJ_SYSTEM_CONTROL 0x17
349 #define IRP_MJ_DEVICE_CHANGE 0x18
350 #define IRP_MJ_QUERY_QUOTA 0x19
351 #define IRP_MJ_SET_QUOTA 0x1a
352 #define IRP_MJ_PNP 0x1b
353 #define IRP_MJ_PNP_POWER 0x1b
354 #define IRP_MJ_MAXIMUM_FUNCTION 0x1b
355
356 #define IRP_MN_SCSI_CLASS 0x01
357
358 #define IRP_MN_START_DEVICE 0x00
359 #define IRP_MN_QUERY_REMOVE_DEVICE 0x01
360 #define IRP_MN_REMOVE_DEVICE 0x02
361 #define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
362 #define IRP_MN_STOP_DEVICE 0x04
363 #define IRP_MN_QUERY_STOP_DEVICE 0x05
364 #define IRP_MN_CANCEL_STOP_DEVICE 0x06
365
366 #define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
367 #define IRP_MN_QUERY_INTERFACE 0x08
368 #define IRP_MN_QUERY_CAPABILITIES 0x09
369 #define IRP_MN_QUERY_RESOURCES 0x0A
370 #define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
371 #define IRP_MN_QUERY_DEVICE_TEXT 0x0C
372 #define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
373
374 #define IRP_MN_READ_CONFIG 0x0F
375 #define IRP_MN_WRITE_CONFIG 0x10
376 #define IRP_MN_EJECT 0x11
377 #define IRP_MN_SET_LOCK 0x12
378 #define IRP_MN_QUERY_ID 0x13
379 #define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
380 #define IRP_MN_QUERY_BUS_INFORMATION 0x15
381 #define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
382 #define IRP_MN_SURPRISE_REMOVAL 0x17
383
384 #define IRP_MN_WAIT_WAKE 0x00
385 #define IRP_MN_POWER_SEQUENCE 0x01
386 #define IRP_MN_SET_POWER 0x02
387 #define IRP_MN_QUERY_POWER 0x03
388
389 #define IRP_MN_QUERY_ALL_DATA 0x00
390 #define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
391 #define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
392 #define IRP_MN_CHANGE_SINGLE_ITEM 0x03
393 #define IRP_MN_ENABLE_EVENTS 0x04
394 #define IRP_MN_DISABLE_EVENTS 0x05
395 #define IRP_MN_ENABLE_COLLECTION 0x06
396 #define IRP_MN_DISABLE_COLLECTION 0x07
397 #define IRP_MN_REGINFO 0x08
398 #define IRP_MN_EXECUTE_METHOD 0x09
399
400 #define IRP_MN_REGINFO_EX 0x0b
401
402 typedef enum _IO_PAGING_PRIORITY {
403 IoPagingPriorityInvalid,
404 IoPagingPriorityNormal,
405 IoPagingPriorityHigh,
406 IoPagingPriorityReserved1,
407 IoPagingPriorityReserved2
408 } IO_PAGING_PRIORITY;
409
410 typedef enum _IO_ALLOCATION_ACTION {
411 KeepObject = 1,
412 DeallocateObject,
413 DeallocateObjectKeepRegisters
414 } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
415
416 typedef IO_ALLOCATION_ACTION
417 (DDKAPI *PDRIVER_CONTROL)(
418 IN struct _DEVICE_OBJECT *DeviceObject,
419 IN struct _IRP *Irp,
420 IN PVOID MapRegisterBase,
421 IN PVOID Context);
422
423 typedef VOID
424 (DDKAPI *PDRIVER_LIST_CONTROL)(
425 IN struct _DEVICE_OBJECT *DeviceObject,
426 IN struct _IRP *Irp,
427 IN struct _SCATTER_GATHER_LIST *ScatterGather,
428 IN PVOID Context);
429
430 typedef NTSTATUS
431 (DDKAPI DRIVER_ADD_DEVICE)(
432 IN struct _DRIVER_OBJECT *DriverObject,
433 IN struct _DEVICE_OBJECT *PhysicalDeviceObject);
434 typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
435
436 typedef NTSTATUS
437 (DDKAPI IO_COMPLETION_ROUTINE)(
438 IN struct _DEVICE_OBJECT *DeviceObject,
439 IN struct _IRP *Irp,
440 IN PVOID Context);
441 typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
442
443 typedef VOID
444 (DDKAPI DRIVER_CANCEL)(
445 IN struct _DEVICE_OBJECT *DeviceObject,
446 IN struct _IRP *Irp);
447 typedef DRIVER_CANCEL *PDRIVER_CANCEL;
448
449 typedef VOID
450 (DDKAPI *PKDEFERRED_ROUTINE)(
451 IN struct _KDPC *Dpc,
452 IN PVOID DeferredContext,
453 IN PVOID SystemArgument1,
454 IN PVOID SystemArgument2);
455
456 typedef NTSTATUS
457 (DDKAPI DRIVER_DISPATCH)(
458 IN struct _DEVICE_OBJECT *DeviceObject,
459 IN struct _IRP *Irp);
460 typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
461
462 typedef VOID
463 (DDKAPI *PIO_DPC_ROUTINE)(
464 IN struct _KDPC *Dpc,
465 IN struct _DEVICE_OBJECT *DeviceObject,
466 IN struct _IRP *Irp,
467 IN PVOID Context);
468
469 typedef NTSTATUS
470 (DDKAPI *PMM_DLL_INITIALIZE)(
471 IN PUNICODE_STRING RegistryPath);
472
473 typedef NTSTATUS
474 (DDKAPI *PMM_DLL_UNLOAD)(
475 VOID);
476
477 typedef NTSTATUS
478 (DDKAPI DRIVER_INITIALIZE)(
479 IN struct _DRIVER_OBJECT *DriverObject,
480 IN PUNICODE_STRING RegistryPath);
481 typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
482
483 typedef BOOLEAN
484 (DDKAPI KSERVICE_ROUTINE)(
485 IN struct _KINTERRUPT *Interrupt,
486 IN PVOID ServiceContext);
487 typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE;
488
489 typedef VOID
490 (DDKAPI *PIO_TIMER_ROUTINE)(
491 IN struct _DEVICE_OBJECT *DeviceObject,
492 IN PVOID Context);
493
494 typedef VOID
495 (DDKAPI DRIVER_STARTIO)(
496 IN struct _DEVICE_OBJECT *DeviceObject,
497 IN struct _IRP *Irp);
498 typedef DRIVER_STARTIO *PDRIVER_STARTIO;
499
500 typedef BOOLEAN
501 (DDKAPI *PKSYNCHRONIZE_ROUTINE)(
502 IN PVOID SynchronizeContext);
503
504 typedef VOID
505 (DDKAPI DRIVER_UNLOAD)(
506 IN struct _DRIVER_OBJECT *DriverObject);
507 typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
508
509 /*
510 ** Plug and Play structures
511 */
512
513 typedef VOID
514 (DDKAPI *PINTERFACE_REFERENCE)(
515 PVOID Context);
516
517 typedef VOID
518 (DDKAPI *PINTERFACE_DEREFERENCE)(
519 PVOID Context);
520
521 typedef BOOLEAN
522 (DDKAPI *PTRANSLATE_BUS_ADDRESS)(
523 IN PVOID Context,
524 IN PHYSICAL_ADDRESS BusAddress,
525 IN ULONG Length,
526 IN OUT PULONG AddressSpace,
527 OUT PPHYSICAL_ADDRESS TranslatedAddress);
528
529 typedef struct _DMA_ADAPTER*
530 (DDKAPI *PGET_DMA_ADAPTER)(
531 IN PVOID Context,
532 IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
533 OUT PULONG NumberOfMapRegisters);
534
535 typedef ULONG
536 (DDKAPI *PGET_SET_DEVICE_DATA)(
537 IN PVOID Context,
538 IN ULONG DataType,
539 IN PVOID Buffer,
540 IN ULONG Offset,
541 IN ULONG Length);
542
543 /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */
544 #define PCI_USE_SUBSYSTEM_IDS 0x00000001
545 #define PCI_USE_REVISION 0x00000002
546 #define PCI_USE_VENDEV_IDS 0x00000004
547 #define PCI_USE_CLASS_SUBCLASS 0x00000008
548 #define PCI_USE_PROGIF 0x00000010
549 #define PCI_USE_LOCAL_BUS 0x00000020
550 #define PCI_USE_LOCAL_DEVICE 0x00000040
551
552 typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS {
553 ULONG Size;
554 ULONG Flags;
555 USHORT VendorID;
556 USHORT DeviceID;
557 UCHAR RevisionID;
558 USHORT SubVendorID;
559 USHORT SubSystemID;
560 UCHAR BaseClass;
561 UCHAR SubClass;
562 UCHAR ProgIf;
563 } PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS;
564
565 typedef BOOLEAN
566 (DDKAPI *PPCI_IS_DEVICE_PRESENT)(
567 IN USHORT VendorID,
568 IN USHORT DeviceID,
569 IN UCHAR RevisionID,
570 IN USHORT SubVendorID,
571 IN USHORT SubSystemID,
572 IN ULONG Flags);
573
574 typedef BOOLEAN
575 (DDKAPI *PPCI_IS_DEVICE_PRESENT_EX)(
576 IN PVOID Context,
577 IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters);
578
579 typedef union _POWER_STATE {
580 SYSTEM_POWER_STATE SystemState;
581 DEVICE_POWER_STATE DeviceState;
582 } POWER_STATE, *PPOWER_STATE;
583
584 typedef enum _POWER_STATE_TYPE {
585 SystemPowerState = 0,
586 DevicePowerState
587 } POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
588
589 typedef struct _BUS_INTERFACE_STANDARD {
590 USHORT Size;
591 USHORT Version;
592 PVOID Context;
593 PINTERFACE_REFERENCE InterfaceReference;
594 PINTERFACE_DEREFERENCE InterfaceDereference;
595 PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
596 PGET_DMA_ADAPTER GetDmaAdapter;
597 PGET_SET_DEVICE_DATA SetBusData;
598 PGET_SET_DEVICE_DATA GetBusData;
599 } BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
600
601 typedef struct _PCI_DEVICE_PRESENT_INTERFACE {
602 USHORT Size;
603 USHORT Version;
604 PVOID Context;
605 PINTERFACE_REFERENCE InterfaceReference;
606 PINTERFACE_DEREFERENCE InterfaceDereference;
607 PPCI_IS_DEVICE_PRESENT IsDevicePresent;
608 PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx;
609 } PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE;
610
611 typedef struct _DEVICE_CAPABILITIES {
612 USHORT Size;
613 USHORT Version;
614 ULONG DeviceD1 : 1;
615 ULONG DeviceD2 : 1;
616 ULONG LockSupported : 1;
617 ULONG EjectSupported : 1;
618 ULONG Removable : 1;
619 ULONG DockDevice : 1;
620 ULONG UniqueID : 1;
621 ULONG SilentInstall : 1;
622 ULONG RawDeviceOK : 1;
623 ULONG SurpriseRemovalOK : 1;
624 ULONG WakeFromD0 : 1;
625 ULONG WakeFromD1 : 1;
626 ULONG WakeFromD2 : 1;
627 ULONG WakeFromD3 : 1;
628 ULONG HardwareDisabled : 1;
629 ULONG NonDynamic : 1;
630 ULONG WarmEjectSupported : 1;
631 ULONG NoDisplayInUI : 1;
632 ULONG Reserved : 14;
633 ULONG Address;
634 ULONG UINumber;
635 DEVICE_POWER_STATE DeviceState[PowerSystemMaximum];
636 SYSTEM_POWER_STATE SystemWake;
637 DEVICE_POWER_STATE DeviceWake;
638 ULONG D1Latency;
639 ULONG D2Latency;
640 ULONG D3Latency;
641 } DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
642
643 typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
644 USHORT Version;
645 USHORT Size;
646 GUID Event;
647 GUID InterfaceClassGuid;
648 PUNICODE_STRING SymbolicLinkName;
649 } DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
650
651 typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
652 USHORT Version;
653 USHORT Size;
654 GUID Event;
655 } HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
656
657 #undef INTERFACE
658
659 typedef struct _INTERFACE {
660 USHORT Size;
661 USHORT Version;
662 PVOID Context;
663 PINTERFACE_REFERENCE InterfaceReference;
664 PINTERFACE_DEREFERENCE InterfaceDereference;
665 } INTERFACE, *PINTERFACE;
666
667 typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
668 USHORT Version;
669 USHORT Size;
670 GUID Event;
671 } PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
672
673 typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
674
675 /* PNP_DEVICE_STATE */
676
677 #define PNP_DEVICE_DISABLED 0x00000001
678 #define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
679 #define PNP_DEVICE_FAILED 0x00000004
680 #define PNP_DEVICE_REMOVED 0x00000008
681 #define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
682 #define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
683
684 typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
685 USHORT Version;
686 USHORT Size;
687 GUID Event;
688 struct _FILE_OBJECT *FileObject;
689 LONG NameBufferOffset;
690 UCHAR CustomDataBuffer[1];
691 } TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
692
693 typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
694 USHORT Version;
695 USHORT Size;
696 GUID Event;
697 struct _FILE_OBJECT *FileObject;
698 } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
699
700 typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
701 DeviceUsageTypeUndefined,
702 DeviceUsageTypePaging,
703 DeviceUsageTypeHibernation,
704 DeviceUsageTypeDumpFile
705 } DEVICE_USAGE_NOTIFICATION_TYPE;
706
707 typedef struct _POWER_SEQUENCE {
708 ULONG SequenceD1;
709 ULONG SequenceD2;
710 ULONG SequenceD3;
711 } POWER_SEQUENCE, *PPOWER_SEQUENCE;
712
713 typedef enum {
714 DevicePropertyDeviceDescription = 0x0 | __string_type,
715 DevicePropertyHardwareID = 0x1 | __multiString_type,
716 DevicePropertyCompatibleIDs = 0x2 | __multiString_type,
717 DevicePropertyBootConfiguration = 0x3,
718 DevicePropertyBootConfigurationTranslated = 0x4,
719 DevicePropertyClassName = 0x5 | __string_type,
720 DevicePropertyClassGuid = 0x6 | __string_type,
721 DevicePropertyDriverKeyName = 0x7 | __string_type,
722 DevicePropertyManufacturer = 0x8 | __string_type,
723 DevicePropertyFriendlyName = 0x9 | __string_type,
724 DevicePropertyLocationInformation = 0xa | __string_type,
725 DevicePropertyPhysicalDeviceObjectName = 0xb | __string_type,
726 DevicePropertyBusTypeGuid = 0xc | __guid_type,
727 DevicePropertyLegacyBusType = 0xd,
728 DevicePropertyBusNumber = 0xe,
729 DevicePropertyEnumeratorName = 0xf | __string_type,
730 DevicePropertyAddress = 0x10,
731 DevicePropertyUINumber = 0x11,
732 DevicePropertyInstallState = 0x12,
733 DevicePropertyRemovalPolicy = 0x13,
734 DevicePropertyResourceRequirements = 0x14,
735 DevicePropertyAllocatedResources = 0x15,
736 DevicePropertyContainerID = 0x16 | __string_type
737 } DEVICE_REGISTRY_PROPERTY;
738
739 typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
740 EventCategoryReserved,
741 EventCategoryHardwareProfileChange,
742 EventCategoryDeviceInterfaceChange,
743 EventCategoryTargetDeviceChange
744 } IO_NOTIFICATION_EVENT_CATEGORY;
745
746 #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
747
748 typedef NTSTATUS
749 (DDKAPI *PDRIVER_NOTIFICATION_CALLBACK_ROUTINE)(
750 IN PVOID NotificationStructure,
751 IN PVOID Context);
752
753 typedef VOID
754 (DDKAPI *PDEVICE_CHANGE_COMPLETE_CALLBACK)(
755 IN PVOID Context);
756
757 /*
758 ** System structures
759 */
760
761 #define SYMBOLIC_LINK_QUERY 0x0001
762 #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
763
764 /* also in winnt,h */
765 #define DUPLICATE_CLOSE_SOURCE 0x00000001
766 #define DUPLICATE_SAME_ACCESS 0x00000002
767 #define DUPLICATE_SAME_ATTRIBUTES 0x00000004
768 /* end winnt.h */
769
770 typedef struct _OBJECT_NAME_INFORMATION {
771 UNICODE_STRING Name;
772 } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
773
774 typedef struct _IO_STATUS_BLOCK {
775 _ANONYMOUS_UNION union {
776 NTSTATUS Status;
777 PVOID Pointer;
778 } DUMMYUNIONNAME;
779 ULONG_PTR Information;
780 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
781
782 typedef VOID
783 (DDKAPI *PIO_APC_ROUTINE)(
784 IN PVOID ApcContext,
785 IN PIO_STATUS_BLOCK IoStatusBlock,
786 IN ULONG Reserved);
787
788 typedef VOID
789 (DDKAPI *PKNORMAL_ROUTINE)(
790 IN PVOID NormalContext,
791 IN PVOID SystemArgument1,
792 IN PVOID SystemArgument2);
793
794 typedef VOID
795 (DDKAPI *PKKERNEL_ROUTINE)(
796 IN struct _KAPC *Apc,
797 IN OUT PKNORMAL_ROUTINE *NormalRoutine,
798 IN OUT PVOID *NormalContext,
799 IN OUT PVOID *SystemArgument1,
800 IN OUT PVOID *SystemArgument2);
801
802 typedef VOID
803 (DDKAPI *PKRUNDOWN_ROUTINE)(
804 IN struct _KAPC *Apc);
805
806 typedef struct _KAPC
807 {
808 UCHAR Type;
809 UCHAR SpareByte0;
810 UCHAR Size;
811 UCHAR SpareByte1;
812 ULONG SpareLong0;
813 struct _KTHREAD *Thread;
814 LIST_ENTRY ApcListEntry;
815 PKKERNEL_ROUTINE KernelRoutine;
816 PKRUNDOWN_ROUTINE RundownRoutine;
817 PKNORMAL_ROUTINE NormalRoutine;
818 PVOID NormalContext;
819 PVOID SystemArgument1;
820 PVOID SystemArgument2;
821 CCHAR ApcStateIndex;
822 KPROCESSOR_MODE ApcMode;
823 BOOLEAN Inserted;
824 } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC;
825
826 typedef struct _KDEVICE_QUEUE_ENTRY {
827 LIST_ENTRY DeviceListEntry;
828 ULONG SortKey;
829 BOOLEAN Inserted;
830 } KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY,
831 *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
832
833 #define LOCK_QUEUE_WAIT 1
834 #define LOCK_QUEUE_OWNER 2
835
836 #if defined(_AMD64_)
837
838 typedef ULONG64 KSPIN_LOCK_QUEUE_NUMBER;
839
840 #define LockQueueUnusedSpare0 0
841 #define LockQueueExpansionLock 1
842 #define LockQueueUnusedSpare2 2
843 #define LockQueueSystemSpaceLock 3
844 #define LockQueueVacbLock 4
845 #define LockQueueMasterLock 5
846 #define LockQueueNonPagedPoolLock 6
847 #define LockQueueIoCancelLock 7
848 #define LockQueueWorkQueueLock 8
849 #define LockQueueIoVpbLock 9
850 #define LockQueueIoDatabaseLock 10
851 #define LockQueueIoCompletionLock 11
852 #define LockQueueNtfsStructLock 12
853 #define LockQueueAfdWorkQueueLock 13
854 #define LockQueueBcbLock 14
855 #define LockQueueMmNonPagedPoolLock 15
856 #define LockQueueUnusedSpare16 16
857 #define LockQueueMaximumLock (LockQueueUnusedSpare16 + 1)
858
859 #else
860
861 typedef enum _KSPIN_LOCK_QUEUE_NUMBER {
862 LockQueueUnusedSpare0,
863 LockQueueExpansionLock,
864 LockQueueUnusedSpare2,
865 LockQueueSystemSpaceLock,
866 LockQueueVacbLock,
867 LockQueueMasterLock,
868 LockQueueNonPagedPoolLock,
869 LockQueueIoCancelLock,
870 LockQueueWorkQueueLock,
871 LockQueueIoVpbLock,
872 LockQueueIoDatabaseLock,
873 LockQueueIoCompletionLock,
874 LockQueueNtfsStructLock,
875 LockQueueAfdWorkQueueLock,
876 LockQueueBcbLock,
877 LockQueueMmNonPagedPoolLock,
878 LockQueueUnusedSpare16,
879 LockQueueMaximumLock = LockQueueUnusedSpare16 + 1
880 } KSPIN_LOCK_QUEUE_NUMBER, *PKSPIN_LOCK_QUEUE_NUMBER;
881
882 #endif
883
884 typedef struct _KSPIN_LOCK_QUEUE {
885 struct _KSPIN_LOCK_QUEUE *volatile Next;
886 PKSPIN_LOCK volatile Lock;
887 } KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;
888
889 typedef struct _KLOCK_QUEUE_HANDLE {
890 KSPIN_LOCK_QUEUE LockQueue;
891 KIRQL OldIrql;
892 } KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;
893
894 #define DPC_NORMAL 0
895 #define DPC_THREADED 1
896
897 #define ASSERT_APC(Object) \
898 ASSERT((Object)->Type == ApcObject)
899
900 #define ASSERT_DPC(Object) \
901 ASSERT(((Object)->Type == 0) || \
902 ((Object)->Type == DpcObject) || \
903 ((Object)->Type == ThreadedDpcObject))
904
905 #define ASSERT_DEVICE_QUEUE(Object) \
906 ASSERT((Object)->Type == DeviceQueueObject)
907
908 typedef PVOID PKIPI_CONTEXT;
909
910 typedef
911 VOID
912 (NTAPI *PKIPI_WORKER)(
913 IN PKIPI_CONTEXT PacketContext,
914 IN PVOID Parameter1,
915 IN PVOID Parameter2,
916 IN PVOID Parameter3
917 );
918
919 typedef struct _WAIT_CONTEXT_BLOCK {
920 KDEVICE_QUEUE_ENTRY WaitQueueEntry;
921 PDRIVER_CONTROL DeviceRoutine;
922 PVOID DeviceContext;
923 ULONG NumberOfMapRegisters;
924 PVOID DeviceObject;
925 PVOID CurrentIrp;
926 PKDPC BufferChainingDpc;
927 } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
928
929 typedef struct _KDEVICE_QUEUE {
930 CSHORT Type;
931 CSHORT Size;
932 LIST_ENTRY DeviceListHead;
933 KSPIN_LOCK Lock;
934 #if defined(_AMD64_)
935 union {
936 BOOLEAN Busy;
937 struct {
938 LONG64 Reserved : 8;
939 LONG64 Hint : 56;
940 };
941 };
942 #else
943 BOOLEAN Busy;
944 #endif
945
946 } KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
947
948 typedef struct _KDPC
949 {
950 UCHAR Type;
951 UCHAR Importance;
952 volatile USHORT Number;
953 LIST_ENTRY DpcListEntry;
954 PKDEFERRED_ROUTINE DeferredRoutine;
955 PVOID DeferredContext;
956 PVOID SystemArgument1;
957 PVOID SystemArgument2;
958 volatile PVOID DpcData;
959 } KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;
960
961 typedef struct _KGATE
962 {
963 DISPATCHER_HEADER Header;
964 } KGATE, *PKGATE, *RESTRICTED_POINTER PRKGATE;
965
966 #define GM_LOCK_BIT 0x1
967 #define GM_LOCK_BIT_V 0x0
968 #define GM_LOCK_WAITER_WOKEN 0x2
969 #define GM_LOCK_WAITER_INC 0x4
970
971 typedef struct _KGUARDED_MUTEX
972 {
973 volatile LONG Count;
974 PKTHREAD Owner;
975 ULONG Contention;
976 KGATE Gate;
977 __GNU_EXTENSION union
978 {
979 __GNU_EXTENSION struct
980 {
981 SHORT KernelApcDisable;
982 SHORT SpecialApcDisable;
983 };
984 ULONG CombinedApcDisable;
985 };
986 } KGUARDED_MUTEX, *PKGUARDED_MUTEX;
987
988 typedef struct _KMUTANT {
989 DISPATCHER_HEADER Header;
990 LIST_ENTRY MutantListEntry;
991 struct _KTHREAD *RESTRICTED_POINTER OwnerThread;
992 BOOLEAN Abandoned;
993 UCHAR ApcDisable;
994 } KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;
995
996 typedef struct _KTIMER {
997 DISPATCHER_HEADER Header;
998 ULARGE_INTEGER DueTime;
999 LIST_ENTRY TimerListEntry;
1000 struct _KDPC *Dpc;
1001 #if !defined(_X86_)
1002 ULONG Processor;
1003 #endif
1004 ULONG Period;
1005 } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
1006
1007
1008 #define EVENT_INCREMENT 1
1009 #define IO_NO_INCREMENT 0
1010 #define IO_CD_ROM_INCREMENT 1
1011 #define IO_DISK_INCREMENT 1
1012 #define IO_KEYBOARD_INCREMENT 6
1013 #define IO_MAILSLOT_INCREMENT 2
1014 #define IO_MOUSE_INCREMENT 6
1015 #define IO_NAMED_PIPE_INCREMENT 2
1016 #define IO_NETWORK_INCREMENT 2
1017 #define IO_PARALLEL_INCREMENT 1
1018 #define IO_SERIAL_INCREMENT 2
1019 #define IO_SOUND_INCREMENT 8
1020 #define IO_VIDEO_INCREMENT 1
1021 #define SEMAPHORE_INCREMENT 1
1022
1023 #define MM_MAXIMUM_DISK_IO_SIZE (0x10000)
1024
1025 typedef struct _IRP {
1026 CSHORT Type;
1027 USHORT Size;
1028 struct _MDL *MdlAddress;
1029 ULONG Flags;
1030 union {
1031 struct _IRP *MasterIrp;
1032 volatile LONG IrpCount;
1033 PVOID SystemBuffer;
1034 } AssociatedIrp;
1035 LIST_ENTRY ThreadListEntry;
1036 IO_STATUS_BLOCK IoStatus;
1037 KPROCESSOR_MODE RequestorMode;
1038 BOOLEAN PendingReturned;
1039 CHAR StackCount;
1040 CHAR CurrentLocation;
1041 BOOLEAN Cancel;
1042 KIRQL CancelIrql;
1043 CCHAR ApcEnvironment;
1044 UCHAR AllocationFlags;
1045 PIO_STATUS_BLOCK UserIosb;
1046 PKEVENT UserEvent;
1047 union {
1048 struct {
1049 _ANONYMOUS_UNION union {
1050 PIO_APC_ROUTINE UserApcRoutine;
1051 PVOID IssuingProcess;
1052 } DUMMYUNIONNAME;
1053 PVOID UserApcContext;
1054 } AsynchronousParameters;
1055 LARGE_INTEGER AllocationSize;
1056 } Overlay;
1057 volatile PDRIVER_CANCEL CancelRoutine;
1058 PVOID UserBuffer;
1059 union {
1060 struct {
1061 _ANONYMOUS_UNION union {
1062 KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
1063 _ANONYMOUS_STRUCT struct {
1064 PVOID DriverContext[4];
1065 } DUMMYSTRUCTNAME;
1066 } DUMMYUNIONNAME;
1067 PETHREAD Thread;
1068 PCHAR AuxiliaryBuffer;
1069 _ANONYMOUS_STRUCT struct {
1070 LIST_ENTRY ListEntry;
1071 _ANONYMOUS_UNION union {
1072 struct _IO_STACK_LOCATION *CurrentStackLocation;
1073 ULONG PacketType;
1074 } DUMMYUNIONNAME;
1075 } DUMMYSTRUCTNAME;
1076 struct _FILE_OBJECT *OriginalFileObject;
1077 } Overlay;
1078 KAPC Apc;
1079 PVOID CompletionKey;
1080 } Tail;
1081 } IRP;
1082 typedef struct _IRP *PIRP;
1083
1084 /* IRP.Flags */
1085
1086 #define SL_FORCE_ACCESS_CHECK 0x01
1087 #define SL_OPEN_PAGING_FILE 0x02
1088 #define SL_OPEN_TARGET_DIRECTORY 0x04
1089 #define SL_CASE_SENSITIVE 0x80
1090
1091 #define SL_KEY_SPECIFIED 0x01
1092 #define SL_OVERRIDE_VERIFY_VOLUME 0x02
1093 #define SL_WRITE_THROUGH 0x04
1094 #define SL_FT_SEQUENTIAL_WRITE 0x08
1095
1096 #define SL_FAIL_IMMEDIATELY 0x01
1097 #define SL_EXCLUSIVE_LOCK 0x02
1098
1099 #define SL_RESTART_SCAN 0x01
1100 #define SL_RETURN_SINGLE_ENTRY 0x02
1101 #define SL_INDEX_SPECIFIED 0x04
1102
1103 #define SL_WATCH_TREE 0x01
1104
1105 #define SL_ALLOW_RAW_MOUNT 0x01
1106
1107 #define CTL_CODE(DeviceType, Function, Method, Access)( \
1108 ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
1109
1110 #define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
1111
1112 #define IRP_NOCACHE 0x00000001
1113 #define IRP_PAGING_IO 0x00000002
1114 #define IRP_MOUNT_COMPLETION 0x00000002
1115 #define IRP_SYNCHRONOUS_API 0x00000004
1116 #define IRP_ASSOCIATED_IRP 0x00000008
1117 #define IRP_BUFFERED_IO 0x00000010
1118 #define IRP_DEALLOCATE_BUFFER 0x00000020
1119 #define IRP_INPUT_OPERATION 0x00000040
1120 #define IRP_SYNCHRONOUS_PAGING_IO 0x00000040
1121 #define IRP_CREATE_OPERATION 0x00000080
1122 #define IRP_READ_OPERATION 0x00000100
1123 #define IRP_WRITE_OPERATION 0x00000200
1124 #define IRP_CLOSE_OPERATION 0x00000400
1125 #define IRP_DEFER_IO_COMPLETION 0x00000800
1126 #define IRP_OB_QUERY_NAME 0x00001000
1127 #define IRP_HOLD_DEVICE_QUEUE 0x00002000
1128
1129 #define IRP_QUOTA_CHARGED 0x01
1130 #define IRP_ALLOCATED_MUST_SUCCEED 0x02
1131 #define IRP_ALLOCATED_FIXED_SIZE 0x04
1132 #define IRP_LOOKASIDE_ALLOCATION 0x08
1133
1134 /* Simple types */
1135 typedef UCHAR KPROCESSOR_MODE;
1136 typedef LONG KPRIORITY;
1137 typedef PVOID PSECURITY_DESCRIPTOR;
1138 typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;
1139
1140 /* Structures not exposed to drivers */
1141 typedef struct _OBJECT_TYPE *POBJECT_TYPE;
1142 typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
1143 typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
1144 typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT;
1145 typedef struct _BUS_HANDLER *PBUS_HANDLER;
1146
1147 typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT;
1148 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
1149 typedef struct _ETHREAD *PETHREAD;
1150 typedef struct _EPROCESS *PEPROCESS;
1151 typedef struct _IO_TIMER *PIO_TIMER;
1152 typedef struct _KINTERRUPT *PKINTERRUPT;
1153 typedef struct _KPROCESS *PKPROCESS;
1154 typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
1155
1156
1157 typedef struct _CONTEXT *PCONTEXT;
1158
1159 //
1160 // Resource list definitions
1161 //
1162 typedef int CM_RESOURCE_TYPE;
1163
1164 #define CmResourceTypeNull 0
1165 #define CmResourceTypePort 1
1166 #define CmResourceTypeInterrupt 2
1167 #define CmResourceTypeMemory 3
1168 #define CmResourceTypeDma 4
1169 #define CmResourceTypeDeviceSpecific 5
1170 #define CmResourceTypeBusNumber 6
1171 #define CmResourceTypeNonArbitrated 128
1172 #define CmResourceTypeConfigData 128
1173 #define CmResourceTypeDevicePrivate 129
1174 #define CmResourceTypePcCardConfig 130
1175 #define CmResourceTypeMfCardConfig 131
1176
1177 typedef enum _INTERFACE_TYPE {
1178 InterfaceTypeUndefined = -1,
1179 Internal,
1180 Isa,
1181 Eisa,
1182 MicroChannel,
1183 TurboChannel,
1184 PCIBus,
1185 VMEBus,
1186 NuBus,
1187 PCMCIABus,
1188 CBus,
1189 MPIBus,
1190 MPSABus,
1191 ProcessorInternal,
1192 InternalPowerBus,
1193 PNPISABus,
1194 PNPBus,
1195 MaximumInterfaceType
1196 } INTERFACE_TYPE, *PINTERFACE_TYPE;
1197
1198 /* IO_RESOURCE_DESCRIPTOR.Option */
1199
1200 #define IO_RESOURCE_PREFERRED 0x01
1201 #define IO_RESOURCE_DEFAULT 0x02
1202 #define IO_RESOURCE_ALTERNATIVE 0x08
1203
1204 typedef struct _IO_RESOURCE_DESCRIPTOR {
1205 UCHAR Option;
1206 UCHAR Type;
1207 UCHAR ShareDisposition;
1208 UCHAR Spare1;
1209 USHORT Flags;
1210 USHORT Spare2;
1211 union {
1212 struct {
1213 ULONG Length;
1214 ULONG Alignment;
1215 PHYSICAL_ADDRESS MinimumAddress;
1216 PHYSICAL_ADDRESS MaximumAddress;
1217 } Port;
1218 struct {
1219 ULONG Length;
1220 ULONG Alignment;
1221 PHYSICAL_ADDRESS MinimumAddress;
1222 PHYSICAL_ADDRESS MaximumAddress;
1223 } Memory;
1224 struct {
1225 ULONG MinimumVector;
1226 ULONG MaximumVector;
1227 } Interrupt;
1228 struct {
1229 ULONG MinimumChannel;
1230 ULONG MaximumChannel;
1231 } Dma;
1232 struct {
1233 ULONG Length;
1234 ULONG Alignment;
1235 PHYSICAL_ADDRESS MinimumAddress;
1236 PHYSICAL_ADDRESS MaximumAddress;
1237 } Generic;
1238 struct {
1239 ULONG Data[3];
1240 } DevicePrivate;
1241 struct {
1242 ULONG Length;
1243 ULONG MinBusNumber;
1244 ULONG MaxBusNumber;
1245 ULONG Reserved;
1246 } BusNumber;
1247 struct {
1248 ULONG Priority;
1249 ULONG Reserved1;
1250 ULONG Reserved2;
1251 } ConfigData;
1252 } u;
1253 } IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
1254
1255 typedef struct _IO_RESOURCE_LIST {
1256 USHORT Version;
1257 USHORT Revision;
1258 ULONG Count;
1259 IO_RESOURCE_DESCRIPTOR Descriptors[1];
1260 } IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
1261
1262 typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
1263 ULONG ListSize;
1264 INTERFACE_TYPE InterfaceType;
1265 ULONG BusNumber;
1266 ULONG SlotNumber;
1267 ULONG Reserved[3];
1268 ULONG AlternativeLists;
1269 IO_RESOURCE_LIST List[1];
1270 } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
1271
1272 //
1273 // Global debug flag
1274 //
1275 extern ULONG NtGlobalFlag;
1276
1277
1278 #include <pshpack4.h>
1279 typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
1280 UCHAR Type;
1281 UCHAR ShareDisposition;
1282 USHORT Flags;
1283 union {
1284 struct {
1285 PHYSICAL_ADDRESS Start;
1286 ULONG Length;
1287 } Generic;
1288 struct {
1289 PHYSICAL_ADDRESS Start;
1290 ULONG Length;
1291 } Port;
1292 struct {
1293 ULONG Level;
1294 ULONG Vector;
1295 KAFFINITY Affinity;
1296 } Interrupt;
1297 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1298 struct {
1299 __GNU_EXTENSION union {
1300 struct {
1301 USHORT Reserved;
1302 USHORT MessageCount;
1303 ULONG Vector;
1304 KAFFINITY Affinity;
1305 } Raw;
1306 struct {
1307 ULONG Level;
1308 ULONG Vector;
1309 KAFFINITY Affinity;
1310 } Translated;
1311 };
1312 } MessageInterrupt;
1313 #endif
1314 struct {
1315 PHYSICAL_ADDRESS Start;
1316 ULONG Length;
1317 } Memory;
1318 struct {
1319 ULONG Channel;
1320 ULONG Port;
1321 ULONG Reserved1;
1322 } Dma;
1323 struct {
1324 ULONG Data[3];
1325 } DevicePrivate;
1326 struct {
1327 ULONG Start;
1328 ULONG Length;
1329 ULONG Reserved;
1330 } BusNumber;
1331 struct {
1332 ULONG DataSize;
1333 ULONG Reserved1;
1334 ULONG Reserved2;
1335 } DeviceSpecificData;
1336 #if (NTDDI_VERSION >= NTDDI_LONGHORN)
1337 struct {
1338 PHYSICAL_ADDRESS Start;
1339 ULONG Length40;
1340 } Memory40;
1341 struct {
1342 PHYSICAL_ADDRESS Start;
1343 ULONG Length48;
1344 } Memory48;
1345 struct {
1346 PHYSICAL_ADDRESS Start;
1347 ULONG Length64;
1348 } Memory64;
1349 #endif
1350 } u;
1351 } CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
1352 #include <poppack.h>
1353
1354 //
1355 // Section map options
1356 //
1357 typedef enum _SECTION_INHERIT {
1358 ViewShare = 1,
1359 ViewUnmap = 2
1360 } SECTION_INHERIT;
1361
1362 //
1363 // Section access rights
1364 //
1365 #define SECTION_QUERY 0x0001
1366 #define SECTION_MAP_WRITE 0x0002
1367 #define SECTION_MAP_READ 0x0004
1368 #define SECTION_MAP_EXECUTE 0x0008
1369 #define SECTION_EXTEND_SIZE 0x0010
1370 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
1371
1372 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
1373 SECTION_MAP_WRITE | \
1374 SECTION_MAP_READ | \
1375 SECTION_MAP_EXECUTE | \
1376 SECTION_EXTEND_SIZE)
1377
1378 #define SESSION_QUERY_ACCESS 0x0001
1379 #define SESSION_MODIFY_ACCESS 0x0002
1380
1381 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
1382 SESSION_QUERY_ACCESS | \
1383 SESSION_MODIFY_ACCESS)
1384
1385
1386
1387 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
1388
1389 #define PAGE_NOACCESS 0x01
1390 #define PAGE_READONLY 0x02
1391 #define PAGE_READWRITE 0x04
1392 #define PAGE_WRITECOPY 0x08
1393 #define PAGE_EXECUTE 0x10
1394 #define PAGE_EXECUTE_READ 0x20
1395 #define PAGE_EXECUTE_READWRITE 0x40
1396 #define PAGE_EXECUTE_WRITECOPY 0x80
1397 #define PAGE_GUARD 0x100
1398 #define PAGE_NOCACHE 0x200
1399 #define PAGE_WRITECOMBINE 0x400
1400
1401 #define MEM_COMMIT 0x1000
1402 #define MEM_RESERVE 0x2000
1403 #define MEM_DECOMMIT 0x4000
1404 #define MEM_RELEASE 0x8000
1405 #define MEM_FREE 0x10000
1406 #define MEM_PRIVATE 0x20000
1407 #define MEM_MAPPED 0x40000
1408 #define MEM_RESET 0x80000
1409 #define MEM_TOP_DOWN 0x100000
1410 #define MEM_LARGE_PAGES 0x20000000
1411 #define MEM_4MB_PAGES 0x80000000
1412
1413 #define SEC_RESERVE 0x4000000
1414 #define SEC_LARGE_PAGES 0x80000000
1415
1416 #define PROCESS_DUP_HANDLE (0x0040)
1417
1418 #if (NTDDI_VERSION >= NTDDI_VISTA)
1419 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
1420 0xFFFF)
1421 #else
1422 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
1423 0xFFF)
1424 #endif
1425
1426
1427
1428 //
1429 // Processor features
1430 //
1431 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
1432 #define PF_FLOATING_POINT_EMULATED 1
1433 #define PF_COMPARE_EXCHANGE_DOUBLE 2
1434 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
1435 #define PF_PPC_MOVEMEM_64BIT_OK 4
1436 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
1437 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
1438 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
1439 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
1440 #define PF_PAE_ENABLED 9
1441 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
1442 #define PF_SSE_DAZ_MODE_AVAILABLE 11
1443 #define PF_NX_ENABLED 12
1444 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
1445 #define PF_COMPARE_EXCHANGE128 14
1446 #define PF_COMPARE64_EXCHANGE128 15
1447 #define PF_CHANNELS_ENABLED 16
1448
1449
1450
1451 //
1452 // Intrinsics (note: taken from our winnt.h)
1453 // FIXME: 64-bit
1454 //
1455 #if defined(__GNUC__)
1456
1457 static __inline__ BOOLEAN
1458 InterlockedBitTestAndSet(IN LONG volatile *Base,
1459 IN LONG Bit)
1460 {
1461 #if defined(_M_IX86)
1462 LONG OldBit;
1463 __asm__ __volatile__("lock "
1464 "btsl %2,%1\n\t"
1465 "sbbl %0,%0\n\t"
1466 :"=r" (OldBit),"+m" (*Base)
1467 :"Ir" (Bit)
1468 : "memory");
1469 return OldBit;
1470 #else
1471 return (_InterlockedOr(Base, 1 << Bit) >> Bit) & 1;
1472 #endif
1473 }
1474
1475 static __inline__ BOOLEAN
1476 InterlockedBitTestAndReset(IN LONG volatile *Base,
1477 IN LONG Bit)
1478 {
1479 #if defined(_M_IX86)
1480 LONG OldBit;
1481 __asm__ __volatile__("lock "
1482 "btrl %2,%1\n\t"
1483 "sbbl %0,%0\n\t"
1484 :"=r" (OldBit),"+m" (*Base)
1485 :"Ir" (Bit)
1486 : "memory");
1487 return OldBit;
1488 #else
1489 return (_InterlockedAnd(Base, ~(1 << Bit)) >> Bit) & 1;
1490 #endif
1491 }
1492
1493 #endif
1494
1495 #define BitScanForward _BitScanForward
1496 #define BitScanReverse _BitScanReverse
1497
1498 #define BitTest _bittest
1499 #define BitTestAndComplement _bittestandcomplement
1500 #define BitTestAndSet _bittestandset
1501 #define BitTestAndReset _bittestandreset
1502 #define InterlockedBitTestAndSet _interlockedbittestandset
1503 #define InterlockedBitTestAndReset _interlockedbittestandreset
1504
1505
1506 /** INTERLOCKED FUNCTIONS *****************************************************/
1507
1508 #if !defined(__INTERLOCKED_DECLARED)
1509 #define __INTERLOCKED_DECLARED
1510
1511 #if defined (_X86_)
1512 #if defined(NO_INTERLOCKED_INTRINSICS)
1513 NTKERNELAPI
1514 LONG
1515 FASTCALL
1516 InterlockedIncrement(
1517 IN OUT LONG volatile *Addend);
1518
1519 NTKERNELAPI
1520 LONG
1521 FASTCALL
1522 InterlockedDecrement(
1523 IN OUT LONG volatile *Addend);
1524
1525 NTKERNELAPI
1526 LONG
1527 FASTCALL
1528 InterlockedCompareExchange(
1529 IN OUT LONG volatile *Destination,
1530 IN LONG Exchange,
1531 IN LONG Comparand);
1532
1533 NTKERNELAPI
1534 LONG
1535 FASTCALL
1536 InterlockedExchange(
1537 IN OUT LONG volatile *Destination,
1538 IN LONG Value);
1539
1540 NTKERNELAPI
1541 LONG
1542 FASTCALL
1543 InterlockedExchangeAdd(
1544 IN OUT LONG volatile *Addend,
1545 IN LONG Value);
1546
1547 #else // !defined(NO_INTERLOCKED_INTRINSICS)
1548
1549 #define InterlockedExchange _InterlockedExchange
1550 #define InterlockedIncrement _InterlockedIncrement
1551 #define InterlockedDecrement _InterlockedDecrement
1552 #define InterlockedExchangeAdd _InterlockedExchangeAdd
1553 #define InterlockedCompareExchange _InterlockedCompareExchange
1554 #define InterlockedOr _InterlockedOr
1555 #define InterlockedAnd _InterlockedAnd
1556 #define InterlockedXor _InterlockedXor
1557
1558 #endif // !defined(NO_INTERLOCKED_INTRINSICS)
1559
1560 #endif // defined (_X86_)
1561
1562 #if !defined (_WIN64)
1563 /*
1564 * PVOID
1565 * InterlockedExchangePointer(
1566 * IN OUT PVOID volatile *Target,
1567 * IN PVOID Value)
1568 */
1569 #define InterlockedExchangePointer(Target, Value) \
1570 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
1571
1572 /*
1573 * PVOID
1574 * InterlockedCompareExchangePointer(
1575 * IN OUT PVOID *Destination,
1576 * IN PVOID Exchange,
1577 * IN PVOID Comparand)
1578 */
1579 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
1580 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
1581
1582 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
1583 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
1584 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
1585
1586 #endif // !defined (_WIN64)
1587
1588 #if defined (_M_AMD64)
1589
1590 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
1591 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
1592 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
1593 #define InterlockedAnd _InterlockedAnd
1594 #define InterlockedOr _InterlockedOr
1595 #define InterlockedXor _InterlockedXor
1596 #define InterlockedIncrement _InterlockedIncrement
1597 #define InterlockedDecrement _InterlockedDecrement
1598 #define InterlockedAdd _InterlockedAdd
1599 #define InterlockedExchange _InterlockedExchange
1600 #define InterlockedExchangeAdd _InterlockedExchangeAdd
1601 #define InterlockedCompareExchange _InterlockedCompareExchange
1602 #define InterlockedAnd64 _InterlockedAnd64
1603 #define InterlockedOr64 _InterlockedOr64
1604 #define InterlockedXor64 _InterlockedXor64
1605 #define InterlockedIncrement64 _InterlockedIncrement64
1606 #define InterlockedDecrement64 _InterlockedDecrement64
1607 #define InterlockedAdd64 _InterlockedAdd64
1608 #define InterlockedExchange64 _InterlockedExchange64
1609 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
1610 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
1611 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
1612 #define InterlockedExchangePointer _InterlockedExchangePointer
1613 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
1614 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
1615
1616 #endif // _M_AMD64
1617
1618 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
1619 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
1620 FORCEINLINE
1621 LONG64
1622 InterlockedAdd64(
1623 IN OUT LONG64 volatile *Addend,
1624 IN LONG64 Value)
1625 {
1626 return InterlockedExchangeAdd64(Addend, Value) + Value;
1627 }
1628 //#endif
1629 #endif
1630
1631 #endif /* !__INTERLOCKED_DECLARED */
1632
1633 #if defined(_M_IX86)
1634 #define YieldProcessor _mm_pause
1635 #elif defined (_M_AMD64)
1636 #define YieldProcessor _mm_pause
1637 #elif defined(_M_PPC)
1638 #define YieldProcessor() __asm__ __volatile__("nop");
1639 #elif defined(_M_MIPS)
1640 #define YieldProcessor() __asm__ __volatile__("nop");
1641 #elif defined(_M_ARM)
1642 #define YieldProcessor()
1643 #else
1644 #error Unknown architecture
1645 #endif
1646
1647
1648
1649 //
1650 // Slist Header
1651 //
1652 #ifndef _SLIST_HEADER_
1653 #define _SLIST_HEADER_
1654
1655 #if defined(_WIN64)
1656 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY *PSLIST_ENTRY;
1657 typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY {
1658 PSLIST_ENTRY Next;
1659 } SLIST_ENTRY;
1660 typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
1661 struct {
1662 ULONGLONG Alignment;
1663 ULONGLONG Region;
1664 } DUMMYSTRUCTNAME;
1665 struct {
1666 ULONGLONG Depth:16;
1667 ULONGLONG Sequence:9;
1668 ULONGLONG NextEntry:39;
1669 ULONGLONG HeaderType:1;
1670 ULONGLONG Init:1;
1671 ULONGLONG Reserved:59;
1672 ULONGLONG Region:3;
1673 } Header8;
1674 struct {
1675 ULONGLONG Depth:16;
1676 ULONGLONG Sequence:48;
1677 ULONGLONG HeaderType:1;
1678 ULONGLONG Init:1;
1679 ULONGLONG Reserved:2;
1680 ULONGLONG NextEntry:60;
1681 } Header16;
1682 } SLIST_HEADER, *PSLIST_HEADER;
1683 #else
1684 #define SLIST_ENTRY SINGLE_LIST_ENTRY
1685 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
1686 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
1687 typedef union _SLIST_HEADER {
1688 ULONGLONG Alignment;
1689 struct {
1690 SLIST_ENTRY Next;
1691 USHORT Depth;
1692 USHORT Sequence;
1693 } DUMMYSTRUCTNAME;
1694 } SLIST_HEADER, *PSLIST_HEADER;
1695 #endif
1696
1697 #endif /* _SLIST_HEADER_ */
1698
1699
1700
1701 //
1702 // Power States/Levels
1703 //
1704 typedef enum _SYSTEM_POWER_STATE {
1705 PowerSystemUnspecified,
1706 PowerSystemWorking,
1707 PowerSystemSleeping1,
1708 PowerSystemSleeping2,
1709 PowerSystemSleeping3,
1710 PowerSystemHibernate,
1711 PowerSystemShutdown,
1712 PowerSystemMaximum
1713 } SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
1714
1715 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
1716
1717 typedef enum _POWER_INFORMATION_LEVEL {
1718 SystemPowerPolicyAc,
1719 SystemPowerPolicyDc,
1720 VerifySystemPolicyAc,
1721 VerifySystemPolicyDc,
1722 SystemPowerCapabilities,
1723 SystemBatteryState,
1724 SystemPowerStateHandler,
1725 ProcessorStateHandler,
1726 SystemPowerPolicyCurrent,
1727 AdministratorPowerPolicy,
1728 SystemReserveHiberFile,
1729 ProcessorInformation,
1730 SystemPowerInformation,
1731 ProcessorStateHandler2,
1732 LastWakeTime,
1733 LastSleepTime,
1734 SystemExecutionState,
1735 SystemPowerStateNotifyHandler,
1736 ProcessorPowerPolicyAc,
1737 ProcessorPowerPolicyDc,
1738 VerifyProcessorPowerPolicyAc,
1739 VerifyProcessorPowerPolicyDc,
1740 ProcessorPowerPolicyCurrent
1741 } POWER_INFORMATION_LEVEL;
1742
1743 typedef enum {
1744 PowerActionNone,
1745 PowerActionReserved,
1746 PowerActionSleep,
1747 PowerActionHibernate,
1748 PowerActionShutdown,
1749 PowerActionShutdownReset,
1750 PowerActionShutdownOff,
1751 PowerActionWarmEject
1752 } POWER_ACTION, *PPOWER_ACTION;
1753
1754 typedef enum _DEVICE_POWER_STATE {
1755 PowerDeviceUnspecified,
1756 PowerDeviceD0,
1757 PowerDeviceD1,
1758 PowerDeviceD2,
1759 PowerDeviceD3,
1760 PowerDeviceMaximum
1761 } DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
1762
1763 #define ES_SYSTEM_REQUIRED 0x00000001
1764 #define ES_DISPLAY_REQUIRED 0x00000002
1765 #define ES_USER_PRESENT 0x00000004
1766 #define ES_CONTINUOUS 0x80000000
1767
1768 typedef ULONG EXECUTION_STATE;
1769
1770 typedef enum {
1771 LT_DONT_CARE,
1772 LT_LOWEST_LATENCY
1773 } LATENCY_TIME;
1774
1775
1776
1777 //
1778 // Access/Security Stuff
1779 //
1780 typedef ULONG ACCESS_MASK, *PACCESS_MASK;
1781 typedef PVOID PACCESS_TOKEN;
1782
1783 #define DELETE 0x00010000L
1784 #define READ_CONTROL 0x00020000L
1785 #define WRITE_DAC 0x00040000L
1786 #define WRITE_OWNER 0x00080000L
1787 #define SYNCHRONIZE 0x00100000L
1788 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
1789 #define STANDARD_RIGHTS_READ READ_CONTROL
1790 #define STANDARD_RIGHTS_WRITE READ_CONTROL
1791 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
1792 #define STANDARD_RIGHTS_ALL 0x001F0000L
1793 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
1794 #define ACCESS_SYSTEM_SECURITY 0x01000000L
1795 #define MAXIMUM_ALLOWED 0x02000000L
1796 #define GENERIC_READ 0x80000000L
1797 #define GENERIC_WRITE 0x40000000L
1798 #define GENERIC_EXECUTE 0x20000000L
1799 #define GENERIC_ALL 0x10000000L
1800
1801 typedef struct _GENERIC_MAPPING {
1802 ACCESS_MASK GenericRead;
1803 ACCESS_MASK GenericWrite;
1804 ACCESS_MASK GenericExecute;
1805 ACCESS_MASK GenericAll;
1806 } GENERIC_MAPPING, *PGENERIC_MAPPING;
1807
1808 #define ACL_REVISION 2
1809 #define ACL_REVISION_DS 4
1810
1811 #define ACL_REVISION1 1
1812 #define ACL_REVISION2 2
1813 #define ACL_REVISION3 3
1814 #define ACL_REVISION4 4
1815 #define MIN_ACL_REVISION ACL_REVISION2
1816 #define MAX_ACL_REVISION ACL_REVISION4
1817
1818 typedef struct _ACL {
1819 UCHAR AclRevision;
1820 UCHAR Sbz1;
1821 USHORT AclSize;
1822 USHORT AceCount;
1823 USHORT Sbz2;
1824 } ACL, *PACL;
1825
1826
1827
1828 //
1829 // Current security descriptor revision value
1830 //
1831 #define SECURITY_DESCRIPTOR_REVISION (1)
1832 #define SECURITY_DESCRIPTOR_REVISION1 (1)
1833
1834 //
1835 // Privilege attributes
1836 //
1837 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
1838 #define SE_PRIVILEGE_ENABLED (0x00000002L)
1839 #define SE_PRIVILEGE_REMOVED (0X00000004L)
1840 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
1841
1842 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
1843 SE_PRIVILEGE_ENABLED | \
1844 SE_PRIVILEGE_REMOVED | \
1845 SE_PRIVILEGE_USED_FOR_ACCESS)
1846
1847 #include <pshpack4.h>
1848 typedef struct _LUID_AND_ATTRIBUTES {
1849 LUID Luid;
1850 ULONG Attributes;
1851 } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
1852 #include <poppack.h>
1853 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
1854 typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
1855
1856
1857
1858 //
1859 // Privilege sets
1860 //
1861 #define PRIVILEGE_SET_ALL_NECESSARY (1)
1862
1863 typedef struct _PRIVILEGE_SET {
1864 ULONG PrivilegeCount;
1865 ULONG Control;
1866 LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
1867 } PRIVILEGE_SET,*PPRIVILEGE_SET;
1868
1869 typedef enum _SECURITY_IMPERSONATION_LEVEL {
1870 SecurityAnonymous,
1871 SecurityIdentification,
1872 SecurityImpersonation,
1873 SecurityDelegation
1874 } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
1875
1876 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
1877 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
1878 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
1879 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
1880
1881 #define SECURITY_DYNAMIC_TRACKING (TRUE)
1882 #define SECURITY_STATIC_TRACKING (FALSE)
1883
1884 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE;
1885
1886 typedef struct _SECURITY_QUALITY_OF_SERVICE {
1887 ULONG Length;
1888 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
1889 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
1890 BOOLEAN EffectiveOnly;
1891 } SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
1892
1893 typedef struct _SE_IMPERSONATION_STATE {
1894 PACCESS_TOKEN Token;
1895 BOOLEAN CopyOnOpen;
1896 BOOLEAN EffectiveOnly;
1897 SECURITY_IMPERSONATION_LEVEL Level;
1898 } SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
1899
1900 #define OWNER_SECURITY_INFORMATION (0x00000001L)
1901 #define GROUP_SECURITY_INFORMATION (0x00000002L)
1902 #define DACL_SECURITY_INFORMATION (0x00000004L)
1903 #define SACL_SECURITY_INFORMATION (0x00000008L)
1904 #define LABEL_SECURITY_INFORMATION (0x00000010L)
1905
1906 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
1907 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
1908 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
1909 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
1910
1911
1912
1913 //
1914 // Registry Access Rights
1915 //
1916 #define KEY_QUERY_VALUE (0x0001)
1917 #define KEY_SET_VALUE (0x0002)
1918 #define KEY_CREATE_SUB_KEY (0x0004)
1919 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
1920 #define KEY_NOTIFY (0x0010)
1921 #define KEY_CREATE_LINK (0x0020)
1922 #define KEY_WOW64_32KEY (0x0200)
1923 #define KEY_WOW64_64KEY (0x0100)
1924 #define KEY_WOW64_RES (0x0300)
1925
1926 #define KEY_READ ((STANDARD_RIGHTS_READ |\
1927 KEY_QUERY_VALUE |\
1928 KEY_ENUMERATE_SUB_KEYS |\
1929 KEY_NOTIFY) \
1930 & \
1931 (~SYNCHRONIZE))
1932
1933 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
1934 KEY_SET_VALUE |\
1935 KEY_CREATE_SUB_KEY) \
1936 & \
1937 (~SYNCHRONIZE))
1938
1939 #define KEY_EXECUTE ((KEY_READ) \
1940 & \
1941 (~SYNCHRONIZE))
1942
1943 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
1944 KEY_QUERY_VALUE |\
1945 KEY_SET_VALUE |\
1946 KEY_CREATE_SUB_KEY |\
1947 KEY_ENUMERATE_SUB_KEYS |\
1948 KEY_NOTIFY |\
1949 KEY_CREATE_LINK) \
1950 & \
1951 (~SYNCHRONIZE))
1952
1953 //
1954 // Registry Open/Create Options
1955 //
1956 #define REG_OPTION_RESERVED (0x00000000L)
1957 #define REG_OPTION_NON_VOLATILE (0x00000000L)
1958 #define REG_OPTION_VOLATILE (0x00000001L)
1959 #define REG_OPTION_CREATE_LINK (0x00000002L)
1960 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
1961 #define REG_OPTION_OPEN_LINK (0x00000008L)
1962
1963 #define REG_LEGAL_OPTION \
1964 (REG_OPTION_RESERVED |\
1965 REG_OPTION_NON_VOLATILE |\
1966 REG_OPTION_VOLATILE |\
1967 REG_OPTION_CREATE_LINK |\
1968 REG_OPTION_BACKUP_RESTORE |\
1969 REG_OPTION_OPEN_LINK)
1970
1971 //
1972 // Key creation/open disposition
1973 //
1974 #define REG_CREATED_NEW_KEY (0x00000001L)
1975 #define REG_OPENED_EXISTING_KEY (0x00000002L)
1976
1977 //
1978 // Key restore & hive load flags
1979 //
1980 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
1981 #define REG_REFRESH_HIVE (0x00000002L)
1982 #define REG_NO_LAZY_FLUSH (0x00000004L)
1983 #define REG_FORCE_RESTORE (0x00000008L)
1984 #define REG_APP_HIVE (0x00000010L)
1985 #define REG_PROCESS_PRIVATE (0x00000020L)
1986 #define REG_START_JOURNAL (0x00000040L)
1987 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
1988 #define REG_HIVE_NO_RM (0x00000100L)
1989 #define REG_HIVE_SINGLE_LOG (0x00000200L)
1990
1991 //
1992 // Unload Flags
1993 //
1994 #define REG_FORCE_UNLOAD 1
1995
1996 //
1997 // Notify Filter Values
1998 //
1999 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
2000 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
2001 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
2002 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
2003
2004 #define REG_LEGAL_CHANGE_FILTER \
2005 (REG_NOTIFY_CHANGE_NAME |\
2006 REG_NOTIFY_CHANGE_ATTRIBUTES |\
2007 REG_NOTIFY_CHANGE_LAST_SET |\
2008 REG_NOTIFY_CHANGE_SECURITY)
2009
2010
2011
2012 //
2013 // Thread Access Rights
2014 //
2015 #define THREAD_TERMINATE (0x0001)
2016 #define THREAD_SUSPEND_RESUME (0x0002)
2017 #define THREAD_ALERT (0x0004)
2018 #define THREAD_GET_CONTEXT (0x0008)
2019 #define THREAD_SET_CONTEXT (0x0010)
2020 #define THREAD_SET_INFORMATION (0x0020)
2021 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
2022 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
2023 #if (NTDDI_VERSION >= NTDDI_VISTA)
2024 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
2025 0xFFFF)
2026 #else
2027 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
2028 0x3FF)
2029 #endif
2030
2031 //
2032 // Service Start Types
2033 //
2034 #define SERVICE_BOOT_START 0x00000000
2035 #define SERVICE_SYSTEM_START 0x00000001
2036 #define SERVICE_AUTO_START 0x00000002
2037 #define SERVICE_DEMAND_START 0x00000003
2038 #define SERVICE_DISABLED 0x00000004
2039
2040 //
2041 // Exception Records
2042 //
2043 #define EXCEPTION_NONCONTINUABLE 1
2044 #define EXCEPTION_MAXIMUM_PARAMETERS 15
2045
2046 typedef struct _EXCEPTION_RECORD {
2047 NTSTATUS ExceptionCode;
2048 ULONG ExceptionFlags;
2049 struct _EXCEPTION_RECORD *ExceptionRecord;
2050 PVOID ExceptionAddress;
2051 ULONG NumberParameters;
2052 ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
2053 } EXCEPTION_RECORD, *PEXCEPTION_RECORD;
2054
2055 typedef struct _EXCEPTION_RECORD32 {
2056 NTSTATUS ExceptionCode;
2057 ULONG ExceptionFlags;
2058 ULONG ExceptionRecord;
2059 ULONG ExceptionAddress;
2060 ULONG NumberParameters;
2061 ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
2062 } EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
2063
2064 typedef struct _EXCEPTION_RECORD64 {
2065 NTSTATUS ExceptionCode;
2066 ULONG ExceptionFlags;
2067 ULONG64 ExceptionRecord;
2068 ULONG64 ExceptionAddress;
2069 ULONG NumberParameters;
2070 ULONG __unusedAlignment;
2071 ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
2072 } EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
2073
2074 typedef struct _EXCEPTION_POINTERS {
2075 PEXCEPTION_RECORD ExceptionRecord;
2076 PCONTEXT ContextRecord;
2077 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
2078
2079
2080
2081 //
2082 // Process Qoutas
2083 //
2084 typedef struct _QUOTA_LIMITS {
2085 SIZE_T PagedPoolLimit;
2086 SIZE_T NonPagedPoolLimit;
2087 SIZE_T MinimumWorkingSetSize;
2088 SIZE_T MaximumWorkingSetSize;
2089 SIZE_T PagefileLimit;
2090 LARGE_INTEGER TimeLimit;
2091 } QUOTA_LIMITS, *PQUOTA_LIMITS;
2092
2093 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
2094 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
2095 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
2096 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
2097 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
2098
2099
2100 /******************************************************************************
2101 * WINBASE Functions *
2102 ******************************************************************************/
2103 #if !defined(_WINBASE_)
2104
2105 #if defined(_WIN64)
2106
2107 #define InterlockedPopEntrySList(Head) \
2108 ExpInterlockedPopEntrySList(Head)
2109
2110 #define InterlockedPushEntrySList(Head, Entry) \
2111 ExpInterlockedPushEntrySList(Head, Entry)
2112
2113 #define InterlockedFlushSList(Head) \
2114 ExpInterlockedFlushSList(Head)
2115
2116 #define QueryDepthSList(Head) \
2117 ExQueryDepthSList(Head)
2118
2119 #else // !defined(_WIN64)
2120
2121 NTKERNELAPI
2122 PSLIST_ENTRY
2123 FASTCALL
2124 InterlockedPopEntrySList(
2125 IN PSLIST_HEADER ListHead);
2126
2127 NTKERNELAPI
2128 PSLIST_ENTRY
2129 FASTCALL
2130 InterlockedPushEntrySList(
2131 IN PSLIST_HEADER ListHead,
2132 IN PSLIST_ENTRY ListEntry);
2133
2134 #define InterlockedFlushSList(ListHead) \
2135 ExInterlockedFlushSList(ListHead)
2136
2137 #define QueryDepthSList(Head) \
2138 ExQueryDepthSList(Head)
2139
2140 #endif // !defined(_WIN64)
2141
2142 #endif // !defined(_WINBASE_)
2143
2144
2145 /******************************************************************************
2146 * Kernel Types *
2147 ******************************************************************************/
2148
2149 typedef struct _DISPATCHER_HEADER
2150 {
2151 __GNU_EXTENSION union
2152 {
2153 __GNU_EXTENSION struct
2154 {
2155 UCHAR Type;
2156 __GNU_EXTENSION union
2157 {
2158 UCHAR Absolute;
2159 UCHAR NpxIrql;
2160 };
2161 __GNU_EXTENSION union
2162 {
2163 UCHAR Size;
2164 UCHAR Hand;
2165 };
2166 __GNU_EXTENSION union
2167 {
2168 UCHAR Inserted;
2169 BOOLEAN DebugActive;
2170 };
2171 };
2172 volatile LONG Lock;
2173 };
2174 LONG SignalState;
2175 LIST_ENTRY WaitListHead;
2176 } DISPATCHER_HEADER, *PDISPATCHER_HEADER;
2177
2178 typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
2179
2180 typedef struct _KEVENT {
2181 DISPATCHER_HEADER Header;
2182 } KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
2183
2184 typedef struct _KSEMAPHORE {
2185 DISPATCHER_HEADER Header;
2186 LONG Limit;
2187 } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
2188
2189 /******************************************************************************
2190 * RTL Types *
2191 ******************************************************************************/
2192
2193 #define RTL_REGISTRY_ABSOLUTE 0
2194 #define RTL_REGISTRY_SERVICES 1
2195 #define RTL_REGISTRY_CONTROL 2
2196 #define RTL_REGISTRY_WINDOWS_NT 3
2197 #define RTL_REGISTRY_DEVICEMAP 4
2198 #define RTL_REGISTRY_USER 5
2199 #define RTL_REGISTRY_MAXIMUM 6
2200 #define RTL_REGISTRY_HANDLE 0x40000000
2201 #define RTL_REGISTRY_OPTIONAL 0x80000000
2202
2203 /* RTL_QUERY_REGISTRY_TABLE.Flags */
2204 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
2205 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
2206 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
2207 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
2208 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
2209 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
2210 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
2211
2212 typedef struct _RTL_BITMAP {
2213 ULONG SizeOfBitMap;
2214 PULONG Buffer;
2215 } RTL_BITMAP, *PRTL_BITMAP;
2216
2217 typedef struct _RTL_BITMAP_RUN {
2218 ULONG StartingIndex;
2219 ULONG NumberOfBits;
2220 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
2221
2222 typedef NTSTATUS
2223 (DDKAPI *PRTL_QUERY_REGISTRY_ROUTINE)(
2224 IN PWSTR ValueName,
2225 IN ULONG ValueType,
2226 IN PVOID ValueData,
2227 IN ULONG ValueLength,
2228 IN PVOID Context,
2229 IN PVOID EntryContext);
2230
2231 typedef struct _RTL_QUERY_REGISTRY_TABLE {
2232 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
2233 ULONG Flags;
2234 PCWSTR Name;
2235 PVOID EntryContext;
2236 ULONG DefaultType;
2237 PVOID DefaultData;
2238 ULONG DefaultLength;
2239 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
2240
2241 typedef struct _TIME_FIELDS {
2242 CSHORT Year;
2243 CSHORT Month;
2244 CSHORT Day;
2245 CSHORT Hour;
2246 CSHORT Minute;
2247 CSHORT Second;
2248 CSHORT Milliseconds;
2249 CSHORT Weekday;
2250 } TIME_FIELDS, *PTIME_FIELDS;
2251
2252
2253 /******************************************************************************
2254 * RTL Functions *
2255 ******************************************************************************/
2256
2257 NTSYSAPI
2258 VOID
2259 NTAPI
2260 RtlAssert(
2261 IN PVOID FailedAssertion,
2262 IN PVOID FileName,
2263 IN ULONG LineNumber,
2264 IN PCHAR Message);
2265
2266 /* VOID
2267 * RtlCopyMemory(
2268 * IN VOID UNALIGNED *Destination,
2269 * IN CONST VOID UNALIGNED *Source,
2270 * IN SIZE_T Length)
2271 */
2272 #define RtlCopyMemory(Destination, Source, Length) \
2273 memcpy(Destination, Source, Length)
2274
2275 #define RtlCopyBytes RtlCopyMemory
2276
2277 #if defined(_M_AMD64)
2278 NTSYSAPI
2279 VOID
2280 NTAPI
2281 RtlCopyMemoryNonTemporal(
2282 VOID UNALIGNED *Destination,
2283 CONST VOID UNALIGNED *Source,
2284 SIZE_T Length);
2285 #else
2286 #define RtlCopyMemoryNonTemporal RtlCopyMemory
2287 #endif
2288
2289 /* BOOLEAN
2290 * RtlEqualLuid(
2291 * IN PLUID Luid1,
2292 * IN PLUID Luid2)
2293 */
2294 #define RtlEqualLuid(Luid1, Luid2) \
2295 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
2296
2297 /* ULONG
2298 * RtlEqualMemory(
2299 * IN VOID UNALIGNED *Destination,
2300 * IN CONST VOID UNALIGNED *Source,
2301 * IN SIZE_T Length)
2302 */
2303 #define RtlEqualMemory(Destination, Source, Length) \
2304 (!memcmp(Destination, Source, Length))
2305
2306 /* VOID
2307 * RtlFillMemory(
2308 * IN VOID UNALIGNED *Destination,
2309 * IN SIZE_T Length,
2310 * IN UCHAR Fill)
2311 */
2312 #define RtlFillMemory(Destination, Length, Fill) \
2313 memset(Destination, Fill, Length)
2314
2315 #define RtlFillBytes RtlFillMemory
2316
2317 NTSYSAPI
2318 VOID
2319 NTAPI
2320 RtlFreeUnicodeString(
2321 IN PUNICODE_STRING UnicodeString);
2322
2323 NTSYSAPI
2324 NTSTATUS
2325 NTAPI
2326 RtlGUIDFromString(
2327 IN PUNICODE_STRING GuidString,
2328 OUT GUID *Guid);
2329
2330 NTSYSAPI
2331 VOID
2332 NTAPI
2333 RtlInitUnicodeString(
2334 IN OUT PUNICODE_STRING DestinationString,
2335 IN PCWSTR SourceString);
2336
2337 /* VOID
2338 * RtlMoveMemory(
2339 * IN VOID UNALIGNED *Destination,
2340 * IN CONST VOID UNALIGNED *Source,
2341 * IN SIZE_T Length)
2342 */
2343 #define RtlMoveMemory(Destination, Source, Length) \
2344 memmove(Destination, Source, Length)
2345
2346 NTSYSAPI
2347 NTSTATUS
2348 NTAPI
2349 RtlStringFromGUID(
2350 IN REFGUID Guid,
2351 OUT PUNICODE_STRING GuidString);
2352
2353 /* VOID
2354 * RtlZeroMemory(
2355 * IN VOID UNALIGNED *Destination,
2356 * IN SIZE_T Length)
2357 */
2358 #define RtlZeroMemory(Destination, Length) \
2359 memset(Destination, 0, Length)
2360
2361 #define RtlZeroBytes RtlZeroMemory
2362
2363
2364 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2365 NTSYSAPI
2366 BOOLEAN
2367 NTAPI
2368 RtlAreBitsClear(
2369 IN PRTL_BITMAP BitMapHeader,
2370 IN ULONG StartingIndex,
2371 IN ULONG Length);
2372
2373 NTSYSAPI
2374 BOOLEAN
2375 NTAPI
2376 RtlAreBitsSet(
2377 IN PRTL_BITMAP BitMapHeader,
2378 IN ULONG StartingIndex,
2379 IN ULONG Length);
2380
2381 NTSYSAPI
2382 NTSTATUS
2383 NTAPI
2384 RtlAnsiStringToUnicodeString(
2385 IN OUT PUNICODE_STRING DestinationString,
2386 IN PANSI_STRING SourceString,
2387 IN BOOLEAN AllocateDestinationString);
2388
2389 NTSYSAPI
2390 ULONG
2391 NTAPI
2392 RtlxAnsiStringToUnicodeSize(
2393 IN PCANSI_STRING AnsiString);
2394
2395 #define RtlAnsiStringToUnicodeSize(String) ( \
2396 NLS_MB_CODE_PAGE_TAG ? \
2397 RtlxAnsiStringToUnicodeSize(String) : \
2398 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
2399 )
2400
2401 NTSYSAPI
2402 NTSTATUS
2403 NTAPI
2404 RtlAppendUnicodeStringToString(
2405 IN OUT PUNICODE_STRING Destination,
2406 IN PCUNICODE_STRING Source);
2407
2408 NTSYSAPI
2409 NTSTATUS
2410 NTAPI
2411 RtlAppendUnicodeToString(
2412 IN OUT PUNICODE_STRING Destination,
2413 IN PCWSTR Source);
2414
2415 NTSYSAPI
2416 NTSTATUS
2417 NTAPI
2418 RtlCheckRegistryKey(
2419 IN ULONG RelativeTo,
2420 IN PWSTR Path);
2421
2422 NTSYSAPI
2423 VOID
2424 NTAPI
2425 RtlClearAllBits(
2426 IN PRTL_BITMAP BitMapHeader);
2427
2428 NTSYSAPI
2429 VOID
2430 NTAPI
2431 RtlClearBits(
2432 IN PRTL_BITMAP BitMapHeader,
2433 IN ULONG StartingIndex,
2434 IN ULONG NumberToClear);
2435
2436 NTSYSAPI
2437 SIZE_T
2438 NTAPI
2439 RtlCompareMemory(
2440 IN CONST VOID *Source1,
2441 IN CONST VOID *Source2,
2442 IN SIZE_T Length);
2443
2444 NTSYSAPI
2445 LONG
2446 NTAPI
2447 RtlCompareUnicodeString(
2448 IN PCUNICODE_STRING String1,
2449 IN PCUNICODE_STRING String2,
2450 IN BOOLEAN CaseInSensitive);
2451
2452 NTSYSAPI
2453 LONG
2454 NTAPI
2455 RtlCompareUnicodeStrings(
2456 IN PCWCH String1,
2457 IN SIZE_T String1Length,
2458 IN PCWCH String2,
2459 IN SIZE_T String2Length,
2460 IN BOOLEAN CaseInSensitive);
2461
2462 NTSYSAPI
2463 VOID
2464 NTAPI
2465 RtlCopyUnicodeString(
2466 IN OUT PUNICODE_STRING DestinationString,
2467 IN PCUNICODE_STRING SourceString);
2468
2469 NTSYSAPI
2470 NTSTATUS
2471 NTAPI
2472 RtlCreateRegistryKey(
2473 IN ULONG RelativeTo,
2474 IN PWSTR Path);
2475
2476 NTSYSAPI
2477 NTSTATUS
2478 NTAPI
2479 RtlCreateSecurityDescriptor(
2480 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
2481 IN ULONG Revision);
2482
2483 NTSYSAPI
2484 NTSTATUS
2485 NTAPI
2486 RtlDeleteRegistryValue(
2487 IN ULONG RelativeTo,
2488 IN PCWSTR Path,
2489 IN PCWSTR ValueName);
2490
2491 NTSYSAPI
2492 BOOLEAN
2493 NTAPI
2494 RtlEqualUnicodeString(
2495 IN CONST UNICODE_STRING *String1,
2496 IN CONST UNICODE_STRING *String2,
2497 IN BOOLEAN CaseInSensitive);
2498
2499 #if !defined(_AMD64_) && !defined(_IA64_)
2500 NTSYSAPI
2501 LARGE_INTEGER
2502 NTAPI
2503 RtlExtendedIntegerMultiply(
2504 IN LARGE_INTEGER Multiplicand,
2505 IN LONG Multiplier);
2506
2507 NTSYSAPI
2508 LARGE_INTEGER
2509 NTAPI
2510 RtlExtendedLargeIntegerDivide(
2511 IN LARGE_INTEGER Dividend,
2512 IN ULONG Divisor,
2513 IN OUT PULONG Remainder);
2514 #endif
2515
2516 #if defined(_X86_) || defined(_IA64_)
2517 NTSYSAPI
2518 LARGE_INTEGER
2519 NTAPI
2520 RtlExtendedMagicDivide(
2521 IN LARGE_INTEGER Dividend,
2522 IN LARGE_INTEGER MagicDivisor,
2523 IN CCHAR ShiftCount);
2524 #endif
2525
2526 NTSYSAPI
2527 VOID
2528 NTAPI
2529 RtlFreeAnsiString(
2530 IN PANSI_STRING AnsiString);
2531
2532 NTSYSAPI
2533 ULONG
2534 NTAPI
2535 RtlFindClearBits(
2536 IN PRTL_BITMAP BitMapHeader,
2537 IN ULONG NumberToFind,
2538 IN ULONG HintIndex);
2539
2540 NTSYSAPI
2541 ULONG
2542 NTAPI
2543 RtlFindClearBitsAndSet(
2544 IN PRTL_BITMAP BitMapHeader,
2545 IN ULONG NumberToFind,
2546 IN ULONG HintIndex);
2547
2548 NTSYSAPI
2549 ULONG
2550 NTAPI
2551 RtlFindFirstRunClear(
2552 IN PRTL_BITMAP BitMapHeader,
2553 OUT PULONG StartingIndex);
2554
2555 NTSYSAPI
2556 ULONG
2557 NTAPI
2558 RtlFindClearRuns(
2559 IN PRTL_BITMAP BitMapHeader,
2560 OUT PRTL_BITMAP_RUN RunArray,
2561 IN ULONG SizeOfRunArray,
2562 IN BOOLEAN LocateLongestRuns);
2563
2564 NTSYSAPI
2565 ULONG
2566 NTAPI
2567 RtlFindLastBackwardRunClear(
2568 IN PRTL_BITMAP BitMapHeader,
2569 IN ULONG FromIndex,
2570 OUT PULONG StartingRunIndex);
2571
2572 NTSYSAPI
2573 CCHAR
2574 NTAPI
2575 RtlFindLeastSignificantBit(
2576 IN ULONGLONG Set);
2577
2578 NTSYSAPI
2579 ULONG
2580 NTAPI
2581 RtlFindLongestRunClear(
2582 IN PRTL_BITMAP BitMapHeader,
2583 OUT PULONG StartingIndex);
2584
2585 NTSYSAPI
2586 CCHAR
2587 NTAPI
2588 RtlFindMostSignificantBit(
2589 IN ULONGLONG Set);
2590
2591 NTSYSAPI
2592 ULONG
2593 NTAPI
2594 RtlFindNextForwardRunClear(
2595 IN PRTL_BITMAP BitMapHeader,
2596 IN ULONG FromIndex,
2597 OUT PULONG StartingRunIndex);
2598
2599 NTSYSAPI
2600 ULONG
2601 NTAPI
2602 RtlFindSetBits(
2603 IN PRTL_BITMAP BitMapHeader,
2604 IN ULONG NumberToFind,
2605 IN ULONG HintIndex);
2606
2607 NTSYSAPI
2608 ULONG
2609 NTAPI
2610 RtlFindSetBitsAndClear(
2611 IN PRTL_BITMAP BitMapHeader,
2612 IN ULONG NumberToFind,
2613 IN ULONG HintIndex);
2614
2615 NTSYSAPI
2616 NTSTATUS
2617 NTAPI
2618 RtlHashUnicodeString(
2619 IN CONST UNICODE_STRING *String,
2620 IN BOOLEAN CaseInSensitive,
2621 IN ULONG HashAlgorithm,
2622 OUT PULONG HashValue);
2623
2624 NTSYSAPI
2625 VOID
2626 NTAPI
2627 RtlInitAnsiString(
2628 IN OUT PANSI_STRING DestinationString,
2629 IN PCSZ SourceString);
2630
2631 NTSYSAPI
2632 VOID
2633 NTAPI
2634 RtlInitializeBitMap(
2635 IN PRTL_BITMAP BitMapHeader,
2636 IN PULONG BitMapBuffer,
2637 IN ULONG SizeOfBitMap);
2638
2639 NTSYSAPI
2640 VOID
2641 NTAPI
2642 RtlInitString(
2643 IN OUT PSTRING DestinationString,
2644 IN PCSZ SourceString);
2645
2646 NTSYSAPI
2647 NTSTATUS
2648 NTAPI
2649 RtlIntegerToUnicodeString(
2650 IN ULONG Value,
2651 IN ULONG Base OPTIONAL,
2652 IN OUT PUNICODE_STRING String);
2653
2654 NTSYSAPI
2655 NTSTATUS
2656 NTAPI
2657 RtlInt64ToUnicodeString(
2658 IN ULONGLONG Value,
2659 IN ULONG Base OPTIONAL,
2660 IN OUT PUNICODE_STRING String);
2661
2662 #ifdef _WIN64
2663 #define RtlIntPtrToUnicodeString(Value, Base, String) \
2664 RtlInt64ToUnicodeString(Value, Base, String)
2665 #else
2666 #define RtlIntPtrToUnicodeString(Value, Base, String) \
2667 RtlIntegerToUnicodeString(Value, Base, String)
2668 #endif
2669
2670 /* BOOLEAN
2671 * RtlIsZeroLuid(
2672 * IN PLUID L1);
2673 */
2674 #define RtlIsZeroLuid(_L1) \
2675 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
2676
2677 NTSYSAPI
2678 ULONG
2679 NTAPI
2680 RtlLengthSecurityDescriptor(
2681 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
2682
2683 NTSYSAPI
2684 ULONG
2685 NTAPI
2686 RtlNumberOfClearBits(
2687 IN PRTL_BITMAP BitMapHeader);
2688
2689 NTSYSAPI
2690 ULONG
2691 NTAPI
2692 RtlNumberOfSetBits(
2693 IN PRTL_BITMAP BitMapHeader);
2694
2695 NTSYSAPI
2696 NTSTATUS
2697 NTAPI
2698 RtlQueryRegistryValues(
2699 IN ULONG RelativeTo,
2700 IN PCWSTR Path,
2701 IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
2702 IN PVOID Context,
2703 IN PVOID Environment OPTIONAL);
2704
2705 #define LONG_SIZE (sizeof(LONG))
2706 #define LONG_MASK (LONG_SIZE - 1)
2707
2708 /* VOID
2709 * RtlRetrieveUlong(
2710 * PULONG DestinationAddress,
2711 * PULONG SourceAddress);
2712 */
2713 #if defined(_AMD64_)
2714 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
2715 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
2716 #else
2717 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
2718 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
2719 { \
2720 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
2721 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
2722 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
2723 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
2724 } \
2725 else \
2726 { \
2727 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
2728 }
2729 #endif
2730
2731 /* VOID
2732 * RtlRetrieveUshort(
2733 * PUSHORT DestinationAddress,
2734 * PUSHORT SourceAddress);
2735 */
2736 #if defined(_AMD64_)
2737 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
2738 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
2739 #else
2740 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
2741 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
2742 { \
2743 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
2744 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
2745 } \
2746 else \
2747 { \
2748 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
2749 }
2750 #endif
2751
2752 NTSYSAPI
2753 VOID
2754 NTAPI
2755 RtlSetAllBits(
2756 IN PRTL_BITMAP BitMapHeader);
2757
2758 NTSYSAPI
2759 VOID
2760 NTAPI
2761 RtlSetBits(
2762 IN PRTL_BITMAP BitMapHeader,
2763 IN ULONG StartingIndex,
2764 IN ULONG NumberToSet);
2765
2766 NTSYSAPI
2767 NTSTATUS
2768 NTAPI
2769 RtlSetDaclSecurityDescriptor(
2770 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
2771 IN BOOLEAN DaclPresent,
2772 IN PACL Dacl OPTIONAL,
2773 IN BOOLEAN DaclDefaulted OPTIONAL);
2774
2775 /* VOID
2776 * RtlStoreUlong(
2777 * IN PULONG Address,
2778 * IN ULONG Value);
2779 */
2780 #if defined(_AMD64_)
2781 #define RtlStoreUlong(Address,Value) \
2782 *(ULONG UNALIGNED *)(Address) = (Value)
2783 #else
2784 #define RtlStoreUlong(Address,Value) \
2785 if ((ULONG_PTR)(Address) & LONG_MASK) { \
2786 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
2787 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
2788 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
2789 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
2790 } \
2791 else { \
2792 *((PULONG)(Address)) = (ULONG) (Value); \
2793 }
2794 #endif
2795
2796 /* VOID
2797 * RtlStoreUlonglong(
2798 * IN OUT PULONGLONG Address,
2799 * ULONGLONG Value);
2800 */
2801 #if defined(_AMD64_)
2802 #define RtlStoreUlonglong(Address,Value) \
2803 *(ULONGLONG UNALIGNED *)(Address) = (Value)
2804 #else
2805 #define RtlStoreUlonglong(Address,Value) \
2806 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
2807 RtlStoreUlong((ULONG_PTR)(Address), \
2808 (ULONGLONG)(Value) & 0xFFFFFFFF); \
2809 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
2810 (ULONGLONG)(Value) >> 32); \
2811 } else { \
2812 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
2813 }
2814 #endif
2815
2816 /* VOID
2817 * RtlStoreUlongPtr(
2818 * IN OUT PULONG_PTR Address,
2819 * IN ULONG_PTR Value);
2820 */
2821 #ifdef _WIN64
2822 #define RtlStoreUlongPtr(Address,Value) \
2823 RtlStoreUlonglong(Address,Value)
2824 #else
2825 #define RtlStoreUlongPtr(Address,Value) \
2826 RtlStoreUlong(Address,Value)
2827 #endif
2828
2829 /* VOID
2830 * RtlStoreUshort(
2831 * IN PUSHORT Address,
2832 * IN USHORT Value);
2833 */
2834 #if defined(_AMD64_)
2835 #define RtlStoreUshort(Address,Value) \
2836 *(USHORT UNALIGNED *)(Address) = (Value)
2837 #else
2838 #define RtlStoreUshort(Address,Value) \
2839 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
2840 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
2841 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
2842 } \
2843 else { \
2844 *((PUSHORT) (Address)) = (USHORT)Value; \
2845 }
2846 #endif
2847
2848 NTSYSAPI
2849 BOOLEAN
2850 NTAPI
2851 RtlTimeFieldsToTime(
2852 IN PTIME_FIELDS TimeFields,
2853 IN PLARGE_INTEGER Time);
2854
2855 NTSYSAPI
2856 VOID
2857 NTAPI
2858 RtlTimeToTimeFields(
2859 IN PLARGE_INTEGER Time,
2860 IN PTIME_FIELDS TimeFields);
2861
2862 NTSYSAPI
2863 ULONG
2864 FASTCALL
2865 RtlUlongByteSwap(
2866 IN ULONG Source);
2867
2868 NTSYSAPI
2869 ULONGLONG
2870 FASTCALL
2871 RtlUlonglongByteSwap(
2872 IN ULONGLONG Source);
2873
2874 NTSYSAPI
2875 NTSTATUS
2876 NTAPI
2877 RtlUnicodeStringToAnsiString(
2878 IN OUT PANSI_STRING DestinationString,
2879 IN PCUNICODE_STRING SourceString,
2880 IN BOOLEAN AllocateDestinationString);
2881
2882 NTSYSAPI
2883 ULONG
2884 NTAPI
2885 RtlxUnicodeStringToAnsiSize(
2886 IN PCUNICODE_STRING UnicodeString);
2887
2888 #define RtlUnicodeStringToAnsiSize(String) ( \
2889 NLS_MB_CODE_PAGE_TAG ? \
2890 RtlxUnicodeStringToAnsiSize(String) : \
2891 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
2892 )
2893
2894 NTSYSAPI
2895 NTSTATUS
2896 NTAPI
2897 RtlUnicodeStringToInteger(
2898 IN PCUNICODE_STRING String,
2899 IN ULONG Base OPTIONAL,
2900 OUT PULONG Value);
2901
2902 NTSYSAPI
2903 WCHAR
2904 NTAPI
2905 RtlUpcaseUnicodeChar(
2906 IN WCHAR SourceCharacter);
2907
2908 NTSYSAPI
2909 USHORT
2910 FASTCALL
2911 RtlUshortByteSwap(
2912 IN USHORT Source);
2913
2914 NTSYSAPI
2915 BOOLEAN
2916 NTAPI
2917 RtlValidRelativeSecurityDescriptor(
2918 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
2919 IN ULONG SecurityDescriptorLength,
2920 IN SECURITY_INFORMATION RequiredInformation);
2921
2922 NTSYSAPI
2923 BOOLEAN
2924 NTAPI
2925 RtlValidSecurityDescriptor(
2926 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
2927
2928 NTSYSAPI
2929 NTSTATUS
2930 NTAPI
2931 RtlWriteRegistryValue(
2932 IN ULONG RelativeTo,
2933 IN PCWSTR Path,
2934 IN PCWSTR ValueName,
2935 IN ULONG ValueType,
2936 IN PVOID ValueData,
2937 IN ULONG ValueLength);
2938
2939 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
2940
2941 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
2942 NTSYSAPI
2943 VOID
2944 FASTCALL
2945 RtlPrefetchMemoryNonTemporal(
2946 IN PVOID Source,
2947 IN SIZE_T Length);
2948 #endif
2949
2950 #if (NTDDI_VERSION >= NTDDI_WINXP)
2951 NTSYSAPI
2952 VOID
2953 NTAPI
2954 RtlClearBit(
2955 PRTL_BITMAP BitMapHeader,
2956 ULONG BitNumber);
2957
2958 NTSYSAPI
2959 WCHAR
2960 NTAPI
2961 RtlDowncaseUnicodeChar(
2962 IN WCHAR SourceCharacter);
2963
2964 NTSYSAPI
2965 VOID
2966 NTAPI
2967 RtlSetBit(
2968 PRTL_BITMAP BitMapHeader,
2969 ULONG BitNumber);
2970
2971 NTSYSAPI
2972 BOOLEAN
2973 NTAPI
2974 RtlTestBit(
2975 IN PRTL_BITMAP BitMapHeader,
2976 IN ULONG BitNumber);
2977
2978 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
2979
2980 #if (NTDDI_VERSION >= NTDDI_VISTA)
2981 NTSYSAPI
2982 ULONG
2983 NTAPI
2984 RtlNumberOfSetBitsUlongPtr(
2985 IN ULONG_PTR Target);
2986
2987 NTSYSAPI
2988 ULONGLONG
2989 NTAPI
2990 RtlIoDecodeMemIoResource (
2991 IN PIO_RESOURCE_DESCRIPTOR Descriptor,
2992 OUT PULONGLONG Alignment OPTIONAL,
2993 OUT PULONGLONG MinimumAddress OPTIONAL,
2994 OUT PULONGLONG MaximumAddress OPTIONAL);
2995
2996 NTSYSAPI
2997 NTSTATUS
2998 NTAPI
2999 RtlIoEncodeMemIoResource(
3000 IN PIO_RESOURCE_DESCRIPTOR Descriptor,
3001 IN UCHAR Type,
3002 IN ULONGLONG Length,
3003 IN ULONGLONG Alignment,
3004 IN ULONGLONG MinimumAddress,
3005 IN ULONGLONG MaximumAddress);
3006
3007 NTSYSAPI
3008 ULONGLONG
3009 NTAPI
3010 RtlCmDecodeMemIoResource(
3011 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor,
3012 OUT PULONGLONG Start OPTIONAL);
3013
3014 NTSYSAPI
3015 NTSTATUS
3016 NTAPI
3017 RtlFindClosestEncodableLength(
3018 IN ULONGLONG SourceLength,
3019 OUT PULONGLONG TargetLength);
3020
3021 #endif
3022
3023 #if !defined(MIDL_PASS)
3024 /* inline funftions */
3025 //DECLSPEC_DEPRECATED_DDK_WINXP
3026 static __inline
3027 LARGE_INTEGER
3028 NTAPI_INLINE
3029 RtlConvertLongToLargeInteger(LONG SignedInteger)
3030 {
3031 LARGE_INTEGER ret;
3032 ret.QuadPart = SignedInteger;
3033 return ret;
3034 }
3035
3036 //DECLSPEC_DEPRECATED_DDK_WINXP
3037 static __inline
3038 LARGE_INTEGER
3039 NTAPI_INLINE
3040 RtlConvertUlongToLargeInteger(
3041 ULONG UnsignedInteger)
3042 {
3043 LARGE_INTEGER ret;
3044 ret.QuadPart = UnsignedInteger;
3045 return ret;
3046 }
3047
3048 //DECLSPEC_DEPRECATED_DDK
3049 static __inline
3050 ULONG
3051 NTAPI_INLINE
3052 RtlEnlargedUnsignedDivide(
3053 IN ULARGE_INTEGER Dividend,
3054 IN ULONG Divisor,
3055 IN OUT PULONG Remainder)
3056 {
3057 if (Remainder)
3058 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
3059 return (ULONG)(Dividend.QuadPart / Divisor);
3060 }
3061
3062 //DECLSPEC_DEPRECATED_DDK
3063 static __inline
3064 LARGE_INTEGER
3065 NTAPI_INLINE
3066 RtlEnlargedUnsignedMultiply(
3067 IN ULONG Multiplicand,
3068 IN ULONG Multiplier)
3069 {
3070 LARGE_INTEGER ret;
3071 ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
3072 return ret;
3073 }
3074
3075 //DECLSPEC_DEPRECATED_DDK
3076 static __inline
3077 LARGE_INTEGER
3078 NTAPI_INLINE
3079 RtlEnlargedIntegerMultiply(
3080 IN LONG Multiplicand,
3081 IN LONG Multiplier)
3082 {
3083 LARGE_INTEGER ret;
3084 ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
3085 return ret;
3086 }
3087
3088 FORCEINLINE
3089 VOID
3090 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString,
3091 IN PCHAR Buffer,
3092 IN USHORT BufferSize)
3093 {
3094 AnsiString->Length = 0;
3095 AnsiString->MaximumLength = BufferSize;
3096 AnsiString->Buffer = Buffer;
3097 }
3098
3099 FORCEINLINE
3100 VOID
3101 RtlInitEmptyUnicodeString(
3102 OUT PUNICODE_STRING UnicodeString,
3103 IN PWSTR Buffer,
3104 IN USHORT BufferSize)
3105 {
3106 UnicodeString->Length = 0;
3107 UnicodeString->MaximumLength = BufferSize;
3108 UnicodeString->Buffer = Buffer;
3109 }
3110
3111 #if defined(_AMD64_) || defined(_IA64_)
3112 static __inline
3113 LARGE_INTEGER
3114 NTAPI_INLINE
3115 RtlExtendedIntegerMultiply(
3116 LARGE_INTEGER Multiplicand,
3117 LONG Multiplier)
3118 {
3119 LARGE_INTEGER ret;
3120 ret.QuadPart = Multiplicand.QuadPart * Multiplier;
3121 return ret;
3122 }
3123
3124 static __inline
3125 LARGE_INTEGER
3126 NTAPI_INLINE
3127 RtlExtendedLargeIntegerDivide(
3128 LARGE_INTEGER Dividend,
3129 ULONG Divisor,
3130 PULONG Remainder)
3131 {
3132 LARGE_INTEGER ret;
3133 ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
3134 if (Remainder)
3135 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
3136 return ret;
3137 }
3138 #endif
3139
3140 #if defined(_AMD64_)
3141
3142 #define MultiplyHigh __mulh
3143 #define UnsignedMultiplyHigh __umulh
3144
3145 //DECLSPEC_DEPRECATED_DDK
3146 static __inline
3147 LARGE_INTEGER
3148 NTAPI_INLINE
3149 RtlExtendedMagicDivide(
3150 IN LARGE_INTEGER Dividend,
3151 IN LARGE_INTEGER MagicDivisor,
3152 IN CCHAR ShiftCount)
3153 {
3154 LARGE_INTEGER ret;
3155 ULONG64 ret64;
3156 BOOLEAN Pos;
3157 Pos = (Dividend.QuadPart >= 0);
3158 ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,
3159 MagicDivisor.QuadPart);
3160 ret64 >>= ShiftCount;
3161 ret.QuadPart = Pos ? ret64 : -ret64;
3162 return ret;
3163 }
3164 #endif
3165
3166 //DECLSPEC_DEPRECATED_DDK
3167 static __inline
3168 LARGE_INTEGER
3169 NTAPI_INLINE
3170 RtlLargeIntegerAdd(
3171 IN LARGE_INTEGER Addend1,
3172 IN LARGE_INTEGER Addend2)
3173 {
3174 LARGE_INTEGER ret;
3175 ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
3176 return ret;
3177 }
3178
3179 /* VOID
3180 * RtlLargeIntegerAnd(
3181 * IN OUT LARGE_INTEGER Result,
3182 * IN LARGE_INTEGER Source,
3183 * IN LARGE_INTEGER Mask);
3184 */
3185 #define RtlLargeIntegerAnd(Result, Source, Mask) \
3186 Result.QuadPart = Source.QuadPart & Mask.QuadPart
3187
3188 //DECLSPEC_DEPRECATED_DDK
3189 static __inline
3190 LARGE_INTEGER
3191 NTAPI_INLINE
3192 RtlLargeIntegerArithmeticShift(
3193 IN LARGE_INTEGER LargeInteger,
3194 IN CCHAR ShiftCount)
3195 {
3196 LARGE_INTEGER ret;
3197 ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;
3198 return ret;
3199 }
3200
3201 /* BOOLEAN
3202 * RtlLargeIntegerEqualTo(
3203 * IN LARGE_INTEGER Operand1,
3204 * IN LARGE_INTEGER Operand2);
3205 */
3206 #define RtlLargeIntegerEqualTo(X,Y) \
3207 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
3208
3209 FORCEINLINE
3210 PVOID
3211 RtlSecureZeroMemory(
3212 OUT PVOID Pointer,
3213 IN SIZE_T Size)
3214 {
3215 volatile char* vptr = (volatile char*)Pointer;
3216 #if defined(_M_AMD64)
3217 __stosb((PUCHAR)vptr, 0, Size);
3218 #else
3219 char * endptr = (char *)vptr + Size;
3220 while (vptr < endptr)
3221 {
3222 *vptr = 0; vptr++;
3223 }
3224 #endif
3225 return Pointer;
3226 }
3227
3228 #if defined(_M_AMD64)
3229 FORCEINLINE
3230 ULONG
3231 RtlCheckBit(
3232 IN PRTL_BITMAP BitMapHeader,
3233 IN ULONG BitPosition)
3234 {
3235 return BitTest((LONG CONST*)BitMapHeader->Buffer, BitPosition);
3236 }
3237 #else
3238 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
3239 #endif // defined(_M_AMD64)
3240
3241 #endif // !defined(MIDL_PASS)
3242
3243 //
3244 // Byte Swap Functions
3245 //
3246 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
3247 ((defined(_M_AMD64) || defined(_M_IA64)) \
3248 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
3249
3250 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
3251 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
3252 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
3253
3254 #endif
3255
3256 /******************************************************************************
3257 * Memory manager Types *
3258 ******************************************************************************/
3259
3260 typedef struct _MDL {
3261 struct _MDL *Next;
3262 CSHORT Size;
3263 CSHORT MdlFlags;
3264 struct _EPROCESS *Process;
3265 PVOID MappedSystemVa;
3266 PVOID StartVa;
3267 ULONG ByteCount;
3268 ULONG ByteOffset;
3269 } MDL, *PMDL;
3270
3271
3272 /******************************************************************************
3273 * Memory manager Functions *
3274 ******************************************************************************/
3275
3276 /* PVOID MmGetSystemAddressForMdl(
3277 * IN PMDL Mdl);
3278 */
3279 #define MmGetSystemAddressForMdl(Mdl) \
3280 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
3281 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
3282 ((Mdl)->MappedSystemVa) : \
3283 (MmMapLockedPages((Mdl), KernelMode)))
3284
3285 /* PVOID
3286 * MmGetSystemAddressForMdlSafe(
3287 * IN PMDL Mdl,
3288 * IN MM_PAGE_PRIORITY Priority)
3289 */
3290 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
3291 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
3292 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
3293 (_Mdl)->MappedSystemVa : \
3294 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
3295 KernelMode, MmCached, NULL, FALSE, (_Priority)))
3296
3297 #if (NTDDI_VERSION >= NTDDI_WIN2K)
3298 NTKERNELAPI
3299 PMDL
3300 NTAPI
3301 MmCreateMdl(
3302 IN PMDL MemoryDescriptorList OPTIONAL,
3303 IN PVOID Base,
3304 IN SIZE_T Length);
3305
3306 #endif
3307
3308
3309 /******************************************************************************
3310 * I/O Manager Functions *
3311 ******************************************************************************/
3312
3313 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
3314 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
3315
3316 #define DMA_MACROS_DEFINED
3317
3318 FORCEINLINE
3319 NTSTATUS
3320 IoAllocateAdapterChannel(
3321 IN PADAPTER_OBJECT AdapterObject,
3322 IN PDEVICE_OBJECT DeviceObject,
3323 IN ULONG NumberOfMapRegisters,
3324 IN PDRIVER_CONTROL ExecutionRoutine,
3325 IN PVOID Context)
3326 {
3327 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
3328 AllocateAdapterChannel =
3329 *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
3330 ASSERT(AllocateAdapterChannel);
3331 return AllocateAdapterChannel(DmaAdapter,
3332 DeviceObject,
3333 NumberOfMapRegisters,
3334 ExecutionRoutine,
3335 Context );
3336 }
3337
3338 FORCEINLINE
3339 BOOLEAN
3340 IoFlushAdapterBuffers(
3341 IN PADAPTER_OBJECT AdapterObject,
3342 IN PMDL Mdl,
3343 IN PVOID MapRegisterBase,
3344 IN PVOID CurrentVa,
3345 IN ULONG Length,
3346 IN BOOLEAN WriteToDevice)
3347 {
3348 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
3349 FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
3350 ASSERT(FlushAdapterBuffers);
3351 return FlushAdapterBuffers(DmaAdapter,
3352 Mdl,
3353 MapRegisterBase,
3354 CurrentVa,
3355 Length,
3356 WriteToDevice );
3357 }
3358
3359 FORCEINLINE
3360 VOID
3361 IoFreeAdapterChannel(
3362 IN PADAPTER_OBJECT AdapterObject)
3363 {
3364 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
3365 FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
3366 ASSERT(FreeAdapterChannel);
3367 FreeAdapterChannel(DmaAdapter);
3368 }
3369
3370 FORCEINLINE
3371 VOID
3372 IoFreeMapRegisters(
3373 IN PADAPTER_OBJECT AdapterObject,
3374 IN PVOID MapRegisterBase,
3375 IN ULONG NumberOfMapRegisters)
3376 {
3377 PFREE_MAP_REGISTERS FreeMapRegisters;
3378 FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
3379 ASSERT(FreeMapRegisters);
3380 FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
3381 }
3382
3383 FORCEINLINE
3384 PHYSICAL_ADDRESS
3385 IoMapTransfer(
3386 IN PDMA_ADAPTER DmaAdapter,
3387 IN PMDL Mdl,
3388 IN PVOID MapRegisterBase,
3389 IN PVOID CurrentVa,
3390 IN OUT PULONG Length,
3391 IN BOOLEAN WriteToDevice)
3392 {
3393 PMAP_TRANSFER MapTransfer;
3394
3395 MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
3396 ASSERT(MapTransfer);
3397 return MapTransfer(DmaAdapter,
3398 Mdl,
3399 MapRegisterBase,
3400 CurrentVa,
3401 Length,
3402 WriteToDevice);
3403 }
3404 #endif
3405
3406
3407 /******************************************************************************
3408 * Executive Types *
3409 ******************************************************************************/
3410
3411 typedef enum _POOL_TYPE {
3412 NonPagedPool,
3413 PagedPool,
3414 NonPagedPoolMustSucceed,
3415 DontUseThisType,
3416 NonPagedPoolCacheAligned,
3417 PagedPoolCacheAligned,
3418 NonPagedPoolCacheAlignedMustS,
3419 MaxPoolType,
3420 NonPagedPoolSession = 32,
3421 PagedPoolSession,
3422 NonPagedPoolMustSucceedSession,
3423 DontUseThisTypeSession,
3424 NonPagedPoolCacheAlignedSession,
3425 PagedPoolCacheAlignedSession,
3426 NonPagedPoolCacheAlignedMustSSession
3427 } POOL_TYPE;
3428
3429 typedef enum _SUITE_TYPE {
3430 SmallBusiness,
3431 Enterprise,
3432 BackOffice,
3433 CommunicationServer,
3434 TerminalServer,
3435 SmallBusinessRestricted,
3436 EmbeddedNT,
3437 DataCenter,
3438 SingleUserTS,
3439 Personal,
3440 Blade,
3441 MaxSuiteType
3442 } SUITE_TYPE;
3443
3444 typedef enum _EX_POOL_PRIORITY {
3445 LowPoolPriority,
3446 LowPoolPrioritySpecialPoolOverrun = 8,
3447 LowPoolPrioritySpecialPoolUnderrun = 9,
3448 NormalPoolPriority = 16,
3449 NormalPoolPrioritySpecialPoolOverrun = 24,
3450 NormalPoolPrioritySpecialPoolUnderrun = 25,
3451 HighPoolPriority = 32,
3452 HighPoolPrioritySpecialPoolOverrun = 40,
3453 HighPoolPrioritySpecialPoolUnderrun = 41
3454 } EX_POOL_PRIORITY;
3455
3456 typedef struct _FAST_MUTEX
3457 {
3458 LONG Count;
3459 PKTHREAD Owner;
3460 ULONG Contention;
3461 KEVENT Gate;
3462 ULONG OldIrql;
3463 } FAST_MUTEX, *PFAST_MUTEX;
3464
3465 typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD;
3466
3467 typedef struct _OWNER_ENTRY {
3468 ERESOURCE_THREAD OwnerThread;
3469 _ANONYMOUS_UNION union {
3470 LONG OwnerCount;
3471 ULONG TableSize;
3472 } DUMMYUNIONNAME;
3473 } OWNER_ENTRY, *POWNER_ENTRY;
3474
3475 typedef struct _ERESOURCE
3476 {
3477 LIST_ENTRY SystemResourcesList;
3478 POWNER_ENTRY OwnerTable;
3479 SHORT ActiveCount;
3480 USHORT Flag;
3481 volatile PKSEMAPHORE SharedWaiters;
3482 volatile PKEVENT ExclusiveWaiters;
3483 OWNER_ENTRY OwnerEntry;
3484 ULONG ActiveEntries;
3485 ULONG ContentionCount;
3486 ULONG NumberOfSharedWaiters;
3487 ULONG NumberOfExclusiveWaiters;
3488 __GNU_EXTENSION union
3489 {
3490 PVOID Address;
3491 ULONG_PTR CreatorBackTraceIndex;
3492 };
3493 KSPIN_LOCK SpinLock;
3494 } ERESOURCE, *PERESOURCE;
3495
3496 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
3497 #define LOOKASIDE_ALIGN
3498 #else
3499 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
3500 #endif
3501
3502 typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;
3503
3504 typedef PVOID
3505 (DDKAPI *PALLOCATE_FUNCTION)(
3506 IN POOL_TYPE PoolType,
3507 IN SIZE_T NumberOfBytes,
3508 IN ULONG Tag);
3509
3510 typedef PVOID
3511 (DDKAPI *PALLOCATE_FUNCTION_EX)(
3512 IN POOL_TYPE PoolType,
3513 IN SIZE_T NumberOfBytes,
3514 IN ULONG Tag,
3515 IN OUT PLOOKASIDE_LIST_EX Lookaside);
3516
3517 typedef VOID
3518 (DDKAPI *PFREE_FUNCTION)(
3519 IN PVOID Buffer);
3520
3521 typedef VOID
3522 (DDKAPI *PFREE_FUNCTION_EX)(
3523 IN PVOID Buffer,
3524 IN OUT PLOOKASIDE_LIST_EX Lookaside);
3525
3526 typedef VOID
3527 (DDKAPI *PCALLBACK_FUNCTION)(
3528 IN PVOID CallbackContext,
3529 IN PVOID Argument1,
3530 IN PVOID Argument2);
3531
3532 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE {
3533 union {
3534 SLIST_HEADER ListHead;
3535 SINGLE_LIST_ENTRY SingleListHead;
3536 } DUMMYUNIONNAME;
3537 USHORT Depth;
3538 USHORT MaximumDepth;
3539 ULONG TotalAllocates;
3540 union {
3541 ULONG AllocateMisses;
3542 ULONG AllocateHits;
3543 } DUMMYUNIONNAME2;
3544 ULONG TotalFrees;
3545 union {
3546 ULONG FreeMisses;
3547 ULONG FreeHits;
3548 } DUMMYUNIONNAME3;
3549 POOL_TYPE Type;
3550 ULONG Tag;
3551 ULONG Size;
3552 union {
3553 PALLOCATE_FUNCTION_EX AllocateEx;
3554 PALLOCATE_FUNCTION Allocate;
3555 } DUMMYUNIONNAME4;
3556 union {
3557 PFREE_FUNCTION_EX FreeEx;
3558 PFREE_FUNCTION Free;
3559 } DUMMYUNIONNAME5;
3560 LIST_ENTRY ListEntry;
3561 ULONG LastTotalAllocates;
3562 union {
3563 ULONG LastAllocateMisses;
3564 ULONG LastAllocateHits;
3565 } DUMMYUNIONNAME6;
3566 ULONG Future[2];
3567 } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
3568
3569 typedef struct _PAGED_LOOKASIDE_LIST {
3570 GENERAL_LOOKASIDE L;
3571 #if !defined(_AMD64_) && !defined(_IA64_)
3572 FAST_MUTEX Lock__ObsoleteButDoNotDelete;
3573 #endif
3574 } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
3575
3576 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST {
3577 GENERAL_LOOKASIDE L;
3578 #if !defined(_AMD64_) && !defined(_IA64_)
3579 KSPIN_LOCK Lock__ObsoleteButDoNotDelete;
3580 #endif
3581 } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
3582
3583 //typedef struct _LOOKASIDE_LIST_EX {
3584 // GENERAL_LOOKASIDE_POOL L;
3585 //} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
3586
3587 typedef struct _EX_RUNDOWN_REF {
3588 __GNU_EXTENSION union {
3589 volatile ULONG_PTR Count;
3590 volatile PVOID Ptr;
3591 };
3592 } EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
3593
3594 typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE;
3595
3596 typedef enum _WORK_QUEUE_TYPE {
3597 CriticalWorkQueue,
3598 DelayedWorkQueue,
3599 HyperCriticalWorkQueue,
3600 MaximumWorkQueue
3601 } WORK_QUEUE_TYPE;
3602
3603 typedef VOID
3604 (DDKAPI *PWORKER_THREAD_ROUTINE)(
3605 IN PVOID Parameter);
3606
3607 typedef struct _WORK_QUEUE_ITEM {
3608 LIST_ENTRY List;
3609 PWORKER_THREAD_ROUTINE WorkerRoutine;
3610 volatile PVOID Parameter;
3611 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
3612
3613
3614 /******************************************************************************
3615 * Executive Functions *
3616 ******************************************************************************/
3617
3618 #if defined(_X86_)
3619 #if defined(_NTHAL_)
3620 #define ExAcquireFastMutex ExiAcquireFastMutex
3621 #define ExReleaseFastMutex ExiReleaseFastMutex
3622 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
3623 #endif
3624 #define ExInterlockedAddUlong ExfInterlockedAddUlong
3625 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
3626 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
3627 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
3628 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
3629 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
3630 #endif
3631
3632 #if defined(_WIN64)
3633
3634 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
3635 defined(_NTHAL_) || defined(_NTOSP_)
3636 NTKERNELAPI
3637 USHORT
3638 ExQueryDepthSList(IN PSLIST_HEADER ListHead);
3639 #else
3640 FORCEINLINE
3641 USHORT
3642 ExQueryDepthSList(IN PSLIST_HEADER ListHead)
3643 {
3644 return (USHORT)(ListHead->Alignment & 0xffff);
3645 }
3646 #endif
3647
3648 NTKERNELAPI
3649 PSLIST_ENTRY
3650 ExpInterlockedFlushSList(
3651 PSLIST_HEADER ListHead);
3652
3653 NTKERNELAPI
3654 PSLIST_ENTRY
3655 ExpInterlockedPopEntrySList(
3656 PSLIST_HEADER ListHead);
3657
3658 NTKERNELAPI
3659 PSLIST_ENTRY
3660 ExpInterlockedPushEntrySList(
3661 PSLIST_HEADER ListHead,
3662 PSLIST_ENTRY ListEntry);
3663
3664 #define ExInterlockedFlushSList(Head) \
3665 ExpInterlockedFlushSList(Head)
3666 #define ExInterlockedPopEntrySList(Head, Lock) \
3667 ExpInterlockedPopEntrySList(Head)
3668 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
3669 ExpInterlockedPushEntrySList(Head, Entry)
3670
3671 #else // !defined(_WIN64)
3672
3673 #define ExQueryDepthSList(listhead) (listhead)->Depth
3674
3675 NTKERNELAPI
3676 PSINGLE_LIST_ENTRY
3677 FASTCALL
3678 ExInterlockedFlushSList(
3679 IN PSLIST_HEADER ListHead);
3680
3681 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
3682 NTKERNELAPI
3683 PSINGLE_LIST_ENTRY
3684 FASTCALL
3685 ExInterlockedPopEntrySList(
3686 IN PSLIST_HEADER ListHead,
3687 IN PKSPIN_LOCK Lock);
3688
3689 NTKERNELAPI
3690 PSINGLE_LIST_ENTRY
3691 FASTCALL
3692 ExInterlockedPushEntrySList(
3693 IN PSLIST_HEADER ListHead,
3694 IN PSINGLE_LIST_ENTRY ListEntry,
3695 IN PKSPIN_LOCK Lock);
3696 #else
3697 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
3698 InterlockedPopEntrySList(_ListHead)
3699 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
3700 InterlockedPushEntrySList(_ListHead, _ListEntry)
3701 #endif // _WIN2K_COMPAT_SLIST_USAGE
3702
3703 #endif // !defined(_WIN64)
3704
3705 /* ERESOURCE_THREAD
3706 * ExGetCurrentResourceThread(
3707 * VOID);
3708 */
3709 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
3710
3711 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
3712
3713 /* VOID
3714 * ExInitializeWorkItem(
3715 * IN PWORK_QUEUE_ITEM Item,
3716 * IN PWORKER_THREAD_ROUTINE Routine,
3717 * IN PVOID Context)
3718 */
3719 #define ExInitializeWorkItem(Item, Routine, Context) \
3720 { \
3721 (Item)->WorkerRoutine = Routine; \
3722 (Item)->Parameter = Context; \
3723 (Item)->List.Flink = NULL; \
3724 }
3725
3726 #if (NTDDI_VERSION >= NTDDI_WIN2K)
3727
3728 NTKERNELAPI
3729 VOID
3730 FASTCALL
3731 ExAcquireFastMutex(
3732 IN OUT PFAST_MUTEX FastMutex);
3733
3734 NTKERNELAPI
3735 VOID
3736 FASTCALL
3737 ExReleaseFastMutex(
3738 IN OUT PFAST_MUTEX FastMutex);
3739
3740 NTKERNELAPI
3741 BOOLEAN
3742 FASTCALL
3743 ExTryToAcquireFastMutex(
3744 IN OUT PFAST_MUTEX FastMutex);
3745
3746 NTKERNELAPI
3747 VOID
3748 FASTCALL
3749 ExAcquireFastMutexUnsafe(
3750 IN OUT PFAST_MUTEX FastMutex);
3751
3752 NTKERNELAPI
3753 VOID
3754 FASTCALL
3755 ExReleaseFastMutexUnsafe(
3756 IN OUT PFAST_MUTEX FastMutex);
3757
3758 NTKERNELAPI
3759 BOOLEAN
3760 NTAPI
3761 ExAcquireResourceExclusiveLite(
3762 IN PERESOURCE Resource,
3763 IN BOOLEAN Wait);
3764
3765 NTKERNELAPI
3766 BOOLEAN
3767 NTAPI
3768 ExAcquireResourceSharedLite(
3769 IN PERESOURCE Resource,
3770 IN BOOLEAN Wait);
3771
3772 NTKERNELAPI
3773 BOOLEAN
3774 NTAPI
3775 ExAcquireSharedStarveExclusive(
3776 IN PERESOURCE Resource,
3777 IN BOOLEAN Wait);
3778
3779 NTKERNELAPI
3780 BOOLEAN
3781 NTAPI
3782 ExAcquireSharedWaitForExclusive(
3783 IN PERESOURCE Resource,
3784 IN BOOLEAN Wait);
3785
3786 NTKERNELAPI
3787 PVOID
3788 NTAPI
3789 ExAllocatePool(
3790 IN POOL_TYPE PoolType,
3791 IN SIZE_T NumberOfBytes);
3792
3793 #ifdef POOL_TAGGING
3794 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
3795 #endif /* POOL_TAGGING */
3796
3797 NTKERNELAPI
3798 PVOID
3799 NTAPI
3800 ExAllocatePoolWithQuota(
3801 IN POOL_TYPE PoolType,
3802 IN SIZE_T NumberOfBytes);
3803
3804 #ifdef POOL_TAGGING
3805 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
3806 #endif /* POOL_TAGGING */
3807
3808 NTKERNELAPI
3809 PVOID
3810 NTAPI
3811 ExAllocatePoolWithQuotaTag(
3812 IN POOL_TYPE PoolType,
3813 IN SIZE_T NumberOfBytes,
3814 IN ULONG Tag);
3815
3816 #ifndef POOL_TAGGING
3817 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
3818 #endif /* POOL_TAGGING */
3819
3820 NTKERNELAPI
3821 PVOID
3822 NTAPI
3823 ExAllocatePoolWithTag(
3824 IN POOL_TYPE PoolType,
3825 IN SIZE_T NumberOfBytes,
3826 IN ULONG Tag);
3827
3828 NTKERNELAPI
3829 PVOID
3830 NTAPI
3831 ExAllocatePoolWithTagPriority(
3832 IN POOL_TYPE PoolType,
3833 IN SIZE_T NumberOfBytes,
3834 IN ULONG Tag,
3835 IN EX_POOL_PRIORITY Priority);
3836
3837 NTKERNELAPI
3838 VOID
3839 NTAPI
3840 ExConvertExclusiveToSharedLite(
3841 IN PERESOURCE Resource);
3842
3843 NTKERNELAPI
3844 NTSTATUS
3845 NTAPI
3846 ExCreateCallback(
3847 OUT PCALLBACK_OBJECT *CallbackObject,
3848 IN POBJECT_ATTRIBUTES ObjectAttributes,
3849 IN BOOLEAN Create,
3850 IN BOOLEAN AllowMultipleCallbacks);
3851
3852 NTKERNELAPI
3853 VOID
3854 NTAPI
3855 ExDeleteNPagedLookasideList(
3856 IN PNPAGED_LOOKASIDE_LIST Lookaside);
3857
3858 NTKERNELAPI
3859 VOID
3860 NTAPI
3861 ExDeletePagedLookasideList(
3862 IN PPAGED_LOOKASIDE_LIST Lookaside);
3863
3864 NTKERNELAPI
3865 NTSTATUS
3866 NTAPI
3867 ExDeleteResourceLite(
3868 IN PERESOURCE Resource);
3869
3870 NTKERNELAPI
3871 VOID
3872 NTAPI
3873 ExFreePool(
3874 IN PVOID P);
3875
3876 #ifdef POOL_TAGGING
3877 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
3878 #endif
3879
3880 NTKERNELAPI
3881 VOID
3882 NTAPI
3883 ExFreePoolWithTag(
3884 IN PVOID P,
3885 IN ULONG Tag);
3886
3887 NTKERNELAPI
3888 ULONG
3889 NTAPI
3890 ExGetExclusiveWaiterCount(
3891 IN PERESOURCE Resource);
3892
3893 NTKERNELAPI
3894 KPROCESSOR_MODE
3895 NTAPI
3896 ExGetPreviousMode(
3897 VOID);
3898
3899 NTKERNELAPI
3900 ULONG
3901 NTAPI
3902 ExGetSharedWaiterCount(
3903 IN PERESOURCE Resource);
3904
3905 NTKERNELAPI
3906 VOID
3907 NTAPI
3908 ExInitializeNPagedLookasideList(
3909 IN PNPAGED_LOOKASIDE_LIST Lookaside,
3910 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
3911 IN PFREE_FUNCTION Free OPTIONAL,
3912 IN ULONG Flags,
3913 IN SIZE_T Size,
3914 IN ULONG Tag,
3915 IN USHORT Depth);
3916
3917 NTKERNELAPI
3918 VOID
3919 NTAPI
3920 ExInitializePagedLookasideList(
3921 IN PPAGED_LOOKASIDE_LIST Lookaside,
3922 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
3923 IN PFREE_FUNCTION Free OPTIONAL,
3924 IN ULONG Flags,
3925 IN SIZE_T Size,
3926 IN ULONG Tag,
3927 IN USHORT Depth);
3928
3929 NTKERNELAPI
3930 NTSTATUS
3931 NTAPI
3932 ExInitializeResourceLite(
3933 IN PERESOURCE Resource);
3934
3935 NTKERNELAPI
3936 LARGE_INTEGER
3937 NTAPI
3938 ExInterlockedAddLargeInteger(
3939 IN PLARGE_INTEGER Addend,
3940 IN LARGE_INTEGER Increment,
3941 IN PKSPIN_LOCK Lock);
3942
3943 #if defined(_WIN64)
3944 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
3945 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
3946 #else
3947 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
3948 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
3949 #endif
3950
3951 NTKERNELAPI
3952 ULONG
3953 FASTCALL
3954 ExInterlockedAddUlong(
3955 IN PULONG Addend,
3956 IN ULONG Increment,
3957 PKSPIN_LOCK Lock);
3958
3959 #if defined(_AMD64_) || defined(_IA64_)
3960 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
3961 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
3962 #elif defined(_X86_)
3963 NTKERNELAPI
3964 LONGLONG
3965 FASTCALL
3966 ExfInterlockedCompareExchange64(
3967 IN OUT LONGLONG volatile *Destination,
3968 IN PLONGLONG Exchange,
3969 IN PLONGLONG Comperand);
3970 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
3971 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
3972 #else
3973 NTKERNELAPI
3974 LONGLONG
3975 FASTCALL
3976 ExInterlockedCompareExchange64(
3977 IN OUT LONGLONG volatile *Destination,
3978 IN PLONGLONG Exchange,
3979 IN PLONGLONG Comparand,
3980 IN PKSPIN_LOCK Lock);
3981 #endif
3982
3983 NTKERNELAPI
3984 PLIST_ENTRY
3985 FASTCALL
3986 ExInterlockedInsertHeadList(
3987 IN PLIST_ENTRY ListHead,
3988 IN PLIST_ENTRY ListEntry,
3989 IN PKSPIN_LOCK Lock);
3990
3991 NTKERNELAPI
3992 PLIST_ENTRY
3993 FASTCALL
3994 ExInterlockedInsertTailList(
3995 IN PLIST_ENTRY ListHead,
3996 IN PLIST_ENTRY ListEntry,
3997 IN PKSPIN_LOCK Lock);
3998
3999 NTKERNELAPI
4000 PSINGLE_LIST_ENTRY
4001 FASTCALL
4002 ExInterlockedPopEntryList(
4003 IN PSINGLE_LIST_ENTRY ListHead,
4004 IN PKSPIN_LOCK Lock);
4005
4006 NTKERNELAPI
4007 PSINGLE_LIST_ENTRY
4008 FASTCALL
4009 ExInterlockedPushEntryList(
4010 IN PSINGLE_LIST_ENTRY ListHead,
4011 IN PSINGLE_LIST_ENTRY ListEntry,
4012 IN PKSPIN_LOCK Lock);
4013
4014 NTKERNELAPI
4015 PLIST_ENTRY
4016 FASTCALL
4017 ExInterlockedRemoveHeadList(
4018 IN PLIST_ENTRY ListHead,
4019 IN PKSPIN_LOCK Lock);
4020
4021 NTKERNELAPI
4022 BOOLEAN
4023 NTAPI
4024 ExIsProcessorFeaturePresent(
4025 IN ULONG ProcessorFeature);
4026
4027 NTKERNELAPI
4028 BOOLEAN
4029 NTAPI
4030 ExIsResourceAcquiredExclusiveLite(
4031 IN PERESOURCE Resource);
4032
4033 NTKERNELAPI
4034 ULONG
4035 NTAPI
4036 ExIsResourceAcquiredSharedLite(
4037 IN PERESOURCE Resource);
4038
4039 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
4040
4041 NTKERNELAPI
4042 VOID
4043 NTAPI
4044 ExLocalTimeToSystemTime(
4045 IN PLARGE_INTEGER LocalTime,
4046 OUT PLARGE_INTEGER SystemTime);
4047
4048 NTKERNELAPI
4049 VOID
4050 NTAPI
4051 ExNotifyCallback(
4052 IN PCALLBACK_OBJECT CallbackObject,
4053 IN PVOID Argument1,
4054 IN PVOID Argument2);
4055
4056 NTKERNELAPI
4057 VOID
4058 NTAPI
4059 ExQueueWorkItem(
4060 IN PWORK_QUEUE_ITEM WorkItem,
4061 IN WORK_QUEUE_TYPE QueueType);
4062
4063 NTKERNELAPI
4064 DECLSPEC_NORETURN
4065 VOID
4066 NTAPI
4067 ExRaiseStatus(
4068 IN NTSTATUS Status);
4069
4070 NTKERNELAPI
4071 PVOID
4072 NTAPI
4073 ExRegisterCallback(
4074 IN PCALLBACK_OBJECT CallbackObject,
4075 IN PCALLBACK_FUNCTION CallbackFunction,
4076 IN PVOID CallbackContext);
4077
4078 NTKERNELAPI
4079 NTSTATUS
4080 NTAPI
4081 ExReinitializeResourceLite(
4082 IN PERESOURCE Resource);
4083
4084 NTKERNELAPI
4085 VOID
4086 NTAPI
4087 ExReleaseResourceForThreadLite(
4088 IN PERESOURCE Resource,
4089 IN ERESOURCE_THREAD ResourceThreadId);
4090
4091 NTKERNELAPI
4092 VOID
4093 FASTCALL
4094 ExReleaseResourceLite(
4095 IN PERESOURCE Resource);
4096
4097 NTKERNELAPI
4098 VOID
4099 NTAPI
4100 ExSetResourceOwnerPointer(
4101 IN PERESOURCE Resource,
4102 IN PVOID OwnerPointer);
4103
4104 NTKERNELAPI
4105 ULONG
4106 NTAPI
4107 ExSetTimerResolution(
4108 IN ULONG DesiredTime,
4109 IN BOOLEAN SetResolution);
4110
4111 NTKERNELAPI
4112 VOID
4113 NTAPI
4114 ExSystemTimeToLocalTime(
4115 IN PLARGE_INTEGER SystemTime,
4116 OUT PLARGE_INTEGER LocalTime);
4117
4118 NTKERNELAPI
4119 VOID
4120 NTAPI
4121 ExUnregisterCallback(
4122 IN PVOID CbRegistration);
4123
4124
4125 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
4126
4127 #if (NTDDI_VERSION >= NTDDI_WINXP)
4128 NTKERNELAPI
4129 BOOLEAN
4130 FASTCALL
4131 ExAcquireRundownProtection(
4132 IN OUT PEX_RUNDOWN_REF RunRef);
4133
4134 NTKERNELAPI
4135 VOID
4136 FASTCALL
4137 ExInitializeRundownProtection(
4138 OUT PEX_RUNDOWN_REF RunRef);
4139
4140 NTKERNELAPI
4141 VOID
4142 FASTCALL
4143 ExReInitializeRundownProtection(
4144 OUT PEX_RUNDOWN_REF RunRef);
4145
4146 NTKERNELAPI
4147 VOID
4148 FASTCALL
4149 ExReleaseRundownProtection(
4150 IN OUT PEX_RUNDOWN_REF RunRef);
4151
4152 NTKERNELAPI
4153 VOID
4154 FASTCALL
4155 ExRundownCompleted(
4156 OUT PEX_RUNDOWN_REF RunRef);
4157
4158 NTKERNELAPI
4159 BOOLEAN
4160 NTAPI
4161 ExVerifySuite(
4162 IN SUITE_TYPE SuiteType);
4163
4164 NTKERNELAPI
4165 VOID
4166 FASTCALL
4167 ExWaitForRundownProtectionRelease(
4168 IN OUT PEX_RUNDOWN_REF RunRef);
4169
4170 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
4171
4172 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
4173 NTKERNELAPI
4174 BOOLEAN
4175 FASTCALL
4176 ExAcquireRundownProtectionEx(
4177 IN OUT PEX_RUNDOWN_REF RunRef,
4178 IN ULONG Count);
4179
4180 NTKERNELAPI
4181 VOID
4182 FASTCALL
4183 ExReleaseRundownProtectionEx(
4184 IN OUT PEX_RUNDOWN_REF RunRef,
4185 IN ULONG Count);
4186 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
4187
4188 #if (NTDDI_VERSION >= NTDDI_WS03)
4189
4190 #endif // (NTDDI_VERSION >= NTDDI_WS03)
4191
4192 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
4193 NTKERNELAPI
4194 PEX_RUNDOWN_REF_CACHE_AWARE
4195 ExAllocateCacheAwareRundownProtection(
4196 IN POOL_TYPE PoolType,
4197 IN ULONG PoolTag);
4198
4199 NTKERNELAPI
4200 SIZE_T
4201 ExSizeOfRundownProtectionCacheAware(VOID);
4202
4203 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
4204
4205 #if (NTDDI_VERSION >= NTDDI_VISTA)
4206 NTKERNELAPI
4207 NTSTATUS
4208 ExInitializeLookasideListEx(
4209 OUT PLOOKASIDE_LIST_EX Lookaside,
4210 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,
4211 IN PFREE_FUNCTION_EX Free OPTIONAL,
4212 IN POOL_TYPE PoolType,
4213 IN ULONG Flags,
4214 IN SIZE_T Size,
4215 IN ULONG Tag,
4216 IN USHORT Depth);
4217 #endif
4218
4219
4220 #if !defined(MIDL_PASS)
4221
4222 static __inline PVOID
4223 ExAllocateFromNPagedLookasideList(
4224 IN PNPAGED_LOOKASIDE_LIST Lookaside)
4225 {
4226 PVOID Entry;
4227
4228 Lookaside->L.TotalAllocates++;
4229 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
4230 if (Entry == NULL) {
4231 Lookaside->L.AllocateMisses++;
4232 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
4233 Lookaside->L.Size,
4234 Lookaside->L.Tag);
4235 }
4236 return Entry;
4237 }
4238
4239 static __inline PVOID
4240 ExAllocateFromPagedLookasideList(
4241 IN PPAGED_LOOKASIDE_LIST Lookaside)
4242 {
4243 PVOID Entry;
4244
4245 Lookaside->L.TotalAllocates++;
4246 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
4247 if (Entry == NULL) {
4248 Lookaside->L.AllocateMisses++;
4249 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
4250 Lookaside->L.Size,
4251 Lookaside->L.Tag);
4252 }
4253 return Entry;
4254 }
4255
4256 static __inline VOID
4257 ExFreeToNPagedLookasideList(
4258 IN PNPAGED_LOOKASIDE_LIST Lookaside,
4259 IN PVOID Entry)
4260 {
4261 Lookaside->L.TotalFrees++;
4262 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
4263 Lookaside->L.FreeMisses++;
4264 (Lookaside->L.Free)(Entry);
4265 } else {
4266 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
4267 }
4268 }
4269
4270 static __inline VOID
4271 ExFreeToPagedLookasideList(
4272 IN PPAGED_LOOKASIDE_LIST Lookaside,
4273 IN PVOID Entry)
4274 {
4275 Lookaside->L.TotalFrees++;
4276 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
4277 Lookaside->L.FreeMisses++;
4278 (Lookaside->L.Free)(Entry);
4279 } else {
4280 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
4281 }
4282 }
4283
4284
4285 #endif // !defined(MIDL_PASS)
4286
4287
4288 #ifdef __cplusplus
4289 }
4290 #endif
4291
4292 #endif // _WDMDDK_