4 * Windows Device Driver Kit
6 * This file is part of the w32api package.
9 * Created by Casper S. Hornstrup <chorns@users.sourceforge.net>
11 * THIS SOFTWARE IS NOT COPYRIGHTED
13 * This source code is offered for use in the public domain. You may
14 * use, modify or distribute it freely.
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.
22 * DBG - Debugging enabled/disabled (0/1)
23 * POOL_TAGGING - Enable pool tagging
24 * _X86_ - X86 environment
30 #if !defined(_NTHAL_) && !defined(_NTIFS_)
31 #define _NTDDK_INCLUDED_
38 #define _CTYPE_DISABLE_MACROS
50 #include <stdarg.h> // FIXME
51 #include <basetyps.h> // FIXME
63 typedef struct _BUS_HANDLER
*PBUS_HANDLER
;
65 #define KERNEL_STACK_SIZE 12288
66 #define KERNEL_LARGE_STACK_SIZE 61440
67 #define KERNEL_LARGE_STACK_COMMIT 12288
71 #define SIZE_OF_80387_REGISTERS 80
73 typedef struct _FLOATING_SAVE_AREA
{
81 UCHAR RegisterArea
[SIZE_OF_80387_REGISTERS
];
83 } FLOATING_SAVE_AREA
, *PFLOATING_SAVE_AREA
;
86 typedef struct _CONTEXT
{
94 FLOATING_SAVE_AREA FloatSave
;
111 UCHAR ExtendedRegisters
[MAXIMUM_SUPPORTED_EXTENSION
];
119 #if !defined(RC_INVOKED)
121 #define CONTEXT_AMD64 0x100000
123 #define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
124 #define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
125 #define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
126 #define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
127 #define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
129 #define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
130 #define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
132 #define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L)
134 #define CONTEXT_EXCEPTION_ACTIVE 0x8000000
135 #define CONTEXT_SERVICE_ACTIVE 0x10000000
136 #define CONTEXT_EXCEPTION_REQUEST 0x40000000
137 #define CONTEXT_EXCEPTION_REPORTING 0x80000000
139 #endif /* RC_INVOKED */
143 typedef enum _INTERLOCKED_RESULT
{
144 ResultNegative
= RESULT_NEGATIVE
,
145 ResultZero
= RESULT_ZERO
,
146 ResultPositive
= RESULT_POSITIVE
147 } INTERLOCKED_RESULT
;
149 typedef struct _OSVERSIONINFOA
{
150 ULONG dwOSVersionInfoSize
;
151 ULONG dwMajorVersion
;
152 ULONG dwMinorVersion
;
155 CHAR szCSDVersion
[128];
156 } OSVERSIONINFOA
, *POSVERSIONINFOA
, *LPOSVERSIONINFOA
;
158 typedef struct _OSVERSIONINFOW
{
159 ULONG dwOSVersionInfoSize
;
160 ULONG dwMajorVersion
;
161 ULONG dwMinorVersion
;
164 WCHAR szCSDVersion
[128];
165 } OSVERSIONINFOW
, *POSVERSIONINFOW
, *LPOSVERSIONINFOW
, RTL_OSVERSIONINFOW
, *PRTL_OSVERSIONINFOW
;
167 typedef struct _OSVERSIONINFOEXA
{
168 ULONG dwOSVersionInfoSize
;
169 ULONG dwMajorVersion
;
170 ULONG dwMinorVersion
;
173 CHAR szCSDVersion
[128];
174 USHORT wServicePackMajor
;
175 USHORT wServicePackMinor
;
179 } OSVERSIONINFOEXA
, *POSVERSIONINFOEXA
, *LPOSVERSIONINFOEXA
;
181 typedef struct _OSVERSIONINFOEXW
{
182 ULONG dwOSVersionInfoSize
;
183 ULONG dwMajorVersion
;
184 ULONG dwMinorVersion
;
187 WCHAR szCSDVersion
[128];
188 USHORT wServicePackMajor
;
189 USHORT wServicePackMinor
;
193 } OSVERSIONINFOEXW
, *POSVERSIONINFOEXW
, *LPOSVERSIONINFOEXW
, RTL_OSVERSIONINFOEXW
, *PRTL_OSVERSIONINFOEXW
;
196 typedef OSVERSIONINFOEXW OSVERSIONINFOEX
;
197 typedef POSVERSIONINFOEXW POSVERSIONINFOEX
;
198 typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX
;
199 typedef OSVERSIONINFOW OSVERSIONINFO
;
200 typedef POSVERSIONINFOW POSVERSIONINFO
;
201 typedef LPOSVERSIONINFOW LPOSVERSIONINFO
;
203 typedef OSVERSIONINFOEXA OSVERSIONINFOEX
;
204 typedef POSVERSIONINFOEXA POSVERSIONINFOEX
;
205 typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX
;
206 typedef OSVERSIONINFOA OSVERSIONINFO
;
207 typedef POSVERSIONINFOA POSVERSIONINFO
;
208 typedef LPOSVERSIONINFOA LPOSVERSIONINFO
;
211 typedef struct _RTL_SPLAY_LINKS
{
212 struct _RTL_SPLAY_LINKS
*Parent
;
213 struct _RTL_SPLAY_LINKS
*LeftChild
;
214 struct _RTL_SPLAY_LINKS
*RightChild
;
215 } RTL_SPLAY_LINKS
, *PRTL_SPLAY_LINKS
;
217 #if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_)
219 #define RtlGetCallersAddress(CallersAddress, CallersCaller) \
220 *CallersAddress = (PVOID)_ReturnAddress(); \
221 *CallersCaller = NULL;
224 #if (NTDDI_VERSION >= NTDDI_WIN2K)
228 RtlGetCallersAddress(
229 OUT PVOID
*CallersAddress
,
230 OUT PVOID
*CallersCaller
);
235 #if !defined(MIDL_PASS)
240 RtlConvertLongToLuid(
247 Luid
.LowPart
= Temp
.u
.LowPart
;
248 Luid
.HighPart
= Temp
.u
.HighPart
;
255 RtlConvertUlongToLuid(
267 #if (NTDDI_VERSION >= NTDDI_WIN2K)
272 RtlPrefixUnicodeString(
273 IN PCUNICODE_STRING String1
,
274 IN PCUNICODE_STRING String2
,
275 IN BOOLEAN CaseInSensitive
);
281 IN OUT PSTRING DestinationString
,
282 IN
const PSTRING SourceString
);
287 RtlUpcaseUnicodeString(
288 IN OUT PUNICODE_STRING DestinationString
,
289 IN PCUNICODE_STRING SourceString
,
290 IN BOOLEAN AllocateDestinationString
);
296 IN OUT PACCESS_MASK AccessMask
,
297 IN PGENERIC_MAPPING GenericMapping
);
302 RtlVolumeDeviceToDosName(
303 IN PVOID VolumeDeviceObject
,
304 OUT PUNICODE_STRING DosName
);
310 IN OUT PRTL_OSVERSIONINFOW lpVersionInformation
);
315 RtlVerifyVersionInfo(
316 IN PRTL_OSVERSIONINFOEXW VersionInfo
,
318 IN ULONGLONG ConditionMask
);
324 IN
const PSTRING String1
,
325 IN
const PSTRING String2
,
326 BOOLEAN CaseInSensitive
);
332 OUT PSTRING DestinationString
,
333 IN
const PSTRING SourceString OPTIONAL
);
339 IN
const PSTRING String1
,
340 IN
const PSTRING String2
,
341 IN BOOLEAN CaseInSensitive
);
345 /* Executive Types */
347 #define PROTECTED_POOL 0x80000000
349 typedef struct _ZONE_SEGMENT_HEADER
{
350 SINGLE_LIST_ENTRY SegmentList
;
352 } ZONE_SEGMENT_HEADER
, *PZONE_SEGMENT_HEADER
;
354 typedef struct _ZONE_HEADER
{
355 SINGLE_LIST_ENTRY FreeList
;
356 SINGLE_LIST_ENTRY SegmentList
;
358 ULONG TotalSegmentSize
;
359 } ZONE_HEADER
, *PZONE_HEADER
;
361 /* Executive Functions */
366 * IN PZONE_HEADER Zone)
368 #define ExIsFullZone(Zone) \
369 ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
372 * ExIsObjectInFirstZoneSegment(
373 * IN PZONE_HEADER Zone,
376 #define ExIsObjectInFirstZoneSegment(Zone,Object) \
377 ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
378 ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
379 (Zone)->TotalSegmentSize)) )
381 #define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
382 #define ExAcquireResourceShared ExAcquireResourceSharedLite
383 #define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
384 #define ExDeleteResource ExDeleteResourceLite
385 #define ExInitializeResource ExInitializeResourceLite
386 #define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
387 #define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
388 #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
389 #define ExReleaseResourceForThread ExReleaseResourceForThreadLite
391 #if (NTDDI_VERSION >= NTDDI_WIN2K)
397 IN OUT PZONE_HEADER Zone
,
398 IN OUT PVOID Segment
,
399 IN ULONG SegmentSize
);
405 OUT PZONE_HEADER Zone
,
407 IN OUT PVOID InitialSegment
,
408 IN ULONG InitialSegmentSize
);
413 ExInterlockedExtendZone(
414 IN OUT PZONE_HEADER Zone
,
415 IN OUT PVOID Segment
,
416 IN ULONG SegmentSize
,
417 IN OUT PKSPIN_LOCK Lock
);
429 typedef enum _CONFIGURATION_TYPE
{
432 FloatingPointProcessor
,
442 MultiFunctionAdapter
,
456 FloppyDiskPeripheral
,
469 RealModeIrqRoutingTable
,
470 RealModePCIEnumeration
,
472 } CONFIGURATION_TYPE
, *PCONFIGURATION_TYPE
;
473 #endif /* !_ARC_DDK_ */
475 typedef struct _CONTROLLER_OBJECT
{
478 PVOID ControllerExtension
;
479 KDEVICE_QUEUE DeviceWaitQueue
;
481 LARGE_INTEGER Spare2
;
482 } CONTROLLER_OBJECT
, *PCONTROLLER_OBJECT
;
484 typedef struct _CONFIGURATION_INFORMATION
{
492 BOOLEAN AtDiskPrimaryAddressClaimed
;
493 BOOLEAN AtDiskSecondaryAddressClaimed
;
495 ULONG MediumChangerCount
;
496 } CONFIGURATION_INFORMATION
, *PCONFIGURATION_INFORMATION
;
500 (DDKAPI
*PIO_QUERY_DEVICE_ROUTINE
)(
502 IN PUNICODE_STRING PathName
,
503 IN INTERFACE_TYPE BusType
,
505 IN PKEY_VALUE_FULL_INFORMATION
*BusInformation
,
506 IN CONFIGURATION_TYPE ControllerType
,
507 IN ULONG ControllerNumber
,
508 IN PKEY_VALUE_FULL_INFORMATION
*ControllerInformation
,
509 IN CONFIGURATION_TYPE PeripheralType
,
510 IN ULONG PeripheralNumber
,
511 IN PKEY_VALUE_FULL_INFORMATION
*PeripheralInformation
);
515 (DDKAPI DRIVER_REINITIALIZE
)(
516 IN
struct _DRIVER_OBJECT
*DriverObject
,
520 typedef DRIVER_REINITIALIZE
*PDRIVER_REINITIALIZE
;
522 /* I/O Manager Functions */
524 #if (NTDDI_VERSION >= NTDDI_WIN2K)
526 #if !(defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_))
530 IoAllocateAdapterChannel(
531 IN PADAPTER_OBJECT AdapterObject
,
532 IN PDEVICE_OBJECT DeviceObject
,
533 IN ULONG NumberOfMapRegisters
,
534 IN PDRIVER_CONTROL ExecutionRoutine
,
538 //DECLSPEC_DEPRECATED_DDK
543 IN PADAPTER_OBJECT AdapterObject
,
545 IN PVOID MapRegisterBase
,
547 IN OUT PULONG Length
,
548 IN BOOLEAN WriteToDevice
);
553 IoAllocateController(
554 IN PCONTROLLER_OBJECT ControllerObject
,
555 IN PDEVICE_OBJECT DeviceObject
,
556 IN PDRIVER_CONTROL ExecutionRoutine
,
557 IN PVOID Context OPTIONAL
);
569 IN PCONTROLLER_OBJECT ControllerObject
);
575 IN PCONTROLLER_OBJECT ControllerObject
);
578 PCONFIGURATION_INFORMATION
580 IoGetConfigurationInformation(
593 IN PDEVICE_OBJECT DeviceObject
,
594 IN PFILE_OBJECT FileObject
);
599 IoGetFileObjectGenericMapping(
612 IoQueryDeviceDescription(
613 IN PINTERFACE_TYPE BusType OPTIONAL
,
614 IN PULONG BusNumber OPTIONAL
,
615 IN PCONFIGURATION_TYPE ControllerType OPTIONAL
,
616 IN PULONG ControllerNumber OPTIONAL
,
617 IN PCONFIGURATION_TYPE PeripheralType OPTIONAL
,
618 IN PULONG PeripheralNumber OPTIONAL
,
619 IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine
,
620 IN OUT PVOID Context OPTIONAL
);
627 IN PVPB Vpb OPTIONAL
,
628 IN PDEVICE_OBJECT RealDeviceObject
);
633 IoRaiseInformationalHardError(
634 IN NTSTATUS ErrorStatus
,
635 IN PUNICODE_STRING String OPTIONAL
,
636 IN PKTHREAD Thread OPTIONAL
);
641 IoRegisterBootDriverReinitialization(
642 IN PDRIVER_OBJECT DriverObject
,
643 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine
,
644 IN PVOID Context OPTIONAL
);
649 IoRegisterDriverReinitialization(
650 IN PDRIVER_OBJECT DriverObject
,
651 IN PDRIVER_REINITIALIZE DriverReinitializationRoutine
,
652 IN PVOID Context OPTIONAL
);
657 IoAttachDeviceByPointer(
658 IN PDEVICE_OBJECT SourceDevice
,
659 IN PDEVICE_OBJECT TargetDevice
);
661 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
664 /* Memory Manager Types */
666 typedef struct _PHYSICAL_MEMORY_RANGE
{
667 PHYSICAL_ADDRESS BaseAddress
;
668 LARGE_INTEGER NumberOfBytes
;
669 } PHYSICAL_MEMORY_RANGE
, *PPHYSICAL_MEMORY_RANGE
;
671 /* Memory Manager Functions */
673 #if (NTDDI_VERSION >= NTDDI_WIN2K)
676 PPHYSICAL_MEMORY_RANGE
678 MmGetPhysicalMemoryRanges(
684 MmGetPhysicalAddress(
685 IN PVOID BaseAddress
);
687 #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
689 /* Windows Device Driver Kit */