Recommit rest of ntifs.h and wdm.h from header merge revert
[reactos.git] / reactos / 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 #ifndef _NTDDK_
28 #define _NTDDK_
29
30 #if !defined(_NTHAL_) && !defined(_NTIFS_)
31 #define _NTDDK_INCLUDED_
32 #define _DDK_DRIVER_
33 #endif
34
35 /* Dependencies */
36
37 #define NT_INCLUDED
38 #define _CTYPE_DISABLE_MACROS
39
40 #include <wdm.h>
41 #include <excpt.h>
42 #include <ntdef.h>
43 #include <ntstatus.h>
44
45 /* FIXME
46 #include <bugcodes.h>
47 #include <ntiologc.h>
48 */
49
50 #include <stdarg.h> // FIXME
51 #include <basetyps.h> // FIXME
52
53
54 #ifdef __cplusplus
55 extern "C" {
56 #endif
57
58 struct _LOADER_PARAMETER_BLOCK;
59 struct _CREATE_DISK;
60 struct _DRIVE_LAYOUT_INFORMATION_EX;
61 struct _SET_PARTITION_INFORMATION_EX;
62
63 //
64 // GUID and UUID
65 //
66 #ifndef GUID_DEFINED
67 #include <guiddef.h>
68 #endif
69 typedef GUID UUID;
70
71 typedef struct _BUS_HANDLER *PBUS_HANDLER;
72
73 typedef struct _PEB *PPEB;
74
75 #ifndef _NTIMAGE_
76
77 typedef struct _IMAGE_NT_HEADERS *PIMAGE_NT_HEADERS32;
78 typedef struct _IMAGE_NT_HEADERS64 *PIMAGE_NT_HEADERS64;
79
80 #ifdef _WIN64
81 typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS;
82 #else
83 typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS;
84 #endif
85
86 #endif /* _NTIMAGE_ */
87
88 #define EXCEPTION_READ_FAULT 0
89 #define EXCEPTION_WRITE_FAULT 1
90 #define EXCEPTION_EXECUTE_FAULT 8
91
92 #if (NTDDI_VERSION >= NTDDI_VISTA)
93 extern NTSYSAPI volatile CCHAR KeNumberProcessors;
94 #elif (NTDDI_VERSION >= NTDDI_WINXP)
95 extern NTSYSAPI CCHAR KeNumberProcessors;
96 #else
97 extern PCCHAR KeNumberProcessors;
98 #endif
99
100 #define MAX_WOW64_SHARED_ENTRIES 16
101
102 #define NX_SUPPORT_POLICY_ALWAYSOFF 0
103 #define NX_SUPPORT_POLICY_ALWAYSON 1
104 #define NX_SUPPORT_POLICY_OPTIN 2
105 #define NX_SUPPORT_POLICY_OPTOUT 3
106
107 /*
108 ** IRP function codes
109 */
110
111 #define IRP_MN_QUERY_DIRECTORY 0x01
112 #define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02
113
114 #define IRP_MN_USER_FS_REQUEST 0x00
115 #define IRP_MN_MOUNT_VOLUME 0x01
116 #define IRP_MN_VERIFY_VOLUME 0x02
117 #define IRP_MN_LOAD_FILE_SYSTEM 0x03
118 #define IRP_MN_TRACK_LINK 0x04
119 #define IRP_MN_KERNEL_CALL 0x04
120
121 #define IRP_MN_LOCK 0x01
122 #define IRP_MN_UNLOCK_SINGLE 0x02
123 #define IRP_MN_UNLOCK_ALL 0x03
124 #define IRP_MN_UNLOCK_ALL_BY_KEY 0x04
125
126 #define IRP_MN_FLUSH_AND_PURGE 0x01
127
128 #define IRP_MN_NORMAL 0x00
129 #define IRP_MN_DPC 0x01
130 #define IRP_MN_MDL 0x02
131 #define IRP_MN_COMPLETE 0x04
132 #define IRP_MN_COMPRESSED 0x08
133
134 #define IRP_MN_MDL_DPC (IRP_MN_MDL | IRP_MN_DPC)
135 #define IRP_MN_COMPLETE_MDL (IRP_MN_COMPLETE | IRP_MN_MDL)
136 #define IRP_MN_COMPLETE_MDL_DPC (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
137
138 #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
139
140 typedef struct _IO_COUNTERS {
141 ULONGLONG ReadOperationCount;
142 ULONGLONG WriteOperationCount;
143 ULONGLONG OtherOperationCount;
144 ULONGLONG ReadTransferCount;
145 ULONGLONG WriteTransferCount;
146 ULONGLONG OtherTransferCount;
147 } IO_COUNTERS, *PIO_COUNTERS;
148
149 typedef struct _VM_COUNTERS {
150 SIZE_T PeakVirtualSize;
151 SIZE_T VirtualSize;
152 ULONG PageFaultCount;
153 SIZE_T PeakWorkingSetSize;
154 SIZE_T WorkingSetSize;
155 SIZE_T QuotaPeakPagedPoolUsage;
156 SIZE_T QuotaPagedPoolUsage;
157 SIZE_T QuotaPeakNonPagedPoolUsage;
158 SIZE_T QuotaNonPagedPoolUsage;
159 SIZE_T PagefileUsage;
160 SIZE_T PeakPagefileUsage;
161 } VM_COUNTERS, *PVM_COUNTERS;
162
163 typedef struct _VM_COUNTERS_EX
164 {
165 SIZE_T PeakVirtualSize;
166 SIZE_T VirtualSize;
167 ULONG PageFaultCount;
168 SIZE_T PeakWorkingSetSize;
169 SIZE_T WorkingSetSize;
170 SIZE_T QuotaPeakPagedPoolUsage;
171 SIZE_T QuotaPagedPoolUsage;
172 SIZE_T QuotaPeakNonPagedPoolUsage;
173 SIZE_T QuotaNonPagedPoolUsage;
174 SIZE_T PagefileUsage;
175 SIZE_T PeakPagefileUsage;
176 SIZE_T PrivateUsage;
177 } VM_COUNTERS_EX, *PVM_COUNTERS_EX;
178
179 typedef struct _POOLED_USAGE_AND_LIMITS
180 {
181 SIZE_T PeakPagedPoolUsage;
182 SIZE_T PagedPoolUsage;
183 SIZE_T PagedPoolLimit;
184 SIZE_T PeakNonPagedPoolUsage;
185 SIZE_T NonPagedPoolUsage;
186 SIZE_T NonPagedPoolLimit;
187 SIZE_T PeakPagefileUsage;
188 SIZE_T PagefileUsage;
189 SIZE_T PagefileLimit;
190 } POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS;
191
192 /* DEVICE_OBJECT.Flags */
193
194 #define DO_VERIFY_VOLUME 0x00000002
195 #define DO_BUFFERED_IO 0x00000004
196 #define DO_EXCLUSIVE 0x00000008
197 #define DO_DIRECT_IO 0x00000010
198 #define DO_MAP_IO_BUFFER 0x00000020
199 #define DO_DEVICE_HAS_NAME 0x00000040
200 #define DO_DEVICE_INITIALIZING 0x00000080
201 #define DO_SYSTEM_BOOT_PARTITION 0x00000100
202 #define DO_LONG_TERM_REQUESTS 0x00000200
203 #define DO_NEVER_LAST_DEVICE 0x00000400
204 #define DO_SHUTDOWN_REGISTERED 0x00000800
205 #define DO_BUS_ENUMERATED_DEVICE 0x00001000
206 #define DO_POWER_PAGABLE 0x00002000
207 #define DO_POWER_INRUSH 0x00004000
208 #define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
209 #define DO_SUPPORTS_TRANSACTIONS 0x00040000
210 #define DO_FORCE_NEITHER_IO 0x00080000
211 #define DO_VOLUME_DEVICE_OBJECT 0x00100000
212 #define DO_SYSTEM_SYSTEM_PARTITION 0x00200000
213 #define DO_SYSTEM_CRITICAL_PARTITION 0x00400000
214 #define DO_DISALLOW_EXECUTE 0x00800000
215
216 #define DRVO_REINIT_REGISTERED 0x00000008
217 #define DRVO_INITIALIZED 0x00000010
218 #define DRVO_BOOTREINIT_REGISTERED 0x00000020
219 #define DRVO_LEGACY_RESOURCES 0x00000040
220
221 typedef enum _ARBITER_REQUEST_SOURCE {
222 ArbiterRequestUndefined = -1,
223 ArbiterRequestLegacyReported,
224 ArbiterRequestHalReported,
225 ArbiterRequestLegacyAssigned,
226 ArbiterRequestPnpDetected,
227 ArbiterRequestPnpEnumerated
228 } ARBITER_REQUEST_SOURCE;
229
230 typedef enum _ARBITER_RESULT {
231 ArbiterResultUndefined = -1,
232 ArbiterResultSuccess,
233 ArbiterResultExternalConflict,
234 ArbiterResultNullRequest
235 } ARBITER_RESULT;
236
237 typedef enum _ARBITER_ACTION {
238 ArbiterActionTestAllocation,
239 ArbiterActionRetestAllocation,
240 ArbiterActionCommitAllocation,
241 ArbiterActionRollbackAllocation,
242 ArbiterActionQueryAllocatedResources,
243 ArbiterActionWriteReservedResources,
244 ArbiterActionQueryConflict,
245 ArbiterActionQueryArbitrate,
246 ArbiterActionAddReserved,
247 ArbiterActionBootAllocation
248 } ARBITER_ACTION, *PARBITER_ACTION;
249
250 typedef struct _ARBITER_CONFLICT_INFO {
251 PDEVICE_OBJECT OwningObject;
252 ULONGLONG Start;
253 ULONGLONG End;
254 } ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO;
255
256 typedef struct _ARBITER_PARAMETERS {
257 union {
258 struct {
259 IN OUT PLIST_ENTRY ArbitrationList;
260 IN ULONG AllocateFromCount;
261 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
262 } TestAllocation;
263 struct {
264 IN OUT PLIST_ENTRY ArbitrationList;
265 IN ULONG AllocateFromCount;
266 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
267 } RetestAllocation;
268 struct {
269 IN OUT PLIST_ENTRY ArbitrationList;
270 } BootAllocation;
271 struct {
272 OUT PCM_PARTIAL_RESOURCE_LIST *AllocatedResources;
273 } QueryAllocatedResources;
274 struct {
275 IN PDEVICE_OBJECT PhysicalDeviceObject;
276 IN PIO_RESOURCE_DESCRIPTOR ConflictingResource;
277 OUT PULONG ConflictCount;
278 OUT PARBITER_CONFLICT_INFO *Conflicts;
279 } QueryConflict;
280 struct {
281 IN PLIST_ENTRY ArbitrationList;
282 } QueryArbitrate;
283 struct {
284 IN PDEVICE_OBJECT ReserveDevice;
285 } AddReserved;
286 } Parameters;
287 } ARBITER_PARAMETERS, *PARBITER_PARAMETERS;
288
289 #define ARBITER_FLAG_BOOT_CONFIG 0x00000001
290
291 typedef struct _ARBITER_LIST_ENTRY {
292 LIST_ENTRY ListEntry;
293 ULONG AlternativeCount;
294 PIO_RESOURCE_DESCRIPTOR Alternatives;
295 PDEVICE_OBJECT PhysicalDeviceObject;
296 ARBITER_REQUEST_SOURCE RequestSource;
297 ULONG Flags;
298 LONG_PTR WorkSpace;
299 INTERFACE_TYPE InterfaceType;
300 ULONG SlotNumber;
301 ULONG BusNumber;
302 PCM_PARTIAL_RESOURCE_DESCRIPTOR Assignment;
303 PIO_RESOURCE_DESCRIPTOR SelectedAlternative;
304 ARBITER_RESULT Result;
305 } ARBITER_LIST_ENTRY, *PARBITER_LIST_ENTRY;
306
307 typedef NTSTATUS
308 (NTAPI *PARBITER_HANDLER)(
309 IN OUT PVOID Context,
310 IN ARBITER_ACTION Action,
311 IN OUT PARBITER_PARAMETERS Parameters);
312
313 #define ARBITER_PARTIAL 0x00000001
314
315 typedef struct _ARBITER_INTERFACE {
316 USHORT Size;
317 USHORT Version;
318 PVOID Context;
319 PINTERFACE_REFERENCE InterfaceReference;
320 PINTERFACE_DEREFERENCE InterfaceDereference;
321 PARBITER_HANDLER ArbiterHandler;
322 ULONG Flags;
323 } ARBITER_INTERFACE, *PARBITER_INTERFACE;
324
325 typedef enum _HAL_QUERY_INFORMATION_CLASS {
326 HalInstalledBusInformation,
327 HalProfileSourceInformation,
328 HalInformationClassUnused1,
329 HalPowerInformation,
330 HalProcessorSpeedInformation,
331 HalCallbackInformation,
332 HalMapRegisterInformation,
333 HalMcaLogInformation,
334 HalFrameBufferCachingInformation,
335 HalDisplayBiosInformation,
336 HalProcessorFeatureInformation,
337 HalNumaTopologyInterface,
338 HalErrorInformation,
339 HalCmcLogInformation,
340 HalCpeLogInformation,
341 HalQueryMcaInterface,
342 HalQueryAMLIIllegalIOPortAddresses,
343 HalQueryMaxHotPlugMemoryAddress,
344 HalPartitionIpiInterface,
345 HalPlatformInformation,
346 HalQueryProfileSourceList,
347 HalInitLogInformation,
348 HalFrequencyInformation,
349 HalProcessorBrandString,
350 HalHypervisorInformation,
351 HalPlatformTimerInformation,
352 HalAcpiAuditInformation
353 } HAL_QUERY_INFORMATION_CLASS, *PHAL_QUERY_INFORMATION_CLASS;
354
355 typedef enum _HAL_SET_INFORMATION_CLASS {
356 HalProfileSourceInterval,
357 HalProfileSourceInterruptHandler,
358 HalMcaRegisterDriver,
359 HalKernelErrorHandler,
360 HalCmcRegisterDriver,
361 HalCpeRegisterDriver,
362 HalMcaLog,
363 HalCmcLog,
364 HalCpeLog,
365 HalGenerateCmcInterrupt,
366 HalProfileSourceTimerHandler,
367 HalEnlightenment,
368 HalProfileDpgoSourceInterruptHandler
369 } HAL_SET_INFORMATION_CLASS, *PHAL_SET_INFORMATION_CLASS;
370
371 typedef struct _HAL_PROFILE_SOURCE_INTERVAL {
372 KPROFILE_SOURCE Source;
373 ULONG_PTR Interval;
374 } HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL;
375
376 typedef struct _HAL_PROFILE_SOURCE_INFORMATION {
377 KPROFILE_SOURCE Source;
378 BOOLEAN Supported;
379 ULONG Interval;
380 } HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION;
381
382 typedef struct _MAP_REGISTER_ENTRY {
383 PVOID MapRegister;
384 BOOLEAN WriteToDevice;
385 } MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY;
386
387 typedef struct _DEBUG_DEVICE_ADDRESS {
388 UCHAR Type;
389 BOOLEAN Valid;
390 UCHAR Reserved[2];
391 PUCHAR TranslatedAddress;
392 ULONG Length;
393 } DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS;
394
395 typedef struct _DEBUG_MEMORY_REQUIREMENTS {
396 PHYSICAL_ADDRESS Start;
397 PHYSICAL_ADDRESS MaxEnd;
398 PVOID VirtualAddress;
399 ULONG Length;
400 BOOLEAN Cached;
401 BOOLEAN Aligned;
402 } DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS;
403
404 typedef struct _DEBUG_DEVICE_DESCRIPTOR {
405 ULONG Bus;
406 ULONG Slot;
407 USHORT Segment;
408 USHORT VendorID;
409 USHORT DeviceID;
410 UCHAR BaseClass;
411 UCHAR SubClass;
412 UCHAR ProgIf;
413 BOOLEAN Initialized;
414 BOOLEAN Configured;
415 DEBUG_DEVICE_ADDRESS BaseAddress[6];
416 DEBUG_MEMORY_REQUIREMENTS Memory;
417 } DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR;
418
419 typedef struct _PM_DISPATCH_TABLE {
420 ULONG Signature;
421 ULONG Version;
422 PVOID Function[1];
423 } PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE;
424
425 typedef enum _RESOURCE_TRANSLATION_DIRECTION {
426 TranslateChildToParent,
427 TranslateParentToChild
428 } RESOURCE_TRANSLATION_DIRECTION;
429
430 typedef NTSTATUS
431 (NTAPI *PTRANSLATE_RESOURCE_HANDLER)(
432 IN OUT PVOID Context,
433 IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source,
434 IN RESOURCE_TRANSLATION_DIRECTION Direction,
435 IN ULONG AlternativesCount OPTIONAL,
436 IN IO_RESOURCE_DESCRIPTOR Alternatives[],
437 IN PDEVICE_OBJECT PhysicalDeviceObject,
438 OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target);
439
440 typedef NTSTATUS
441 (NTAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)(
442 IN PVOID Context OPTIONAL,
443 IN PIO_RESOURCE_DESCRIPTOR Source,
444 IN PDEVICE_OBJECT PhysicalDeviceObject,
445 OUT PULONG TargetCount,
446 OUT PIO_RESOURCE_DESCRIPTOR *Target);
447
448 typedef struct _TRANSLATOR_INTERFACE {
449 USHORT Size;
450 USHORT Version;
451 PVOID Context;
452 PINTERFACE_REFERENCE InterfaceReference;
453 PINTERFACE_DEREFERENCE InterfaceDereference;
454 PTRANSLATE_RESOURCE_HANDLER TranslateResources;
455 PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements;
456 } TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE;
457
458 typedef VOID
459 (FASTCALL *pHalExamineMBR)(
460 IN PDEVICE_OBJECT DeviceObject,
461 IN ULONG SectorSize,
462 IN ULONG MBRTypeIdentifier,
463 OUT PVOID *Buffer);
464
465 typedef NTSTATUS
466 (FASTCALL *pHalIoReadPartitionTable)(
467 IN PDEVICE_OBJECT DeviceObject,
468 IN ULONG SectorSize,
469 IN BOOLEAN ReturnRecognizedPartitions,
470 OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
471
472 typedef NTSTATUS
473 (FASTCALL *pHalIoSetPartitionInformation)(
474 IN PDEVICE_OBJECT DeviceObject,
475 IN ULONG SectorSize,
476 IN ULONG PartitionNumber,
477 IN ULONG PartitionType);
478
479 typedef NTSTATUS
480 (FASTCALL *pHalIoWritePartitionTable)(
481 IN PDEVICE_OBJECT DeviceObject,
482 IN ULONG SectorSize,
483 IN ULONG SectorsPerTrack,
484 IN ULONG NumberOfHeads,
485 IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
486
487 typedef PBUS_HANDLER
488 (FASTCALL *pHalHandlerForBus)(
489 IN INTERFACE_TYPE InterfaceType,
490 IN ULONG BusNumber);
491
492 typedef VOID
493 (FASTCALL *pHalReferenceBusHandler)(
494 IN PBUS_HANDLER BusHandler);
495
496 typedef NTSTATUS
497 (NTAPI *pHalQuerySystemInformation)(
498 IN HAL_QUERY_INFORMATION_CLASS InformationClass,
499 IN ULONG BufferSize,
500 IN OUT PVOID Buffer,
501 OUT PULONG ReturnedLength);
502
503 typedef NTSTATUS
504 (NTAPI *pHalSetSystemInformation)(
505 IN HAL_SET_INFORMATION_CLASS InformationClass,
506 IN ULONG BufferSize,
507 IN PVOID Buffer);
508
509 typedef NTSTATUS
510 (NTAPI *pHalQueryBusSlots)(
511 IN PBUS_HANDLER BusHandler,
512 IN ULONG BufferSize,
513 OUT PULONG SlotNumbers,
514 OUT PULONG ReturnedLength);
515
516 typedef NTSTATUS
517 (NTAPI *pHalInitPnpDriver)(
518 VOID);
519
520 typedef NTSTATUS
521 (NTAPI *pHalInitPowerManagement)(
522 IN PPM_DISPATCH_TABLE PmDriverDispatchTable,
523 OUT PPM_DISPATCH_TABLE *PmHalDispatchTable);
524
525 typedef struct _DMA_ADAPTER*
526 (NTAPI *pHalGetDmaAdapter)(
527 IN PVOID Context,
528 IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
529 OUT PULONG NumberOfMapRegisters);
530
531 typedef NTSTATUS
532 (NTAPI *pHalGetInterruptTranslator)(
533 IN INTERFACE_TYPE ParentInterfaceType,
534 IN ULONG ParentBusNumber,
535 IN INTERFACE_TYPE BridgeInterfaceType,
536 IN USHORT Size,
537 IN USHORT Version,
538 OUT PTRANSLATOR_INTERFACE Translator,
539 OUT PULONG BridgeBusNumber);
540
541 typedef NTSTATUS
542 (NTAPI *pHalStartMirroring)(
543 VOID);
544
545 typedef NTSTATUS
546 (NTAPI *pHalEndMirroring)(
547 IN ULONG PassNumber);
548
549 typedef NTSTATUS
550 (NTAPI *pHalMirrorPhysicalMemory)(
551 IN PHYSICAL_ADDRESS PhysicalAddress,
552 IN LARGE_INTEGER NumberOfBytes);
553
554 typedef NTSTATUS
555 (NTAPI *pHalMirrorVerify)(
556 IN PHYSICAL_ADDRESS PhysicalAddress,
557 IN LARGE_INTEGER NumberOfBytes);
558
559 typedef VOID
560 (NTAPI *pHalEndOfBoot)(
561 VOID);
562
563 typedef
564 BOOLEAN
565 (NTAPI *pHalTranslateBusAddress)(
566 IN INTERFACE_TYPE InterfaceType,
567 IN ULONG BusNumber,
568 IN PHYSICAL_ADDRESS BusAddress,
569 IN OUT PULONG AddressSpace,
570 OUT PPHYSICAL_ADDRESS TranslatedAddress);
571
572 typedef
573 NTSTATUS
574 (NTAPI *pHalAssignSlotResources)(
575 IN PUNICODE_STRING RegistryPath,
576 IN PUNICODE_STRING DriverClassName OPTIONAL,
577 IN PDRIVER_OBJECT DriverObject,
578 IN PDEVICE_OBJECT DeviceObject,
579 IN INTERFACE_TYPE BusType,
580 IN ULONG BusNumber,
581 IN ULONG SlotNumber,
582 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
583
584 typedef
585 VOID
586 (NTAPI *pHalHaltSystem)(
587 VOID);
588
589 typedef
590 BOOLEAN
591 (NTAPI *pHalResetDisplay)(
592 VOID);
593
594 typedef
595 UCHAR
596 (NTAPI *pHalVectorToIDTEntry)(
597 ULONG Vector);
598
599 typedef
600 BOOLEAN
601 (NTAPI *pHalFindBusAddressTranslation)(
602 IN PHYSICAL_ADDRESS BusAddress,
603 IN OUT PULONG AddressSpace,
604 OUT PPHYSICAL_ADDRESS TranslatedAddress,
605 IN OUT PULONG_PTR Context,
606 IN BOOLEAN NextBus);
607
608 typedef
609 NTSTATUS
610 (NTAPI *pKdSetupPciDeviceForDebugging)(
611 IN PVOID LoaderBlock OPTIONAL,
612 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice);
613
614 typedef
615 NTSTATUS
616 (NTAPI *pKdReleasePciDeviceForDebugging)(
617 IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice);
618
619 typedef
620 PVOID
621 (NTAPI *pKdGetAcpiTablePhase0)(
622 IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
623 IN ULONG Signature);
624
625 typedef
626 PVOID
627 (NTAPI *pHalGetAcpiTable)(
628 IN ULONG Signature,
629 IN PCSTR OemId OPTIONAL,
630 IN PCSTR OemTableId OPTIONAL);
631
632 typedef
633 VOID
634 (NTAPI *pKdCheckPowerButton)(
635 VOID);
636
637 #if (NTDDI_VERSION >= NTDDI_VISTA)
638 typedef
639 PVOID
640 (NTAPI *pKdMapPhysicalMemory64)(
641 IN PHYSICAL_ADDRESS PhysicalAddress,
642 IN ULONG NumberPages,
643 IN BOOLEAN FlushCurrentTLB);
644
645 typedef
646 VOID
647 (NTAPI *pKdUnmapVirtualAddress)(
648 IN PVOID VirtualAddress,
649 IN ULONG NumberPages,
650 IN BOOLEAN FlushCurrentTLB);
651 #else
652 typedef
653 PVOID
654 (NTAPI *pKdMapPhysicalMemory64)(
655 IN PHYSICAL_ADDRESS PhysicalAddress,
656 IN ULONG NumberPages);
657
658 typedef
659 VOID
660 (NTAPI *pKdUnmapVirtualAddress)(
661 IN PVOID VirtualAddress,
662 IN ULONG NumberPages);
663 #endif
664
665
666 typedef
667 ULONG
668 (NTAPI *pKdGetPciDataByOffset)(
669 IN ULONG BusNumber,
670 IN ULONG SlotNumber,
671 OUT PVOID Buffer,
672 IN ULONG Offset,
673 IN ULONG Length);
674
675 typedef
676 ULONG
677 (NTAPI *pKdSetPciDataByOffset)(
678 IN ULONG BusNumber,
679 IN ULONG SlotNumber,
680 IN PVOID Buffer,
681 IN ULONG Offset,
682 IN ULONG Length);
683
684 typedef BOOLEAN
685 (NTAPI *PHAL_RESET_DISPLAY_PARAMETERS)(
686 IN ULONG Columns,
687 IN ULONG Rows);
688
689 typedef
690 VOID
691 (NTAPI *PCI_ERROR_HANDLER_CALLBACK)(
692 VOID);
693
694 typedef
695 VOID
696 (NTAPI *pHalSetPciErrorHandlerCallback)(
697 IN PCI_ERROR_HANDLER_CALLBACK Callback);
698
699 #if 1 /* Not present in WDK 7600 */
700 typedef VOID
701 (FASTCALL *pHalIoAssignDriveLetters)(
702 IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
703 IN PSTRING NtDeviceName,
704 OUT PUCHAR NtSystemPath,
705 OUT PSTRING NtSystemPathString);
706 #endif
707
708 typedef struct {
709 ULONG Version;
710 pHalQuerySystemInformation HalQuerySystemInformation;
711 pHalSetSystemInformation HalSetSystemInformation;
712 pHalQueryBusSlots HalQueryBusSlots;
713 ULONG Spare1;
714 pHalExamineMBR HalExamineMBR;
715 #if 1 /* Not present in WDK 7600 */
716 pHalIoAssignDriveLetters HalIoAssignDriveLetters;
717 #endif
718 pHalIoReadPartitionTable HalIoReadPartitionTable;
719 pHalIoSetPartitionInformation HalIoSetPartitionInformation;
720 pHalIoWritePartitionTable HalIoWritePartitionTable;
721 pHalHandlerForBus HalReferenceHandlerForBus;
722 pHalReferenceBusHandler HalReferenceBusHandler;
723 pHalReferenceBusHandler HalDereferenceBusHandler;
724 pHalInitPnpDriver HalInitPnpDriver;
725 pHalInitPowerManagement HalInitPowerManagement;
726 pHalGetDmaAdapter HalGetDmaAdapter;
727 pHalGetInterruptTranslator HalGetInterruptTranslator;
728 pHalStartMirroring HalStartMirroring;
729 pHalEndMirroring HalEndMirroring;
730 pHalMirrorPhysicalMemory HalMirrorPhysicalMemory;
731 pHalEndOfBoot HalEndOfBoot;
732 pHalMirrorVerify HalMirrorVerify;
733 pHalGetAcpiTable HalGetCachedAcpiTable;
734 pHalSetPciErrorHandlerCallback HalSetPciErrorHandlerCallback;
735 #if defined(_IA64_)
736 pHalGetErrorCapList HalGetErrorCapList;
737 pHalInjectError HalInjectError;
738 #endif
739 } HAL_DISPATCH, *PHAL_DISPATCH;
740
741 /* GCC/MSVC and WDK compatible declaration */
742 extern NTKERNELAPI HAL_DISPATCH HalDispatchTable;
743
744 #if defined(_NTOSKRNL_) || defined(_BLDR_)
745 #define HALDISPATCH (&HalDispatchTable)
746 #else
747 /* This is a WDK compatibility definition */
748 #define HalDispatchTable (&HalDispatchTable)
749 #define HALDISPATCH HalDispatchTable
750 #endif
751
752 #define HAL_DISPATCH_VERSION 3 /* FIXME: when to use 4? */
753 #define HalDispatchTableVersion HALDISPATCH->Version
754 #define HalQuerySystemInformation HALDISPATCH->HalQuerySystemInformation
755 #define HalSetSystemInformation HALDISPATCH->HalSetSystemInformation
756 #define HalQueryBusSlots HALDISPATCH->HalQueryBusSlots
757 #define HalReferenceHandlerForBus HALDISPATCH->HalReferenceHandlerForBus
758 #define HalReferenceBusHandler HALDISPATCH->HalReferenceBusHandler
759 #define HalDereferenceBusHandler HALDISPATCH->HalDereferenceBusHandler
760 #define HalInitPnpDriver HALDISPATCH->HalInitPnpDriver
761 #define HalInitPowerManagement HALDISPATCH->HalInitPowerManagement
762 #define HalGetDmaAdapter HALDISPATCH->HalGetDmaAdapter
763 #define HalGetInterruptTranslator HALDISPATCH->HalGetInterruptTranslator
764 #define HalStartMirroring HALDISPATCH->HalStartMirroring
765 #define HalEndMirroring HALDISPATCH->HalEndMirroring
766 #define HalMirrorPhysicalMemory HALDISPATCH->HalMirrorPhysicalMemory
767 #define HalEndOfBoot HALDISPATCH->HalEndOfBoot
768 #define HalMirrorVerify HALDISPATCH->HalMirrorVerify
769
770 typedef struct _FILE_ALIGNMENT_INFORMATION {
771 ULONG AlignmentRequirement;
772 } FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;
773
774 typedef struct _FILE_NAME_INFORMATION {
775 ULONG FileNameLength;
776 WCHAR FileName[1];
777 } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
778
779
780 typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {
781 ULONG FileAttributes;
782 ULONG ReparseTag;
783 } FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
784
785 typedef struct _FILE_DISPOSITION_INFORMATION {
786 BOOLEAN DeleteFile;
787 } FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
788
789 typedef struct _FILE_END_OF_FILE_INFORMATION {
790 LARGE_INTEGER EndOfFile;
791 } FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
792
793 typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {
794 LARGE_INTEGER ValidDataLength;
795 } FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
796
797 typedef union _FILE_SEGMENT_ELEMENT {
798 PVOID64 Buffer;
799 ULONGLONG Alignment;
800 }FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
801
802 #define SE_UNSOLICITED_INPUT_PRIVILEGE 6
803
804 #if (NTDDI_VERSION >= NTDDI_WIN2K)
805 NTSYSAPI
806 ULONGLONG
807 NTAPI
808 VerSetConditionMask(
809 IN ULONGLONG ConditionMask,
810 IN ULONG TypeMask,
811 IN UCHAR Condition);
812 #endif
813
814 #define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
815 ((ConditionMask) = VerSetConditionMask((ConditionMask), \
816 (TypeBitMask), (ComparisonType)))
817
818 /* RtlVerifyVersionInfo() TypeMask */
819
820 #define VER_MINORVERSION 0x0000001
821 #define VER_MAJORVERSION 0x0000002
822 #define VER_BUILDNUMBER 0x0000004
823 #define VER_PLATFORMID 0x0000008
824 #define VER_SERVICEPACKMINOR 0x0000010
825 #define VER_SERVICEPACKMAJOR 0x0000020
826 #define VER_SUITENAME 0x0000040
827 #define VER_PRODUCT_TYPE 0x0000080
828
829 /* RtlVerifyVersionInfo() ComparisonType */
830
831 #define VER_EQUAL 1
832 #define VER_GREATER 2
833 #define VER_GREATER_EQUAL 3
834 #define VER_LESS 4
835 #define VER_LESS_EQUAL 5
836 #define VER_AND 6
837 #define VER_OR 7
838
839 #define VER_CONDITION_MASK 7
840 #define VER_NUM_BITS_PER_CONDITION_MASK 3
841
842 typedef struct _IMAGE_INFO {
843 _ANONYMOUS_UNION union {
844 ULONG Properties;
845 _ANONYMOUS_STRUCT struct {
846 ULONG ImageAddressingMode:8;
847 ULONG SystemModeImage:1;
848 ULONG ImageMappedToAllPids:1;
849 ULONG ExtendedInfoPresent:1;
850 ULONG Reserved:22;
851 } DUMMYSTRUCTNAME;
852 } DUMMYUNIONNAME;
853 PVOID ImageBase;
854 ULONG ImageSelector;
855 SIZE_T ImageSize;
856 ULONG ImageSectionNumber;
857 } IMAGE_INFO, *PIMAGE_INFO;
858
859 #define IMAGE_ADDRESSING_MODE_32BIT 3
860
861 typedef enum _BUS_DATA_TYPE {
862 ConfigurationSpaceUndefined = -1,
863 Cmos,
864 EisaConfiguration,
865 Pos,
866 CbusConfiguration,
867 PCIConfiguration,
868 VMEConfiguration,
869 NuBusConfiguration,
870 PCMCIAConfiguration,
871 MPIConfiguration,
872 MPSAConfiguration,
873 PNPISAConfiguration,
874 SgiInternalConfiguration,
875 MaximumBusDataType
876 } BUS_DATA_TYPE, *PBUS_DATA_TYPE;
877
878 typedef struct _NT_TIB {
879 struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
880 PVOID StackBase;
881 PVOID StackLimit;
882 PVOID SubSystemTib;
883 _ANONYMOUS_UNION union {
884 PVOID FiberData;
885 ULONG Version;
886 } DUMMYUNIONNAME;
887 PVOID ArbitraryUserPointer;
888 struct _NT_TIB *Self;
889 } NT_TIB, *PNT_TIB;
890
891 typedef struct _NT_TIB32 {
892 ULONG ExceptionList;
893 ULONG StackBase;
894 ULONG StackLimit;
895 ULONG SubSystemTib;
896 __GNU_EXTENSION union {
897 ULONG FiberData;
898 ULONG Version;
899 };
900 ULONG ArbitraryUserPointer;
901 ULONG Self;
902 } NT_TIB32,*PNT_TIB32;
903
904 typedef struct _NT_TIB64 {
905 ULONG64 ExceptionList;
906 ULONG64 StackBase;
907 ULONG64 StackLimit;
908 ULONG64 SubSystemTib;
909 __GNU_EXTENSION union {
910 ULONG64 FiberData;
911 ULONG Version;
912 };
913 ULONG64 ArbitraryUserPointer;
914 ULONG64 Self;
915 } NT_TIB64,*PNT_TIB64;
916
917 typedef enum _PROCESSINFOCLASS {
918 ProcessBasicInformation,
919 ProcessQuotaLimits,
920 ProcessIoCounters,
921 ProcessVmCounters,
922 ProcessTimes,
923 ProcessBasePriority,
924 ProcessRaisePriority,
925 ProcessDebugPort,
926 ProcessExceptionPort,
927 ProcessAccessToken,
928 ProcessLdtInformation,
929 ProcessLdtSize,
930 ProcessDefaultHardErrorMode,
931 ProcessIoPortHandlers,
932 ProcessPooledUsageAndLimits,
933 ProcessWorkingSetWatch,
934 ProcessUserModeIOPL,
935 ProcessEnableAlignmentFaultFixup,
936 ProcessPriorityClass,
937 ProcessWx86Information,
938 ProcessHandleCount,
939 ProcessAffinityMask,
940 ProcessPriorityBoost,
941 ProcessDeviceMap,
942 ProcessSessionInformation,
943 ProcessForegroundInformation,
944 ProcessWow64Information,
945 ProcessImageFileName,
946 ProcessLUIDDeviceMapsEnabled,
947 ProcessBreakOnTermination,
948 ProcessDebugObjectHandle,
949 ProcessDebugFlags,
950 ProcessHandleTracing,
951 ProcessIoPriority,
952 ProcessExecuteFlags,
953 ProcessTlsInformation,
954 ProcessCookie,
955 ProcessImageInformation,
956 ProcessCycleTime,
957 ProcessPagePriority,
958 ProcessInstrumentationCallback,
959 ProcessThreadStackAllocation,
960 ProcessWorkingSetWatchEx,
961 ProcessImageFileNameWin32,
962 ProcessImageFileMapping,
963 ProcessAffinityUpdateMode,
964 ProcessMemoryAllocationMode,
965 ProcessGroupInformation,
966 ProcessTokenVirtualizationEnabled,
967 ProcessConsoleHostProcess,
968 ProcessWindowInformation,
969 MaxProcessInfoClass
970 } PROCESSINFOCLASS;
971
972 typedef enum _THREADINFOCLASS {
973 ThreadBasicInformation,
974 ThreadTimes,
975 ThreadPriority,
976 ThreadBasePriority,
977 ThreadAffinityMask,
978 ThreadImpersonationToken,
979 ThreadDescriptorTableEntry,
980 ThreadEnableAlignmentFaultFixup,
981 ThreadEventPair_Reusable,
982 ThreadQuerySetWin32StartAddress,
983 ThreadZeroTlsCell,
984 ThreadPerformanceCount,
985 ThreadAmILastThread,
986 ThreadIdealProcessor,
987 ThreadPriorityBoost,
988 ThreadSetTlsArrayAddress,
989 ThreadIsIoPending,
990 ThreadHideFromDebugger,
991 ThreadBreakOnTermination,
992 ThreadSwitchLegacyState,
993 ThreadIsTerminated,
994 ThreadLastSystemCall,
995 ThreadIoPriority,
996 ThreadCycleTime,
997 ThreadPagePriority,
998 ThreadActualBasePriority,
999 ThreadTebInformation,
1000 ThreadCSwitchMon,
1001 ThreadCSwitchPmu,
1002 ThreadWow64Context,
1003 ThreadGroupInformation,
1004 ThreadUmsInformation,
1005 ThreadCounterProfiling,
1006 ThreadIdealProcessorEx,
1007 MaxThreadInfoClass
1008 } THREADINFOCLASS;
1009
1010 typedef struct _PROCESS_BASIC_INFORMATION {
1011 NTSTATUS ExitStatus;
1012 struct _PEB *PebBaseAddress;
1013 ULONG_PTR AffinityMask;
1014 KPRIORITY BasePriority;
1015 ULONG_PTR UniqueProcessId;
1016 ULONG_PTR InheritedFromUniqueProcessId;
1017 } PROCESS_BASIC_INFORMATION,*PPROCESS_BASIC_INFORMATION;
1018
1019 typedef struct _PROCESS_WS_WATCH_INFORMATION {
1020 PVOID FaultingPc;
1021 PVOID FaultingVa;
1022 } PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;
1023
1024 typedef struct _PROCESS_DEVICEMAP_INFORMATION {
1025 __GNU_EXTENSION union {
1026 struct {
1027 HANDLE DirectoryHandle;
1028 } Set;
1029 struct {
1030 ULONG DriveMap;
1031 UCHAR DriveType[32];
1032 } Query;
1033 };
1034 } PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
1035
1036 typedef struct _KERNEL_USER_TIMES {
1037 LARGE_INTEGER CreateTime;
1038 LARGE_INTEGER ExitTime;
1039 LARGE_INTEGER KernelTime;
1040 LARGE_INTEGER UserTime;
1041 } KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;
1042
1043 typedef struct _PROCESS_ACCESS_TOKEN {
1044 HANDLE Token;
1045 HANDLE Thread;
1046 } PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
1047
1048 typedef struct _PROCESS_SESSION_INFORMATION {
1049 ULONG SessionId;
1050 } PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;
1051
1052 typedef enum _IO_QUERY_DEVICE_DATA_FORMAT {
1053 IoQueryDeviceIdentifier = 0,
1054 IoQueryDeviceConfigurationData,
1055 IoQueryDeviceComponentInformation,
1056 IoQueryDeviceMaxData
1057 } IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT;
1058
1059 typedef struct _DISK_SIGNATURE {
1060 ULONG PartitionStyle;
1061 _ANONYMOUS_UNION union {
1062 struct {
1063 ULONG Signature;
1064 ULONG CheckSum;
1065 } Mbr;
1066 struct {
1067 GUID DiskId;
1068 } Gpt;
1069 } DUMMYUNIONNAME;
1070 } DISK_SIGNATURE, *PDISK_SIGNATURE;
1071
1072 typedef ULONG_PTR
1073 (NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)(
1074 IN PVOID Context);
1075
1076 typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
1077 PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine;
1078 PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine;
1079 } DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
1080
1081 #define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
1082 #define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
1083 #define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
1084 #define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
1085 #define DRIVER_VERIFIER_IO_CHECKING 0x0010
1086
1087 typedef VOID
1088 (NTAPI *PTIMER_APC_ROUTINE)(
1089 IN PVOID TimerContext,
1090 IN ULONG TimerLowValue,
1091 IN LONG TimerHighValue);
1092
1093 typedef struct _KUSER_SHARED_DATA
1094 {
1095 ULONG TickCountLowDeprecated;
1096 ULONG TickCountMultiplier;
1097 volatile KSYSTEM_TIME InterruptTime;
1098 volatile KSYSTEM_TIME SystemTime;
1099 volatile KSYSTEM_TIME TimeZoneBias;
1100 USHORT ImageNumberLow;
1101 USHORT ImageNumberHigh;
1102 WCHAR NtSystemRoot[260];
1103 ULONG MaxStackTraceDepth;
1104 ULONG CryptoExponent;
1105 ULONG TimeZoneId;
1106 ULONG LargePageMinimum;
1107 ULONG Reserved2[7];
1108 NT_PRODUCT_TYPE NtProductType;
1109 BOOLEAN ProductTypeIsValid;
1110 ULONG NtMajorVersion;
1111 ULONG NtMinorVersion;
1112 BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX];
1113 ULONG Reserved1;
1114 ULONG Reserved3;
1115 volatile ULONG TimeSlip;
1116 ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture;
1117 ULONG AltArchitecturePad[1];
1118 LARGE_INTEGER SystemExpirationDate;
1119 ULONG SuiteMask;
1120 BOOLEAN KdDebuggerEnabled;
1121 #if (NTDDI_VERSION >= NTDDI_WINXPSP2)
1122 UCHAR NXSupportPolicy;
1123 #endif
1124 volatile ULONG ActiveConsoleId;
1125 volatile ULONG DismountCount;
1126 ULONG ComPlusPackage;
1127 ULONG LastSystemRITEventTickCount;
1128 ULONG NumberOfPhysicalPages;
1129 BOOLEAN SafeBootMode;
1130 #if (NTDDI_VERSION >= NTDDI_WIN7)
1131 union {
1132 UCHAR TscQpcData;
1133 struct {
1134 UCHAR TscQpcEnabled:1;
1135 UCHAR TscQpcSpareFlag:1;
1136 UCHAR TscQpcShift:6;
1137 } DUMMYSTRUCTNAME;
1138 } DUMMYUNIONNAME;
1139 UCHAR TscQpcPad[2];
1140 #endif
1141 #if (NTDDI_VERSION >= NTDDI_VISTA)
1142 union {
1143 ULONG SharedDataFlags;
1144 struct {
1145 ULONG DbgErrorPortPresent:1;
1146 ULONG DbgElevationEnabled:1;
1147 ULONG DbgVirtEnabled:1;
1148 ULONG DbgInstallerDetectEnabled:1;
1149 ULONG DbgSystemDllRelocated:1;
1150 ULONG DbgDynProcessorEnabled:1;
1151 ULONG DbgSEHValidationEnabled:1;
1152 ULONG SpareBits:25;
1153 } DUMMYSTRUCTNAME2;
1154 } DUMMYUNIONNAME2;
1155 #else
1156 ULONG TraceLogging;
1157 #endif
1158 ULONG DataFlagsPad[1];
1159 ULONGLONG TestRetInstruction;
1160 ULONG SystemCall;
1161 ULONG SystemCallReturn;
1162 ULONGLONG SystemCallPad[3];
1163 _ANONYMOUS_UNION union {
1164 volatile KSYSTEM_TIME TickCount;
1165 volatile ULONG64 TickCountQuad;
1166 _ANONYMOUS_STRUCT struct {
1167 ULONG ReservedTickCountOverlay[3];
1168 ULONG TickCountPad[1];
1169 } DUMMYSTRUCTNAME;
1170 } DUMMYUNIONNAME3;
1171 ULONG Cookie;
1172 ULONG CookiePad[1];
1173 #if (NTDDI_VERSION >= NTDDI_WS03)
1174 LONGLONG ConsoleSessionForegroundProcessId;
1175 ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES];
1176 #endif
1177 #if (NTDDI_VERSION >= NTDDI_VISTA)
1178 #if (NTDDI_VERSION >= NTDDI_WIN7)
1179 USHORT UserModeGlobalLogger[16];
1180 #else
1181 USHORT UserModeGlobalLogger[8];
1182 ULONG HeapTracingPid[2];
1183 ULONG CritSecTracingPid[2];
1184 #endif
1185 ULONG ImageFileExecutionOptions;
1186 #if (NTDDI_VERSION >= NTDDI_VISTASP1)
1187 ULONG LangGenerationCount;
1188 #else
1189 /* 4 bytes padding */
1190 #endif
1191 ULONGLONG Reserved5;
1192 volatile ULONG64 InterruptTimeBias;
1193 #endif
1194 #if (NTDDI_VERSION >= NTDDI_WIN7)
1195 volatile ULONG64 TscQpcBias;
1196 volatile ULONG ActiveProcessorCount;
1197 volatile USHORT ActiveGroupCount;
1198 USHORT Reserved4;
1199 volatile ULONG AitSamplingValue;
1200 volatile ULONG AppCompatFlag;
1201 ULONGLONG SystemDllNativeRelocation;
1202 ULONG SystemDllWowRelocation;
1203 ULONG XStatePad[1];
1204 XSTATE_CONFIGURATION XState;
1205 #endif
1206 } KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;
1207
1208 extern NTKERNELAPI PVOID MmHighestUserAddress;
1209 extern NTKERNELAPI PVOID MmSystemRangeStart;
1210 extern NTKERNELAPI ULONG MmUserProbeAddress;
1211
1212
1213 #ifdef _X86_
1214
1215 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
1216 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
1217 #if defined(_LOCAL_COPY_USER_PROBE_ADDRESS_)
1218 #define MM_USER_PROBE_ADDRESS _LOCAL_COPY_USER_PROBE_ADDRESS_
1219 extern ULONG _LOCAL_COPY_USER_PROBE_ADDRESS_;
1220 #else
1221 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
1222 #endif
1223 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
1224 #define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
1225 #define MM_SYSTEM_SPACE_END 0xFFFFFFFF
1226 #if !defined (_X86PAE_)
1227 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000
1228 #else
1229 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
1230 #endif
1231
1232 #define KeGetPcr() PCR
1233
1234 #define KERNEL_STACK_SIZE 12288
1235 #define KERNEL_LARGE_STACK_SIZE 61440
1236 #define KERNEL_LARGE_STACK_COMMIT 12288
1237
1238 #define SIZE_OF_80387_REGISTERS 80
1239
1240 #define PCR_MINOR_VERSION 1
1241 #define PCR_MAJOR_VERSION 1
1242
1243 #if !defined(RC_INVOKED)
1244
1245 #define CONTEXT_i386 0x10000
1246 #define CONTEXT_i486 0x10000
1247 #define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
1248 #define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
1249 #define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
1250 #define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
1251 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
1252 #define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
1253
1254 #define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
1255
1256 #endif /* !defined(RC_INVOKED) */
1257
1258 typedef struct _KPCR {
1259 union {
1260 NT_TIB NtTib;
1261 struct {
1262 struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
1263 PVOID Used_StackBase;
1264 PVOID Spare2;
1265 PVOID TssCopy;
1266 ULONG ContextSwitches;
1267 KAFFINITY SetMemberCopy;
1268 PVOID Used_Self;
1269 };
1270 };
1271 struct _KPCR *SelfPcr;
1272 struct _KPRCB *Prcb;
1273 KIRQL Irql;
1274 ULONG IRR;
1275 ULONG IrrActive;
1276 ULONG IDR;
1277 PVOID KdVersionBlock;
1278 struct _KIDTENTRY *IDT;
1279 struct _KGDTENTRY *GDT;
1280 struct _KTSS *TSS;
1281 USHORT MajorVersion;
1282 USHORT MinorVersion;
1283 KAFFINITY SetMember;
1284 ULONG StallScaleFactor;
1285 UCHAR SpareUnused;
1286 UCHAR Number;
1287 UCHAR Spare0;
1288 UCHAR SecondLevelCacheAssociativity;
1289 ULONG VdmAlert;
1290 ULONG KernelReserved[14];
1291 ULONG SecondLevelCacheSize;
1292 ULONG HalReserved[16];
1293 } KPCR, *PKPCR;
1294
1295 FORCEINLINE
1296 ULONG
1297 KeGetCurrentProcessorNumber(VOID)
1298 {
1299 return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
1300 }
1301
1302 typedef struct _FLOATING_SAVE_AREA {
1303 ULONG ControlWord;
1304 ULONG StatusWord;
1305 ULONG TagWord;
1306 ULONG ErrorOffset;
1307 ULONG ErrorSelector;
1308 ULONG DataOffset;
1309 ULONG DataSelector;
1310 UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
1311 ULONG Cr0NpxState;
1312 } FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
1313
1314 #include "pshpack4.h"
1315 typedef struct _CONTEXT {
1316 ULONG ContextFlags;
1317 ULONG Dr0;
1318 ULONG Dr1;
1319 ULONG Dr2;
1320 ULONG Dr3;
1321 ULONG Dr6;
1322 ULONG Dr7;
1323 FLOATING_SAVE_AREA FloatSave;
1324 ULONG SegGs;
1325 ULONG SegFs;
1326 ULONG SegEs;
1327 ULONG SegDs;
1328 ULONG Edi;
1329 ULONG Esi;
1330 ULONG Ebx;
1331 ULONG Edx;
1332 ULONG Ecx;
1333 ULONG Eax;
1334 ULONG Ebp;
1335 ULONG Eip;
1336 ULONG SegCs;
1337 ULONG EFlags;
1338 ULONG Esp;
1339 ULONG SegSs;
1340 UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
1341 } CONTEXT;
1342 #include "poppack.h"
1343
1344 #endif /* _X86_ */
1345
1346 #ifdef _AMD64_
1347
1348 #define PTI_SHIFT 12L
1349 #define PDI_SHIFT 21L
1350 #define PPI_SHIFT 30L
1351 #define PXI_SHIFT 39L
1352 #define PTE_PER_PAGE 512
1353 #define PDE_PER_PAGE 512
1354 #define PPE_PER_PAGE 512
1355 #define PXE_PER_PAGE 512
1356 #define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
1357 #define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
1358 #define PPI_MASK (PPE_PER_PAGE - 1)
1359 #define PXI_MASK (PXE_PER_PAGE - 1)
1360
1361 #define PXE_BASE 0xFFFFF6FB7DBED000ULL
1362 #define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL
1363 #define PPE_BASE 0xFFFFF6FB7DA00000ULL
1364 #define PDE_BASE 0xFFFFF6FB40000000ULL
1365 #define PTE_BASE 0xFFFFF68000000000ULL
1366 #define PXE_TOP 0xFFFFF6FB7DBEDFFFULL
1367 #define PPE_TOP 0xFFFFF6FB7DBFFFFFULL
1368 #define PDE_TOP 0xFFFFF6FB7FFFFFFFULL
1369 #define PTE_TOP 0xFFFFF6FFFFFFFFFFULL
1370
1371 #define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
1372 #define MM_SYSTEM_RANGE_START MmSystemRangeStart
1373 #define MM_USER_PROBE_ADDRESS MmUserProbeAddress
1374 #define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
1375 #define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL
1376 #define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
1377
1378 typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
1379 ULONG64 P1Home;
1380 ULONG64 P2Home;
1381 ULONG64 P3Home;
1382 ULONG64 P4Home;
1383 ULONG64 P5Home;
1384 ULONG64 P6Home;
1385
1386 /* Control flags */
1387 ULONG ContextFlags;
1388 ULONG MxCsr;
1389
1390 /* Segment */
1391 USHORT SegCs;
1392 USHORT SegDs;
1393 USHORT SegEs;
1394 USHORT SegFs;
1395 USHORT SegGs;
1396 USHORT SegSs;
1397 ULONG EFlags;
1398
1399 /* Debug */
1400 ULONG64 Dr0;
1401 ULONG64 Dr1;
1402 ULONG64 Dr2;
1403 ULONG64 Dr3;
1404 ULONG64 Dr6;
1405 ULONG64 Dr7;
1406
1407 /* Integer */
1408 ULONG64 Rax;
1409 ULONG64 Rcx;
1410 ULONG64 Rdx;
1411 ULONG64 Rbx;
1412 ULONG64 Rsp;
1413 ULONG64 Rbp;
1414 ULONG64 Rsi;
1415 ULONG64 Rdi;
1416 ULONG64 R8;
1417 ULONG64 R9;
1418 ULONG64 R10;
1419 ULONG64 R11;
1420 ULONG64 R12;
1421 ULONG64 R13;
1422 ULONG64 R14;
1423 ULONG64 R15;
1424
1425 /* Counter */
1426 ULONG64 Rip;
1427
1428 /* Floating point */
1429 union {
1430 XMM_SAVE_AREA32 FltSave;
1431 struct {
1432 M128A Header[2];
1433 M128A Legacy[8];
1434 M128A Xmm0;
1435 M128A Xmm1;
1436 M128A Xmm2;
1437 M128A Xmm3;
1438 M128A Xmm4;
1439 M128A Xmm5;
1440 M128A Xmm6;
1441 M128A Xmm7;
1442 M128A Xmm8;
1443 M128A Xmm9;
1444 M128A Xmm10;
1445 M128A Xmm11;
1446 M128A Xmm12;
1447 M128A Xmm13;
1448 M128A Xmm14;
1449 M128A Xmm15;
1450 } DUMMYSTRUCTNAME;
1451 } DUMMYUNIONNAME;
1452
1453 /* Vector */
1454 M128A VectorRegister[26];
1455 ULONG64 VectorControl;
1456
1457 /* Debug control */
1458 ULONG64 DebugControl;
1459 ULONG64 LastBranchToRip;
1460 ULONG64 LastBranchFromRip;
1461 ULONG64 LastExceptionToRip;
1462 ULONG64 LastExceptionFromRip;
1463 } CONTEXT;
1464
1465 typedef struct _KPCR
1466 {
1467 _ANONYMOUS_UNION union
1468 {
1469 NT_TIB NtTib;
1470 _ANONYMOUS_STRUCT struct
1471 {
1472 union _KGDTENTRY64 *GdtBase;
1473 struct _KTSS64 *TssBase;
1474 ULONG64 UserRsp;
1475 struct _KPCR *Self;
1476 struct _KPRCB *CurrentPrcb;
1477 PKSPIN_LOCK_QUEUE LockArray;
1478 PVOID Used_Self;
1479 };
1480 };
1481 union _KIDTENTRY64 *IdtBase;
1482 ULONG64 Unused[2];
1483 KIRQL Irql;
1484 UCHAR SecondLevelCacheAssociativity;
1485 UCHAR ObsoleteNumber;
1486 UCHAR Fill0;
1487 ULONG Unused0[3];
1488 USHORT MajorVersion;
1489 USHORT MinorVersion;
1490 ULONG StallScaleFactor;
1491 PVOID Unused1[3];
1492 ULONG KernelReserved[15];
1493 ULONG SecondLevelCacheSize;
1494 ULONG HalReserved[16];
1495 ULONG Unused2;
1496 PVOID KdVersionBlock;
1497 PVOID Unused3;
1498 ULONG PcrAlign1[24];
1499 } KPCR, *PKPCR;
1500
1501 FORCEINLINE
1502 PKPCR
1503 KeGetPcr(VOID)
1504 {
1505 return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
1506 }
1507
1508 FORCEINLINE
1509 ULONG
1510 KeGetCurrentProcessorNumber(VOID)
1511 {
1512 return (ULONG)__readgsword(0x184);
1513 }
1514
1515 #if !defined(RC_INVOKED)
1516
1517 #define CONTEXT_AMD64 0x100000
1518
1519 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
1520 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
1521 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
1522 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
1523 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
1524
1525 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
1526 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
1527
1528 #define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L)
1529
1530 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
1531 #define CONTEXT_SERVICE_ACTIVE 0x10000000
1532 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
1533 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
1534
1535 #endif /* RC_INVOKED */
1536
1537 #endif /* _AMD64_ */
1538
1539 typedef enum _INTERLOCKED_RESULT {
1540 ResultNegative = RESULT_NEGATIVE,
1541 ResultZero = RESULT_ZERO,
1542 ResultPositive = RESULT_POSITIVE
1543 } INTERLOCKED_RESULT;
1544
1545 typedef struct _OSVERSIONINFOA {
1546 ULONG dwOSVersionInfoSize;
1547 ULONG dwMajorVersion;
1548 ULONG dwMinorVersion;
1549 ULONG dwBuildNumber;
1550 ULONG dwPlatformId;
1551 CHAR szCSDVersion[128];
1552 } OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
1553
1554 typedef struct _OSVERSIONINFOW {
1555 ULONG dwOSVersionInfoSize;
1556 ULONG dwMajorVersion;
1557 ULONG dwMinorVersion;
1558 ULONG dwBuildNumber;
1559 ULONG dwPlatformId;
1560 WCHAR szCSDVersion[128];
1561 } OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
1562
1563 typedef struct _OSVERSIONINFOEXA {
1564 ULONG dwOSVersionInfoSize;
1565 ULONG dwMajorVersion;
1566 ULONG dwMinorVersion;
1567 ULONG dwBuildNumber;
1568 ULONG dwPlatformId;
1569 CHAR szCSDVersion[128];
1570 USHORT wServicePackMajor;
1571 USHORT wServicePackMinor;
1572 USHORT wSuiteMask;
1573 UCHAR wProductType;
1574 UCHAR wReserved;
1575 } OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
1576
1577 typedef struct _OSVERSIONINFOEXW {
1578 ULONG dwOSVersionInfoSize;
1579 ULONG dwMajorVersion;
1580 ULONG dwMinorVersion;
1581 ULONG dwBuildNumber;
1582 ULONG dwPlatformId;
1583 WCHAR szCSDVersion[128];
1584 USHORT wServicePackMajor;
1585 USHORT wServicePackMinor;
1586 USHORT wSuiteMask;
1587 UCHAR wProductType;
1588 UCHAR wReserved;
1589 } OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
1590
1591 #ifdef UNICODE
1592 typedef OSVERSIONINFOEXW OSVERSIONINFOEX;
1593 typedef POSVERSIONINFOEXW POSVERSIONINFOEX;
1594 typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;
1595 typedef OSVERSIONINFOW OSVERSIONINFO;
1596 typedef POSVERSIONINFOW POSVERSIONINFO;
1597 typedef LPOSVERSIONINFOW LPOSVERSIONINFO;
1598 #else
1599 typedef OSVERSIONINFOEXA OSVERSIONINFOEX;
1600 typedef POSVERSIONINFOEXA POSVERSIONINFOEX;
1601 typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX;
1602 typedef OSVERSIONINFOA OSVERSIONINFO;
1603 typedef POSVERSIONINFOA POSVERSIONINFO;
1604 typedef LPOSVERSIONINFOA LPOSVERSIONINFO;
1605 #endif /* UNICODE */
1606
1607 /* Executive Types */
1608
1609 #define PROTECTED_POOL 0x80000000
1610
1611 typedef struct _ZONE_SEGMENT_HEADER {
1612 SINGLE_LIST_ENTRY SegmentList;
1613 PVOID Reserved;
1614 } ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER;
1615
1616 typedef struct _ZONE_HEADER {
1617 SINGLE_LIST_ENTRY FreeList;
1618 SINGLE_LIST_ENTRY SegmentList;
1619 ULONG BlockSize;
1620 ULONG TotalSegmentSize;
1621 } ZONE_HEADER, *PZONE_HEADER;
1622
1623 /* Executive Functions */
1624
1625 static __inline PVOID
1626 ExAllocateFromZone(
1627 IN PZONE_HEADER Zone)
1628 {
1629 if (Zone->FreeList.Next)
1630 Zone->FreeList.Next = Zone->FreeList.Next->Next;
1631 return (PVOID) Zone->FreeList.Next;
1632 }
1633
1634 static __inline PVOID
1635 ExFreeToZone(
1636 IN PZONE_HEADER Zone,
1637 IN PVOID Block)
1638 {
1639 ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
1640 Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
1641 return ((PSINGLE_LIST_ENTRY) Block)->Next;
1642 }
1643
1644 /*
1645 * PVOID
1646 * ExInterlockedAllocateFromZone(
1647 * IN PZONE_HEADER Zone,
1648 * IN PKSPIN_LOCK Lock)
1649 */
1650 #define ExInterlockedAllocateFromZone(Zone, Lock) \
1651 ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
1652
1653 /* PVOID
1654 * ExInterlockedFreeToZone(
1655 * IN PZONE_HEADER Zone,
1656 * IN PVOID Block,
1657 * IN PKSPIN_LOCK Lock);
1658 */
1659 #define ExInterlockedFreeToZone(Zone, Block, Lock) \
1660 ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
1661
1662 /*
1663 * BOOLEAN
1664 * ExIsFullZone(
1665 * IN PZONE_HEADER Zone)
1666 */
1667 #define ExIsFullZone(Zone) \
1668 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
1669
1670 /* BOOLEAN
1671 * ExIsObjectInFirstZoneSegment(
1672 * IN PZONE_HEADER Zone,
1673 * IN PVOID Object);
1674 */
1675 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
1676 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
1677 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
1678 (Zone)->TotalSegmentSize)) )
1679
1680 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
1681 #define ExAcquireResourceShared ExAcquireResourceSharedLite
1682 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
1683 #define ExDeleteResource ExDeleteResourceLite
1684 #define ExInitializeResource ExInitializeResourceLite
1685 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
1686 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
1687 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
1688 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
1689
1690 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1691
1692 NTKERNELAPI
1693 NTSTATUS
1694 NTAPI
1695 ExExtendZone(
1696 IN OUT PZONE_HEADER Zone,
1697 IN OUT PVOID Segment,
1698 IN ULONG SegmentSize);
1699
1700 NTKERNELAPI
1701 NTSTATUS
1702 NTAPI
1703 ExInitializeZone(
1704 OUT PZONE_HEADER Zone,
1705 IN ULONG BlockSize,
1706 IN OUT PVOID InitialSegment,
1707 IN ULONG InitialSegmentSize);
1708
1709 NTKERNELAPI
1710 NTSTATUS
1711 NTAPI
1712 ExInterlockedExtendZone(
1713 IN OUT PZONE_HEADER Zone,
1714 IN OUT PVOID Segment,
1715 IN ULONG SegmentSize,
1716 IN OUT PKSPIN_LOCK Lock);
1717
1718 NTKERNELAPI
1719 NTSTATUS
1720 NTAPI
1721 ExUuidCreate(
1722 OUT UUID *Uuid);
1723
1724 NTKERNELAPI
1725 DECLSPEC_NORETURN
1726 VOID
1727 NTAPI
1728 ExRaiseAccessViolation(
1729 VOID);
1730
1731 NTKERNELAPI
1732 DECLSPEC_NORETURN
1733 VOID
1734 NTAPI
1735 ExRaiseDatatypeMisalignment(
1736 VOID);
1737
1738 #endif
1739
1740 #ifdef _X86_
1741
1742 NTKERNELAPI
1743 INTERLOCKED_RESULT
1744 FASTCALL
1745 Exfi386InterlockedIncrementLong(
1746 IN OUT LONG volatile *Addend);
1747
1748 NTKERNELAPI
1749 INTERLOCKED_RESULT
1750 FASTCALL
1751 Exfi386InterlockedDecrementLong(
1752 IN PLONG Addend);
1753
1754 NTKERNELAPI
1755 ULONG
1756 FASTCALL
1757 Exfi386InterlockedExchangeUlong(
1758 IN PULONG Target,
1759 IN ULONG Value);
1760
1761 #endif /* _X86_ */
1762
1763 #ifndef _ARC_DDK_
1764 #define _ARC_DDK_
1765 typedef enum _CONFIGURATION_TYPE {
1766 ArcSystem,
1767 CentralProcessor,
1768 FloatingPointProcessor,
1769 PrimaryIcache,
1770 PrimaryDcache,
1771 SecondaryIcache,
1772 SecondaryDcache,
1773 SecondaryCache,
1774 EisaAdapter,
1775 TcAdapter,
1776 ScsiAdapter,
1777 DtiAdapter,
1778 MultiFunctionAdapter,
1779 DiskController,
1780 TapeController,
1781 CdromController,
1782 WormController,
1783 SerialController,
1784 NetworkController,
1785 DisplayController,
1786 ParallelController,
1787 PointerController,
1788 KeyboardController,
1789 AudioController,
1790 OtherController,
1791 DiskPeripheral,
1792 FloppyDiskPeripheral,
1793 TapePeripheral,
1794 ModemPeripheral,
1795 MonitorPeripheral,
1796 PrinterPeripheral,
1797 PointerPeripheral,
1798 KeyboardPeripheral,
1799 TerminalPeripheral,
1800 OtherPeripheral,
1801 LinePeripheral,
1802 NetworkPeripheral,
1803 SystemMemory,
1804 DockingInformation,
1805 RealModeIrqRoutingTable,
1806 RealModePCIEnumeration,
1807 MaximumType
1808 } CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
1809 #endif /* !_ARC_DDK_ */
1810
1811 typedef struct _CONTROLLER_OBJECT {
1812 CSHORT Type;
1813 CSHORT Size;
1814 PVOID ControllerExtension;
1815 KDEVICE_QUEUE DeviceWaitQueue;
1816 ULONG Spare1;
1817 LARGE_INTEGER Spare2;
1818 } CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
1819
1820 typedef struct _CONFIGURATION_INFORMATION {
1821 ULONG DiskCount;
1822 ULONG FloppyCount;
1823 ULONG CdRomCount;
1824 ULONG TapeCount;
1825 ULONG ScsiPortCount;
1826 ULONG SerialCount;
1827 ULONG ParallelCount;
1828 BOOLEAN AtDiskPrimaryAddressClaimed;
1829 BOOLEAN AtDiskSecondaryAddressClaimed;
1830 ULONG Version;
1831 ULONG MediumChangerCount;
1832 } CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
1833
1834 typedef
1835 NTSTATUS
1836 (NTAPI *PIO_QUERY_DEVICE_ROUTINE)(
1837 IN PVOID Context,
1838 IN PUNICODE_STRING PathName,
1839 IN INTERFACE_TYPE BusType,
1840 IN ULONG BusNumber,
1841 IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
1842 IN CONFIGURATION_TYPE ControllerType,
1843 IN ULONG ControllerNumber,
1844 IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
1845 IN CONFIGURATION_TYPE PeripheralType,
1846 IN ULONG PeripheralNumber,
1847 IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation);
1848
1849 typedef
1850 VOID
1851 (NTAPI DRIVER_REINITIALIZE)(
1852 IN struct _DRIVER_OBJECT *DriverObject,
1853 IN PVOID Context,
1854 IN ULONG Count);
1855
1856 typedef DRIVER_REINITIALIZE *PDRIVER_REINITIALIZE;
1857
1858 /** Filesystem runtime library routines **/
1859
1860 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1861 NTKERNELAPI
1862 BOOLEAN
1863 NTAPI
1864 FsRtlIsTotalDeviceFailure(
1865 IN NTSTATUS Status);
1866 #endif
1867
1868 /* Hardware Abstraction Layer Types */
1869
1870 typedef VOID
1871 (NTAPI *PciPin2Line)(
1872 IN struct _BUS_HANDLER *BusHandler,
1873 IN struct _BUS_HANDLER *RootHandler,
1874 IN PCI_SLOT_NUMBER SlotNumber,
1875 IN PPCI_COMMON_CONFIG PciData);
1876
1877 typedef VOID
1878 (NTAPI *PciLine2Pin)(
1879 IN struct _BUS_HANDLER *BusHandler,
1880 IN struct _BUS_HANDLER *RootHandler,
1881 IN PCI_SLOT_NUMBER SlotNumber,
1882 IN PPCI_COMMON_CONFIG PciNewData,
1883 IN PPCI_COMMON_CONFIG PciOldData);
1884
1885 typedef VOID
1886 (NTAPI *PciReadWriteConfig)(
1887 IN struct _BUS_HANDLER *BusHandler,
1888 IN PCI_SLOT_NUMBER Slot,
1889 IN PVOID Buffer,
1890 IN ULONG Offset,
1891 IN ULONG Length);
1892
1893 #define PCI_DATA_TAG ' ICP'
1894 #define PCI_DATA_VERSION 1
1895
1896 typedef struct _PCIBUSDATA {
1897 ULONG Tag;
1898 ULONG Version;
1899 PciReadWriteConfig ReadConfig;
1900 PciReadWriteConfig WriteConfig;
1901 PciPin2Line Pin2Line;
1902 PciLine2Pin Line2Pin;
1903 PCI_SLOT_NUMBER ParentSlot;
1904 PVOID Reserved[4];
1905 } PCIBUSDATA, *PPCIBUSDATA;
1906
1907 /* Hardware Abstraction Layer Functions */
1908
1909 #if !defined(NO_LEGACY_DRIVERS)
1910
1911 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1912
1913 NTHALAPI
1914 NTSTATUS
1915 NTAPI
1916 HalAssignSlotResources(
1917 IN PUNICODE_STRING RegistryPath,
1918 IN PUNICODE_STRING DriverClassName,
1919 IN PDRIVER_OBJECT DriverObject,
1920 IN PDEVICE_OBJECT DeviceObject,
1921 IN INTERFACE_TYPE BusType,
1922 IN ULONG BusNumber,
1923 IN ULONG SlotNumber,
1924 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
1925
1926 NTHALAPI
1927 ULONG
1928 NTAPI
1929 HalGetInterruptVector(
1930 IN INTERFACE_TYPE InterfaceType,
1931 IN ULONG BusNumber,
1932 IN ULONG BusInterruptLevel,
1933 IN ULONG BusInterruptVector,
1934 OUT PKIRQL Irql,
1935 OUT PKAFFINITY Affinity);
1936
1937 NTHALAPI
1938 ULONG
1939 NTAPI
1940 HalSetBusData(
1941 IN BUS_DATA_TYPE BusDataType,
1942 IN ULONG BusNumber,
1943 IN ULONG SlotNumber,
1944 IN PVOID Buffer,
1945 IN ULONG Length);
1946
1947 #endif
1948
1949 #endif /* !defined(NO_LEGACY_DRIVERS) */
1950
1951 #if (NTDDI_VERSION >= NTDDI_WIN2K)
1952
1953 NTHALAPI
1954 PADAPTER_OBJECT
1955 NTAPI
1956 HalGetAdapter(
1957 IN PDEVICE_DESCRIPTION DeviceDescription,
1958 IN OUT PULONG NumberOfMapRegisters);
1959
1960 NTHALAPI
1961 BOOLEAN
1962 NTAPI
1963 HalMakeBeep(
1964 IN ULONG Frequency);
1965
1966 VOID
1967 NTAPI
1968 HalPutDmaAdapter(
1969 IN PADAPTER_OBJECT DmaAdapter);
1970
1971 NTHALAPI
1972 VOID
1973 NTAPI
1974 HalAcquireDisplayOwnership(
1975 IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters);
1976
1977 NTHALAPI
1978 ULONG
1979 NTAPI
1980 HalGetBusData(
1981 IN BUS_DATA_TYPE BusDataType,
1982 IN ULONG BusNumber,
1983 IN ULONG SlotNumber,
1984 OUT PVOID Buffer,
1985 IN ULONG Length);
1986
1987 NTHALAPI
1988 ULONG
1989 NTAPI
1990 HalGetBusDataByOffset(
1991 IN BUS_DATA_TYPE BusDataType,
1992 IN ULONG BusNumber,
1993 IN ULONG SlotNumber,
1994 OUT PVOID Buffer,
1995 IN ULONG Offset,
1996 IN ULONG Length);
1997
1998 NTHALAPI
1999 ULONG
2000 NTAPI
2001 HalSetBusDataByOffset(
2002 IN BUS_DATA_TYPE BusDataType,
2003 IN ULONG BusNumber,
2004 IN ULONG SlotNumber,
2005 IN PVOID Buffer,
2006 IN ULONG Offset,
2007 IN ULONG Length);
2008
2009 NTHALAPI
2010 BOOLEAN
2011 NTAPI
2012 HalTranslateBusAddress(
2013 IN INTERFACE_TYPE InterfaceType,
2014 IN ULONG BusNumber,
2015 IN PHYSICAL_ADDRESS BusAddress,
2016 IN OUT PULONG AddressSpace,
2017 OUT PPHYSICAL_ADDRESS TranslatedAddress);
2018
2019 #endif
2020
2021 #if (NTDDI_VERSION >= NTDDI_WINXP)
2022 NTKERNELAPI
2023 VOID
2024 FASTCALL
2025 HalExamineMBR(
2026 IN PDEVICE_OBJECT DeviceObject,
2027 IN ULONG SectorSize,
2028 IN ULONG MBRTypeIdentifier,
2029 OUT PVOID *Buffer);
2030 #endif
2031
2032 #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
2033 // nothing here
2034 #else
2035
2036 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2037 //DECLSPEC_DEPRECATED_DDK
2038 NTHALAPI
2039 VOID
2040 NTAPI
2041 IoFreeAdapterChannel(
2042 IN PADAPTER_OBJECT AdapterObject);
2043
2044 //DECLSPEC_DEPRECATED_DDK
2045 NTHALAPI
2046 BOOLEAN
2047 NTAPI
2048 IoFlushAdapterBuffers(
2049 IN PADAPTER_OBJECT AdapterObject,
2050 IN PMDL Mdl,
2051 IN PVOID MapRegisterBase,
2052 IN PVOID CurrentVa,
2053 IN ULONG Length,
2054 IN BOOLEAN WriteToDevice);
2055
2056 //DECLSPEC_DEPRECATED_DDK
2057 NTHALAPI
2058 VOID
2059 NTAPI
2060 IoFreeMapRegisters(
2061 IN PADAPTER_OBJECT AdapterObject,
2062 IN PVOID MapRegisterBase,
2063 IN ULONG NumberOfMapRegisters);
2064
2065 //DECLSPEC_DEPRECATED_DDK
2066 NTHALAPI
2067 PVOID
2068 NTAPI
2069 HalAllocateCommonBuffer(
2070 IN PADAPTER_OBJECT AdapterObject,
2071 IN ULONG Length,
2072 OUT PPHYSICAL_ADDRESS LogicalAddress,
2073 IN BOOLEAN CacheEnabled);
2074
2075 //DECLSPEC_DEPRECATED_DDK
2076 NTHALAPI
2077 VOID
2078 NTAPI
2079 HalFreeCommonBuffer(
2080 IN PADAPTER_OBJECT AdapterObject,
2081 IN ULONG Length,
2082 IN PHYSICAL_ADDRESS LogicalAddress,
2083 IN PVOID VirtualAddress,
2084 IN BOOLEAN CacheEnabled);
2085
2086 //DECLSPEC_DEPRECATED_DDK
2087 NTHALAPI
2088 ULONG
2089 NTAPI
2090 HalReadDmaCounter(
2091 IN PADAPTER_OBJECT AdapterObject);
2092
2093 NTHALAPI
2094 NTSTATUS
2095 NTAPI
2096 HalAllocateAdapterChannel(
2097 IN PADAPTER_OBJECT AdapterObject,
2098 IN PWAIT_CONTEXT_BLOCK Wcb,
2099 IN ULONG NumberOfMapRegisters,
2100 IN PDRIVER_CONTROL ExecutionRoutine);
2101
2102 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
2103
2104 #endif /* defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) */
2105
2106 /* I/O Manager Functions */
2107
2108 /*
2109 * VOID IoAssignArcName(
2110 * IN PUNICODE_STRING ArcName,
2111 * IN PUNICODE_STRING DeviceName);
2112 */
2113 #define IoAssignArcName(_ArcName, _DeviceName) ( \
2114 IoCreateSymbolicLink((_ArcName), (_DeviceName)))
2115
2116 /*
2117 * VOID
2118 * IoDeassignArcName(
2119 * IN PUNICODE_STRING ArcName)
2120 */
2121 #define IoDeassignArcName IoDeleteSymbolicLink
2122
2123 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2124
2125 #if !(defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_))
2126 NTKERNELAPI
2127 NTSTATUS
2128 NTAPI
2129 IoAllocateAdapterChannel(
2130 IN PADAPTER_OBJECT AdapterObject,
2131 IN PDEVICE_OBJECT DeviceObject,
2132 IN ULONG NumberOfMapRegisters,
2133 IN PDRIVER_CONTROL ExecutionRoutine,
2134 IN PVOID Context);
2135 #endif
2136
2137 //DECLSPEC_DEPRECATED_DDK
2138 NTHALAPI
2139 PHYSICAL_ADDRESS
2140 NTAPI
2141 IoMapTransfer(
2142 IN PADAPTER_OBJECT AdapterObject,
2143 IN PMDL Mdl,
2144 IN PVOID MapRegisterBase,
2145 IN PVOID CurrentVa,
2146 IN OUT PULONG Length,
2147 IN BOOLEAN WriteToDevice);
2148
2149 NTKERNELAPI
2150 VOID
2151 NTAPI
2152 IoAllocateController(
2153 IN PCONTROLLER_OBJECT ControllerObject,
2154 IN PDEVICE_OBJECT DeviceObject,
2155 IN PDRIVER_CONTROL ExecutionRoutine,
2156 IN PVOID Context OPTIONAL);
2157
2158 NTKERNELAPI
2159 PCONTROLLER_OBJECT
2160 NTAPI
2161 IoCreateController(
2162 IN ULONG Size);
2163
2164 NTKERNELAPI
2165 VOID
2166 NTAPI
2167 IoDeleteController(
2168 IN PCONTROLLER_OBJECT ControllerObject);
2169
2170 NTKERNELAPI
2171 VOID
2172 NTAPI
2173 IoFreeController(
2174 IN PCONTROLLER_OBJECT ControllerObject);
2175
2176 NTKERNELAPI
2177 PCONFIGURATION_INFORMATION
2178 NTAPI
2179 IoGetConfigurationInformation(
2180 VOID);
2181
2182 NTKERNELAPI
2183 PDEVICE_OBJECT
2184 NTAPI
2185 IoGetDeviceToVerify(
2186 IN PETHREAD Thread);
2187
2188 NTKERNELAPI
2189 VOID
2190 NTAPI
2191 IoCancelFileOpen(
2192 IN PDEVICE_OBJECT DeviceObject,
2193 IN PFILE_OBJECT FileObject);
2194
2195 NTKERNELAPI
2196 PGENERIC_MAPPING
2197 NTAPI
2198 IoGetFileObjectGenericMapping(
2199 VOID);
2200
2201 NTKERNELAPI
2202 PIRP
2203 NTAPI
2204 IoMakeAssociatedIrp(
2205 IN PIRP Irp,
2206 IN CCHAR StackSize);
2207
2208 NTKERNELAPI
2209 NTSTATUS
2210 NTAPI
2211 IoQueryDeviceDescription(
2212 IN PINTERFACE_TYPE BusType OPTIONAL,
2213 IN PULONG BusNumber OPTIONAL,
2214 IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
2215 IN PULONG ControllerNumber OPTIONAL,
2216 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
2217 IN PULONG PeripheralNumber OPTIONAL,
2218 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
2219 IN OUT PVOID Context OPTIONAL);
2220
2221 NTKERNELAPI
2222 VOID
2223 NTAPI
2224 IoRaiseHardError(
2225 IN PIRP Irp,
2226 IN PVPB Vpb OPTIONAL,
2227 IN PDEVICE_OBJECT RealDeviceObject);
2228
2229 NTKERNELAPI
2230 BOOLEAN
2231 NTAPI
2232 IoRaiseInformationalHardError(
2233 IN NTSTATUS ErrorStatus,
2234 IN PUNICODE_STRING String OPTIONAL,
2235 IN PKTHREAD Thread OPTIONAL);
2236
2237 NTKERNELAPI
2238 VOID
2239 NTAPI
2240 IoRegisterBootDriverReinitialization(
2241 IN PDRIVER_OBJECT DriverObject,
2242 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
2243 IN PVOID Context OPTIONAL);
2244
2245 NTKERNELAPI
2246 VOID
2247 NTAPI
2248 IoRegisterDriverReinitialization(
2249 IN PDRIVER_OBJECT DriverObject,
2250 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
2251 IN PVOID Context OPTIONAL);
2252
2253 NTKERNELAPI
2254 NTSTATUS
2255 NTAPI
2256 IoAttachDeviceByPointer(
2257 IN PDEVICE_OBJECT SourceDevice,
2258 IN PDEVICE_OBJECT TargetDevice);
2259
2260 NTKERNELAPI
2261 NTSTATUS
2262 NTAPI
2263 IoReportDetectedDevice(
2264 IN PDRIVER_OBJECT DriverObject,
2265 IN INTERFACE_TYPE LegacyBusType,
2266 IN ULONG BusNumber,
2267 IN ULONG SlotNumber,
2268 IN PCM_RESOURCE_LIST ResourceList OPTIONAL,
2269 IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
2270 IN BOOLEAN ResourceAssigned,
2271 IN OUT PDEVICE_OBJECT *DeviceObject);
2272
2273 NTKERNELAPI
2274 NTSTATUS
2275 NTAPI
2276 IoReportResourceForDetection(
2277 IN PDRIVER_OBJECT DriverObject,
2278 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
2279 IN ULONG DriverListSize OPTIONAL,
2280 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
2281 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
2282 IN ULONG DeviceListSize OPTIONAL,
2283 OUT PBOOLEAN ConflictDetected);
2284
2285 NTKERNELAPI
2286 NTSTATUS
2287 NTAPI
2288 IoReportResourceUsage(
2289 IN PUNICODE_STRING DriverClassName OPTIONAL,
2290 IN PDRIVER_OBJECT DriverObject,
2291 IN PCM_RESOURCE_LIST DriverList OPTIONAL,
2292 IN ULONG DriverListSize OPTIONAL,
2293 IN PDEVICE_OBJECT DeviceObject,
2294 IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
2295 IN ULONG DeviceListSize OPTIONAL,
2296 IN BOOLEAN OverrideConflict,
2297 OUT PBOOLEAN ConflictDetected);
2298
2299 NTKERNELAPI
2300 VOID
2301 NTAPI
2302 IoSetHardErrorOrVerifyDevice(
2303 IN PIRP Irp,
2304 IN PDEVICE_OBJECT DeviceObject);
2305
2306 NTKERNELAPI
2307 NTSTATUS
2308 NTAPI
2309 IoAssignResources(
2310 IN PUNICODE_STRING RegistryPath,
2311 IN PUNICODE_STRING DriverClassName OPTIONAL,
2312 IN PDRIVER_OBJECT DriverObject,
2313 IN PDEVICE_OBJECT DeviceObject OPTIONAL,
2314 IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources OPTIONAL,
2315 IN OUT PCM_RESOURCE_LIST *AllocatedResources);
2316
2317 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
2318
2319 #if (NTDDI_VERSION >= NTDDI_WINXP)
2320
2321 NTKERNELAPI
2322 NTSTATUS
2323 NTAPI
2324 IoCreateDisk(
2325 IN PDEVICE_OBJECT DeviceObject,
2326 IN struct _CREATE_DISK* Disk OPTIONAL);
2327
2328 NTKERNELAPI
2329 NTSTATUS
2330 NTAPI
2331 IoReadDiskSignature(
2332 IN PDEVICE_OBJECT DeviceObject,
2333 IN ULONG BytesPerSector,
2334 OUT PDISK_SIGNATURE Signature);
2335
2336 NTKERNELAPI
2337 NTSTATUS
2338 FASTCALL
2339 IoReadPartitionTable(
2340 IN PDEVICE_OBJECT DeviceObject,
2341 IN ULONG SectorSize,
2342 IN BOOLEAN ReturnRecognizedPartitions,
2343 OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
2344
2345 NTKERNELAPI
2346 NTSTATUS
2347 NTAPI
2348 IoReadPartitionTableEx(
2349 IN PDEVICE_OBJECT DeviceObject,
2350 IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
2351
2352 NTKERNELAPI
2353 NTSTATUS
2354 FASTCALL
2355 IoSetPartitionInformation(
2356 IN PDEVICE_OBJECT DeviceObject,
2357 IN ULONG SectorSize,
2358 IN ULONG PartitionNumber,
2359 IN ULONG PartitionType);
2360
2361 NTKERNELAPI
2362 NTSTATUS
2363 NTAPI
2364 IoSetPartitionInformationEx(
2365 IN PDEVICE_OBJECT DeviceObject,
2366 IN ULONG PartitionNumber,
2367 IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
2368
2369 NTKERNELAPI
2370 NTSTATUS
2371 NTAPI
2372 IoSetSystemPartition(
2373 IN PUNICODE_STRING VolumeNameString);
2374
2375 NTKERNELAPI
2376 BOOLEAN
2377 NTAPI
2378 IoSetThreadHardErrorMode(
2379 IN BOOLEAN EnableHardErrors);
2380
2381 NTKERNELAPI
2382 NTSTATUS
2383 NTAPI
2384 IoVerifyPartitionTable(
2385 IN PDEVICE_OBJECT DeviceObject,
2386 IN BOOLEAN FixErrors);
2387
2388 NTKERNELAPI
2389 NTSTATUS
2390 NTAPI
2391 IoVolumeDeviceToDosName(
2392 IN PVOID VolumeDeviceObject,
2393 OUT PUNICODE_STRING DosName);
2394
2395 NTKERNELAPI
2396 NTSTATUS
2397 FASTCALL
2398 IoWritePartitionTable(
2399 IN PDEVICE_OBJECT DeviceObject,
2400 IN ULONG SectorSize,
2401 IN ULONG SectorsPerTrack,
2402 IN ULONG NumberOfHeads,
2403 IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
2404
2405 NTKERNELAPI
2406 NTSTATUS
2407 NTAPI
2408 IoWritePartitionTableEx(
2409 IN PDEVICE_OBJECT DeviceObject,
2410 IN struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout);
2411
2412 NTKERNELAPI
2413 NTSTATUS
2414 NTAPI
2415 IoAttachDeviceToDeviceStackSafe(
2416 IN PDEVICE_OBJECT SourceDevice,
2417 IN PDEVICE_OBJECT TargetDevice,
2418 OUT PDEVICE_OBJECT *AttachedToDeviceObject);
2419
2420 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
2421
2422 /** Kernel debugger routines **/
2423
2424 NTSYSAPI
2425 ULONG
2426 NTAPI
2427 DbgPrompt(
2428 IN PCCH Prompt,
2429 OUT PCH Response,
2430 IN ULONG MaximumResponseLength);
2431
2432 /* Kernel Functions */
2433
2434 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2435
2436 NTKERNELAPI
2437 DECLSPEC_NORETURN
2438 VOID
2439 NTAPI
2440 KeBugCheck(
2441 IN ULONG BugCheckCode);
2442
2443 NTKERNELAPI
2444 LONG
2445 NTAPI
2446 KePulseEvent(
2447 IN OUT PRKEVENT Event,
2448 IN KPRIORITY Increment,
2449 IN BOOLEAN Wait);
2450
2451 NTKERNELAPI
2452 LONG
2453 NTAPI
2454 KeSetBasePriorityThread(
2455 IN OUT PRKTHREAD Thread,
2456 IN LONG Increment);
2457
2458 #endif
2459
2460 /* Memory Manager Types */
2461
2462 typedef struct _PHYSICAL_MEMORY_RANGE {
2463 PHYSICAL_ADDRESS BaseAddress;
2464 LARGE_INTEGER NumberOfBytes;
2465 } PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
2466
2467 /* Memory Manager Functions */
2468
2469 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2470
2471 NTKERNELAPI
2472 PPHYSICAL_MEMORY_RANGE
2473 NTAPI
2474 MmGetPhysicalMemoryRanges(
2475 VOID);
2476
2477 NTKERNELAPI
2478 PHYSICAL_ADDRESS
2479 NTAPI
2480 MmGetPhysicalAddress(
2481 IN PVOID BaseAddress);
2482
2483 NTKERNELAPI
2484 BOOLEAN
2485 NTAPI
2486 MmIsNonPagedSystemAddressValid(
2487 IN PVOID VirtualAddress);
2488
2489 NTKERNELAPI
2490 PVOID
2491 NTAPI
2492 MmAllocateNonCachedMemory(
2493 IN SIZE_T NumberOfBytes);
2494
2495 NTKERNELAPI
2496 VOID
2497 NTAPI
2498 MmFreeNonCachedMemory(
2499 IN PVOID BaseAddress,
2500 IN SIZE_T NumberOfBytes);
2501
2502 NTKERNELAPI
2503 PVOID
2504 NTAPI
2505 MmGetVirtualForPhysical(
2506 IN PHYSICAL_ADDRESS PhysicalAddress);
2507
2508 NTKERNELAPI
2509 NTSTATUS
2510 NTAPI
2511 MmMapUserAddressesToPage(
2512 IN PVOID BaseAddress,
2513 IN SIZE_T NumberOfBytes,
2514 IN PVOID PageAddress);
2515
2516 NTKERNELAPI
2517 PVOID
2518 NTAPI
2519 MmMapVideoDisplay(
2520 IN PHYSICAL_ADDRESS PhysicalAddress,
2521 IN SIZE_T NumberOfBytes,
2522 IN MEMORY_CACHING_TYPE CacheType);
2523
2524 NTKERNELAPI
2525 NTSTATUS
2526 NTAPI
2527 MmMapViewInSessionSpace(
2528 IN PVOID Section,
2529 OUT PVOID *MappedBase,
2530 IN OUT PSIZE_T ViewSize);
2531
2532 NTKERNELAPI
2533 NTSTATUS
2534 NTAPI
2535 MmMapViewInSystemSpace(
2536 IN PVOID Section,
2537 OUT PVOID *MappedBase,
2538 IN OUT PSIZE_T ViewSize);
2539
2540 NTKERNELAPI
2541 BOOLEAN
2542 NTAPI
2543 MmIsAddressValid(
2544 IN PVOID VirtualAddress);
2545
2546 NTKERNELAPI
2547 BOOLEAN
2548 NTAPI
2549 MmIsThisAnNtAsSystem(
2550 VOID);
2551
2552 NTKERNELAPI
2553 VOID
2554 NTAPI
2555 MmLockPagableSectionByHandle(
2556 IN PVOID ImageSectionHandle);
2557
2558 NTKERNELAPI
2559 NTSTATUS
2560 NTAPI
2561 MmUnmapViewInSessionSpace(
2562 IN PVOID MappedBase);
2563
2564 NTKERNELAPI
2565 NTSTATUS
2566 NTAPI
2567 MmUnmapViewInSystemSpace(
2568 IN PVOID MappedBase);
2569
2570 NTKERNELAPI
2571 VOID
2572 NTAPI
2573 MmUnsecureVirtualMemory(
2574 IN HANDLE SecureHandle);
2575
2576 NTKERNELAPI
2577 NTSTATUS
2578 NTAPI
2579 MmRemovePhysicalMemory(
2580 IN PPHYSICAL_ADDRESS StartAddress,
2581 IN OUT PLARGE_INTEGER NumberOfBytes);
2582
2583 NTKERNELAPI
2584 HANDLE
2585 NTAPI
2586 MmSecureVirtualMemory(
2587 IN PVOID Address,
2588 IN SIZE_T Size,
2589 IN ULONG ProbeMode);
2590
2591 NTKERNELAPI
2592 VOID
2593 NTAPI
2594 MmUnmapVideoDisplay(
2595 IN PVOID BaseAddress,
2596 IN SIZE_T NumberOfBytes);
2597
2598 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
2599
2600 /* NtXxx Functions */
2601
2602 NTSYSCALLAPI
2603 NTSTATUS
2604 NTAPI
2605 NtOpenProcess(
2606 OUT PHANDLE ProcessHandle,
2607 IN ACCESS_MASK DesiredAccess,
2608 IN POBJECT_ATTRIBUTES ObjectAttributes,
2609 IN PCLIENT_ID ClientId OPTIONAL);
2610
2611 NTSYSCALLAPI
2612 NTSTATUS
2613 NTAPI
2614 NtQueryInformationProcess(
2615 IN HANDLE ProcessHandle,
2616 IN PROCESSINFOCLASS ProcessInformationClass,
2617 OUT PVOID ProcessInformation OPTIONAL,
2618 IN ULONG ProcessInformationLength,
2619 OUT PULONG ReturnLength OPTIONAL);
2620
2621 /** Process manager types **/
2622
2623 typedef VOID
2624 (NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)(
2625 IN HANDLE ParentId,
2626 IN HANDLE ProcessId,
2627 IN BOOLEAN Create);
2628
2629 typedef VOID
2630 (NTAPI *PCREATE_THREAD_NOTIFY_ROUTINE)(
2631 IN HANDLE ProcessId,
2632 IN HANDLE ThreadId,
2633 IN BOOLEAN Create);
2634
2635 typedef VOID
2636 (NTAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)(
2637 IN PUNICODE_STRING FullImageName,
2638 IN HANDLE ProcessId,
2639 IN PIMAGE_INFO ImageInfo);
2640
2641 /** Process manager routines **/
2642
2643 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2644
2645 NTKERNELAPI
2646 NTSTATUS
2647 NTAPI
2648 PsSetLoadImageNotifyRoutine(
2649 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
2650
2651 NTKERNELAPI
2652 NTSTATUS
2653 NTAPI
2654 PsSetCreateThreadNotifyRoutine(
2655 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
2656
2657 NTKERNELAPI
2658 NTSTATUS
2659 NTAPI
2660 PsSetCreateProcessNotifyRoutine(
2661 IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
2662 IN BOOLEAN Remove);
2663
2664 NTKERNELAPI
2665 HANDLE
2666 NTAPI
2667 PsGetCurrentProcessId(
2668 VOID);
2669
2670 NTKERNELAPI
2671 HANDLE
2672 NTAPI
2673 PsGetCurrentThreadId(
2674 VOID);
2675
2676 NTKERNELAPI
2677 BOOLEAN
2678 NTAPI
2679 PsGetVersion(
2680 OUT PULONG MajorVersion OPTIONAL,
2681 OUT PULONG MinorVersion OPTIONAL,
2682 OUT PULONG BuildNumber OPTIONAL,
2683 OUT PUNICODE_STRING CSDVersion OPTIONAL);
2684
2685 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
2686
2687 #if (NTDDI_VERSION >= NTDDI_WINXP)
2688
2689 NTKERNELAPI
2690 HANDLE
2691 NTAPI
2692 PsGetProcessId(
2693 IN PEPROCESS Process);
2694
2695 NTKERNELAPI
2696 NTSTATUS
2697 NTAPI
2698 PsRemoveCreateThreadNotifyRoutine(
2699 IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
2700
2701 NTKERNELAPI
2702 NTSTATUS
2703 NTAPI
2704 PsRemoveLoadImageNotifyRoutine(
2705 IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
2706
2707 #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
2708
2709 extern NTKERNELAPI PEPROCESS PsInitialSystemProcess;
2710
2711 /* RTL Types */
2712
2713 typedef struct _RTL_SPLAY_LINKS {
2714 struct _RTL_SPLAY_LINKS *Parent;
2715 struct _RTL_SPLAY_LINKS *LeftChild;
2716 struct _RTL_SPLAY_LINKS *RightChild;
2717 } RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS;
2718
2719 /* RTL Functions */
2720
2721 #if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_)
2722
2723 #define RtlGetCallersAddress(CallersAddress, CallersCaller) \
2724 *CallersAddress = (PVOID)_ReturnAddress(); \
2725 *CallersCaller = NULL;
2726 #else
2727
2728 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2729 NTSYSAPI
2730 VOID
2731 NTAPI
2732 RtlGetCallersAddress(
2733 OUT PVOID *CallersAddress,
2734 OUT PVOID *CallersCaller);
2735 #endif
2736
2737 #endif
2738
2739 #if !defined(MIDL_PASS)
2740
2741 FORCEINLINE
2742 LUID
2743 NTAPI_INLINE
2744 RtlConvertLongToLuid(
2745 IN LONG Val)
2746 {
2747 LUID Luid;
2748 LARGE_INTEGER Temp;
2749
2750 Temp.QuadPart = Val;
2751 Luid.LowPart = Temp.u.LowPart;
2752 Luid.HighPart = Temp.u.HighPart;
2753 return Luid;
2754 }
2755
2756 FORCEINLINE
2757 LUID
2758 NTAPI_INLINE
2759 RtlConvertUlongToLuid(
2760 IN ULONG Val)
2761 {
2762 LUID Luid;
2763
2764 Luid.LowPart = Val;
2765 Luid.HighPart = 0;
2766 return Luid;
2767 }
2768
2769 #endif
2770
2771 #if defined(_AMD64_) || defined(_IA64_)
2772 //DECLSPEC_DEPRECATED_DDK_WINXP
2773 __inline
2774 LARGE_INTEGER
2775 NTAPI_INLINE
2776 RtlLargeIntegerDivide(
2777 IN LARGE_INTEGER Dividend,
2778 IN LARGE_INTEGER Divisor,
2779 OUT PLARGE_INTEGER Remainder OPTIONAL)
2780 {
2781 LARGE_INTEGER ret;
2782 ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart;
2783 if (Remainder)
2784 Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart;
2785 return ret;
2786 }
2787
2788 #else
2789
2790 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2791 NTSYSAPI
2792 LARGE_INTEGER
2793 NTAPI
2794 RtlLargeIntegerDivide(
2795 IN LARGE_INTEGER Dividend,
2796 IN LARGE_INTEGER Divisor,
2797 OUT PLARGE_INTEGER Remainder OPTIONAL);
2798 #endif
2799
2800 #endif /* defined(_AMD64_) || defined(_IA64_) */
2801
2802 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2803
2804 NTSYSAPI
2805 BOOLEAN
2806 NTAPI
2807 RtlPrefixUnicodeString(
2808 IN PCUNICODE_STRING String1,
2809 IN PCUNICODE_STRING String2,
2810 IN BOOLEAN CaseInSensitive);
2811
2812 NTSYSAPI
2813 VOID
2814 NTAPI
2815 RtlUpperString(
2816 IN OUT PSTRING DestinationString,
2817 IN const PSTRING SourceString);
2818
2819 NTSYSAPI
2820 NTSTATUS
2821 NTAPI
2822 RtlUpcaseUnicodeString(
2823 IN OUT PUNICODE_STRING DestinationString,
2824 IN PCUNICODE_STRING SourceString,
2825 IN BOOLEAN AllocateDestinationString);
2826
2827 NTSYSAPI
2828 VOID
2829 NTAPI
2830 RtlMapGenericMask(
2831 IN OUT PACCESS_MASK AccessMask,
2832 IN PGENERIC_MAPPING GenericMapping);
2833
2834 NTSYSAPI
2835 NTSTATUS
2836 NTAPI
2837 RtlVolumeDeviceToDosName(
2838 IN PVOID VolumeDeviceObject,
2839 OUT PUNICODE_STRING DosName);
2840
2841 NTSYSAPI
2842 NTSTATUS
2843 NTAPI
2844 RtlGetVersion(
2845 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
2846
2847 NTSYSAPI
2848 NTSTATUS
2849 NTAPI
2850 RtlVerifyVersionInfo(
2851 IN PRTL_OSVERSIONINFOEXW VersionInfo,
2852 IN ULONG TypeMask,
2853 IN ULONGLONG ConditionMask);
2854
2855 NTSYSAPI
2856 LONG
2857 NTAPI
2858 RtlCompareString(
2859 IN const PSTRING String1,
2860 IN const PSTRING String2,
2861 BOOLEAN CaseInSensitive);
2862
2863 NTSYSAPI
2864 VOID
2865 NTAPI
2866 RtlCopyString(
2867 OUT PSTRING DestinationString,
2868 IN const PSTRING SourceString OPTIONAL);
2869
2870 NTSYSAPI
2871 BOOLEAN
2872 NTAPI
2873 RtlEqualString(
2874 IN const PSTRING String1,
2875 IN const PSTRING String2,
2876 IN BOOLEAN CaseInSensitive);
2877
2878 NTSYSAPI
2879 NTSTATUS
2880 NTAPI
2881 RtlCharToInteger(
2882 IN PCSZ String,
2883 IN ULONG Base OPTIONAL,
2884 OUT PULONG Value);
2885
2886 NTSYSAPI
2887 CHAR
2888 NTAPI
2889 RtlUpperChar(
2890 IN CHAR Character);
2891
2892 NTSYSAPI
2893 ULONG
2894 NTAPI
2895 RtlWalkFrameChain(
2896 OUT PVOID *Callers,
2897 IN ULONG Count,
2898 IN ULONG Flags);
2899
2900 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
2901
2902 /* Security reference monitor routines */
2903
2904 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2905 NTKERNELAPI
2906 BOOLEAN
2907 NTAPI
2908 SeSinglePrivilegeCheck(
2909 IN LUID PrivilegeValue,
2910 IN KPROCESSOR_MODE PreviousMode);
2911 #endif
2912
2913 /* ZwXxx Functions */
2914
2915 #if (NTDDI_VERSION >= NTDDI_WIN2K)
2916
2917 NTSTATUS
2918 NTAPI
2919 ZwCancelTimer(
2920 IN HANDLE TimerHandle,
2921 OUT PBOOLEAN CurrentState OPTIONAL);
2922
2923 NTSTATUS
2924 NTAPI
2925 ZwCreateTimer(
2926 OUT PHANDLE TimerHandle,
2927 IN ACCESS_MASK DesiredAccess,
2928 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
2929 IN TIMER_TYPE TimerType);
2930
2931 NTSTATUS
2932 NTAPI
2933 ZwOpenTimer(
2934 OUT PHANDLE TimerHandle,
2935 IN ACCESS_MASK DesiredAccess,
2936 IN POBJECT_ATTRIBUTES ObjectAttributes);
2937
2938 NTSYSAPI
2939 NTSTATUS
2940 NTAPI
2941 ZwSetInformationThread(
2942 IN HANDLE ThreadHandle,
2943 IN THREADINFOCLASS ThreadInformationClass,
2944 IN PVOID ThreadInformation,
2945 IN ULONG ThreadInformationLength);
2946
2947 NTSTATUS
2948 NTAPI
2949 ZwSetTimer(
2950 IN HANDLE TimerHandle,
2951 IN PLARGE_INTEGER DueTime,
2952 IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
2953 IN PVOID TimerContext OPTIONAL,
2954 IN BOOLEAN ResumeTimer,
2955 IN LONG Period OPTIONAL,
2956 OUT PBOOLEAN PreviousState OPTIONAL);
2957
2958 #endif
2959
2960 typedef struct _QUOTA_LIMITS {
2961 SIZE_T PagedPoolLimit;
2962 SIZE_T NonPagedPoolLimit;
2963 SIZE_T MinimumWorkingSetSize;
2964 SIZE_T MaximumWorkingSetSize;
2965 SIZE_T PagefileLimit;
2966 LARGE_INTEGER TimeLimit;
2967 } QUOTA_LIMITS, *PQUOTA_LIMITS;
2968
2969 struct _RTL_GENERIC_COMPARE_ROUTINE;
2970 struct _RTL_GENERIC_ALLOCATE_ROUTINE;
2971 struct _RTL_GENERIC_FREE_ROUTINE;
2972
2973 typedef struct _RTL_GENERIC_TABLE {
2974 PRTL_SPLAY_LINKS TableRoot;
2975 LIST_ENTRY InsertOrderList;
2976 PLIST_ENTRY OrderedPointer;
2977 ULONG WhichOrderedElement;
2978 ULONG NumberGenericTableElements;
2979 struct _RTL_GENERIC_COMPARE_ROUTINE *CompareRoutine;
2980 struct _RTL_GENERIC_ALLOCATE_ROUTINE *AllocateRoutine;
2981 struct _RTL_GENERIC_FREE_ROUTINE *FreeRoutine;
2982 PVOID TableContext;
2983 } RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE;
2984
2985 typedef enum _TABLE_SEARCH_RESULT {
2986 TableEmptyTree,
2987 TableFoundNode,
2988 TableInsertAsLeft,
2989 TableInsertAsRight
2990 } TABLE_SEARCH_RESULT;
2991
2992 typedef struct _FILE_FS_SIZE_INFORMATION {
2993 LARGE_INTEGER TotalAllocationUnits;
2994 LARGE_INTEGER AvailableAllocationUnits;
2995 ULONG SectorsPerAllocationUnit;
2996 ULONG BytesPerSector;
2997 } FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
2998
2999 #define IO_CHECK_CREATE_PARAMETERS 0x0200
3000 #define IO_ATTACH_DEVICE 0x0400
3001 #define IO_IGNORE_SHARE_ACCESS_CHECK 0x0800
3002
3003 typedef struct _FILE_FS_VOLUME_INFORMATION {
3004 LARGE_INTEGER VolumeCreationTime;
3005 ULONG VolumeSerialNumber;
3006 ULONG VolumeLabelLength;
3007 BOOLEAN SupportsObjects;
3008 WCHAR VolumeLabel[1];
3009 } FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
3010
3011 typedef struct _FILE_FS_FULL_SIZE_INFORMATION {
3012 LARGE_INTEGER TotalAllocationUnits;
3013 LARGE_INTEGER CallerAvailableAllocationUnits;
3014 LARGE_INTEGER ActualAvailableAllocationUnits;
3015 ULONG SectorsPerAllocationUnit;
3016 ULONG BytesPerSector;
3017 } FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION;
3018
3019 typedef struct _FILE_FS_OBJECTID_INFORMATION {
3020 UCHAR ObjectId[16];
3021 UCHAR ExtendedInfo[48];
3022 } FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION;
3023
3024 typedef struct _FILE_FS_LABEL_INFORMATION {
3025 ULONG VolumeLabelLength;
3026 WCHAR VolumeLabel[1];
3027 } FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION;
3028
3029 typedef enum _RTL_GENERIC_COMPARE_RESULTS {
3030 GenericLessThan,
3031 GenericGreaterThan,
3032 GenericEqual
3033 } RTL_GENERIC_COMPARE_RESULTS;
3034
3035 // Forwarder
3036 struct _RTL_AVL_TABLE;
3037
3038 typedef RTL_GENERIC_COMPARE_RESULTS
3039 (NTAPI *PRTL_AVL_COMPARE_ROUTINE) (
3040 IN struct _RTL_AVL_TABLE *Table,
3041 IN PVOID FirstStruct,
3042 IN PVOID SecondStruct);
3043
3044 typedef PVOID
3045 (NTAPI *PRTL_AVL_ALLOCATE_ROUTINE) (
3046 IN struct _RTL_AVL_TABLE *Table,
3047 IN CLONG ByteSize);
3048
3049 typedef VOID
3050 (NTAPI *PRTL_AVL_FREE_ROUTINE) (
3051 IN struct _RTL_AVL_TABLE *Table,
3052 IN PVOID Buffer);
3053
3054 typedef NTSTATUS
3055 (NTAPI *PRTL_AVL_MATCH_FUNCTION) (
3056 IN struct _RTL_AVL_TABLE *Table,
3057 IN PVOID UserData,
3058 IN PVOID MatchData);
3059
3060 typedef struct _RTL_BALANCED_LINKS {
3061 struct _RTL_BALANCED_LINKS *Parent;
3062 struct _RTL_BALANCED_LINKS *LeftChild;
3063 struct _RTL_BALANCED_LINKS *RightChild;
3064 CHAR Balance;
3065 UCHAR Reserved[3];
3066 } RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS;
3067
3068 typedef struct _RTL_AVL_TABLE {
3069 RTL_BALANCED_LINKS BalancedRoot;
3070 PVOID OrderedPointer;
3071 ULONG WhichOrderedElement;
3072 ULONG NumberGenericTableElements;
3073 ULONG DepthOfTree;
3074 PRTL_BALANCED_LINKS RestartKey;
3075 ULONG DeleteCount;
3076 PRTL_AVL_COMPARE_ROUTINE CompareRoutine;
3077 PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine;
3078 PRTL_AVL_FREE_ROUTINE FreeRoutine;
3079 PVOID TableContext;
3080 } RTL_AVL_TABLE, *PRTL_AVL_TABLE;
3081
3082 #ifndef RTL_USE_AVL_TABLES
3083
3084 struct _RTL_GENERIC_TABLE;
3085
3086 typedef RTL_GENERIC_COMPARE_RESULTS
3087 (NTAPI *PRTL_GENERIC_COMPARE_ROUTINE) (
3088 IN struct _RTL_GENERIC_TABLE *Table,
3089 IN PVOID FirstStruct,
3090 IN PVOID SecondStruct);
3091
3092 typedef PVOID
3093 (NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) (
3094 IN struct _RTL_GENERIC_TABLE *Table,
3095 IN CLONG ByteSize);
3096
3097 typedef VOID
3098 (NTAPI *PRTL_GENERIC_FREE_ROUTINE) (
3099 IN struct _RTL_GENERIC_TABLE *Table,
3100 IN PVOID Buffer);
3101
3102 #endif /* !RTL_USE_AVL_TABLES */
3103
3104 NTSYSAPI
3105 VOID
3106 NTAPI
3107 RtlInitializeGenericTableAvl(
3108 OUT PRTL_AVL_TABLE Table,
3109 IN PRTL_AVL_COMPARE_ROUTINE CompareRoutine,
3110 IN PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine,
3111 IN PRTL_AVL_FREE_ROUTINE FreeRoutine,
3112 IN PVOID TableContext OPTIONAL);
3113
3114 #ifdef __cplusplus
3115 }
3116 #endif
3117
3118
3119 #endif /* _NTDDK_ */