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