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