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