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