[XDK]
[reactos.git] / include / xdk / ntddk.template.h
1 /*
2 * ntddk.h
3 *
4 * Windows NT Device Driver Kit
5 *
6 * This file is part of the ReactOS DDK package.
7 *
8 * Contributors:
9 * Amine Khaldi
10 * Timo Kreuzer (timo.kreuzer@reactos.org)
11 *
12 * THIS SOFTWARE IS NOT COPYRIGHTED
13 *
14 * This source code is offered for use in the public domain. You may
15 * use, modify or distribute it freely.
16 *
17 * This code is distributed in the hope that it will be useful but
18 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
19 * DISCLAIMED. This includes but is not limited to warranties of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 *
22 */
23
24 #pragma once
25
26 #define _NTDDK_
27
28 #if !defined(_NTHAL_) && !defined(_NTIFS_)
29 #define _NTDDK_INCLUDED_
30 #define _DDK_DRIVER_
31 #endif
32
33 /* Dependencies */
34
35 #define NT_INCLUDED
36 #define _CTYPE_DISABLE_MACROS
37
38 #include <wdm.h>
39 #include <excpt.h>
40 #include <ntdef.h>
41 #include <ntstatus.h>
42
43 /* FIXME
44 #include <bugcodes.h>
45 #include <ntiologc.h>
46 */
47
48 #include <stdarg.h> // FIXME
49 #include <basetyps.h> // FIXME
50
51
52 #ifdef __cplusplus
53 extern "C" {
54 #endif
55
56 /* GUID and UUID */
57 #ifndef _NTLSA_IFS_
58 #ifndef _NTLSA_AUDIT_
59 #define _NTLSA_AUDIT_
60
61 #ifndef GUID_DEFINED
62 #include <guiddef.h>
63 #endif
64
65 #endif /* _NTLSA_AUDIT_ */
66 #endif /* _NTLSA_IFS_ */
67
68 typedef GUID UUID;
69
70 struct _LOADER_PARAMETER_BLOCK;
71 struct _CREATE_DISK;
72 struct _DRIVE_LAYOUT_INFORMATION_EX;
73 struct _SET_PARTITION_INFORMATION_EX;
74
75 typedef struct _BUS_HANDLER *PBUS_HANDLER;
76 typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT;
77 #if defined(_NTHAL_INCLUDED_)
78 typedef struct _KAFFINITY_EX *PKAFFINITY_EX;
79 #endif
80 typedef struct _PEB *PPEB;
81
82 #ifndef _NTIMAGE_
83
84 typedef struct _IMAGE_NT_HEADERS *PIMAGE_NT_HEADERS32;
85 typedef struct _IMAGE_NT_HEADERS64 *PIMAGE_NT_HEADERS64;
86
87 #ifdef _WIN64
88 typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS;
89 #else
90 typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS;
91 #endif
92
93 #endif /* _NTIMAGE_ */
94
95 #define PsGetCurrentProcess IoGetCurrentProcess
96
97 #if (NTDDI_VERSION >= NTDDI_VISTA)
98 extern NTSYSAPI volatile CCHAR KeNumberProcessors;
99 #elif (NTDDI_VERSION >= NTDDI_WINXP)
100 extern NTSYSAPI CCHAR KeNumberProcessors;
101 #else
102 extern PCCHAR KeNumberProcessors;
103 #endif
104
105 #include <mce.h>
106
107 #ifdef _X86_
108
109 #define KERNEL_STACK_SIZE 12288
110 #define KERNEL_LARGE_STACK_SIZE 61440
111 #define KERNEL_LARGE_STACK_COMMIT 12288
112
113 #define SIZE_OF_80387_REGISTERS 80
114
115 #if !defined(RC_INVOKED)
116
117 #define CONTEXT_i386 0x10000
118 #define CONTEXT_i486 0x10000
119 #define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
120 #define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
121 #define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
122 #define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
123 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
124 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
125
126 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
127 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | \
128 CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | \
129 CONTEXT_EXTENDED_REGISTERS)
130
131 #define CONTEXT_XSTATE (CONTEXT_i386 | 0x00000040L)
132
133 #endif /* !defined(RC_INVOKED) */
134
135 typedef struct _FLOATING_SAVE_AREA {
136 ULONG ControlWord;
137 ULONG StatusWord;
138 ULONG TagWord;
139 ULONG ErrorOffset;
140 ULONG ErrorSelector;
141 ULONG DataOffset;
142 ULONG DataSelector;
143 UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
144 ULONG Cr0NpxState;
145 } FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
146
147 #include "pshpack4.h"
148 typedef struct _CONTEXT {
149 ULONG ContextFlags;
150 ULONG Dr0;
151 ULONG Dr1;
152 ULONG Dr2;
153 ULONG Dr3;
154 ULONG Dr6;
155 ULONG Dr7;
156 FLOATING_SAVE_AREA FloatSave;
157 ULONG SegGs;
158 ULONG SegFs;
159 ULONG SegEs;
160 ULONG SegDs;
161 ULONG Edi;
162 ULONG Esi;
163 ULONG Ebx;
164 ULONG Edx;
165 ULONG Ecx;
166 ULONG Eax;
167 ULONG Ebp;
168 ULONG Eip;
169 ULONG SegCs;
170 ULONG EFlags;
171 ULONG Esp;
172 ULONG SegSs;
173 UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
174 } CONTEXT;
175 #include "poppack.h"
176
177 #endif /* _X86_ */
178
179 #ifdef _AMD64_
180
181 #define KERNEL_STACK_SIZE 0x6000
182 #define KERNEL_LARGE_STACK_SIZE 0x12000
183 #define KERNEL_LARGE_STACK_COMMIT KERNEL_STACK_SIZE
184
185 #define KERNEL_MCA_EXCEPTION_STACK_SIZE 0x2000
186
187 #define EXCEPTION_READ_FAULT 0
188 #define EXCEPTION_WRITE_FAULT 1
189 #define EXCEPTION_EXECUTE_FAULT 8
190
191 #if !defined(RC_INVOKED)
192
193 #define CONTEXT_AMD64 0x100000
194
195 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
196 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
197 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
198 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
199 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
200
201 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
202 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
203
204 #define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L)
205
206 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
207 #define CONTEXT_SERVICE_ACTIVE 0x10000000
208 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
209 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
210
211 #endif /* !defined(RC_INVOKED) */
212
213 #define INITIAL_MXCSR 0x1f80
214 #define INITIAL_FPCSR 0x027f
215
216 typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
217 ULONG64 P1Home;
218 ULONG64 P2Home;
219 ULONG64 P3Home;
220 ULONG64 P4Home;
221 ULONG64 P5Home;
222 ULONG64 P6Home;
223 ULONG ContextFlags;
224 ULONG MxCsr;
225 USHORT SegCs;
226 USHORT SegDs;
227 USHORT SegEs;
228 USHORT SegFs;
229 USHORT SegGs;
230 USHORT SegSs;
231 ULONG EFlags;
232 ULONG64 Dr0;
233 ULONG64 Dr1;
234 ULONG64 Dr2;
235 ULONG64 Dr3;
236 ULONG64 Dr6;
237 ULONG64 Dr7;
238 ULONG64 Rax;
239 ULONG64 Rcx;
240 ULONG64 Rdx;
241 ULONG64 Rbx;
242 ULONG64 Rsp;
243 ULONG64 Rbp;
244 ULONG64 Rsi;
245 ULONG64 Rdi;
246 ULONG64 R8;
247 ULONG64 R9;
248 ULONG64 R10;
249 ULONG64 R11;
250 ULONG64 R12;
251 ULONG64 R13;
252 ULONG64 R14;
253 ULONG64 R15;
254 ULONG64 Rip;
255 union {
256 XMM_SAVE_AREA32 FltSave;
257 struct {
258 M128A Header[2];
259 M128A Legacy[8];
260 M128A Xmm0;
261 M128A Xmm1;
262 M128A Xmm2;
263 M128A Xmm3;
264 M128A Xmm4;
265 M128A Xmm5;
266 M128A Xmm6;
267 M128A Xmm7;
268 M128A Xmm8;
269 M128A Xmm9;
270 M128A Xmm10;
271 M128A Xmm11;
272 M128A Xmm12;
273 M128A Xmm13;
274 M128A Xmm14;
275 M128A Xmm15;
276 } DUMMYSTRUCTNAME;
277 } DUMMYUNIONNAME;
278 M128A VectorRegister[26];
279 ULONG64 VectorControl;
280 ULONG64 DebugControl;
281 ULONG64 LastBranchToRip;
282 ULONG64 LastBranchFromRip;
283 ULONG64 LastExceptionToRip;
284 ULONG64 LastExceptionFromRip;
285 } CONTEXT;
286
287 #endif /* _AMD64_ */
288
289 $define (_NTDDK_)
290 $include (extypes.h)
291 $include (iotypes.h)
292 $include (haltypes.h)
293 $include (ketypes.h)
294 $include (kdtypes.h)
295 $include (mmtypes.h)
296 $include (pstypes.h)
297 $include (rtltypes.h)
298 $include (setypes.h)
299
300 $include (exfuncs.h)
301 $include (halfuncs.h)
302 $include (iofuncs.h)
303 $include (kdfuncs.h)
304 $include (kefuncs.h)
305 $include (mmfuncs.h)
306 $include (psfuncs.h)
307 $include (rtlfuncs.h)
308 $include (sefuncs.h)
309 $include (zwfuncs.h)
310
311
312 /* UNSORTED */
313
314 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
315 ((ConditionMask) = VerSetConditionMask((ConditionMask), \
316 (TypeBitMask), (ComparisonType)))
317
318 #if (NTDDI_VERSION >= NTDDI_WIN2K)
319 NTSYSAPI
320 ULONGLONG
321 NTAPI
322 VerSetConditionMask(
323 IN ULONGLONG ConditionMask,
324 IN ULONG TypeMask,
325 IN UCHAR Condition);
326 #endif
327
328 typedef struct _KEY_NAME_INFORMATION {
329 ULONG NameLength;
330 WCHAR Name[1];
331 } KEY_NAME_INFORMATION, *PKEY_NAME_INFORMATION;
332
333 typedef struct _KEY_CACHED_INFORMATION {
334 LARGE_INTEGER LastWriteTime;
335 ULONG TitleIndex;
336 ULONG SubKeys;
337 ULONG MaxNameLen;
338 ULONG Values;
339 ULONG MaxValueNameLen;
340 ULONG MaxValueDataLen;
341 ULONG NameLength;
342 } KEY_CACHED_INFORMATION, *PKEY_CACHED_INFORMATION;
343
344 typedef struct _KEY_VIRTUALIZATION_INFORMATION {
345 ULONG VirtualizationCandidate:1;
346 ULONG VirtualizationEnabled:1;
347 ULONG VirtualTarget:1;
348 ULONG VirtualStore:1;
349 ULONG VirtualSource:1;
350 ULONG Reserved:27;
351 } KEY_VIRTUALIZATION_INFORMATION, *PKEY_VIRTUALIZATION_INFORMATION;
352
353 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
354 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
355 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
356 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
357 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
358
359 typedef struct _QUOTA_LIMITS {
360 SIZE_T PagedPoolLimit;
361 SIZE_T NonPagedPoolLimit;
362 SIZE_T MinimumWorkingSetSize;
363 SIZE_T MaximumWorkingSetSize;
364 SIZE_T PagefileLimit;
365 LARGE_INTEGER TimeLimit;
366 } QUOTA_LIMITS, *PQUOTA_LIMITS;
367
368 typedef union _RATE_QUOTA_LIMIT {
369 ULONG RateData;
370 struct {
371 ULONG RatePercent:7;
372 ULONG Reserved0:25;
373 } DUMMYSTRUCTNAME;
374 } RATE_QUOTA_LIMIT, *PRATE_QUOTA_LIMIT;
375
376 typedef struct _QUOTA_LIMITS_EX {
377 SIZE_T PagedPoolLimit;
378 SIZE_T NonPagedPoolLimit;
379 SIZE_T MinimumWorkingSetSize;
380 SIZE_T MaximumWorkingSetSize;
381 SIZE_T PagefileLimit;
382 LARGE_INTEGER TimeLimit;
383 SIZE_T WorkingSetLimit;
384 SIZE_T Reserved2;
385 SIZE_T Reserved3;
386 SIZE_T Reserved4;
387 ULONG Flags;
388 RATE_QUOTA_LIMIT CpuRateLimit;
389 } QUOTA_LIMITS_EX, *PQUOTA_LIMITS_EX;
390
391 typedef struct _IO_COUNTERS {
392 ULONGLONG ReadOperationCount;
393 ULONGLONG WriteOperationCount;
394 ULONGLONG OtherOperationCount;
395 ULONGLONG ReadTransferCount;
396 ULONGLONG WriteTransferCount;
397 ULONGLONG OtherTransferCount;
398 } IO_COUNTERS, *PIO_COUNTERS;
399
400 typedef struct _VM_COUNTERS {
401 SIZE_T PeakVirtualSize;
402 SIZE_T VirtualSize;
403 ULONG PageFaultCount;
404 SIZE_T PeakWorkingSetSize;
405 SIZE_T WorkingSetSize;
406 SIZE_T QuotaPeakPagedPoolUsage;
407 SIZE_T QuotaPagedPoolUsage;
408 SIZE_T QuotaPeakNonPagedPoolUsage;
409 SIZE_T QuotaNonPagedPoolUsage;
410 SIZE_T PagefileUsage;
411 SIZE_T PeakPagefileUsage;
412 } VM_COUNTERS, *PVM_COUNTERS;
413
414 typedef struct _VM_COUNTERS_EX {
415 SIZE_T PeakVirtualSize;
416 SIZE_T VirtualSize;
417 ULONG PageFaultCount;
418 SIZE_T PeakWorkingSetSize;
419 SIZE_T WorkingSetSize;
420 SIZE_T QuotaPeakPagedPoolUsage;
421 SIZE_T QuotaPagedPoolUsage;
422 SIZE_T QuotaPeakNonPagedPoolUsage;
423 SIZE_T QuotaNonPagedPoolUsage;
424 SIZE_T PagefileUsage;
425 SIZE_T PeakPagefileUsage;
426 SIZE_T PrivateUsage;
427 } VM_COUNTERS_EX, *PVM_COUNTERS_EX;
428
429 #define MAX_HW_COUNTERS 16
430 #define THREAD_PROFILING_FLAG_DISPATCH 0x00000001
431
432 typedef enum _HARDWARE_COUNTER_TYPE {
433 PMCCounter,
434 MaxHardwareCounterType
435 } HARDWARE_COUNTER_TYPE, *PHARDWARE_COUNTER_TYPE;
436
437 typedef struct _HARDWARE_COUNTER {
438 HARDWARE_COUNTER_TYPE Type;
439 ULONG Reserved;
440 ULONG64 Index;
441 } HARDWARE_COUNTER, *PHARDWARE_COUNTER;
442
443 typedef struct _POOLED_USAGE_AND_LIMITS {
444 SIZE_T PeakPagedPoolUsage;
445 SIZE_T PagedPoolUsage;
446 SIZE_T PagedPoolLimit;
447 SIZE_T PeakNonPagedPoolUsage;
448 SIZE_T NonPagedPoolUsage;
449 SIZE_T NonPagedPoolLimit;
450 SIZE_T PeakPagefileUsage;
451 SIZE_T PagefileUsage;
452 SIZE_T PagefileLimit;
453 } POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS;
454
455 typedef struct _PROCESS_ACCESS_TOKEN {
456 HANDLE Token;
457 HANDLE Thread;
458 } PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
459
460 #define PROCESS_EXCEPTION_PORT_ALL_STATE_BITS 0x00000003UL
461 #define PROCESS_EXCEPTION_PORT_ALL_STATE_FLAGS ((ULONG_PTR)((1UL << PROCESS_EXCEPTION_PORT_ALL_STATE_BITS) - 1))
462
463 typedef struct _PROCESS_EXCEPTION_PORT {
464 IN HANDLE ExceptionPortHandle;
465 IN OUT ULONG StateFlags;
466 } PROCESS_EXCEPTION_PORT, *PPROCESS_EXCEPTION_PORT;
467
468 typedef struct _KERNEL_USER_TIMES {
469 LARGE_INTEGER CreateTime;
470 LARGE_INTEGER ExitTime;
471 LARGE_INTEGER KernelTime;
472 LARGE_INTEGER UserTime;
473 } KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;
474
475 /* NtXxx Functions */
476
477 NTSYSCALLAPI
478 NTSTATUS
479 NTAPI
480 NtOpenProcess(
481 OUT PHANDLE ProcessHandle,
482 IN ACCESS_MASK DesiredAccess,
483 IN POBJECT_ATTRIBUTES ObjectAttributes,
484 IN PCLIENT_ID ClientId OPTIONAL);
485
486 NTSYSCALLAPI
487 NTSTATUS
488 NTAPI
489 NtQueryInformationProcess(
490 IN HANDLE ProcessHandle,
491 IN PROCESSINFOCLASS ProcessInformationClass,
492 OUT PVOID ProcessInformation OPTIONAL,
493 IN ULONG ProcessInformationLength,
494 OUT PULONG ReturnLength OPTIONAL);
495
496 typedef enum _SYSTEM_FIRMWARE_TABLE_ACTION {
497 SystemFirmwareTable_Enumerate,
498 SystemFirmwareTable_Get
499 } SYSTEM_FIRMWARE_TABLE_ACTION;
500
501 typedef struct _SYSTEM_FIRMWARE_TABLE_INFORMATION {
502 ULONG ProviderSignature;
503 SYSTEM_FIRMWARE_TABLE_ACTION Action;
504 ULONG TableID;
505 ULONG TableBufferLength;
506 UCHAR TableBuffer[ANYSIZE_ARRAY];
507 } SYSTEM_FIRMWARE_TABLE_INFORMATION, *PSYSTEM_FIRMWARE_TABLE_INFORMATION;
508
509 typedef NTSTATUS
510 (__cdecl *PFNFTH)(
511 IN OUT PSYSTEM_FIRMWARE_TABLE_INFORMATION SystemFirmwareTableInfo);
512
513 typedef struct _SYSTEM_FIRMWARE_TABLE_HANDLER {
514 ULONG ProviderSignature;
515 BOOLEAN Register;
516 PFNFTH FirmwareTableHandler;
517 PVOID DriverObject;
518 } SYSTEM_FIRMWARE_TABLE_HANDLER, *PSYSTEM_FIRMWARE_TABLE_HANDLER;
519
520 typedef ULONG_PTR
521 (NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)(
522 IN PVOID Context);
523
524 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
525 PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine;
526 PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine;
527 } DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
528
529 #define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
530 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
531 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
532 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
533 #define DRIVER_VERIFIER_IO_CHECKING 0x0010
534
535 #define MAX_WOW64_SHARED_ENTRIES 16
536
537 #define NX_SUPPORT_POLICY_ALWAYSOFF 0
538 #define NX_SUPPORT_POLICY_ALWAYSON 1
539 #define NX_SUPPORT_POLICY_OPTIN 2
540 #define NX_SUPPORT_POLICY_OPTOUT 3
541
542 #define SHARED_GLOBAL_FLAGS_ERROR_PORT_V 0x0
543 #define SHARED_GLOBAL_FLAGS_ERROR_PORT (1UL << SHARED_GLOBAL_FLAGS_ERROR_PORT_V)
544
545 #define SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED_V 0x1
546 #define SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED (1UL << SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED_V)
547
548 #define SHARED_GLOBAL_FLAGS_VIRT_ENABLED_V 0x2
549 #define SHARED_GLOBAL_FLAGS_VIRT_ENABLED (1UL << SHARED_GLOBAL_FLAGS_VIRT_ENABLED_V)
550
551 #define SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED_V 0x3
552 #define SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED \
553 (1UL << SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED_V)
554
555 #define SHARED_GLOBAL_FLAGS_SPARE_V 0x4
556 #define SHARED_GLOBAL_FLAGS_SPARE \
557 (1UL << SHARED_GLOBAL_FLAGS_SPARE_V)
558
559 #define SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED_V 0x5
560 #define SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED \
561 (1UL << SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED_V)
562
563 #define SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED_V 0x6
564 #define SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED \
565 (1UL << SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED_V)
566
567 #define EX_INIT_BITS(Flags, Bit) \
568 *((Flags)) |= (Bit) // Safe to use before concurrently accessible
569
570 #define EX_TEST_SET_BIT(Flags, Bit) \
571 InterlockedBitTestAndSet ((PLONG)(Flags), (Bit))
572
573 #define EX_TEST_CLEAR_BIT(Flags, Bit) \
574 InterlockedBitTestAndReset ((PLONG)(Flags), (Bit))
575
576 typedef struct _KUSER_SHARED_DATA {
577 ULONG TickCountLowDeprecated;
578 ULONG TickCountMultiplier;
579 volatile KSYSTEM_TIME InterruptTime;
580 volatile KSYSTEM_TIME SystemTime;
581 volatile KSYSTEM_TIME TimeZoneBias;
582 USHORT ImageNumberLow;
583 USHORT ImageNumberHigh;
584 WCHAR NtSystemRoot[260];
585 ULONG MaxStackTraceDepth;
586 ULONG CryptoExponent;
587 ULONG TimeZoneId;
588 ULONG LargePageMinimum;
589 ULONG Reserved2[7];
590 NT_PRODUCT_TYPE NtProductType;
591 BOOLEAN ProductTypeIsValid;
592 ULONG NtMajorVersion;
593 ULONG NtMinorVersion;
594 BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX];
595 ULONG Reserved1;
596 ULONG Reserved3;
597 volatile ULONG TimeSlip;
598 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture;
599 ULONG AltArchitecturePad[1];
600 LARGE_INTEGER SystemExpirationDate;
601 ULONG SuiteMask;
602 BOOLEAN KdDebuggerEnabled;
603 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
604 UCHAR NXSupportPolicy;
605 #endif
606 volatile ULONG ActiveConsoleId;
607 volatile ULONG DismountCount;
608 ULONG ComPlusPackage;
609 ULONG LastSystemRITEventTickCount;
610 ULONG NumberOfPhysicalPages;
611 BOOLEAN SafeBootMode;
612 #if (NTDDI_VERSION >= NTDDI_WIN7)
613 union {
614 UCHAR TscQpcData;
615 struct {
616 UCHAR TscQpcEnabled:1;
617 UCHAR TscQpcSpareFlag:1;
618 UCHAR TscQpcShift:6;
619 } DUMMYSTRUCTNAME;
620 } DUMMYUNIONNAME;
621 UCHAR TscQpcPad[2];
622 #endif
623 #if (NTDDI_VERSION >= NTDDI_VISTA)
624 union {
625 ULONG SharedDataFlags;
626 struct {
627 ULONG DbgErrorPortPresent:1;
628 ULONG DbgElevationEnabled:1;
629 ULONG DbgVirtEnabled:1;
630 ULONG DbgInstallerDetectEnabled:1;
631 ULONG DbgSystemDllRelocated:1;
632 ULONG DbgDynProcessorEnabled:1;
633 ULONG DbgSEHValidationEnabled:1;
634 ULONG SpareBits:25;
635 } DUMMYSTRUCTNAME2;
636 } DUMMYUNIONNAME2;
637 #else
638 ULONG TraceLogging;
639 #endif
640 ULONG DataFlagsPad[1];
641 ULONGLONG TestRetInstruction;
642 ULONG SystemCall;
643 ULONG SystemCallReturn;
644 ULONGLONG SystemCallPad[3];
645 _ANONYMOUS_UNION union {
646 volatile KSYSTEM_TIME TickCount;
647 volatile ULONG64 TickCountQuad;
648 _ANONYMOUS_STRUCT struct {
649 ULONG ReservedTickCountOverlay[3];
650 ULONG TickCountPad[1];
651 } DUMMYSTRUCTNAME;
652 } DUMMYUNIONNAME3;
653 ULONG Cookie;
654 ULONG CookiePad[1];
655 #if (NTDDI_VERSION >= NTDDI_WS03)
656 LONGLONG ConsoleSessionForegroundProcessId;
657 ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES];
658 #endif
659 #if (NTDDI_VERSION >= NTDDI_VISTA)
660 #if (NTDDI_VERSION >= NTDDI_WIN7)
661 USHORT UserModeGlobalLogger[16];
662 #else
663 USHORT UserModeGlobalLogger[8];
664 ULONG HeapTracingPid[2];
665 ULONG CritSecTracingPid[2];
666 #endif
667 ULONG ImageFileExecutionOptions;
668 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
669 ULONG LangGenerationCount;
670 #else
671 /* 4 bytes padding */
672 #endif
673 ULONGLONG Reserved5;
674 volatile ULONG64 InterruptTimeBias;
675 #endif
676 #if (NTDDI_VERSION >= NTDDI_WIN7)
677 volatile ULONG64 TscQpcBias;
678 volatile ULONG ActiveProcessorCount;
679 volatile USHORT ActiveGroupCount;
680 USHORT Reserved4;
681 volatile ULONG AitSamplingValue;
682 volatile ULONG AppCompatFlag;
683 ULONGLONG SystemDllNativeRelocation;
684 ULONG SystemDllWowRelocation;
685 ULONG XStatePad[1];
686 XSTATE_CONFIGURATION XState;
687 #endif
688 } KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;
689
690 #define CmResourceTypeMaximum 8
691
692 typedef struct _CM_PCCARD_DEVICE_DATA {
693 UCHAR Flags;
694 UCHAR ErrorCode;
695 USHORT Reserved;
696 ULONG BusData;
697 ULONG DeviceId;
698 ULONG LegacyBaseAddress;
699 UCHAR IRQMap[16];
700 } CM_PCCARD_DEVICE_DATA, *PCM_PCCARD_DEVICE_DATA;
701
702 #define PCCARD_MAP_ERROR 0x01
703 #define PCCARD_DEVICE_PCI 0x10
704
705 #define PCCARD_SCAN_DISABLED 0x01
706 #define PCCARD_MAP_ZERO 0x02
707 #define PCCARD_NO_TIMER 0x03
708 #define PCCARD_NO_PIC 0x04
709 #define PCCARD_NO_LEGACY_BASE 0x05
710 #define PCCARD_DUP_LEGACY_BASE 0x06
711 #define PCCARD_NO_CONTROLLERS 0x07
712
713 #if defined(_X86_) || defined(_AMD64_)
714 #define PAUSE_PROCESSOR YieldProcessor();
715 #elif defined(_IA64_)
716 #define PAUSE_PROCESSOR __yield();
717 #endif
718
719 #define MAXIMUM_EXPANSION_SIZE (KERNEL_LARGE_STACK_SIZE - (PAGE_SIZE / 2))
720
721 /* Filesystem runtime library routines */
722
723 #if (NTDDI_VERSION >= NTDDI_WIN2K)
724 NTKERNELAPI
725 BOOLEAN
726 NTAPI
727 FsRtlIsTotalDeviceFailure(
728 IN NTSTATUS Status);
729 #endif
730
731 /* FIXME : These definitions below doesn't belong to NTDDK */
732
733 #ifdef _X86_
734
735 extern NTKERNELAPI PVOID MmHighestUserAddress;
736 extern NTKERNELAPI PVOID MmSystemRangeStart;
737 extern NTKERNELAPI ULONG MmUserProbeAddress;
738
739 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
740 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
741 #if defined(_LOCAL_COPY_USER_PROBE_ADDRESS_)
742 #define MM_USER_PROBE_ADDRESS _LOCAL_COPY_USER_PROBE_ADDRESS_
743 extern ULONG _LOCAL_COPY_USER_PROBE_ADDRESS_;
744 #else
745 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
746 #endif
747 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
748 #define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
749 #define MM_SYSTEM_SPACE_END 0xFFFFFFFF
750 #if !defined (_X86PAE_)
751 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000
752 #else
753 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
754 #endif
755
756 #define KeGetPcr() PCR
757
758 #define PCR_MINOR_VERSION 1
759 #define PCR_MAJOR_VERSION 1
760
761 typedef struct _KPCR {
762 union {
763 NT_TIB NtTib;
764 struct {
765 struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
766 PVOID Used_StackBase;
767 PVOID Spare2;
768 PVOID TssCopy;
769 ULONG ContextSwitches;
770 KAFFINITY SetMemberCopy;
771 PVOID Used_Self;
772 };
773 };
774 struct _KPCR *SelfPcr;
775 struct _KPRCB *Prcb;
776 KIRQL Irql;
777 ULONG IRR;
778 ULONG IrrActive;
779 ULONG IDR;
780 PVOID KdVersionBlock;
781 struct _KIDTENTRY *IDT;
782 struct _KGDTENTRY *GDT;
783 struct _KTSS *TSS;
784 USHORT MajorVersion;
785 USHORT MinorVersion;
786 KAFFINITY SetMember;
787 ULONG StallScaleFactor;
788 UCHAR SpareUnused;
789 UCHAR Number;
790 UCHAR Spare0;
791 UCHAR SecondLevelCacheAssociativity;
792 ULONG VdmAlert;
793 ULONG KernelReserved[14];
794 ULONG SecondLevelCacheSize;
795 ULONG HalReserved[16];
796 } KPCR, *PKPCR;
797
798 FORCEINLINE
799 ULONG
800 KeGetCurrentProcessorNumber(VOID)
801 {
802 return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
803 }
804
805 typedef enum _INTERLOCKED_RESULT {
806 ResultNegative = RESULT_NEGATIVE,
807 ResultZero = RESULT_ZERO,
808 ResultPositive = RESULT_POSITIVE
809 } INTERLOCKED_RESULT;
810
811 NTKERNELAPI
812 INTERLOCKED_RESULT
813 FASTCALL
814 Exfi386InterlockedIncrementLong(
815 IN OUT LONG volatile *Addend);
816
817 NTKERNELAPI
818 INTERLOCKED_RESULT
819 FASTCALL
820 Exfi386InterlockedDecrementLong(
821 IN PLONG Addend);
822
823 NTKERNELAPI
824 ULONG
825 FASTCALL
826 Exfi386InterlockedExchangeUlong(
827 IN PULONG Target,
828 IN ULONG Value);
829
830 #endif /* _X86_ */
831
832 #ifdef _AMD64_
833
834 #define PTI_SHIFT 12L
835 #define PDI_SHIFT 21L
836 #define PPI_SHIFT 30L
837 #define PXI_SHIFT 39L
838 #define PTE_PER_PAGE 512
839 #define PDE_PER_PAGE 512
840 #define PPE_PER_PAGE 512
841 #define PXE_PER_PAGE 512
842 #define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
843 #define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
844 #define PPI_MASK (PPE_PER_PAGE - 1)
845 #define PXI_MASK (PXE_PER_PAGE - 1)
846
847 #define PXE_BASE 0xFFFFF6FB7DBED000ULL
848 #define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL
849 #define PPE_BASE 0xFFFFF6FB7DA00000ULL
850 #define PDE_BASE 0xFFFFF6FB40000000ULL
851 #define PTE_BASE 0xFFFFF68000000000ULL
852 #define PXE_TOP 0xFFFFF6FB7DBEDFFFULL
853 #define PPE_TOP 0xFFFFF6FB7DBFFFFFULL
854 #define PDE_TOP 0xFFFFF6FB7FFFFFFFULL
855 #define PTE_TOP 0xFFFFF6FFFFFFFFFFULL
856
857 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
858 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
859 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
860 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
861 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL
862 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
863
864 typedef struct _KPCR
865 {
866 _ANONYMOUS_UNION union
867 {
868 NT_TIB NtTib;
869 _ANONYMOUS_STRUCT struct
870 {
871 union _KGDTENTRY64 *GdtBase;
872 struct _KTSS64 *TssBase;
873 ULONG64 UserRsp;
874 struct _KPCR *Self;
875 struct _KPRCB *CurrentPrcb;
876 PKSPIN_LOCK_QUEUE LockArray;
877 PVOID Used_Self;
878 };
879 };
880 union _KIDTENTRY64 *IdtBase;
881 ULONG64 Unused[2];
882 KIRQL Irql;
883 UCHAR SecondLevelCacheAssociativity;
884 UCHAR ObsoleteNumber;
885 UCHAR Fill0;
886 ULONG Unused0[3];
887 USHORT MajorVersion;
888 USHORT MinorVersion;
889 ULONG StallScaleFactor;
890 PVOID Unused1[3];
891 ULONG KernelReserved[15];
892 ULONG SecondLevelCacheSize;
893 ULONG HalReserved[16];
894 ULONG Unused2;
895 PVOID KdVersionBlock;
896 PVOID Unused3;
897 ULONG PcrAlign1[24];
898 } KPCR, *PKPCR;
899
900 FORCEINLINE
901 PKPCR
902 KeGetPcr(VOID)
903 {
904 return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
905 }
906
907 FORCEINLINE
908 ULONG
909 KeGetCurrentProcessorNumber(VOID)
910 {
911 return (ULONG)__readgsword(0x184);
912 }
913
914 #endif /* _AMD64_ */
915
916 #ifdef __cplusplus
917 }
918 #endif