Move the declarations from winnt4.h, win2k.h and winxp.h into wdm.h or winddk and...
[reactos.git] / reactos / include / ddk / wdm.h
1 #ifndef _WDMDDK_
2 #define _WDMDDK_
3
4 //
5 // Dependencies
6 //
7 #define NT_INCLUDED
8 #include <excpt.h>
9 #include <ntdef.h>
10 #include <ntstatus.h>
11
12 #ifndef GUID_DEFINED
13 #include <guiddef.h>
14 #endif /* GUID_DEFINED */
15
16 #ifdef __GNUC__
17 #include "intrin.h"
18 #endif
19
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23
24 #ifdef _NTOSKRNL_
25 /* HACKHACKHACK!!! We shouldn't include this header from ntoskrnl! */
26 #define NTKERNELAPI
27 #else
28 #define NTKERNELAPI DECLSPEC_IMPORT
29 #endif
30
31 /* Simple types */
32 typedef UCHAR KPROCESSOR_MODE;
33 typedef LONG KPRIORITY;
34 typedef PVOID PSECURITY_DESCRIPTOR;
35 typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;
36
37 /* Structures not exposed to drivers */
38 typedef struct _OBJECT_TYPE *POBJECT_TYPE;
39 typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE;
40 typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE;
41 typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT;
42 typedef struct _BUS_HANDLER *PBUS_HANDLER;
43
44 typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT;
45 typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
46 typedef struct _ETHREAD *PETHREAD;
47 typedef struct _EPROCESS *PEPROCESS;
48 typedef struct _IO_TIMER *PIO_TIMER;
49 typedef struct _KINTERRUPT *PKINTERRUPT;
50 typedef struct _KPROCESS *PKPROCESS;
51 typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
52
53
54 typedef struct _CONTEXT *PCONTEXT;
55
56 //
57 // Resource list definitions
58 //
59 typedef int CM_RESOURCE_TYPE;
60
61 #define CmResourceTypeNull 0
62 #define CmResourceTypePort 1
63 #define CmResourceTypeInterrupt 2
64 #define CmResourceTypeMemory 3
65 #define CmResourceTypeDma 4
66 #define CmResourceTypeDeviceSpecific 5
67 #define CmResourceTypeBusNumber 6
68 #define CmResourceTypeNonArbitrated 128
69 #define CmResourceTypeConfigData 128
70 #define CmResourceTypeDevicePrivate 129
71 #define CmResourceTypePcCardConfig 130
72 #define CmResourceTypeMfCardConfig 131
73
74
75
76 //
77 // Global debug flag
78 //
79 extern ULONG NtGlobalFlag;
80
81
82
83 //
84 // Section map options
85 //
86 typedef enum _SECTION_INHERIT {
87 ViewShare = 1,
88 ViewUnmap = 2
89 } SECTION_INHERIT;
90
91 //
92 // Section access rights
93 //
94 #define SECTION_QUERY 0x0001
95 #define SECTION_MAP_WRITE 0x0002
96 #define SECTION_MAP_READ 0x0004
97 #define SECTION_MAP_EXECUTE 0x0008
98 #define SECTION_EXTEND_SIZE 0x0010
99 #define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
100
101 #define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
102 SECTION_MAP_WRITE | \
103 SECTION_MAP_READ | \
104 SECTION_MAP_EXECUTE | \
105 SECTION_EXTEND_SIZE)
106
107 #define SESSION_QUERY_ACCESS 0x0001
108 #define SESSION_MODIFY_ACCESS 0x0002
109
110 #define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
111 SESSION_QUERY_ACCESS | \
112 SESSION_MODIFY_ACCESS)
113
114
115
116 #define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
117
118 #define PAGE_NOACCESS 0x01
119 #define PAGE_READONLY 0x02
120 #define PAGE_READWRITE 0x04
121 #define PAGE_WRITECOPY 0x08
122 #define PAGE_EXECUTE 0x10
123 #define PAGE_EXECUTE_READ 0x20
124 #define PAGE_EXECUTE_READWRITE 0x40
125 #define PAGE_EXECUTE_WRITECOPY 0x80
126 #define PAGE_GUARD 0x100
127 #define PAGE_NOCACHE 0x200
128 #define PAGE_WRITECOMBINE 0x400
129
130 #define MEM_COMMIT 0x1000
131 #define MEM_RESERVE 0x2000
132 #define MEM_DECOMMIT 0x4000
133 #define MEM_RELEASE 0x8000
134 #define MEM_FREE 0x10000
135 #define MEM_PRIVATE 0x20000
136 #define MEM_MAPPED 0x40000
137 #define MEM_RESET 0x80000
138 #define MEM_TOP_DOWN 0x100000
139 #define MEM_LARGE_PAGES 0x20000000
140 #define MEM_4MB_PAGES 0x80000000
141
142 #define SEC_RESERVE 0x4000000
143 #define SEC_LARGE_PAGES 0x80000000
144
145 #define PROCESS_DUP_HANDLE (0x0040)
146
147 #if (NTDDI_VERSION >= NTDDI_VISTA)
148 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
149 0xFFFF)
150 #else
151 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
152 0xFFF)
153 #endif
154
155
156
157 //
158 // Processor features
159 //
160 #define PF_FLOATING_POINT_PRECISION_ERRATA 0
161 #define PF_FLOATING_POINT_EMULATED 1
162 #define PF_COMPARE_EXCHANGE_DOUBLE 2
163 #define PF_MMX_INSTRUCTIONS_AVAILABLE 3
164 #define PF_PPC_MOVEMEM_64BIT_OK 4
165 #define PF_ALPHA_BYTE_INSTRUCTIONS 5
166 #define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
167 #define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
168 #define PF_RDTSC_INSTRUCTION_AVAILABLE 8
169 #define PF_PAE_ENABLED 9
170 #define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
171 #define PF_SSE_DAZ_MODE_AVAILABLE 11
172 #define PF_NX_ENABLED 12
173 #define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
174 #define PF_COMPARE_EXCHANGE128 14
175 #define PF_COMPARE64_EXCHANGE128 15
176 #define PF_CHANNELS_ENABLED 16
177
178
179
180 //
181 // Intrinsics (note: taken from our winnt.h)
182 // FIXME: 64-bit
183 //
184 #if defined(__GNUC__)
185
186 static __inline__ BOOLEAN
187 InterlockedBitTestAndSet(IN LONG volatile *Base,
188 IN LONG Bit)
189 {
190 #if defined(_M_IX86)
191 LONG OldBit;
192 __asm__ __volatile__("lock "
193 "btsl %2,%1\n\t"
194 "sbbl %0,%0\n\t"
195 :"=r" (OldBit),"+m" (*Base)
196 :"Ir" (Bit)
197 : "memory");
198 return OldBit;
199 #else
200 return (_InterlockedOr(Base, 1 << Bit) >> Bit) & 1;
201 #endif
202 }
203
204 static __inline__ BOOLEAN
205 InterlockedBitTestAndReset(IN LONG volatile *Base,
206 IN LONG Bit)
207 {
208 #if defined(_M_IX86)
209 LONG OldBit;
210 __asm__ __volatile__("lock "
211 "btrl %2,%1\n\t"
212 "sbbl %0,%0\n\t"
213 :"=r" (OldBit),"+m" (*Base)
214 :"Ir" (Bit)
215 : "memory");
216 return OldBit;
217 #else
218 return (_InterlockedAnd(Base, ~(1 << Bit)) >> Bit) & 1;
219 #endif
220 }
221
222 #endif
223
224 #define BitScanForward _BitScanForward
225 #define BitScanReverse _BitScanReverse
226
227 #define BitTest _bittest
228 #define BitTestAndComplement _bittestandcomplement
229 #define BitTestAndSet _bittestandset
230 #define BitTestAndReset _bittestandreset
231 #define InterlockedBitTestAndSet _interlockedbittestandset
232 #define InterlockedBitTestAndReset _interlockedbittestandreset
233
234
235 /** INTERLOCKED FUNCTIONS *****************************************************/
236
237 #if !defined(__INTERLOCKED_DECLARED)
238 #define __INTERLOCKED_DECLARED
239
240 #if defined (_X86_)
241 #if defined(NO_INTERLOCKED_INTRINSICS)
242 NTKERNELAPI
243 LONG
244 FASTCALL
245 InterlockedIncrement(
246 IN OUT LONG volatile *Addend);
247
248 NTKERNELAPI
249 LONG
250 FASTCALL
251 InterlockedDecrement(
252 IN OUT LONG volatile *Addend);
253
254 NTKERNELAPI
255 LONG
256 FASTCALL
257 InterlockedCompareExchange(
258 IN OUT LONG volatile *Destination,
259 IN LONG Exchange,
260 IN LONG Comparand);
261
262 NTKERNELAPI
263 LONG
264 FASTCALL
265 InterlockedExchange(
266 IN OUT LONG volatile *Destination,
267 IN LONG Value);
268
269 NTKERNELAPI
270 LONG
271 FASTCALL
272 InterlockedExchangeAdd(
273 IN OUT LONG volatile *Addend,
274 IN LONG Value);
275
276 #else // !defined(NO_INTERLOCKED_INTRINSICS)
277
278 #define InterlockedExchange _InterlockedExchange
279 #define InterlockedIncrement _InterlockedIncrement
280 #define InterlockedDecrement _InterlockedDecrement
281 #define InterlockedExchangeAdd _InterlockedExchangeAdd
282 #define InterlockedCompareExchange _InterlockedCompareExchange
283 #define InterlockedOr _InterlockedOr
284 #define InterlockedAnd _InterlockedAnd
285 #define InterlockedXor _InterlockedXor
286
287 #endif // !defined(NO_INTERLOCKED_INTRINSICS)
288
289 #endif // defined (_X86_)
290
291 #if !defined (_WIN64)
292 /*
293 * PVOID
294 * InterlockedExchangePointer(
295 * IN OUT PVOID VOLATILE *Target,
296 * IN PVOID Value)
297 */
298 #define InterlockedExchangePointer(Target, Value) \
299 ((PVOID) InterlockedExchange((PLONG) Target, (LONG) Value))
300
301 /*
302 * PVOID
303 * InterlockedCompareExchangePointer(
304 * IN OUT PVOID *Destination,
305 * IN PVOID Exchange,
306 * IN PVOID Comparand)
307 */
308 #define InterlockedCompareExchangePointer(Destination, Exchange, Comparand) \
309 ((PVOID) InterlockedCompareExchange((PLONG) Destination, (LONG) Exchange, (LONG) Comparand))
310
311 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd((LONG *)a, b)
312 #define InterlockedIncrementSizeT(a) InterlockedIncrement((LONG *)a)
313 #define InterlockedDecrementSizeT(a) InterlockedDecrement((LONG *)a)
314
315 #endif // !defined (_WIN64)
316
317 #if defined (_M_AMD64)
318
319 #define InterlockedExchangeAddSizeT(a, b) InterlockedExchangeAdd64((LONGLONG *)a, (LONGLONG)b)
320 #define InterlockedIncrementSizeT(a) InterlockedIncrement64((LONGLONG *)a)
321 #define InterlockedDecrementSizeT(a) InterlockedDecrement64((LONGLONG *)a)
322 #define InterlockedAnd _InterlockedAnd
323 #define InterlockedOr _InterlockedOr
324 #define InterlockedXor _InterlockedXor
325 #define InterlockedIncrement _InterlockedIncrement
326 #define InterlockedDecrement _InterlockedDecrement
327 #define InterlockedAdd _InterlockedAdd
328 #define InterlockedExchange _InterlockedExchange
329 #define InterlockedExchangeAdd _InterlockedExchangeAdd
330 #define InterlockedCompareExchange _InterlockedCompareExchange
331 #define InterlockedAnd64 _InterlockedAnd64
332 #define InterlockedOr64 _InterlockedOr64
333 #define InterlockedXor64 _InterlockedXor64
334 #define InterlockedIncrement64 _InterlockedIncrement64
335 #define InterlockedDecrement64 _InterlockedDecrement64
336 #define InterlockedAdd64 _InterlockedAdd64
337 #define InterlockedExchange64 _InterlockedExchange64
338 #define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
339 #define InterlockedCompareExchange64 _InterlockedCompareExchange64
340 #define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
341 #define InterlockedExchangePointer _InterlockedExchangePointer
342 #define InterlockedBitTestAndSet64 _interlockedbittestandset64
343 #define InterlockedBitTestAndReset64 _interlockedbittestandreset64
344
345 #endif // _M_AMD64
346
347 #if defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
348 //#if !defined(_X86AMD64_) // FIXME: what's _X86AMD64_ used for?
349 FORCEINLINE
350 LONG64
351 InterlockedAdd64(
352 IN OUT LONG64 volatile *Addend,
353 IN LONG64 Value)
354 {
355 return InterlockedExchangeAdd64(Addend, Value) + Value;
356 }
357 //#endif
358 #endif
359
360 #endif /* !__INTERLOCKED_DECLARED */
361
362 #if defined(_M_IX86)
363 #define YieldProcessor _mm_pause
364 #elif defined (_M_AMD64)
365 #define YieldProcessor _mm_pause
366 #elif defined(_M_PPC)
367 #define YieldProcessor() __asm__ __volatile__("nop");
368 #elif defined(_M_MIPS)
369 #define YieldProcessor() __asm__ __volatile__("nop");
370 #elif defined(_M_ARM)
371 #define YieldProcessor()
372 #else
373 #error Unknown architecture
374 #endif
375
376
377
378 //
379 // Slist Header
380 //
381 #ifndef _SLIST_HEADER_
382 #define _SLIST_HEADER_
383
384 #define SLIST_ENTRY SINGLE_LIST_ENTRY
385 #define _SLIST_ENTRY _SINGLE_LIST_ENTRY
386 #define PSLIST_ENTRY PSINGLE_LIST_ENTRY
387
388 #if defined(_WIN64)
389 typedef union _SLIST_HEADER {
390 struct {
391 ULONGLONG Alignment;
392 ULONGLONG Region;
393 } DUMMYSTRUCTNAME;
394 struct {
395 ULONGLONG Depth:16;
396 ULONGLONG Sequence:9;
397 ULONGLONG NextEntry:39;
398 ULONGLONG HeaderType:1;
399 ULONGLONG Init:1;
400 ULONGLONG Reserved:59;
401 ULONGLONG Region:3;
402 } Header8;
403 ULONGLONG Depth:16;
404 ULONGLONG Sequence:48;
405 ULONGLONG HeaderType:1;
406 ULONGLONG Init:1;
407 ULONGLONG Reserved:2;
408 ULONGLONG NextEntry:60;
409 struct {
410 } Header16;
411 } SLIST_HEADER, *PSLIST_HEADER;
412 #else
413 typedef union _SLIST_HEADER {
414 ULONGLONG Alignment;
415 struct {
416 SLIST_ENTRY Next;
417 USHORT Depth;
418 USHORT Sequence;
419 } DUMMYSTRUCTNAME;
420 } SLIST_HEADER, *PSLIST_HEADER;
421 #endif
422
423 #endif /* _SLIST_HEADER_ */
424
425
426
427 //
428 // Power States/Levels
429 //
430 typedef enum _SYSTEM_POWER_STATE {
431 PowerSystemUnspecified,
432 PowerSystemWorking,
433 PowerSystemSleeping1,
434 PowerSystemSleeping2,
435 PowerSystemSleeping3,
436 PowerSystemHibernate,
437 PowerSystemShutdown,
438 PowerSystemMaximum
439 } SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
440
441 #define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
442
443 typedef enum _POWER_INFORMATION_LEVEL {
444 SystemPowerPolicyAc,
445 SystemPowerPolicyDc,
446 VerifySystemPolicyAc,
447 VerifySystemPolicyDc,
448 SystemPowerCapabilities,
449 SystemBatteryState,
450 SystemPowerStateHandler,
451 ProcessorStateHandler,
452 SystemPowerPolicyCurrent,
453 AdministratorPowerPolicy,
454 SystemReserveHiberFile,
455 ProcessorInformation,
456 SystemPowerInformation,
457 ProcessorStateHandler2,
458 LastWakeTime,
459 LastSleepTime,
460 SystemExecutionState,
461 SystemPowerStateNotifyHandler,
462 ProcessorPowerPolicyAc,
463 ProcessorPowerPolicyDc,
464 VerifyProcessorPowerPolicyAc,
465 VerifyProcessorPowerPolicyDc,
466 ProcessorPowerPolicyCurrent
467 } POWER_INFORMATION_LEVEL;
468
469 typedef enum {
470 PowerActionNone,
471 PowerActionReserved,
472 PowerActionSleep,
473 PowerActionHibernate,
474 PowerActionShutdown,
475 PowerActionShutdownReset,
476 PowerActionShutdownOff,
477 PowerActionWarmEject
478 } POWER_ACTION, *PPOWER_ACTION;
479
480 typedef enum _DEVICE_POWER_STATE {
481 PowerDeviceUnspecified,
482 PowerDeviceD0,
483 PowerDeviceD1,
484 PowerDeviceD2,
485 PowerDeviceD3,
486 PowerDeviceMaximum
487 } DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
488
489 #define ES_SYSTEM_REQUIRED 0x00000001
490 #define ES_DISPLAY_REQUIRED 0x00000002
491 #define ES_USER_PRESENT 0x00000004
492 #define ES_CONTINUOUS 0x80000000
493
494 typedef ULONG EXECUTION_STATE;
495
496 typedef enum {
497 LT_DONT_CARE,
498 LT_LOWEST_LATENCY
499 } LATENCY_TIME;
500
501
502
503 //
504 // Access/Security Stuff
505 //
506 typedef ULONG ACCESS_MASK, *PACCESS_MASK;
507 typedef PVOID PACCESS_TOKEN;
508
509 #define DELETE 0x00010000L
510 #define READ_CONTROL 0x00020000L
511 #define WRITE_DAC 0x00040000L
512 #define WRITE_OWNER 0x00080000L
513 #define SYNCHRONIZE 0x00100000L
514 #define STANDARD_RIGHTS_REQUIRED 0x000F0000L
515 #define STANDARD_RIGHTS_READ READ_CONTROL
516 #define STANDARD_RIGHTS_WRITE READ_CONTROL
517 #define STANDARD_RIGHTS_EXECUTE READ_CONTROL
518 #define STANDARD_RIGHTS_ALL 0x001F0000L
519 #define SPECIFIC_RIGHTS_ALL 0x0000FFFFL
520 #define ACCESS_SYSTEM_SECURITY 0x01000000L
521 #define MAXIMUM_ALLOWED 0x02000000L
522 #define GENERIC_READ 0x80000000L
523 #define GENERIC_WRITE 0x40000000L
524 #define GENERIC_EXECUTE 0x20000000L
525 #define GENERIC_ALL 0x10000000L
526
527 typedef struct _GENERIC_MAPPING {
528 ACCESS_MASK GenericRead;
529 ACCESS_MASK GenericWrite;
530 ACCESS_MASK GenericExecute;
531 ACCESS_MASK GenericAll;
532 } GENERIC_MAPPING, *PGENERIC_MAPPING;
533
534 #define ACL_REVISION 2
535 #define ACL_REVISION_DS 4
536
537 #define ACL_REVISION1 1
538 #define ACL_REVISION2 2
539 #define ACL_REVISION3 3
540 #define ACL_REVISION4 4
541 #define MIN_ACL_REVISION ACL_REVISION2
542 #define MAX_ACL_REVISION ACL_REVISION4
543
544 typedef struct _ACL {
545 UCHAR AclRevision;
546 UCHAR Sbz1;
547 USHORT AclSize;
548 USHORT AceCount;
549 USHORT Sbz2;
550 } ACL, *PACL;
551
552
553
554 //
555 // Current security descriptor revision value
556 //
557 #define SECURITY_DESCRIPTOR_REVISION (1)
558 #define SECURITY_DESCRIPTOR_REVISION1 (1)
559
560 //
561 // Privilege attributes
562 //
563 #define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
564 #define SE_PRIVILEGE_ENABLED (0x00000002L)
565 #define SE_PRIVILEGE_REMOVED (0X00000004L)
566 #define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
567
568 #define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
569 SE_PRIVILEGE_ENABLED | \
570 SE_PRIVILEGE_REMOVED | \
571 SE_PRIVILEGE_USED_FOR_ACCESS)
572
573 #include <pshpack4.h>
574 typedef struct _LUID_AND_ATTRIBUTES {
575 LUID Luid;
576 ULONG Attributes;
577 } LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
578 #include <poppack.h>
579 typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
580 typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
581
582
583
584 //
585 // Privilege sets
586 //
587 #define PRIVILEGE_SET_ALL_NECESSARY (1)
588
589 typedef struct _PRIVILEGE_SET {
590 ULONG PrivilegeCount;
591 ULONG Control;
592 LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
593 } PRIVILEGE_SET,*PPRIVILEGE_SET;
594
595 typedef enum _SECURITY_IMPERSONATION_LEVEL {
596 SecurityAnonymous,
597 SecurityIdentification,
598 SecurityImpersonation,
599 SecurityDelegation
600 } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
601
602 #define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
603 #define SECURITY_MIN_IMPERSONATION_LEVEL SecurityAnonymous
604 #define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
605 #define VALID_IMPERSONATION_LEVEL(Level) (((Level) >= SECURITY_MIN_IMPERSONATION_LEVEL) && ((Level) <= SECURITY_MAX_IMPERSONATION_LEVEL))
606
607 #define SECURITY_DYNAMIC_TRACKING (TRUE)
608 #define SECURITY_STATIC_TRACKING (FALSE)
609
610 typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE;
611
612 typedef struct _SECURITY_QUALITY_OF_SERVICE {
613 ULONG Length;
614 SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
615 SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
616 BOOLEAN EffectiveOnly;
617 } SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
618
619 typedef struct _SE_IMPERSONATION_STATE {
620 PACCESS_TOKEN Token;
621 BOOLEAN CopyOnOpen;
622 BOOLEAN EffectiveOnly;
623 SECURITY_IMPERSONATION_LEVEL Level;
624 } SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
625
626 #define OWNER_SECURITY_INFORMATION (0x00000001L)
627 #define GROUP_SECURITY_INFORMATION (0x00000002L)
628 #define DACL_SECURITY_INFORMATION (0x00000004L)
629 #define SACL_SECURITY_INFORMATION (0x00000008L)
630 #define LABEL_SECURITY_INFORMATION (0x00000010L)
631
632 #define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
633 #define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
634 #define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
635 #define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
636
637
638
639 //
640 // Registry Access Rights
641 //
642 #define KEY_QUERY_VALUE (0x0001)
643 #define KEY_SET_VALUE (0x0002)
644 #define KEY_CREATE_SUB_KEY (0x0004)
645 #define KEY_ENUMERATE_SUB_KEYS (0x0008)
646 #define KEY_NOTIFY (0x0010)
647 #define KEY_CREATE_LINK (0x0020)
648 #define KEY_WOW64_32KEY (0x0200)
649 #define KEY_WOW64_64KEY (0x0100)
650 #define KEY_WOW64_RES (0x0300)
651
652 #define KEY_READ ((STANDARD_RIGHTS_READ |\
653 KEY_QUERY_VALUE |\
654 KEY_ENUMERATE_SUB_KEYS |\
655 KEY_NOTIFY) \
656 & \
657 (~SYNCHRONIZE))
658
659 #define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
660 KEY_SET_VALUE |\
661 KEY_CREATE_SUB_KEY) \
662 & \
663 (~SYNCHRONIZE))
664
665 #define KEY_EXECUTE ((KEY_READ) \
666 & \
667 (~SYNCHRONIZE))
668
669 #define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
670 KEY_QUERY_VALUE |\
671 KEY_SET_VALUE |\
672 KEY_CREATE_SUB_KEY |\
673 KEY_ENUMERATE_SUB_KEYS |\
674 KEY_NOTIFY |\
675 KEY_CREATE_LINK) \
676 & \
677 (~SYNCHRONIZE))
678
679 //
680 // Registry Open/Create Options
681 //
682 #define REG_OPTION_RESERVED (0x00000000L)
683 #define REG_OPTION_NON_VOLATILE (0x00000000L)
684 #define REG_OPTION_VOLATILE (0x00000001L)
685 #define REG_OPTION_CREATE_LINK (0x00000002L)
686 #define REG_OPTION_BACKUP_RESTORE (0x00000004L)
687 #define REG_OPTION_OPEN_LINK (0x00000008L)
688
689 #define REG_LEGAL_OPTION \
690 (REG_OPTION_RESERVED |\
691 REG_OPTION_NON_VOLATILE |\
692 REG_OPTION_VOLATILE |\
693 REG_OPTION_CREATE_LINK |\
694 REG_OPTION_BACKUP_RESTORE |\
695 REG_OPTION_OPEN_LINK)
696
697 //
698 // Key creation/open disposition
699 //
700 #define REG_CREATED_NEW_KEY (0x00000001L)
701 #define REG_OPENED_EXISTING_KEY (0x00000002L)
702
703 //
704 // Key restore & hive load flags
705 //
706 #define REG_WHOLE_HIVE_VOLATILE (0x00000001L)
707 #define REG_REFRESH_HIVE (0x00000002L)
708 #define REG_NO_LAZY_FLUSH (0x00000004L)
709 #define REG_FORCE_RESTORE (0x00000008L)
710 #define REG_APP_HIVE (0x00000010L)
711 #define REG_PROCESS_PRIVATE (0x00000020L)
712 #define REG_START_JOURNAL (0x00000040L)
713 #define REG_HIVE_EXACT_FILE_GROWTH (0x00000080L)
714 #define REG_HIVE_NO_RM (0x00000100L)
715 #define REG_HIVE_SINGLE_LOG (0x00000200L)
716
717 //
718 // Unload Flags
719 //
720 #define REG_FORCE_UNLOAD 1
721
722 //
723 // Notify Filter Values
724 //
725 #define REG_NOTIFY_CHANGE_NAME (0x00000001L)
726 #define REG_NOTIFY_CHANGE_ATTRIBUTES (0x00000002L)
727 #define REG_NOTIFY_CHANGE_LAST_SET (0x00000004L)
728 #define REG_NOTIFY_CHANGE_SECURITY (0x00000008L)
729
730 #define REG_LEGAL_CHANGE_FILTER \
731 (REG_NOTIFY_CHANGE_NAME |\
732 REG_NOTIFY_CHANGE_ATTRIBUTES |\
733 REG_NOTIFY_CHANGE_LAST_SET |\
734 REG_NOTIFY_CHANGE_SECURITY)
735
736
737
738 //
739 // Thread Access Rights
740 //
741 #define THREAD_TERMINATE (0x0001)
742 #define THREAD_SUSPEND_RESUME (0x0002)
743 #define THREAD_ALERT (0x0004)
744 #define THREAD_GET_CONTEXT (0x0008)
745 #define THREAD_SET_CONTEXT (0x0010)
746 #define THREAD_SET_INFORMATION (0x0020)
747 #define THREAD_SET_LIMITED_INFORMATION (0x0400)
748 #define THREAD_QUERY_LIMITED_INFORMATION (0x0800)
749 #if (NTDDI_VERSION >= NTDDI_VISTA)
750 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
751 0xFFFF)
752 #else
753 #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
754 0x3FF)
755 #endif
756
757 //
758 // Service Start Types
759 //
760 #define SERVICE_BOOT_START 0x00000000
761 #define SERVICE_SYSTEM_START 0x00000001
762 #define SERVICE_AUTO_START 0x00000002
763 #define SERVICE_DEMAND_START 0x00000003
764 #define SERVICE_DISABLED 0x00000004
765
766 //
767 // Exception Records
768 //
769 #define EXCEPTION_NONCONTINUABLE 1
770 #define EXCEPTION_MAXIMUM_PARAMETERS 15
771
772 typedef struct _EXCEPTION_RECORD {
773 NTSTATUS ExceptionCode;
774 ULONG ExceptionFlags;
775 struct _EXCEPTION_RECORD *ExceptionRecord;
776 PVOID ExceptionAddress;
777 ULONG NumberParameters;
778 ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
779 } EXCEPTION_RECORD, *PEXCEPTION_RECORD;
780
781 typedef struct _EXCEPTION_RECORD32 {
782 NTSTATUS ExceptionCode;
783 ULONG ExceptionFlags;
784 ULONG ExceptionRecord;
785 ULONG ExceptionAddress;
786 ULONG NumberParameters;
787 ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
788 } EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
789
790 typedef struct _EXCEPTION_RECORD64 {
791 NTSTATUS ExceptionCode;
792 ULONG ExceptionFlags;
793 ULONG64 ExceptionRecord;
794 ULONG64 ExceptionAddress;
795 ULONG NumberParameters;
796 ULONG __unusedAlignment;
797 ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
798 } EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
799
800 typedef struct _EXCEPTION_POINTERS {
801 PEXCEPTION_RECORD ExceptionRecord;
802 PCONTEXT ContextRecord;
803 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
804
805
806
807 //
808 // Process Qoutas
809 //
810 typedef struct _QUOTA_LIMITS {
811 SIZE_T PagedPoolLimit;
812 SIZE_T NonPagedPoolLimit;
813 SIZE_T MinimumWorkingSetSize;
814 SIZE_T MaximumWorkingSetSize;
815 SIZE_T PagefileLimit;
816 LARGE_INTEGER TimeLimit;
817 } QUOTA_LIMITS, *PQUOTA_LIMITS;
818
819 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
820 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
821 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
822 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
823 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
824
825
826 /******************************************************************************
827 * WINBASE Functions *
828 ******************************************************************************/
829 #if !defined(_WINBASE_)
830
831 #if defined(_WIN64)
832
833 #define InterlockedPopEntrySList(Head) \
834 ExpInterlockedPopEntrySList(Head)
835
836 #define InterlockedPushEntrySList(Head, Entry) \
837 ExpInterlockedPushEntrySList(Head, Entry)
838
839 #define InterlockedFlushSList(Head) \
840 ExpInterlockedFlushSList(Head)
841
842 #define QueryDepthSList(Head) \
843 ExQueryDepthSList(Head)
844
845 #else // !defined(_WIN64)
846
847 NTKERNELAPI
848 PSLIST_ENTRY
849 FASTCALL
850 InterlockedPopEntrySList(
851 IN PSLIST_HEADER ListHead);
852
853 NTKERNELAPI
854 PSLIST_ENTRY
855 FASTCALL
856 InterlockedPushEntrySList(
857 IN PSLIST_HEADER ListHead,
858 IN PSLIST_ENTRY ListEntry);
859
860 #define InterlockedFlushSList(ListHead) \
861 ExInterlockedFlushSList(ListHead)
862
863 #define QueryDepthSList(Head) \
864 ExQueryDepthSList(Head)
865
866 #endif // !defined(_WIN64)
867
868 #endif // !defined(_WINBASE_)
869
870
871 /******************************************************************************
872 * Kernel Types *
873 ******************************************************************************/
874
875 typedef struct _DISPATCHER_HEADER
876 {
877 union
878 {
879 struct
880 {
881 UCHAR Type;
882 union
883 {
884 UCHAR Absolute;
885 UCHAR NpxIrql;
886 };
887 union
888 {
889 UCHAR Size;
890 UCHAR Hand;
891 };
892 union
893 {
894 UCHAR Inserted;
895 BOOLEAN DebugActive;
896 };
897 };
898 volatile LONG Lock;
899 };
900 LONG SignalState;
901 LIST_ENTRY WaitListHead;
902 } DISPATCHER_HEADER, *PDISPATCHER_HEADER;
903
904 typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
905
906 typedef struct _KEVENT {
907 DISPATCHER_HEADER Header;
908 } KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
909
910 typedef struct _KSEMAPHORE {
911 DISPATCHER_HEADER Header;
912 LONG Limit;
913 } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
914
915 /******************************************************************************
916 * RTL Types *
917 ******************************************************************************/
918
919 #define RTL_REGISTRY_ABSOLUTE 0
920 #define RTL_REGISTRY_SERVICES 1
921 #define RTL_REGISTRY_CONTROL 2
922 #define RTL_REGISTRY_WINDOWS_NT 3
923 #define RTL_REGISTRY_DEVICEMAP 4
924 #define RTL_REGISTRY_USER 5
925 #define RTL_REGISTRY_MAXIMUM 6
926 #define RTL_REGISTRY_HANDLE 0x40000000
927 #define RTL_REGISTRY_OPTIONAL 0x80000000
928
929 /* RTL_QUERY_REGISTRY_TABLE.Flags */
930 #define RTL_QUERY_REGISTRY_SUBKEY 0x00000001
931 #define RTL_QUERY_REGISTRY_TOPKEY 0x00000002
932 #define RTL_QUERY_REGISTRY_REQUIRED 0x00000004
933 #define RTL_QUERY_REGISTRY_NOVALUE 0x00000008
934 #define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010
935 #define RTL_QUERY_REGISTRY_DIRECT 0x00000020
936 #define RTL_QUERY_REGISTRY_DELETE 0x00000040
937
938 typedef struct _RTL_BITMAP {
939 ULONG SizeOfBitMap;
940 PULONG Buffer;
941 } RTL_BITMAP, *PRTL_BITMAP;
942
943 typedef struct _RTL_BITMAP_RUN {
944 ULONG StartingIndex;
945 ULONG NumberOfBits;
946 } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
947
948 typedef NTSTATUS
949 (DDKAPI *PRTL_QUERY_REGISTRY_ROUTINE)(
950 IN PWSTR ValueName,
951 IN ULONG ValueType,
952 IN PVOID ValueData,
953 IN ULONG ValueLength,
954 IN PVOID Context,
955 IN PVOID EntryContext);
956
957 typedef struct _RTL_QUERY_REGISTRY_TABLE {
958 PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
959 ULONG Flags;
960 PCWSTR Name;
961 PVOID EntryContext;
962 ULONG DefaultType;
963 PVOID DefaultData;
964 ULONG DefaultLength;
965 } RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
966
967 typedef struct _TIME_FIELDS {
968 CSHORT Year;
969 CSHORT Month;
970 CSHORT Day;
971 CSHORT Hour;
972 CSHORT Minute;
973 CSHORT Second;
974 CSHORT Milliseconds;
975 CSHORT Weekday;
976 } TIME_FIELDS, *PTIME_FIELDS;
977
978
979 /******************************************************************************
980 * RTL Functions *
981 ******************************************************************************/
982
983 NTSYSAPI
984 VOID
985 NTAPI
986 RtlAssert(
987 IN PVOID FailedAssertion,
988 IN PVOID FileName,
989 IN ULONG LineNumber,
990 IN PCHAR Message);
991
992 /* VOID
993 * RtlCopyMemory(
994 * IN VOID UNALIGNED *Destination,
995 * IN CONST VOID UNALIGNED *Source,
996 * IN SIZE_T Length)
997 */
998 #define RtlCopyMemory(Destination, Source, Length) \
999 memcpy(Destination, Source, Length)
1000
1001 #define RtlCopyBytes RtlCopyMemory
1002
1003 #if defined(_M_AMD64)
1004 NTSYSAPI
1005 VOID
1006 NTAPI
1007 RtlCopyMemoryNonTemporal(
1008 VOID UNALIGNED *Destination,
1009 CONST VOID UNALIGNED *Source,
1010 SIZE_T Length);
1011 #else
1012 #define RtlCopyMemoryNonTemporal RtlCopyMemory
1013 #endif
1014
1015 /* BOOLEAN
1016 * RtlEqualLuid(
1017 * IN PLUID Luid1,
1018 * IN PLUID Luid2)
1019 */
1020 #define RtlEqualLuid(Luid1, Luid2) \
1021 (((Luid1)->LowPart == (Luid2)->LowPart) && ((Luid1)->HighPart == (Luid2)->HighPart))
1022
1023 /* ULONG
1024 * RtlEqualMemory(
1025 * IN VOID UNALIGNED *Destination,
1026 * IN CONST VOID UNALIGNED *Source,
1027 * IN SIZE_T Length)
1028 */
1029 #define RtlEqualMemory(Destination, Source, Length) \
1030 (!memcmp(Destination, Source, Length))
1031
1032 /* VOID
1033 * RtlFillMemory(
1034 * IN VOID UNALIGNED *Destination,
1035 * IN SIZE_T Length,
1036 * IN UCHAR Fill)
1037 */
1038 #define RtlFillMemory(Destination, Length, Fill) \
1039 memset(Destination, Fill, Length)
1040
1041 #define RtlFillBytes RtlFillMemory
1042
1043 NTSYSAPI
1044 VOID
1045 NTAPI
1046 RtlFreeUnicodeString(
1047 IN PUNICODE_STRING UnicodeString);
1048
1049 NTSYSAPI
1050 NTSTATUS
1051 NTAPI
1052 RtlGUIDFromString(
1053 IN PUNICODE_STRING GuidString,
1054 OUT GUID *Guid);
1055
1056 NTSYSAPI
1057 VOID
1058 NTAPI
1059 RtlInitUnicodeString(
1060 IN OUT PUNICODE_STRING DestinationString,
1061 IN PCWSTR SourceString);
1062
1063 /* VOID
1064 * RtlMoveMemory(
1065 * IN VOID UNALIGNED *Destination,
1066 * IN CONST VOID UNALIGNED *Source,
1067 * IN SIZE_T Length)
1068 */
1069 #define RtlMoveMemory(Destination, Source, Length) \
1070 memmove(Destination, Source, Length)
1071
1072 NTSYSAPI
1073 NTSTATUS
1074 NTAPI
1075 RtlStringFromGUID(
1076 IN REFGUID Guid,
1077 OUT PUNICODE_STRING GuidString);
1078
1079 /* VOID
1080 * RtlZeroMemory(
1081 * IN VOID UNALIGNED *Destination,
1082 * IN SIZE_T Length)
1083 */
1084 #define RtlZeroMemory(Destination, Length) \
1085 memset(Destination, 0, Length)
1086
1087 #define RtlZeroBytes RtlZeroMemory
1088
1089
1090 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1091 NTSYSAPI
1092 BOOLEAN
1093 NTAPI
1094 RtlAreBitsClear(
1095 IN PRTL_BITMAP BitMapHeader,
1096 IN ULONG StartingIndex,
1097 IN ULONG Length);
1098
1099 NTSYSAPI
1100 BOOLEAN
1101 NTAPI
1102 RtlAreBitsSet(
1103 IN PRTL_BITMAP BitMapHeader,
1104 IN ULONG StartingIndex,
1105 IN ULONG Length);
1106
1107 NTSYSAPI
1108 NTSTATUS
1109 NTAPI
1110 RtlAnsiStringToUnicodeString(
1111 IN OUT PUNICODE_STRING DestinationString,
1112 IN PANSI_STRING SourceString,
1113 IN BOOLEAN AllocateDestinationString);
1114
1115 NTSYSAPI
1116 ULONG
1117 NTAPI
1118 RtlxAnsiStringToUnicodeSize(
1119 IN PCANSI_STRING AnsiString);
1120
1121 #define RtlAnsiStringToUnicodeSize(String) ( \
1122 NLS_MB_CODE_PAGE_TAG ? \
1123 RtlxAnsiStringToUnicodeSize(String) : \
1124 ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
1125 )
1126
1127 NTSYSAPI
1128 NTSTATUS
1129 NTAPI
1130 RtlAppendUnicodeStringToString(
1131 IN OUT PUNICODE_STRING Destination,
1132 IN PCUNICODE_STRING Source);
1133
1134 NTSYSAPI
1135 NTSTATUS
1136 NTAPI
1137 RtlAppendUnicodeToString(
1138 IN OUT PUNICODE_STRING Destination,
1139 IN PCWSTR Source);
1140
1141 NTSYSAPI
1142 NTSTATUS
1143 NTAPI
1144 RtlCheckRegistryKey(
1145 IN ULONG RelativeTo,
1146 IN PWSTR Path);
1147
1148 NTSYSAPI
1149 VOID
1150 NTAPI
1151 RtlClearAllBits(
1152 IN PRTL_BITMAP BitMapHeader);
1153
1154 NTSYSAPI
1155 VOID
1156 NTAPI
1157 RtlClearBits(
1158 IN PRTL_BITMAP BitMapHeader,
1159 IN ULONG StartingIndex,
1160 IN ULONG NumberToClear);
1161
1162 NTSYSAPI
1163 SIZE_T
1164 NTAPI
1165 RtlCompareMemory(
1166 IN CONST VOID *Source1,
1167 IN CONST VOID *Source2,
1168 IN SIZE_T Length);
1169
1170 NTSYSAPI
1171 LONG
1172 NTAPI
1173 RtlCompareUnicodeString(
1174 IN PCUNICODE_STRING String1,
1175 IN PCUNICODE_STRING String2,
1176 IN BOOLEAN CaseInSensitive);
1177
1178 NTSYSAPI
1179 LONG
1180 NTAPI
1181 RtlCompareUnicodeStrings(
1182 IN PCWCH String1,
1183 IN SIZE_T String1Length,
1184 IN PCWCH String2,
1185 IN SIZE_T String2Length,
1186 IN BOOLEAN CaseInSensitive);
1187
1188 NTSYSAPI
1189 VOID
1190 NTAPI
1191 RtlCopyUnicodeString(
1192 IN OUT PUNICODE_STRING DestinationString,
1193 IN PCUNICODE_STRING SourceString);
1194
1195 NTSYSAPI
1196 NTSTATUS
1197 NTAPI
1198 RtlCreateRegistryKey(
1199 IN ULONG RelativeTo,
1200 IN PWSTR Path);
1201
1202 NTSYSAPI
1203 NTSTATUS
1204 NTAPI
1205 RtlCreateSecurityDescriptor(
1206 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
1207 IN ULONG Revision);
1208
1209 NTSYSAPI
1210 NTSTATUS
1211 NTAPI
1212 RtlDeleteRegistryValue(
1213 IN ULONG RelativeTo,
1214 IN PCWSTR Path,
1215 IN PCWSTR ValueName);
1216
1217 NTSYSAPI
1218 BOOLEAN
1219 NTAPI
1220 RtlEqualUnicodeString(
1221 IN CONST UNICODE_STRING *String1,
1222 IN CONST UNICODE_STRING *String2,
1223 IN BOOLEAN CaseInSensitive);
1224
1225 #if !defined(_AMD64_) && !defined(_IA64_)
1226 NTSYSAPI
1227 LARGE_INTEGER
1228 NTAPI
1229 RtlExtendedIntegerMultiply(
1230 IN LARGE_INTEGER Multiplicand,
1231 IN LONG Multiplier);
1232
1233 NTSYSAPI
1234 LARGE_INTEGER
1235 NTAPI
1236 RtlExtendedLargeIntegerDivide(
1237 IN LARGE_INTEGER Dividend,
1238 IN ULONG Divisor,
1239 IN OUT PULONG Remainder);
1240 #endif
1241
1242 #if defined(_X86_) || defined(_IA64_)
1243 NTSYSAPI
1244 LARGE_INTEGER
1245 NTAPI
1246 RtlExtendedMagicDivide(
1247 IN LARGE_INTEGER Dividend,
1248 IN LARGE_INTEGER MagicDivisor,
1249 IN CCHAR ShiftCount);
1250 #endif
1251
1252 NTSYSAPI
1253 VOID
1254 NTAPI
1255 RtlFreeAnsiString(
1256 IN PANSI_STRING AnsiString);
1257
1258 NTSYSAPI
1259 ULONG
1260 NTAPI
1261 RtlFindClearBits(
1262 IN PRTL_BITMAP BitMapHeader,
1263 IN ULONG NumberToFind,
1264 IN ULONG HintIndex);
1265
1266 NTSYSAPI
1267 ULONG
1268 NTAPI
1269 RtlFindClearBitsAndSet(
1270 IN PRTL_BITMAP BitMapHeader,
1271 IN ULONG NumberToFind,
1272 IN ULONG HintIndex);
1273
1274 NTSYSAPI
1275 ULONG
1276 NTAPI
1277 RtlFindFirstRunClear(
1278 IN PRTL_BITMAP BitMapHeader,
1279 OUT PULONG StartingIndex);
1280
1281 NTSYSAPI
1282 ULONG
1283 NTAPI
1284 RtlFindClearRuns(
1285 IN PRTL_BITMAP BitMapHeader,
1286 OUT PRTL_BITMAP_RUN RunArray,
1287 IN ULONG SizeOfRunArray,
1288 IN BOOLEAN LocateLongestRuns);
1289
1290 NTSYSAPI
1291 ULONG
1292 NTAPI
1293 RtlFindLastBackwardRunClear(
1294 IN PRTL_BITMAP BitMapHeader,
1295 IN ULONG FromIndex,
1296 OUT PULONG StartingRunIndex);
1297
1298 NTSYSAPI
1299 CCHAR
1300 NTAPI
1301 RtlFindLeastSignificantBit(
1302 IN ULONGLONG Set);
1303
1304 NTSYSAPI
1305 ULONG
1306 NTAPI
1307 RtlFindLongestRunClear(
1308 IN PRTL_BITMAP BitMapHeader,
1309 OUT PULONG StartingIndex);
1310
1311 NTSYSAPI
1312 CCHAR
1313 NTAPI
1314 RtlFindMostSignificantBit(
1315 IN ULONGLONG Set);
1316
1317 NTSYSAPI
1318 ULONG
1319 NTAPI
1320 RtlFindNextForwardRunClear(
1321 IN PRTL_BITMAP BitMapHeader,
1322 IN ULONG FromIndex,
1323 OUT PULONG StartingRunIndex);
1324
1325 NTSYSAPI
1326 ULONG
1327 NTAPI
1328 RtlFindSetBits(
1329 IN PRTL_BITMAP BitMapHeader,
1330 IN ULONG NumberToFind,
1331 IN ULONG HintIndex);
1332
1333 NTSYSAPI
1334 ULONG
1335 NTAPI
1336 RtlFindSetBitsAndClear(
1337 IN PRTL_BITMAP BitMapHeader,
1338 IN ULONG NumberToFind,
1339 IN ULONG HintIndex);
1340
1341 NTSYSAPI
1342 NTSTATUS
1343 NTAPI
1344 RtlHashUnicodeString(
1345 IN CONST UNICODE_STRING *String,
1346 IN BOOLEAN CaseInSensitive,
1347 IN ULONG HashAlgorithm,
1348 OUT PULONG HashValue);
1349
1350 NTSYSAPI
1351 VOID
1352 NTAPI
1353 RtlInitAnsiString(
1354 IN OUT PANSI_STRING DestinationString,
1355 IN PCSZ SourceString);
1356
1357 NTSYSAPI
1358 VOID
1359 NTAPI
1360 RtlInitializeBitMap(
1361 IN PRTL_BITMAP BitMapHeader,
1362 IN PULONG BitMapBuffer,
1363 IN ULONG SizeOfBitMap);
1364
1365 NTSYSAPI
1366 VOID
1367 NTAPI
1368 RtlInitString(
1369 IN OUT PSTRING DestinationString,
1370 IN PCSZ SourceString);
1371
1372 NTSYSAPI
1373 NTSTATUS
1374 NTAPI
1375 RtlIntegerToUnicodeString(
1376 IN ULONG Value,
1377 IN ULONG Base OPTIONAL,
1378 IN OUT PUNICODE_STRING String);
1379
1380 NTSYSAPI
1381 NTSTATUS
1382 NTAPI
1383 RtlInt64ToUnicodeString(
1384 IN ULONGLONG Value,
1385 IN ULONG Base OPTIONAL,
1386 IN OUT PUNICODE_STRING String);
1387
1388 #ifdef _WIN64
1389 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1390 RtlInt64ToUnicodeString(Value, Base, String)
1391 #else
1392 #define RtlIntPtrToUnicodeString(Value, Base, String) \
1393 RtlIntegerToUnicodeString(Value, Base, String)
1394 #endif
1395
1396 /* BOOLEAN
1397 * RtlIsZeroLuid(
1398 * IN PLUID L1);
1399 */
1400 #define RtlIsZeroLuid(_L1) \
1401 ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart)))
1402
1403 NTSYSAPI
1404 ULONG
1405 NTAPI
1406 RtlLengthSecurityDescriptor(
1407 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
1408
1409 NTSYSAPI
1410 ULONG
1411 NTAPI
1412 RtlNumberOfClearBits(
1413 IN PRTL_BITMAP BitMapHeader);
1414
1415 NTSYSAPI
1416 ULONG
1417 NTAPI
1418 RtlNumberOfSetBits(
1419 IN PRTL_BITMAP BitMapHeader);
1420
1421 NTSYSAPI
1422 NTSTATUS
1423 NTAPI
1424 RtlQueryRegistryValues(
1425 IN ULONG RelativeTo,
1426 IN PCWSTR Path,
1427 IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
1428 IN PVOID Context,
1429 IN PVOID Environment OPTIONAL);
1430
1431 #define LONG_SIZE (sizeof(LONG))
1432 #define LONG_MASK (LONG_SIZE - 1)
1433
1434 /* VOID
1435 * RtlRetrieveUlong(
1436 * PULONG DestinationAddress,
1437 * PULONG SourceAddress);
1438 */
1439 #if defined(_AMD64_)
1440 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1441 *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress)
1442 #else
1443 #define RtlRetrieveUlong(DestAddress,SrcAddress) \
1444 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1445 { \
1446 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1447 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1448 ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \
1449 ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \
1450 } \
1451 else \
1452 { \
1453 *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \
1454 }
1455 #endif
1456
1457 /* VOID
1458 * RtlRetrieveUshort(
1459 * PUSHORT DestinationAddress,
1460 * PUSHORT SourceAddress);
1461 */
1462 #if defined(_AMD64_)
1463 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1464 *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress)
1465 #else
1466 #define RtlRetrieveUshort(DestAddress,SrcAddress) \
1467 if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \
1468 { \
1469 ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \
1470 ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \
1471 } \
1472 else \
1473 { \
1474 *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \
1475 }
1476 #endif
1477
1478 NTSYSAPI
1479 VOID
1480 NTAPI
1481 RtlSetAllBits(
1482 IN PRTL_BITMAP BitMapHeader);
1483
1484 NTSYSAPI
1485 VOID
1486 NTAPI
1487 RtlSetBits(
1488 IN PRTL_BITMAP BitMapHeader,
1489 IN ULONG StartingIndex,
1490 IN ULONG NumberToSet);
1491
1492 NTSYSAPI
1493 NTSTATUS
1494 NTAPI
1495 RtlSetDaclSecurityDescriptor(
1496 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
1497 IN BOOLEAN DaclPresent,
1498 IN PACL Dacl OPTIONAL,
1499 IN BOOLEAN DaclDefaulted OPTIONAL);
1500
1501 /* VOID
1502 * RtlStoreUlong(
1503 * IN PULONG Address,
1504 * IN ULONG Value);
1505 */
1506 #if defined(_AMD64_)
1507 #define RtlStoreUlong(Address,Value) \
1508 *(ULONG UNALIGNED *)(Address) = (Value)
1509 #else
1510 #define RtlStoreUlong(Address,Value) \
1511 if ((ULONG_PTR)(Address) & LONG_MASK) { \
1512 ((PUCHAR) (Address))[LONG_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1513 ((PUCHAR) (Address))[LONG_3RD_MOST_SIGNIFICANT_BIT] = (UCHAR)(SECONDBYTE(Value)); \
1514 ((PUCHAR) (Address))[LONG_2ND_MOST_SIGNIFICANT_BIT] = (UCHAR)(THIRDBYTE(Value)); \
1515 ((PUCHAR) (Address))[LONG_MOST_SIGNIFICANT_BIT] = (UCHAR)(FOURTHBYTE(Value)); \
1516 } \
1517 else { \
1518 *((PULONG)(Address)) = (ULONG) (Value); \
1519 }
1520 #endif
1521
1522 /* VOID
1523 * RtlStoreUlonglong(
1524 * IN OUT PULONGLONG Address,
1525 * ULONGLONG Value);
1526 */
1527 #if defined(_AMD64_)
1528 #define RtlStoreUlonglong(Address,Value) \
1529 *(ULONGLONG UNALIGNED *)(Address) = (Value)
1530 #else
1531 #define RtlStoreUlonglong(Address,Value) \
1532 if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \
1533 RtlStoreUlong((ULONG_PTR)(Address), \
1534 (ULONGLONG)(Value) & 0xFFFFFFFF); \
1535 RtlStoreUlong((ULONG_PTR)(Address)+sizeof(ULONG), \
1536 (ULONGLONG)(Value) >> 32); \
1537 } else { \
1538 *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \
1539 }
1540 #endif
1541
1542 /* VOID
1543 * RtlStoreUlongPtr(
1544 * IN OUT PULONG_PTR Address,
1545 * IN ULONG_PTR Value);
1546 */
1547 #ifdef _WIN64
1548 #define RtlStoreUlongPtr(Address,Value) \
1549 RtlStoreUlonglong(Address,Value)
1550 #else
1551 #define RtlStoreUlongPtr(Address,Value) \
1552 RtlStoreUlong(Address,Value)
1553 #endif
1554
1555 /* VOID
1556 * RtlStoreUshort(
1557 * IN PUSHORT Address,
1558 * IN USHORT Value);
1559 */
1560 #if defined(_AMD64_)
1561 #define RtlStoreUshort(Address,Value) \
1562 *(USHORT UNALIGNED *)(Address) = (Value)
1563 #else
1564 #define RtlStoreUshort(Address,Value) \
1565 if ((ULONG_PTR)(Address) & SHORT_MASK) { \
1566 ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \
1567 ((PUCHAR) (Address))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(Value)); \
1568 } \
1569 else { \
1570 *((PUSHORT) (Address)) = (USHORT)Value; \
1571 }
1572 #endif
1573
1574 NTSYSAPI
1575 BOOLEAN
1576 NTAPI
1577 RtlTimeFieldsToTime(
1578 IN PTIME_FIELDS TimeFields,
1579 IN PLARGE_INTEGER Time);
1580
1581 NTSYSAPI
1582 VOID
1583 NTAPI
1584 RtlTimeToTimeFields(
1585 IN PLARGE_INTEGER Time,
1586 IN PTIME_FIELDS TimeFields);
1587
1588 NTSYSAPI
1589 ULONG
1590 FASTCALL
1591 RtlUlongByteSwap(
1592 IN ULONG Source);
1593
1594 NTSYSAPI
1595 ULONGLONG
1596 FASTCALL
1597 RtlUlonglongByteSwap(
1598 IN ULONGLONG Source);
1599
1600 NTSYSAPI
1601 NTSTATUS
1602 NTAPI
1603 RtlUnicodeStringToAnsiString(
1604 IN OUT PANSI_STRING DestinationString,
1605 IN PCUNICODE_STRING SourceString,
1606 IN BOOLEAN AllocateDestinationString);
1607
1608 NTSYSAPI
1609 ULONG
1610 NTAPI
1611 RtlxUnicodeStringToAnsiSize(
1612 IN PCUNICODE_STRING UnicodeString);
1613
1614 #define RtlUnicodeStringToAnsiSize(String) ( \
1615 NLS_MB_CODE_PAGE_TAG ? \
1616 RtlxUnicodeStringToAnsiSize(String) : \
1617 ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
1618 )
1619
1620 NTSYSAPI
1621 NTSTATUS
1622 NTAPI
1623 RtlUnicodeStringToInteger(
1624 IN PCUNICODE_STRING String,
1625 IN ULONG Base OPTIONAL,
1626 OUT PULONG Value);
1627
1628 NTSYSAPI
1629 WCHAR
1630 NTAPI
1631 RtlUpcaseUnicodeChar(
1632 IN WCHAR SourceCharacter);
1633
1634 NTSYSAPI
1635 USHORT
1636 FASTCALL
1637 RtlUshortByteSwap(
1638 IN USHORT Source);
1639
1640 NTSYSAPI
1641 BOOLEAN
1642 NTAPI
1643 RtlValidRelativeSecurityDescriptor(
1644 IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
1645 IN ULONG SecurityDescriptorLength,
1646 IN SECURITY_INFORMATION RequiredInformation);
1647
1648 NTSYSAPI
1649 BOOLEAN
1650 NTAPI
1651 RtlValidSecurityDescriptor(
1652 IN PSECURITY_DESCRIPTOR SecurityDescriptor);
1653
1654 NTSYSAPI
1655 NTSTATUS
1656 NTAPI
1657 RtlWriteRegistryValue(
1658 IN ULONG RelativeTo,
1659 IN PCWSTR Path,
1660 IN PCWSTR ValueName,
1661 IN ULONG ValueType,
1662 IN PVOID ValueData,
1663 IN ULONG ValueLength);
1664
1665 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
1666
1667 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
1668 NTSYSAPI
1669 VOID
1670 FASTCALL
1671 RtlPrefetchMemoryNonTemporal(
1672 IN PVOID Source,
1673 IN SIZE_T Length);
1674 #endif
1675
1676 #if (NTDDI_VERSION >= NTDDI_WINXP)
1677 NTSYSAPI
1678 VOID
1679 NTAPI
1680 RtlClearBit(
1681 PRTL_BITMAP BitMapHeader,
1682 ULONG BitNumber);
1683
1684 NTSYSAPI
1685 WCHAR
1686 NTAPI
1687 RtlDowncaseUnicodeChar(
1688 IN WCHAR SourceCharacter);
1689
1690 NTSYSAPI
1691 VOID
1692 NTAPI
1693 RtlSetBit(
1694 PRTL_BITMAP BitMapHeader,
1695 ULONG BitNumber);
1696
1697 NTSYSAPI
1698 BOOLEAN
1699 NTAPI
1700 RtlTestBit(
1701 IN PRTL_BITMAP BitMapHeader,
1702 IN ULONG BitNumber);
1703
1704 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
1705
1706 #if (NTDDI_VERSION >= NTDDI_VISTA)
1707 NTSYSAPI
1708 ULONG
1709 NTAPI
1710 RtlNumberOfSetBitsUlongPtr(
1711 IN ULONG_PTR Target);
1712
1713 NTSYSAPI
1714 ULONGLONG
1715 NTAPI
1716 RtlIoDecodeMemIoResource (
1717 IN PIO_RESOURCE_DESCRIPTOR Descriptor,
1718 OUT PULONGLONG Alignment OPTIONAL,
1719 OUT PULONGLONG MinimumAddress OPTIONAL,
1720 OUT PULONGLONG MaximumAddress OPTIONAL);
1721
1722 NTSYSAPI
1723 NTSTATUS
1724 NTAPI
1725 RtlIoEncodeMemIoResource(
1726 IN PIO_RESOURCE_DESCRIPTOR Descriptor,
1727 IN UCHAR Type,
1728 IN ULONGLONG Length,
1729 IN ULONGLONG Alignment,
1730 IN ULONGLONG MinimumAddress,
1731 IN ULONGLONG MaximumAddress);
1732
1733 NTSYSAPI
1734 ULONGLONG
1735 NTAPI
1736 RtlCmDecodeMemIoResource(
1737 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor,
1738 OUT PULONGLONG Start OPTIONAL);
1739
1740 NTSYSAPI
1741 NTSTATUS
1742 NTAPI
1743 RtlFindClosestEncodableLength(
1744 IN ULONGLONG SourceLength,
1745 OUT PULONGLONG TargetLength);
1746
1747 #endif
1748
1749 #if !defined(MIDL_PASS)
1750 /* inline funftions */
1751 //DECLSPEC_DEPRECATED_DDK_WINXP
1752 static __inline
1753 LARGE_INTEGER
1754 NTAPI_INLINE
1755 RtlConvertLongToLargeInteger(LONG SignedInteger)
1756 {
1757 LARGE_INTEGER ret;
1758 ret.QuadPart = SignedInteger;
1759 return ret;
1760 }
1761
1762 //DECLSPEC_DEPRECATED_DDK_WINXP
1763 static __inline
1764 LARGE_INTEGER
1765 NTAPI_INLINE
1766 RtlConvertUlongToLargeInteger(
1767 ULONG UnsignedInteger)
1768 {
1769 LARGE_INTEGER ret;
1770 ret.QuadPart = UnsignedInteger;
1771 return ret;
1772 }
1773
1774 //DECLSPEC_DEPRECATED_DDK
1775 static __inline
1776 ULONG
1777 NTAPI_INLINE
1778 RtlEnlargedUnsignedDivide(
1779 IN ULARGE_INTEGER Dividend,
1780 IN ULONG Divisor,
1781 IN OUT PULONG Remainder)
1782 {
1783 if (Remainder)
1784 *Remainder = Dividend.QuadPart % Divisor;
1785 return Dividend.QuadPart / Divisor;
1786 }
1787
1788 //DECLSPEC_DEPRECATED_DDK
1789 static __inline
1790 LARGE_INTEGER
1791 NTAPI_INLINE
1792 RtlEnlargedUnsignedMultiply(
1793 IN ULONG Multiplicand,
1794 IN ULONG Multiplier)
1795 {
1796 LARGE_INTEGER ret;
1797 ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
1798 return ret;
1799 }
1800
1801 //DECLSPEC_DEPRECATED_DDK
1802 static __inline
1803 LARGE_INTEGER
1804 NTAPI_INLINE
1805 RtlEnlargedIntegerMultiply(
1806 IN LONG Multiplicand,
1807 IN LONG Multiplier)
1808 {
1809 LARGE_INTEGER ret;
1810 ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
1811 return ret;
1812 }
1813
1814 FORCEINLINE
1815 VOID
1816 RtlInitEmptyAnsiString(OUT PANSI_STRING AnsiString,
1817 IN PCHAR Buffer,
1818 IN USHORT BufferSize)
1819 {
1820 AnsiString->Length = 0;
1821 AnsiString->MaximumLength = BufferSize;
1822 AnsiString->Buffer = Buffer;
1823 }
1824
1825 FORCEINLINE
1826 VOID
1827 RtlInitEmptyUnicodeString(
1828 OUT PUNICODE_STRING UnicodeString,
1829 IN PWSTR Buffer,
1830 IN USHORT BufferSize)
1831 {
1832 UnicodeString->Length = 0;
1833 UnicodeString->MaximumLength = BufferSize;
1834 UnicodeString->Buffer = Buffer;
1835 }
1836
1837 #if defined(_AMD64_) || defined(_IA64_)
1838 static __inline
1839 LARGE_INTEGER
1840 NTAPI_INLINE
1841 RtlExtendedIntegerMultiply(
1842 LARGE_INTEGER Multiplicand,
1843 LONG Multiplier)
1844 {
1845 LARGE_INTEGER ret;
1846 ret.QuadPart = Multiplicand.QuadPart * Multiplier;
1847 return ret;
1848 }
1849
1850 static __inline
1851 LARGE_INTEGER
1852 NTAPI_INLINE
1853 RtlExtendedLargeIntegerDivide(
1854 LARGE_INTEGER Dividend,
1855 ULONG Divisor,
1856 PULONG Remainder)
1857 {
1858 LARGE_INTEGER ret;
1859 ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
1860 if (Remainder)
1861 *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
1862 return ret;
1863 }
1864 #endif
1865
1866 #if defined(_AMD64_)
1867 //DECLSPEC_DEPRECATED_DDK
1868 static __inline
1869 LARGE_INTEGER
1870 NTAPI_INLINE
1871 RtlExtendedMagicDivide(
1872 IN LARGE_INTEGER Dividend,
1873 IN LARGE_INTEGER MagicDivisor,
1874 IN CCHAR ShiftCount);
1875 {
1876 LARGE_INTEGER ret;
1877 ULONG64 ret64;
1878 BOOLEAN Pos;
1879 Pos = (Dividend.QuadPart >= 0);
1880 ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart
1881 MagicDivisor.QuadPart);
1882 ret64 >>= ShiftCount;
1883 ret.QuadPart = Pos ? ret64 : -ret64;
1884 return ret;
1885 }
1886 #endif
1887
1888 //DECLSPEC_DEPRECATED_DDK
1889 static __inline
1890 LARGE_INTEGER
1891 NTAPI_INLINE
1892 RtlLargeIntegerAdd(
1893 IN LARGE_INTEGER Addend1,
1894 IN LARGE_INTEGER Addend2)
1895 {
1896 LARGE_INTEGER ret;
1897 ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
1898 return ret;
1899 }
1900
1901 /* VOID
1902 * RtlLargeIntegerAnd(
1903 * IN OUT LARGE_INTEGER Result,
1904 * IN LARGE_INTEGER Source,
1905 * IN LARGE_INTEGER Mask);
1906 */
1907 #define RtlLargeIntegerAnd(Result, Source, Mask) \
1908 Result.QuadPart = Source.QuadPart & Mask.QuadPart
1909
1910 //DECLSPEC_DEPRECATED_DDK
1911 static __inline
1912 LARGE_INTEGER
1913 NTAPI_INLINE
1914 RtlLargeIntegerArithmeticShift(
1915 IN LARGE_INTEGER LargeInteger,
1916 IN CCHAR ShiftCount)
1917 {
1918 LARGE_INTEGER ret;
1919 ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;
1920 return ret;
1921 }
1922
1923 /* BOOLEAN
1924 * RtlLargeIntegerEqualTo(
1925 * IN LARGE_INTEGER Operand1,
1926 * IN LARGE_INTEGER Operand2);
1927 */
1928 #define RtlLargeIntegerEqualTo(X,Y) \
1929 (!(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)))
1930
1931 FORCEINLINE
1932 PVOID
1933 RtlSecureZeroMemory(
1934 OUT PVOID Pointer,
1935 IN SIZE_T Size)
1936 {
1937 volatile char* vptr = (volatile char*)Pointer;
1938 #if defined(_M_AMD64)
1939 __stosb((PUCHAR)vptr, 0, Size);
1940 #else
1941 char * endptr = (char *)vptr + Size;
1942 while (vptr < endptr)
1943 {
1944 *vptr = 0; vptr++;
1945 }
1946 #endif
1947 return Pointer;
1948 }
1949
1950 #if defined(_M_AMD64)
1951 FORCEINLINE
1952 ULONG
1953 RtlCheckBit(
1954 IN PRTL_BITMAP BitMapHeader,
1955 IN ULONG BitPosition)
1956 {
1957 return BitTest((LONG CONST*)BitMapHeader->Buffer, BitPosition);
1958 }
1959 #else
1960 #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP)/32]) >> ((BP)%32)) & 0x1)
1961 #endif // defined(_M_AMD64)
1962
1963 #endif // !defined(MIDL_PASS)
1964
1965 //
1966 // Byte Swap Functions
1967 //
1968 #if (defined(_M_IX86) && (_MSC_FULL_VER > 13009037 || defined(__GNUC__))) || \
1969 ((defined(_M_AMD64) || defined(_M_IA64)) \
1970 && (_MSC_FULL_VER > 13009175 || defined(__GNUC__)))
1971
1972 #define RtlUshortByteSwap(_x) _byteswap_ushort((USHORT)(_x))
1973 #define RtlUlongByteSwap(_x) _byteswap_ulong((_x))
1974 #define RtlUlonglongByteSwap(_x) _byteswap_uint64((_x))
1975
1976 #endif
1977
1978 /******************************************************************************
1979 * Memory manager Types *
1980 ******************************************************************************/
1981
1982 typedef struct _MDL {
1983 struct _MDL *Next;
1984 CSHORT Size;
1985 CSHORT MdlFlags;
1986 struct _EPROCESS *Process;
1987 PVOID MappedSystemVa;
1988 PVOID StartVa;
1989 ULONG ByteCount;
1990 ULONG ByteOffset;
1991 } MDL, *PMDL;
1992
1993
1994 /******************************************************************************
1995 * Memory manager Functions *
1996 ******************************************************************************/
1997
1998 /* PVOID MmGetSystemAddressForMdl(
1999 * IN PMDL Mdl);
2000 */
2001 #define MmGetSystemAddressForMdl(Mdl) \
2002 (((Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
2003 MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2004 ((Mdl)->MappedSystemVa) : \
2005 (MmMapLockedPages((Mdl), KernelMode)))
2006
2007 /* PVOID
2008 * MmGetSystemAddressForMdlSafe(
2009 * IN PMDL Mdl,
2010 * IN MM_PAGE_PRIORITY Priority)
2011 */
2012 #define MmGetSystemAddressForMdlSafe(_Mdl, _Priority) \
2013 (((_Mdl)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA \
2014 | MDL_SOURCE_IS_NONPAGED_POOL)) ? \
2015 (_Mdl)->MappedSystemVa : \
2016 (PVOID) MmMapLockedPagesSpecifyCache((_Mdl), \
2017 KernelMode, MmCached, NULL, FALSE, (_Priority)))
2018
2019 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2020 NTKERNELAPI
2021 PMDL
2022 NTAPI
2023 MmCreateMdl(
2024 IN PMDL MemoryDescriptorList OPTIONAL,
2025 IN PVOID Base,
2026 IN SIZE_T Length);
2027
2028 #endif
2029
2030
2031 /******************************************************************************
2032 * I/O Manager Functions *
2033 ******************************************************************************/
2034
2035 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && \
2036 (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
2037
2038 #define DMA_MACROS_DEFINED
2039
2040 FORCEINLINE
2041 NTSTATUS
2042 IoAllocateAdapterChannel(
2043 IN PADAPTER_OBJECT AdapterObject,
2044 IN PDEVICE_OBJECT DeviceObject,
2045 IN ULONG NumberOfMapRegisters,
2046 IN PDRIVER_CONTROL ExecutionRoutine,
2047 IN PVOID Context)
2048 {
2049 PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
2050 AllocateAdapterChannel =
2051 *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
2052 ASSERT(AllocateAdapterChannel);
2053 return AllocateAdapterChannel(DmaAdapter,
2054 DeviceObject,
2055 NumberOfMapRegisters,
2056 ExecutionRoutine,
2057 Context );
2058 }
2059
2060 FORCEINLINE
2061 BOOLEAN
2062 IoFlushAdapterBuffers(
2063 IN PADAPTER_OBJECT AdapterObject,
2064 IN PMDL Mdl,
2065 IN PVOID MapRegisterBase,
2066 IN PVOID CurrentVa,
2067 IN ULONG Length,
2068 IN BOOLEAN WriteToDevice)
2069 {
2070 PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
2071 FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
2072 ASSERT(FlushAdapterBuffers);
2073 return FlushAdapterBuffers(DmaAdapter,
2074 Mdl,
2075 MapRegisterBase,
2076 CurrentVa,
2077 Length,
2078 WriteToDevice );
2079 }
2080
2081 FORCEINLINE
2082 VOID
2083 IoFreeAdapterChannel(
2084 IN PADAPTER_OBJECT AdapterObject)
2085 {
2086 PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
2087 FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
2088 ASSERT(FreeAdapterChannel);
2089 FreeAdapterChannel(DmaAdapter);
2090 }
2091
2092 FORCEINLINE
2093 VOID
2094 IoFreeMapRegisters(
2095 IN PADAPTER_OBJECT AdapterObject,
2096 IN PVOID MapRegisterBase,
2097 IN ULONG NumberOfMapRegisters)
2098 {
2099 PFREE_MAP_REGISTERS FreeMapRegisters;
2100 FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
2101 ASSERT(FreeMapRegisters);
2102 FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
2103 }
2104
2105 FORCEINLINE
2106 PHYSICAL_ADDRESS
2107 IoMapTransfer(
2108 IN PDMA_ADAPTER DmaAdapter,
2109 IN PMDL Mdl,
2110 IN PVOID MapRegisterBase,
2111 IN PVOID CurrentVa,
2112 IN OUT PULONG Length,
2113 IN BOOLEAN WriteToDevice)
2114 {
2115 PMAP_TRANSFER MapTransfer;
2116
2117 MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
2118 ASSERT(MapTransfer);
2119 return MapTransfer(DmaAdapter,
2120 Mdl,
2121 MapRegisterBase,
2122 CurrentVa,
2123 Length,
2124 WriteToDevice);
2125 }
2126 #endif
2127
2128
2129 /******************************************************************************
2130 * Executive Types *
2131 ******************************************************************************/
2132
2133 typedef enum _POOL_TYPE {
2134 NonPagedPool,
2135 PagedPool,
2136 NonPagedPoolMustSucceed,
2137 DontUseThisType,
2138 NonPagedPoolCacheAligned,
2139 PagedPoolCacheAligned,
2140 NonPagedPoolCacheAlignedMustS,
2141 MaxPoolType,
2142 NonPagedPoolSession = 32,
2143 PagedPoolSession,
2144 NonPagedPoolMustSucceedSession,
2145 DontUseThisTypeSession,
2146 NonPagedPoolCacheAlignedSession,
2147 PagedPoolCacheAlignedSession,
2148 NonPagedPoolCacheAlignedMustSSession
2149 } POOL_TYPE;
2150
2151 typedef enum _SUITE_TYPE {
2152 SmallBusiness,
2153 Enterprise,
2154 BackOffice,
2155 CommunicationServer,
2156 TerminalServer,
2157 SmallBusinessRestricted,
2158 EmbeddedNT,
2159 DataCenter,
2160 SingleUserTS,
2161 Personal,
2162 Blade,
2163 MaxSuiteType
2164 } SUITE_TYPE;
2165
2166 typedef enum _EX_POOL_PRIORITY {
2167 LowPoolPriority,
2168 LowPoolPrioritySpecialPoolOverrun = 8,
2169 LowPoolPrioritySpecialPoolUnderrun = 9,
2170 NormalPoolPriority = 16,
2171 NormalPoolPrioritySpecialPoolOverrun = 24,
2172 NormalPoolPrioritySpecialPoolUnderrun = 25,
2173 HighPoolPriority = 32,
2174 HighPoolPrioritySpecialPoolOverrun = 40,
2175 HighPoolPrioritySpecialPoolUnderrun = 41
2176 } EX_POOL_PRIORITY;
2177
2178 typedef struct _FAST_MUTEX
2179 {
2180 LONG Count;
2181 PKTHREAD Owner;
2182 ULONG Contention;
2183 KEVENT Gate;
2184 ULONG OldIrql;
2185 } FAST_MUTEX, *PFAST_MUTEX;
2186
2187 typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD;
2188
2189 typedef struct _OWNER_ENTRY {
2190 ERESOURCE_THREAD OwnerThread;
2191 _ANONYMOUS_UNION union {
2192 LONG OwnerCount;
2193 ULONG TableSize;
2194 } DUMMYUNIONNAME;
2195 } OWNER_ENTRY, *POWNER_ENTRY;
2196
2197 typedef struct _ERESOURCE
2198 {
2199 LIST_ENTRY SystemResourcesList;
2200 POWNER_ENTRY OwnerTable;
2201 SHORT ActiveCount;
2202 USHORT Flag;
2203 volatile PKSEMAPHORE SharedWaiters;
2204 volatile PKEVENT ExclusiveWaiters;
2205 OWNER_ENTRY OwnerEntry;
2206 ULONG ActiveEntries;
2207 ULONG ContentionCount;
2208 ULONG NumberOfSharedWaiters;
2209 ULONG NumberOfExclusiveWaiters;
2210 union
2211 {
2212 PVOID Address;
2213 ULONG_PTR CreatorBackTraceIndex;
2214 };
2215 KSPIN_LOCK SpinLock;
2216 } ERESOURCE, *PERESOURCE;
2217
2218 #if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
2219 #define LOOKASIDE_ALIGN
2220 #else
2221 #define LOOKASIDE_ALIGN /* FIXME: DECLSPEC_CACHEALIGN */
2222 #endif
2223
2224 typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;
2225
2226 typedef PVOID
2227 (DDKAPI *PALLOCATE_FUNCTION)(
2228 IN POOL_TYPE PoolType,
2229 IN SIZE_T NumberOfBytes,
2230 IN ULONG Tag);
2231
2232 typedef PVOID
2233 (DDKAPI *PALLOCATE_FUNCTION_EX)(
2234 IN POOL_TYPE PoolType,
2235 IN SIZE_T NumberOfBytes,
2236 IN ULONG Tag,
2237 IN OUT PLOOKASIDE_LIST_EX Lookaside);
2238
2239 typedef VOID
2240 (DDKAPI *PFREE_FUNCTION)(
2241 IN PVOID Buffer);
2242
2243 typedef VOID
2244 (DDKAPI *PFREE_FUNCTION_EX)(
2245 IN PVOID Buffer,
2246 IN OUT PLOOKASIDE_LIST_EX Lookaside);
2247
2248 typedef VOID
2249 (DDKAPI *PCALLBACK_FUNCTION)(
2250 IN PVOID CallbackContext,
2251 IN PVOID Argument1,
2252 IN PVOID Argument2);
2253
2254 typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE {
2255 union {
2256 SLIST_HEADER ListHead;
2257 SINGLE_LIST_ENTRY SingleListHead;
2258 } DUMMYUNIONNAME;
2259 USHORT Depth;
2260 USHORT MaximumDepth;
2261 ULONG TotalAllocates;
2262 union {
2263 ULONG AllocateMisses;
2264 ULONG AllocateHits;
2265 } DUMMYUNIONNAME2;
2266 ULONG TotalFrees;
2267 union {
2268 ULONG FreeMisses;
2269 ULONG FreeHits;
2270 } DUMMYUNIONNAME3;
2271 POOL_TYPE Type;
2272 ULONG Tag;
2273 ULONG Size;
2274 union {
2275 PALLOCATE_FUNCTION_EX AllocateEx;
2276 PALLOCATE_FUNCTION Allocate;
2277 } DUMMYUNIONNAME4;
2278 union {
2279 PFREE_FUNCTION_EX FreeEx;
2280 PFREE_FUNCTION Free;
2281 } DUMMYUNIONNAME5;
2282 LIST_ENTRY ListEntry;
2283 ULONG LastTotalAllocates;
2284 union {
2285 ULONG LastAllocateMisses;
2286 ULONG LastAllocateHits;
2287 } DUMMYUNIONNAME6;
2288 ULONG Future[2];
2289 } GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
2290
2291 typedef struct _PAGED_LOOKASIDE_LIST {
2292 GENERAL_LOOKASIDE L;
2293 #if !defined(_AMD64_) && !defined(_IA64_)
2294 FAST_MUTEX Lock__ObsoleteButDoNotDelete;
2295 #endif
2296 } PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
2297
2298 typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST {
2299 GENERAL_LOOKASIDE L;
2300 #if !defined(_AMD64_) && !defined(_IA64_)
2301 KSPIN_LOCK Lock__ObsoleteButDoNotDelete;
2302 #endif
2303 } NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
2304
2305 //typedef struct _LOOKASIDE_LIST_EX {
2306 // GENERAL_LOOKASIDE_POOL L;
2307 //} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
2308
2309 typedef struct _EX_RUNDOWN_REF {
2310 union {
2311 volatile ULONG_PTR Count;
2312 volatile PVOID Ptr;
2313 };
2314 } EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
2315
2316 typedef enum _WORK_QUEUE_TYPE {
2317 CriticalWorkQueue,
2318 DelayedWorkQueue,
2319 HyperCriticalWorkQueue,
2320 MaximumWorkQueue
2321 } WORK_QUEUE_TYPE;
2322
2323 typedef VOID
2324 (DDKAPI *PWORKER_THREAD_ROUTINE)(
2325 IN PVOID Parameter);
2326
2327 typedef struct _WORK_QUEUE_ITEM {
2328 LIST_ENTRY List;
2329 PWORKER_THREAD_ROUTINE WorkerRoutine;
2330 volatile PVOID Parameter;
2331 } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
2332
2333
2334 /******************************************************************************
2335 * Executive Functions *
2336 ******************************************************************************/
2337
2338 #if defined(_X86_)
2339 #if defined(_NTHAL_)
2340 #define ExAcquireFastMutex ExiAcquireFastMutex
2341 #define ExReleaseFastMutex ExiReleaseFastMutex
2342 #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex
2343 #endif
2344 #define ExInterlockedAddUlong ExfInterlockedAddUlong
2345 #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
2346 #define ExInterlockedInsertTailList ExfInterlockedInsertTailList
2347 #define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
2348 #define ExInterlockedPopEntryList ExfInterlockedPopEntryList
2349 #define ExInterlockedPushEntryList ExfInterlockedPushEntryList
2350 #endif
2351
2352 #if defined(_WIN64)
2353
2354 #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || \
2355 defined(_NTHAL_) || defined(_NTOSP_)
2356 NTKERNELAPI
2357 USHORT
2358 ExQueryDepthSList(IN PSLIST_HEADER ListHead);
2359 #else
2360 FORCEINLINE
2361 USHORT
2362 ExQueryDepthSList(IN PSLIST_HEADER ListHead)
2363 {
2364 return (USHORT)(ListHead->Alignment & 0xffff);
2365 }
2366 #endif
2367
2368 NTKERNELAPI
2369 PSLIST_ENTRY
2370 ExpInterlockedFlushSList(
2371 PSLIST_HEADER ListHead);
2372
2373 NTKERNELAPI
2374 PSLIST_ENTRY
2375 ExpInterlockedPopEntrySList(
2376 PSLIST_HEADER ListHead);
2377
2378 NTKERNELAPI
2379 PSLIST_ENTRY
2380 ExpInterlockedPushEntrySList(
2381 PSLIST_HEADER ListHead,
2382 PSLIST_ENTRY ListEntry);
2383
2384 #define ExInterlockedFlushSList(Head) \
2385 ExpInterlockedFlushSList(Head)
2386 #define ExInterlockedPopEntrySList(Head, Lock) \
2387 ExpInterlockedPopEntrySList(Head)
2388 #define ExInterlockedPushEntrySList(Head, Entry, Lock) \
2389 ExpInterlockedPushEntrySList(Head, Entry)
2390
2391 #else // !defined(_WIN64)
2392
2393 #define ExQueryDepthSList(listhead) (listhead)->Depth
2394
2395 NTKERNELAPI
2396 PSINGLE_LIST_ENTRY
2397 FASTCALL
2398 ExInterlockedFlushSList(
2399 IN PSLIST_HEADER ListHead);
2400
2401 #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
2402 NTKERNELAPI
2403 PSINGLE_LIST_ENTRY
2404 FASTCALL
2405 ExInterlockedPopEntrySList(
2406 IN PSLIST_HEADER ListHead,
2407 IN PKSPIN_LOCK Lock);
2408
2409 NTKERNELAPI
2410 PSINGLE_LIST_ENTRY
2411 FASTCALL
2412 ExInterlockedPushEntrySList(
2413 IN PSLIST_HEADER ListHead,
2414 IN PSINGLE_LIST_ENTRY ListEntry,
2415 IN PKSPIN_LOCK Lock);
2416 #else
2417 #define ExInterlockedPopEntrySList(_ListHead, _Lock) \
2418 InterlockedPopEntrySList(_ListHead)
2419 #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \
2420 InterlockedPushEntrySList(_ListHead, _ListEntry)
2421 #endif // _WIN2K_COMPAT_SLIST_USAGE
2422
2423 #endif // !defined(_WIN64)
2424
2425 /* ERESOURCE_THREAD
2426 * ExGetCurrentResourceThread(
2427 * VOID);
2428 */
2429 #define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread())
2430
2431 #define ExReleaseResource(R) (ExReleaseResourceLite(R))
2432
2433 /* VOID
2434 * ExInitializeWorkItem(
2435 * IN PWORK_QUEUE_ITEM Item,
2436 * IN PWORKER_THREAD_ROUTINE Routine,
2437 * IN PVOID Context)
2438 */
2439 #define ExInitializeWorkItem(Item, Routine, Context) \
2440 { \
2441 (Item)->WorkerRoutine = Routine; \
2442 (Item)->Parameter = Context; \
2443 (Item)->List.Flink = NULL; \
2444 }
2445
2446 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2447
2448 NTKERNELAPI
2449 VOID
2450 FASTCALL
2451 ExAcquireFastMutex(
2452 IN OUT PFAST_MUTEX FastMutex);
2453
2454 NTKERNELAPI
2455 VOID
2456 FASTCALL
2457 ExReleaseFastMutex(
2458 IN OUT PFAST_MUTEX FastMutex);
2459
2460 NTKERNELAPI
2461 BOOLEAN
2462 FASTCALL
2463 ExTryToAcquireFastMutex(
2464 IN OUT PFAST_MUTEX FastMutex);
2465
2466 NTKERNELAPI
2467 BOOLEAN
2468 NTAPI
2469 ExAcquireResourceExclusiveLite(
2470 IN PERESOURCE Resource,
2471 IN BOOLEAN Wait);
2472
2473 NTKERNELAPI
2474 BOOLEAN
2475 NTAPI
2476 ExAcquireResourceSharedLite(
2477 IN PERESOURCE Resource,
2478 IN BOOLEAN Wait);
2479
2480 NTKERNELAPI
2481 BOOLEAN
2482 NTAPI
2483 ExAcquireSharedStarveExclusive(
2484 IN PERESOURCE Resource,
2485 IN BOOLEAN Wait);
2486
2487 NTKERNELAPI
2488 BOOLEAN
2489 NTAPI
2490 ExAcquireSharedWaitForExclusive(
2491 IN PERESOURCE Resource,
2492 IN BOOLEAN Wait);
2493
2494 NTKERNELAPI
2495 PVOID
2496 NTAPI
2497 ExAllocatePool(
2498 IN POOL_TYPE PoolType,
2499 IN SIZE_T NumberOfBytes);
2500
2501 #ifdef POOL_TAGGING
2502 #define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD')
2503 #endif /* POOL_TAGGING */
2504
2505 NTKERNELAPI
2506 PVOID
2507 NTAPI
2508 ExAllocatePoolWithQuota(
2509 IN POOL_TYPE PoolType,
2510 IN SIZE_T NumberOfBytes);
2511
2512 #ifdef POOL_TAGGING
2513 #define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD')
2514 #endif /* POOL_TAGGING */
2515
2516 NTKERNELAPI
2517 PVOID
2518 NTAPI
2519 ExAllocatePoolWithQuotaTag(
2520 IN POOL_TYPE PoolType,
2521 IN SIZE_T NumberOfBytes,
2522 IN ULONG Tag);
2523
2524 #ifndef POOL_TAGGING
2525 #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
2526 #endif /* POOL_TAGGING */
2527
2528 NTKERNELAPI
2529 PVOID
2530 NTAPI
2531 ExAllocatePoolWithTag(
2532 IN POOL_TYPE PoolType,
2533 IN SIZE_T NumberOfBytes,
2534 IN ULONG Tag);
2535
2536 NTKERNELAPI
2537 PVOID
2538 NTAPI
2539 ExAllocatePoolWithTagPriority(
2540 IN POOL_TYPE PoolType,
2541 IN SIZE_T NumberOfBytes,
2542 IN ULONG Tag,
2543 IN EX_POOL_PRIORITY Priority);
2544
2545 NTKERNELAPI
2546 VOID
2547 NTAPI
2548 ExConvertExclusiveToSharedLite(
2549 IN PERESOURCE Resource);
2550
2551 NTKERNELAPI
2552 NTSTATUS
2553 NTAPI
2554 ExCreateCallback(
2555 OUT PCALLBACK_OBJECT *CallbackObject,
2556 IN POBJECT_ATTRIBUTES ObjectAttributes,
2557 IN BOOLEAN Create,
2558 IN BOOLEAN AllowMultipleCallbacks);
2559
2560 NTKERNELAPI
2561 VOID
2562 NTAPI
2563 ExDeleteNPagedLookasideList(
2564 IN PNPAGED_LOOKASIDE_LIST Lookaside);
2565
2566 NTKERNELAPI
2567 VOID
2568 NTAPI
2569 ExDeletePagedLookasideList(
2570 IN PPAGED_LOOKASIDE_LIST Lookaside);
2571
2572 NTKERNELAPI
2573 NTSTATUS
2574 NTAPI
2575 ExDeleteResourceLite(
2576 IN PERESOURCE Resource);
2577
2578 NTKERNELAPI
2579 VOID
2580 NTAPI
2581 ExFreePool(
2582 IN PVOID P);
2583
2584 #ifdef POOL_TAGGING
2585 #define ExFreePool(P) ExFreePoolWithTag(P, 0)
2586 #endif
2587
2588 NTKERNELAPI
2589 VOID
2590 NTAPI
2591 ExFreePoolWithTag(
2592 IN PVOID P,
2593 IN ULONG Tag);
2594
2595 NTKERNELAPI
2596 ULONG
2597 NTAPI
2598 ExGetExclusiveWaiterCount(
2599 IN PERESOURCE Resource);
2600
2601 NTKERNELAPI
2602 KPROCESSOR_MODE
2603 NTAPI
2604 ExGetPreviousMode(
2605 VOID);
2606
2607 NTKERNELAPI
2608 ULONG
2609 NTAPI
2610 ExGetSharedWaiterCount(
2611 IN PERESOURCE Resource);
2612
2613 NTKERNELAPI
2614 VOID
2615 NTAPI
2616 ExInitializeNPagedLookasideList(
2617 IN PNPAGED_LOOKASIDE_LIST Lookaside,
2618 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
2619 IN PFREE_FUNCTION Free OPTIONAL,
2620 IN ULONG Flags,
2621 IN SIZE_T Size,
2622 IN ULONG Tag,
2623 IN USHORT Depth);
2624
2625 NTKERNELAPI
2626 VOID
2627 NTAPI
2628 ExInitializePagedLookasideList(
2629 IN PPAGED_LOOKASIDE_LIST Lookaside,
2630 IN PALLOCATE_FUNCTION Allocate OPTIONAL,
2631 IN PFREE_FUNCTION Free OPTIONAL,
2632 IN ULONG Flags,
2633 IN SIZE_T Size,
2634 IN ULONG Tag,
2635 IN USHORT Depth);
2636
2637 NTKERNELAPI
2638 NTSTATUS
2639 NTAPI
2640 ExInitializeResourceLite(
2641 IN PERESOURCE Resource);
2642
2643 NTKERNELAPI
2644 LARGE_INTEGER
2645 NTAPI
2646 ExInterlockedAddLargeInteger(
2647 IN PLARGE_INTEGER Addend,
2648 IN LARGE_INTEGER Increment,
2649 IN PKSPIN_LOCK Lock);
2650
2651 #if defined(_WIN64)
2652 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2653 (VOID)InterlockedAdd64(&(Addend)->QuadPart, Increment)
2654 #else
2655 #define ExInterlockedAddLargeStatistic(Addend, Increment) \
2656 _InterlockedAddLargeStatistic((PLONGLONG)&(Addend)->QuadPart, Increment)
2657 #endif
2658
2659 NTKERNELAPI
2660 ULONG
2661 FASTCALL
2662 ExInterlockedAddUlong(
2663 IN PULONG Addend,
2664 IN ULONG Increment,
2665 PKSPIN_LOCK Lock);
2666
2667 #if defined(_AMD64_) || defined(_IA64_)
2668 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2669 InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
2670 #elif defined(_X86_)
2671 NTKERNELAPI
2672 LONGLONG
2673 FASTCALL
2674 ExfInterlockedCompareExchange64(
2675 IN OUT LONGLONG volatile *Destination,
2676 IN PLONGLONG Exchange,
2677 IN PLONGLONG Comperand);
2678 #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
2679 ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
2680 #else
2681 NTKERNELAPI
2682 LONGLONG
2683 FASTCALL
2684 ExInterlockedCompareExchange64(
2685 IN OUT LONGLONG volatile *Destination,
2686 IN PLONGLONG Exchange,
2687 IN PLONGLONG Comparand,
2688 IN PKSPIN_LOCK Lock);
2689 #endif
2690
2691 NTKERNELAPI
2692 PLIST_ENTRY
2693 FASTCALL
2694 ExInterlockedInsertHeadList(
2695 IN PLIST_ENTRY ListHead,
2696 IN PLIST_ENTRY ListEntry,
2697 IN PKSPIN_LOCK Lock);
2698
2699 NTKERNELAPI
2700 PLIST_ENTRY
2701 FASTCALL
2702 ExInterlockedInsertTailList(
2703 IN PLIST_ENTRY ListHead,
2704 IN PLIST_ENTRY ListEntry,
2705 IN PKSPIN_LOCK Lock);
2706
2707 NTKERNELAPI
2708 PSINGLE_LIST_ENTRY
2709 FASTCALL
2710 ExInterlockedPopEntryList(
2711 IN PSINGLE_LIST_ENTRY ListHead,
2712 IN PKSPIN_LOCK Lock);
2713
2714 NTKERNELAPI
2715 PSINGLE_LIST_ENTRY
2716 FASTCALL
2717 ExInterlockedPushEntryList(
2718 IN PSINGLE_LIST_ENTRY ListHead,
2719 IN PSINGLE_LIST_ENTRY ListEntry,
2720 IN PKSPIN_LOCK Lock);
2721
2722 NTKERNELAPI
2723 PLIST_ENTRY
2724 FASTCALL
2725 ExInterlockedRemoveHeadList(
2726 IN PLIST_ENTRY ListHead,
2727 IN PKSPIN_LOCK Lock);
2728
2729 NTKERNELAPI
2730 BOOLEAN
2731 NTAPI
2732 ExIsProcessorFeaturePresent(
2733 IN ULONG ProcessorFeature);
2734
2735 NTKERNELAPI
2736 BOOLEAN
2737 NTAPI
2738 ExIsResourceAcquiredExclusiveLite(
2739 IN PERESOURCE Resource);
2740
2741 NTKERNELAPI
2742 ULONG
2743 NTAPI
2744 ExIsResourceAcquiredSharedLite(
2745 IN PERESOURCE Resource);
2746
2747 #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
2748
2749 NTKERNELAPI
2750 VOID
2751 NTAPI
2752 ExLocalTimeToSystemTime(
2753 IN PLARGE_INTEGER LocalTime,
2754 OUT PLARGE_INTEGER SystemTime);
2755
2756 NTKERNELAPI
2757 VOID
2758 NTAPI
2759 ExNotifyCallback(
2760 IN PCALLBACK_OBJECT CallbackObject,
2761 IN PVOID Argument1,
2762 IN PVOID Argument2);
2763
2764 NTKERNELAPI
2765 VOID
2766 NTAPI
2767 ExQueueWorkItem(
2768 IN PWORK_QUEUE_ITEM WorkItem,
2769 IN WORK_QUEUE_TYPE QueueType);
2770
2771 NTKERNELAPI
2772 DECLSPEC_NORETURN
2773 VOID
2774 NTAPI
2775 ExRaiseStatus(
2776 IN NTSTATUS Status);
2777
2778 NTKERNELAPI
2779 PVOID
2780 NTAPI
2781 ExRegisterCallback(
2782 IN PCALLBACK_OBJECT CallbackObject,
2783 IN PCALLBACK_FUNCTION CallbackFunction,
2784 IN PVOID CallbackContext);
2785
2786 NTKERNELAPI
2787 NTSTATUS
2788 NTAPI
2789 ExReinitializeResourceLite(
2790 IN PERESOURCE Resource);
2791
2792 NTKERNELAPI
2793 VOID
2794 NTAPI
2795 ExReleaseResourceForThreadLite(
2796 IN PERESOURCE Resource,
2797 IN ERESOURCE_THREAD ResourceThreadId);
2798
2799 NTKERNELAPI
2800 VOID
2801 FASTCALL
2802 ExReleaseResourceLite(
2803 IN PERESOURCE Resource);
2804
2805 NTKERNELAPI
2806 VOID
2807 NTAPI
2808 ExSetResourceOwnerPointer(
2809 IN PERESOURCE Resource,
2810 IN PVOID OwnerPointer);
2811
2812 NTKERNELAPI
2813 ULONG
2814 NTAPI
2815 ExSetTimerResolution(
2816 IN ULONG DesiredTime,
2817 IN BOOLEAN SetResolution);
2818
2819 NTKERNELAPI
2820 VOID
2821 NTAPI
2822 ExSystemTimeToLocalTime(
2823 IN PLARGE_INTEGER SystemTime,
2824 OUT PLARGE_INTEGER LocalTime);
2825
2826 NTKERNELAPI
2827 VOID
2828 NTAPI
2829 ExUnregisterCallback(
2830 IN PVOID CbRegistration);
2831
2832
2833 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
2834
2835 #if (NTDDI_VERSION >= NTDDI_WINXP)
2836 NTKERNELAPI
2837 BOOLEAN
2838 FASTCALL
2839 ExAcquireRundownProtection(
2840 IN OUT PEX_RUNDOWN_REF RunRef);
2841
2842 NTKERNELAPI
2843 VOID
2844 FASTCALL
2845 ExInitializeRundownProtection(
2846 OUT PEX_RUNDOWN_REF RunRef);
2847
2848 NTKERNELAPI
2849 VOID
2850 FASTCALL
2851 ExReInitializeRundownProtection(
2852 OUT PEX_RUNDOWN_REF RunRef);
2853
2854 NTKERNELAPI
2855 VOID
2856 FASTCALL
2857 ExReleaseRundownProtection(
2858 IN OUT PEX_RUNDOWN_REF RunRef);
2859
2860 NTKERNELAPI
2861 VOID
2862 FASTCALL
2863 ExRundownCompleted(
2864 OUT PEX_RUNDOWN_REF RunRef);
2865
2866 NTKERNELAPI
2867 BOOLEAN
2868 NTAPI
2869 ExVerifySuite(
2870 IN SUITE_TYPE SuiteType);
2871
2872 NTKERNELAPI
2873 VOID
2874 FASTCALL
2875 ExWaitForRundownProtectionRelease(
2876 IN OUT PEX_RUNDOWN_REF RunRef);
2877
2878 #endif // (NTDDI_VERSION >= NTDDI_WINXP)
2879
2880 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
2881 NTKERNELAPI
2882 BOOLEAN
2883 FASTCALL
2884 ExAcquireRundownProtectionEx(
2885 IN OUT PEX_RUNDOWN_REF RunRef,
2886 IN ULONG Count);
2887
2888 NTKERNELAPI
2889 VOID
2890 FASTCALL
2891 ExReleaseRundownProtectionEx(
2892 IN OUT PEX_RUNDOWN_REF RunRef,
2893 IN ULONG Count);
2894 #endif // (NTDDI_VERSION >= NTDDI_WINXPSP2)
2895
2896 #if (NTDDI_VERSION >= NTDDI_WS03)
2897
2898 #endif // (NTDDI_VERSION >= NTDDI_WS03)
2899
2900 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
2901 NTKERNELAPI
2902 PEX_RUNDOWN_REF_CACHE_AWARE
2903 ExAllocateCacheAwareRundownProtection(
2904 IN POOL_TYPE PoolType,
2905 IN ULONG PoolTag);
2906
2907 NTKERNELAPI
2908 SIZE_T
2909 ExSizeOfRundownProtectionCacheAware(VOID);
2910
2911 #endif // (NTDDI_VERSION >= NTDDI_WS03SP1)
2912
2913 #if (NTDDI_VERSION >= NTDDI_VISTA)
2914 NTKERNELAPI
2915 NTSTATUS
2916 ExInitializeLookasideListEx(
2917 OUT PLOOKASIDE_LIST_EX Lookaside,
2918 IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,
2919 IN PFREE_FUNCTION_EX Free OPTIONAL,
2920 IN POOL_TYPE PoolType,
2921 IN ULONG Flags,
2922 IN SIZE_T Size,
2923 IN ULONG Tag,
2924 IN USHORT Depth);
2925 #endif
2926
2927
2928 #if !defined(MIDL_PASS)
2929
2930 static __inline PVOID
2931 ExAllocateFromNPagedLookasideList(
2932 IN PNPAGED_LOOKASIDE_LIST Lookaside)
2933 {
2934 PVOID Entry;
2935
2936 Lookaside->L.TotalAllocates++;
2937 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
2938 if (Entry == NULL) {
2939 Lookaside->L.AllocateMisses++;
2940 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
2941 Lookaside->L.Size,
2942 Lookaside->L.Tag);
2943 }
2944 return Entry;
2945 }
2946
2947 static __inline PVOID
2948 ExAllocateFromPagedLookasideList(
2949 IN PPAGED_LOOKASIDE_LIST Lookaside)
2950 {
2951 PVOID Entry;
2952
2953 Lookaside->L.TotalAllocates++;
2954 Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
2955 if (Entry == NULL) {
2956 Lookaside->L.AllocateMisses++;
2957 Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
2958 Lookaside->L.Size,
2959 Lookaside->L.Tag);
2960 }
2961 return Entry;
2962 }
2963
2964 static __inline VOID
2965 ExFreeToNPagedLookasideList(
2966 IN PNPAGED_LOOKASIDE_LIST Lookaside,
2967 IN PVOID Entry)
2968 {
2969 Lookaside->L.TotalFrees++;
2970 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
2971 Lookaside->L.FreeMisses++;
2972 (Lookaside->L.Free)(Entry);
2973 } else {
2974 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
2975 }
2976 }
2977
2978 static __inline VOID
2979 ExFreeToPagedLookasideList(
2980 IN PPAGED_LOOKASIDE_LIST Lookaside,
2981 IN PVOID Entry)
2982 {
2983 Lookaside->L.TotalFrees++;
2984 if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
2985 Lookaside->L.FreeMisses++;
2986 (Lookaside->L.Free)(Entry);
2987 } else {
2988 InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
2989 }
2990 }
2991
2992
2993 #endif // !defined(MIDL_PASS)
2994
2995
2996 #ifdef __cplusplus
2997 }
2998 #endif
2999
3000 #endif // _WDMDDK_