[NTDDK]
[reactos.git] / include / ddk / ntddk.h
1 /*
2 * ntddk.h
3 *
4 * Windows Device Driver Kit
5 *
6 * This file is part of the w32api package.
7 *
8 * Contributors:
9 * Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
10 *
11 * THIS SOFTWARE IS NOT COPYRIGHTED
12 *
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
15 *
16 * This code is distributed in the hope that it will be useful but
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18 * DISCLAIMED. This includes but is not limited to warranties of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20 *
21 * DEFINES:
22 * DBG - Debugging enabled/disabled (0/1)
23 * POOL_TAGGING - Enable pool tagging
24 * _X86_ - X86 environment
25 */
26
27 #pragma once
28
29 #define _NTDDK_
30
31 #if !defined(_NTHAL_) && !defined(_NTIFS_)
32 #define _NTDDK_INCLUDED_
33 #define _DDK_DRIVER_
34 #endif
35
36 /* Dependencies */
37
38 #define NT_INCLUDED
39 #define _CTYPE_DISABLE_MACROS
40
41 #include <wdm.h>
42 #include <excpt.h>
43 #include <ntdef.h>
44 #include <ntstatus.h>
45
46 /* FIXME
47 #include <bugcodes.h>
48 #include <ntiologc.h>
49 */
50
51 #include <stdarg.h> // FIXME
52 #include <basetyps.h> // FIXME
53
54
55 #ifdef __cplusplus
56 extern "C" {
57 #endif
58
59 struct _LOADER_PARAMETER_BLOCK;
60 struct _CREATE_DISK;
61 struct _DRIVE_LAYOUT_INFORMATION_EX;
62 struct _SET_PARTITION_INFORMATION_EX;
63
64 typedef struct _BUS_HANDLER *PBUS_HANDLER;
65 typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT;
66 #if defined(_NTHAL_INCLUDED_)
67 typedef struct _KAFFINITY_EX *PKAFFINITY_EX;
68 #endif
69 typedef struct _PEB *PPEB;
70
71 #ifndef _NTIMAGE_
72
73 typedef struct _IMAGE_NT_HEADERS *PIMAGE_NT_HEADERS32;
74 typedef struct _IMAGE_NT_HEADERS64 *PIMAGE_NT_HEADERS64;
75
76 #ifdef _WIN64
77 typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS;
78 #else
79 typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS;
80 #endif
81
82 #endif /* _NTIMAGE_ */
83
84 #define PsGetCurrentProcess IoGetCurrentProcess
85
86 #if (NTDDI_VERSION >= NTDDI_VISTA)
87 extern NTSYSAPI volatile CCHAR KeNumberProcessors;
88 #elif (NTDDI_VERSION >= NTDDI_WINXP)
89 extern NTSYSAPI CCHAR KeNumberProcessors;
90 #else
91 extern PCCHAR KeNumberProcessors;
92 #endif
93
94 #include <mce.h>
95
96 #ifdef _X86_
97
98 #define KERNEL_STACK_SIZE 12288
99 #define KERNEL_LARGE_STACK_SIZE 61440
100 #define KERNEL_LARGE_STACK_COMMIT 12288
101
102 #define SIZE_OF_80387_REGISTERS 80
103
104 #if !defined(RC_INVOKED)
105
106 #define CONTEXT_i386 0x10000
107 #define CONTEXT_i486 0x10000
108 #define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
109 #define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
110 #define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
111 #define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
112 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
113 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
114
115 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
116 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | \
117 CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | \
118 CONTEXT_EXTENDED_REGISTERS)
119
120 #define CONTEXT_XSTATE (CONTEXT_i386 | 0x00000040L)
121
122 #endif /* !defined(RC_INVOKED) */
123
124 typedef struct _FLOATING_SAVE_AREA {
125 ULONG ControlWord;
126 ULONG StatusWord;
127 ULONG TagWord;
128 ULONG ErrorOffset;
129 ULONG ErrorSelector;
130 ULONG DataOffset;
131 ULONG DataSelector;
132 UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
133 ULONG Cr0NpxState;
134 } FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
135
136 #include "pshpack4.h"
137 typedef struct _CONTEXT {
138 ULONG ContextFlags;
139 ULONG Dr0;
140 ULONG Dr1;
141 ULONG Dr2;
142 ULONG Dr3;
143 ULONG Dr6;
144 ULONG Dr7;
145 FLOATING_SAVE_AREA FloatSave;
146 ULONG SegGs;
147 ULONG SegFs;
148 ULONG SegEs;
149 ULONG SegDs;
150 ULONG Edi;
151 ULONG Esi;
152 ULONG Ebx;
153 ULONG Edx;
154 ULONG Ecx;
155 ULONG Eax;
156 ULONG Ebp;
157 ULONG Eip;
158 ULONG SegCs;
159 ULONG EFlags;
160 ULONG Esp;
161 ULONG SegSs;
162 UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
163 } CONTEXT;
164 #include "poppack.h"
165
166 #endif /* _X86_ */
167
168 #ifdef _AMD64_
169
170 #define KERNEL_STACK_SIZE 0x6000
171 #define KERNEL_LARGE_STACK_SIZE 0x12000
172 #define KERNEL_LARGE_STACK_COMMIT KERNEL_STACK_SIZE
173
174 #define KERNEL_MCA_EXCEPTION_STACK_SIZE 0x2000
175
176 #define EXCEPTION_READ_FAULT 0
177 #define EXCEPTION_WRITE_FAULT 1
178 #define EXCEPTION_EXECUTE_FAULT 8
179
180 #if !defined(RC_INVOKED)
181
182 #define CONTEXT_AMD64 0x100000
183
184 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
185 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
186 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
187 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
188 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
189
190 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
191 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
192
193 #define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L)
194
195 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
196 #define CONTEXT_SERVICE_ACTIVE 0x10000000
197 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
198 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
199
200 #endif /* !defined(RC_INVOKED) */
201
202 #define INITIAL_MXCSR 0x1f80
203 #define INITIAL_FPCSR 0x027f
204
205 typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
206 ULONG64 P1Home;
207 ULONG64 P2Home;
208 ULONG64 P3Home;
209 ULONG64 P4Home;
210 ULONG64 P5Home;
211 ULONG64 P6Home;
212 ULONG ContextFlags;
213 ULONG MxCsr;
214 USHORT SegCs;
215 USHORT SegDs;
216 USHORT SegEs;
217 USHORT SegFs;
218 USHORT SegGs;
219 USHORT SegSs;
220 ULONG EFlags;
221 ULONG64 Dr0;
222 ULONG64 Dr1;
223 ULONG64 Dr2;
224 ULONG64 Dr3;
225 ULONG64 Dr6;
226 ULONG64 Dr7;
227 ULONG64 Rax;
228 ULONG64 Rcx;
229 ULONG64 Rdx;
230 ULONG64 Rbx;
231 ULONG64 Rsp;
232 ULONG64 Rbp;
233 ULONG64 Rsi;
234 ULONG64 Rdi;
235 ULONG64 R8;
236 ULONG64 R9;
237 ULONG64 R10;
238 ULONG64 R11;
239 ULONG64 R12;
240 ULONG64 R13;
241 ULONG64 R14;
242 ULONG64 R15;
243 ULONG64 Rip;
244 union {
245 XMM_SAVE_AREA32 FltSave;
246 struct {
247 M128A Header[2];
248 M128A Legacy[8];
249 M128A Xmm0;
250 M128A Xmm1;
251 M128A Xmm2;
252 M128A Xmm3;
253 M128A Xmm4;
254 M128A Xmm5;
255 M128A Xmm6;
256 M128A Xmm7;
257 M128A Xmm8;
258 M128A Xmm9;
259 M128A Xmm10;
260 M128A Xmm11;
261 M128A Xmm12;
262 M128A Xmm13;
263 M128A Xmm14;
264 M128A Xmm15;
265 } DUMMYSTRUCTNAME;
266 } DUMMYUNIONNAME;
267 M128A VectorRegister[26];
268 ULONG64 VectorControl;
269 ULONG64 DebugControl;
270 ULONG64 LastBranchToRip;
271 ULONG64 LastBranchFromRip;
272 ULONG64 LastExceptionToRip;
273 ULONG64 LastExceptionFromRip;
274 } CONTEXT;
275
276 #endif /* _AMD64_ */
277
278 typedef enum _WELL_KNOWN_SID_TYPE {
279 WinNullSid = 0,
280 WinWorldSid = 1,
281 WinLocalSid = 2,
282 WinCreatorOwnerSid = 3,
283 WinCreatorGroupSid = 4,
284 WinCreatorOwnerServerSid = 5,
285 WinCreatorGroupServerSid = 6,
286 WinNtAuthoritySid = 7,
287 WinDialupSid = 8,
288 WinNetworkSid = 9,
289 WinBatchSid = 10,
290 WinInteractiveSid = 11,
291 WinServiceSid = 12,
292 WinAnonymousSid = 13,
293 WinProxySid = 14,
294 WinEnterpriseControllersSid = 15,
295 WinSelfSid = 16,
296 WinAuthenticatedUserSid = 17,
297 WinRestrictedCodeSid = 18,
298 WinTerminalServerSid = 19,
299 WinRemoteLogonIdSid = 20,
300 WinLogonIdsSid = 21,
301 WinLocalSystemSid = 22,
302 WinLocalServiceSid = 23,
303 WinNetworkServiceSid = 24,
304 WinBuiltinDomainSid = 25,
305 WinBuiltinAdministratorsSid = 26,
306 WinBuiltinUsersSid = 27,
307 WinBuiltinGuestsSid = 28,
308 WinBuiltinPowerUsersSid = 29,
309 WinBuiltinAccountOperatorsSid = 30,
310 WinBuiltinSystemOperatorsSid = 31,
311 WinBuiltinPrintOperatorsSid = 32,
312 WinBuiltinBackupOperatorsSid = 33,
313 WinBuiltinReplicatorSid = 34,
314 WinBuiltinPreWindows2000CompatibleAccessSid = 35,
315 WinBuiltinRemoteDesktopUsersSid = 36,
316 WinBuiltinNetworkConfigurationOperatorsSid = 37,
317 WinAccountAdministratorSid = 38,
318 WinAccountGuestSid = 39,
319 WinAccountKrbtgtSid = 40,
320 WinAccountDomainAdminsSid = 41,
321 WinAccountDomainUsersSid = 42,
322 WinAccountDomainGuestsSid = 43,
323 WinAccountComputersSid = 44,
324 WinAccountControllersSid = 45,
325 WinAccountCertAdminsSid = 46,
326 WinAccountSchemaAdminsSid = 47,
327 WinAccountEnterpriseAdminsSid = 48,
328 WinAccountPolicyAdminsSid = 49,
329 WinAccountRasAndIasServersSid = 50,
330 WinNTLMAuthenticationSid = 51,
331 WinDigestAuthenticationSid = 52,
332 WinSChannelAuthenticationSid = 53,
333 WinThisOrganizationSid = 54,
334 WinOtherOrganizationSid = 55,
335 WinBuiltinIncomingForestTrustBuildersSid = 56,
336 WinBuiltinPerfMonitoringUsersSid = 57,
337 WinBuiltinPerfLoggingUsersSid = 58,
338 WinBuiltinAuthorizationAccessSid = 59,
339 WinBuiltinTerminalServerLicenseServersSid = 60,
340 WinBuiltinDCOMUsersSid = 61,
341 WinBuiltinIUsersSid = 62,
342 WinIUserSid = 63,
343 WinBuiltinCryptoOperatorsSid = 64,
344 WinUntrustedLabelSid = 65,
345 WinLowLabelSid = 66,
346 WinMediumLabelSid = 67,
347 WinHighLabelSid = 68,
348 WinSystemLabelSid = 69,
349 WinWriteRestrictedCodeSid = 70,
350 WinCreatorOwnerRightsSid = 71,
351 WinCacheablePrincipalsGroupSid = 72,
352 WinNonCacheablePrincipalsGroupSid = 73,
353 WinEnterpriseReadonlyControllersSid = 74,
354 WinAccountReadonlyControllersSid = 75,
355 WinBuiltinEventLogReadersGroup = 76,
356 WinNewEnterpriseReadonlyControllersSid = 77,
357 WinBuiltinCertSvcDComAccessGroup = 78,
358 WinMediumPlusLabelSid = 79,
359 WinLocalLogonSid = 80,
360 WinConsoleLogonSid = 81,
361 WinThisOrganizationCertificateSid = 82,
362 } WELL_KNOWN_SID_TYPE;
363
364 #define SE_UNSOLICITED_INPUT_PRIVILEGE 6
365
366 #ifndef _RTL_RUN_ONCE_DEF
367 #define _RTL_RUN_ONCE_DEF
368
369 #define RTL_RUN_ONCE_INIT {0}
370
371 #define RTL_RUN_ONCE_CHECK_ONLY 0x00000001UL
372 #define RTL_RUN_ONCE_ASYNC 0x00000002UL
373 #define RTL_RUN_ONCE_INIT_FAILED 0x00000004UL
374
375 #define RTL_RUN_ONCE_CTX_RESERVED_BITS 2
376
377 #define RTL_HASH_ALLOCATED_HEADER 0x00000001
378
379 #define RTL_HASH_RESERVED_SIGNATURE 0
380
381 /* RtlVerifyVersionInfo() ComparisonType */
382
383 #define VER_EQUAL 1
384 #define VER_GREATER 2
385 #define VER_GREATER_EQUAL 3
386 #define VER_LESS 4
387 #define VER_LESS_EQUAL 5
388 #define VER_AND 6
389 #define VER_OR 7
390
391 #define VER_CONDITION_MASK 7
392 #define VER_NUM_BITS_PER_CONDITION_MASK 3
393
394 /* RtlVerifyVersionInfo() TypeMask */
395
396 #define VER_MINORVERSION 0x0000001
397 #define VER_MAJORVERSION 0x0000002
398 #define VER_BUILDNUMBER 0x0000004
399 #define VER_PLATFORMID 0x0000008
400 #define VER_SERVICEPACKMINOR 0x0000010
401 #define VER_SERVICEPACKMAJOR 0x0000020
402 #define VER_SUITENAME 0x0000040
403 #define VER_PRODUCT_TYPE 0x0000080
404
405 #define VER_NT_WORKSTATION 0x0000001
406 #define VER_NT_DOMAIN_CONTROLLER 0x0000002
407 #define VER_NT_SERVER 0x0000003
408
409 #define VER_PLATFORM_WIN32s 0
410 #define VER_PLATFORM_WIN32_WINDOWS 1
411 #define VER_PLATFORM_WIN32_NT 2
412
413 typedef union _RTL_RUN_ONCE {
414 PVOID Ptr;
415 } RTL_RUN_ONCE, *PRTL_RUN_ONCE;
416
417 typedef ULONG /* LOGICAL */
418 (NTAPI *PRTL_RUN_ONCE_INIT_FN) (
419 IN OUT PRTL_RUN_ONCE RunOnce,
420 IN OUT PVOID Parameter OPTIONAL,
421 IN OUT PVOID *Context OPTIONAL);
422
423 #endif /* _RTL_RUN_ONCE_DEF */
424
425 typedef enum _TABLE_SEARCH_RESULT {
426 TableEmptyTree,
427 TableFoundNode,
428 TableInsertAsLeft,
429 TableInsertAsRight
430 } TABLE_SEARCH_RESULT;
431
432 typedef enum _RTL_GENERIC_COMPARE_RESULTS {
433 GenericLessThan,
434 GenericGreaterThan,
435 GenericEqual
436 } RTL_GENERIC_COMPARE_RESULTS;
437
438 // Forwarder
439 struct _RTL_AVL_TABLE;
440
441 typedef RTL_GENERIC_COMPARE_RESULTS
442 (NTAPI *PRTL_AVL_COMPARE_ROUTINE) (
443 IN struct _RTL_AVL_TABLE *Table,
444 IN PVOID FirstStruct,
445 IN PVOID SecondStruct);
446
447 typedef PVOID
448 (NTAPI *PRTL_AVL_ALLOCATE_ROUTINE) (
449 IN struct _RTL_AVL_TABLE *Table,
450 IN CLONG ByteSize);
451
452 typedef VOID
453 (NTAPI *PRTL_AVL_FREE_ROUTINE) (
454 IN struct _RTL_AVL_TABLE *Table,
455 IN PVOID Buffer);
456
457 typedef NTSTATUS
458 (NTAPI *PRTL_AVL_MATCH_FUNCTION) (
459 IN struct _RTL_AVL_TABLE *Table,
460 IN PVOID UserData,
461 IN PVOID MatchData);
462
463 typedef struct _RTL_BALANCED_LINKS {
464 struct _RTL_BALANCED_LINKS *Parent;
465 struct _RTL_BALANCED_LINKS *LeftChild;
466 struct _RTL_BALANCED_LINKS *RightChild;
467 CHAR Balance;
468 UCHAR Reserved[3];
469 } RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS;
470
471 typedef struct _RTL_AVL_TABLE {
472 RTL_BALANCED_LINKS BalancedRoot;
473 PVOID OrderedPointer;
474 ULONG WhichOrderedElement;
475 ULONG NumberGenericTableElements;
476 ULONG DepthOfTree;
477 PRTL_BALANCED_LINKS RestartKey;
478 ULONG DeleteCount;
479 PRTL_AVL_COMPARE_ROUTINE CompareRoutine;
480 PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine;
481 PRTL_AVL_FREE_ROUTINE FreeRoutine;
482 PVOID TableContext;
483 } RTL_AVL_TABLE, *PRTL_AVL_TABLE;
484
485 #ifndef RTL_USE_AVL_TABLES
486
487 struct _RTL_GENERIC_TABLE;
488
489 typedef RTL_GENERIC_COMPARE_RESULTS
490 (NTAPI *PRTL_GENERIC_COMPARE_ROUTINE) (
491 IN struct _RTL_GENERIC_TABLE *Table,
492 IN PVOID FirstStruct,
493 IN PVOID SecondStruct);
494
495 typedef PVOID
496 (NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) (
497 IN struct _RTL_GENERIC_TABLE *Table,
498 IN CLONG ByteSize);
499
500 typedef VOID
501 (NTAPI *PRTL_GENERIC_FREE_ROUTINE) (
502 IN struct _RTL_GENERIC_TABLE *Table,
503 IN PVOID Buffer);
504
505 typedef struct _RTL_SPLAY_LINKS {
506 struct _RTL_SPLAY_LINKS *Parent;
507 struct _RTL_SPLAY_LINKS *LeftChild;
508 struct _RTL_SPLAY_LINKS *RightChild;
509 } RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS;
510
511 typedef struct _RTL_GENERIC_TABLE {
512 PRTL_SPLAY_LINKS TableRoot;
513 LIST_ENTRY InsertOrderList;
514 PLIST_ENTRY OrderedPointer;
515 ULONG WhichOrderedElement;
516 ULONG NumberGenericTableElements;
517 PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine;
518 PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine;
519 PRTL_GENERIC_FREE_ROUTINE FreeRoutine;
520 PVOID TableContext;
521 } RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE;
522
523 #if (NTDDI_VERSION >= NTDDI_WIN2K)
524
525 NTSYSAPI
526 VOID
527 NTAPI
528 RtlInitializeGenericTable(
529 OUT PRTL_GENERIC_TABLE Table,
530 IN PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine,
531 IN PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine,
532 IN PRTL_GENERIC_FREE_ROUTINE FreeRoutine,
533 IN PVOID TableContext OPTIONAL);
534
535 NTSYSAPI
536 PVOID
537 NTAPI
538 RtlInsertElementGenericTable(
539 IN PRTL_GENERIC_TABLE Table,
540 IN PVOID Buffer,
541 IN CLONG BufferSize,
542 OUT PBOOLEAN NewElement OPTIONAL);
543
544 NTSYSAPI
545 PVOID
546 NTAPI
547 RtlInsertElementGenericTableFull(
548 IN PRTL_GENERIC_TABLE Table,
549 IN PVOID Buffer,
550 IN CLONG BufferSize,
551 OUT PBOOLEAN NewElement OPTIONAL,
552 IN PVOID NodeOrParent,
553 IN TABLE_SEARCH_RESULT SearchResult);
554
555 NTSYSAPI
556 BOOLEAN
557 NTAPI
558 RtlDeleteElementGenericTable(
559 IN PRTL_GENERIC_TABLE Table,
560 IN PVOID Buffer);
561
562 NTSYSAPI
563 PVOID
564 NTAPI
565 RtlLookupElementGenericTable(
566 IN PRTL_GENERIC_TABLE Table,
567 IN PVOID Buffer);
568
569 NTSYSAPI
570 PVOID
571 NTAPI
572 RtlLookupElementGenericTableFull(
573 IN PRTL_GENERIC_TABLE Table,
574 IN PVOID Buffer,
575 OUT PVOID *NodeOrParent,
576 OUT TABLE_SEARCH_RESULT *SearchResult);
577
578 NTSYSAPI
579 PVOID
580 NTAPI
581 RtlEnumerateGenericTable(
582 IN PRTL_GENERIC_TABLE Table,
583 IN BOOLEAN Restart);
584
585 NTSYSAPI
586 PVOID
587 NTAPI
588 RtlEnumerateGenericTableWithoutSplaying(
589 IN PRTL_GENERIC_TABLE Table,
590 IN OUT PVOID *RestartKey);
591
592 NTSYSAPI
593 PVOID
594 NTAPI
595 RtlGetElementGenericTable(
596 IN PRTL_GENERIC_TABLE Table,
597 IN ULONG I);
598
599 NTSYSAPI
600 ULONG
601 NTAPI
602 RtlNumberGenericTableElements(
603 IN PRTL_GENERIC_TABLE Table);
604
605 NTSYSAPI
606 BOOLEAN
607 NTAPI
608 RtlIsGenericTableEmpty(
609 IN PRTL_GENERIC_TABLE Table);
610
611 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
612
613 #endif /* RTL_USE_AVL_TABLES */
614
615 #ifdef RTL_USE_AVL_TABLES
616
617 #undef PRTL_GENERIC_COMPARE_ROUTINE
618 #undef RTL_GENERIC_COMPARE_ROUTINE
619 #undef PRTL_GENERIC_ALLOCATE_ROUTINE
620 #undef RTL_GENERIC_ALLOCATE_ROUTINE
621 #undef PRTL_GENERIC_FREE_ROUTINE
622 #undef RTL_GENERIC_FREE_ROUTINE
623 #undef RTL_GENERIC_TABLE
624 #undef PRTL_GENERIC_TABLE
625
626 #define PRTL_GENERIC_COMPARE_ROUTINE PRTL_AVL_COMPARE_ROUTINE
627 #define RTL_GENERIC_COMPARE_ROUTINE RTL_AVL_COMPARE_ROUTINE
628 #define PRTL_GENERIC_ALLOCATE_ROUTINE PRTL_AVL_ALLOCATE_ROUTINE
629 #define RTL_GENERIC_ALLOCATE_ROUTINE RTL_AVL_ALLOCATE_ROUTINE
630 #define PRTL_GENERIC_FREE_ROUTINE PRTL_AVL_FREE_ROUTINE
631 #define RTL_GENERIC_FREE_ROUTINE RTL_AVL_FREE_ROUTINE
632 #define RTL_GENERIC_TABLE RTL_AVL_TABLE
633 #define PRTL_GENERIC_TABLE PRTL_AVL_TABLE
634
635 #define RtlInitializeGenericTable RtlInitializeGenericTableAvl
636 #define RtlInsertElementGenericTable RtlInsertElementGenericTableAvl
637 #define RtlInsertElementGenericTableFull RtlInsertElementGenericTableFullAvl
638 #define RtlDeleteElementGenericTable RtlDeleteElementGenericTableAvl
639 #define RtlLookupElementGenericTable RtlLookupElementGenericTableAvl
640 #define RtlLookupElementGenericTableFull RtlLookupElementGenericTableFullAvl
641 #define RtlEnumerateGenericTable RtlEnumerateGenericTableAvl
642 #define RtlEnumerateGenericTableWithoutSplaying RtlEnumerateGenericTableWithoutSplayingAvl
643 #define RtlGetElementGenericTable RtlGetElementGenericTableAvl
644 #define RtlNumberGenericTableElements RtlNumberGenericTableElementsAvl
645 #define RtlIsGenericTableEmpty RtlIsGenericTableEmptyAvl
646
647 #endif /* RTL_USE_AVL_TABLES */
648
649 typedef struct _RTL_DYNAMIC_HASH_TABLE_ENTRY {
650 LIST_ENTRY Linkage;
651 ULONG_PTR Signature;
652 } RTL_DYNAMIC_HASH_TABLE_ENTRY, *PRTL_DYNAMIC_HASH_TABLE_ENTRY;
653
654 typedef struct _RTL_DYNAMIC_HASH_TABLE_CONTEXT {
655 PLIST_ENTRY ChainHead;
656 PLIST_ENTRY PrevLinkage;
657 ULONG_PTR Signature;
658 } RTL_DYNAMIC_HASH_TABLE_CONTEXT, *PRTL_DYNAMIC_HASH_TABLE_CONTEXT;
659
660 typedef struct _RTL_DYNAMIC_HASH_TABLE_ENUMERATOR {
661 RTL_DYNAMIC_HASH_TABLE_ENTRY HashEntry;
662 PLIST_ENTRY ChainHead;
663 ULONG BucketIndex;
664 } RTL_DYNAMIC_HASH_TABLE_ENUMERATOR, *PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR;
665
666 typedef struct _RTL_DYNAMIC_HASH_TABLE {
667 ULONG Flags;
668 ULONG Shift;
669 ULONG TableSize;
670 ULONG Pivot;
671 ULONG DivisorMask;
672 ULONG NumEntries;
673 ULONG NonEmptyBuckets;
674 ULONG NumEnumerators;
675 PVOID Directory;
676 } RTL_DYNAMIC_HASH_TABLE, *PRTL_DYNAMIC_HASH_TABLE;
677
678 typedef struct _OSVERSIONINFOA {
679 ULONG dwOSVersionInfoSize;
680 ULONG dwMajorVersion;
681 ULONG dwMinorVersion;
682 ULONG dwBuildNumber;
683 ULONG dwPlatformId;
684 CHAR szCSDVersion[128];
685 } OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
686
687 typedef struct _OSVERSIONINFOW {
688 ULONG dwOSVersionInfoSize;
689 ULONG dwMajorVersion;
690 ULONG dwMinorVersion;
691 ULONG dwBuildNumber;
692 ULONG dwPlatformId;
693 WCHAR szCSDVersion[128];
694 } OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
695
696 typedef struct _OSVERSIONINFOEXA {
697 ULONG dwOSVersionInfoSize;
698 ULONG dwMajorVersion;
699 ULONG dwMinorVersion;
700 ULONG dwBuildNumber;
701 ULONG dwPlatformId;
702 CHAR szCSDVersion[128];
703 USHORT wServicePackMajor;
704 USHORT wServicePackMinor;
705 USHORT wSuiteMask;
706 UCHAR wProductType;
707 UCHAR wReserved;
708 } OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
709
710 typedef struct _OSVERSIONINFOEXW {
711 ULONG dwOSVersionInfoSize;
712 ULONG dwMajorVersion;
713 ULONG dwMinorVersion;
714 ULONG dwBuildNumber;
715 ULONG dwPlatformId;
716 WCHAR szCSDVersion[128];
717 USHORT wServicePackMajor;
718 USHORT wServicePackMinor;
719 USHORT wSuiteMask;
720 UCHAR wProductType;
721 UCHAR wReserved;
722 } OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
723
724 #ifdef UNICODE
725 typedef OSVERSIONINFOEXW OSVERSIONINFOEX;
726 typedef POSVERSIONINFOEXW POSVERSIONINFOEX;
727 typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;
728 typedef OSVERSIONINFOW OSVERSIONINFO;
729 typedef POSVERSIONINFOW POSVERSIONINFO;
730 typedef LPOSVERSIONINFOW LPOSVERSIONINFO;
731 #else
732 typedef OSVERSIONINFOEXA OSVERSIONINFOEX;
733 typedef POSVERSIONINFOEXA POSVERSIONINFOEX;
734 typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX;
735 typedef OSVERSIONINFOA OSVERSIONINFO;
736 typedef POSVERSIONINFOA POSVERSIONINFO;
737 typedef LPOSVERSIONINFOA LPOSVERSIONINFO;
738 #endif /* UNICODE */
739
740 #define HASH_ENTRY_KEY(x) ((x)->Signature)
741
742 #define RtlInitializeSplayLinks(Links) { \
743 PRTL_SPLAY_LINKS _SplayLinks; \
744 _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \
745 _SplayLinks->Parent = _SplayLinks; \
746 _SplayLinks->LeftChild = NULL; \
747 _SplayLinks->RightChild = NULL; \
748 }
749
750 #define RtlIsLeftChild(Links) \
751 (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
752
753 #define RtlIsRightChild(Links) \
754 (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
755
756 #define RtlRightChild(Links) \
757 ((PRTL_SPLAY_LINKS)(Links))->RightChild
758
759 #define RtlIsRoot(Links) \
760 (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links))
761
762 #define RtlLeftChild(Links) \
763 ((PRTL_SPLAY_LINKS)(Links))->LeftChild
764
765 #define RtlParent(Links) \
766 ((PRTL_SPLAY_LINKS)(Links))->Parent
767
768 #define RtlInsertAsLeftChild(ParentLinks,ChildLinks) \
769 { \
770 PRTL_SPLAY_LINKS _SplayParent; \
771 PRTL_SPLAY_LINKS _SplayChild; \
772 _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
773 _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
774 _SplayParent->LeftChild = _SplayChild; \
775 _SplayChild->Parent = _SplayParent; \
776 }
777
778 #define RtlInsertAsRightChild(ParentLinks,ChildLinks) \
779 { \
780 PRTL_SPLAY_LINKS _SplayParent; \
781 PRTL_SPLAY_LINKS _SplayChild; \
782 _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
783 _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
784 _SplayParent->RightChild = _SplayChild; \
785 _SplayChild->Parent = _SplayParent; \
786 }
787
788 #if !defined(MIDL_PASS)
789
790 FORCEINLINE
791 LUID
792 NTAPI_INLINE
793 RtlConvertLongToLuid(
794 IN LONG Val)
795 {
796 LUID Luid;
797 LARGE_INTEGER Temp;
798
799 Temp.QuadPart = Val;
800 Luid.LowPart = Temp.u.LowPart;
801 Luid.HighPart = Temp.u.HighPart;
802 return Luid;
803 }
804
805 FORCEINLINE
806 LUID
807 NTAPI_INLINE
808 RtlConvertUlongToLuid(
809 IN ULONG Val)
810 {
811 LUID Luid;
812
813 Luid.LowPart = Val;
814 Luid.HighPart = 0;
815 return Luid;
816 }
817
818 #endif /* !defined(MIDL_PASS) */
819
820 #if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_)
821 #define RtlGetCallersAddress(CallersAddress, CallersCaller) \
822 *CallersAddress = (PVOID)_ReturnAddress(); \
823 *CallersCaller = NULL;
824 #else
825 #if (NTDDI_VERSION >= NTDDI_WIN2K)
826 NTSYSAPI
827 VOID
828 NTAPI
829 RtlGetCallersAddress(
830 OUT PVOID *CallersAddress,
831 OUT PVOID *CallersCaller);
832 #endif
833 #endif
834
835 #if (NTDDI_VERSION >= NTDDI_WIN2K)
836
837 #define RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT 8
838
839 NTSYSAPI
840 PRTL_SPLAY_LINKS
841 NTAPI
842 RtlSplay(
843 IN OUT PRTL_SPLAY_LINKS Links);
844
845 NTSYSAPI
846 PRTL_SPLAY_LINKS
847 NTAPI
848 RtlDelete(
849 IN PRTL_SPLAY_LINKS Links);
850
851 NTSYSAPI
852 VOID
853 NTAPI
854 RtlDeleteNoSplay(
855 IN PRTL_SPLAY_LINKS Links,
856 IN OUT PRTL_SPLAY_LINKS *Root);
857
858 NTSYSAPI
859 PRTL_SPLAY_LINKS
860 NTAPI
861 RtlSubtreeSuccessor(
862 IN PRTL_SPLAY_LINKS Links);
863
864 NTSYSAPI
865 PRTL_SPLAY_LINKS
866 NTAPI
867 RtlSubtreePredecessor(
868 IN PRTL_SPLAY_LINKS Links);
869
870 NTSYSAPI
871 PRTL_SPLAY_LINKS
872 NTAPI
873 RtlRealSuccessor(
874 IN PRTL_SPLAY_LINKS Links);
875
876 NTSYSAPI
877 PRTL_SPLAY_LINKS
878 NTAPI
879 RtlRealPredecessor(
880 IN PRTL_SPLAY_LINKS Links);
881
882 NTSYSAPI
883 BOOLEAN
884 NTAPI
885 RtlPrefixUnicodeString(
886 IN PCUNICODE_STRING String1,
887 IN PCUNICODE_STRING String2,
888 IN BOOLEAN CaseInSensitive);
889
890 NTSYSAPI
891 VOID
892 NTAPI
893 RtlUpperString(
894 IN OUT PSTRING DestinationString,
895 IN const PSTRING SourceString);
896
897 NTSYSAPI
898 NTSTATUS
899 NTAPI
900 RtlUpcaseUnicodeString(
901 IN OUT PUNICODE_STRING DestinationString,
902 IN PCUNICODE_STRING SourceString,
903 IN BOOLEAN AllocateDestinationString);
904
905 NTSYSAPI
906 VOID
907 NTAPI
908 RtlMapGenericMask(
909 IN OUT PACCESS_MASK AccessMask,
910 IN PGENERIC_MAPPING GenericMapping);
911
912 NTSYSAPI
913 NTSTATUS
914 NTAPI
915 RtlVolumeDeviceToDosName(
916 IN PVOID VolumeDeviceObject,
917 OUT PUNICODE_STRING DosName);
918
919 NTSYSAPI
920 NTSTATUS
921 NTAPI
922 RtlGetVersion(
923 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
924
925 NTSYSAPI
926 NTSTATUS
927 NTAPI
928 RtlVerifyVersionInfo(
929 IN PRTL_OSVERSIONINFOEXW VersionInfo,
930 IN ULONG TypeMask,
931 IN ULONGLONG ConditionMask);
932
933 NTSYSAPI
934 LONG
935 NTAPI
936 RtlCompareString(
937 IN const PSTRING String1,
938 IN const PSTRING String2,
939 IN BOOLEAN CaseInSensitive);
940
941 NTSYSAPI
942 VOID
943 NTAPI
944 RtlCopyString(
945 OUT PSTRING DestinationString,
946 IN const PSTRING SourceString OPTIONAL);
947
948 NTSYSAPI
949 BOOLEAN
950 NTAPI
951 RtlEqualString(
952 IN const PSTRING String1,
953 IN const PSTRING String2,
954 IN BOOLEAN CaseInSensitive);
955
956 NTSYSAPI
957 NTSTATUS
958 NTAPI
959 RtlCharToInteger(
960 IN PCSZ String,
961 IN ULONG Base OPTIONAL,
962 OUT PULONG Value);
963
964 NTSYSAPI
965 CHAR
966 NTAPI
967 RtlUpperChar(
968 IN CHAR Character);
969
970 NTSYSAPI
971 ULONG
972 NTAPI
973 RtlWalkFrameChain(
974 OUT PVOID *Callers,
975 IN ULONG Count,
976 IN ULONG Flags);
977
978 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
979
980 #if (NTDDI_VERSION >= NTDDI_WINXP)
981
982 NTSYSAPI
983 VOID
984 NTAPI
985 RtlInitializeGenericTableAvl(
986 OUT PRTL_AVL_TABLE Table,
987 IN PRTL_AVL_COMPARE_ROUTINE CompareRoutine,
988 IN PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine,
989 IN PRTL_AVL_FREE_ROUTINE FreeRoutine,
990 IN PVOID TableContext OPTIONAL);
991
992 NTSYSAPI
993 PVOID
994 NTAPI
995 RtlInsertElementGenericTableAvl(
996 IN PRTL_AVL_TABLE Table,
997 IN PVOID Buffer,
998 IN CLONG BufferSize,
999 OUT PBOOLEAN NewElement OPTIONAL);
1000
1001 NTSYSAPI
1002 PVOID
1003 NTAPI
1004 RtlInsertElementGenericTableFullAvl(
1005 IN PRTL_AVL_TABLE Table,
1006 IN PVOID Buffer,
1007 IN CLONG BufferSize,
1008 OUT PBOOLEAN NewElement OPTIONAL,
1009 IN PVOID NodeOrParent,
1010 IN TABLE_SEARCH_RESULT SearchResult);
1011
1012 NTSYSAPI
1013 BOOLEAN
1014 NTAPI
1015 RtlDeleteElementGenericTableAvl(
1016 IN PRTL_AVL_TABLE Table,
1017 IN PVOID Buffer);
1018
1019 NTSYSAPI
1020 PVOID
1021 NTAPI
1022 RtlLookupElementGenericTableAvl(
1023 IN PRTL_AVL_TABLE Table,
1024 IN PVOID Buffer);
1025
1026 NTSYSAPI
1027 PVOID
1028 NTAPI
1029 RtlLookupElementGenericTableFullAvl(
1030 IN PRTL_AVL_TABLE Table,
1031 IN PVOID Buffer,
1032 OUT PVOID *NodeOrParent,
1033 OUT TABLE_SEARCH_RESULT *SearchResult);
1034
1035 NTSYSAPI
1036 PVOID
1037 NTAPI
1038 RtlEnumerateGenericTableAvl(
1039 IN PRTL_AVL_TABLE Table,
1040 IN BOOLEAN Restart);
1041
1042 NTSYSAPI
1043 PVOID
1044 NTAPI
1045 RtlEnumerateGenericTableWithoutSplayingAvl(
1046 IN PRTL_AVL_TABLE Table,
1047 IN OUT PVOID *RestartKey);
1048
1049 NTSYSAPI
1050 PVOID
1051 NTAPI
1052 RtlLookupFirstMatchingElementGenericTableAvl(
1053 IN PRTL_AVL_TABLE Table,
1054 IN PVOID Buffer,
1055 OUT PVOID *RestartKey);
1056
1057 NTSYSAPI
1058 PVOID
1059 NTAPI
1060 RtlEnumerateGenericTableLikeADirectory(
1061 IN PRTL_AVL_TABLE Table,
1062 IN PRTL_AVL_MATCH_FUNCTION MatchFunction OPTIONAL,
1063 IN PVOID MatchData OPTIONAL,
1064 IN ULONG NextFlag,
1065 IN OUT PVOID *RestartKey,
1066 IN OUT PULONG DeleteCount,
1067 IN PVOID Buffer);
1068
1069 NTSYSAPI
1070 PVOID
1071 NTAPI
1072 RtlGetElementGenericTableAvl(
1073 IN PRTL_AVL_TABLE Table,
1074 IN ULONG I);
1075
1076 NTSYSAPI
1077 ULONG
1078 NTAPI
1079 RtlNumberGenericTableElementsAvl(
1080 IN PRTL_AVL_TABLE Table);
1081
1082 NTSYSAPI
1083 BOOLEAN
1084 NTAPI
1085 RtlIsGenericTableEmptyAvl(
1086 IN PRTL_AVL_TABLE Table);
1087
1088
1089 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
1090
1091 #if (NTDDI_VERSION >= NTDDI_VISTA)
1092
1093 NTSYSAPI
1094 VOID
1095 NTAPI
1096 RtlRunOnceInitialize(
1097 OUT PRTL_RUN_ONCE RunOnce);
1098
1099 NTSYSAPI
1100 NTSTATUS
1101 NTAPI
1102 RtlRunOnceExecuteOnce(
1103 IN OUT PRTL_RUN_ONCE RunOnce,
1104 IN PRTL_RUN_ONCE_INIT_FN InitFn,
1105 IN OUT PVOID Parameter OPTIONAL,
1106 OUT PVOID *Context OPTIONAL);
1107
1108 NTSYSAPI
1109 NTSTATUS
1110 NTAPI
1111 RtlRunOnceBeginInitialize(
1112 IN OUT PRTL_RUN_ONCE RunOnce,
1113 IN ULONG Flags,
1114 OUT PVOID *Context OPTIONAL);
1115
1116 NTSYSAPI
1117 NTSTATUS
1118 NTAPI
1119 RtlRunOnceComplete(
1120 IN OUT PRTL_RUN_ONCE RunOnce,
1121 IN ULONG Flags,
1122 IN PVOID Context OPTIONAL);
1123
1124 NTSYSAPI
1125 BOOLEAN
1126 NTAPI
1127 RtlGetProductInfo(
1128 IN ULONG OSMajorVersion,
1129 IN ULONG OSMinorVersion,
1130 IN ULONG SpMajorVersion,
1131 IN ULONG SpMinorVersion,
1132 OUT PULONG ReturnedProductType);
1133
1134 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
1135
1136 #if !defined(MIDL_PASS) && !defined(SORTPP_PASS)
1137
1138 #if (NTDDI_VERSION >= NTDDI_WIN7)
1139
1140 FORCEINLINE
1141 VOID
1142 NTAPI
1143 RtlInitHashTableContext(
1144 IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context)
1145 {
1146 Context->ChainHead = NULL;
1147 Context->PrevLinkage = NULL;
1148 }
1149
1150 FORCEINLINE
1151 VOID
1152 NTAPI
1153 RtlInitHashTableContextFromEnumerator(
1154 IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context,
1155 IN PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator)
1156 {
1157 Context->ChainHead = Enumerator->ChainHead;
1158 Context->PrevLinkage = Enumerator->HashEntry.Linkage.Blink;
1159 }
1160
1161 FORCEINLINE
1162 VOID
1163 NTAPI
1164 RtlReleaseHashTableContext(
1165 IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context)
1166 {
1167 UNREFERENCED_PARAMETER(Context);
1168 return;
1169 }
1170
1171 FORCEINLINE
1172 ULONG
1173 NTAPI
1174 RtlTotalBucketsHashTable(
1175 IN PRTL_DYNAMIC_HASH_TABLE HashTable)
1176 {
1177 return HashTable->TableSize;
1178 }
1179
1180 FORCEINLINE
1181 ULONG
1182 NTAPI
1183 RtlNonEmptyBucketsHashTable(
1184 IN PRTL_DYNAMIC_HASH_TABLE HashTable)
1185 {
1186 return HashTable->NonEmptyBuckets;
1187 }
1188
1189 FORCEINLINE
1190 ULONG
1191 NTAPI
1192 RtlEmptyBucketsHashTable(
1193 IN PRTL_DYNAMIC_HASH_TABLE HashTable)
1194 {
1195 return HashTable->TableSize - HashTable->NonEmptyBuckets;
1196 }
1197
1198 FORCEINLINE
1199 ULONG
1200 NTAPI
1201 RtlTotalEntriesHashTable(
1202 IN PRTL_DYNAMIC_HASH_TABLE HashTable)
1203 {
1204 return HashTable->NumEntries;
1205 }
1206
1207 FORCEINLINE
1208 ULONG
1209 NTAPI
1210 RtlActiveEnumeratorsHashTable(
1211 IN PRTL_DYNAMIC_HASH_TABLE HashTable)
1212 {
1213 return HashTable->NumEnumerators;
1214 }
1215
1216 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
1217
1218 #endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */
1219
1220 #if (NTDDI_VERSION >= NTDDI_WIN7)
1221
1222 NTSYSAPI
1223 BOOLEAN
1224 NTAPI
1225 RtlCreateHashTable(
1226 IN OUT PRTL_DYNAMIC_HASH_TABLE *HashTable OPTIONAL,
1227 IN ULONG Shift,
1228 IN ULONG Flags);
1229
1230 NTSYSAPI
1231 VOID
1232 NTAPI
1233 RtlDeleteHashTable(
1234 IN PRTL_DYNAMIC_HASH_TABLE HashTable);
1235
1236 NTSYSAPI
1237 BOOLEAN
1238 NTAPI
1239 RtlInsertEntryHashTable(
1240 IN PRTL_DYNAMIC_HASH_TABLE HashTable,
1241 IN PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry,
1242 IN ULONG_PTR Signature,
1243 IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL);
1244
1245 NTSYSAPI
1246 BOOLEAN
1247 NTAPI
1248 RtlRemoveEntryHashTable(
1249 IN PRTL_DYNAMIC_HASH_TABLE HashTable,
1250 IN PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry,
1251 IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL);
1252
1253 NTSYSAPI
1254 PRTL_DYNAMIC_HASH_TABLE_ENTRY
1255 NTAPI
1256 RtlLookupEntryHashTable(
1257 IN PRTL_DYNAMIC_HASH_TABLE HashTable,
1258 IN ULONG_PTR Signature,
1259 OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL);
1260
1261 NTSYSAPI
1262 PRTL_DYNAMIC_HASH_TABLE_ENTRY
1263 NTAPI
1264 RtlGetNextEntryHashTable(
1265 IN PRTL_DYNAMIC_HASH_TABLE HashTable,
1266 IN PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context);
1267
1268 NTSYSAPI
1269 BOOLEAN
1270 NTAPI
1271 RtlInitEnumerationHashTable(
1272 IN PRTL_DYNAMIC_HASH_TABLE HashTable,
1273 OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
1274
1275 NTSYSAPI
1276 PRTL_DYNAMIC_HASH_TABLE_ENTRY
1277 NTAPI
1278 RtlEnumerateEntryHashTable(
1279 IN PRTL_DYNAMIC_HASH_TABLE HashTable,
1280 IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
1281
1282 NTSYSAPI
1283 VOID
1284 NTAPI
1285 RtlEndEnumerationHashTable(
1286 IN PRTL_DYNAMIC_HASH_TABLE HashTable,
1287 IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
1288
1289 NTSYSAPI
1290 BOOLEAN
1291 NTAPI
1292 RtlInitWeakEnumerationHashTable(
1293 IN PRTL_DYNAMIC_HASH_TABLE HashTable,
1294 OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
1295
1296 NTSYSAPI
1297 PRTL_DYNAMIC_HASH_TABLE_ENTRY
1298 NTAPI
1299 RtlWeaklyEnumerateEntryHashTable(
1300 IN PRTL_DYNAMIC_HASH_TABLE HashTable,
1301 IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
1302
1303 NTSYSAPI
1304 VOID
1305 NTAPI
1306 RtlEndWeakEnumerationHashTable(
1307 IN PRTL_DYNAMIC_HASH_TABLE HashTable,
1308 IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
1309
1310 NTSYSAPI
1311 BOOLEAN
1312 NTAPI
1313 RtlExpandHashTable(
1314 IN PRTL_DYNAMIC_HASH_TABLE HashTable);
1315
1316 NTSYSAPI
1317 BOOLEAN
1318 NTAPI
1319 RtlContractHashTable(
1320 IN PRTL_DYNAMIC_HASH_TABLE HashTable);
1321
1322 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
1323
1324 #if defined(_AMD64_) || defined(_IA64_)
1325 //DECLSPEC_DEPRECATED_DDK_WINXP
1326 FORCEINLINE
1327 LARGE_INTEGER
1328 NTAPI_INLINE
1329 RtlLargeIntegerDivide(
1330 IN LARGE_INTEGER Dividend,
1331 IN LARGE_INTEGER Divisor,
1332 OUT PLARGE_INTEGER Remainder OPTIONAL)
1333 {
1334 LARGE_INTEGER ret;
1335 ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart;
1336 if (Remainder)
1337 Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart;
1338 return ret;
1339 }
1340
1341 #else
1342
1343 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1344 NTSYSAPI
1345 LARGE_INTEGER
1346 NTAPI
1347 RtlLargeIntegerDivide(
1348 IN LARGE_INTEGER Dividend,
1349 IN LARGE_INTEGER Divisor,
1350 OUT PLARGE_INTEGER Remainder OPTIONAL);
1351 #endif
1352
1353 #endif /* defined(_AMD64_) || defined(_IA64_) */
1354
1355 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
1356 ((ConditionMask) = VerSetConditionMask((ConditionMask), \
1357 (TypeBitMask), (ComparisonType)))
1358
1359 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1360 NTSYSAPI
1361 ULONGLONG
1362 NTAPI
1363 VerSetConditionMask(
1364 IN ULONGLONG ConditionMask,
1365 IN ULONG TypeMask,
1366 IN UCHAR Condition);
1367 #endif
1368
1369 /** Kernel debugger routines **/
1370
1371 NTSYSAPI
1372 ULONG
1373 NTAPI
1374 DbgPrompt(
1375 IN PCCH Prompt,
1376 OUT PCH Response,
1377 IN ULONG MaximumResponseLength);
1378
1379 #if (NTDDI_VERSION >= NTDDI_WIN7)
1380
1381 #define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX 0x00004000
1382 #define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX 0x00008000
1383 #define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_EX \
1384 (FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX | \
1385 FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX)
1386
1387 #define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_DEPRECATED 0x00000200
1388 #define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_DEPRECATED 0x00000300
1389 #define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_DEPRECATED 0x00000300
1390
1391 #else
1392
1393 #define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL 0x00000200
1394 #define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL 0x00000300
1395 #define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK 0x00000300
1396
1397 #define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL
1398 #define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL
1399 #define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_EX FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK
1400
1401 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
1402
1403 #define FILE_CHARACTERISTICS_PROPAGATED ( FILE_REMOVABLE_MEDIA | \
1404 FILE_READ_ONLY_DEVICE | \
1405 FILE_FLOPPY_DISKETTE | \
1406 FILE_WRITE_ONCE_MEDIA | \
1407 FILE_DEVICE_SECURE_OPEN )
1408
1409 typedef struct _FILE_ALIGNMENT_INFORMATION {
1410 ULONG AlignmentRequirement;
1411 } FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;
1412
1413 typedef struct _FILE_NAME_INFORMATION {
1414 ULONG FileNameLength;
1415 WCHAR FileName[1];
1416 } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
1417
1418
1419 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {
1420 ULONG FileAttributes;
1421 ULONG ReparseTag;
1422 } FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
1423
1424 typedef struct _FILE_DISPOSITION_INFORMATION {
1425 BOOLEAN DeleteFile;
1426 } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
1427
1428 typedef struct _FILE_END_OF_FILE_INFORMATION {
1429 LARGE_INTEGER EndOfFile;
1430 } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
1431
1432 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {
1433 LARGE_INTEGER ValidDataLength;
1434 } FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
1435
1436 typedef struct _FILE_FS_LABEL_INFORMATION {
1437 ULONG VolumeLabelLength;
1438 WCHAR VolumeLabel[1];
1439 } FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION;
1440
1441 typedef struct _FILE_FS_VOLUME_INFORMATION {
1442 LARGE_INTEGER VolumeCreationTime;
1443 ULONG VolumeSerialNumber;
1444 ULONG VolumeLabelLength;
1445 BOOLEAN SupportsObjects;
1446 WCHAR VolumeLabel[1];
1447 } FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
1448
1449 typedef struct _FILE_FS_SIZE_INFORMATION {
1450 LARGE_INTEGER TotalAllocationUnits;
1451 LARGE_INTEGER AvailableAllocationUnits;
1452 ULONG SectorsPerAllocationUnit;
1453 ULONG BytesPerSector;
1454 } FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
1455
1456 typedef struct _FILE_FS_FULL_SIZE_INFORMATION {
1457 LARGE_INTEGER TotalAllocationUnits;
1458 LARGE_INTEGER CallerAvailableAllocationUnits;
1459 LARGE_INTEGER ActualAvailableAllocationUnits;
1460 ULONG SectorsPerAllocationUnit;
1461 ULONG BytesPerSector;
1462 } FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION;
1463
1464 typedef struct _FILE_FS_OBJECTID_INFORMATION {
1465 UCHAR ObjectId[16];
1466 UCHAR ExtendedInfo[48];
1467 } FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION;
1468
1469 typedef union _FILE_SEGMENT_ELEMENT {
1470 PVOID64 Buffer;
1471 ULONGLONG Alignment;
1472 }FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
1473
1474 #define IOCTL_AVIO_ALLOCATE_STREAM CTL_CODE(FILE_DEVICE_AVIO, 1, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
1475 #define IOCTL_AVIO_FREE_STREAM CTL_CODE(FILE_DEVICE_AVIO, 2, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
1476 #define IOCTL_AVIO_MODIFY_STREAM CTL_CODE(FILE_DEVICE_AVIO, 3, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
1477
1478 typedef enum _BUS_DATA_TYPE {
1479 ConfigurationSpaceUndefined = -1,
1480 Cmos,
1481 EisaConfiguration,
1482 Pos,
1483 CbusConfiguration,
1484 PCIConfiguration,
1485 VMEConfiguration,
1486 NuBusConfiguration,
1487 PCMCIAConfiguration,
1488 MPIConfiguration,
1489 MPSAConfiguration,
1490 PNPISAConfiguration,
1491 SgiInternalConfiguration,
1492 MaximumBusDataType
1493 } BUS_DATA_TYPE, *PBUS_DATA_TYPE;
1494
1495 typedef struct _KEY_NAME_INFORMATION {
1496 ULONG NameLength;
1497 WCHAR Name[1];
1498 } KEY_NAME_INFORMATION, *PKEY_NAME_INFORMATION;
1499
1500 typedef struct _KEY_CACHED_INFORMATION {
1501 LARGE_INTEGER LastWriteTime;
1502 ULONG TitleIndex;
1503 ULONG SubKeys;
1504 ULONG MaxNameLen;
1505 ULONG Values;
1506 ULONG MaxValueNameLen;
1507 ULONG MaxValueDataLen;
1508 ULONG NameLength;
1509 } KEY_CACHED_INFORMATION, *PKEY_CACHED_INFORMATION;
1510
1511 typedef struct _KEY_VIRTUALIZATION_INFORMATION {
1512 ULONG VirtualizationCandidate:1;
1513 ULONG VirtualizationEnabled:1;
1514 ULONG VirtualTarget:1;
1515 ULONG VirtualStore:1;
1516 ULONG VirtualSource:1;
1517 ULONG Reserved:27;
1518 } KEY_VIRTUALIZATION_INFORMATION, *PKEY_VIRTUALIZATION_INFORMATION;
1519
1520 #define THREAD_CSWITCH_PMU_DISABLE FALSE
1521 #define THREAD_CSWITCH_PMU_ENABLE TRUE
1522
1523 #define PROCESS_LUID_DOSDEVICES_ONLY 0x00000001
1524
1525 #define PROCESS_HANDLE_TRACING_MAX_STACKS 16
1526
1527 typedef struct _NT_TIB {
1528 struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
1529 PVOID StackBase;
1530 PVOID StackLimit;
1531 PVOID SubSystemTib;
1532 _ANONYMOUS_UNION union {
1533 PVOID FiberData;
1534 ULONG Version;
1535 } DUMMYUNIONNAME;
1536 PVOID ArbitraryUserPointer;
1537 struct _NT_TIB *Self;
1538 } NT_TIB, *PNT_TIB;
1539
1540 typedef struct _NT_TIB32 {
1541 ULONG ExceptionList;
1542 ULONG StackBase;
1543 ULONG StackLimit;
1544 ULONG SubSystemTib;
1545 __GNU_EXTENSION union {
1546 ULONG FiberData;
1547 ULONG Version;
1548 };
1549 ULONG ArbitraryUserPointer;
1550 ULONG Self;
1551 } NT_TIB32,*PNT_TIB32;
1552
1553 typedef struct _NT_TIB64 {
1554 ULONG64 ExceptionList;
1555 ULONG64 StackBase;
1556 ULONG64 StackLimit;
1557 ULONG64 SubSystemTib;
1558 __GNU_EXTENSION union {
1559 ULONG64 FiberData;
1560 ULONG Version;
1561 };
1562 ULONG64 ArbitraryUserPointer;
1563 ULONG64 Self;
1564 } NT_TIB64,*PNT_TIB64;
1565
1566 typedef enum _PROCESSINFOCLASS {
1567 ProcessBasicInformation,
1568 ProcessQuotaLimits,
1569 ProcessIoCounters,
1570 ProcessVmCounters,
1571 ProcessTimes,
1572 ProcessBasePriority,
1573 ProcessRaisePriority,
1574 ProcessDebugPort,
1575 ProcessExceptionPort,
1576 ProcessAccessToken,
1577 ProcessLdtInformation,
1578 ProcessLdtSize,
1579 ProcessDefaultHardErrorMode,
1580 ProcessIoPortHandlers,
1581 ProcessPooledUsageAndLimits,
1582 ProcessWorkingSetWatch,
1583 ProcessUserModeIOPL,
1584 ProcessEnableAlignmentFaultFixup,
1585 ProcessPriorityClass,
1586 ProcessWx86Information,
1587 ProcessHandleCount,
1588 ProcessAffinityMask,
1589 ProcessPriorityBoost,
1590 ProcessDeviceMap,
1591 ProcessSessionInformation,
1592 ProcessForegroundInformation,
1593 ProcessWow64Information,
1594 ProcessImageFileName,
1595 ProcessLUIDDeviceMapsEnabled,
1596 ProcessBreakOnTermination,
1597 ProcessDebugObjectHandle,
1598 ProcessDebugFlags,
1599 ProcessHandleTracing,
1600 ProcessIoPriority,
1601 ProcessExecuteFlags,
1602 ProcessTlsInformation,
1603 ProcessCookie,
1604 ProcessImageInformation,
1605 ProcessCycleTime,
1606 ProcessPagePriority,
1607 ProcessInstrumentationCallback,
1608 ProcessThreadStackAllocation,
1609 ProcessWorkingSetWatchEx,
1610 ProcessImageFileNameWin32,
1611 ProcessImageFileMapping,
1612 ProcessAffinityUpdateMode,
1613 ProcessMemoryAllocationMode,
1614 ProcessGroupInformation,
1615 ProcessTokenVirtualizationEnabled,
1616 ProcessConsoleHostProcess,
1617 ProcessWindowInformation,
1618 MaxProcessInfoClass
1619 } PROCESSINFOCLASS;
1620
1621 typedef enum _THREADINFOCLASS {
1622 ThreadBasicInformation,
1623 ThreadTimes,
1624 ThreadPriority,
1625 ThreadBasePriority,
1626 ThreadAffinityMask,
1627 ThreadImpersonationToken,
1628 ThreadDescriptorTableEntry,
1629 ThreadEnableAlignmentFaultFixup,
1630 ThreadEventPair_Reusable,
1631 ThreadQuerySetWin32StartAddress,
1632 ThreadZeroTlsCell,
1633 ThreadPerformanceCount,
1634 ThreadAmILastThread,
1635 ThreadIdealProcessor,
1636 ThreadPriorityBoost,
1637 ThreadSetTlsArrayAddress,
1638 ThreadIsIoPending,
1639 ThreadHideFromDebugger,
1640 ThreadBreakOnTermination,
1641 ThreadSwitchLegacyState,
1642 ThreadIsTerminated,
1643 ThreadLastSystemCall,
1644 ThreadIoPriority,
1645 ThreadCycleTime,
1646 ThreadPagePriority,
1647 ThreadActualBasePriority,
1648 ThreadTebInformation,
1649 ThreadCSwitchMon,
1650 ThreadCSwitchPmu,
1651 ThreadWow64Context,
1652 ThreadGroupInformation,
1653 ThreadUmsInformation,
1654 ThreadCounterProfiling,
1655 ThreadIdealProcessorEx,
1656 MaxThreadInfoClass
1657 } THREADINFOCLASS;
1658
1659 typedef struct _PAGE_PRIORITY_INFORMATION {
1660 ULONG PagePriority;
1661 } PAGE_PRIORITY_INFORMATION, *PPAGE_PRIORITY_INFORMATION;
1662
1663 typedef struct _PROCESS_WS_WATCH_INFORMATION {
1664 PVOID FaultingPc;
1665 PVOID FaultingVa;
1666 } PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;
1667
1668 typedef struct _PROCESS_BASIC_INFORMATION {
1669 NTSTATUS ExitStatus;
1670 struct _PEB *PebBaseAddress;
1671 ULONG_PTR AffinityMask;
1672 KPRIORITY BasePriority;
1673 ULONG_PTR UniqueProcessId;
1674 ULONG_PTR InheritedFromUniqueProcessId;
1675 } PROCESS_BASIC_INFORMATION,*PPROCESS_BASIC_INFORMATION;
1676
1677 typedef struct _PROCESS_EXTENDED_BASIC_INFORMATION {
1678 SIZE_T Size;
1679 PROCESS_BASIC_INFORMATION BasicInfo;
1680 union {
1681 ULONG Flags;
1682 struct {
1683 ULONG IsProtectedProcess:1;
1684 ULONG IsWow64Process:1;
1685 ULONG IsProcessDeleting:1;
1686 ULONG IsCrossSessionCreate:1;
1687 ULONG SpareBits:28;
1688 } DUMMYSTRUCTNAME;
1689 } DUMMYUNIONNAME;
1690 } PROCESS_EXTENDED_BASIC_INFORMATION, *PPROCESS_EXTENDED_BASIC_INFORMATION;
1691
1692 typedef struct _PROCESS_DEVICEMAP_INFORMATION {
1693 __GNU_EXTENSION union {
1694 struct {
1695 HANDLE DirectoryHandle;
1696 } Set;
1697 struct {
1698 ULONG DriveMap;
1699 UCHAR DriveType[32];
1700 } Query;
1701 };
1702 } PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
1703
1704 typedef struct _PROCESS_DEVICEMAP_INFORMATION_EX {
1705 union {
1706 struct {
1707 HANDLE DirectoryHandle;
1708 } Set;
1709 struct {
1710 ULONG DriveMap;
1711 UCHAR DriveType[32];
1712 } Query;
1713 } DUMMYUNIONNAME;
1714 ULONG Flags;
1715 } PROCESS_DEVICEMAP_INFORMATION_EX, *PPROCESS_DEVICEMAP_INFORMATION_EX;
1716
1717 typedef struct _PROCESS_SESSION_INFORMATION {
1718 ULONG SessionId;
1719 } PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;
1720
1721 typedef struct _PROCESS_HANDLE_TRACING_ENABLE {
1722 ULONG Flags;
1723 } PROCESS_HANDLE_TRACING_ENABLE, *PPROCESS_HANDLE_TRACING_ENABLE;
1724
1725 typedef struct _PROCESS_HANDLE_TRACING_ENABLE_EX {
1726 ULONG Flags;
1727 ULONG TotalSlots;
1728 } PROCESS_HANDLE_TRACING_ENABLE_EX, *PPROCESS_HANDLE_TRACING_ENABLE_EX;
1729
1730 typedef struct _PROCESS_HANDLE_TRACING_ENTRY {
1731 HANDLE Handle;
1732 CLIENT_ID ClientId;
1733 ULONG Type;
1734 PVOID Stacks[PROCESS_HANDLE_TRACING_MAX_STACKS];
1735 } PROCESS_HANDLE_TRACING_ENTRY, *PPROCESS_HANDLE_TRACING_ENTRY;
1736
1737 typedef struct _PROCESS_HANDLE_TRACING_QUERY {
1738 HANDLE Handle;
1739 ULONG TotalTraces;
1740 PROCESS_HANDLE_TRACING_ENTRY HandleTrace[1];
1741 } PROCESS_HANDLE_TRACING_QUERY, *PPROCESS_HANDLE_TRACING_QUERY;
1742
1743 #define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
1744 #define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
1745 #define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
1746 #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
1747 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
1748
1749 typedef struct _QUOTA_LIMITS {
1750 SIZE_T PagedPoolLimit;
1751 SIZE_T NonPagedPoolLimit;
1752 SIZE_T MinimumWorkingSetSize;
1753 SIZE_T MaximumWorkingSetSize;
1754 SIZE_T PagefileLimit;
1755 LARGE_INTEGER TimeLimit;
1756 } QUOTA_LIMITS, *PQUOTA_LIMITS;
1757
1758 typedef union _RATE_QUOTA_LIMIT {
1759 ULONG RateData;
1760 struct {
1761 ULONG RatePercent:7;
1762 ULONG Reserved0:25;
1763 } DUMMYSTRUCTNAME;
1764 } RATE_QUOTA_LIMIT, *PRATE_QUOTA_LIMIT;
1765
1766 typedef struct _QUOTA_LIMITS_EX {
1767 SIZE_T PagedPoolLimit;
1768 SIZE_T NonPagedPoolLimit;
1769 SIZE_T MinimumWorkingSetSize;
1770 SIZE_T MaximumWorkingSetSize;
1771 SIZE_T PagefileLimit;
1772 LARGE_INTEGER TimeLimit;
1773 SIZE_T WorkingSetLimit;
1774 SIZE_T Reserved2;
1775 SIZE_T Reserved3;
1776 SIZE_T Reserved4;
1777 ULONG Flags;
1778 RATE_QUOTA_LIMIT CpuRateLimit;
1779 } QUOTA_LIMITS_EX, *PQUOTA_LIMITS_EX;
1780
1781 typedef struct _IO_COUNTERS {
1782 ULONGLONG ReadOperationCount;
1783 ULONGLONG WriteOperationCount;
1784 ULONGLONG OtherOperationCount;
1785 ULONGLONG ReadTransferCount;
1786 ULONGLONG WriteTransferCount;
1787 ULONGLONG OtherTransferCount;
1788 } IO_COUNTERS, *PIO_COUNTERS;
1789
1790 typedef struct _VM_COUNTERS {
1791 SIZE_T PeakVirtualSize;
1792 SIZE_T VirtualSize;
1793 ULONG PageFaultCount;
1794 SIZE_T PeakWorkingSetSize;
1795 SIZE_T WorkingSetSize;
1796 SIZE_T QuotaPeakPagedPoolUsage;
1797 SIZE_T QuotaPagedPoolUsage;
1798 SIZE_T QuotaPeakNonPagedPoolUsage;
1799 SIZE_T QuotaNonPagedPoolUsage;
1800 SIZE_T PagefileUsage;
1801 SIZE_T PeakPagefileUsage;
1802 } VM_COUNTERS, *PVM_COUNTERS;
1803
1804 typedef struct _VM_COUNTERS_EX {
1805 SIZE_T PeakVirtualSize;
1806 SIZE_T VirtualSize;
1807 ULONG PageFaultCount;
1808 SIZE_T PeakWorkingSetSize;
1809 SIZE_T WorkingSetSize;
1810 SIZE_T QuotaPeakPagedPoolUsage;
1811 SIZE_T QuotaPagedPoolUsage;
1812 SIZE_T QuotaPeakNonPagedPoolUsage;
1813 SIZE_T QuotaNonPagedPoolUsage;
1814 SIZE_T PagefileUsage;
1815 SIZE_T PeakPagefileUsage;
1816 SIZE_T PrivateUsage;
1817 } VM_COUNTERS_EX, *PVM_COUNTERS_EX;
1818
1819 #define MAX_HW_COUNTERS 16
1820 #define THREAD_PROFILING_FLAG_DISPATCH 0x00000001
1821
1822 typedef enum _HARDWARE_COUNTER_TYPE {
1823 PMCCounter,
1824 MaxHardwareCounterType
1825 } HARDWARE_COUNTER_TYPE, *PHARDWARE_COUNTER_TYPE;
1826
1827 typedef struct _HARDWARE_COUNTER {
1828 HARDWARE_COUNTER_TYPE Type;
1829 ULONG Reserved;
1830 ULONG64 Index;
1831 } HARDWARE_COUNTER, *PHARDWARE_COUNTER;
1832
1833 typedef struct _POOLED_USAGE_AND_LIMITS {
1834 SIZE_T PeakPagedPoolUsage;
1835 SIZE_T PagedPoolUsage;
1836 SIZE_T PagedPoolLimit;
1837 SIZE_T PeakNonPagedPoolUsage;
1838 SIZE_T NonPagedPoolUsage;
1839 SIZE_T NonPagedPoolLimit;
1840 SIZE_T PeakPagefileUsage;
1841 SIZE_T PagefileUsage;
1842 SIZE_T PagefileLimit;
1843 } POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS;
1844
1845 typedef struct _PROCESS_ACCESS_TOKEN {
1846 HANDLE Token;
1847 HANDLE Thread;
1848 } PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
1849
1850 #define PROCESS_EXCEPTION_PORT_ALL_STATE_BITS 0x00000003UL
1851 #define PROCESS_EXCEPTION_PORT_ALL_STATE_FLAGS ((ULONG_PTR)((1UL << PROCESS_EXCEPTION_PORT_ALL_STATE_BITS) - 1))
1852
1853 typedef struct _PROCESS_EXCEPTION_PORT {
1854 IN HANDLE ExceptionPortHandle;
1855 IN OUT ULONG StateFlags;
1856 } PROCESS_EXCEPTION_PORT, *PPROCESS_EXCEPTION_PORT;
1857
1858 typedef struct _KERNEL_USER_TIMES {
1859 LARGE_INTEGER CreateTime;
1860 LARGE_INTEGER ExitTime;
1861 LARGE_INTEGER KernelTime;
1862 LARGE_INTEGER UserTime;
1863 } KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;
1864
1865 /* NtXxx Functions */
1866
1867 NTSYSCALLAPI
1868 NTSTATUS
1869 NTAPI
1870 NtOpenProcess(
1871 OUT PHANDLE ProcessHandle,
1872 IN ACCESS_MASK DesiredAccess,
1873 IN POBJECT_ATTRIBUTES ObjectAttributes,
1874 IN PCLIENT_ID ClientId OPTIONAL);
1875
1876 NTSYSCALLAPI
1877 NTSTATUS
1878 NTAPI
1879 NtQueryInformationProcess(
1880 IN HANDLE ProcessHandle,
1881 IN PROCESSINFOCLASS ProcessInformationClass,
1882 OUT PVOID ProcessInformation OPTIONAL,
1883 IN ULONG ProcessInformationLength,
1884 OUT PULONG ReturnLength OPTIONAL);
1885
1886 typedef enum _SYSTEM_FIRMWARE_TABLE_ACTION {
1887 SystemFirmwareTable_Enumerate,
1888 SystemFirmwareTable_Get
1889 } SYSTEM_FIRMWARE_TABLE_ACTION;
1890
1891 typedef struct _SYSTEM_FIRMWARE_TABLE_INFORMATION {
1892 ULONG ProviderSignature;
1893 SYSTEM_FIRMWARE_TABLE_ACTION Action;
1894 ULONG TableID;
1895 ULONG TableBufferLength;
1896 UCHAR TableBuffer[ANYSIZE_ARRAY];
1897 } SYSTEM_FIRMWARE_TABLE_INFORMATION, *PSYSTEM_FIRMWARE_TABLE_INFORMATION;
1898
1899 typedef NTSTATUS
1900 (__cdecl *PFNFTH) (
1901 IN OUT PSYSTEM_FIRMWARE_TABLE_INFORMATION SystemFirmwareTableInfo);
1902
1903 typedef struct _SYSTEM_FIRMWARE_TABLE_HANDLER {
1904 ULONG ProviderSignature;
1905 BOOLEAN Register;
1906 PFNFTH FirmwareTableHandler;
1907 PVOID DriverObject;
1908 } SYSTEM_FIRMWARE_TABLE_HANDLER, *PSYSTEM_FIRMWARE_TABLE_HANDLER;
1909
1910 typedef VOID
1911 (NTAPI *PTIMER_APC_ROUTINE)(
1912 IN PVOID TimerContext,
1913 IN ULONG TimerLowValue,
1914 IN LONG TimerHighValue);
1915
1916 typedef enum _TIMER_SET_INFORMATION_CLASS {
1917 TimerSetCoalescableTimer,
1918 MaxTimerInfoClass
1919 } TIMER_SET_INFORMATION_CLASS;
1920
1921 #if (NTDDI_VERSION >= NTDDI_WIN7)
1922 typedef struct _TIMER_SET_COALESCABLE_TIMER_INFO {
1923 IN LARGE_INTEGER DueTime;
1924 IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL;
1925 IN PVOID TimerContext OPTIONAL;
1926 IN struct _COUNTED_REASON_CONTEXT *WakeContext OPTIONAL;
1927 IN ULONG Period OPTIONAL;
1928 IN ULONG TolerableDelay;
1929 OUT PBOOLEAN PreviousState OPTIONAL;
1930 } TIMER_SET_COALESCABLE_TIMER_INFO, *PTIMER_SET_COALESCABLE_TIMER_INFO;
1931 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
1932
1933 typedef ULONG_PTR
1934 (NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)(
1935 IN PVOID Context);
1936
1937 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
1938 PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine;
1939 PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine;
1940 } DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
1941
1942 #define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
1943 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
1944 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
1945 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
1946 #define DRIVER_VERIFIER_IO_CHECKING 0x0010
1947
1948 #define XSTATE_LEGACY_FLOATING_POINT 0
1949 #define XSTATE_LEGACY_SSE 1
1950 #define XSTATE_GSSE 2
1951
1952 #define XSTATE_MASK_LEGACY_FLOATING_POINT (1i64 << (XSTATE_LEGACY_FLOATING_POINT))
1953 #define XSTATE_MASK_LEGACY_SSE (1i64 << (XSTATE_LEGACY_SSE))
1954 #define XSTATE_MASK_LEGACY (XSTATE_MASK_LEGACY_FLOATING_POINT | XSTATE_MASK_LEGACY_SSE)
1955 #define XSTATE_MASK_GSSE (1i64 << (XSTATE_GSSE))
1956
1957 #define MAXIMUM_XSTATE_FEATURES 64
1958
1959 typedef struct _XSTATE_FEATURE {
1960 ULONG Offset;
1961 ULONG Size;
1962 } XSTATE_FEATURE, *PXSTATE_FEATURE;
1963
1964 typedef struct _XSTATE_CONFIGURATION {
1965 ULONG64 EnabledFeatures;
1966 ULONG Size;
1967 ULONG OptimizedSave:1;
1968 XSTATE_FEATURE Features[MAXIMUM_XSTATE_FEATURES];
1969 } XSTATE_CONFIGURATION, *PXSTATE_CONFIGURATION;
1970
1971 #define MAX_WOW64_SHARED_ENTRIES 16
1972
1973 #define NX_SUPPORT_POLICY_ALWAYSOFF 0
1974 #define NX_SUPPORT_POLICY_ALWAYSON 1
1975 #define NX_SUPPORT_POLICY_OPTIN 2
1976 #define NX_SUPPORT_POLICY_OPTOUT 3
1977
1978 #define SHARED_GLOBAL_FLAGS_ERROR_PORT_V 0x0
1979 #define SHARED_GLOBAL_FLAGS_ERROR_PORT (1UL << SHARED_GLOBAL_FLAGS_ERROR_PORT_V)
1980
1981 #define SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED_V 0x1
1982 #define SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED (1UL << SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED_V)
1983
1984 #define SHARED_GLOBAL_FLAGS_VIRT_ENABLED_V 0x2
1985 #define SHARED_GLOBAL_FLAGS_VIRT_ENABLED (1UL << SHARED_GLOBAL_FLAGS_VIRT_ENABLED_V)
1986
1987 #define SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED_V 0x3
1988 #define SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED \
1989 (1UL << SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED_V)
1990
1991 #define SHARED_GLOBAL_FLAGS_SPARE_V 0x4
1992 #define SHARED_GLOBAL_FLAGS_SPARE \
1993 (1UL << SHARED_GLOBAL_FLAGS_SPARE_V)
1994
1995 #define SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED_V 0x5
1996 #define SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED \
1997 (1UL << SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED_V)
1998
1999 #define SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED_V 0x6
2000 #define SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED \
2001 (1UL << SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED_V)
2002
2003 #define EX_INIT_BITS(Flags, Bit) \
2004 *((Flags)) |= (Bit) // Safe to use before concurrently accessible
2005
2006 #define EX_TEST_SET_BIT(Flags, Bit) \
2007 InterlockedBitTestAndSet ((PLONG)(Flags), (Bit))
2008
2009 #define EX_TEST_CLEAR_BIT(Flags, Bit) \
2010 InterlockedBitTestAndReset ((PLONG)(Flags), (Bit))
2011
2012 typedef struct _KUSER_SHARED_DATA {
2013 ULONG TickCountLowDeprecated;
2014 ULONG TickCountMultiplier;
2015 volatile KSYSTEM_TIME InterruptTime;
2016 volatile KSYSTEM_TIME SystemTime;
2017 volatile KSYSTEM_TIME TimeZoneBias;
2018 USHORT ImageNumberLow;
2019 USHORT ImageNumberHigh;
2020 WCHAR NtSystemRoot[260];
2021 ULONG MaxStackTraceDepth;
2022 ULONG CryptoExponent;
2023 ULONG TimeZoneId;
2024 ULONG LargePageMinimum;
2025 ULONG Reserved2[7];
2026 NT_PRODUCT_TYPE NtProductType;
2027 BOOLEAN ProductTypeIsValid;
2028 ULONG NtMajorVersion;
2029 ULONG NtMinorVersion;
2030 BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX];
2031 ULONG Reserved1;
2032 ULONG Reserved3;
2033 volatile ULONG TimeSlip;
2034 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture;
2035 ULONG AltArchitecturePad[1];
2036 LARGE_INTEGER SystemExpirationDate;
2037 ULONG SuiteMask;
2038 BOOLEAN KdDebuggerEnabled;
2039 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
2040 UCHAR NXSupportPolicy;
2041 #endif
2042 volatile ULONG ActiveConsoleId;
2043 volatile ULONG DismountCount;
2044 ULONG ComPlusPackage;
2045 ULONG LastSystemRITEventTickCount;
2046 ULONG NumberOfPhysicalPages;
2047 BOOLEAN SafeBootMode;
2048 #if (NTDDI_VERSION >= NTDDI_WIN7)
2049 union {
2050 UCHAR TscQpcData;
2051 struct {
2052 UCHAR TscQpcEnabled:1;
2053 UCHAR TscQpcSpareFlag:1;
2054 UCHAR TscQpcShift:6;
2055 } DUMMYSTRUCTNAME;
2056 } DUMMYUNIONNAME;
2057 UCHAR TscQpcPad[2];
2058 #endif
2059 #if (NTDDI_VERSION >= NTDDI_VISTA)
2060 union {
2061 ULONG SharedDataFlags;
2062 struct {
2063 ULONG DbgErrorPortPresent:1;
2064 ULONG DbgElevationEnabled:1;
2065 ULONG DbgVirtEnabled:1;
2066 ULONG DbgInstallerDetectEnabled:1;
2067 ULONG DbgSystemDllRelocated:1;
2068 ULONG DbgDynProcessorEnabled:1;
2069 ULONG DbgSEHValidationEnabled:1;
2070 ULONG SpareBits:25;
2071 } DUMMYSTRUCTNAME2;
2072 } DUMMYUNIONNAME2;
2073 #else
2074 ULONG TraceLogging;
2075 #endif
2076 ULONG DataFlagsPad[1];
2077 ULONGLONG TestRetInstruction;
2078 ULONG SystemCall;
2079 ULONG SystemCallReturn;
2080 ULONGLONG SystemCallPad[3];
2081 _ANONYMOUS_UNION union {
2082 volatile KSYSTEM_TIME TickCount;
2083 volatile ULONG64 TickCountQuad;
2084 _ANONYMOUS_STRUCT struct {
2085 ULONG ReservedTickCountOverlay[3];
2086 ULONG TickCountPad[1];
2087 } DUMMYSTRUCTNAME;
2088 } DUMMYUNIONNAME3;
2089 ULONG Cookie;
2090 ULONG CookiePad[1];
2091 #if (NTDDI_VERSION >= NTDDI_WS03)
2092 LONGLONG ConsoleSessionForegroundProcessId;
2093 ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES];
2094 #endif
2095 #if (NTDDI_VERSION >= NTDDI_VISTA)
2096 #if (NTDDI_VERSION >= NTDDI_WIN7)
2097 USHORT UserModeGlobalLogger[16];
2098 #else
2099 USHORT UserModeGlobalLogger[8];
2100 ULONG HeapTracingPid[2];
2101 ULONG CritSecTracingPid[2];
2102 #endif
2103 ULONG ImageFileExecutionOptions;
2104 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
2105 ULONG LangGenerationCount;
2106 #else
2107 /* 4 bytes padding */
2108 #endif
2109 ULONGLONG Reserved5;
2110 volatile ULONG64 InterruptTimeBias;
2111 #endif
2112 #if (NTDDI_VERSION >= NTDDI_WIN7)
2113 volatile ULONG64 TscQpcBias;
2114 volatile ULONG ActiveProcessorCount;
2115 volatile USHORT ActiveGroupCount;
2116 USHORT Reserved4;
2117 volatile ULONG AitSamplingValue;
2118 volatile ULONG AppCompatFlag;
2119 ULONGLONG SystemDllNativeRelocation;
2120 ULONG SystemDllWowRelocation;
2121 ULONG XStatePad[1];
2122 XSTATE_CONFIGURATION XState;
2123 #endif
2124 } KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;
2125
2126 #define CmResourceTypeMaximum 8
2127
2128 typedef struct _CM_PCCARD_DEVICE_DATA {
2129 UCHAR Flags;
2130 UCHAR ErrorCode;
2131 USHORT Reserved;
2132 ULONG BusData;
2133 ULONG DeviceId;
2134 ULONG LegacyBaseAddress;
2135 UCHAR IRQMap[16];
2136 } CM_PCCARD_DEVICE_DATA, *PCM_PCCARD_DEVICE_DATA;
2137
2138 #define PCCARD_MAP_ERROR 0x01
2139 #define PCCARD_DEVICE_PCI 0x10
2140
2141 #define PCCARD_SCAN_DISABLED 0x01
2142 #define PCCARD_MAP_ZERO 0x02
2143 #define PCCARD_NO_TIMER 0x03
2144 #define PCCARD_NO_PIC 0x04
2145 #define PCCARD_NO_LEGACY_BASE 0x05
2146 #define PCCARD_DUP_LEGACY_BASE 0x06
2147 #define PCCARD_NO_CONTROLLERS 0x07
2148
2149 #ifndef _ARC_DDK_
2150 #define _ARC_DDK_
2151 typedef enum _CONFIGURATION_TYPE {
2152 ArcSystem,
2153 CentralProcessor,
2154 FloatingPointProcessor,
2155 PrimaryIcache,
2156 PrimaryDcache,
2157 SecondaryIcache,
2158 SecondaryDcache,
2159 SecondaryCache,
2160 EisaAdapter,
2161 TcAdapter,
2162 ScsiAdapter,
2163 DtiAdapter,
2164 MultiFunctionAdapter,
2165 DiskController,
2166 TapeController,
2167 CdromController,
2168 WormController,
2169 SerialController,
2170 NetworkController,
2171 DisplayController,
2172 ParallelController,
2173 PointerController,
2174 KeyboardController,
2175 AudioController,
2176 OtherController,
2177 DiskPeripheral,
2178 FloppyDiskPeripheral,
2179 TapePeripheral,
2180 ModemPeripheral,
2181 MonitorPeripheral,
2182 PrinterPeripheral,
2183 PointerPeripheral,
2184 KeyboardPeripheral,
2185 TerminalPeripheral,
2186 OtherPeripheral,
2187 LinePeripheral,
2188 NetworkPeripheral,
2189 SystemMemory,
2190 DockingInformation,
2191 RealModeIrqRoutingTable,
2192 RealModePCIEnumeration,
2193 MaximumType
2194 } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
2195 #endif /* !_ARC_DDK_ */
2196
2197 #if defined(_X86_) || defined(_AMD64_)
2198 #define PAUSE_PROCESSOR YieldProcessor();
2199 #elif defined(_IA64_)
2200 #define PAUSE_PROCESSOR __yield();
2201 #endif
2202
2203 #define MAXIMUM_EXPANSION_SIZE (KERNEL_LARGE_STACK_SIZE - (PAGE_SIZE / 2))
2204
2205 typedef VOID
2206 (NTAPI *PEXPAND_STACK_CALLOUT) (
2207 IN PVOID Parameter OPTIONAL);
2208
2209 /* Kernel Functions */
2210
2211 #if (NTDDI_VERSION >= NTDDI_WIN2K) && defined(SINGLE_GROUP_LEGACY_API)
2212
2213 NTKERNELAPI
2214 VOID
2215 NTAPI
2216 KeSetTargetProcessorDpc(
2217 IN OUT PRKDPC Dpc,
2218 IN CCHAR Number);
2219
2220 NTKERNELAPI
2221 KAFFINITY
2222 NTAPI
2223 KeQueryActiveProcessors(VOID);
2224
2225 #endif
2226
2227 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2228
2229 NTKERNELAPI
2230 VOID
2231 NTAPI
2232 KeSetImportanceDpc(
2233 IN OUT PRKDPC Dpc,
2234 IN KDPC_IMPORTANCE Importance);
2235
2236 NTKERNELAPI
2237 LONG
2238 NTAPI
2239 KePulseEvent(
2240 IN OUT PRKEVENT Event,
2241 IN KPRIORITY Increment,
2242 IN BOOLEAN Wait);
2243
2244 NTKERNELAPI
2245 LONG
2246 NTAPI
2247 KeSetBasePriorityThread(
2248 IN OUT PRKTHREAD Thread,
2249 IN LONG Increment);
2250
2251 NTKERNELAPI
2252 VOID
2253 NTAPI
2254 KeEnterCriticalRegion(VOID);
2255
2256 NTKERNELAPI
2257 VOID
2258 NTAPI
2259 KeLeaveCriticalRegion(VOID);
2260
2261 NTKERNELAPI
2262 DECLSPEC_NORETURN
2263 VOID
2264 NTAPI
2265 KeBugCheck(
2266 IN ULONG BugCheckCode);
2267
2268 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
2269
2270 #if (NTDDI_VERSION >= NTDDI_WINXP)
2271 NTKERNELAPI
2272 BOOLEAN
2273 NTAPI
2274 KeAreApcsDisabled(VOID);
2275 #endif
2276
2277 #if (NTDDI_VERSION >= NTDDI_WS03)
2278 NTKERNELAPI
2279 BOOLEAN
2280 NTAPI
2281 KeInvalidateAllCaches(VOID);
2282 #endif
2283
2284 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
2285
2286 NTKERNELAPI
2287 NTSTATUS
2288 NTAPI
2289 KeExpandKernelStackAndCallout(
2290 IN PEXPAND_STACK_CALLOUT Callout,
2291 IN PVOID Parameter OPTIONAL,
2292 IN SIZE_T Size);
2293
2294 NTKERNELAPI
2295 VOID
2296 NTAPI
2297 KeEnterGuardedRegion(VOID);
2298
2299 NTKERNELAPI
2300 VOID
2301 NTAPI
2302 KeLeaveGuardedRegion(VOID);
2303
2304 #endif
2305
2306 #if (NTDDI_VERSION >= NTDDI_VISTA) && defined(SINGLE_GROUP_LEGACY_API)
2307
2308 NTKERNELAPI
2309 ULONG
2310 NTAPI
2311 KeQueryActiveProcessorCount(
2312 OUT PKAFFINITY ActiveProcessors OPTIONAL);
2313
2314 NTKERNELAPI
2315 ULONG
2316 NTAPI
2317 KeQueryMaximumProcessorCount(VOID);
2318
2319 #endif
2320
2321 #if (NTDDI_VERSION >= NTDDI_WIN7)
2322
2323 NTKERNELAPI
2324 ULONG
2325 NTAPI
2326 KeQueryActiveProcessorCountEx(
2327 IN USHORT GroupNumber);
2328
2329 NTKERNELAPI
2330 ULONG
2331 NTAPI
2332 KeQueryMaximumProcessorCountEx(
2333 IN USHORT GroupNumber);
2334
2335 NTKERNELAPI
2336 USHORT
2337 NTAPI
2338 KeQueryActiveGroupCount(VOID);
2339
2340 NTKERNELAPI
2341 USHORT
2342 NTAPI
2343 KeQueryMaximumGroupCount(VOID);
2344
2345 NTKERNELAPI
2346 KAFFINITY
2347 NTAPI
2348 KeQueryGroupAffinity(
2349 IN USHORT GroupNumber);
2350
2351 NTKERNELAPI
2352 ULONG
2353 NTAPI
2354 KeGetCurrentProcessorNumberEx(
2355 OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL);
2356
2357 NTKERNELAPI
2358 VOID
2359 NTAPI
2360 KeQueryNodeActiveAffinity(
2361 IN USHORT NodeNumber,
2362 OUT PGROUP_AFFINITY Affinity OPTIONAL,
2363 OUT PUSHORT Count OPTIONAL);
2364
2365 NTKERNELAPI
2366 USHORT
2367 NTAPI
2368 KeQueryNodeMaximumProcessorCount(
2369 IN USHORT NodeNumber);
2370
2371 NTKERNELAPI
2372 USHORT
2373 NTAPI
2374 KeQueryHighestNodeNumber(VOID);
2375
2376 NTKERNELAPI
2377 USHORT
2378 NTAPI
2379 KeGetCurrentNodeNumber(VOID);
2380
2381 NTKERNELAPI
2382 NTSTATUS
2383 NTAPI
2384 KeQueryLogicalProcessorRelationship(
2385 IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL,
2386 IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,
2387 OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL,
2388 IN OUT PULONG Length);
2389
2390 NTKERNELAPI
2391 NTSTATUS
2392 NTAPI
2393 KeSetHardwareCounterConfiguration(
2394 IN PHARDWARE_COUNTER CounterArray,
2395 IN ULONG Count);
2396
2397 NTKERNELAPI
2398 NTSTATUS
2399 NTAPI
2400 KeQueryHardwareCounterConfiguration(
2401 OUT PHARDWARE_COUNTER CounterArray,
2402 IN ULONG MaximumCount,
2403 OUT PULONG Count);
2404
2405 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
2406
2407 NTKERNELAPI
2408 VOID
2409 FASTCALL
2410 KeInvalidateRangeAllCaches(
2411 IN PVOID BaseAddress,
2412 IN ULONG Length);
2413
2414 typedef GUID UUID;
2415
2416 /* Executive Types */
2417
2418 typedef struct _ZONE_SEGMENT_HEADER {
2419 SINGLE_LIST_ENTRY SegmentList;
2420 PVOID Reserved;
2421 } ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER;
2422
2423 typedef struct _ZONE_HEADER {
2424 SINGLE_LIST_ENTRY FreeList;
2425 SINGLE_LIST_ENTRY SegmentList;
2426 ULONG BlockSize;
2427 ULONG TotalSegmentSize;
2428 } ZONE_HEADER, *PZONE_HEADER;
2429
2430 #if defined(POOL_TAGGING)
2431 #define ExFreePool(a) ExFreePoolWithTag(a,0)
2432 #endif
2433
2434 #define PROTECTED_POOL 0x80000000
2435
2436 /* Executive Functions */
2437
2438 static __inline PVOID
2439 ExAllocateFromZone(
2440 IN PZONE_HEADER Zone)
2441 {
2442 if (Zone->FreeList.Next)
2443 Zone->FreeList.Next = Zone->FreeList.Next->Next;
2444 return (PVOID) Zone->FreeList.Next;
2445 }
2446
2447 static __inline PVOID
2448 ExFreeToZone(
2449 IN PZONE_HEADER Zone,
2450 IN PVOID Block)
2451 {
2452 ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
2453 Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
2454 return ((PSINGLE_LIST_ENTRY) Block)->Next;
2455 }
2456
2457 /*
2458 * PVOID
2459 * ExInterlockedAllocateFromZone(
2460 * IN PZONE_HEADER Zone,
2461 * IN PKSPIN_LOCK Lock)
2462 */
2463 #define ExInterlockedAllocateFromZone(Zone, Lock) \
2464 ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
2465
2466 /* PVOID
2467 * ExInterlockedFreeToZone(
2468 * IN PZONE_HEADER Zone,
2469 * IN PVOID Block,
2470 * IN PKSPIN_LOCK Lock);
2471 */
2472 #define ExInterlockedFreeToZone(Zone, Block, Lock) \
2473 ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
2474
2475 /*
2476 * BOOLEAN
2477 * ExIsFullZone(
2478 * IN PZONE_HEADER Zone)
2479 */
2480 #define ExIsFullZone(Zone) \
2481 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
2482
2483 /* BOOLEAN
2484 * ExIsObjectInFirstZoneSegment(
2485 * IN PZONE_HEADER Zone,
2486 * IN PVOID Object);
2487 */
2488 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
2489 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
2490 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
2491 (Zone)->TotalSegmentSize)) )
2492
2493 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
2494 #define ExAcquireResourceShared ExAcquireResourceSharedLite
2495 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
2496 #define ExDeleteResource ExDeleteResourceLite
2497 #define ExInitializeResource ExInitializeResourceLite
2498 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
2499 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
2500 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
2501 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
2502
2503 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2504
2505 NTKERNELAPI
2506 NTSTATUS
2507 NTAPI
2508 ExExtendZone(
2509 IN OUT PZONE_HEADER Zone,
2510 IN OUT PVOID Segment,
2511 IN ULONG SegmentSize);
2512
2513 NTKERNELAPI
2514 NTSTATUS
2515 NTAPI
2516 ExInitializeZone(
2517 OUT PZONE_HEADER Zone,
2518 IN ULONG BlockSize,
2519 IN OUT PVOID InitialSegment,
2520 IN ULONG InitialSegmentSize);
2521
2522 NTKERNELAPI
2523 NTSTATUS
2524 NTAPI
2525 ExInterlockedExtendZone(
2526 IN OUT PZONE_HEADER Zone,
2527 IN OUT PVOID Segment,
2528 IN ULONG SegmentSize,
2529 IN OUT PKSPIN_LOCK Lock);
2530
2531 NTKERNELAPI
2532 NTSTATUS
2533 NTAPI
2534 ExUuidCreate(
2535 OUT UUID *Uuid);
2536
2537 NTKERNELAPI
2538 DECLSPEC_NORETURN
2539 VOID
2540 NTAPI
2541 ExRaiseAccessViolation(VOID);
2542
2543 NTKERNELAPI
2544 DECLSPEC_NORETURN
2545 VOID
2546 NTAPI
2547 ExRaiseDatatypeMisalignment(VOID);
2548
2549 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
2550
2551 /* Memory Manager Types */
2552
2553 typedef struct _PHYSICAL_MEMORY_RANGE {
2554 PHYSICAL_ADDRESS BaseAddress;
2555 LARGE_INTEGER NumberOfBytes;
2556 } PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
2557
2558 typedef NTSTATUS
2559 (*PMM_ROTATE_COPY_CALLBACK_FUNCTION) (
2560 IN PMDL DestinationMdl,
2561 IN PMDL SourceMdl,
2562 IN PVOID Context);
2563
2564 typedef enum _MM_ROTATE_DIRECTION {
2565 MmToFrameBuffer,
2566 MmToFrameBufferNoCopy,
2567 MmToRegularMemory,
2568 MmToRegularMemoryNoCopy,
2569 MmMaximumRotateDirection
2570 } MM_ROTATE_DIRECTION, *PMM_ROTATE_DIRECTION;
2571
2572 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2573 typedef ULONG NODE_REQUIREMENT;
2574 #define MM_ANY_NODE_OK 0x80000000
2575 #endif
2576
2577 /* Memory Manager Functions */
2578
2579 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2580
2581 NTKERNELAPI
2582 PPHYSICAL_MEMORY_RANGE
2583 NTAPI
2584 MmGetPhysicalMemoryRanges(VOID);
2585
2586 NTKERNELAPI
2587 PHYSICAL_ADDRESS
2588 NTAPI
2589 MmGetPhysicalAddress(
2590 IN PVOID BaseAddress);
2591
2592 NTKERNELAPI
2593 BOOLEAN
2594 NTAPI
2595 MmIsNonPagedSystemAddressValid(
2596 IN PVOID VirtualAddress);
2597
2598 NTKERNELAPI
2599 PVOID
2600 NTAPI
2601 MmAllocateNonCachedMemory(
2602 IN SIZE_T NumberOfBytes);
2603
2604 NTKERNELAPI
2605 VOID
2606 NTAPI
2607 MmFreeNonCachedMemory(
2608 IN PVOID BaseAddress,
2609 IN SIZE_T NumberOfBytes);
2610
2611 NTKERNELAPI
2612 PVOID
2613 NTAPI
2614 MmGetVirtualForPhysical(
2615 IN PHYSICAL_ADDRESS PhysicalAddress);
2616
2617 NTKERNELAPI
2618 NTSTATUS
2619 NTAPI
2620 MmMapUserAddressesToPage(
2621 IN PVOID BaseAddress,
2622 IN SIZE_T NumberOfBytes,
2623 IN PVOID PageAddress);
2624
2625 NTKERNELAPI
2626 PVOID
2627 NTAPI
2628 MmMapVideoDisplay(
2629 IN PHYSICAL_ADDRESS PhysicalAddress,
2630 IN SIZE_T NumberOfBytes,
2631 IN MEMORY_CACHING_TYPE CacheType);
2632
2633 NTKERNELAPI
2634 NTSTATUS
2635 NTAPI
2636 MmMapViewInSessionSpace(
2637 IN PVOID Section,
2638 OUT PVOID *MappedBase,
2639 IN OUT PSIZE_T ViewSize);
2640
2641 NTKERNELAPI
2642 NTSTATUS
2643 NTAPI
2644 MmMapViewInSystemSpace(
2645 IN PVOID Section,
2646 OUT PVOID *MappedBase,
2647 IN OUT PSIZE_T ViewSize);
2648
2649 NTKERNELAPI
2650 BOOLEAN
2651 NTAPI
2652 MmIsAddressValid(
2653 IN PVOID VirtualAddress);
2654
2655 NTKERNELAPI
2656 BOOLEAN
2657 NTAPI
2658 MmIsThisAnNtAsSystem(VOID);
2659
2660 NTKERNELAPI
2661 VOID
2662 NTAPI
2663 MmLockPagableSectionByHandle(
2664 IN PVOID ImageSectionHandle);
2665
2666 NTKERNELAPI
2667 NTSTATUS
2668 NTAPI
2669 MmUnmapViewInSessionSpace(
2670 IN PVOID MappedBase);
2671
2672 NTKERNELAPI
2673 NTSTATUS
2674 NTAPI
2675 MmUnmapViewInSystemSpace(
2676 IN PVOID MappedBase);
2677
2678 NTKERNELAPI
2679 VOID
2680 NTAPI
2681 MmUnsecureVirtualMemory(
2682 IN HANDLE SecureHandle);
2683
2684 NTKERNELAPI
2685 NTSTATUS
2686 NTAPI
2687 MmRemovePhysicalMemory(
2688 IN PPHYSICAL_ADDRESS StartAddress,
2689 IN OUT PLARGE_INTEGER NumberOfBytes);
2690
2691 NTKERNELAPI
2692 HANDLE
2693 NTAPI
2694 MmSecureVirtualMemory(
2695 IN PVOID Address,
2696 IN SIZE_T Size,
2697 IN ULONG ProbeMode);
2698
2699 NTKERNELAPI
2700 VOID
2701 NTAPI
2702 MmUnmapVideoDisplay(
2703 IN PVOID BaseAddress,
2704 IN SIZE_T NumberOfBytes);
2705
2706 NTKERNELAPI
2707 NTSTATUS
2708 NTAPI
2709 MmAddPhysicalMemory(
2710 IN PPHYSICAL_ADDRESS StartAddress,
2711 IN OUT PLARGE_INTEGER NumberOfBytes);
2712
2713 NTKERNELAPI
2714 PVOID
2715 NTAPI
2716 MmAllocateContiguousMemory(
2717 IN SIZE_T NumberOfBytes,
2718 IN PHYSICAL_ADDRESS HighestAcceptableAddress);
2719
2720 NTKERNELAPI
2721 PVOID
2722 NTAPI
2723 MmAllocateContiguousMemorySpecifyCache(
2724 IN SIZE_T NumberOfBytes,
2725 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
2726 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
2727 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
2728 IN MEMORY_CACHING_TYPE CacheType);
2729
2730 NTKERNELAPI
2731 PVOID
2732 NTAPI
2733 MmAllocateContiguousMemorySpecifyCacheNode(
2734 IN SIZE_T NumberOfBytes,
2735 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
2736 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
2737 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
2738 IN MEMORY_CACHING_TYPE CacheType,
2739 IN NODE_REQUIREMENT PreferredNode);
2740
2741 NTKERNELAPI
2742 VOID
2743 NTAPI
2744 MmFreeContiguousMemory(
2745 IN PVOID BaseAddress);
2746
2747 NTKERNELAPI
2748 VOID
2749 NTAPI
2750 MmFreeContiguousMemorySpecifyCache(
2751 IN PVOID BaseAddress,
2752 IN SIZE_T NumberOfBytes,
2753 IN MEMORY_CACHING_TYPE CacheType);
2754
2755 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
2756
2757 #if (NTDDI_VERSION >= NTDDI_WS03)
2758 NTKERNELAPI
2759 NTSTATUS
2760 NTAPI
2761 MmCreateMirror(VOID);
2762 #endif
2763
2764 #if (NTDDI_VERSION >= NTDDI_VISTA)
2765 NTSTATUS
2766 NTAPI
2767 MmRotatePhysicalView(
2768 IN PVOID VirtualAddress,
2769 IN OUT PSIZE_T NumberOfBytes,
2770 IN PMDLX NewMdl OPTIONAL,
2771 IN MM_ROTATE_DIRECTION Direction,
2772 IN PMM_ROTATE_COPY_CALLBACK_FUNCTION CopyFunction,
2773 IN PVOID Context OPTIONAL);
2774 #endif
2775
2776 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2777 NTKERNELAPI
2778 BOOLEAN
2779 NTAPI
2780 SeSinglePrivilegeCheck(
2781 IN LUID PrivilegeValue,
2782 IN KPROCESSOR_MODE PreviousMode);
2783 #endif
2784
2785 extern NTKERNELAPI PEPROCESS PsInitialSystemProcess;
2786
2787 #if !defined(_PSGETCURRENTTHREAD_)
2788 #define _PSGETCURRENTTHREAD_
2789
2790 FORCEINLINE
2791 PETHREAD
2792 NTAPI
2793 PsGetCurrentThread(VOID)
2794 {
2795 return (PETHREAD)KeGetCurrentThread();
2796 }
2797
2798 #endif
2799
2800 /** Process Manager types **/
2801
2802 typedef VOID
2803 (NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)(
2804 IN HANDLE ParentId,
2805 IN HANDLE ProcessId,
2806 IN BOOLEAN Create);
2807
2808 typedef struct _PS_CREATE_NOTIFY_INFO {
2809 IN SIZE_T Size;
2810 union {
2811 IN ULONG Flags;
2812 struct {
2813 IN ULONG FileOpenNameAvailable:1;
2814 IN ULONG Reserved:31;
2815 };
2816 };
2817 IN HANDLE ParentProcessId;
2818 IN CLIENT_ID CreatingThreadId;
2819 IN OUT struct _FILE_OBJECT *FileObject;
2820 IN PCUNICODE_STRING ImageFileName;
2821 IN PCUNICODE_STRING CommandLine OPTIONAL;
2822 IN OUT NTSTATUS CreationStatus;
2823 } PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO;
2824
2825 typedef VOID
2826 (NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE_EX)(
2827 IN OUT PEPROCESS Process,
2828 IN HANDLE ProcessId,
2829 IN PPS_CREATE_NOTIFY_INFO CreateInfo OPTIONAL);
2830
2831 typedef VOID
2832 (NTAPI *PCREATE_THREAD_NOTIFY_ROUTINE)(
2833 IN HANDLE ProcessId,
2834 IN HANDLE ThreadId,
2835 IN BOOLEAN Create);
2836
2837 #define IMAGE_ADDRESSING_MODE_32BIT 3
2838
2839 typedef struct _IMAGE_INFO {
2840 _ANONYMOUS_UNION union {
2841 ULONG Properties;
2842 _ANONYMOUS_STRUCT struct {
2843 ULONG ImageAddressingMode:8;
2844 ULONG SystemModeImage:1;
2845 ULONG ImageMappedToAllPids:1;
2846 ULONG ExtendedInfoPresent:1;
2847 ULONG Reserved:21;
2848 } DUMMYSTRUCTNAME;
2849 } DUMMYUNIONNAME;
2850 PVOID ImageBase;
2851 ULONG ImageSelector;
2852 SIZE_T ImageSize;
2853 ULONG ImageSectionNumber;
2854 } IMAGE_INFO, *PIMAGE_INFO;
2855
2856 typedef struct _IMAGE_INFO_EX {
2857 SIZE_T Size;
2858 IMAGE_INFO ImageInfo;
2859 struct _FILE_OBJECT *FileObject;
2860 } IMAGE_INFO_EX, *PIMAGE_INFO_EX;
2861
2862 typedef VOID
2863 (NTAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)(
2864 IN PUNICODE_STRING FullImageName,
2865 IN HANDLE ProcessId,
2866 IN PIMAGE_INFO ImageInfo);
2867
2868 /** Process Manager functions **/
2869
2870 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2871
2872 NTKERNELAPI
2873 NTSTATUS
2874 NTAPI
2875 PsSetCreateProcessNotifyRoutine(
2876 IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
2877 IN BOOLEAN Remove);
2878
2879 NTKERNELAPI
2880 NTSTATUS
2881 NTAPI
2882 PsSetCreateThreadNotifyRoutine(
2883 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
2884
2885 NTKERNELAPI
2886 NTSTATUS
2887 NTAPI
2888 PsSetLoadImageNotifyRoutine(
2889 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
2890
2891 NTKERNELAPI
2892 HANDLE
2893 NTAPI
2894 PsGetCurrentProcessId(VOID);
2895
2896 NTKERNELAPI
2897 HANDLE
2898 NTAPI
2899 PsGetCurrentThreadId(VOID);
2900
2901 NTKERNELAPI
2902 BOOLEAN
2903 NTAPI
2904 PsGetVersion(
2905 OUT PULONG MajorVersion OPTIONAL,
2906 OUT PULONG MinorVersion OPTIONAL,
2907 OUT PULONG BuildNumber OPTIONAL,
2908 OUT PUNICODE_STRING CSDVersion OPTIONAL);
2909
2910 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
2911
2912 #if (NTDDI_VERSION >= NTDDI_WINXP)
2913
2914 NTKERNELAPI
2915 HANDLE
2916 NTAPI
2917 PsGetProcessId(
2918 IN PEPROCESS Process);
2919
2920 NTKERNELAPI
2921 HANDLE
2922 NTAPI
2923 PsGetThreadId(
2924 IN PETHREAD Thread);
2925
2926 NTKERNELAPI
2927 NTSTATUS
2928 NTAPI
2929 PsRemoveCreateThreadNotifyRoutine(
2930 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
2931
2932 NTKERNELAPI
2933 NTSTATUS
2934 NTAPI
2935 PsRemoveLoadImageNotifyRoutine(
2936 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
2937
2938 NTKERNELAPI
2939 LONGLONG
2940 NTAPI
2941 PsGetProcessCreateTimeQuadPart(
2942 IN PEPROCESS Process);
2943
2944 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
2945
2946 #if (NTDDI_VERSION >= NTDDI_WS03)
2947 NTKERNELAPI
2948 HANDLE
2949 NTAPI
2950 PsGetThreadProcessId(
2951 IN PETHREAD Thread);
2952 #endif
2953
2954 #if (NTDDI_VERSION >= NTDDI_VISTA)
2955
2956 NTKERNELAPI
2957 BOOLEAN
2958 NTAPI
2959 PsSetCurrentThreadPrefetching(
2960 IN BOOLEAN Prefetching);
2961
2962 NTKERNELAPI
2963 BOOLEAN
2964 NTAPI
2965 PsIsCurrentThreadPrefetching(VOID);
2966
2967 #endif
2968
2969 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
2970 NTKERNELAPI
2971 NTSTATUS
2972 NTAPI
2973 PsSetCreateProcessNotifyRoutineEx(
2974 IN PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine,
2975 IN BOOLEAN Remove);
2976 #endif
2977
2978 /* I/O Manager Types */
2979
2980 /*
2981 ** IRP function codes
2982 */
2983
2984 #define IRP_MN_QUERY_DIRECTORY 0x01
2985 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02
2986
2987 #define IRP_MN_USER_FS_REQUEST 0x00
2988 #define IRP_MN_MOUNT_VOLUME 0x01
2989 #define IRP_MN_VERIFY_VOLUME 0x02
2990 #define IRP_MN_LOAD_FILE_SYSTEM 0x03
2991 #define IRP_MN_TRACK_LINK 0x04
2992 #define IRP_MN_KERNEL_CALL 0x04
2993
2994 #define IRP_MN_LOCK 0x01
2995 #define IRP_MN_UNLOCK_SINGLE 0x02
2996 #define IRP_MN_UNLOCK_ALL 0x03
2997 #define IRP_MN_UNLOCK_ALL_BY_KEY 0x04
2998
2999 #define IRP_MN_FLUSH_AND_PURGE 0x01
3000
3001 #define IRP_MN_NORMAL 0x00
3002 #define IRP_MN_DPC 0x01
3003 #define IRP_MN_MDL 0x02
3004 #define IRP_MN_COMPLETE 0x04
3005 #define IRP_MN_COMPRESSED 0x08
3006
3007 #define IRP_MN_MDL_DPC (IRP_MN_MDL | IRP_MN_DPC)
3008 #define IRP_MN_COMPLETE_MDL (IRP_MN_COMPLETE | IRP_MN_MDL)
3009 #define IRP_MN_COMPLETE_MDL_DPC (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
3010
3011 #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
3012
3013 #define IO_CHECK_CREATE_PARAMETERS 0x0200
3014 #define IO_ATTACH_DEVICE 0x0400
3015 #define IO_IGNORE_SHARE_ACCESS_CHECK 0x0800
3016
3017 typedef
3018 NTSTATUS
3019 (NTAPI *PIO_QUERY_DEVICE_ROUTINE)(
3020 IN PVOID Context,
3021 IN PUNICODE_STRING PathName,
3022 IN INTERFACE_TYPE BusType,
3023 IN ULONG BusNumber,
3024 IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
3025 IN CONFIGURATION_TYPE ControllerType,
3026 IN ULONG ControllerNumber,
3027 IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
3028 IN CONFIGURATION_TYPE PeripheralType,
3029 IN ULONG PeripheralNumber,
3030 IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation);
3031
3032 typedef enum _IO_QUERY_DEVICE_DATA_FORMAT {
3033 IoQueryDeviceIdentifier = 0,
3034 IoQueryDeviceConfigurationData,
3035 IoQueryDeviceComponentInformation,
3036 IoQueryDeviceMaxData
3037 } IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT;
3038
3039 typedef VOID
3040 (NTAPI *PDRIVER_REINITIALIZE)(
3041 IN struct _DRIVER_OBJECT *DriverObject,
3042 IN PVOID Context OPTIONAL,
3043 IN ULONG Count);
3044
3045 typedef struct _CONTROLLER_OBJECT {
3046 CSHORT Type;
3047 CSHORT Size;
3048 PVOID ControllerExtension;
3049 KDEVICE_QUEUE DeviceWaitQueue;
3050 ULONG Spare1;
3051 LARGE_INTEGER Spare2;
3052 } CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
3053
3054 /* DEVICE_OBJECT.Flags */
3055
3056 #define DO_VERIFY_VOLUME 0x00000002
3057 #define DO_BUFFERED_IO 0x00000004
3058 #define DO_EXCLUSIVE 0x00000008
3059 #define DO_DIRECT_IO 0x00000010
3060 #define DO_MAP_IO_BUFFER 0x00000020
3061 #define DO_DEVICE_HAS_NAME 0x00000040
3062 #define DO_DEVICE_INITIALIZING 0x00000080
3063 #define DO_SYSTEM_BOOT_PARTITION 0x00000100
3064 #define DO_LONG_TERM_REQUESTS 0x00000200
3065 #define DO_NEVER_LAST_DEVICE 0x00000400
3066 #define DO_SHUTDOWN_REGISTERED 0x00000800
3067 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
3068 #define DO_POWER_PAGABLE 0x00002000
3069 #define DO_POWER_INRUSH 0x00004000
3070 #define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
3071 #define DO_SUPPORTS_TRANSACTIONS 0x00040000
3072 #define DO_FORCE_NEITHER_IO 0x00080000
3073 #define DO_VOLUME_DEVICE_OBJECT 0x00100000
3074 #define DO_SYSTEM_SYSTEM_PARTITION 0x00200000
3075 #define DO_SYSTEM_CRITICAL_PARTITION 0x00400000
3076 #define DO_DISALLOW_EXECUTE 0x00800000
3077
3078 #define DRVO_REINIT_REGISTERED 0x00000008
3079 #define DRVO_INITIALIZED 0x00000010
3080 #define DRVO_BOOTREINIT_REGISTERED 0x00000020
3081 #define DRVO_LEGACY_RESOURCES 0x00000040
3082
3083 typedef struct _CONFIGURATION_INFORMATION {
3084 ULONG DiskCount;
3085 ULONG FloppyCount;
3086 ULONG CdRomCount;
3087 ULONG TapeCount;
3088 ULONG ScsiPortCount;
3089 ULONG SerialCount;
3090 ULONG ParallelCount;
3091 BOOLEAN AtDiskPrimaryAddressClaimed;
3092 BOOLEAN AtDiskSecondaryAddressClaimed;
3093 ULONG Version;
3094 ULONG MediumChangerCount;
3095 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
3096
3097 typedef struct _DISK_SIGNATURE {
3098 ULONG PartitionStyle;
3099 _ANONYMOUS_UNION union {
3100 struct {
3101 ULONG Signature;
3102 ULONG CheckSum;
3103 } Mbr;
3104 struct {
3105 GUID DiskId;
3106 } Gpt;
3107 } DUMMYUNIONNAME;
3108 } DISK_SIGNATURE, *PDISK_SIGNATURE;
3109
3110 typedef struct _TXN_PARAMETER_BLOCK {
3111 USHORT Length;
3112 USHORT TxFsContext;
3113 PVOID TransactionObject;
3114 } TXN_PARAMETER_BLOCK, *PTXN_PARAMETER_BLOCK;
3115
3116 #define TXF_MINIVERSION_DEFAULT_VIEW (0xFFFE)
3117
3118 typedef struct _IO_DRIVER_CREATE_CONTEXT {
3119 CSHORT Size;
3120 struct _ECP_LIST *ExtraCreateParameter;
3121 PVOID DeviceObjectHint;
3122 PTXN_PARAMETER_BLOCK TxnParameters;
3123 } IO_DRIVER_CREATE_CONTEXT, *PIO_DRIVER_CREATE_CONTEXT;
3124
3125 typedef struct _AGP_TARGET_BUS_INTERFACE_STANDARD {
3126 USHORT Size;
3127 USHORT Version;
3128 PVOID Context;
3129 PINTERFACE_REFERENCE InterfaceReference;
3130 PINTERFACE_DEREFERENCE InterfaceDereference;
3131 PGET_SET_DEVICE_DATA SetBusData;
3132 PGET_SET_DEVICE_DATA GetBusData;
3133 UCHAR CapabilityID;
3134 } AGP_TARGET_BUS_INTERFACE_STANDARD, *PAGP_TARGET_BUS_INTERFACE_STANDARD;
3135
3136 typedef NTSTATUS
3137 (NTAPI *PGET_LOCATION_STRING)(
3138 IN OUT PVOID Context OPTIONAL,
3139 OUT PWCHAR *LocationStrings);
3140
3141 typedef struct _PNP_LOCATION_INTERFACE {
3142 USHORT Size;
3143 USHORT Version;
3144 PVOID Context;
3145 PINTERFACE_REFERENCE InterfaceReference;
3146 PINTERFACE_DEREFERENCE InterfaceDereference;
3147 PGET_LOCATION_STRING GetLocationString;
3148 } PNP_LOCATION_INTERFACE, *PPNP_LOCATION_INTERFACE;
3149
3150 typedef enum _ARBITER_ACTION {
3151 ArbiterActionTestAllocation,
3152 ArbiterActionRetestAllocation,
3153 ArbiterActionCommitAllocation,
3154 ArbiterActionRollbackAllocation,
3155 ArbiterActionQueryAllocatedResources,
3156 ArbiterActionWriteReservedResources,
3157 ArbiterActionQueryConflict,
3158 ArbiterActionQueryArbitrate,
3159 ArbiterActionAddReserved,
3160 ArbiterActionBootAllocation
3161 } ARBITER_ACTION, *PARBITER_ACTION;
3162
3163 typedef struct _ARBITER_CONFLICT_INFO {
3164 PDEVICE_OBJECT OwningObject;
3165 ULONGLONG Start;
3166 ULONGLONG End;
3167 } ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO;
3168
3169 typedef struct _ARBITER_TEST_ALLOCATION_PARAMETERS {
3170 IN OUT PLIST_ENTRY ArbitrationList;
3171 IN ULONG AllocateFromCount;
3172 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
3173 } ARBITER_TEST_ALLOCATION_PARAMETERS, *PARBITER_TEST_ALLOCATION_PARAMETERS;
3174
3175 typedef struct _ARBITER_RETEST_ALLOCATION_PARAMETERS {
3176 IN OUT PLIST_ENTRY ArbitrationList;
3177 IN ULONG AllocateFromCount;
3178 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
3179 } ARBITER_RETEST_ALLOCATION_PARAMETERS, *PARBITER_RETEST_ALLOCATION_PARAMETERS;
3180
3181 typedef struct _ARBITER_BOOT_ALLOCATION_PARAMETERS {
3182 IN OUT PLIST_ENTRY ArbitrationList;
3183 } ARBITER_BOOT_ALLOCATION_PARAMETERS, *PARBITER_BOOT_ALLOCATION_PARAMETERS;
3184
3185 typedef struct _ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS {
3186 OUT PCM_PARTIAL_RESOURCE_LIST *AllocatedResources;
3187 } ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS, *PARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS;
3188
3189 typedef struct _ARBITER_QUERY_CONFLICT_PARAMETERS {
3190 IN PDEVICE_OBJECT PhysicalDeviceObject;
3191 IN PIO_RESOURCE_DESCRIPTOR ConflictingResource;
3192 OUT PULONG ConflictCount;
3193 OUT PARBITER_CONFLICT_INFO *Conflicts;
3194 } ARBITER_QUERY_CONFLICT_PARAMETERS, *PARBITER_QUERY_CONFLICT_PARAMETERS;
3195
3196 typedef struct _ARBITER_QUERY_ARBITRATE_PARAMETERS {
3197 IN PLIST_ENTRY ArbitrationList;
3198 } ARBITER_QUERY_ARBITRATE_PARAMETERS, *PARBITER_QUERY_ARBITRATE_PARAMETERS;
3199
3200 typedef struct _ARBITER_ADD_RESERVED_PARAMETERS {
3201 IN PDEVICE_OBJECT ReserveDevice;
3202 } ARBITER_ADD_RESERVED_PARAMETERS, *PARBITER_ADD_RESERVED_PARAMETERS;
3203
3204 typedef struct _ARBITER_PARAMETERS {
3205 union {
3206 ARBITER_TEST_ALLOCATION_PARAMETERS TestAllocation;
3207 ARBITER_RETEST_ALLOCATION_PARAMETERS RetestAllocation;
3208 ARBITER_BOOT_ALLOCATION_PARAMETERS BootAllocation;
3209 ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS QueryAllocatedResources;
3210 ARBITER_QUERY_CONFLICT_PARAMETERS QueryConflict;
3211 ARBITER_QUERY_ARBITRATE_PARAMETERS QueryArbitrate;
3212 ARBITER_ADD_RESERVED_PARAMETERS AddReserved;
3213 } Parameters;
3214 } ARBITER_PARAMETERS, *PARBITER_PARAMETERS;
3215
3216 typedef enum _ARBITER_REQUEST_SOURCE {
3217 ArbiterRequestUndefined = -1,
3218 ArbiterRequestLegacyReported,
3219 ArbiterRequestHalReported,
3220 ArbiterRequestLegacyAssigned,
3221 ArbiterRequestPnpDetected,
3222 ArbiterRequestPnpEnumerated
3223 } ARBITER_REQUEST_SOURCE;
3224
3225 typedef enum _ARBITER_RESULT {
3226 ArbiterResultUndefined = -1,
3227 ArbiterResultSuccess,
3228 ArbiterResultExternalConflict,
3229 ArbiterResultNullRequest
3230 } ARBITER_RESULT;
3231
3232 #define ARBITER_FLAG_BOOT_CONFIG 0x00000001
3233
3234 typedef struct _ARBITER_LIST_ENTRY {
3235 LIST_ENTRY ListEntry;
3236 ULONG AlternativeCount;
3237 PIO_RESOURCE_DESCRIPTOR Alternatives;
3238 PDEVICE_OBJECT PhysicalDeviceObject;
3239 ARBITER_REQUEST_SOURCE RequestSource;
3240 ULONG Flags;
3241 LONG_PTR WorkSpace;
3242 INTERFACE_TYPE InterfaceType;
3243 ULONG SlotNumber;
3244 ULONG BusNumber;
3245 PCM_PARTIAL_RESOURCE_DESCRIPTOR Assignment;
3246 PIO_RESOURCE_DESCRIPTOR SelectedAlternative;
3247 ARBITER_RESULT Result;
3248 } ARBITER_LIST_ENTRY, *PARBITER_LIST_ENTRY;
3249
3250 typedef NTSTATUS
3251 (NTAPI *PARBITER_HANDLER)(
3252 IN OUT PVOID Context,
3253 IN ARBITER_ACTION Action,
3254 IN OUT PARBITER_PARAMETERS Parameters);
3255
3256 #define ARBITER_PARTIAL 0x00000001
3257
3258 typedef struct _ARBITER_INTERFACE {
3259 USHORT Size;
3260 USHORT Version;
3261 PVOID Context;
3262 PINTERFACE_REFERENCE InterfaceReference;
3263 PINTERFACE_DEREFERENCE InterfaceDereference;
3264 PARBITER_HANDLER ArbiterHandler;
3265 ULONG Flags;
3266 } ARBITER_INTERFACE, *PARBITER_INTERFACE;
3267
3268 typedef enum _RESOURCE_TRANSLATION_DIRECTION {
3269 TranslateChildToParent,
3270 TranslateParentToChild
3271 } RESOURCE_TRANSLATION_DIRECTION;
3272
3273 typedef NTSTATUS
3274 (NTAPI *PTRANSLATE_RESOURCE_HANDLER)(
3275 IN OUT PVOID Context OPTIONAL,
3276 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source,
3277 IN RESOURCE_TRANSLATION_DIRECTION Direction,
3278 IN ULONG AlternativesCount OPTIONAL,
3279 IN IO_RESOURCE_DESCRIPTOR Alternatives[],
3280 IN PDEVICE_OBJECT PhysicalDeviceObject,
3281 OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target);
3282
3283 typedef NTSTATUS
3284 (NTAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)(
3285 IN OUT PVOID Context OPTIONAL,
3286 IN PIO_RESOURCE_DESCRIPTOR Source,
3287 IN PDEVICE_OBJECT PhysicalDeviceObject,
3288 OUT PULONG TargetCount,
3289 OUT PIO_RESOURCE_DESCRIPTOR *Target);
3290
3291 typedef struct _TRANSLATOR_INTERFACE {
3292 USHORT Size;
3293 USHORT Version;
3294 PVOID Context;
3295 PINTERFACE_REFERENCE InterfaceReference;
3296 PINTERFACE_DEREFERENCE InterfaceDereference;
3297 PTRANSLATE_RESOURCE_HANDLER TranslateResources;
3298 PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements;
3299 } TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE;
3300
3301 /* I/O Manager Functions */
3302
3303 /*
3304 * VOID IoAssignArcName(
3305 * IN PUNICODE_STRING ArcName,
3306 * IN PUNICODE_STRING DeviceName);
3307 */
3308 #define IoAssignArcName(_ArcName, _DeviceName) ( \
3309 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
3310
3311 /*
3312 * VOID
3313 * IoDeassignArcName(
3314 * IN PUNICODE_STRING ArcName)
3315 */
3316 #define IoDeassignArcName IoDeleteSymbolicLink
3317
3318 VOID
3319 FORCEINLINE
3320 NTAPI
3321 IoInitializeDriverCreateContext(
3322 PIO_DRIVER_CREATE_CONTEXT DriverContext)
3323 {
3324 RtlZeroMemory(DriverContext, sizeof(IO_DRIVER_CREATE_CONTEXT));
3325 DriverContext->Size = sizeof(IO_DRIVER_CREATE_CONTEXT);
3326 }
3327
3328 #if (NTDDI_VERSION >= NTDDI_WIN2K)
3329
3330 #if !(defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_))
3331 NTKERNELAPI
3332 NTSTATUS
3333 NTAPI
3334 IoAllocateAdapterChannel(
3335 IN PADAPTER_OBJECT AdapterObject,
3336 IN PDEVICE_OBJECT DeviceObject,
3337 IN ULONG NumberOfMapRegisters,
3338 IN PDRIVER_CONTROL ExecutionRoutine,
3339 IN PVOID Context);
3340 #endif
3341
3342 //DECLSPEC_DEPRECATED_DDK
3343 NTHALAPI
3344 PHYSICAL_ADDRESS
3345 NTAPI
3346 IoMapTransfer(
3347 IN PADAPTER_OBJECT AdapterObject,
3348 IN PMDL Mdl,
3349 IN PVOID MapRegisterBase,
3350 IN PVOID CurrentVa,
3351 IN OUT PULONG Length,
3352 IN BOOLEAN WriteToDevice);
3353
3354 NTKERNELAPI
3355 VOID
3356 NTAPI
3357 IoAllocateController(
3358 IN PCONTROLLER_OBJECT ControllerObject,
3359 IN PDEVICE_OBJECT DeviceObject,
3360 IN PDRIVER_CONTROL ExecutionRoutine,
3361 IN PVOID Context OPTIONAL);
3362
3363 NTKERNELAPI
3364 PCONTROLLER_OBJECT
3365 NTAPI
3366 IoCreateController(
3367 IN ULONG Size);
3368
3369 NTKERNELAPI
3370 VOID
3371 NTAPI
3372 IoDeleteController(
3373 IN PCONTROLLER_OBJECT ControllerObject);
3374
3375 NTKERNELAPI
3376 VOID
3377 NTAPI
3378 IoFreeController(
3379 IN PCONTROLLER_OBJECT ControllerObject);
3380
3381 NTKERNELAPI
3382 PCONFIGURATION_INFORMATION
3383 NTAPI
3384 IoGetConfigurationInformation(VOID);
3385
3386 NTKERNELAPI
3387 PDEVICE_OBJECT
3388 NTAPI
3389 IoGetDeviceToVerify(
3390 IN PETHREAD Thread);
3391
3392 NTKERNELAPI
3393 VOID
3394 NTAPI
3395 IoCancelFileOpen(
3396 IN PDEVICE_OBJECT DeviceObject,
3397 IN PFILE_OBJECT FileObject);
3398
3399 NTKERNELAPI
3400 PGENERIC_MAPPING
3401 NTAPI
3402 IoGetFileObjectGenericMapping(VOID);
3403
3404 NTKERNELAPI
3405 PIRP
3406 NTAPI
3407 IoMakeAssociatedIrp(
3408 IN PIRP Irp,
3409 IN CCHAR StackSize);
3410
3411 NTKERNELAPI
3412 NTSTATUS
3413 NTAPI
3414 IoQueryDeviceDescription(
3415 IN PINTERFACE_TYPE BusType OPTIONAL,
3416 IN PULONG BusNumber OPTIONAL,
3417 IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
3418 IN PULONG ControllerNumber OPTIONAL,
3419 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
3420 IN PULONG PeripheralNumber OPTIONAL,
3421 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
3422 IN OUT PVOID Context OPTIONAL);
3423
3424 NTKERNELAPI
3425 VOID
3426 NTAPI
3427 IoRaiseHardError(
3428 IN PIRP Irp,
3429 IN PVPB Vpb OPTIONAL,
3430 IN PDEVICE_OBJECT RealDeviceObject);
3431
3432 NTKERNELAPI
3433 BOOLEAN
3434 NTAPI
3435 IoRaiseInformationalHardError(
3436 IN NTSTATUS ErrorStatus,
3437 IN PUNICODE_STRING String OPTIONAL,
3438 IN PKTHREAD Thread OPTIONAL);
3439
3440 NTKERNELAPI
3441 VOID
3442 NTAPI
3443 IoRegisterBootDriverReinitialization(
3444 IN PDRIVER_OBJECT DriverObject,
3445 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
3446 IN PVOID Context OPTIONAL);
3447
3448 NTKERNELAPI
3449 VOID
3450 NTAPI
3451 IoRegisterDriverReinitialization(
3452 IN PDRIVER_OBJECT DriverObject,
3453 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
3454 IN PVOID Context OPTIONAL);
3455
3456 NTKERNELAPI
3457 NTSTATUS
3458 NTAPI
3459 IoAttachDeviceByPointer(
3460 IN PDEVICE_OBJECT SourceDevice,
3461 IN PDEVICE_OBJECT TargetDevice);
3462
3463 NTKERNELAPI
3464 NTSTATUS
3465 NTAPI
3466 IoReportDetectedDevice(
3467 IN PDRIVER_OBJECT DriverObject,
3468 IN INTERFACE_TYPE LegacyBusType,
3469 IN ULONG BusNumber,
3470 IN ULONG SlotNumber,
3471 IN PCM_RESOURCE_LIST ResourceList OPTIONAL,
3472 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
3473 IN BOOLEAN ResourceAssigned,
3474 IN OUT PDEVICE_OBJECT *DeviceObject OPTIONAL);
3475
3476 NTKERNELAPI
3477 NTSTATUS
3478 NTAPI
3479 IoReportResourceForDetection(
3480 IN PDRIVER_OBJECT DriverObject,
3481 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
3482 IN ULONG DriverListSize OPTIONAL,
3483 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
3484 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
3485 IN ULONG DeviceListSize OPTIONAL,
3486 OUT PBOOLEAN ConflictDetected);
3487
3488 NTKERNELAPI
3489 NTSTATUS
3490 NTAPI
3491 IoReportResourceUsage(
3492 IN PUNICODE_STRING DriverClassName OPTIONAL,
3493 IN PDRIVER_OBJECT DriverObject,
3494 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
3495 IN ULONG DriverListSize OPTIONAL,
3496 IN PDEVICE_OBJECT DeviceObject,
3497 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
3498 IN ULONG DeviceListSize OPTIONAL,
3499 IN BOOLEAN OverrideConflict,
3500 OUT PBOOLEAN ConflictDetected);
3501
3502 NTKERNELAPI
3503 VOID
3504 NTAPI
3505 IoSetHardErrorOrVerifyDevice(
3506 IN PIRP Irp,
3507 IN PDEVICE_OBJECT DeviceObject);
3508
3509 NTKERNELAPI
3510 NTSTATUS
3511 NTAPI
3512 IoAssignResources(
3513 IN PUNICODE_STRING RegistryPath,
3514 IN PUNICODE_STRING DriverClassName OPTIONAL,
3515 IN PDRIVER_OBJECT DriverObject,
3516 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
3517 IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources OPTIONAL,
3518 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
3519
3520 NTKERNELAPI
3521 BOOLEAN
3522 NTAPI
3523 IoSetThreadHardErrorMode(
3524 IN BOOLEAN EnableHardErrors);
3525
3526 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
3527
3528 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
3529
3530 NTKERNELAPI
3531 BOOLEAN
3532 NTAPI
3533 IoIsFileOriginRemote(
3534 IN PFILE_OBJECT FileObject);
3535
3536 NTKERNELAPI
3537 NTSTATUS
3538 NTAPI
3539 IoSetFileOrigin(
3540 IN PFILE_OBJECT FileObject,
3541 IN BOOLEAN Remote);
3542
3543 #endif
3544
3545 #if (NTDDI_VERSION >= NTDDI_WINXP)
3546
3547 NTKERNELAPI
3548 NTSTATUS
3549 FASTCALL
3550 IoReadPartitionTable(
3551 IN PDEVICE_OBJECT DeviceObject,
3552 IN ULONG SectorSize,
3553 IN BOOLEAN ReturnRecognizedPartitions,
3554 OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
3555
3556 NTKERNELAPI
3557 NTSTATUS
3558 FASTCALL
3559 IoSetPartitionInformation(
3560 IN PDEVICE_OBJECT DeviceObject,
3561 IN ULONG SectorSize,
3562 IN ULONG PartitionNumber,
3563 IN ULONG PartitionType);
3564
3565 NTKERNELAPI
3566 NTSTATUS
3567 FASTCALL
3568 IoWritePartitionTable(
3569 IN PDEVICE_OBJECT DeviceObject,
3570 IN ULONG SectorSize,
3571 IN ULONG SectorsPerTrack,
3572 IN ULONG NumberOfHeads,
3573 IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
3574
3575 NTKERNELAPI
3576 NTSTATUS
3577 NTAPI
3578 IoCreateDisk(
3579 IN PDEVICE_OBJECT DeviceObject,
3580 IN struct _CREATE_DISK* Disk OPTIONAL);
3581
3582 NTKERNELAPI
3583 NTSTATUS
3584 NTAPI
3585 IoReadDiskSignature(
3586 IN PDEVICE_OBJECT DeviceObject,
3587 IN ULONG BytesPerSector,
3588 OUT PDISK_SIGNATURE Signature);
3589
3590 NTKERNELAPI
3591 NTSTATUS
3592 NTAPI
3593 IoReadPartitionTableEx(
3594 IN PDEVICE_OBJECT DeviceObject,
3595 OUT struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
3596
3597 NTKERNELAPI
3598 NTSTATUS
3599 NTAPI
3600 IoSetPartitionInformationEx(
3601 IN PDEVICE_OBJECT DeviceObject,
3602 IN ULONG PartitionNumber,
3603 IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
3604
3605 NTKERNELAPI
3606 NTSTATUS
3607 NTAPI
3608 IoSetSystemPartition(
3609 IN PUNICODE_STRING VolumeNameString);
3610
3611 NTKERNELAPI
3612 NTSTATUS
3613 NTAPI
3614 IoVerifyPartitionTable(
3615 IN PDEVICE_OBJECT DeviceObject,
3616 IN BOOLEAN FixErrors);
3617
3618 NTKERNELAPI
3619 NTSTATUS
3620 NTAPI
3621 IoVolumeDeviceToDosName(
3622 IN PVOID VolumeDeviceObject,
3623 OUT PUNICODE_STRING DosName);
3624
3625 NTKERNELAPI
3626 NTSTATUS
3627 NTAPI
3628 IoWritePartitionTableEx(
3629 IN PDEVICE_OBJECT DeviceObject,
3630 IN struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout);
3631
3632 NTKERNELAPI
3633 NTSTATUS
3634 NTAPI
3635 IoCreateFileSpecifyDeviceObjectHint(
3636 OUT PHANDLE FileHandle,
3637 IN ACCESS_MASK DesiredAccess,
3638 IN POBJECT_ATTRIBUTES ObjectAttributes,
3639 OUT PIO_STATUS_BLOCK IoStatusBlock,
3640 IN PLARGE_INTEGER AllocationSize OPTIONAL,
3641 IN ULONG FileAttributes,
3642 IN ULONG ShareAccess,
3643 IN ULONG Disposition,
3644 IN ULONG CreateOptions,
3645 IN PVOID EaBuffer OPTIONAL,
3646 IN ULONG EaLength,
3647 IN CREATE_FILE_TYPE CreateFileType,
3648 IN PVOID InternalParameters OPTIONAL,
3649 IN ULONG Options,
3650 IN PVOID DeviceObject OPTIONAL);
3651
3652 NTKERNELAPI
3653 NTSTATUS
3654 NTAPI
3655 IoAttachDeviceToDeviceStackSafe(
3656 IN PDEVICE_OBJECT SourceDevice,
3657 IN PDEVICE_OBJECT TargetDevice,
3658 OUT PDEVICE_OBJECT *AttachedToDeviceObject);
3659
3660 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
3661
3662 #if (NTDDI_VERSION >= NTDDI_WS03)
3663 NTKERNELAPI
3664 IO_PAGING_PRIORITY
3665 FASTCALL
3666 IoGetPagingIoPriority(
3667 IN PIRP Irp);
3668 #endif
3669
3670 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
3671 BOOLEAN
3672 NTAPI
3673 IoTranslateBusAddress(
3674 IN INTERFACE_TYPE InterfaceType,
3675 IN ULONG BusNumber,
3676 IN PHYSICAL_ADDRESS BusAddress,
3677 IN OUT PULONG AddressSpace,
3678 OUT PPHYSICAL_ADDRESS TranslatedAddress);
3679 #endif
3680
3681 #if (NTDDI_VERSION >= NTDDI_VISTA)
3682
3683 NTKERNELAPI
3684 NTSTATUS
3685 NTAPI
3686 IoUpdateDiskGeometry(
3687 IN PDEVICE_OBJECT DeviceObject,
3688 IN struct _DISK_GEOMETRY_EX* OldDiskGeometry,
3689 IN struct _DISK_GEOMETRY_EX* NewDiskGeometry);
3690
3691 PTXN_PARAMETER_BLOCK
3692 NTAPI
3693 IoGetTransactionParameterBlock(
3694 IN PFILE_OBJECT FileObject);
3695
3696 NTKERNELAPI
3697 NTSTATUS
3698 NTAPI
3699 IoCreateFileEx(
3700 OUT PHANDLE FileHandle,
3701 IN ACCESS_MASK DesiredAccess,
3702 IN POBJECT_ATTRIBUTES ObjectAttributes,
3703 OUT PIO_STATUS_BLOCK IoStatusBlock,
3704 IN PLARGE_INTEGER AllocationSize OPTIONAL,
3705 IN ULONG FileAttributes,
3706 IN ULONG ShareAccess,
3707 IN ULONG Disposition,
3708 IN ULONG CreateOptions,
3709 IN PVOID EaBuffer OPTIONAL,
3710 IN ULONG EaLength,
3711 IN CREATE_FILE_TYPE CreateFileType,
3712 IN PVOID InternalParameters OPTIONAL,
3713 IN ULONG Options,
3714 IN PIO_DRIVER_CREATE_CONTEXT DriverContext OPTIONAL);
3715
3716 NTSTATUS
3717 NTAPI
3718 IoSetIrpExtraCreateParameter(
3719 IN OUT PIRP Irp,
3720 IN struct _ECP_LIST *ExtraCreateParameter);
3721
3722 VOID
3723 NTAPI
3724 IoClearIrpExtraCreateParameter(
3725 IN OUT PIRP Irp);
3726
3727 NTSTATUS
3728 NTAPI
3729 IoGetIrpExtraCreateParameter(
3730 IN PIRP Irp,
3731 OUT struct _ECP_LIST **ExtraCreateParameter OPTIONAL);
3732
3733 BOOLEAN
3734 NTAPI
3735 IoIsFileObjectIgnoringSharing(
3736 IN PFILE_OBJECT FileObject);
3737
3738 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
3739
3740 #if (NTDDI_VERSION >= NTDDI_WIN7)
3741 NTSTATUS
3742 NTAPI
3743 IoSetFileObjectIgnoreSharing(
3744 IN PFILE_OBJECT FileObject);
3745 #endif
3746
3747 typedef BOOLEAN
3748 (NTAPI *PHAL_RESET_DISPLAY_PARAMETERS)(
3749 IN ULONG Columns,
3750 IN ULONG Rows);
3751
3752 typedef PBUS_HANDLER
3753 (FASTCALL *pHalHandlerForBus)(
3754 IN INTERFACE_TYPE InterfaceType,
3755 IN ULONG BusNumber);
3756
3757 typedef VOID
3758 (FASTCALL *pHalReferenceBusHandler)(
3759 IN PBUS_HANDLER BusHandler);
3760
3761 typedef enum _HAL_QUERY_INFORMATION_CLASS {
3762 HalInstalledBusInformation,
3763 HalProfileSourceInformation,
3764 HalInformationClassUnused1,
3765 HalPowerInformation,
3766 HalProcessorSpeedInformation,
3767 HalCallbackInformation,
3768 HalMapRegisterInformation,
3769 HalMcaLogInformation,
3770 HalFrameBufferCachingInformation,
3771 HalDisplayBiosInformation,
3772 HalProcessorFeatureInformation,
3773 HalNumaTopologyInterface,
3774 HalErrorInformation,
3775 HalCmcLogInformation,
3776 HalCpeLogInformation,
3777 HalQueryMcaInterface,
3778 HalQueryAMLIIllegalIOPortAddresses,
3779 HalQueryMaxHotPlugMemoryAddress,
3780 HalPartitionIpiInterface,
3781 HalPlatformInformation,
3782 HalQueryProfileSourceList,
3783 HalInitLogInformation,
3784 HalFrequencyInformation,
3785 HalProcessorBrandString,
3786 HalHypervisorInformation,
3787 HalPlatformTimerInformation,
3788 HalAcpiAuditInformation
3789 } HAL_QUERY_INFORMATION_CLASS, *PHAL_QUERY_INFORMATION_CLASS;
3790
3791 typedef enum _HAL_SET_INFORMATION_CLASS {
3792 HalProfileSourceInterval,
3793 HalProfileSourceInterruptHandler,
3794 HalMcaRegisterDriver,
3795 HalKernelErrorHandler,
3796 HalCmcRegisterDriver,
3797 HalCpeRegisterDriver,
3798 HalMcaLog,
3799 HalCmcLog,
3800 HalCpeLog,
3801 HalGenerateCmcInterrupt,
3802 HalProfileSourceTimerHandler,
3803 HalEnlightenment,
3804 HalProfileDpgoSourceInterruptHandler
3805 } HAL_SET_INFORMATION_CLASS, *PHAL_SET_INFORMATION_CLASS;
3806
3807 typedef NTSTATUS
3808 (NTAPI *pHalQuerySystemInformation)(
3809 IN HAL_QUERY_INFORMATION_CLASS InformationClass,
3810 IN ULONG BufferSize,
3811 IN OUT PVOID Buffer,
3812 OUT PULONG ReturnedLength);
3813
3814 typedef NTSTATUS
3815 (NTAPI *pHalSetSystemInformation)(
3816 IN HAL_SET_INFORMATION_CLASS InformationClass,
3817 IN ULONG BufferSize,
3818 IN PVOID Buffer);
3819
3820 typedef VOID
3821 (FASTCALL *pHalExamineMBR)(
3822 IN PDEVICE_OBJECT DeviceObject,
3823 IN ULONG SectorSize,
3824 IN ULONG MBRTypeIdentifier,
3825 OUT PVOID *Buffer);
3826
3827 typedef NTSTATUS
3828 (FASTCALL *pHalIoReadPartitionTable)(
3829 IN PDEVICE_OBJECT DeviceObject,
3830 IN ULONG SectorSize,
3831 IN BOOLEAN ReturnRecognizedPartitions,
3832 OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
3833
3834 typedef NTSTATUS
3835 (FASTCALL *pHalIoSetPartitionInformation)(
3836 IN PDEVICE_OBJECT DeviceObject,
3837 IN ULONG SectorSize,
3838 IN ULONG PartitionNumber,
3839 IN ULONG PartitionType);
3840
3841 typedef NTSTATUS
3842 (FASTCALL *pHalIoWritePartitionTable)(
3843 IN PDEVICE_OBJECT DeviceObject,
3844 IN ULONG SectorSize,
3845 IN ULONG SectorsPerTrack,
3846 IN ULONG NumberOfHeads,
3847 IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
3848
3849 typedef NTSTATUS
3850 (NTAPI *pHalQueryBusSlots)(
3851 IN PBUS_HANDLER BusHandler,
3852 IN ULONG BufferSize,
3853 OUT PULONG SlotNumbers,
3854 OUT PULONG ReturnedLength);
3855
3856 typedef NTSTATUS
3857 (NTAPI *pHalInitPnpDriver)(
3858 VOID);
3859
3860 typedef struct _PM_DISPATCH_TABLE {
3861 ULONG Signature;
3862 ULONG Version;
3863 PVOID Function[1];
3864 } PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE;
3865
3866 typedef NTSTATUS
3867 (NTAPI *pHalInitPowerManagement)(
3868 IN PPM_DISPATCH_TABLE PmDriverDispatchTable,
3869 OUT PPM_DISPATCH_TABLE *PmHalDispatchTable);
3870
3871 typedef struct _DMA_ADAPTER*
3872 (NTAPI *pHalGetDmaAdapter)(
3873 IN PVOID Context,
3874 IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
3875 OUT PULONG NumberOfMapRegisters);
3876
3877 typedef NTSTATUS
3878 (NTAPI *pHalGetInterruptTranslator)(
3879 IN INTERFACE_TYPE ParentInterfaceType,
3880 IN ULONG ParentBusNumber,
3881 IN INTERFACE_TYPE BridgeInterfaceType,
3882 IN USHORT Size,
3883 IN USHORT Version,
3884 OUT PTRANSLATOR_INTERFACE Translator,
3885 OUT PULONG BridgeBusNumber);
3886
3887 typedef NTSTATUS
3888 (NTAPI *pHalStartMirroring)(
3889 VOID);
3890
3891 typedef NTSTATUS
3892 (NTAPI *pHalEndMirroring)(
3893 IN ULONG PassNumber);
3894
3895 typedef NTSTATUS
3896 (NTAPI *pHalMirrorPhysicalMemory)(
3897 IN PHYSICAL_ADDRESS PhysicalAddress,
3898 IN LARGE_INTEGER NumberOfBytes);
3899
3900 typedef NTSTATUS
3901 (NTAPI *pHalMirrorVerify)(
3902 IN PHYSICAL_ADDRESS PhysicalAddress,
3903 IN LARGE_INTEGER NumberOfBytes);
3904
3905 typedef struct _DEBUG_DEVICE_ADDRESS {
3906 UCHAR Type;
3907 BOOLEAN Valid;
3908 UCHAR Reserved[2];
3909 PUCHAR TranslatedAddress;
3910 ULONG Length;
3911 } DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS;
3912
3913 typedef struct _DEBUG_MEMORY_REQUIREMENTS {
3914 PHYSICAL_ADDRESS Start;
3915 PHYSICAL_ADDRESS MaxEnd;
3916 PVOID VirtualAddress;
3917 ULONG Length;
3918 BOOLEAN Cached;
3919 BOOLEAN Aligned;
3920 } DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS;
3921
3922 typedef struct _DEBUG_DEVICE_DESCRIPTOR {
3923 ULONG Bus;
3924 ULONG Slot;
3925 USHORT Segment;
3926 USHORT VendorID;
3927 USHORT DeviceID;
3928 UCHAR BaseClass;
3929 UCHAR SubClass;
3930 UCHAR ProgIf;
3931 BOOLEAN Initialized;
3932 BOOLEAN Configured;
3933 DEBUG_DEVICE_ADDRESS BaseAddress[6];
3934 DEBUG_MEMORY_REQUIREMENTS Memory;
3935 } DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR;
3936
3937 typedef NTSTATUS
3938 (NTAPI *pKdSetupPciDeviceForDebugging)(
3939 IN PVOID LoaderBlock OPTIONAL,
3940 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice);
3941
3942 typedef NTSTATUS
3943 (NTAPI *pKdReleasePciDeviceForDebugging)(
3944 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice);
3945
3946 typedef PVOID
3947 (NTAPI *pKdGetAcpiTablePhase0)(
3948 IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
3949 IN ULONG Signature);
3950
3951 typedef VOID
3952 (NTAPI *pKdCheckPowerButton)(
3953 VOID);
3954
3955 typedef VOID
3956 (NTAPI *pHalEndOfBoot)(
3957 VOID);
3958
3959 #if (NTDDI_VERSION >= NTDDI_VISTA)
3960 typedef PVOID
3961 (NTAPI *pKdMapPhysicalMemory64)(
3962 IN PHYSICAL_ADDRESS PhysicalAddress,
3963 IN ULONG NumberPages,
3964 IN BOOLEAN FlushCurrentTLB);
3965
3966 typedef VOID
3967 (NTAPI *pKdUnmapVirtualAddress)(
3968 IN PVOID VirtualAddress,
3969 IN ULONG NumberPages,
3970 IN BOOLEAN FlushCurrentTLB);
3971 #else
3972 typedef PVOID
3973 (NTAPI *pKdMapPhysicalMemory64)(
3974 IN PHYSICAL_ADDRESS PhysicalAddress,
3975 IN ULONG NumberPages);
3976
3977 typedef VOID
3978 (NTAPI *pKdUnmapVirtualAddress)(
3979 IN PVOID VirtualAddress,
3980 IN ULONG NumberPages);
3981 #endif
3982
3983 typedef PVOID
3984 (NTAPI *pHalGetAcpiTable)(
3985 IN ULONG Signature,
3986 IN PCSTR OemId OPTIONAL,
3987 IN PCSTR OemTableId OPTIONAL);
3988
3989 typedef ULONG
3990 (NTAPI *pKdGetPciDataByOffset)(
3991 IN ULONG BusNumber,
3992 IN ULONG SlotNumber,
3993 OUT PVOID Buffer,
3994 IN ULONG Offset,
3995 IN ULONG Length);
3996
3997 typedef ULONG
3998 (NTAPI *pKdSetPciDataByOffset)(
3999 IN ULONG BusNumber,
4000 IN ULONG SlotNumber,
4001 IN PVOID Buffer,
4002 IN ULONG Offset,
4003 IN ULONG Length);
4004
4005 #if defined(_IA64_)
4006 typedef NTSTATUS
4007 (*pHalGetErrorCapList)(
4008 IN OUT PULONG CapsListLength,
4009 IN OUT PUCHAR ErrorCapList);
4010
4011 typedef NTSTATUS
4012 (*pHalInjectError)(
4013 IN ULONG BufferLength,
4014 IN PUCHAR Buffer);
4015 #endif
4016
4017 typedef VOID
4018 (NTAPI *PCI_ERROR_HANDLER_CALLBACK)(
4019 VOID);
4020
4021 typedef VOID
4022 (NTAPI *pHalSetPciErrorHandlerCallback)(
4023 IN PCI_ERROR_HANDLER_CALLBACK Callback);
4024
4025 #if 1 /* Not present in WDK 7600 */
4026 typedef VOID
4027 (FASTCALL *pHalIoAssignDriveLetters)(
4028 IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
4029 IN PSTRING NtDeviceName,
4030 OUT PUCHAR NtSystemPath,
4031 OUT PSTRING NtSystemPathString);
4032 #endif
4033
4034 typedef struct {
4035 ULONG Version;
4036 pHalQuerySystemInformation HalQuerySystemInformation;
4037 pHalSetSystemInformation HalSetSystemInformation;
4038 pHalQueryBusSlots HalQueryBusSlots;
4039 ULONG Spare1;
4040 pHalExamineMBR HalExamineMBR;
4041 #if 1 /* Not present in WDK 7600 */
4042 pHalIoAssignDriveLetters HalIoAssignDriveLetters;
4043 #endif
4044 pHalIoReadPartitionTable HalIoReadPartitionTable;
4045 pHalIoSetPartitionInformation HalIoSetPartitionInformation;
4046 pHalIoWritePartitionTable HalIoWritePartitionTable;
4047 pHalHandlerForBus HalReferenceHandlerForBus;
4048 pHalReferenceBusHandler HalReferenceBusHandler;
4049 pHalReferenceBusHandler HalDereferenceBusHandler;
4050 pHalInitPnpDriver HalInitPnpDriver;
4051 pHalInitPowerManagement HalInitPowerManagement;
4052 pHalGetDmaAdapter HalGetDmaAdapter;
4053 pHalGetInterruptTranslator HalGetInterruptTranslator;
4054 pHalStartMirroring HalStartMirroring;
4055 pHalEndMirroring HalEndMirroring;
4056 pHalMirrorPhysicalMemory HalMirrorPhysicalMemory;
4057 pHalEndOfBoot HalEndOfBoot;
4058 pHalMirrorVerify HalMirrorVerify;
4059 pHalGetAcpiTable HalGetCachedAcpiTable;
4060 pHalSetPciErrorHandlerCallback HalSetPciErrorHandlerCallback;
4061 #if defined(_IA64_)
4062 pHalGetErrorCapList HalGetErrorCapList;
4063 pHalInjectError HalInjectError;
4064 #endif
4065 } HAL_DISPATCH, *PHAL_DISPATCH;
4066
4067 /* GCC/MSVC and WDK compatible declaration */
4068 extern NTKERNELAPI HAL_DISPATCH HalDispatchTable;
4069
4070 #if defined(_NTOSKRNL_) || defined(_BLDR_)
4071 #define HALDISPATCH (&HalDispatchTable)
4072 #else
4073 /* This is a WDK compatibility definition */
4074 #define HalDispatchTable (&HalDispatchTable)
4075 #define HALDISPATCH HalDispatchTable
4076 #endif
4077
4078 #define HAL_DISPATCH_VERSION 3 /* FIXME: when to use 4? */
4079 #define HalDispatchTableVersion HALDISPATCH->Version
4080 #define HalQuerySystemInformation HALDISPATCH->HalQuerySystemInformation
4081 #define HalSetSystemInformation HALDISPATCH->HalSetSystemInformation
4082 #define HalQueryBusSlots HALDISPATCH->HalQueryBusSlots
4083 #define HalReferenceHandlerForBus HALDISPATCH->HalReferenceHandlerForBus
4084 #define HalReferenceBusHandler HALDISPATCH->HalReferenceBusHandler
4085 #define HalDereferenceBusHandler HALDISPATCH->HalDereferenceBusHandler
4086 #define HalInitPnpDriver HALDISPATCH->HalInitPnpDriver
4087 #define HalInitPowerManagement HALDISPATCH->HalInitPowerManagement
4088 #define HalGetDmaAdapter HALDISPATCH->HalGetDmaAdapter
4089 #define HalGetInterruptTranslator HALDISPATCH->HalGetInterruptTranslator
4090 #define HalStartMirroring HALDISPATCH->HalStartMirroring
4091 #define HalEndMirroring HALDISPATCH->HalEndMirroring
4092 #define HalMirrorPhysicalMemory HALDISPATCH->HalMirrorPhysicalMemory
4093 #define HalEndOfBoot HALDISPATCH->HalEndOfBoot
4094 #define HalMirrorVerify HALDISPATCH->HalMirrorVerify
4095 #define HalGetCachedAcpiTable HALDISPATCH->HalGetCachedAcpiTable
4096 #define HalSetPciErrorHandlerCallback HALDISPATCH->HalSetPciErrorHandlerCallback
4097 #if defined(_IA64_)
4098 #define HalGetErrorCapList HALDISPATCH->HalGetErrorCapList
4099 #define HalInjectError HALDISPATCH->HalInjectError
4100 #endif
4101
4102 typedef struct _HAL_BUS_INFORMATION {
4103 INTERFACE_TYPE BusType;
4104 BUS_DATA_TYPE ConfigurationType;
4105 ULONG BusNumber;
4106 ULONG Reserved;
4107 } HAL_BUS_INFORMATION, *PHAL_BUS_INFORMATION;
4108
4109 typedef struct _HAL_PROFILE_SOURCE_INFORMATION {
4110 KPROFILE_SOURCE Source;
4111 BOOLEAN Supported;
4112 ULONG Interval;
4113 } HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION;
4114
4115 typedef struct _HAL_PROFILE_SOURCE_INFORMATION_EX {
4116 KPROFILE_SOURCE Source;
4117 BOOLEAN Supported;
4118 ULONG_PTR Interval;
4119 ULONG_PTR DefInterval;
4120 ULONG_PTR MaxInterval;
4121 ULONG_PTR MinInterval;
4122 } HAL_PROFILE_SOURCE_INFORMATION_EX, *PHAL_PROFILE_SOURCE_INFORMATION_EX;
4123
4124 typedef struct _HAL_PROFILE_SOURCE_INTERVAL {
4125 KPROFILE_SOURCE Source;
4126 ULONG_PTR Interval;
4127 } HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL;
4128
4129 typedef struct _HAL_PROFILE_SOURCE_LIST {
4130 KPROFILE_SOURCE Source;
4131 PWSTR Description;
4132 } HAL_PROFILE_SOURCE_LIST, *PHAL_PROFILE_SOURCE_LIST;
4133
4134 typedef enum _HAL_DISPLAY_BIOS_INFORMATION {
4135 HalDisplayInt10Bios,
4136 HalDisplayEmulatedBios,
4137 HalDisplayNoBios
4138 } HAL_DISPLAY_BIOS_INFORMATION, *PHAL_DISPLAY_BIOS_INFORMATION;
4139
4140 typedef struct _HAL_POWER_INFORMATION {
4141 ULONG TBD;
4142 } HAL_POWER_INFORMATION, *PHAL_POWER_INFORMATION;
4143
4144 typedef struct _HAL_PROCESSOR_SPEED_INFO {
4145 ULONG ProcessorSpeed;
4146 } HAL_PROCESSOR_SPEED_INFORMATION, *PHAL_PROCESSOR_SPEED_INFORMATION;
4147
4148 typedef struct _HAL_CALLBACKS {
4149 PCALLBACK_OBJECT SetSystemInformation;
4150 PCALLBACK_OBJECT BusCheck;
4151 } HAL_CALLBACKS, *PHAL_CALLBACKS;
4152
4153 typedef struct _HAL_PROCESSOR_FEATURE {
4154 ULONG UsableFeatureBits;
4155 } HAL_PROCESSOR_FEATURE;
4156
4157 typedef NTSTATUS
4158 (NTAPI *PHALIOREADWRITEHANDLER)(
4159 IN BOOLEAN fRead,
4160 IN ULONG dwAddr,
4161 IN ULONG dwSize,
4162 IN OUT PULONG pdwData);
4163
4164 typedef struct _HAL_AMLI_BAD_IO_ADDRESS_LIST {
4165 ULONG BadAddrBegin;
4166 ULONG BadAddrSize;
4167 ULONG OSVersionTrigger;
4168 PHALIOREADWRITEHANDLER IOHandler;
4169 } HAL_AMLI_BAD_IO_ADDRESS_LIST, *PHAL_AMLI_BAD_IO_ADDRESS_LIST;
4170
4171 #if defined(_X86_) || defined(_IA64_) || defined(_AMD64_)
4172
4173 typedef VOID
4174 (NTAPI *PHALMCAINTERFACELOCK)(
4175 VOID);
4176
4177 typedef VOID
4178 (NTAPI *PHALMCAINTERFACEUNLOCK)(
4179 VOID);
4180
4181 typedef NTSTATUS
4182 (NTAPI *PHALMCAINTERFACEREADREGISTER)(
4183 IN UCHAR BankNumber,
4184 IN OUT PVOID Exception);
4185
4186 typedef struct _HAL_MCA_INTERFACE {
4187 PHALMCAINTERFACELOCK Lock;
4188 PHALMCAINTERFACEUNLOCK Unlock;
4189 PHALMCAINTERFACEREADREGISTER ReadRegister;
4190 } HAL_MCA_INTERFACE;
4191
4192 typedef enum {
4193 ApicDestinationModePhysical = 1,
4194 ApicDestinationModeLogicalFlat,
4195 ApicDestinationModeLogicalClustered,
4196 ApicDestinationModeUnknown
4197 } HAL_APIC_DESTINATION_MODE, *PHAL_APIC_DESTINATION_MODE;
4198
4199 #if defined(_AMD64_)
4200
4201 struct _KTRAP_FRAME;
4202 struct _KEXCEPTION_FRAME;
4203
4204 typedef ERROR_SEVERITY
4205 (NTAPI *PDRIVER_EXCPTN_CALLBACK)(
4206 IN PVOID Context,
4207 IN struct _KTRAP_FRAME *TrapFrame,
4208 IN struct _KEXCEPTION_FRAME *ExceptionFrame,
4209 IN PMCA_EXCEPTION Exception);
4210
4211 #endif
4212
4213 #if defined(_X86_) || defined(_IA64_)
4214 typedef
4215 #if defined(_IA64_)
4216 ERROR_SEVERITY
4217 #else
4218 VOID
4219 #endif
4220 (NTAPI *PDRIVER_EXCPTN_CALLBACK)(
4221 IN PVOID Context,
4222 IN PMCA_EXCEPTION BankLog);
4223 #endif
4224
4225 typedef PDRIVER_EXCPTN_CALLBACK PDRIVER_MCA_EXCEPTION_CALLBACK;
4226
4227 typedef struct _MCA_DRIVER_INFO {
4228 PDRIVER_MCA_EXCEPTION_CALLBACK ExceptionCallback;
4229 PKDEFERRED_ROUTINE DpcCallback;
4230 PVOID DeviceContext;
4231 } MCA_DRIVER_INFO, *PMCA_DRIVER_INFO;
4232
4233 typedef struct _HAL_ERROR_INFO {
4234 ULONG Version;
4235 ULONG InitMaxSize;
4236 ULONG McaMaxSize;
4237 ULONG McaPreviousEventsCount;
4238 ULONG McaCorrectedEventsCount;
4239 ULONG McaKernelDeliveryFails;
4240 ULONG McaDriverDpcQueueFails;
4241 ULONG McaReserved;
4242 ULONG CmcMaxSize;
4243 ULONG CmcPollingInterval;
4244 ULONG CmcInterruptsCount;
4245 ULONG CmcKernelDeliveryFails;
4246 ULONG CmcDriverDpcQueueFails;
4247 ULONG CmcGetStateFails;
4248 ULONG CmcClearStateFails;
4249 ULONG CmcReserved;
4250 ULONGLONG CmcLogId;
4251 ULONG CpeMaxSize;
4252 ULONG CpePollingInterval;
4253 ULONG CpeInterruptsCount;
4254 ULONG CpeKernelDeliveryFails;
4255 ULONG CpeDriverDpcQueueFails;
4256 ULONG CpeGetStateFails;
4257 ULONG CpeClearStateFails;
4258 ULONG CpeInterruptSources;
4259 ULONGLONG CpeLogId;
4260 ULONGLONG KernelReserved[4];
4261 } HAL_ERROR_INFO, *PHAL_ERROR_INFO;
4262
4263 #define HAL_MCE_INTERRUPTS_BASED ((ULONG)-1)
4264 #define HAL_MCE_DISABLED ((ULONG)0)
4265
4266 #define HAL_CMC_INTERRUPTS_BASED HAL_MCE_INTERRUPTS_BASED
4267 #define HAL_CMC_DISABLED HAL_MCE_DISABLED
4268
4269 #define HAL_CPE_INTERRUPTS_BASED HAL_MCE_INTERRUPTS_BASED
4270 #define HAL_CPE_DISABLED HAL_MCE_DISABLED
4271
4272 #define HAL_MCA_INTERRUPTS_BASED HAL_MCE_INTERRUPTS_BASED
4273 #define HAL_MCA_DISABLED HAL_MCE_DISABLED
4274
4275 typedef VOID
4276 (NTAPI *PDRIVER_CMC_EXCEPTION_CALLBACK)(
4277 IN PVOID Context,
4278 IN PCMC_EXCEPTION CmcLog);
4279
4280 typedef VOID
4281 (NTAPI *PDRIVER_CPE_EXCEPTION_CALLBACK)(
4282 IN PVOID Context,
4283 IN PCPE_EXCEPTION CmcLog);
4284
4285 typedef struct _CMC_DRIVER_INFO {
4286 PDRIVER_CMC_EXCEPTION_CALLBACK ExceptionCallback;
4287 PKDEFERRED_ROUTINE DpcCallback;
4288 PVOID DeviceContext;
4289 } CMC_DRIVER_INFO, *PCMC_DRIVER_INFO;
4290
4291 typedef struct _CPE_DRIVER_INFO {
4292 PDRIVER_CPE_EXCEPTION_CALLBACK ExceptionCallback;
4293 PKDEFERRED_ROUTINE DpcCallback;
4294 PVOID DeviceContext;
4295 } CPE_DRIVER_INFO, *PCPE_DRIVER_INFO;
4296
4297 #endif // defined(_X86_) || defined(_IA64_) || defined(_AMD64_)
4298
4299 #if defined(_IA64_)
4300
4301 typedef NTSTATUS
4302 (*HALSENDCROSSPARTITIONIPI)(
4303 IN USHORT ProcessorID,
4304 IN UCHAR HardwareVector);
4305
4306 typedef NTSTATUS
4307 (*HALRESERVECROSSPARTITIONINTERRUPTVECTOR)(
4308 OUT PULONG Vector,
4309 OUT PKIRQL Irql,
4310 IN OUT PGROUP_AFFINITY Affinity,
4311 OUT PUCHAR HardwareVector);
4312
4313 typedef VOID
4314 (*HALFREECROSSPARTITIONINTERRUPTVECTOR)(
4315 IN ULONG Vector,
4316 IN PGROUP_AFFINITY Affinity);
4317
4318 typedef struct _HAL_CROSS_PARTITION_IPI_INTERFACE {
4319 HALSENDCROSSPARTITIONIPI HalSendCrossPartitionIpi;
4320 HALRESERVECROSSPARTITIONINTERRUPTVECTOR HalReserveCrossPartitionInterruptVector;
4321 HALFREECROSSPARTITIONINTERRUPTVECTOR HalFreeCrossPartitionInterruptVector;
4322 } HAL_CROSS_PARTITION_IPI_INTERFACE;
4323
4324 #define HAL_CROSS_PARTITION_IPI_INTERFACE_MINIMUM_SIZE \
4325 FIELD_OFFSET(HAL_CROSS_PARTITION_IPI_INTERFACE, \
4326 HalFreeCrossPartitionInterruptVector)
4327
4328 #endif /* defined(_IA64_) */
4329
4330 typedef struct _HAL_PLATFORM_INFORMATION {
4331 ULONG PlatformFlags;
4332 } HAL_PLATFORM_INFORMATION, *PHAL_PLATFORM_INFORMATION;
4333
4334 #define HAL_PLATFORM_DISABLE_WRITE_COMBINING 0x01L
4335 #define HAL_PLATFORM_DISABLE_PTCG 0x04L
4336 #define HAL_PLATFORM_DISABLE_UC_MAIN_MEMORY 0x08L
4337 #define HAL_PLATFORM_ENABLE_WRITE_COMBINING_MMIO 0x10L
4338 #define HAL_PLATFORM_ACPI_TABLES_CACHED 0x20L
4339
4340 #if defined(_WIN64)
4341
4342 #ifndef USE_DMA_MACROS
4343 #define USE_DMA_MACROS
4344 #endif
4345
4346 #ifndef NO_LEGACY_DRIVERS
4347 #define NO_LEGACY_DRIVERS
4348 #endif
4349
4350 #endif /* defined(_WIN64) */
4351
4352 typedef enum _PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE {
4353 ResourceTypeSingle = 0,
4354 ResourceTypeRange,
4355 ResourceTypeExtendedCounterConfiguration,
4356 ResourceTypeOverflow,
4357 ResourceTypeMax
4358 } PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE;
4359
4360 typedef struct _PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR {
4361 PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE Type;
4362 ULONG Flags;
4363 union {
4364 ULONG CounterIndex;
4365 ULONG ExtendedRegisterAddress;
4366 struct {
4367 ULONG Begin;
4368 ULONG End;
4369 } Range;
4370 } u;
4371 } PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR, *PPHYSICAL_COUNTER_RESOURCE_DESCRIPTOR;
4372
4373 typedef struct _PHYSICAL_COUNTER_RESOURCE_LIST {
4374 ULONG Count;
4375 PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR Descriptors[ANYSIZE_ARRAY];
4376 } PHYSICAL_COUNTER_RESOURCE_LIST, *PPHYSICAL_COUNTER_RESOURCE_LIST;
4377
4378 /* Hardware Abstraction Layer Functions */
4379
4380 NTSTATUS
4381 NTAPI
4382 HalFreeHardwareCounters(
4383 IN HANDLE CounterSetHandle);
4384
4385 #if !defined(NO_LEGACY_DRIVERS)
4386
4387 #if (NTDDI_VERSION >= NTDDI_WIN2K)
4388
4389 NTHALAPI
4390 NTSTATUS
4391 NTAPI
4392 HalAssignSlotResources(
4393 IN PUNICODE_STRING RegistryPath,
4394 IN PUNICODE_STRING DriverClassName,
4395 IN PDRIVER_OBJECT DriverObject,
4396 IN PDEVICE_OBJECT DeviceObject,
4397 IN INTERFACE_TYPE BusType,
4398 IN ULONG BusNumber,
4399 IN ULONG SlotNumber,
4400 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
4401
4402 NTHALAPI
4403 ULONG
4404 NTAPI
4405 HalGetInterruptVector(
4406 IN INTERFACE_TYPE InterfaceType,
4407 IN ULONG BusNumber,
4408 IN ULONG BusInterruptLevel,
4409 IN ULONG BusInterruptVector,
4410 OUT PKIRQL Irql,
4411 OUT PKAFFINITY Affinity);
4412
4413 NTHALAPI
4414 ULONG
4415 NTAPI
4416 HalSetBusData(
4417 IN BUS_DATA_TYPE BusDataType,
4418 IN ULONG BusNumber,
4419 IN ULONG SlotNumber,
4420 IN PVOID Buffer,
4421 IN ULONG Length);
4422
4423 NTHALAPI
4424 ULONG
4425 NTAPI
4426 HalGetBusData(
4427 IN BUS_DATA_TYPE BusDataType,
4428 IN ULONG BusNumber,
4429 IN ULONG SlotNumber,
4430 OUT PVOID Buffer,
4431 IN ULONG Length);
4432
4433 NTHALAPI
4434 BOOLEAN
4435 NTAPI
4436 HalMakeBeep(
4437 IN ULONG Frequency);
4438
4439 #endif
4440
4441 #endif /* !defined(NO_LEGACY_DRIVERS) */
4442
4443 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
4444 // nothing here
4445 #else
4446
4447 #if (NTDDI_VERSION >= NTDDI_WIN2K)
4448 //DECLSPEC_DEPRECATED_DDK
4449 NTHALAPI
4450 VOID
4451 NTAPI
4452 IoFreeAdapterChannel(
4453 IN PADAPTER_OBJECT AdapterObject);
4454
4455 //DECLSPEC_DEPRECATED_DDK
4456 NTHALAPI
4457 BOOLEAN
4458 NTAPI
4459 IoFlushAdapterBuffers(
4460 IN PADAPTER_OBJECT AdapterObject,
4461 IN PMDL Mdl,
4462 IN PVOID MapRegisterBase,
4463 IN PVOID CurrentVa,
4464 IN ULONG Length,
4465 IN BOOLEAN WriteToDevice);
4466
4467 //DECLSPEC_DEPRECATED_DDK
4468 NTHALAPI
4469 VOID
4470 NTAPI
4471 IoFreeMapRegisters(
4472 IN PADAPTER_OBJECT AdapterObject,
4473 IN PVOID MapRegisterBase,
4474 IN ULONG NumberOfMapRegisters);
4475
4476 //DECLSPEC_DEPRECATED_DDK
4477 NTHALAPI
4478 PVOID
4479 NTAPI
4480 HalAllocateCommonBuffer(
4481 IN PADAPTER_OBJECT AdapterObject,
4482 IN ULONG Length,
4483 OUT PPHYSICAL_ADDRESS LogicalAddress,
4484 IN BOOLEAN CacheEnabled);
4485
4486 //DECLSPEC_DEPRECATED_DDK
4487 NTHALAPI
4488 VOID
4489 NTAPI
4490 HalFreeCommonBuffer(
4491 IN PADAPTER_OBJECT AdapterObject,
4492 IN ULONG Length,
4493 IN PHYSICAL_ADDRESS LogicalAddress,
4494 IN PVOID VirtualAddress,
4495 IN BOOLEAN CacheEnabled);
4496
4497 //DECLSPEC_DEPRECATED_DDK
4498 NTHALAPI
4499 ULONG
4500 NTAPI
4501 HalReadDmaCounter(
4502 IN PADAPTER_OBJECT AdapterObject);
4503
4504 NTHALAPI
4505 NTSTATUS
4506 NTAPI
4507 HalAllocateAdapterChannel(
4508 IN PADAPTER_OBJECT AdapterObject,
4509 IN PWAIT_CONTEXT_BLOCK Wcb,
4510 IN ULONG NumberOfMapRegisters,
4511 IN PDRIVER_CONTROL ExecutionRoutine);
4512
4513 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
4514
4515 #endif /* defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) */
4516
4517 #if (NTDDI_VERSION >= NTDDI_WIN2K)
4518
4519 NTHALAPI
4520 PADAPTER_OBJECT
4521 NTAPI
4522 HalGetAdapter(
4523 IN PDEVICE_DESCRIPTION DeviceDescription,
4524 OUT PULONG NumberOfMapRegisters);
4525
4526 VOID
4527 NTAPI
4528 HalPutDmaAdapter(
4529 IN PADAPTER_OBJECT DmaAdapter);
4530
4531 NTHALAPI
4532 VOID
4533 NTAPI
4534 HalAcquireDisplayOwnership(
4535 IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters);
4536
4537 NTHALAPI
4538 ULONG
4539 NTAPI
4540 HalGetBusDataByOffset(
4541 IN BUS_DATA_TYPE BusDataType,
4542 IN ULONG BusNumber,
4543 IN ULONG SlotNumber,
4544 OUT PVOID Buffer,
4545 IN ULONG Offset,
4546 IN ULONG Length);
4547
4548 NTHALAPI
4549 ULONG
4550 NTAPI
4551 HalSetBusDataByOffset(
4552 IN BUS_DATA_TYPE BusDataType,
4553 IN ULONG BusNumber,
4554 IN ULONG SlotNumber,
4555 IN PVOID Buffer,
4556 IN ULONG Offset,
4557 IN ULONG Length);
4558
4559 NTHALAPI
4560 BOOLEAN
4561 NTAPI
4562 HalTranslateBusAddress(
4563 IN INTERFACE_TYPE InterfaceType,
4564 IN ULONG BusNumber,
4565 IN PHYSICAL_ADDRESS BusAddress,
4566 IN OUT PULONG AddressSpace,
4567 OUT PPHYSICAL_ADDRESS TranslatedAddress);
4568
4569 NTHALAPI
4570 PVOID
4571 NTAPI
4572 HalAllocateCrashDumpRegisters(
4573 IN PADAPTER_OBJECT AdapterObject,
4574 IN OUT PULONG NumberOfMapRegisters);
4575
4576 NTSTATUS
4577 NTAPI
4578 HalGetScatterGatherList(
4579 IN PADAPTER_OBJECT DmaAdapter,
4580 IN PDEVICE_OBJECT DeviceObject,
4581 IN PMDL Mdl,
4582 IN PVOID CurrentVa,
4583 IN ULONG Length,
4584 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
4585 IN PVOID Context,
4586 IN BOOLEAN WriteToDevice);
4587
4588 VOID
4589 NTAPI
4590 HalPutScatterGatherList(
4591 IN PADAPTER_OBJECT DmaAdapter,
4592 IN PSCATTER_GATHER_LIST ScatterGather,
4593 IN BOOLEAN WriteToDevice);
4594
4595 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
4596
4597 #if (NTDDI_VERSION >= NTDDI_WINXP)
4598 NTKERNELAPI
4599 VOID
4600 FASTCALL
4601 HalExamineMBR(
4602 IN PDEVICE_OBJECT DeviceObject,
4603 IN ULONG SectorSize,
4604 IN ULONG MBRTypeIdentifier,
4605 OUT PVOID *Buffer);
4606 #endif
4607
4608 #if (NTDDI_VERSION >= NTDDI_WIN7)
4609 NTSTATUS
4610 NTAPI
4611 HalAllocateHardwareCounters(
4612 IN PGROUP_AFFINITY GroupAffinty,
4613 IN ULONG GroupCount,
4614 IN PPHYSICAL_COUNTER_RESOURCE_LIST ResourceList,
4615 OUT PHANDLE CounterSetHandle);
4616 #endif
4617
4618
4619
4620 #if defined(_IA64_)
4621 #if (NTDDI_VERSION >= NTDDI_WIN2K)
4622 NTHALAPI
4623 ULONG
4624 NTAPI
4625 HalGetDmaAlignmentRequirement(VOID);
4626 #endif
4627 #endif /* defined(_IA64_) */
4628
4629 #if defined(_M_IX86) || defined(_M_AMD64)
4630 #define HalGetDmaAlignmentRequirement() 1L
4631 #endif
4632
4633 #if (NTDDI_VERSION >= NTDDI_WIN7)
4634
4635 typedef struct _WHEA_ERROR_SOURCE_DESCRIPTOR *PWHEA_ERROR_SOURCE_DESCRIPTOR;
4636 typedef struct _WHEA_ERROR_RECORD *PWHEA_ERROR_RECORD;
4637
4638 NTHALAPI
4639 VOID
4640 NTAPI
4641 HalBugCheckSystem(
4642 IN PWHEA_ERROR_SOURCE_DESCRIPTOR ErrorSource,
4643 IN PWHEA_ERROR_RECORD ErrorRecord);
4644
4645 #else
4646
4647 typedef struct _WHEA_ERROR_RECORD *PWHEA_ERROR_RECORD;
4648
4649 NTHALAPI
4650 VOID
4651 NTAPI
4652 HalBugCheckSystem(
4653 IN PWHEA_ERROR_RECORD ErrorRecord);
4654
4655 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
4656
4657 //
4658 // GUID and UUID
4659 //
4660 #ifndef GUID_DEFINED
4661 #include <guiddef.h>
4662 #endif
4663
4664 typedef struct _MAP_REGISTER_ENTRY {
4665 PVOID MapRegister;
4666 BOOLEAN WriteToDevice;
4667 } MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY;
4668
4669 typedef BOOLEAN
4670 (NTAPI *pHalTranslateBusAddress)(
4671 IN INTERFACE_TYPE InterfaceType,
4672 IN ULONG BusNumber,
4673 IN PHYSICAL_ADDRESS BusAddress,
4674 IN OUT PULONG AddressSpace,
4675 OUT PPHYSICAL_ADDRESS TranslatedAddress);
4676
4677 typedef NTSTATUS
4678 (NTAPI *pHalAssignSlotResources)(
4679 IN PUNICODE_STRING RegistryPath,
4680 IN PUNICODE_STRING DriverClassName OPTIONAL,
4681 IN PDRIVER_OBJECT DriverObject,
4682 IN PDEVICE_OBJECT DeviceObject,
4683 IN INTERFACE_TYPE BusType,
4684 IN ULONG BusNumber,
4685 IN ULONG SlotNumber,
4686 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
4687
4688 typedef VOID
4689 (NTAPI *pHalHaltSystem)(
4690 VOID);
4691
4692 typedef BOOLEAN
4693 (NTAPI *pHalResetDisplay)(
4694 VOID);
4695
4696 typedef UCHAR
4697 (NTAPI *pHalVectorToIDTEntry)(
4698 ULONG Vector);
4699
4700 typedef BOOLEAN
4701 (NTAPI *pHalFindBusAddressTranslation)(
4702 IN PHYSICAL_ADDRESS BusAddress,
4703 IN OUT PULONG AddressSpace,
4704 OUT PPHYSICAL_ADDRESS TranslatedAddress,
4705 IN OUT PULONG_PTR Context,
4706 IN BOOLEAN NextBus);
4707
4708 extern NTKERNELAPI PVOID MmHighestUserAddress;
4709 extern NTKERNELAPI PVOID MmSystemRangeStart;
4710 extern NTKERNELAPI ULONG MmUserProbeAddress;
4711
4712
4713 #ifdef _X86_
4714
4715 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
4716 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
4717 #if defined(_LOCAL_COPY_USER_PROBE_ADDRESS_)
4718 #define MM_USER_PROBE_ADDRESS _LOCAL_COPY_USER_PROBE_ADDRESS_
4719 extern ULONG _LOCAL_COPY_USER_PROBE_ADDRESS_;
4720 #else
4721 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
4722 #endif
4723 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
4724 #define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
4725 #define MM_SYSTEM_SPACE_END 0xFFFFFFFF
4726 #if !defined (_X86PAE_)
4727 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000
4728 #else
4729 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
4730 #endif
4731
4732 #define KeGetPcr() PCR
4733
4734 #define PCR_MINOR_VERSION 1
4735 #define PCR_MAJOR_VERSION 1
4736
4737 typedef struct _KPCR {
4738 union {
4739 NT_TIB NtTib;
4740 struct {
4741 struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
4742 PVOID Used_StackBase;
4743 PVOID Spare2;
4744 PVOID TssCopy;
4745 ULONG ContextSwitches;
4746 KAFFINITY SetMemberCopy;
4747 PVOID Used_Self;
4748 };
4749 };
4750 struct _KPCR *SelfPcr;
4751 struct _KPRCB *Prcb;
4752 KIRQL Irql;
4753 ULONG IRR;
4754 ULONG IrrActive;
4755 ULONG IDR;
4756 PVOID KdVersionBlock;
4757 struct _KIDTENTRY *IDT;
4758 struct _KGDTENTRY *GDT;
4759 struct _KTSS *TSS;
4760 USHORT MajorVersion;
4761 USHORT MinorVersion;
4762 KAFFINITY SetMember;
4763 ULONG StallScaleFactor;
4764 UCHAR SpareUnused;
4765 UCHAR Number;
4766 UCHAR Spare0;
4767 UCHAR SecondLevelCacheAssociativity;
4768 ULONG VdmAlert;
4769 ULONG KernelReserved[14];
4770 ULONG SecondLevelCacheSize;
4771 ULONG HalReserved[16];
4772 } KPCR, *PKPCR;
4773
4774 FORCEINLINE
4775 ULONG
4776 KeGetCurrentProcessorNumber(VOID)
4777 {
4778 return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
4779 }
4780
4781 #endif /* _X86_ */
4782
4783 #ifdef _AMD64_
4784
4785 #define PTI_SHIFT 12L
4786 #define PDI_SHIFT 21L
4787 #define PPI_SHIFT 30L
4788 #define PXI_SHIFT 39L
4789 #define PTE_PER_PAGE 512
4790 #define PDE_PER_PAGE 512
4791 #define PPE_PER_PAGE 512
4792 #define PXE_PER_PAGE 512
4793 #define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
4794 #define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
4795 #define PPI_MASK (PPE_PER_PAGE - 1)
4796 #define PXI_MASK (PXE_PER_PAGE - 1)
4797
4798 #define PXE_BASE 0xFFFFF6FB7DBED000ULL
4799 #define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL
4800 #define PPE_BASE 0xFFFFF6FB7DA00000ULL
4801 #define PDE_BASE 0xFFFFF6FB40000000ULL
4802 #define PTE_BASE 0xFFFFF68000000000ULL
4803 #define PXE_TOP 0xFFFFF6FB7DBEDFFFULL
4804 #define PPE_TOP 0xFFFFF6FB7DBFFFFFULL
4805 #define PDE_TOP 0xFFFFF6FB7FFFFFFFULL
4806 #define PTE_TOP 0xFFFFF6FFFFFFFFFFULL
4807
4808 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
4809 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
4810 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
4811 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
4812 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL
4813 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
4814
4815 typedef struct _KPCR
4816 {
4817 _ANONYMOUS_UNION union
4818 {
4819 NT_TIB NtTib;
4820 _ANONYMOUS_STRUCT struct
4821 {
4822 union _KGDTENTRY64 *GdtBase;
4823 struct _KTSS64 *TssBase;
4824 ULONG64 UserRsp;
4825 struct _KPCR *Self;
4826 struct _KPRCB *CurrentPrcb;
4827 PKSPIN_LOCK_QUEUE LockArray;
4828 PVOID Used_Self;
4829 };
4830 };
4831 union _KIDTENTRY64 *IdtBase;
4832 ULONG64 Unused[2];
4833 KIRQL Irql;
4834 UCHAR SecondLevelCacheAssociativity;
4835 UCHAR ObsoleteNumber;
4836 UCHAR Fill0;
4837 ULONG Unused0[3];
4838 USHORT MajorVersion;
4839 USHORT MinorVersion;
4840 ULONG StallScaleFactor;
4841 PVOID Unused1[3];
4842 ULONG KernelReserved[15];
4843 ULONG SecondLevelCacheSize;
4844 ULONG HalReserved[16];
4845 ULONG Unused2;
4846 PVOID KdVersionBlock;
4847 PVOID Unused3;
4848 ULONG PcrAlign1[24];
4849 } KPCR, *PKPCR;
4850
4851 FORCEINLINE
4852 PKPCR
4853 KeGetPcr(VOID)
4854 {
4855 return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
4856 }
4857
4858 FORCEINLINE
4859 ULONG
4860 KeGetCurrentProcessorNumber(VOID)
4861 {
4862 return (ULONG)__readgsword(0x184);
4863 }
4864
4865 #endif /* _AMD64_ */
4866
4867 typedef enum _INTERLOCKED_RESULT {
4868 ResultNegative = RESULT_NEGATIVE,
4869 ResultZero = RESULT_ZERO,
4870 ResultPositive = RESULT_POSITIVE
4871 } INTERLOCKED_RESULT;
4872
4873 #ifdef _X86_
4874
4875 NTKERNELAPI
4876 INTERLOCKED_RESULT
4877 FASTCALL
4878 Exfi386InterlockedIncrementLong(
4879 IN OUT LONG volatile *Addend);
4880
4881 NTKERNELAPI
4882 INTERLOCKED_RESULT
4883 FASTCALL
4884 Exfi386InterlockedDecrementLong(
4885 IN PLONG Addend);
4886
4887 NTKERNELAPI
4888 ULONG
4889 FASTCALL
4890 Exfi386InterlockedExchangeUlong(
4891 IN PULONG Target,
4892 IN ULONG Value);
4893
4894 #endif /* _X86_ */
4895
4896 /** Filesystem runtime library routines **/
4897
4898 #if (NTDDI_VERSION >= NTDDI_WIN2K)
4899 NTKERNELAPI
4900 BOOLEAN
4901 NTAPI
4902 FsRtlIsTotalDeviceFailure(
4903 IN NTSTATUS Status);
4904 #endif
4905
4906 /* Hardware Abstraction Layer Types */
4907
4908 typedef VOID
4909 (NTAPI *PciPin2Line)(
4910 IN struct _BUS_HANDLER *BusHandler,
4911 IN struct _BUS_HANDLER *RootHandler,
4912 IN PCI_SLOT_NUMBER SlotNumber,
4913 IN PPCI_COMMON_CONFIG PciData);
4914
4915 typedef VOID
4916 (NTAPI *PciLine2Pin)(
4917 IN struct _BUS_HANDLER *BusHandler,
4918 IN struct _BUS_HANDLER *RootHandler,
4919 IN PCI_SLOT_NUMBER SlotNumber,
4920 IN PPCI_COMMON_CONFIG PciNewData,
4921 IN PPCI_COMMON_CONFIG PciOldData);
4922
4923 typedef VOID
4924 (NTAPI *PciReadWriteConfig)(
4925 IN struct _BUS_HANDLER *BusHandler,
4926 IN PCI_SLOT_NUMBER Slot,
4927 IN PVOID Buffer,
4928 IN ULONG Offset,
4929 IN ULONG Length);
4930
4931 #define PCI_DATA_TAG ' ICP'
4932 #define PCI_DATA_VERSION 1
4933
4934 typedef struct _PCIBUSDATA {
4935 ULONG Tag;
4936 ULONG Version;
4937 PciReadWriteConfig ReadConfig;
4938 PciReadWriteConfig WriteConfig;
4939 PciPin2Line Pin2Line;
4940 PciLine2Pin Line2Pin;
4941 PCI_SLOT_NUMBER ParentSlot;
4942 PVOID Reserved[4];
4943 } PCIBUSDATA, *PPCIBUSDATA;
4944
4945 /* ZwXxx Functions */
4946
4947 #if (NTDDI_VERSION >= NTDDI_WIN2K)
4948
4949 NTSTATUS
4950 NTAPI
4951 ZwCancelTimer(
4952 IN HANDLE TimerHandle,
4953 OUT PBOOLEAN CurrentState OPTIONAL);
4954
4955 NTSTATUS
4956 NTAPI
4957 ZwCreateTimer(
4958 OUT PHANDLE TimerHandle,
4959 IN ACCESS_MASK DesiredAccess,
4960 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
4961 IN TIMER_TYPE TimerType);
4962
4963 NTSTATUS
4964 NTAPI
4965 ZwOpenTimer(
4966 OUT PHANDLE TimerHandle,
4967 IN ACCESS_MASK DesiredAccess,
4968 IN POBJECT_ATTRIBUTES ObjectAttributes);
4969
4970 NTSYSAPI
4971 NTSTATUS
4972 NTAPI
4973 ZwSetInformationThread(
4974 IN HANDLE ThreadHandle,
4975 IN THREADINFOCLASS ThreadInformationClass,
4976 IN PVOID ThreadInformation,
4977 IN ULONG ThreadInformationLength);
4978
4979 NTSTATUS
4980 NTAPI
4981 ZwSetTimer(
4982 IN HANDLE TimerHandle,
4983 IN PLARGE_INTEGER DueTime,
4984 IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
4985 IN PVOID TimerContext OPTIONAL,
4986 IN BOOLEAN ResumeTimer,
4987 IN LONG Period OPTIONAL,
4988 OUT PBOOLEAN PreviousState OPTIONAL);
4989
4990 #endif
4991
4992 NTSYSAPI
4993 NTSTATUS
4994 NTAPI
4995 ZwDisplayString (
4996 IN PUNICODE_STRING String
4997 );
4998
4999 #if (VER_PRODUCTBUILD >= 2195)
5000
5001 NTSYSAPI
5002 NTSTATUS
5003 NTAPI
5004 ZwPowerInformation (
5005 IN POWER_INFORMATION_LEVEL PowerInformationLevel,
5006 IN PVOID InputBuffer OPTIONAL,
5007 IN ULONG InputBufferLength,
5008 OUT PVOID OutputBuffer OPTIONAL,
5009 IN ULONG OutputBufferLength
5010 );
5011
5012 #endif /* (VER_PRODUCTBUILD >= 2195) */
5013
5014 NTSYSAPI
5015 NTSTATUS
5016 NTAPI
5017 ZwTerminateProcess (
5018 IN HANDLE ProcessHandle OPTIONAL,
5019 IN NTSTATUS ExitStatus
5020 );
5021
5022 NTSYSAPI
5023 NTSTATUS
5024 NTAPI
5025 ZwOpenProcess (
5026 OUT PHANDLE ProcessHandle,
5027 IN ACCESS_MASK DesiredAccess,
5028 IN POBJECT_ATTRIBUTES ObjectAttributes,
5029 IN PCLIENT_ID ClientId OPTIONAL
5030 );
5031
5032 NTSYSAPI
5033 NTSTATUS
5034 NTAPI
5035 ZwQueryVolumeInformationFile(
5036 IN HANDLE FileHandle,
5037 OUT PIO_STATUS_BLOCK IoStatusBlock,
5038 OUT PVOID FsInformation,
5039 IN ULONG Length,
5040 IN FS_INFORMATION_CLASS FsInformationClass);
5041
5042 NTSYSAPI
5043 NTSTATUS
5044 NTAPI
5045 ZwDeviceIoControlFile(
5046 IN HANDLE FileHandle,
5047 IN HANDLE Event OPTIONAL,
5048 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
5049 IN PVOID ApcContext OPTIONAL,
5050 OUT PIO_STATUS_BLOCK IoStatusBlock,
5051 IN ULONG IoControlCode,
5052 IN PVOID InputBuffer OPTIONAL,
5053 IN ULONG InputBufferLength,
5054 OUT PVOID OutputBuffer OPTIONAL,
5055 IN ULONG OutputBufferLength);
5056
5057 #ifdef __cplusplus
5058 }
5059 #endif