[NTDDK]
[reactos.git] / include / ddk / ntddk.h
1 /*
2 * ntddk.h
3 *
4 * Windows Device Driver Kit
5 *
6 * This file is part of the w32api package.
7 *
8 * Contributors:
9 * Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
10 *
11 * THIS SOFTWARE IS NOT COPYRIGHTED
12 *
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
15 *
16 * This code is distributed in the hope that it will be useful but
17 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
18 * DISCLAIMED. This includes but is not limited to warranties of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
20 *
21 * DEFINES:
22 * DBG - Debugging enabled/disabled (0/1)
23 * POOL_TAGGING - Enable pool tagging
24 * _X86_ - X86 environment
25 */
26
27 #pragma once
28
29 #define _NTDDK_
30
31 #if !defined(_NTHAL_) && !defined(_NTIFS_)
32 #define _NTDDK_INCLUDED_
33 #define _DDK_DRIVER_
34 #endif
35
36 /* Dependencies */
37
38 #define NT_INCLUDED
39 #define _CTYPE_DISABLE_MACROS
40
41 #include <wdm.h>
42 #include <excpt.h>
43 #include <ntdef.h>
44 #include <ntstatus.h>
45
46 /* FIXME
47 #include <bugcodes.h>
48 #include <ntiologc.h>
49 */
50
51 #include <stdarg.h> // FIXME
52 #include <basetyps.h> // FIXME
53
54
55 #ifdef __cplusplus
56 extern "C" {
57 #endif
58
59 /* 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 #if defined(POOL_TAGGING)
2443 #define ExFreePool(a) ExFreePoolWithTag(a,0)
2444 #endif
2445
2446 #define PROTECTED_POOL 0x80000000
2447
2448 /* Executive Functions */
2449
2450 static __inline PVOID
2451 ExAllocateFromZone(
2452 IN PZONE_HEADER Zone)
2453 {
2454 if (Zone->FreeList.Next)
2455 Zone->FreeList.Next = Zone->FreeList.Next->Next;
2456 return (PVOID) Zone->FreeList.Next;
2457 }
2458
2459 static __inline PVOID
2460 ExFreeToZone(
2461 IN PZONE_HEADER Zone,
2462 IN PVOID Block)
2463 {
2464 ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
2465 Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
2466 return ((PSINGLE_LIST_ENTRY) Block)->Next;
2467 }
2468
2469 /*
2470 * PVOID
2471 * ExInterlockedAllocateFromZone(
2472 * IN PZONE_HEADER Zone,
2473 * IN PKSPIN_LOCK Lock)
2474 */
2475 #define ExInterlockedAllocateFromZone(Zone, Lock) \
2476 ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
2477
2478 /* PVOID
2479 * ExInterlockedFreeToZone(
2480 * IN PZONE_HEADER Zone,
2481 * IN PVOID Block,
2482 * IN PKSPIN_LOCK Lock);
2483 */
2484 #define ExInterlockedFreeToZone(Zone, Block, Lock) \
2485 ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
2486
2487 /*
2488 * BOOLEAN
2489 * ExIsFullZone(
2490 * IN PZONE_HEADER Zone)
2491 */
2492 #define ExIsFullZone(Zone) \
2493 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
2494
2495 /* BOOLEAN
2496 * ExIsObjectInFirstZoneSegment(
2497 * IN PZONE_HEADER Zone,
2498 * IN PVOID Object);
2499 */
2500 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
2501 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
2502 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
2503 (Zone)->TotalSegmentSize)) )
2504
2505 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
2506 #define ExAcquireResourceShared ExAcquireResourceSharedLite
2507 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
2508 #define ExDeleteResource ExDeleteResourceLite
2509 #define ExInitializeResource ExInitializeResourceLite
2510 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
2511 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
2512 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
2513 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
2514
2515 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2516
2517 NTKERNELAPI
2518 NTSTATUS
2519 NTAPI
2520 ExExtendZone(
2521 IN OUT PZONE_HEADER Zone,
2522 IN OUT PVOID Segment,
2523 IN ULONG SegmentSize);
2524
2525 NTKERNELAPI
2526 NTSTATUS
2527 NTAPI
2528 ExInitializeZone(
2529 OUT PZONE_HEADER Zone,
2530 IN ULONG BlockSize,
2531 IN OUT PVOID InitialSegment,
2532 IN ULONG InitialSegmentSize);
2533
2534 NTKERNELAPI
2535 NTSTATUS
2536 NTAPI
2537 ExInterlockedExtendZone(
2538 IN OUT PZONE_HEADER Zone,
2539 IN OUT PVOID Segment,
2540 IN ULONG SegmentSize,
2541 IN OUT PKSPIN_LOCK Lock);
2542
2543 NTKERNELAPI
2544 NTSTATUS
2545 NTAPI
2546 ExUuidCreate(
2547 OUT UUID *Uuid);
2548
2549 NTKERNELAPI
2550 DECLSPEC_NORETURN
2551 VOID
2552 NTAPI
2553 ExRaiseAccessViolation(VOID);
2554
2555 NTKERNELAPI
2556 DECLSPEC_NORETURN
2557 VOID
2558 NTAPI
2559 ExRaiseDatatypeMisalignment(VOID);
2560
2561 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
2562
2563 /* Filesystem runtime library routines */
2564
2565 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2566 NTKERNELAPI
2567 BOOLEAN
2568 NTAPI
2569 FsRtlIsTotalDeviceFailure(
2570 IN NTSTATUS Status);
2571 #endif
2572
2573 /* Memory Manager Types */
2574
2575 typedef struct _PHYSICAL_MEMORY_RANGE {
2576 PHYSICAL_ADDRESS BaseAddress;
2577 LARGE_INTEGER NumberOfBytes;
2578 } PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
2579
2580 typedef NTSTATUS
2581 (*PMM_ROTATE_COPY_CALLBACK_FUNCTION) (
2582 IN PMDL DestinationMdl,
2583 IN PMDL SourceMdl,
2584 IN PVOID Context);
2585
2586 typedef enum _MM_ROTATE_DIRECTION {
2587 MmToFrameBuffer,
2588 MmToFrameBufferNoCopy,
2589 MmToRegularMemory,
2590 MmToRegularMemoryNoCopy,
2591 MmMaximumRotateDirection
2592 } MM_ROTATE_DIRECTION, *PMM_ROTATE_DIRECTION;
2593
2594 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2595 typedef ULONG NODE_REQUIREMENT;
2596 #define MM_ANY_NODE_OK 0x80000000
2597 #endif
2598
2599 /* Memory Manager Functions */
2600
2601 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2602
2603 NTKERNELAPI
2604 PPHYSICAL_MEMORY_RANGE
2605 NTAPI
2606 MmGetPhysicalMemoryRanges(VOID);
2607
2608 NTKERNELAPI
2609 PHYSICAL_ADDRESS
2610 NTAPI
2611 MmGetPhysicalAddress(
2612 IN PVOID BaseAddress);
2613
2614 NTKERNELAPI
2615 BOOLEAN
2616 NTAPI
2617 MmIsNonPagedSystemAddressValid(
2618 IN PVOID VirtualAddress);
2619
2620 NTKERNELAPI
2621 PVOID
2622 NTAPI
2623 MmAllocateNonCachedMemory(
2624 IN SIZE_T NumberOfBytes);
2625
2626 NTKERNELAPI
2627 VOID
2628 NTAPI
2629 MmFreeNonCachedMemory(
2630 IN PVOID BaseAddress,
2631 IN SIZE_T NumberOfBytes);
2632
2633 NTKERNELAPI
2634 PVOID
2635 NTAPI
2636 MmGetVirtualForPhysical(
2637 IN PHYSICAL_ADDRESS PhysicalAddress);
2638
2639 NTKERNELAPI
2640 NTSTATUS
2641 NTAPI
2642 MmMapUserAddressesToPage(
2643 IN PVOID BaseAddress,
2644 IN SIZE_T NumberOfBytes,
2645 IN PVOID PageAddress);
2646
2647 NTKERNELAPI
2648 PVOID
2649 NTAPI
2650 MmMapVideoDisplay(
2651 IN PHYSICAL_ADDRESS PhysicalAddress,
2652 IN SIZE_T NumberOfBytes,
2653 IN MEMORY_CACHING_TYPE CacheType);
2654
2655 NTKERNELAPI
2656 NTSTATUS
2657 NTAPI
2658 MmMapViewInSessionSpace(
2659 IN PVOID Section,
2660 OUT PVOID *MappedBase,
2661 IN OUT PSIZE_T ViewSize);
2662
2663 NTKERNELAPI
2664 NTSTATUS
2665 NTAPI
2666 MmMapViewInSystemSpace(
2667 IN PVOID Section,
2668 OUT PVOID *MappedBase,
2669 IN OUT PSIZE_T ViewSize);
2670
2671 NTKERNELAPI
2672 BOOLEAN
2673 NTAPI
2674 MmIsAddressValid(
2675 IN PVOID VirtualAddress);
2676
2677 NTKERNELAPI
2678 BOOLEAN
2679 NTAPI
2680 MmIsThisAnNtAsSystem(VOID);
2681
2682 NTKERNELAPI
2683 VOID
2684 NTAPI
2685 MmLockPagableSectionByHandle(
2686 IN PVOID ImageSectionHandle);
2687
2688 NTKERNELAPI
2689 NTSTATUS
2690 NTAPI
2691 MmUnmapViewInSessionSpace(
2692 IN PVOID MappedBase);
2693
2694 NTKERNELAPI
2695 NTSTATUS
2696 NTAPI
2697 MmUnmapViewInSystemSpace(
2698 IN PVOID MappedBase);
2699
2700 NTKERNELAPI
2701 VOID
2702 NTAPI
2703 MmUnsecureVirtualMemory(
2704 IN HANDLE SecureHandle);
2705
2706 NTKERNELAPI
2707 NTSTATUS
2708 NTAPI
2709 MmRemovePhysicalMemory(
2710 IN PPHYSICAL_ADDRESS StartAddress,
2711 IN OUT PLARGE_INTEGER NumberOfBytes);
2712
2713 NTKERNELAPI
2714 HANDLE
2715 NTAPI
2716 MmSecureVirtualMemory(
2717 IN PVOID Address,
2718 IN SIZE_T Size,
2719 IN ULONG ProbeMode);
2720
2721 NTKERNELAPI
2722 VOID
2723 NTAPI
2724 MmUnmapVideoDisplay(
2725 IN PVOID BaseAddress,
2726 IN SIZE_T NumberOfBytes);
2727
2728 NTKERNELAPI
2729 NTSTATUS
2730 NTAPI
2731 MmAddPhysicalMemory(
2732 IN PPHYSICAL_ADDRESS StartAddress,
2733 IN OUT PLARGE_INTEGER NumberOfBytes);
2734
2735 NTKERNELAPI
2736 PVOID
2737 NTAPI
2738 MmAllocateContiguousMemory(
2739 IN SIZE_T NumberOfBytes,
2740 IN PHYSICAL_ADDRESS HighestAcceptableAddress);
2741
2742 NTKERNELAPI
2743 PVOID
2744 NTAPI
2745 MmAllocateContiguousMemorySpecifyCache(
2746 IN SIZE_T NumberOfBytes,
2747 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
2748 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
2749 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
2750 IN MEMORY_CACHING_TYPE CacheType);
2751
2752 NTKERNELAPI
2753 PVOID
2754 NTAPI
2755 MmAllocateContiguousMemorySpecifyCacheNode(
2756 IN SIZE_T NumberOfBytes,
2757 IN PHYSICAL_ADDRESS LowestAcceptableAddress,
2758 IN PHYSICAL_ADDRESS HighestAcceptableAddress,
2759 IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
2760 IN MEMORY_CACHING_TYPE CacheType,
2761 IN NODE_REQUIREMENT PreferredNode);
2762
2763 NTKERNELAPI
2764 VOID
2765 NTAPI
2766 MmFreeContiguousMemory(
2767 IN PVOID BaseAddress);
2768
2769 NTKERNELAPI
2770 VOID
2771 NTAPI
2772 MmFreeContiguousMemorySpecifyCache(
2773 IN PVOID BaseAddress,
2774 IN SIZE_T NumberOfBytes,
2775 IN MEMORY_CACHING_TYPE CacheType);
2776
2777 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
2778
2779 #if (NTDDI_VERSION >= NTDDI_WS03)
2780 NTKERNELAPI
2781 NTSTATUS
2782 NTAPI
2783 MmCreateMirror(VOID);
2784 #endif
2785
2786 #if (NTDDI_VERSION >= NTDDI_VISTA)
2787 NTSTATUS
2788 NTAPI
2789 MmRotatePhysicalView(
2790 IN PVOID VirtualAddress,
2791 IN OUT PSIZE_T NumberOfBytes,
2792 IN PMDLX NewMdl OPTIONAL,
2793 IN MM_ROTATE_DIRECTION Direction,
2794 IN PMM_ROTATE_COPY_CALLBACK_FUNCTION CopyFunction,
2795 IN PVOID Context OPTIONAL);
2796 #endif
2797
2798 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2799 NTKERNELAPI
2800 BOOLEAN
2801 NTAPI
2802 SeSinglePrivilegeCheck(
2803 IN LUID PrivilegeValue,
2804 IN KPROCESSOR_MODE PreviousMode);
2805 #endif
2806
2807 extern NTKERNELAPI PEPROCESS PsInitialSystemProcess;
2808
2809 #if !defined(_PSGETCURRENTTHREAD_)
2810 #define _PSGETCURRENTTHREAD_
2811
2812 FORCEINLINE
2813 PETHREAD
2814 NTAPI
2815 PsGetCurrentThread(VOID)
2816 {
2817 return (PETHREAD)KeGetCurrentThread();
2818 }
2819
2820 #endif
2821
2822 /** Process Manager types **/
2823
2824 typedef VOID
2825 (NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)(
2826 IN HANDLE ParentId,
2827 IN HANDLE ProcessId,
2828 IN BOOLEAN Create);
2829
2830 typedef struct _PS_CREATE_NOTIFY_INFO {
2831 IN SIZE_T Size;
2832 union {
2833 IN ULONG Flags;
2834 struct {
2835 IN ULONG FileOpenNameAvailable:1;
2836 IN ULONG Reserved:31;
2837 };
2838 };
2839 IN HANDLE ParentProcessId;
2840 IN CLIENT_ID CreatingThreadId;
2841 IN OUT struct _FILE_OBJECT *FileObject;
2842 IN PCUNICODE_STRING ImageFileName;
2843 IN PCUNICODE_STRING CommandLine OPTIONAL;
2844 IN OUT NTSTATUS CreationStatus;
2845 } PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO;
2846
2847 typedef VOID
2848 (NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE_EX)(
2849 IN OUT PEPROCESS Process,
2850 IN HANDLE ProcessId,
2851 IN PPS_CREATE_NOTIFY_INFO CreateInfo OPTIONAL);
2852
2853 typedef VOID
2854 (NTAPI *PCREATE_THREAD_NOTIFY_ROUTINE)(
2855 IN HANDLE ProcessId,
2856 IN HANDLE ThreadId,
2857 IN BOOLEAN Create);
2858
2859 #define IMAGE_ADDRESSING_MODE_32BIT 3
2860
2861 typedef struct _IMAGE_INFO {
2862 _ANONYMOUS_UNION union {
2863 ULONG Properties;
2864 _ANONYMOUS_STRUCT struct {
2865 ULONG ImageAddressingMode:8;
2866 ULONG SystemModeImage:1;
2867 ULONG ImageMappedToAllPids:1;
2868 ULONG ExtendedInfoPresent:1;
2869 ULONG Reserved:21;
2870 } DUMMYSTRUCTNAME;
2871 } DUMMYUNIONNAME;
2872 PVOID ImageBase;
2873 ULONG ImageSelector;
2874 SIZE_T ImageSize;
2875 ULONG ImageSectionNumber;
2876 } IMAGE_INFO, *PIMAGE_INFO;
2877
2878 typedef struct _IMAGE_INFO_EX {
2879 SIZE_T Size;
2880 IMAGE_INFO ImageInfo;
2881 struct _FILE_OBJECT *FileObject;
2882 } IMAGE_INFO_EX, *PIMAGE_INFO_EX;
2883
2884 typedef VOID
2885 (NTAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)(
2886 IN PUNICODE_STRING FullImageName,
2887 IN HANDLE ProcessId,
2888 IN PIMAGE_INFO ImageInfo);
2889
2890 /** Process Manager functions **/
2891
2892 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2893
2894 NTKERNELAPI
2895 NTSTATUS
2896 NTAPI
2897 PsSetCreateProcessNotifyRoutine(
2898 IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
2899 IN BOOLEAN Remove);
2900
2901 NTKERNELAPI
2902 NTSTATUS
2903 NTAPI
2904 PsSetCreateThreadNotifyRoutine(
2905 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
2906
2907 NTKERNELAPI
2908 NTSTATUS
2909 NTAPI
2910 PsSetLoadImageNotifyRoutine(
2911 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
2912
2913 NTKERNELAPI
2914 HANDLE
2915 NTAPI
2916 PsGetCurrentProcessId(VOID);
2917
2918 NTKERNELAPI
2919 HANDLE
2920 NTAPI
2921 PsGetCurrentThreadId(VOID);
2922
2923 NTKERNELAPI
2924 BOOLEAN
2925 NTAPI
2926 PsGetVersion(
2927 OUT PULONG MajorVersion OPTIONAL,
2928 OUT PULONG MinorVersion OPTIONAL,
2929 OUT PULONG BuildNumber OPTIONAL,
2930 OUT PUNICODE_STRING CSDVersion OPTIONAL);
2931
2932 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
2933
2934 #if (NTDDI_VERSION >= NTDDI_WINXP)
2935
2936 NTKERNELAPI
2937 HANDLE
2938 NTAPI
2939 PsGetProcessId(
2940 IN PEPROCESS Process);
2941
2942 NTKERNELAPI
2943 HANDLE
2944 NTAPI
2945 PsGetThreadId(
2946 IN PETHREAD Thread);
2947
2948 NTKERNELAPI
2949 NTSTATUS
2950 NTAPI
2951 PsRemoveCreateThreadNotifyRoutine(
2952 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
2953
2954 NTKERNELAPI
2955 NTSTATUS
2956 NTAPI
2957 PsRemoveLoadImageNotifyRoutine(
2958 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
2959
2960 NTKERNELAPI
2961 LONGLONG
2962 NTAPI
2963 PsGetProcessCreateTimeQuadPart(
2964 IN PEPROCESS Process);
2965
2966 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
2967
2968 #if (NTDDI_VERSION >= NTDDI_WS03)
2969 NTKERNELAPI
2970 HANDLE
2971 NTAPI
2972 PsGetThreadProcessId(
2973 IN PETHREAD Thread);
2974 #endif
2975
2976 #if (NTDDI_VERSION >= NTDDI_VISTA)
2977
2978 NTKERNELAPI
2979 BOOLEAN
2980 NTAPI
2981 PsSetCurrentThreadPrefetching(
2982 IN BOOLEAN Prefetching);
2983
2984 NTKERNELAPI
2985 BOOLEAN
2986 NTAPI
2987 PsIsCurrentThreadPrefetching(VOID);
2988
2989 #endif
2990
2991 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
2992 NTKERNELAPI
2993 NTSTATUS
2994 NTAPI
2995 PsSetCreateProcessNotifyRoutineEx(
2996 IN PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine,
2997 IN BOOLEAN Remove);
2998 #endif
2999
3000 /* I/O Manager Types */
3001
3002 /*
3003 ** IRP function codes
3004 */
3005
3006 #define IRP_MN_QUERY_DIRECTORY 0x01
3007 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02
3008
3009 #define IRP_MN_USER_FS_REQUEST 0x00
3010 #define IRP_MN_MOUNT_VOLUME 0x01
3011 #define IRP_MN_VERIFY_VOLUME 0x02
3012 #define IRP_MN_LOAD_FILE_SYSTEM 0x03
3013 #define IRP_MN_TRACK_LINK 0x04
3014 #define IRP_MN_KERNEL_CALL 0x04
3015
3016 #define IRP_MN_LOCK 0x01
3017 #define IRP_MN_UNLOCK_SINGLE 0x02
3018 #define IRP_MN_UNLOCK_ALL 0x03
3019 #define IRP_MN_UNLOCK_ALL_BY_KEY 0x04
3020
3021 #define IRP_MN_FLUSH_AND_PURGE 0x01
3022
3023 #define IRP_MN_NORMAL 0x00
3024 #define IRP_MN_DPC 0x01
3025 #define IRP_MN_MDL 0x02
3026 #define IRP_MN_COMPLETE 0x04
3027 #define IRP_MN_COMPRESSED 0x08
3028
3029 #define IRP_MN_MDL_DPC (IRP_MN_MDL | IRP_MN_DPC)
3030 #define IRP_MN_COMPLETE_MDL (IRP_MN_COMPLETE | IRP_MN_MDL)
3031 #define IRP_MN_COMPLETE_MDL_DPC (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
3032
3033 #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
3034
3035 #define IO_CHECK_CREATE_PARAMETERS 0x0200
3036 #define IO_ATTACH_DEVICE 0x0400
3037 #define IO_IGNORE_SHARE_ACCESS_CHECK 0x0800
3038
3039 typedef
3040 NTSTATUS
3041 (NTAPI *PIO_QUERY_DEVICE_ROUTINE)(
3042 IN PVOID Context,
3043 IN PUNICODE_STRING PathName,
3044 IN INTERFACE_TYPE BusType,
3045 IN ULONG BusNumber,
3046 IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
3047 IN CONFIGURATION_TYPE ControllerType,
3048 IN ULONG ControllerNumber,
3049 IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
3050 IN CONFIGURATION_TYPE PeripheralType,
3051 IN ULONG PeripheralNumber,
3052 IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation);
3053
3054 typedef enum _IO_QUERY_DEVICE_DATA_FORMAT {
3055 IoQueryDeviceIdentifier = 0,
3056 IoQueryDeviceConfigurationData,
3057 IoQueryDeviceComponentInformation,
3058 IoQueryDeviceMaxData
3059 } IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT;
3060
3061 typedef VOID
3062 (NTAPI *PDRIVER_REINITIALIZE)(
3063 IN struct _DRIVER_OBJECT *DriverObject,
3064 IN PVOID Context OPTIONAL,
3065 IN ULONG Count);
3066
3067 typedef struct _CONTROLLER_OBJECT {
3068 CSHORT Type;
3069 CSHORT Size;
3070 PVOID ControllerExtension;
3071 KDEVICE_QUEUE DeviceWaitQueue;
3072 ULONG Spare1;
3073 LARGE_INTEGER Spare2;
3074 } CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
3075
3076 /* DEVICE_OBJECT.Flags */
3077
3078 #define DO_VERIFY_VOLUME 0x00000002
3079 #define DO_BUFFERED_IO 0x00000004
3080 #define DO_EXCLUSIVE 0x00000008
3081 #define DO_DIRECT_IO 0x00000010
3082 #define DO_MAP_IO_BUFFER 0x00000020
3083 #define DO_DEVICE_HAS_NAME 0x00000040
3084 #define DO_DEVICE_INITIALIZING 0x00000080
3085 #define DO_SYSTEM_BOOT_PARTITION 0x00000100
3086 #define DO_LONG_TERM_REQUESTS 0x00000200
3087 #define DO_NEVER_LAST_DEVICE 0x00000400
3088 #define DO_SHUTDOWN_REGISTERED 0x00000800
3089 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
3090 #define DO_POWER_PAGABLE 0x00002000
3091 #define DO_POWER_INRUSH 0x00004000
3092 #define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
3093 #define DO_SUPPORTS_TRANSACTIONS 0x00040000
3094 #define DO_FORCE_NEITHER_IO 0x00080000
3095 #define DO_VOLUME_DEVICE_OBJECT 0x00100000
3096 #define DO_SYSTEM_SYSTEM_PARTITION 0x00200000
3097 #define DO_SYSTEM_CRITICAL_PARTITION 0x00400000
3098 #define DO_DISALLOW_EXECUTE 0x00800000
3099
3100 #define DRVO_REINIT_REGISTERED 0x00000008
3101 #define DRVO_INITIALIZED 0x00000010
3102 #define DRVO_BOOTREINIT_REGISTERED 0x00000020
3103 #define DRVO_LEGACY_RESOURCES 0x00000040
3104
3105 typedef struct _CONFIGURATION_INFORMATION {
3106 ULONG DiskCount;
3107 ULONG FloppyCount;
3108 ULONG CdRomCount;
3109 ULONG TapeCount;
3110 ULONG ScsiPortCount;
3111 ULONG SerialCount;
3112 ULONG ParallelCount;
3113 BOOLEAN AtDiskPrimaryAddressClaimed;
3114 BOOLEAN AtDiskSecondaryAddressClaimed;
3115 ULONG Version;
3116 ULONG MediumChangerCount;
3117 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
3118
3119 typedef struct _DISK_SIGNATURE {
3120 ULONG PartitionStyle;
3121 _ANONYMOUS_UNION union {
3122 struct {
3123 ULONG Signature;
3124 ULONG CheckSum;
3125 } Mbr;
3126 struct {
3127 GUID DiskId;
3128 } Gpt;
3129 } DUMMYUNIONNAME;
3130 } DISK_SIGNATURE, *PDISK_SIGNATURE;
3131
3132 typedef struct _TXN_PARAMETER_BLOCK {
3133 USHORT Length;
3134 USHORT TxFsContext;
3135 PVOID TransactionObject;
3136 } TXN_PARAMETER_BLOCK, *PTXN_PARAMETER_BLOCK;
3137
3138 #define TXF_MINIVERSION_DEFAULT_VIEW (0xFFFE)
3139
3140 typedef struct _IO_DRIVER_CREATE_CONTEXT {
3141 CSHORT Size;
3142 struct _ECP_LIST *ExtraCreateParameter;
3143 PVOID DeviceObjectHint;
3144 PTXN_PARAMETER_BLOCK TxnParameters;
3145 } IO_DRIVER_CREATE_CONTEXT, *PIO_DRIVER_CREATE_CONTEXT;
3146
3147 typedef struct _AGP_TARGET_BUS_INTERFACE_STANDARD {
3148 USHORT Size;
3149 USHORT Version;
3150 PVOID Context;
3151 PINTERFACE_REFERENCE InterfaceReference;
3152 PINTERFACE_DEREFERENCE InterfaceDereference;
3153 PGET_SET_DEVICE_DATA SetBusData;
3154 PGET_SET_DEVICE_DATA GetBusData;
3155 UCHAR CapabilityID;
3156 } AGP_TARGET_BUS_INTERFACE_STANDARD, *PAGP_TARGET_BUS_INTERFACE_STANDARD;
3157
3158 typedef NTSTATUS
3159 (NTAPI *PGET_LOCATION_STRING)(
3160 IN OUT PVOID Context OPTIONAL,
3161 OUT PWCHAR *LocationStrings);
3162
3163 typedef struct _PNP_LOCATION_INTERFACE {
3164 USHORT Size;
3165 USHORT Version;
3166 PVOID Context;
3167 PINTERFACE_REFERENCE InterfaceReference;
3168 PINTERFACE_DEREFERENCE InterfaceDereference;
3169 PGET_LOCATION_STRING GetLocationString;
3170 } PNP_LOCATION_INTERFACE, *PPNP_LOCATION_INTERFACE;
3171
3172 typedef enum _ARBITER_ACTION {
3173 ArbiterActionTestAllocation,
3174 ArbiterActionRetestAllocation,
3175 ArbiterActionCommitAllocation,
3176 ArbiterActionRollbackAllocation,
3177 ArbiterActionQueryAllocatedResources,
3178 ArbiterActionWriteReservedResources,
3179 ArbiterActionQueryConflict,
3180 ArbiterActionQueryArbitrate,
3181 ArbiterActionAddReserved,
3182 ArbiterActionBootAllocation
3183 } ARBITER_ACTION, *PARBITER_ACTION;
3184
3185 typedef struct _ARBITER_CONFLICT_INFO {
3186 PDEVICE_OBJECT OwningObject;
3187 ULONGLONG Start;
3188 ULONGLONG End;
3189 } ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO;
3190
3191 typedef struct _ARBITER_TEST_ALLOCATION_PARAMETERS {
3192 IN OUT PLIST_ENTRY ArbitrationList;
3193 IN ULONG AllocateFromCount;
3194 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
3195 } ARBITER_TEST_ALLOCATION_PARAMETERS, *PARBITER_TEST_ALLOCATION_PARAMETERS;
3196
3197 typedef struct _ARBITER_RETEST_ALLOCATION_PARAMETERS {
3198 IN OUT PLIST_ENTRY ArbitrationList;
3199 IN ULONG AllocateFromCount;
3200 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
3201 } ARBITER_RETEST_ALLOCATION_PARAMETERS, *PARBITER_RETEST_ALLOCATION_PARAMETERS;
3202
3203 typedef struct _ARBITER_BOOT_ALLOCATION_PARAMETERS {
3204 IN OUT PLIST_ENTRY ArbitrationList;
3205 } ARBITER_BOOT_ALLOCATION_PARAMETERS, *PARBITER_BOOT_ALLOCATION_PARAMETERS;
3206
3207 typedef struct _ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS {
3208 OUT PCM_PARTIAL_RESOURCE_LIST *AllocatedResources;
3209 } ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS, *PARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS;
3210
3211 typedef struct _ARBITER_QUERY_CONFLICT_PARAMETERS {
3212 IN PDEVICE_OBJECT PhysicalDeviceObject;
3213 IN PIO_RESOURCE_DESCRIPTOR ConflictingResource;
3214 OUT PULONG ConflictCount;
3215 OUT PARBITER_CONFLICT_INFO *Conflicts;
3216 } ARBITER_QUERY_CONFLICT_PARAMETERS, *PARBITER_QUERY_CONFLICT_PARAMETERS;
3217
3218 typedef struct _ARBITER_QUERY_ARBITRATE_PARAMETERS {
3219 IN PLIST_ENTRY ArbitrationList;
3220 } ARBITER_QUERY_ARBITRATE_PARAMETERS, *PARBITER_QUERY_ARBITRATE_PARAMETERS;
3221
3222 typedef struct _ARBITER_ADD_RESERVED_PARAMETERS {
3223 IN PDEVICE_OBJECT ReserveDevice;
3224 } ARBITER_ADD_RESERVED_PARAMETERS, *PARBITER_ADD_RESERVED_PARAMETERS;
3225
3226 typedef struct _ARBITER_PARAMETERS {
3227 union {
3228 ARBITER_TEST_ALLOCATION_PARAMETERS TestAllocation;
3229 ARBITER_RETEST_ALLOCATION_PARAMETERS RetestAllocation;
3230 ARBITER_BOOT_ALLOCATION_PARAMETERS BootAllocation;
3231 ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS QueryAllocatedResources;
3232 ARBITER_QUERY_CONFLICT_PARAMETERS QueryConflict;
3233 ARBITER_QUERY_ARBITRATE_PARAMETERS QueryArbitrate;
3234 ARBITER_ADD_RESERVED_PARAMETERS AddReserved;
3235 } Parameters;
3236 } ARBITER_PARAMETERS, *PARBITER_PARAMETERS;
3237
3238 typedef enum _ARBITER_REQUEST_SOURCE {
3239 ArbiterRequestUndefined = -1,
3240 ArbiterRequestLegacyReported,
3241 ArbiterRequestHalReported,
3242 ArbiterRequestLegacyAssigned,
3243 ArbiterRequestPnpDetected,
3244 ArbiterRequestPnpEnumerated
3245 } ARBITER_REQUEST_SOURCE;
3246
3247 typedef enum _ARBITER_RESULT {
3248 ArbiterResultUndefined = -1,
3249 ArbiterResultSuccess,
3250 ArbiterResultExternalConflict,
3251 ArbiterResultNullRequest
3252 } ARBITER_RESULT;
3253
3254 #define ARBITER_FLAG_BOOT_CONFIG 0x00000001
3255
3256 typedef struct _ARBITER_LIST_ENTRY {
3257 LIST_ENTRY ListEntry;
3258 ULONG AlternativeCount;
3259 PIO_RESOURCE_DESCRIPTOR Alternatives;
3260 PDEVICE_OBJECT PhysicalDeviceObject;
3261 ARBITER_REQUEST_SOURCE RequestSource;
3262 ULONG Flags;
3263 LONG_PTR WorkSpace;
3264 INTERFACE_TYPE InterfaceType;
3265 ULONG SlotNumber;
3266 ULONG BusNumber;
3267 PCM_PARTIAL_RESOURCE_DESCRIPTOR Assignment;
3268 PIO_RESOURCE_DESCRIPTOR SelectedAlternative;
3269 ARBITER_RESULT Result;
3270 } ARBITER_LIST_ENTRY, *PARBITER_LIST_ENTRY;
3271
3272 typedef NTSTATUS
3273 (NTAPI *PARBITER_HANDLER)(
3274 IN OUT PVOID Context,
3275 IN ARBITER_ACTION Action,
3276 IN OUT PARBITER_PARAMETERS Parameters);
3277
3278 #define ARBITER_PARTIAL 0x00000001
3279
3280 typedef struct _ARBITER_INTERFACE {
3281 USHORT Size;
3282 USHORT Version;
3283 PVOID Context;
3284 PINTERFACE_REFERENCE InterfaceReference;
3285 PINTERFACE_DEREFERENCE InterfaceDereference;
3286 PARBITER_HANDLER ArbiterHandler;
3287 ULONG Flags;
3288 } ARBITER_INTERFACE, *PARBITER_INTERFACE;
3289
3290 typedef enum _RESOURCE_TRANSLATION_DIRECTION {
3291 TranslateChildToParent,
3292 TranslateParentToChild
3293 } RESOURCE_TRANSLATION_DIRECTION;
3294
3295 typedef NTSTATUS
3296 (NTAPI *PTRANSLATE_RESOURCE_HANDLER)(
3297 IN OUT PVOID Context OPTIONAL,
3298 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source,
3299 IN RESOURCE_TRANSLATION_DIRECTION Direction,
3300 IN ULONG AlternativesCount OPTIONAL,
3301 IN IO_RESOURCE_DESCRIPTOR Alternatives[],
3302 IN PDEVICE_OBJECT PhysicalDeviceObject,
3303 OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target);
3304
3305 typedef NTSTATUS
3306 (NTAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)(
3307 IN OUT PVOID Context OPTIONAL,
3308 IN PIO_RESOURCE_DESCRIPTOR Source,
3309 IN PDEVICE_OBJECT PhysicalDeviceObject,
3310 OUT PULONG TargetCount,
3311 OUT PIO_RESOURCE_DESCRIPTOR *Target);
3312
3313 typedef struct _TRANSLATOR_INTERFACE {
3314 USHORT Size;
3315 USHORT Version;
3316 PVOID Context;
3317 PINTERFACE_REFERENCE InterfaceReference;
3318 PINTERFACE_DEREFERENCE InterfaceDereference;
3319 PTRANSLATE_RESOURCE_HANDLER TranslateResources;
3320 PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements;
3321 } TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE;
3322
3323 typedef struct _PCI_AGP_CAPABILITY {
3324 PCI_CAPABILITIES_HEADER Header;
3325 USHORT Minor:4;
3326 USHORT Major:4;
3327 USHORT Rsvd1:8;
3328 struct _PCI_AGP_STATUS {
3329 ULONG Rate:3;
3330 ULONG Agp3Mode:1;
3331 ULONG FastWrite:1;
3332 ULONG FourGB:1;
3333 ULONG HostTransDisable:1;
3334 ULONG Gart64:1;
3335 ULONG ITA_Coherent:1;
3336 ULONG SideBandAddressing:1;
3337 ULONG CalibrationCycle:3;
3338 ULONG AsyncRequestSize:3;
3339 ULONG Rsvd1:1;
3340 ULONG Isoch:1;
3341 ULONG Rsvd2:6;
3342 ULONG RequestQueueDepthMaximum:8;
3343 } AGPStatus;
3344 struct _PCI_AGP_COMMAND {
3345 ULONG Rate:3;
3346 ULONG Rsvd1:1;
3347 ULONG FastWriteEnable:1;
3348 ULONG FourGBEnable:1;
3349 ULONG Rsvd2:1;
3350 ULONG Gart64:1;
3351 ULONG AGPEnable:1;
3352 ULONG SBAEnable:1;
3353 ULONG CalibrationCycle:3;
3354 ULONG AsyncReqSize:3;
3355 ULONG Rsvd3:8;
3356 ULONG RequestQueueDepth:8;
3357 } AGPCommand;
3358 } PCI_AGP_CAPABILITY, *PPCI_AGP_CAPABILITY;
3359
3360 typedef enum _EXTENDED_AGP_REGISTER {
3361 IsochStatus,
3362 AgpControl,
3363 ApertureSize,
3364 AperturePageSize,
3365 GartLow,
3366 GartHigh,
3367 IsochCommand
3368 } EXTENDED_AGP_REGISTER, *PEXTENDED_AGP_REGISTER;
3369
3370 typedef struct _PCI_AGP_ISOCH_STATUS {
3371 ULONG ErrorCode:2;
3372 ULONG Rsvd1:1;
3373 ULONG Isoch_L:3;
3374 ULONG Isoch_Y:2;
3375 ULONG Isoch_N:8;
3376 ULONG Rsvd2:16;
3377 } PCI_AGP_ISOCH_STATUS, *PPCI_AGP_ISOCH_STATUS;
3378
3379 typedef struct _PCI_AGP_CONTROL {
3380 ULONG Rsvd1:7;
3381 ULONG GTLB_Enable:1;
3382 ULONG AP_Enable:1;
3383 ULONG CAL_Disable:1;
3384 ULONG Rsvd2:22;
3385 } PCI_AGP_CONTROL, *PPCI_AGP_CONTROL;
3386
3387 typedef struct _PCI_AGP_APERTURE_PAGE_SIZE {
3388 USHORT PageSizeMask:11;
3389 USHORT Rsvd1:1;
3390 USHORT PageSizeSelect:4;
3391 } PCI_AGP_APERTURE_PAGE_SIZE, *PPCI_AGP_APERTURE_PAGE_SIZE;
3392
3393 typedef struct _PCI_AGP_ISOCH_COMMAND {
3394 USHORT Rsvd1:6;
3395 USHORT Isoch_Y:2;
3396 USHORT Isoch_N:8;
3397 } PCI_AGP_ISOCH_COMMAND, *PPCI_AGP_ISOCH_COMMAND;
3398
3399 typedef struct PCI_AGP_EXTENDED_CAPABILITY {
3400 PCI_AGP_ISOCH_STATUS IsochStatus;
3401 PCI_AGP_CONTROL AgpControl;
3402 USHORT ApertureSize;
3403 PCI_AGP_APERTURE_PAGE_SIZE AperturePageSize;
3404 ULONG GartLow;
3405 ULONG GartHigh;
3406 PCI_AGP_ISOCH_COMMAND IsochCommand;
3407 } PCI_AGP_EXTENDED_CAPABILITY, *PPCI_AGP_EXTENDED_CAPABILITY;
3408
3409 #define PCI_AGP_RATE_1X 0x1
3410 #define PCI_AGP_RATE_2X 0x2
3411 #define PCI_AGP_RATE_4X 0x4
3412
3413 #define PCIX_MODE_CONVENTIONAL_PCI 0x0
3414 #define PCIX_MODE1_66MHZ 0x1
3415 #define PCIX_MODE1_100MHZ 0x2
3416 #define PCIX_MODE1_133MHZ 0x3
3417 #define PCIX_MODE2_266_66MHZ 0x9
3418 #define PCIX_MODE2_266_100MHZ 0xA
3419 #define PCIX_MODE2_266_133MHZ 0xB
3420 #define PCIX_MODE2_533_66MHZ 0xD
3421 #define PCIX_MODE2_533_100MHZ 0xE
3422 #define PCIX_MODE2_533_133MHZ 0xF
3423
3424 #define PCIX_VERSION_MODE1_ONLY 0x0
3425 #define PCIX_VERSION_MODE2_ECC 0x1
3426 #define PCIX_VERSION_DUAL_MODE_ECC 0x2
3427
3428 typedef struct _PCIX_BRIDGE_CAPABILITY {
3429 PCI_CAPABILITIES_HEADER Header;
3430 union {
3431 struct {
3432 USHORT Bus64Bit:1;
3433 USHORT Bus133MHzCapable:1;
3434 USHORT SplitCompletionDiscarded:1;
3435 USHORT UnexpectedSplitCompletion:1;
3436 USHORT SplitCompletionOverrun:1;
3437 USHORT SplitRequestDelayed:1;
3438 USHORT BusModeFrequency:4;
3439 USHORT Rsvd:2;
3440 USHORT Version:2;
3441 USHORT Bus266MHzCapable:1;
3442 USHORT Bus533MHzCapable:1;
3443 } DUMMYSTRUCTNAME;
3444 USHORT AsUSHORT;
3445 } SecondaryStatus;
3446 union {
3447 struct {
3448 ULONG FunctionNumber:3;
3449 ULONG DeviceNumber:5;
3450 ULONG BusNumber:8;
3451 ULONG Device64Bit:1;
3452 ULONG Device133MHzCapable:1;
3453 ULONG SplitCompletionDiscarded:1;
3454 ULONG UnexpectedSplitCompletion:1;
3455 ULONG SplitCompletionOverrun:1;
3456 ULONG SplitRequestDelayed:1;
3457 ULONG Rsvd:7;
3458 ULONG DIMCapable:1;
3459 ULONG Device266MHzCapable:1;
3460 ULONG Device533MHzCapable:1;
3461 } DUMMYSTRUCTNAME;
3462 ULONG AsULONG;
3463 } BridgeStatus;
3464 USHORT UpstreamSplitTransactionCapacity;
3465 USHORT UpstreamSplitTransactionLimit;
3466 USHORT DownstreamSplitTransactionCapacity;
3467 USHORT DownstreamSplitTransactionLimit;
3468 union {
3469 struct {
3470 ULONG SelectSecondaryRegisters:1;
3471 ULONG ErrorPresentInOtherBank:1;
3472 ULONG AdditionalCorrectableError:1;
3473 ULONG AdditionalUncorrectableError:1;
3474 ULONG ErrorPhase:3;
3475 ULONG ErrorCorrected:1;
3476 ULONG Syndrome:8;
3477 ULONG ErrorFirstCommand:4;
3478 ULONG ErrorSecondCommand:4;
3479 ULONG ErrorUpperAttributes:4;
3480 ULONG ControlUpdateEnable:1;
3481 ULONG Rsvd:1;
3482 ULONG DisableSingleBitCorrection:1;
3483 ULONG EccMode:1;
3484 } DUMMYSTRUCTNAME;
3485 ULONG AsULONG;
3486 } EccControlStatus;
3487 ULONG EccFirstAddress;
3488 ULONG EccSecondAddress;
3489 ULONG EccAttribute;
3490 } PCIX_BRIDGE_CAPABILITY, *PPCIX_BRIDGE_CAPABILITY;
3491
3492 typedef struct _PCI_SUBSYSTEM_IDS_CAPABILITY {
3493 PCI_CAPABILITIES_HEADER Header;
3494 USHORT Reserved;
3495 USHORT SubVendorID;
3496 USHORT SubSystemID;
3497 } PCI_SUBSYSTEM_IDS_CAPABILITY, *PPCI_SUBSYSTEM_IDS_CAPABILITY;
3498
3499 #define OSC_FIRMWARE_FAILURE 0x02
3500 #define OSC_UNRECOGNIZED_UUID 0x04
3501 #define OSC_UNRECOGNIZED_REVISION 0x08
3502 #define OSC_CAPABILITIES_MASKED 0x10
3503
3504 #define PCI_ROOT_BUS_OSC_METHOD_CAPABILITY_REVISION 0x01
3505
3506 typedef struct _PCI_ROOT_BUS_OSC_SUPPORT_FIELD {
3507 union {
3508 struct {
3509 ULONG ExtendedConfigOpRegions:1;
3510 ULONG ActiveStatePowerManagement:1;
3511 ULONG ClockPowerManagement:1;
3512 ULONG SegmentGroups:1;
3513 ULONG MessageSignaledInterrupts:1;
3514 ULONG WindowsHardwareErrorArchitecture:1;
3515 ULONG Reserved:26;
3516 } DUMMYSTRUCTNAME;
3517 ULONG AsULONG;
3518 } u;
3519 } PCI_ROOT_BUS_OSC_SUPPORT_FIELD, *PPCI_ROOT_BUS_OSC_SUPPORT_FIELD;
3520
3521 typedef struct _PCI_ROOT_BUS_OSC_CONTROL_FIELD {
3522 union {
3523 struct {
3524 ULONG ExpressNativeHotPlug:1;
3525 ULONG ShpcNativeHotPlug:1;
3526 ULONG ExpressNativePME:1;
3527 ULONG ExpressAdvancedErrorReporting:1;
3528 ULONG ExpressCapabilityStructure:1;
3529 ULONG Reserved:27;
3530 } DUMMYSTRUCTNAME;
3531 ULONG AsULONG;
3532 } u;
3533 } PCI_ROOT_BUS_OSC_CONTROL_FIELD, *PPCI_ROOT_BUS_OSC_CONTROL_FIELD;
3534
3535 typedef enum _PCI_HARDWARE_INTERFACE {
3536 PciConventional,
3537 PciXMode1,
3538 PciXMode2,
3539 PciExpress
3540 } PCI_HARDWARE_INTERFACE, *PPCI_HARDWARE_INTERFACE;
3541
3542 typedef enum {
3543 BusWidth32Bits,
3544 BusWidth64Bits
3545 } PCI_BUS_WIDTH;
3546
3547 typedef struct _PCI_ROOT_BUS_HARDWARE_CAPABILITY {
3548 PCI_HARDWARE_INTERFACE SecondaryInterface;
3549 struct {
3550 BOOLEAN BusCapabilitiesFound;
3551 ULONG CurrentSpeedAndMode;
3552 ULONG SupportedSpeedsAndModes;
3553 BOOLEAN DeviceIDMessagingCapable;
3554 PCI_BUS_WIDTH SecondaryBusWidth;
3555 } DUMMYSTRUCTNAME;
3556 PCI_ROOT_BUS_OSC_SUPPORT_FIELD OscFeatureSupport;
3557 PCI_ROOT_BUS_OSC_CONTROL_FIELD OscControlRequest;
3558 PCI_ROOT_BUS_OSC_CONTROL_FIELD OscControlGranted;
3559 } PCI_ROOT_BUS_HARDWARE_CAPABILITY, *PPCI_ROOT_BUS_HARDWARE_CAPABILITY;
3560
3561 typedef union _PCI_EXPRESS_CAPABILITIES_REGISTER {
3562 struct {
3563 USHORT CapabilityVersion:4;
3564 USHORT DeviceType:4;
3565 USHORT SlotImplemented:1;
3566 USHORT InterruptMessageNumber:5;
3567 USHORT Rsvd:2;
3568 } DUMMYSTRUCTNAME;
3569 USHORT AsUSHORT;
3570 } PCI_EXPRESS_CAPABILITIES_REGISTER, *PPCI_EXPRESS_CAPABILITIES_REGISTER;
3571
3572 typedef union _PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER {
3573 struct {
3574 ULONG MaxPayloadSizeSupported:3;
3575 ULONG PhantomFunctionsSupported:2;
3576 ULONG ExtendedTagSupported:1;
3577 ULONG L0sAcceptableLatency:3;
3578 ULONG L1AcceptableLatency:3;
3579 ULONG Undefined:3;
3580 ULONG RoleBasedErrorReporting:1;
3581 ULONG Rsvd1:2;
3582 ULONG CapturedSlotPowerLimit:8;
3583 ULONG CapturedSlotPowerLimitScale:2;
3584 ULONG Rsvd2:4;
3585 } DUMMYSTRUCTNAME;
3586 ULONG AsULONG;
3587 } PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER, *PPCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER;
3588
3589 #define PCI_EXPRESS_AER_DEVICE_CONTROL_MASK 0x07;
3590
3591 typedef union _PCI_EXPRESS_DEVICE_CONTROL_REGISTER {
3592 struct {
3593 USHORT CorrectableErrorEnable:1;
3594 USHORT NonFatalErrorEnable:1;
3595 USHORT FatalErrorEnable:1;
3596 USHORT UnsupportedRequestErrorEnable:1;
3597 USHORT EnableRelaxedOrder:1;
3598 USHORT MaxPayloadSize:3;
3599 USHORT ExtendedTagEnable:1;
3600 USHORT PhantomFunctionsEnable:1;
3601 USHORT AuxPowerEnable:1;
3602 USHORT NoSnoopEnable:1;
3603 USHORT MaxReadRequestSize:3;
3604 USHORT BridgeConfigRetryEnable:1;
3605 } DUMMYSTRUCTNAME;
3606 USHORT AsUSHORT;
3607 } PCI_EXPRESS_DEVICE_CONTROL_REGISTER, *PPCI_EXPRESS_DEVICE_CONTROL_REGISTER;
3608
3609 #define PCI_EXPRESS_AER_DEVICE_STATUS_MASK 0x0F;
3610
3611 typedef union _PCI_EXPRESS_DEVICE_STATUS_REGISTER {
3612 struct {
3613 USHORT CorrectableErrorDetected:1;
3614 USHORT NonFatalErrorDetected:1;
3615 USHORT FatalErrorDetected:1;
3616 USHORT UnsupportedRequestDetected:1;
3617 USHORT AuxPowerDetected:1;
3618 USHORT TransactionsPending:1;
3619 USHORT Rsvd:10;
3620 } DUMMYSTRUCTNAME;
3621 USHORT AsUSHORT;
3622 } PCI_EXPRESS_DEVICE_STATUS_REGISTER, *PPCI_EXPRESS_DEVICE_STATUS_REGISTER;
3623
3624 typedef union _PCI_EXPRESS_LINK_CAPABILITIES_REGISTER {
3625 struct {
3626 ULONG MaximumLinkSpeed:4;
3627 ULONG MaximumLinkWidth:6;
3628 ULONG ActiveStatePMSupport:2;
3629 ULONG L0sExitLatency:3;
3630 ULONG L1ExitLatency:3;
3631 ULONG ClockPowerManagement:1;
3632 ULONG SurpriseDownErrorReportingCapable:1;
3633 ULONG DataLinkLayerActiveReportingCapable:1;
3634 ULONG Rsvd:3;
3635 ULONG PortNumber:8;
3636 } DUMMYSTRUCTNAME;
3637 ULONG AsULONG;
3638 } PCI_EXPRESS_LINK_CAPABILITIES_REGISTER, *PPCI_EXPRESS_LINK_CAPABILITIES_REGISTER;
3639
3640 typedef union _PCI_EXPRESS_LINK_CONTROL_REGISTER {
3641 struct {
3642 USHORT ActiveStatePMControl:2;
3643 USHORT Rsvd1:1;
3644 USHORT ReadCompletionBoundary:1;
3645 USHORT LinkDisable:1;
3646 USHORT RetrainLink:1;
3647 USHORT CommonClockConfig:1;
3648 USHORT ExtendedSynch:1;
3649 USHORT EnableClockPowerManagement:1;
3650 USHORT Rsvd2:7;
3651 } DUMMYSTRUCTNAME;
3652 USHORT AsUSHORT;
3653 } PCI_EXPRESS_LINK_CONTROL_REGISTER, *PPCI_EXPRESS_LINK_CONTROL_REGISTER;
3654
3655 typedef union _PCI_EXPRESS_LINK_STATUS_REGISTER {
3656 struct {
3657 USHORT LinkSpeed:4;
3658 USHORT LinkWidth:6;
3659 USHORT Undefined:1;
3660 USHORT LinkTraining:1;
3661 USHORT SlotClockConfig:1;
3662 USHORT DataLinkLayerActive:1;
3663 USHORT Rsvd:2;
3664 } DUMMYSTRUCTNAME;
3665 USHORT AsUSHORT;
3666 } PCI_EXPRESS_LINK_STATUS_REGISTER, *PPCI_EXPRESS_LINK_STATUS_REGISTER;
3667
3668 typedef union _PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER {
3669 struct {
3670 ULONG AttentionButtonPresent:1;
3671 ULONG PowerControllerPresent:1;
3672 ULONG MRLSensorPresent:1;
3673 ULONG AttentionIndicatorPresent:1;
3674 ULONG PowerIndicatorPresent:1;
3675 ULONG HotPlugSurprise:1;
3676 ULONG HotPlugCapable:1;
3677 ULONG SlotPowerLimit:8;
3678 ULONG SlotPowerLimitScale:2;
3679 ULONG ElectromechanicalLockPresent:1;
3680 ULONG NoCommandCompletedSupport:1;
3681 ULONG PhysicalSlotNumber:13;
3682 } DUMMYSTRUCTNAME;
3683 ULONG AsULONG;
3684 } PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER, *PPCI_EXPRESS_SLOT_CAPABILITIES_REGISTER;
3685
3686 typedef union _PCI_EXPRESS_SLOT_CONTROL_REGISTER {
3687 struct {
3688 USHORT AttentionButtonEnable:1;
3689 USHORT PowerFaultDetectEnable:1;
3690 USHORT MRLSensorEnable:1;
3691 USHORT PresenceDetectEnable:1;
3692 USHORT CommandCompletedEnable:1;
3693 USHORT HotPlugInterruptEnable:1;
3694 USHORT AttentionIndicatorControl:2;
3695 USHORT PowerIndicatorControl:2;
3696 USHORT PowerControllerControl:1;
3697 USHORT ElectromechanicalLockControl:1;
3698 USHORT DataLinkStateChangeEnable:1;
3699 USHORT Rsvd:3;
3700 } DUMMYSTRUCTNAME;
3701 USHORT AsUSHORT;
3702 } PCI_EXPRESS_SLOT_CONTROL_REGISTER, *PPCI_EXPRESS_SLOT_CONTROL_REGISTER;
3703
3704 typedef union _PCI_EXPRESS_SLOT_STATUS_REGISTER {
3705 struct {
3706 USHORT AttentionButtonPressed:1;
3707 USHORT PowerFaultDetected:1;
3708 USHORT MRLSensorChanged:1;
3709 USHORT PresenceDetectChanged:1;
3710 USHORT CommandCompleted:1;
3711 USHORT MRLSensorState:1;
3712 USHORT PresenceDetectState:1;
3713 USHORT ElectromechanicalLockEngaged:1;
3714 USHORT DataLinkStateChanged:1;
3715 USHORT Rsvd:7;
3716 } DUMMYSTRUCTNAME;
3717 USHORT AsUSHORT;
3718 } PCI_EXPRESS_SLOT_STATUS_REGISTER, *PPCI_EXPRESS_SLOT_STATUS_REGISTER;
3719
3720 typedef union _PCI_EXPRESS_ROOT_CONTROL_REGISTER {
3721 struct {
3722 USHORT CorrectableSerrEnable:1;
3723 USHORT NonFatalSerrEnable:1;
3724 USHORT FatalSerrEnable:1;
3725 USHORT PMEInterruptEnable:1;
3726 USHORT CRSSoftwareVisibilityEnable:1;
3727 USHORT Rsvd:11;
3728 } DUMMYSTRUCTNAME;
3729 USHORT AsUSHORT;
3730 } PCI_EXPRESS_ROOT_CONTROL_REGISTER, *PPCI_EXPRESS_ROOT_CONTROL_REGISTER;
3731
3732 typedef union _PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER {
3733 struct {
3734 USHORT CRSSoftwareVisibility:1;
3735 USHORT Rsvd:15;
3736 } DUMMYSTRUCTNAME;
3737 USHORT AsUSHORT;
3738 } PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER, *PPCI_EXPRESS_ROOT_CAPABILITIES_REGISTER;
3739
3740 typedef union _PCI_EXPRESS_ROOT_STATUS_REGISTER {
3741 struct {
3742 ULONG PMERequestorId:16;
3743 ULONG PMEStatus:1;
3744 ULONG PMEPending:1;
3745 ULONG Rsvd:14;
3746 } DUMMYSTRUCTNAME;
3747 ULONG AsULONG;
3748 } PCI_EXPRESS_ROOT_STATUS_REGISTER, *PPCI_EXPRESS_ROOT_STATUS_REGISTER;
3749
3750 typedef struct _PCI_EXPRESS_CAPABILITY {
3751 PCI_CAPABILITIES_HEADER Header;
3752 PCI_EXPRESS_CAPABILITIES_REGISTER ExpressCapabilities;
3753 PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER DeviceCapabilities;
3754 PCI_EXPRESS_DEVICE_CONTROL_REGISTER DeviceControl;
3755 PCI_EXPRESS_DEVICE_STATUS_REGISTER DeviceStatus;
3756 PCI_EXPRESS_LINK_CAPABILITIES_REGISTER LinkCapabilities;
3757 PCI_EXPRESS_LINK_CONTROL_REGISTER LinkControl;
3758 PCI_EXPRESS_LINK_STATUS_REGISTER LinkStatus;
3759 PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER SlotCapabilities;
3760 PCI_EXPRESS_SLOT_CONTROL_REGISTER SlotControl;
3761 PCI_EXPRESS_SLOT_STATUS_REGISTER SlotStatus;
3762 PCI_EXPRESS_ROOT_CONTROL_REGISTER RootControl;
3763 PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER RootCapabilities;
3764 PCI_EXPRESS_ROOT_STATUS_REGISTER RootStatus;
3765 } PCI_EXPRESS_CAPABILITY, *PPCI_EXPRESS_CAPABILITY;
3766
3767 typedef enum {
3768 MRLClosed = 0,
3769 MRLOpen
3770 } PCI_EXPRESS_MRL_STATE;
3771
3772 typedef enum {
3773 SlotEmpty = 0,
3774 CardPresent
3775 } PCI_EXPRESS_CARD_PRESENCE;
3776
3777 typedef enum {
3778 IndicatorOn = 1,
3779 IndicatorBlink,
3780 IndicatorOff
3781 } PCI_EXPRESS_INDICATOR_STATE;
3782
3783 typedef enum {
3784 PowerOn = 0,
3785 PowerOff
3786 } PCI_EXPRESS_POWER_STATE;
3787
3788 typedef enum {
3789 L0sEntrySupport = 1,
3790 L0sAndL1EntrySupport = 3
3791 } PCI_EXPRESS_ASPM_SUPPORT;
3792
3793 typedef enum {
3794 L0sAndL1EntryDisabled,
3795 L0sEntryEnabled,
3796 L1EntryEnabled,
3797 L0sAndL1EntryEnabled
3798 } PCI_EXPRESS_ASPM_CONTROL;
3799
3800 typedef enum {
3801 L0s_Below64ns = 0,
3802 L0s_64ns_128ns,
3803 L0s_128ns_256ns,
3804 L0s_256ns_512ns,
3805 L0s_512ns_1us,
3806 L0s_1us_2us,
3807 L0s_2us_4us,
3808 L0s_Above4us
3809 } PCI_EXPRESS_L0s_EXIT_LATENCY;
3810
3811 typedef enum {
3812 L1_Below1us = 0,
3813 L1_1us_2us,
3814 L1_2us_4us,
3815 L1_4us_8us,
3816 L1_8us_16us,
3817 L1_16us_32us,
3818 L1_32us_64us,
3819 L1_Above64us
3820 } PCI_EXPRESS_L1_EXIT_LATENCY;
3821
3822 typedef enum {
3823 PciExpressEndpoint = 0,
3824 PciExpressLegacyEndpoint,
3825 PciExpressRootPort = 4,
3826 PciExpressUpstreamSwitchPort,
3827 PciExpressDownstreamSwitchPort,
3828 PciExpressToPciXBridge,
3829 PciXToExpressBridge,
3830 PciExpressRootComplexIntegratedEndpoint,
3831 PciExpressRootComplexEventCollector
3832 } PCI_EXPRESS_DEVICE_TYPE;
3833
3834 typedef enum {
3835 MaxPayload128Bytes = 0,
3836 MaxPayload256Bytes,
3837 MaxPayload512Bytes,
3838 MaxPayload1024Bytes,
3839 MaxPayload2048Bytes,
3840 MaxPayload4096Bytes
3841 } PCI_EXPRESS_MAX_PAYLOAD_SIZE;
3842
3843 typedef union _PCI_EXPRESS_PME_REQUESTOR_ID {
3844 struct {
3845 USHORT FunctionNumber:3;
3846 USHORT DeviceNumber:5;
3847 USHORT BusNumber:8;
3848 } DUMMYSTRUCTNAME;
3849 USHORT AsUSHORT;
3850 } PCI_EXPRESS_PME_REQUESTOR_ID, *PPCI_EXPRESS_PME_REQUESTOR_ID;
3851
3852 /* I/O Manager Functions */
3853
3854 /*
3855 * VOID IoAssignArcName(
3856 * IN PUNICODE_STRING ArcName,
3857 * IN PUNICODE_STRING DeviceName);
3858 */
3859 #define IoAssignArcName(_ArcName, _DeviceName) ( \
3860 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
3861
3862 /*
3863 * VOID
3864 * IoDeassignArcName(
3865 * IN PUNICODE_STRING ArcName)
3866 */
3867 #define IoDeassignArcName IoDeleteSymbolicLink
3868
3869 VOID
3870 FORCEINLINE
3871 NTAPI
3872 IoInitializeDriverCreateContext(
3873 PIO_DRIVER_CREATE_CONTEXT DriverContext)
3874 {
3875 RtlZeroMemory(DriverContext, sizeof(IO_DRIVER_CREATE_CONTEXT));
3876 DriverContext->Size = sizeof(IO_DRIVER_CREATE_CONTEXT);
3877 }
3878
3879 #if (NTDDI_VERSION >= NTDDI_WIN2K)
3880
3881 #if !(defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_))
3882 NTKERNELAPI
3883 NTSTATUS
3884 NTAPI
3885 IoAllocateAdapterChannel(
3886 IN PADAPTER_OBJECT AdapterObject,
3887 IN PDEVICE_OBJECT DeviceObject,
3888 IN ULONG NumberOfMapRegisters,
3889 IN PDRIVER_CONTROL ExecutionRoutine,
3890 IN PVOID Context);
3891 #endif
3892
3893 //DECLSPEC_DEPRECATED_DDK
3894 NTHALAPI
3895 PHYSICAL_ADDRESS
3896 NTAPI
3897 IoMapTransfer(
3898 IN PADAPTER_OBJECT AdapterObject,
3899 IN PMDL Mdl,
3900 IN PVOID MapRegisterBase,
3901 IN PVOID CurrentVa,
3902 IN OUT PULONG Length,
3903 IN BOOLEAN WriteToDevice);
3904
3905 NTKERNELAPI
3906 VOID
3907 NTAPI
3908 IoAllocateController(
3909 IN PCONTROLLER_OBJECT ControllerObject,
3910 IN PDEVICE_OBJECT DeviceObject,
3911 IN PDRIVER_CONTROL ExecutionRoutine,
3912 IN PVOID Context OPTIONAL);
3913
3914 NTKERNELAPI
3915 PCONTROLLER_OBJECT
3916 NTAPI
3917 IoCreateController(
3918 IN ULONG Size);
3919
3920 NTKERNELAPI
3921 VOID
3922 NTAPI
3923 IoDeleteController(
3924 IN PCONTROLLER_OBJECT ControllerObject);
3925
3926 NTKERNELAPI
3927 VOID
3928 NTAPI
3929 IoFreeController(
3930 IN PCONTROLLER_OBJECT ControllerObject);
3931
3932 NTKERNELAPI
3933 PCONFIGURATION_INFORMATION
3934 NTAPI
3935 IoGetConfigurationInformation(VOID);
3936
3937 NTKERNELAPI
3938 PDEVICE_OBJECT
3939 NTAPI
3940 IoGetDeviceToVerify(
3941 IN PETHREAD Thread);
3942
3943 NTKERNELAPI
3944 VOID
3945 NTAPI
3946 IoCancelFileOpen(
3947 IN PDEVICE_OBJECT DeviceObject,
3948 IN PFILE_OBJECT FileObject);
3949
3950 NTKERNELAPI
3951 PGENERIC_MAPPING
3952 NTAPI
3953 IoGetFileObjectGenericMapping(VOID);
3954
3955 NTKERNELAPI
3956 PIRP
3957 NTAPI
3958 IoMakeAssociatedIrp(
3959 IN PIRP Irp,
3960 IN CCHAR StackSize);
3961
3962 NTKERNELAPI
3963 NTSTATUS
3964 NTAPI
3965 IoQueryDeviceDescription(
3966 IN PINTERFACE_TYPE BusType OPTIONAL,
3967 IN PULONG BusNumber OPTIONAL,
3968 IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
3969 IN PULONG ControllerNumber OPTIONAL,
3970 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
3971 IN PULONG PeripheralNumber OPTIONAL,
3972 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
3973 IN OUT PVOID Context OPTIONAL);
3974
3975 NTKERNELAPI
3976 VOID
3977 NTAPI
3978 IoRaiseHardError(
3979 IN PIRP Irp,
3980 IN PVPB Vpb OPTIONAL,
3981 IN PDEVICE_OBJECT RealDeviceObject);
3982
3983 NTKERNELAPI
3984 BOOLEAN
3985 NTAPI
3986 IoRaiseInformationalHardError(
3987 IN NTSTATUS ErrorStatus,
3988 IN PUNICODE_STRING String OPTIONAL,
3989 IN PKTHREAD Thread OPTIONAL);
3990
3991 NTKERNELAPI
3992 VOID
3993 NTAPI
3994 IoRegisterBootDriverReinitialization(
3995 IN PDRIVER_OBJECT DriverObject,
3996 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
3997 IN PVOID Context OPTIONAL);
3998
3999 NTKERNELAPI
4000 VOID
4001 NTAPI
4002 IoRegisterDriverReinitialization(
4003 IN PDRIVER_OBJECT DriverObject,
4004 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
4005 IN PVOID Context OPTIONAL);
4006
4007 NTKERNELAPI
4008 NTSTATUS
4009 NTAPI
4010 IoAttachDeviceByPointer(
4011 IN PDEVICE_OBJECT SourceDevice,
4012 IN PDEVICE_OBJECT TargetDevice);
4013
4014 NTKERNELAPI
4015 NTSTATUS
4016 NTAPI
4017 IoReportDetectedDevice(
4018 IN PDRIVER_OBJECT DriverObject,
4019 IN INTERFACE_TYPE LegacyBusType,
4020 IN ULONG BusNumber,
4021 IN ULONG SlotNumber,
4022 IN PCM_RESOURCE_LIST ResourceList OPTIONAL,
4023 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
4024 IN BOOLEAN ResourceAssigned,
4025 IN OUT PDEVICE_OBJECT *DeviceObject OPTIONAL);
4026
4027 NTKERNELAPI
4028 NTSTATUS
4029 NTAPI
4030 IoReportResourceForDetection(
4031 IN PDRIVER_OBJECT DriverObject,
4032 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
4033 IN ULONG DriverListSize OPTIONAL,
4034 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
4035 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
4036 IN ULONG DeviceListSize OPTIONAL,
4037 OUT PBOOLEAN ConflictDetected);
4038
4039 NTKERNELAPI
4040 NTSTATUS
4041 NTAPI
4042 IoReportResourceUsage(
4043 IN PUNICODE_STRING DriverClassName OPTIONAL,
4044 IN PDRIVER_OBJECT DriverObject,
4045 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
4046 IN ULONG DriverListSize OPTIONAL,
4047 IN PDEVICE_OBJECT DeviceObject,
4048 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
4049 IN ULONG DeviceListSize OPTIONAL,
4050 IN BOOLEAN OverrideConflict,
4051 OUT PBOOLEAN ConflictDetected);
4052
4053 NTKERNELAPI
4054 VOID
4055 NTAPI
4056 IoSetHardErrorOrVerifyDevice(
4057 IN PIRP Irp,
4058 IN PDEVICE_OBJECT DeviceObject);
4059
4060 NTKERNELAPI
4061 NTSTATUS
4062 NTAPI
4063 IoAssignResources(
4064 IN PUNICODE_STRING RegistryPath,
4065 IN PUNICODE_STRING DriverClassName OPTIONAL,
4066 IN PDRIVER_OBJECT DriverObject,
4067 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
4068 IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources OPTIONAL,
4069 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
4070
4071 NTKERNELAPI
4072 BOOLEAN
4073 NTAPI
4074 IoSetThreadHardErrorMode(
4075 IN BOOLEAN EnableHardErrors);
4076
4077 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
4078
4079 #if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
4080
4081 NTKERNELAPI
4082 BOOLEAN
4083 NTAPI
4084 IoIsFileOriginRemote(
4085 IN PFILE_OBJECT FileObject);
4086
4087 NTKERNELAPI
4088 NTSTATUS
4089 NTAPI
4090 IoSetFileOrigin(
4091 IN PFILE_OBJECT FileObject,
4092 IN BOOLEAN Remote);
4093
4094 #endif
4095
4096 #if (NTDDI_VERSION >= NTDDI_WINXP)
4097
4098 NTKERNELAPI
4099 NTSTATUS
4100 FASTCALL
4101 IoReadPartitionTable(
4102 IN PDEVICE_OBJECT DeviceObject,
4103 IN ULONG SectorSize,
4104 IN BOOLEAN ReturnRecognizedPartitions,
4105 OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
4106
4107 NTKERNELAPI
4108 NTSTATUS
4109 FASTCALL
4110 IoSetPartitionInformation(
4111 IN PDEVICE_OBJECT DeviceObject,
4112 IN ULONG SectorSize,
4113 IN ULONG PartitionNumber,
4114 IN ULONG PartitionType);
4115
4116 NTKERNELAPI
4117 NTSTATUS
4118 FASTCALL
4119 IoWritePartitionTable(
4120 IN PDEVICE_OBJECT DeviceObject,
4121 IN ULONG SectorSize,
4122 IN ULONG SectorsPerTrack,
4123 IN ULONG NumberOfHeads,
4124 IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
4125
4126 NTKERNELAPI
4127 NTSTATUS
4128 NTAPI
4129 IoCreateDisk(
4130 IN PDEVICE_OBJECT DeviceObject,
4131 IN struct _CREATE_DISK* Disk OPTIONAL);
4132
4133 NTKERNELAPI
4134 NTSTATUS
4135 NTAPI
4136 IoReadDiskSignature(
4137 IN PDEVICE_OBJECT DeviceObject,
4138 IN ULONG BytesPerSector,
4139 OUT PDISK_SIGNATURE Signature);
4140
4141 NTKERNELAPI
4142 NTSTATUS
4143 NTAPI
4144 IoReadPartitionTableEx(
4145 IN PDEVICE_OBJECT DeviceObject,
4146 OUT struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
4147
4148 NTKERNELAPI
4149 NTSTATUS
4150 NTAPI
4151 IoSetPartitionInformationEx(
4152 IN PDEVICE_OBJECT DeviceObject,
4153 IN ULONG PartitionNumber,
4154 IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
4155
4156 NTKERNELAPI
4157 NTSTATUS
4158 NTAPI
4159 IoSetSystemPartition(
4160 IN PUNICODE_STRING VolumeNameString);
4161
4162 NTKERNELAPI
4163 NTSTATUS
4164 NTAPI
4165 IoVerifyPartitionTable(
4166 IN PDEVICE_OBJECT DeviceObject,
4167 IN BOOLEAN FixErrors);
4168
4169 NTKERNELAPI
4170 NTSTATUS
4171 NTAPI
4172 IoVolumeDeviceToDosName(
4173 IN PVOID VolumeDeviceObject,
4174 OUT PUNICODE_STRING DosName);
4175
4176 NTKERNELAPI
4177 NTSTATUS
4178 NTAPI
4179 IoWritePartitionTableEx(
4180 IN PDEVICE_OBJECT DeviceObject,
4181 IN struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout);
4182
4183 NTKERNELAPI
4184 NTSTATUS
4185 NTAPI
4186 IoCreateFileSpecifyDeviceObjectHint(
4187 OUT PHANDLE FileHandle,
4188 IN ACCESS_MASK DesiredAccess,
4189 IN POBJECT_ATTRIBUTES ObjectAttributes,
4190 OUT PIO_STATUS_BLOCK IoStatusBlock,
4191 IN PLARGE_INTEGER AllocationSize OPTIONAL,
4192 IN ULONG FileAttributes,
4193 IN ULONG ShareAccess,
4194 IN ULONG Disposition,
4195 IN ULONG CreateOptions,
4196 IN PVOID EaBuffer OPTIONAL,
4197 IN ULONG EaLength,
4198 IN CREATE_FILE_TYPE CreateFileType,
4199 IN PVOID InternalParameters OPTIONAL,
4200 IN ULONG Options,
4201 IN PVOID DeviceObject OPTIONAL);
4202
4203 NTKERNELAPI
4204 NTSTATUS
4205 NTAPI
4206 IoAttachDeviceToDeviceStackSafe(
4207 IN PDEVICE_OBJECT SourceDevice,
4208 IN PDEVICE_OBJECT TargetDevice,
4209 OUT PDEVICE_OBJECT *AttachedToDeviceObject);
4210
4211 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
4212
4213 #if (NTDDI_VERSION >= NTDDI_WS03)
4214 NTKERNELAPI
4215 IO_PAGING_PRIORITY
4216 FASTCALL
4217 IoGetPagingIoPriority(
4218 IN PIRP Irp);
4219 #endif
4220
4221 #if (NTDDI_VERSION >= NTDDI_WS03SP1)
4222 BOOLEAN
4223 NTAPI
4224 IoTranslateBusAddress(
4225 IN INTERFACE_TYPE InterfaceType,
4226 IN ULONG BusNumber,
4227 IN PHYSICAL_ADDRESS BusAddress,
4228 IN OUT PULONG AddressSpace,
4229 OUT PPHYSICAL_ADDRESS TranslatedAddress);
4230 #endif
4231
4232 #if (NTDDI_VERSION >= NTDDI_VISTA)
4233
4234 NTKERNELAPI
4235 NTSTATUS
4236 NTAPI
4237 IoUpdateDiskGeometry(
4238 IN PDEVICE_OBJECT DeviceObject,
4239 IN struct _DISK_GEOMETRY_EX* OldDiskGeometry,
4240 IN struct _DISK_GEOMETRY_EX* NewDiskGeometry);
4241
4242 PTXN_PARAMETER_BLOCK
4243 NTAPI
4244 IoGetTransactionParameterBlock(
4245 IN PFILE_OBJECT FileObject);
4246
4247 NTKERNELAPI
4248 NTSTATUS
4249 NTAPI
4250 IoCreateFileEx(
4251 OUT PHANDLE FileHandle,
4252 IN ACCESS_MASK DesiredAccess,
4253 IN POBJECT_ATTRIBUTES ObjectAttributes,
4254 OUT PIO_STATUS_BLOCK IoStatusBlock,
4255 IN PLARGE_INTEGER AllocationSize OPTIONAL,
4256 IN ULONG FileAttributes,
4257 IN ULONG ShareAccess,
4258 IN ULONG Disposition,
4259 IN ULONG CreateOptions,
4260 IN PVOID EaBuffer OPTIONAL,
4261 IN ULONG EaLength,
4262 IN CREATE_FILE_TYPE CreateFileType,
4263 IN PVOID InternalParameters OPTIONAL,
4264 IN ULONG Options,
4265 IN PIO_DRIVER_CREATE_CONTEXT DriverContext OPTIONAL);
4266
4267 NTSTATUS
4268 NTAPI
4269 IoSetIrpExtraCreateParameter(
4270 IN OUT PIRP Irp,
4271 IN struct _ECP_LIST *ExtraCreateParameter);
4272
4273 VOID
4274 NTAPI
4275 IoClearIrpExtraCreateParameter(
4276 IN OUT PIRP Irp);
4277
4278 NTSTATUS
4279 NTAPI
4280 IoGetIrpExtraCreateParameter(
4281 IN PIRP Irp,
4282 OUT struct _ECP_LIST **ExtraCreateParameter OPTIONAL);
4283
4284 BOOLEAN
4285 NTAPI
4286 IoIsFileObjectIgnoringSharing(
4287 IN PFILE_OBJECT FileObject);
4288
4289 #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
4290
4291 #if (NTDDI_VERSION >= NTDDI_WIN7)
4292 NTSTATUS
4293 NTAPI
4294 IoSetFileObjectIgnoreSharing(
4295 IN PFILE_OBJECT FileObject);
4296 #endif
4297
4298 /* HAL Types */
4299
4300 typedef BOOLEAN
4301 (NTAPI *PHAL_RESET_DISPLAY_PARAMETERS)(
4302 IN ULONG Columns,
4303 IN ULONG Rows);
4304
4305 typedef PBUS_HANDLER
4306 (FASTCALL *pHalHandlerForBus)(
4307 IN INTERFACE_TYPE InterfaceType,
4308 IN ULONG BusNumber);
4309
4310 typedef VOID
4311 (FASTCALL *pHalReferenceBusHandler)(
4312 IN PBUS_HANDLER BusHandler);
4313
4314 typedef enum _HAL_QUERY_INFORMATION_CLASS {
4315 HalInstalledBusInformation,
4316 HalProfileSourceInformation,
4317 HalInformationClassUnused1,
4318 HalPowerInformation,
4319 HalProcessorSpeedInformation,
4320 HalCallbackInformation,
4321 HalMapRegisterInformation,
4322 HalMcaLogInformation,
4323 HalFrameBufferCachingInformation,
4324 HalDisplayBiosInformation,
4325 HalProcessorFeatureInformation,
4326 HalNumaTopologyInterface,
4327 HalErrorInformation,
4328 HalCmcLogInformation,
4329 HalCpeLogInformation,
4330 HalQueryMcaInterface,
4331 HalQueryAMLIIllegalIOPortAddresses,
4332 HalQueryMaxHotPlugMemoryAddress,
4333 HalPartitionIpiInterface,
4334 HalPlatformInformation,
4335 HalQueryProfileSourceList,
4336 HalInitLogInformation,
4337 HalFrequencyInformation,
4338 HalProcessorBrandString,
4339 HalHypervisorInformation,
4340 HalPlatformTimerInformation,
4341 HalAcpiAuditInformation
4342 } HAL_QUERY_INFORMATION_CLASS, *PHAL_QUERY_INFORMATION_CLASS;
4343
4344 typedef enum _HAL_SET_INFORMATION_CLASS {
4345 HalProfileSourceInterval,
4346 HalProfileSourceInterruptHandler,
4347 HalMcaRegisterDriver,
4348 HalKernelErrorHandler,
4349 HalCmcRegisterDriver,
4350 HalCpeRegisterDriver,
4351 HalMcaLog,
4352 HalCmcLog,
4353 HalCpeLog,
4354 HalGenerateCmcInterrupt,
4355 HalProfileSourceTimerHandler,
4356 HalEnlightenment,
4357 HalProfileDpgoSourceInterruptHandler
4358 } HAL_SET_INFORMATION_CLASS, *PHAL_SET_INFORMATION_CLASS;
4359
4360 typedef NTSTATUS
4361 (NTAPI *pHalQuerySystemInformation)(
4362 IN HAL_QUERY_INFORMATION_CLASS InformationClass,
4363 IN ULONG BufferSize,
4364 IN OUT PVOID Buffer,
4365 OUT PULONG ReturnedLength);
4366
4367 typedef NTSTATUS
4368 (NTAPI *pHalSetSystemInformation)(
4369 IN HAL_SET_INFORMATION_CLASS InformationClass,
4370 IN ULONG BufferSize,
4371 IN PVOID Buffer);
4372
4373 typedef VOID
4374 (FASTCALL *pHalExamineMBR)(
4375 IN PDEVICE_OBJECT DeviceObject,
4376 IN ULONG SectorSize,
4377 IN ULONG MBRTypeIdentifier,
4378 OUT PVOID *Buffer);
4379
4380 typedef NTSTATUS
4381 (FASTCALL *pHalIoReadPartitionTable)(
4382 IN PDEVICE_OBJECT DeviceObject,
4383 IN ULONG SectorSize,
4384 IN BOOLEAN ReturnRecognizedPartitions,
4385 OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
4386
4387 typedef NTSTATUS
4388 (FASTCALL *pHalIoSetPartitionInformation)(
4389 IN PDEVICE_OBJECT DeviceObject,
4390 IN ULONG SectorSize,
4391 IN ULONG PartitionNumber,
4392 IN ULONG PartitionType);
4393
4394 typedef NTSTATUS
4395 (FASTCALL *pHalIoWritePartitionTable)(
4396 IN PDEVICE_OBJECT DeviceObject,
4397 IN ULONG SectorSize,
4398 IN ULONG SectorsPerTrack,
4399 IN ULONG NumberOfHeads,
4400 IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
4401
4402 typedef NTSTATUS
4403 (NTAPI *pHalQueryBusSlots)(
4404 IN PBUS_HANDLER BusHandler,
4405 IN ULONG BufferSize,
4406 OUT PULONG SlotNumbers,
4407 OUT PULONG ReturnedLength);
4408
4409 typedef NTSTATUS
4410 (NTAPI *pHalInitPnpDriver)(
4411 VOID);
4412
4413 typedef struct _PM_DISPATCH_TABLE {
4414 ULONG Signature;
4415 ULONG Version;
4416 PVOID Function[1];
4417 } PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE;
4418
4419 typedef NTSTATUS
4420 (NTAPI *pHalInitPowerManagement)(
4421 IN PPM_DISPATCH_TABLE PmDriverDispatchTable,
4422 OUT PPM_DISPATCH_TABLE *PmHalDispatchTable);
4423
4424 typedef struct _DMA_ADAPTER*
4425 (NTAPI *pHalGetDmaAdapter)(
4426 IN PVOID Context,
4427 IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
4428 OUT PULONG NumberOfMapRegisters);
4429
4430 typedef NTSTATUS
4431 (NTAPI *pHalGetInterruptTranslator)(
4432 IN INTERFACE_TYPE ParentInterfaceType,
4433 IN ULONG ParentBusNumber,
4434 IN INTERFACE_TYPE BridgeInterfaceType,
4435 IN USHORT Size,
4436 IN USHORT Version,
4437 OUT PTRANSLATOR_INTERFACE Translator,
4438 OUT PULONG BridgeBusNumber);
4439
4440 typedef NTSTATUS
4441 (NTAPI *pHalStartMirroring)(
4442 VOID);
4443
4444 typedef NTSTATUS
4445 (NTAPI *pHalEndMirroring)(
4446 IN ULONG PassNumber);
4447
4448 typedef NTSTATUS
4449 (NTAPI *pHalMirrorPhysicalMemory)(
4450 IN PHYSICAL_ADDRESS PhysicalAddress,
4451 IN LARGE_INTEGER NumberOfBytes);
4452
4453 typedef NTSTATUS
4454 (NTAPI *pHalMirrorVerify)(
4455 IN PHYSICAL_ADDRESS PhysicalAddress,
4456 IN LARGE_INTEGER NumberOfBytes);
4457
4458 typedef BOOLEAN
4459 (NTAPI *pHalTranslateBusAddress)(
4460 IN INTERFACE_TYPE InterfaceType,
4461 IN ULONG BusNumber,
4462 IN PHYSICAL_ADDRESS BusAddress,
4463 IN OUT PULONG AddressSpace,
4464 OUT PPHYSICAL_ADDRESS TranslatedAddress);
4465
4466 typedef NTSTATUS
4467 (NTAPI *pHalAssignSlotResources)(
4468 IN PUNICODE_STRING RegistryPath,
4469 IN PUNICODE_STRING DriverClassName OPTIONAL,
4470 IN PDRIVER_OBJECT DriverObject,
4471 IN PDEVICE_OBJECT DeviceObject,
4472 IN INTERFACE_TYPE BusType,
4473 IN ULONG BusNumber,
4474 IN ULONG SlotNumber,
4475 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
4476
4477 typedef VOID
4478 (NTAPI *pHalHaltSystem)(
4479 VOID);
4480
4481 typedef BOOLEAN
4482 (NTAPI *pHalResetDisplay)(
4483 VOID);
4484
4485 typedef struct _MAP_REGISTER_ENTRY {
4486 PVOID MapRegister;
4487 BOOLEAN WriteToDevice;
4488 } MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY;
4489
4490 typedef UCHAR
4491 (NTAPI *pHalVectorToIDTEntry)(
4492 ULONG Vector);
4493
4494 typedef BOOLEAN
4495 (NTAPI *pHalFindBusAddressTranslation)(
4496 IN PHYSICAL_ADDRESS BusAddress,
4497 IN OUT PULONG AddressSpace,
4498 OUT PPHYSICAL_ADDRESS TranslatedAddress,
4499 IN OUT PULONG_PTR Context,
4500 IN BOOLEAN NextBus);
4501
4502 typedef struct _DEBUG_DEVICE_ADDRESS {
4503 UCHAR Type;
4504 BOOLEAN Valid;
4505 UCHAR Reserved[2];
4506 PUCHAR TranslatedAddress;
4507 ULONG Length;
4508 } DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS;
4509
4510 typedef struct _DEBUG_MEMORY_REQUIREMENTS {
4511 PHYSICAL_ADDRESS Start;
4512 PHYSICAL_ADDRESS MaxEnd;
4513 PVOID VirtualAddress;
4514 ULONG Length;
4515 BOOLEAN Cached;
4516 BOOLEAN Aligned;
4517 } DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS;
4518
4519 typedef struct _DEBUG_DEVICE_DESCRIPTOR {
4520 ULONG Bus;
4521 ULONG Slot;
4522 USHORT Segment;
4523 USHORT VendorID;
4524 USHORT DeviceID;
4525 UCHAR BaseClass;
4526 UCHAR SubClass;
4527 UCHAR ProgIf;
4528 BOOLEAN Initialized;
4529 BOOLEAN Configured;
4530 DEBUG_DEVICE_ADDRESS BaseAddress[6];
4531 DEBUG_MEMORY_REQUIREMENTS Memory;
4532 } DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR;
4533
4534 typedef NTSTATUS
4535 (NTAPI *pKdSetupPciDeviceForDebugging)(
4536 IN PVOID LoaderBlock OPTIONAL,
4537 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice);
4538
4539 typedef NTSTATUS
4540 (NTAPI *pKdReleasePciDeviceForDebugging)(
4541 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice);
4542
4543 typedef PVOID
4544 (NTAPI *pKdGetAcpiTablePhase0)(
4545 IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
4546 IN ULONG Signature);
4547
4548 typedef VOID
4549 (NTAPI *pKdCheckPowerButton)(
4550 VOID);
4551
4552 typedef VOID
4553 (NTAPI *pHalEndOfBoot)(
4554 VOID);
4555
4556 #if (NTDDI_VERSION >= NTDDI_VISTA)
4557 typedef PVOID
4558 (NTAPI *pKdMapPhysicalMemory64)(
4559 IN PHYSICAL_ADDRESS PhysicalAddress,
4560 IN ULONG NumberPages,
4561 IN BOOLEAN FlushCurrentTLB);
4562
4563 typedef VOID
4564 (NTAPI *pKdUnmapVirtualAddress)(
4565 IN PVOID VirtualAddress,
4566 IN ULONG NumberPages,
4567 IN BOOLEAN FlushCurrentTLB);
4568 #else
4569 typedef PVOID
4570 (NTAPI *pKdMapPhysicalMemory64)(
4571 IN PHYSICAL_ADDRESS PhysicalAddress,
4572 IN ULONG NumberPages);
4573
4574 typedef VOID
4575 (NTAPI *pKdUnmapVirtualAddress)(
4576 IN PVOID VirtualAddress,
4577 IN ULONG NumberPages);
4578 #endif
4579
4580 typedef PVOID
4581 (NTAPI *pHalGetAcpiTable)(
4582 IN ULONG Signature,
4583 IN PCSTR OemId OPTIONAL,
4584 IN PCSTR OemTableId OPTIONAL);
4585
4586 typedef ULONG
4587 (NTAPI *pKdGetPciDataByOffset)(
4588 IN ULONG BusNumber,
4589 IN ULONG SlotNumber,
4590 OUT PVOID Buffer,
4591 IN ULONG Offset,
4592 IN ULONG Length);
4593
4594 typedef ULONG
4595 (NTAPI *pKdSetPciDataByOffset)(
4596 IN ULONG BusNumber,
4597 IN ULONG SlotNumber,
4598 IN PVOID Buffer,
4599 IN ULONG Offset,
4600 IN ULONG Length);
4601
4602 #if defined(_IA64_)
4603 typedef NTSTATUS
4604 (*pHalGetErrorCapList)(
4605 IN OUT PULONG CapsListLength,
4606 IN OUT PUCHAR ErrorCapList);
4607
4608 typedef NTSTATUS
4609 (*pHalInjectError)(
4610 IN ULONG BufferLength,
4611 IN PUCHAR Buffer);
4612 #endif
4613
4614 typedef VOID
4615 (NTAPI *PCI_ERROR_HANDLER_CALLBACK)(
4616 VOID);
4617
4618 typedef VOID
4619 (NTAPI *pHalSetPciErrorHandlerCallback)(
4620 IN PCI_ERROR_HANDLER_CALLBACK Callback);
4621
4622 #if 1 /* Not present in WDK 7600 */
4623 typedef VOID
4624 (FASTCALL *pHalIoAssignDriveLetters)(
4625 IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
4626 IN PSTRING NtDeviceName,
4627 OUT PUCHAR NtSystemPath,
4628 OUT PSTRING NtSystemPathString);
4629 #endif
4630
4631 typedef struct {
4632 ULONG Version;
4633 pHalQuerySystemInformation HalQuerySystemInformation;
4634 pHalSetSystemInformation HalSetSystemInformation;
4635 pHalQueryBusSlots HalQueryBusSlots;
4636 ULONG Spare1;
4637 pHalExamineMBR HalExamineMBR;
4638 #if 1 /* Not present in WDK 7600 */
4639 pHalIoAssignDriveLetters HalIoAssignDriveLetters;
4640 #endif
4641 pHalIoReadPartitionTable HalIoReadPartitionTable;
4642 pHalIoSetPartitionInformation HalIoSetPartitionInformation;
4643 pHalIoWritePartitionTable HalIoWritePartitionTable;
4644 pHalHandlerForBus HalReferenceHandlerForBus;
4645 pHalReferenceBusHandler HalReferenceBusHandler;
4646 pHalReferenceBusHandler HalDereferenceBusHandler;
4647 pHalInitPnpDriver HalInitPnpDriver;
4648 pHalInitPowerManagement HalInitPowerManagement;
4649 pHalGetDmaAdapter HalGetDmaAdapter;
4650 pHalGetInterruptTranslator HalGetInterruptTranslator;
4651 pHalStartMirroring HalStartMirroring;
4652 pHalEndMirroring HalEndMirroring;
4653 pHalMirrorPhysicalMemory HalMirrorPhysicalMemory;
4654 pHalEndOfBoot HalEndOfBoot;
4655 pHalMirrorVerify HalMirrorVerify;
4656 pHalGetAcpiTable HalGetCachedAcpiTable;
4657 pHalSetPciErrorHandlerCallback HalSetPciErrorHandlerCallback;
4658 #if defined(_IA64_)
4659 pHalGetErrorCapList HalGetErrorCapList;
4660 pHalInjectError HalInjectError;
4661 #endif
4662 } HAL_DISPATCH, *PHAL_DISPATCH;
4663
4664 /* GCC/MSVC and WDK compatible declaration */
4665 extern NTKERNELAPI HAL_DISPATCH HalDispatchTable;
4666
4667 #if defined(_NTOSKRNL_) || defined(_BLDR_)
4668 #define HALDISPATCH (&HalDispatchTable)
4669 #else
4670 /* This is a WDK compatibility definition */
4671 #define HalDispatchTable (&HalDispatchTable)
4672 #define HALDISPATCH HalDispatchTable
4673 #endif
4674
4675 #define HAL_DISPATCH_VERSION 3 /* FIXME: when to use 4? */
4676 #define HalDispatchTableVersion HALDISPATCH->Version
4677 #define HalQuerySystemInformation HALDISPATCH->HalQuerySystemInformation
4678 #define HalSetSystemInformation HALDISPATCH->HalSetSystemInformation
4679 #define HalQueryBusSlots HALDISPATCH->HalQueryBusSlots
4680 #define HalReferenceHandlerForBus HALDISPATCH->HalReferenceHandlerForBus
4681 #define HalReferenceBusHandler HALDISPATCH->HalReferenceBusHandler
4682 #define HalDereferenceBusHandler HALDISPATCH->HalDereferenceBusHandler
4683 #define HalInitPnpDriver HALDISPATCH->HalInitPnpDriver
4684 #define HalInitPowerManagement HALDISPATCH->HalInitPowerManagement
4685 #define HalGetDmaAdapter HALDISPATCH->HalGetDmaAdapter
4686 #define HalGetInterruptTranslator HALDISPATCH->HalGetInterruptTranslator
4687 #define HalStartMirroring HALDISPATCH->HalStartMirroring
4688 #define HalEndMirroring HALDISPATCH->HalEndMirroring
4689 #define HalMirrorPhysicalMemory HALDISPATCH->HalMirrorPhysicalMemory
4690 #define HalEndOfBoot HALDISPATCH->HalEndOfBoot
4691 #define HalMirrorVerify HALDISPATCH->HalMirrorVerify
4692 #define HalGetCachedAcpiTable HALDISPATCH->HalGetCachedAcpiTable
4693 #define HalSetPciErrorHandlerCallback HALDISPATCH->HalSetPciErrorHandlerCallback
4694 #if defined(_IA64_)
4695 #define HalGetErrorCapList HALDISPATCH->HalGetErrorCapList
4696 #define HalInjectError HALDISPATCH->HalInjectError
4697 #endif
4698
4699 typedef struct _HAL_BUS_INFORMATION {
4700 INTERFACE_TYPE BusType;
4701 BUS_DATA_TYPE ConfigurationType;
4702 ULONG BusNumber;
4703 ULONG Reserved;
4704 } HAL_BUS_INFORMATION, *PHAL_BUS_INFORMATION;
4705
4706 typedef struct _HAL_PROFILE_SOURCE_INFORMATION {
4707 KPROFILE_SOURCE Source;
4708 BOOLEAN Supported;
4709 ULONG Interval;
4710 } HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION;
4711
4712 typedef struct _HAL_PROFILE_SOURCE_INFORMATION_EX {
4713 KPROFILE_SOURCE Source;
4714 BOOLEAN Supported;
4715 ULONG_PTR Interval;
4716 ULONG_PTR DefInterval;
4717 ULONG_PTR MaxInterval;
4718 ULONG_PTR MinInterval;
4719 } HAL_PROFILE_SOURCE_INFORMATION_EX, *PHAL_PROFILE_SOURCE_INFORMATION_EX;
4720
4721 typedef struct _HAL_PROFILE_SOURCE_INTERVAL {
4722 KPROFILE_SOURCE Source;
4723 ULONG_PTR Interval;
4724 } HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL;
4725
4726 typedef struct _HAL_PROFILE_SOURCE_LIST {
4727 KPROFILE_SOURCE Source;
4728 PWSTR Description;
4729 } HAL_PROFILE_SOURCE_LIST, *PHAL_PROFILE_SOURCE_LIST;
4730
4731 typedef enum _HAL_DISPLAY_BIOS_INFORMATION {
4732 HalDisplayInt10Bios,
4733 HalDisplayEmulatedBios,
4734 HalDisplayNoBios
4735 } HAL_DISPLAY_BIOS_INFORMATION, *PHAL_DISPLAY_BIOS_INFORMATION;
4736
4737 typedef struct _HAL_POWER_INFORMATION {
4738 ULONG TBD;
4739 } HAL_POWER_INFORMATION, *PHAL_POWER_INFORMATION;
4740
4741 typedef struct _HAL_PROCESSOR_SPEED_INFO {
4742 ULONG ProcessorSpeed;
4743 } HAL_PROCESSOR_SPEED_INFORMATION, *PHAL_PROCESSOR_SPEED_INFORMATION;
4744
4745 typedef struct _HAL_CALLBACKS {
4746 PCALLBACK_OBJECT SetSystemInformation;
4747 PCALLBACK_OBJECT BusCheck;
4748 } HAL_CALLBACKS, *PHAL_CALLBACKS;
4749
4750 typedef struct _HAL_PROCESSOR_FEATURE {
4751 ULONG UsableFeatureBits;
4752 } HAL_PROCESSOR_FEATURE;
4753
4754 typedef NTSTATUS
4755 (NTAPI *PHALIOREADWRITEHANDLER)(
4756 IN BOOLEAN fRead,
4757 IN ULONG dwAddr,
4758 IN ULONG dwSize,
4759 IN OUT PULONG pdwData);
4760
4761 typedef struct _HAL_AMLI_BAD_IO_ADDRESS_LIST {
4762 ULONG BadAddrBegin;
4763 ULONG BadAddrSize;
4764 ULONG OSVersionTrigger;
4765 PHALIOREADWRITEHANDLER IOHandler;
4766 } HAL_AMLI_BAD_IO_ADDRESS_LIST, *PHAL_AMLI_BAD_IO_ADDRESS_LIST;
4767
4768 #if defined(_X86_) || defined(_IA64_) || defined(_AMD64_)
4769
4770 typedef VOID
4771 (NTAPI *PHALMCAINTERFACELOCK)(
4772 VOID);
4773
4774 typedef VOID
4775 (NTAPI *PHALMCAINTERFACEUNLOCK)(
4776 VOID);
4777
4778 typedef NTSTATUS
4779 (NTAPI *PHALMCAINTERFACEREADREGISTER)(
4780 IN UCHAR BankNumber,
4781 IN OUT PVOID Exception);
4782
4783 typedef struct _HAL_MCA_INTERFACE {
4784 PHALMCAINTERFACELOCK Lock;
4785 PHALMCAINTERFACEUNLOCK Unlock;
4786 PHALMCAINTERFACEREADREGISTER ReadRegister;
4787 } HAL_MCA_INTERFACE;
4788
4789 typedef enum {
4790 ApicDestinationModePhysical = 1,
4791 ApicDestinationModeLogicalFlat,
4792 ApicDestinationModeLogicalClustered,
4793 ApicDestinationModeUnknown
4794 } HAL_APIC_DESTINATION_MODE, *PHAL_APIC_DESTINATION_MODE;
4795
4796 #if defined(_AMD64_)
4797
4798 struct _KTRAP_FRAME;
4799 struct _KEXCEPTION_FRAME;
4800
4801 typedef ERROR_SEVERITY
4802 (NTAPI *PDRIVER_EXCPTN_CALLBACK)(
4803 IN PVOID Context,
4804 IN struct _KTRAP_FRAME *TrapFrame,
4805 IN struct _KEXCEPTION_FRAME *ExceptionFrame,
4806 IN PMCA_EXCEPTION Exception);
4807
4808 #endif
4809
4810 #if defined(_X86_) || defined(_IA64_)
4811 typedef
4812 #if defined(_IA64_)
4813 ERROR_SEVERITY
4814 #else
4815 VOID
4816 #endif
4817 (NTAPI *PDRIVER_EXCPTN_CALLBACK)(
4818 IN PVOID Context,
4819 IN PMCA_EXCEPTION BankLog);
4820 #endif
4821
4822 typedef PDRIVER_EXCPTN_CALLBACK PDRIVER_MCA_EXCEPTION_CALLBACK;
4823
4824 typedef struct _MCA_DRIVER_INFO {
4825 PDRIVER_MCA_EXCEPTION_CALLBACK ExceptionCallback;
4826 PKDEFERRED_ROUTINE DpcCallback;
4827 PVOID DeviceContext;
4828 } MCA_DRIVER_INFO, *PMCA_DRIVER_INFO;
4829
4830 typedef struct _HAL_ERROR_INFO {
4831 ULONG Version;
4832 ULONG InitMaxSize;
4833 ULONG McaMaxSize;
4834 ULONG McaPreviousEventsCount;
4835 ULONG McaCorrectedEventsCount;
4836 ULONG McaKernelDeliveryFails;
4837 ULONG McaDriverDpcQueueFails;
4838 ULONG McaReserved;
4839 ULONG CmcMaxSize;
4840 ULONG CmcPollingInterval;
4841 ULONG CmcInterruptsCount;
4842 ULONG CmcKernelDeliveryFails;
4843 ULONG CmcDriverDpcQueueFails;
4844 ULONG CmcGetStateFails;
4845 ULONG CmcClearStateFails;
4846 ULONG CmcReserved;
4847 ULONGLONG CmcLogId;
4848 ULONG CpeMaxSize;
4849 ULONG CpePollingInterval;
4850 ULONG CpeInterruptsCount;
4851 ULONG CpeKernelDeliveryFails;
4852 ULONG CpeDriverDpcQueueFails;
4853 ULONG CpeGetStateFails;
4854 ULONG CpeClearStateFails;
4855 ULONG CpeInterruptSources;
4856 ULONGLONG CpeLogId;
4857 ULONGLONG KernelReserved[4];
4858 } HAL_ERROR_INFO, *PHAL_ERROR_INFO;
4859
4860 #define HAL_MCE_INTERRUPTS_BASED ((ULONG)-1)
4861 #define HAL_MCE_DISABLED ((ULONG)0)
4862
4863 #define HAL_CMC_INTERRUPTS_BASED HAL_MCE_INTERRUPTS_BASED
4864 #define HAL_CMC_DISABLED HAL_MCE_DISABLED
4865
4866 #define HAL_CPE_INTERRUPTS_BASED HAL_MCE_INTERRUPTS_BASED
4867 #define HAL_CPE_DISABLED HAL_MCE_DISABLED
4868
4869 #define HAL_MCA_INTERRUPTS_BASED HAL_MCE_INTERRUPTS_BASED
4870 #define HAL_MCA_DISABLED HAL_MCE_DISABLED
4871
4872 typedef VOID
4873 (NTAPI *PDRIVER_CMC_EXCEPTION_CALLBACK)(
4874 IN PVOID Context,
4875 IN PCMC_EXCEPTION CmcLog);
4876
4877 typedef VOID
4878 (NTAPI *PDRIVER_CPE_EXCEPTION_CALLBACK)(
4879 IN PVOID Context,
4880 IN PCPE_EXCEPTION CmcLog);
4881
4882 typedef struct _CMC_DRIVER_INFO {
4883 PDRIVER_CMC_EXCEPTION_CALLBACK ExceptionCallback;
4884 PKDEFERRED_ROUTINE DpcCallback;
4885 PVOID DeviceContext;
4886 } CMC_DRIVER_INFO, *PCMC_DRIVER_INFO;
4887
4888 typedef struct _CPE_DRIVER_INFO {
4889 PDRIVER_CPE_EXCEPTION_CALLBACK ExceptionCallback;
4890 PKDEFERRED_ROUTINE DpcCallback;
4891 PVOID DeviceContext;
4892 } CPE_DRIVER_INFO, *PCPE_DRIVER_INFO;
4893
4894 #endif // defined(_X86_) || defined(_IA64_) || defined(_AMD64_)
4895
4896 #if defined(_IA64_)
4897
4898 typedef NTSTATUS
4899 (*HALSENDCROSSPARTITIONIPI)(
4900 IN USHORT ProcessorID,
4901 IN UCHAR HardwareVector);
4902
4903 typedef NTSTATUS
4904 (*HALRESERVECROSSPARTITIONINTERRUPTVECTOR)(
4905 OUT PULONG Vector,
4906 OUT PKIRQL Irql,
4907 IN OUT PGROUP_AFFINITY Affinity,
4908 OUT PUCHAR HardwareVector);
4909
4910 typedef VOID
4911 (*HALFREECROSSPARTITIONINTERRUPTVECTOR)(
4912 IN ULONG Vector,
4913 IN PGROUP_AFFINITY Affinity);
4914
4915 typedef struct _HAL_CROSS_PARTITION_IPI_INTERFACE {
4916 HALSENDCROSSPARTITIONIPI HalSendCrossPartitionIpi;
4917 HALRESERVECROSSPARTITIONINTERRUPTVECTOR HalReserveCrossPartitionInterruptVector;
4918 HALFREECROSSPARTITIONINTERRUPTVECTOR HalFreeCrossPartitionInterruptVector;
4919 } HAL_CROSS_PARTITION_IPI_INTERFACE;
4920
4921 #define HAL_CROSS_PARTITION_IPI_INTERFACE_MINIMUM_SIZE \
4922 FIELD_OFFSET(HAL_CROSS_PARTITION_IPI_INTERFACE, \
4923 HalFreeCrossPartitionInterruptVector)
4924
4925 #endif /* defined(_IA64_) */
4926
4927 typedef struct _HAL_PLATFORM_INFORMATION {
4928 ULONG PlatformFlags;
4929 } HAL_PLATFORM_INFORMATION, *PHAL_PLATFORM_INFORMATION;
4930
4931 #define HAL_PLATFORM_DISABLE_WRITE_COMBINING 0x01L
4932 #define HAL_PLATFORM_DISABLE_PTCG 0x04L
4933 #define HAL_PLATFORM_DISABLE_UC_MAIN_MEMORY 0x08L
4934 #define HAL_PLATFORM_ENABLE_WRITE_COMBINING_MMIO 0x10L
4935 #define HAL_PLATFORM_ACPI_TABLES_CACHED 0x20L
4936
4937 #if defined(_WIN64)
4938
4939 #ifndef USE_DMA_MACROS
4940 #define USE_DMA_MACROS
4941 #endif
4942
4943 #ifndef NO_LEGACY_DRIVERS
4944 #define NO_LEGACY_DRIVERS
4945 #endif
4946
4947 #endif /* defined(_WIN64) */
4948
4949 typedef enum _PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE {
4950 ResourceTypeSingle = 0,
4951 ResourceTypeRange,
4952 ResourceTypeExtendedCounterConfiguration,
4953 ResourceTypeOverflow,
4954 ResourceTypeMax
4955 } PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE;
4956
4957 typedef struct _PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR {
4958 PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE Type;
4959 ULONG Flags;
4960 union {
4961 ULONG CounterIndex;
4962 ULONG ExtendedRegisterAddress;
4963 struct {
4964 ULONG Begin;
4965 ULONG End;
4966 } Range;
4967 } u;
4968 } PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR, *PPHYSICAL_COUNTER_RESOURCE_DESCRIPTOR;
4969
4970 typedef struct _PHYSICAL_COUNTER_RESOURCE_LIST {
4971 ULONG Count;
4972 PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR Descriptors[ANYSIZE_ARRAY];
4973 } PHYSICAL_COUNTER_RESOURCE_LIST, *PPHYSICAL_COUNTER_RESOURCE_LIST;
4974
4975 typedef VOID
4976 (NTAPI *PciPin2Line)(
4977 IN struct _BUS_HANDLER *BusHandler,
4978 IN struct _BUS_HANDLER *RootHandler,
4979 IN PCI_SLOT_NUMBER SlotNumber,
4980 IN PPCI_COMMON_CONFIG PciData);
4981
4982 typedef VOID
4983 (NTAPI *PciLine2Pin)(
4984 IN struct _BUS_HANDLER *BusHandler,
4985 IN struct _BUS_HANDLER *RootHandler,
4986 IN PCI_SLOT_NUMBER SlotNumber,
4987 IN PPCI_COMMON_CONFIG PciNewData,
4988 IN PPCI_COMMON_CONFIG PciOldData);
4989
4990 typedef VOID
4991 (NTAPI *PciReadWriteConfig)(
4992 IN struct _BUS_HANDLER *BusHandler,
4993 IN PCI_SLOT_NUMBER Slot,
4994 IN PVOID Buffer,
4995 IN ULONG Offset,
4996 IN ULONG Length);
4997
4998 #define PCI_DATA_TAG ' ICP'
4999 #define PCI_DATA_VERSION 1
5000
5001 typedef struct _PCIBUSDATA {
5002 ULONG Tag;
5003 ULONG Version;
5004 PciReadWriteConfig ReadConfig;
5005 PciReadWriteConfig WriteConfig;
5006 PciPin2Line Pin2Line;
5007 PciLine2Pin Line2Pin;
5008 PCI_SLOT_NUMBER ParentSlot;
5009 PVOID Reserved[4];
5010 } PCIBUSDATA, *PPCIBUSDATA;
5011
5012 #ifndef _PCIINTRF_X_
5013 #define _PCIINTRF_X_
5014
5015 typedef ULONG
5016 (NTAPI *PCI_READ_WRITE_CONFIG)(
5017 IN PVOID Context,
5018 IN ULONG BusOffset,
5019 IN ULONG Slot,
5020 IN PVOID Buffer,
5021 IN ULONG Offset,
5022 IN ULONG Length);
5023
5024 typedef VOID
5025 (NTAPI *PCI_PIN_TO_LINE)(
5026 IN PVOID Context,
5027 IN PPCI_COMMON_CONFIG PciData);
5028
5029 typedef VOID
5030 (NTAPI *PCI_LINE_TO_PIN)(
5031 IN PVOID Context,
5032 IN PPCI_COMMON_CONFIG PciNewData,
5033 IN PPCI_COMMON_CONFIG PciOldData);
5034
5035 typedef VOID
5036 (NTAPI *PCI_ROOT_BUS_CAPABILITY)(
5037 IN PVOID Context,
5038 OUT PPCI_ROOT_BUS_HARDWARE_CAPABILITY HardwareCapability);
5039
5040 typedef VOID
5041 (NTAPI *PCI_EXPRESS_WAKE_CONTROL)(
5042 IN PVOID Context,
5043 IN BOOLEAN EnableWake);
5044
5045 typedef struct _PCI_BUS_INTERFACE_STANDARD {
5046 USHORT Size;
5047 USHORT Version;
5048 PVOID Context;
5049 PINTERFACE_REFERENCE InterfaceReference;
5050 PINTERFACE_DEREFERENCE InterfaceDereference;
5051 PCI_READ_WRITE_CONFIG ReadConfig;
5052 PCI_READ_WRITE_CONFIG WriteConfig;
5053 PCI_PIN_TO_LINE PinToLine;
5054 PCI_LINE_TO_PIN LineToPin;
5055 PCI_ROOT_BUS_CAPABILITY RootBusCapability;
5056 PCI_EXPRESS_WAKE_CONTROL ExpressWakeControl;
5057 } PCI_BUS_INTERFACE_STANDARD, *PPCI_BUS_INTERFACE_STANDARD;
5058
5059 #define PCI_BUS_INTERFACE_STANDARD_VERSION 1
5060
5061 #endif /* _PCIINTRF_X_ */
5062
5063 /* Hardware Abstraction Layer Functions */
5064
5065 #if !defined(NO_LEGACY_DRIVERS)
5066
5067 #if (NTDDI_VERSION >= NTDDI_WIN2K)
5068
5069 NTHALAPI
5070 NTSTATUS
5071 NTAPI
5072 HalAssignSlotResources(
5073 IN PUNICODE_STRING RegistryPath,
5074 IN PUNICODE_STRING DriverClassName,
5075 IN PDRIVER_OBJECT DriverObject,
5076 IN PDEVICE_OBJECT DeviceObject,
5077 IN INTERFACE_TYPE BusType,
5078 IN ULONG BusNumber,
5079 IN ULONG SlotNumber,
5080 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
5081
5082 NTHALAPI
5083 ULONG
5084 NTAPI
5085 HalGetInterruptVector(
5086 IN INTERFACE_TYPE InterfaceType,
5087 IN ULONG BusNumber,
5088 IN ULONG BusInterruptLevel,
5089 IN ULONG BusInterruptVector,
5090 OUT PKIRQL Irql,
5091 OUT PKAFFINITY Affinity);
5092
5093 NTHALAPI
5094 ULONG
5095 NTAPI
5096 HalSetBusData(
5097 IN BUS_DATA_TYPE BusDataType,
5098 IN ULONG BusNumber,
5099 IN ULONG SlotNumber,
5100 IN PVOID Buffer,
5101 IN ULONG Length);
5102
5103 NTHALAPI
5104 ULONG
5105 NTAPI
5106 HalGetBusData(
5107 IN BUS_DATA_TYPE BusDataType,
5108 IN ULONG BusNumber,
5109 IN ULONG SlotNumber,
5110 OUT PVOID Buffer,
5111 IN ULONG Length);
5112
5113 NTHALAPI
5114 BOOLEAN
5115 NTAPI
5116 HalMakeBeep(
5117 IN ULONG Frequency);
5118
5119 #endif
5120
5121 #endif /* !defined(NO_LEGACY_DRIVERS) */
5122
5123 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
5124 // nothing here
5125 #else
5126
5127 #if (NTDDI_VERSION >= NTDDI_WIN2K)
5128 //DECLSPEC_DEPRECATED_DDK
5129 NTHALAPI
5130 VOID
5131 NTAPI
5132 IoFreeAdapterChannel(
5133 IN PADAPTER_OBJECT AdapterObject);
5134
5135 //DECLSPEC_DEPRECATED_DDK
5136 NTHALAPI
5137 BOOLEAN
5138 NTAPI
5139 IoFlushAdapterBuffers(
5140 IN PADAPTER_OBJECT AdapterObject,
5141 IN PMDL Mdl,
5142 IN PVOID MapRegisterBase,
5143 IN PVOID CurrentVa,
5144 IN ULONG Length,
5145 IN BOOLEAN WriteToDevice);
5146
5147 //DECLSPEC_DEPRECATED_DDK
5148 NTHALAPI
5149 VOID
5150 NTAPI
5151 IoFreeMapRegisters(
5152 IN PADAPTER_OBJECT AdapterObject,
5153 IN PVOID MapRegisterBase,
5154 IN ULONG NumberOfMapRegisters);
5155
5156 //DECLSPEC_DEPRECATED_DDK
5157 NTHALAPI
5158 PVOID
5159 NTAPI
5160 HalAllocateCommonBuffer(
5161 IN PADAPTER_OBJECT AdapterObject,
5162 IN ULONG Length,
5163 OUT PPHYSICAL_ADDRESS LogicalAddress,
5164 IN BOOLEAN CacheEnabled);
5165
5166 //DECLSPEC_DEPRECATED_DDK
5167 NTHALAPI
5168 VOID
5169 NTAPI
5170 HalFreeCommonBuffer(
5171 IN PADAPTER_OBJECT AdapterObject,
5172 IN ULONG Length,
5173 IN PHYSICAL_ADDRESS LogicalAddress,
5174 IN PVOID VirtualAddress,
5175 IN BOOLEAN CacheEnabled);
5176
5177 //DECLSPEC_DEPRECATED_DDK
5178 NTHALAPI
5179 ULONG
5180 NTAPI
5181 HalReadDmaCounter(
5182 IN PADAPTER_OBJECT AdapterObject);
5183
5184 NTHALAPI
5185 NTSTATUS
5186 NTAPI
5187 HalAllocateAdapterChannel(
5188 IN PADAPTER_OBJECT AdapterObject,
5189 IN PWAIT_CONTEXT_BLOCK Wcb,
5190 IN ULONG NumberOfMapRegisters,
5191 IN PDRIVER_CONTROL ExecutionRoutine);
5192
5193 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
5194
5195 #endif /* defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) */
5196
5197 #if (NTDDI_VERSION >= NTDDI_WIN2K)
5198
5199 NTHALAPI
5200 PADAPTER_OBJECT
5201 NTAPI
5202 HalGetAdapter(
5203 IN PDEVICE_DESCRIPTION DeviceDescription,
5204 OUT PULONG NumberOfMapRegisters);
5205
5206 VOID
5207 NTAPI
5208 HalPutDmaAdapter(
5209 IN PADAPTER_OBJECT DmaAdapter);
5210
5211 NTHALAPI
5212 VOID
5213 NTAPI
5214 HalAcquireDisplayOwnership(
5215 IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters);
5216
5217 NTHALAPI
5218 ULONG
5219 NTAPI
5220 HalGetBusDataByOffset(
5221 IN BUS_DATA_TYPE BusDataType,
5222 IN ULONG BusNumber,
5223 IN ULONG SlotNumber,
5224 OUT PVOID Buffer,
5225 IN ULONG Offset,
5226 IN ULONG Length);
5227
5228 NTHALAPI
5229 ULONG
5230 NTAPI
5231 HalSetBusDataByOffset(
5232 IN BUS_DATA_TYPE BusDataType,
5233 IN ULONG BusNumber,
5234 IN ULONG SlotNumber,
5235 IN PVOID Buffer,
5236 IN ULONG Offset,
5237 IN ULONG Length);
5238
5239 NTHALAPI
5240 BOOLEAN
5241 NTAPI
5242 HalTranslateBusAddress(
5243 IN INTERFACE_TYPE InterfaceType,
5244 IN ULONG BusNumber,
5245 IN PHYSICAL_ADDRESS BusAddress,
5246 IN OUT PULONG AddressSpace,
5247 OUT PPHYSICAL_ADDRESS TranslatedAddress);
5248
5249 NTHALAPI
5250 PVOID
5251 NTAPI
5252 HalAllocateCrashDumpRegisters(
5253 IN PADAPTER_OBJECT AdapterObject,
5254 IN OUT PULONG NumberOfMapRegisters);
5255
5256 NTSTATUS
5257 NTAPI
5258 HalGetScatterGatherList(
5259 IN PADAPTER_OBJECT DmaAdapter,
5260 IN PDEVICE_OBJECT DeviceObject,
5261 IN PMDL Mdl,
5262 IN PVOID CurrentVa,
5263 IN ULONG Length,
5264 IN PDRIVER_LIST_CONTROL ExecutionRoutine,
5265 IN PVOID Context,
5266 IN BOOLEAN WriteToDevice);
5267
5268 VOID
5269 NTAPI
5270 HalPutScatterGatherList(
5271 IN PADAPTER_OBJECT DmaAdapter,
5272 IN PSCATTER_GATHER_LIST ScatterGather,
5273 IN BOOLEAN WriteToDevice);
5274
5275 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
5276
5277 #if (NTDDI_VERSION >= NTDDI_WINXP)
5278 NTKERNELAPI
5279 VOID
5280 FASTCALL
5281 HalExamineMBR(
5282 IN PDEVICE_OBJECT DeviceObject,
5283 IN ULONG SectorSize,
5284 IN ULONG MBRTypeIdentifier,
5285 OUT PVOID *Buffer);
5286 #endif
5287
5288 #if (NTDDI_VERSION >= NTDDI_WIN7)
5289
5290 NTSTATUS
5291 NTAPI
5292 HalAllocateHardwareCounters(
5293 IN PGROUP_AFFINITY GroupAffinty,
5294 IN ULONG GroupCount,
5295 IN PPHYSICAL_COUNTER_RESOURCE_LIST ResourceList,
5296 OUT PHANDLE CounterSetHandle);
5297
5298 NTSTATUS
5299 NTAPI
5300 HalFreeHardwareCounters(
5301 IN HANDLE CounterSetHandle);
5302
5303 #endif
5304
5305
5306
5307 #if defined(_IA64_)
5308 #if (NTDDI_VERSION >= NTDDI_WIN2K)
5309 NTHALAPI
5310 ULONG
5311 NTAPI
5312 HalGetDmaAlignmentRequirement(VOID);
5313 #endif
5314 #endif /* defined(_IA64_) */
5315
5316 #if defined(_M_IX86) || defined(_M_AMD64)
5317 #define HalGetDmaAlignmentRequirement() 1L
5318 #endif
5319
5320 #if (NTDDI_VERSION >= NTDDI_WIN7)
5321
5322 typedef struct _WHEA_ERROR_SOURCE_DESCRIPTOR *PWHEA_ERROR_SOURCE_DESCRIPTOR;
5323 typedef struct _WHEA_ERROR_RECORD *PWHEA_ERROR_RECORD;
5324
5325 NTHALAPI
5326 VOID
5327 NTAPI
5328 HalBugCheckSystem(
5329 IN PWHEA_ERROR_SOURCE_DESCRIPTOR ErrorSource,
5330 IN PWHEA_ERROR_RECORD ErrorRecord);
5331
5332 #else
5333
5334 typedef struct _WHEA_ERROR_RECORD *PWHEA_ERROR_RECORD;
5335
5336 NTHALAPI
5337 VOID
5338 NTAPI
5339 HalBugCheckSystem(
5340 IN PWHEA_ERROR_RECORD ErrorRecord);
5341
5342 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
5343
5344 /* ZwXxx Functions */
5345
5346 NTSYSAPI
5347 NTSTATUS
5348 NTAPI
5349 ZwAllocateLocallyUniqueId(
5350 OUT PLUID Luid);
5351
5352 NTSYSAPI
5353 NTSTATUS
5354 NTAPI
5355 ZwTerminateProcess(
5356 IN HANDLE ProcessHandle OPTIONAL,
5357 IN NTSTATUS ExitStatus);
5358
5359 NTSYSAPI
5360 NTSTATUS
5361 NTAPI
5362 ZwOpenProcess(
5363 OUT PHANDLE ProcessHandle,
5364 IN ACCESS_MASK DesiredAccess,
5365 IN POBJECT_ATTRIBUTES ObjectAttributes,
5366 IN PCLIENT_ID ClientId OPTIONAL);
5367
5368 #if (NTDDI_VERSION >= NTDDI_WIN2K)
5369
5370 NTSTATUS
5371 NTAPI
5372 ZwCancelTimer(
5373 IN HANDLE TimerHandle,
5374 OUT PBOOLEAN CurrentState OPTIONAL);
5375
5376 NTSTATUS
5377 NTAPI
5378 ZwCreateTimer(
5379 OUT PHANDLE TimerHandle,
5380 IN ACCESS_MASK DesiredAccess,
5381 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
5382 IN TIMER_TYPE TimerType);
5383
5384 NTSTATUS
5385 NTAPI
5386 ZwOpenTimer(
5387 OUT PHANDLE TimerHandle,
5388 IN ACCESS_MASK DesiredAccess,
5389 IN POBJECT_ATTRIBUTES ObjectAttributes);
5390
5391 NTSYSAPI
5392 NTSTATUS
5393 NTAPI
5394 ZwSetInformationThread(
5395 IN HANDLE ThreadHandle,
5396 IN THREADINFOCLASS ThreadInformationClass,
5397 IN PVOID ThreadInformation,
5398 IN ULONG ThreadInformationLength);
5399
5400 NTSTATUS
5401 NTAPI
5402 ZwSetTimer(
5403 IN HANDLE TimerHandle,
5404 IN PLARGE_INTEGER DueTime,
5405 IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
5406 IN PVOID TimerContext OPTIONAL,
5407 IN BOOLEAN ResumeTimer,
5408 IN LONG Period OPTIONAL,
5409 OUT PBOOLEAN PreviousState OPTIONAL);
5410
5411 NTSYSAPI
5412 NTSTATUS
5413 NTAPI
5414 ZwDisplayString(
5415 IN PUNICODE_STRING String);
5416
5417 NTSYSAPI
5418 NTSTATUS
5419 NTAPI
5420 ZwPowerInformation(
5421 IN POWER_INFORMATION_LEVEL PowerInformationLevel,
5422 IN PVOID InputBuffer OPTIONAL,
5423 IN ULONG InputBufferLength,
5424 OUT PVOID OutputBuffer OPTIONAL,
5425 IN ULONG OutputBufferLength);
5426
5427 NTSYSAPI
5428 NTSTATUS
5429 NTAPI
5430 ZwQueryVolumeInformationFile(
5431 IN HANDLE FileHandle,
5432 OUT PIO_STATUS_BLOCK IoStatusBlock,
5433 OUT PVOID FsInformation,
5434 IN ULONG Length,
5435 IN FS_INFORMATION_CLASS FsInformationClass);
5436
5437 NTSYSAPI
5438 NTSTATUS
5439 NTAPI
5440 ZwDeviceIoControlFile(
5441 IN HANDLE FileHandle,
5442 IN HANDLE Event OPTIONAL,
5443 IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
5444 IN PVOID ApcContext OPTIONAL,
5445 OUT PIO_STATUS_BLOCK IoStatusBlock,
5446 IN ULONG IoControlCode,
5447 IN PVOID InputBuffer OPTIONAL,
5448 IN ULONG InputBufferLength,
5449 OUT PVOID OutputBuffer OPTIONAL,
5450 IN ULONG OutputBufferLength);
5451
5452 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
5453
5454 #if (NTDDI_VERSION >= NTDDI_WIN7)
5455 NTSTATUS
5456 NTAPI
5457 ZwSetTimerEx(
5458 IN HANDLE TimerHandle,
5459 IN TIMER_SET_INFORMATION_CLASS TimerSetInformationClass,
5460 IN OUT PVOID TimerSetInformation,
5461 IN ULONG TimerSetInformationLength);
5462 #endif
5463
5464 #ifdef _X86_
5465
5466 extern NTKERNELAPI PVOID MmHighestUserAddress;
5467 extern NTKERNELAPI PVOID MmSystemRangeStart;
5468 extern NTKERNELAPI ULONG MmUserProbeAddress;
5469
5470 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
5471 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
5472 #if defined(_LOCAL_COPY_USER_PROBE_ADDRESS_)
5473 #define MM_USER_PROBE_ADDRESS _LOCAL_COPY_USER_PROBE_ADDRESS_
5474 extern ULONG _LOCAL_COPY_USER_PROBE_ADDRESS_;
5475 #else
5476 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
5477 #endif
5478 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
5479 #define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
5480 #define MM_SYSTEM_SPACE_END 0xFFFFFFFF
5481 #if !defined (_X86PAE_)
5482 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000
5483 #else
5484 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
5485 #endif
5486
5487 #define KeGetPcr() PCR
5488
5489 #define PCR_MINOR_VERSION 1
5490 #define PCR_MAJOR_VERSION 1
5491
5492 typedef struct _KPCR {
5493 union {
5494 NT_TIB NtTib;
5495 struct {
5496 struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
5497 PVOID Used_StackBase;
5498 PVOID Spare2;
5499 PVOID TssCopy;
5500 ULONG ContextSwitches;
5501 KAFFINITY SetMemberCopy;
5502 PVOID Used_Self;
5503 };
5504 };
5505 struct _KPCR *SelfPcr;
5506 struct _KPRCB *Prcb;
5507 KIRQL Irql;
5508 ULONG IRR;
5509 ULONG IrrActive;
5510 ULONG IDR;
5511 PVOID KdVersionBlock;
5512 struct _KIDTENTRY *IDT;
5513 struct _KGDTENTRY *GDT;
5514 struct _KTSS *TSS;
5515 USHORT MajorVersion;
5516 USHORT MinorVersion;
5517 KAFFINITY SetMember;
5518 ULONG StallScaleFactor;
5519 UCHAR SpareUnused;
5520 UCHAR Number;
5521 UCHAR Spare0;
5522 UCHAR SecondLevelCacheAssociativity;
5523 ULONG VdmAlert;
5524 ULONG KernelReserved[14];
5525 ULONG SecondLevelCacheSize;
5526 ULONG HalReserved[16];
5527 } KPCR, *PKPCR;
5528
5529 FORCEINLINE
5530 ULONG
5531 KeGetCurrentProcessorNumber(VOID)
5532 {
5533 return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
5534 }
5535
5536 typedef enum _INTERLOCKED_RESULT {
5537 ResultNegative = RESULT_NEGATIVE,
5538 ResultZero = RESULT_ZERO,
5539 ResultPositive = RESULT_POSITIVE
5540 } INTERLOCKED_RESULT;
5541
5542 NTKERNELAPI
5543 INTERLOCKED_RESULT
5544 FASTCALL
5545 Exfi386InterlockedIncrementLong(
5546 IN OUT LONG volatile *Addend);
5547
5548 NTKERNELAPI
5549 INTERLOCKED_RESULT
5550 FASTCALL
5551 Exfi386InterlockedDecrementLong(
5552 IN PLONG Addend);
5553
5554 NTKERNELAPI
5555 ULONG
5556 FASTCALL
5557 Exfi386InterlockedExchangeUlong(
5558 IN PULONG Target,
5559 IN ULONG Value);
5560
5561 #endif /* _X86_ */
5562
5563 #ifdef _AMD64_
5564
5565 #define PTI_SHIFT 12L
5566 #define PDI_SHIFT 21L
5567 #define PPI_SHIFT 30L
5568 #define PXI_SHIFT 39L
5569 #define PTE_PER_PAGE 512
5570 #define PDE_PER_PAGE 512
5571 #define PPE_PER_PAGE 512
5572 #define PXE_PER_PAGE 512
5573 #define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
5574 #define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
5575 #define PPI_MASK (PPE_PER_PAGE - 1)
5576 #define PXI_MASK (PXE_PER_PAGE - 1)
5577
5578 #define PXE_BASE 0xFFFFF6FB7DBED000ULL
5579 #define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL
5580 #define PPE_BASE 0xFFFFF6FB7DA00000ULL
5581 #define PDE_BASE 0xFFFFF6FB40000000ULL
5582 #define PTE_BASE 0xFFFFF68000000000ULL
5583 #define PXE_TOP 0xFFFFF6FB7DBEDFFFULL
5584 #define PPE_TOP 0xFFFFF6FB7DBFFFFFULL
5585 #define PDE_TOP 0xFFFFF6FB7FFFFFFFULL
5586 #define PTE_TOP 0xFFFFF6FFFFFFFFFFULL
5587
5588 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
5589 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
5590 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
5591 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
5592 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL
5593 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
5594
5595 typedef struct _KPCR
5596 {
5597 _ANONYMOUS_UNION union
5598 {
5599 NT_TIB NtTib;
5600 _ANONYMOUS_STRUCT struct
5601 {
5602 union _KGDTENTRY64 *GdtBase;
5603 struct _KTSS64 *TssBase;
5604 ULONG64 UserRsp;
5605 struct _KPCR *Self;
5606 struct _KPRCB *CurrentPrcb;
5607 PKSPIN_LOCK_QUEUE LockArray;
5608 PVOID Used_Self;
5609 };
5610 };
5611 union _KIDTENTRY64 *IdtBase;
5612 ULONG64 Unused[2];
5613 KIRQL Irql;
5614 UCHAR SecondLevelCacheAssociativity;
5615 UCHAR ObsoleteNumber;
5616 UCHAR Fill0;
5617 ULONG Unused0[3];
5618 USHORT MajorVersion;
5619 USHORT MinorVersion;
5620 ULONG StallScaleFactor;
5621 PVOID Unused1[3];
5622 ULONG KernelReserved[15];
5623 ULONG SecondLevelCacheSize;
5624 ULONG HalReserved[16];
5625 ULONG Unused2;
5626 PVOID KdVersionBlock;
5627 PVOID Unused3;
5628 ULONG PcrAlign1[24];
5629 } KPCR, *PKPCR;
5630
5631 FORCEINLINE
5632 PKPCR
5633 KeGetPcr(VOID)
5634 {
5635 return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
5636 }
5637
5638 FORCEINLINE
5639 ULONG
5640 KeGetCurrentProcessorNumber(VOID)
5641 {
5642 return (ULONG)__readgsword(0x184);
5643 }
5644
5645 #endif /* _AMD64_ */
5646
5647 #ifdef __cplusplus
5648 }
5649 #endif