diff --git a/reactos/include/ddk/ntddk.h b/reactos/include/ddk/ntddk.h index 62c1f7873f1..88aa183ea45 100644 --- a/reactos/include/ddk/ntddk.h +++ b/reactos/include/ddk/ntddk.h @@ -1,12 +1,13 @@ /* * ntddk.h * - * Windows Device Driver Kit + * Windows NT Device Driver Kit * - * This file is part of the w32api package. + * This file is part of the ReactOS DDK package. * * Contributors: - * Created by Casper S. Hornstrup + * Amine Khaldi + * Timo Kreuzer (timo.kreuzer@reactos.org) * * THIS SOFTWARE IS NOT COPYRIGHTED * @@ -18,13 +19,10 @@ * DISCLAIMED. This includes but is not limited to warranties of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * - * DEFINES: - * DBG - Debugging enabled/disabled (0/1) - * POOL_TAGGING - Enable pool tagging - * _X86_ - X86 environment */ -#ifndef _NTDDK_ +#pragma once + #define _NTDDK_ #if !defined(_NTHAL_) && !defined(_NTIFS_) @@ -41,6 +39,7 @@ #include #include #include +#include /* FIXME #include @@ -55,41 +54,128 @@ extern "C" { #endif +/* GUID and UUID */ +#ifndef _NTLSA_IFS_ +#ifndef _NTLSA_AUDIT_ +#define _NTLSA_AUDIT_ + +#ifndef GUID_DEFINED +#include +#endif + +#endif /* _NTLSA_AUDIT_ */ +#endif /* _NTLSA_IFS_ */ + +typedef GUID UUID; + struct _LOADER_PARAMETER_BLOCK; struct _CREATE_DISK; struct _DRIVE_LAYOUT_INFORMATION_EX; struct _SET_PARTITION_INFORMATION_EX; -// -// GUID and UUID -// -#ifndef GUID_DEFINED -#include -#endif -typedef GUID UUID; - typedef struct _BUS_HANDLER *PBUS_HANDLER; - +typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT; +#if defined(_NTHAL_INCLUDED_) +typedef struct _KAFFINITY_EX *PKAFFINITY_EX; +#endif typedef struct _PEB *PPEB; -#define EXCEPTION_READ_FAULT 0 -#define EXCEPTION_WRITE_FAULT 1 -#define EXCEPTION_EXECUTE_FAULT 8 +#ifndef _NTIMAGE_ -#if (NTDDI_VERSION >= NTDDI_VISTA) -extern NTSYSAPI volatile CCHAR KeNumberProcessors; -#elif (NTDDI_VERSION >= NTDDI_WINXP) -extern NTSYSAPI CCHAR KeNumberProcessors; +typedef struct _IMAGE_NT_HEADERS *PIMAGE_NT_HEADERS32; +typedef struct _IMAGE_NT_HEADERS64 *PIMAGE_NT_HEADERS64; + +#ifdef _WIN64 +typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS; #else -extern PCCHAR KeNumberProcessors; +typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS; #endif -#define MAX_WOW64_SHARED_ENTRIES 16 +#endif /* _NTIMAGE_ */ -#define NX_SUPPORT_POLICY_ALWAYSOFF 0 -#define NX_SUPPORT_POLICY_ALWAYSON 1 -#define NX_SUPPORT_POLICY_OPTIN 2 -#define NX_SUPPORT_POLICY_OPTOUT 3 +/****************************************************************************** + * Executive Types * + ******************************************************************************/ + +typedef struct _ZONE_SEGMENT_HEADER { + SINGLE_LIST_ENTRY SegmentList; + PVOID Reserved; +} ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER; + +typedef struct _ZONE_HEADER { + SINGLE_LIST_ENTRY FreeList; + SINGLE_LIST_ENTRY SegmentList; + ULONG BlockSize; + ULONG TotalSegmentSize; +} ZONE_HEADER, *PZONE_HEADER; + +#define PROTECTED_POOL 0x80000000 + + +/****************************************************************************** + * I/O Manager Types * + ******************************************************************************/ + +/* DEVICE_OBJECT.Flags */ +#define DO_DEVICE_HAS_NAME 0x00000040 +#define DO_SYSTEM_BOOT_PARTITION 0x00000100 +#define DO_LONG_TERM_REQUESTS 0x00000200 +#define DO_NEVER_LAST_DEVICE 0x00000400 +#define DO_LOW_PRIORITY_FILESYSTEM 0x00010000 +#define DO_SUPPORTS_TRANSACTIONS 0x00040000 +#define DO_FORCE_NEITHER_IO 0x00080000 +#define DO_VOLUME_DEVICE_OBJECT 0x00100000 +#define DO_SYSTEM_SYSTEM_PARTITION 0x00200000 +#define DO_SYSTEM_CRITICAL_PARTITION 0x00400000 +#define DO_DISALLOW_EXECUTE 0x00800000 + +#ifndef _ARC_DDK_ +#define _ARC_DDK_ +typedef enum _CONFIGURATION_TYPE { + ArcSystem, + CentralProcessor, + FloatingPointProcessor, + PrimaryIcache, + PrimaryDcache, + SecondaryIcache, + SecondaryDcache, + SecondaryCache, + EisaAdapter, + TcAdapter, + ScsiAdapter, + DtiAdapter, + MultiFunctionAdapter, + DiskController, + TapeController, + CdromController, + WormController, + SerialController, + NetworkController, + DisplayController, + ParallelController, + PointerController, + KeyboardController, + AudioController, + OtherController, + DiskPeripheral, + FloppyDiskPeripheral, + TapePeripheral, + ModemPeripheral, + MonitorPeripheral, + PrinterPeripheral, + PointerPeripheral, + KeyboardPeripheral, + TerminalPeripheral, + OtherPeripheral, + LinePeripheral, + NetworkPeripheral, + SystemMemory, + DockingInformation, + RealModeIrqRoutingTable, + RealModePCIEnumeration, + MaximumType +} CONFIGURATION_TYPE, *PCONFIGURATION_TYPE; +#endif /* !_ARC_DDK_ */ /* ** IRP function codes @@ -124,102 +210,118 @@ extern PCCHAR KeNumberProcessors; #define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18 -typedef struct _IO_COUNTERS { - ULONGLONG ReadOperationCount; - ULONGLONG WriteOperationCount; - ULONGLONG OtherOperationCount; - ULONGLONG ReadTransferCount; - ULONGLONG WriteTransferCount; - ULONGLONG OtherTransferCount; -} IO_COUNTERS, *PIO_COUNTERS; +#define IO_CHECK_CREATE_PARAMETERS 0x0200 +#define IO_ATTACH_DEVICE 0x0400 +#define IO_IGNORE_SHARE_ACCESS_CHECK 0x0800 -typedef struct _VM_COUNTERS { - SIZE_T PeakVirtualSize; - SIZE_T VirtualSize; - ULONG PageFaultCount; - SIZE_T PeakWorkingSetSize; - SIZE_T WorkingSetSize; - SIZE_T QuotaPeakPagedPoolUsage; - SIZE_T QuotaPagedPoolUsage; - SIZE_T QuotaPeakNonPagedPoolUsage; - SIZE_T QuotaNonPagedPoolUsage; - SIZE_T PagefileUsage; - SIZE_T PeakPagefileUsage; -} VM_COUNTERS, *PVM_COUNTERS; +typedef +NTSTATUS +(NTAPI *PIO_QUERY_DEVICE_ROUTINE)( + IN PVOID Context, + IN PUNICODE_STRING PathName, + IN INTERFACE_TYPE BusType, + IN ULONG BusNumber, + IN PKEY_VALUE_FULL_INFORMATION *BusInformation, + IN CONFIGURATION_TYPE ControllerType, + IN ULONG ControllerNumber, + IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation, + IN CONFIGURATION_TYPE PeripheralType, + IN ULONG PeripheralNumber, + IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation); -typedef struct _VM_COUNTERS_EX -{ - SIZE_T PeakVirtualSize; - SIZE_T VirtualSize; - ULONG PageFaultCount; - SIZE_T PeakWorkingSetSize; - SIZE_T WorkingSetSize; - SIZE_T QuotaPeakPagedPoolUsage; - SIZE_T QuotaPagedPoolUsage; - SIZE_T QuotaPeakNonPagedPoolUsage; - SIZE_T QuotaNonPagedPoolUsage; - SIZE_T PagefileUsage; - SIZE_T PeakPagefileUsage; - SIZE_T PrivateUsage; -} VM_COUNTERS_EX, *PVM_COUNTERS_EX; +typedef enum _IO_QUERY_DEVICE_DATA_FORMAT { + IoQueryDeviceIdentifier = 0, + IoQueryDeviceConfigurationData, + IoQueryDeviceComponentInformation, + IoQueryDeviceMaxData +} IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT; -typedef struct _POOLED_USAGE_AND_LIMITS -{ - SIZE_T PeakPagedPoolUsage; - SIZE_T PagedPoolUsage; - SIZE_T PagedPoolLimit; - SIZE_T PeakNonPagedPoolUsage; - SIZE_T NonPagedPoolUsage; - SIZE_T NonPagedPoolLimit; - SIZE_T PeakPagefileUsage; - SIZE_T PagefileUsage; - SIZE_T PagefileLimit; -} POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS; +typedef VOID +(NTAPI *PDRIVER_REINITIALIZE)( + IN struct _DRIVER_OBJECT *DriverObject, + IN PVOID Context OPTIONAL, + IN ULONG Count); -/* DEVICE_OBJECT.Flags */ - -#define DO_VERIFY_VOLUME 0x00000002 -#define DO_BUFFERED_IO 0x00000004 -#define DO_EXCLUSIVE 0x00000008 -#define DO_DIRECT_IO 0x00000010 -#define DO_MAP_IO_BUFFER 0x00000020 -#define DO_DEVICE_HAS_NAME 0x00000040 -#define DO_DEVICE_INITIALIZING 0x00000080 -#define DO_SYSTEM_BOOT_PARTITION 0x00000100 -#define DO_LONG_TERM_REQUESTS 0x00000200 -#define DO_NEVER_LAST_DEVICE 0x00000400 -#define DO_SHUTDOWN_REGISTERED 0x00000800 -#define DO_BUS_ENUMERATED_DEVICE 0x00001000 -#define DO_POWER_PAGABLE 0x00002000 -#define DO_POWER_INRUSH 0x00004000 -#define DO_LOW_PRIORITY_FILESYSTEM 0x00010000 -#define DO_SUPPORTS_TRANSACTIONS 0x00040000 -#define DO_FORCE_NEITHER_IO 0x00080000 -#define DO_VOLUME_DEVICE_OBJECT 0x00100000 -#define DO_SYSTEM_SYSTEM_PARTITION 0x00200000 -#define DO_SYSTEM_CRITICAL_PARTITION 0x00400000 -#define DO_DISALLOW_EXECUTE 0x00800000 +typedef struct _CONTROLLER_OBJECT { + CSHORT Type; + CSHORT Size; + PVOID ControllerExtension; + KDEVICE_QUEUE DeviceWaitQueue; + ULONG Spare1; + LARGE_INTEGER Spare2; +} CONTROLLER_OBJECT, *PCONTROLLER_OBJECT; #define DRVO_REINIT_REGISTERED 0x00000008 #define DRVO_INITIALIZED 0x00000010 #define DRVO_BOOTREINIT_REGISTERED 0x00000020 #define DRVO_LEGACY_RESOURCES 0x00000040 -typedef enum _ARBITER_REQUEST_SOURCE { - ArbiterRequestUndefined = -1, - ArbiterRequestLegacyReported, - ArbiterRequestHalReported, - ArbiterRequestLegacyAssigned, - ArbiterRequestPnpDetected, - ArbiterRequestPnpEnumerated -} ARBITER_REQUEST_SOURCE; +typedef struct _CONFIGURATION_INFORMATION { + ULONG DiskCount; + ULONG FloppyCount; + ULONG CdRomCount; + ULONG TapeCount; + ULONG ScsiPortCount; + ULONG SerialCount; + ULONG ParallelCount; + BOOLEAN AtDiskPrimaryAddressClaimed; + BOOLEAN AtDiskSecondaryAddressClaimed; + ULONG Version; + ULONG MediumChangerCount; +} CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION; -typedef enum _ARBITER_RESULT { - ArbiterResultUndefined = -1, - ArbiterResultSuccess, - ArbiterResultExternalConflict, - ArbiterResultNullRequest -} ARBITER_RESULT; +typedef struct _DISK_SIGNATURE { + ULONG PartitionStyle; + _ANONYMOUS_UNION union { + struct { + ULONG Signature; + ULONG CheckSum; + } Mbr; + struct { + GUID DiskId; + } Gpt; + } DUMMYUNIONNAME; +} DISK_SIGNATURE, *PDISK_SIGNATURE; + +typedef struct _TXN_PARAMETER_BLOCK { + USHORT Length; + USHORT TxFsContext; + PVOID TransactionObject; +} TXN_PARAMETER_BLOCK, *PTXN_PARAMETER_BLOCK; + +#define TXF_MINIVERSION_DEFAULT_VIEW (0xFFFE) + +typedef struct _IO_DRIVER_CREATE_CONTEXT { + CSHORT Size; + struct _ECP_LIST *ExtraCreateParameter; + PVOID DeviceObjectHint; + PTXN_PARAMETER_BLOCK TxnParameters; +} IO_DRIVER_CREATE_CONTEXT, *PIO_DRIVER_CREATE_CONTEXT; + +typedef struct _AGP_TARGET_BUS_INTERFACE_STANDARD { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PGET_SET_DEVICE_DATA SetBusData; + PGET_SET_DEVICE_DATA GetBusData; + UCHAR CapabilityID; +} AGP_TARGET_BUS_INTERFACE_STANDARD, *PAGP_TARGET_BUS_INTERFACE_STANDARD; + +typedef NTSTATUS +(NTAPI *PGET_LOCATION_STRING)( + IN OUT PVOID Context OPTIONAL, + OUT PWCHAR *LocationStrings); + +typedef struct _PNP_LOCATION_INTERFACE { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PGET_LOCATION_STRING GetLocationString; +} PNP_LOCATION_INTERFACE, *PPNP_LOCATION_INTERFACE; typedef enum _ARBITER_ACTION { ArbiterActionTestAllocation, @@ -240,39 +342,69 @@ typedef struct _ARBITER_CONFLICT_INFO { ULONGLONG End; } ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO; -typedef struct _ARBITER_PARAMETERS { - union { - struct { +typedef struct _ARBITER_TEST_ALLOCATION_PARAMETERS { IN OUT PLIST_ENTRY ArbitrationList; IN ULONG AllocateFromCount; IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom; - } TestAllocation; - struct { +} ARBITER_TEST_ALLOCATION_PARAMETERS, *PARBITER_TEST_ALLOCATION_PARAMETERS; + +typedef struct _ARBITER_RETEST_ALLOCATION_PARAMETERS { IN OUT PLIST_ENTRY ArbitrationList; IN ULONG AllocateFromCount; IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom; - } RetestAllocation; - struct { +} ARBITER_RETEST_ALLOCATION_PARAMETERS, *PARBITER_RETEST_ALLOCATION_PARAMETERS; + +typedef struct _ARBITER_BOOT_ALLOCATION_PARAMETERS { IN OUT PLIST_ENTRY ArbitrationList; - } BootAllocation; - struct { +} ARBITER_BOOT_ALLOCATION_PARAMETERS, *PARBITER_BOOT_ALLOCATION_PARAMETERS; + +typedef struct _ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS { OUT PCM_PARTIAL_RESOURCE_LIST *AllocatedResources; - } QueryAllocatedResources; - struct { +} ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS, *PARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS; + +typedef struct _ARBITER_QUERY_CONFLICT_PARAMETERS { IN PDEVICE_OBJECT PhysicalDeviceObject; IN PIO_RESOURCE_DESCRIPTOR ConflictingResource; OUT PULONG ConflictCount; OUT PARBITER_CONFLICT_INFO *Conflicts; - } QueryConflict; - struct { +} ARBITER_QUERY_CONFLICT_PARAMETERS, *PARBITER_QUERY_CONFLICT_PARAMETERS; + +typedef struct _ARBITER_QUERY_ARBITRATE_PARAMETERS { IN PLIST_ENTRY ArbitrationList; - } QueryArbitrate; - struct { +} ARBITER_QUERY_ARBITRATE_PARAMETERS, *PARBITER_QUERY_ARBITRATE_PARAMETERS; + +typedef struct _ARBITER_ADD_RESERVED_PARAMETERS { IN PDEVICE_OBJECT ReserveDevice; - } AddReserved; +} ARBITER_ADD_RESERVED_PARAMETERS, *PARBITER_ADD_RESERVED_PARAMETERS; + +typedef struct _ARBITER_PARAMETERS { + union { + ARBITER_TEST_ALLOCATION_PARAMETERS TestAllocation; + ARBITER_RETEST_ALLOCATION_PARAMETERS RetestAllocation; + ARBITER_BOOT_ALLOCATION_PARAMETERS BootAllocation; + ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS QueryAllocatedResources; + ARBITER_QUERY_CONFLICT_PARAMETERS QueryConflict; + ARBITER_QUERY_ARBITRATE_PARAMETERS QueryArbitrate; + ARBITER_ADD_RESERVED_PARAMETERS AddReserved; } Parameters; } ARBITER_PARAMETERS, *PARBITER_PARAMETERS; +typedef enum _ARBITER_REQUEST_SOURCE { + ArbiterRequestUndefined = -1, + ArbiterRequestLegacyReported, + ArbiterRequestHalReported, + ArbiterRequestLegacyAssigned, + ArbiterRequestPnpDetected, + ArbiterRequestPnpEnumerated +} ARBITER_REQUEST_SOURCE; + +typedef enum _ARBITER_RESULT { + ArbiterResultUndefined = -1, + ArbiterResultSuccess, + ArbiterResultExternalConflict, + ArbiterResultNullRequest +} ARBITER_RESULT; + #define ARBITER_FLAG_BOOT_CONFIG 0x00000001 typedef struct _ARBITER_LIST_ENTRY { @@ -309,6 +441,826 @@ typedef struct _ARBITER_INTERFACE { ULONG Flags; } ARBITER_INTERFACE, *PARBITER_INTERFACE; +typedef enum _RESOURCE_TRANSLATION_DIRECTION { + TranslateChildToParent, + TranslateParentToChild +} RESOURCE_TRANSLATION_DIRECTION; + +typedef NTSTATUS +(NTAPI *PTRANSLATE_RESOURCE_HANDLER)( + IN OUT PVOID Context OPTIONAL, + IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source, + IN RESOURCE_TRANSLATION_DIRECTION Direction, + IN ULONG AlternativesCount OPTIONAL, + IN IO_RESOURCE_DESCRIPTOR Alternatives[], + IN PDEVICE_OBJECT PhysicalDeviceObject, + OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target); + +typedef NTSTATUS +(NTAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)( + IN OUT PVOID Context OPTIONAL, + IN PIO_RESOURCE_DESCRIPTOR Source, + IN PDEVICE_OBJECT PhysicalDeviceObject, + OUT PULONG TargetCount, + OUT PIO_RESOURCE_DESCRIPTOR *Target); + +typedef struct _TRANSLATOR_INTERFACE { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PTRANSLATE_RESOURCE_HANDLER TranslateResources; + PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements; +} TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE; + +typedef struct _PCI_AGP_CAPABILITY { + PCI_CAPABILITIES_HEADER Header; + USHORT Minor:4; + USHORT Major:4; + USHORT Rsvd1:8; + struct _PCI_AGP_STATUS { + ULONG Rate:3; + ULONG Agp3Mode:1; + ULONG FastWrite:1; + ULONG FourGB:1; + ULONG HostTransDisable:1; + ULONG Gart64:1; + ULONG ITA_Coherent:1; + ULONG SideBandAddressing:1; + ULONG CalibrationCycle:3; + ULONG AsyncRequestSize:3; + ULONG Rsvd1:1; + ULONG Isoch:1; + ULONG Rsvd2:6; + ULONG RequestQueueDepthMaximum:8; + } AGPStatus; + struct _PCI_AGP_COMMAND { + ULONG Rate:3; + ULONG Rsvd1:1; + ULONG FastWriteEnable:1; + ULONG FourGBEnable:1; + ULONG Rsvd2:1; + ULONG Gart64:1; + ULONG AGPEnable:1; + ULONG SBAEnable:1; + ULONG CalibrationCycle:3; + ULONG AsyncReqSize:3; + ULONG Rsvd3:8; + ULONG RequestQueueDepth:8; + } AGPCommand; +} PCI_AGP_CAPABILITY, *PPCI_AGP_CAPABILITY; + +typedef enum _EXTENDED_AGP_REGISTER { + IsochStatus, + AgpControl, + ApertureSize, + AperturePageSize, + GartLow, + GartHigh, + IsochCommand +} EXTENDED_AGP_REGISTER, *PEXTENDED_AGP_REGISTER; + +typedef struct _PCI_AGP_ISOCH_STATUS { + ULONG ErrorCode:2; + ULONG Rsvd1:1; + ULONG Isoch_L:3; + ULONG Isoch_Y:2; + ULONG Isoch_N:8; + ULONG Rsvd2:16; +} PCI_AGP_ISOCH_STATUS, *PPCI_AGP_ISOCH_STATUS; + +typedef struct _PCI_AGP_CONTROL { + ULONG Rsvd1:7; + ULONG GTLB_Enable:1; + ULONG AP_Enable:1; + ULONG CAL_Disable:1; + ULONG Rsvd2:22; +} PCI_AGP_CONTROL, *PPCI_AGP_CONTROL; + +typedef struct _PCI_AGP_APERTURE_PAGE_SIZE { + USHORT PageSizeMask:11; + USHORT Rsvd1:1; + USHORT PageSizeSelect:4; +} PCI_AGP_APERTURE_PAGE_SIZE, *PPCI_AGP_APERTURE_PAGE_SIZE; + +typedef struct _PCI_AGP_ISOCH_COMMAND { + USHORT Rsvd1:6; + USHORT Isoch_Y:2; + USHORT Isoch_N:8; +} PCI_AGP_ISOCH_COMMAND, *PPCI_AGP_ISOCH_COMMAND; + +typedef struct PCI_AGP_EXTENDED_CAPABILITY { + PCI_AGP_ISOCH_STATUS IsochStatus; + PCI_AGP_CONTROL AgpControl; + USHORT ApertureSize; + PCI_AGP_APERTURE_PAGE_SIZE AperturePageSize; + ULONG GartLow; + ULONG GartHigh; + PCI_AGP_ISOCH_COMMAND IsochCommand; +} PCI_AGP_EXTENDED_CAPABILITY, *PPCI_AGP_EXTENDED_CAPABILITY; + +#define PCI_AGP_RATE_1X 0x1 +#define PCI_AGP_RATE_2X 0x2 +#define PCI_AGP_RATE_4X 0x4 + +#define PCIX_MODE_CONVENTIONAL_PCI 0x0 +#define PCIX_MODE1_66MHZ 0x1 +#define PCIX_MODE1_100MHZ 0x2 +#define PCIX_MODE1_133MHZ 0x3 +#define PCIX_MODE2_266_66MHZ 0x9 +#define PCIX_MODE2_266_100MHZ 0xA +#define PCIX_MODE2_266_133MHZ 0xB +#define PCIX_MODE2_533_66MHZ 0xD +#define PCIX_MODE2_533_100MHZ 0xE +#define PCIX_MODE2_533_133MHZ 0xF + +#define PCIX_VERSION_MODE1_ONLY 0x0 +#define PCIX_VERSION_MODE2_ECC 0x1 +#define PCIX_VERSION_DUAL_MODE_ECC 0x2 + +typedef struct _PCIX_BRIDGE_CAPABILITY { + PCI_CAPABILITIES_HEADER Header; + union { + struct { + USHORT Bus64Bit:1; + USHORT Bus133MHzCapable:1; + USHORT SplitCompletionDiscarded:1; + USHORT UnexpectedSplitCompletion:1; + USHORT SplitCompletionOverrun:1; + USHORT SplitRequestDelayed:1; + USHORT BusModeFrequency:4; + USHORT Rsvd:2; + USHORT Version:2; + USHORT Bus266MHzCapable:1; + USHORT Bus533MHzCapable:1; + } DUMMYSTRUCTNAME; + USHORT AsUSHORT; + } SecondaryStatus; + union { + struct { + ULONG FunctionNumber:3; + ULONG DeviceNumber:5; + ULONG BusNumber:8; + ULONG Device64Bit:1; + ULONG Device133MHzCapable:1; + ULONG SplitCompletionDiscarded:1; + ULONG UnexpectedSplitCompletion:1; + ULONG SplitCompletionOverrun:1; + ULONG SplitRequestDelayed:1; + ULONG Rsvd:7; + ULONG DIMCapable:1; + ULONG Device266MHzCapable:1; + ULONG Device533MHzCapable:1; + } DUMMYSTRUCTNAME; + ULONG AsULONG; + } BridgeStatus; + USHORT UpstreamSplitTransactionCapacity; + USHORT UpstreamSplitTransactionLimit; + USHORT DownstreamSplitTransactionCapacity; + USHORT DownstreamSplitTransactionLimit; + union { + struct { + ULONG SelectSecondaryRegisters:1; + ULONG ErrorPresentInOtherBank:1; + ULONG AdditionalCorrectableError:1; + ULONG AdditionalUncorrectableError:1; + ULONG ErrorPhase:3; + ULONG ErrorCorrected:1; + ULONG Syndrome:8; + ULONG ErrorFirstCommand:4; + ULONG ErrorSecondCommand:4; + ULONG ErrorUpperAttributes:4; + ULONG ControlUpdateEnable:1; + ULONG Rsvd:1; + ULONG DisableSingleBitCorrection:1; + ULONG EccMode:1; + } DUMMYSTRUCTNAME; + ULONG AsULONG; + } EccControlStatus; + ULONG EccFirstAddress; + ULONG EccSecondAddress; + ULONG EccAttribute; +} PCIX_BRIDGE_CAPABILITY, *PPCIX_BRIDGE_CAPABILITY; + +typedef struct _PCI_SUBSYSTEM_IDS_CAPABILITY { + PCI_CAPABILITIES_HEADER Header; + USHORT Reserved; + USHORT SubVendorID; + USHORT SubSystemID; +} PCI_SUBSYSTEM_IDS_CAPABILITY, *PPCI_SUBSYSTEM_IDS_CAPABILITY; + +#define OSC_FIRMWARE_FAILURE 0x02 +#define OSC_UNRECOGNIZED_UUID 0x04 +#define OSC_UNRECOGNIZED_REVISION 0x08 +#define OSC_CAPABILITIES_MASKED 0x10 + +#define PCI_ROOT_BUS_OSC_METHOD_CAPABILITY_REVISION 0x01 + +typedef struct _PCI_ROOT_BUS_OSC_SUPPORT_FIELD { + union { + struct { + ULONG ExtendedConfigOpRegions:1; + ULONG ActiveStatePowerManagement:1; + ULONG ClockPowerManagement:1; + ULONG SegmentGroups:1; + ULONG MessageSignaledInterrupts:1; + ULONG WindowsHardwareErrorArchitecture:1; + ULONG Reserved:26; + } DUMMYSTRUCTNAME; + ULONG AsULONG; + } u; +} PCI_ROOT_BUS_OSC_SUPPORT_FIELD, *PPCI_ROOT_BUS_OSC_SUPPORT_FIELD; + +typedef struct _PCI_ROOT_BUS_OSC_CONTROL_FIELD { + union { + struct { + ULONG ExpressNativeHotPlug:1; + ULONG ShpcNativeHotPlug:1; + ULONG ExpressNativePME:1; + ULONG ExpressAdvancedErrorReporting:1; + ULONG ExpressCapabilityStructure:1; + ULONG Reserved:27; + } DUMMYSTRUCTNAME; + ULONG AsULONG; + } u; +} PCI_ROOT_BUS_OSC_CONTROL_FIELD, *PPCI_ROOT_BUS_OSC_CONTROL_FIELD; + +typedef enum _PCI_HARDWARE_INTERFACE { + PciConventional, + PciXMode1, + PciXMode2, + PciExpress +} PCI_HARDWARE_INTERFACE, *PPCI_HARDWARE_INTERFACE; + +typedef enum { + BusWidth32Bits, + BusWidth64Bits +} PCI_BUS_WIDTH; + +typedef struct _PCI_ROOT_BUS_HARDWARE_CAPABILITY { + PCI_HARDWARE_INTERFACE SecondaryInterface; + struct { + BOOLEAN BusCapabilitiesFound; + ULONG CurrentSpeedAndMode; + ULONG SupportedSpeedsAndModes; + BOOLEAN DeviceIDMessagingCapable; + PCI_BUS_WIDTH SecondaryBusWidth; + } DUMMYSTRUCTNAME; + PCI_ROOT_BUS_OSC_SUPPORT_FIELD OscFeatureSupport; + PCI_ROOT_BUS_OSC_CONTROL_FIELD OscControlRequest; + PCI_ROOT_BUS_OSC_CONTROL_FIELD OscControlGranted; +} PCI_ROOT_BUS_HARDWARE_CAPABILITY, *PPCI_ROOT_BUS_HARDWARE_CAPABILITY; + +typedef union _PCI_EXPRESS_CAPABILITIES_REGISTER { + struct { + USHORT CapabilityVersion:4; + USHORT DeviceType:4; + USHORT SlotImplemented:1; + USHORT InterruptMessageNumber:5; + USHORT Rsvd:2; + } DUMMYSTRUCTNAME; + USHORT AsUSHORT; +} PCI_EXPRESS_CAPABILITIES_REGISTER, *PPCI_EXPRESS_CAPABILITIES_REGISTER; + +typedef union _PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER { + struct { + ULONG MaxPayloadSizeSupported:3; + ULONG PhantomFunctionsSupported:2; + ULONG ExtendedTagSupported:1; + ULONG L0sAcceptableLatency:3; + ULONG L1AcceptableLatency:3; + ULONG Undefined:3; + ULONG RoleBasedErrorReporting:1; + ULONG Rsvd1:2; + ULONG CapturedSlotPowerLimit:8; + ULONG CapturedSlotPowerLimitScale:2; + ULONG Rsvd2:4; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER, *PPCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER; + +#define PCI_EXPRESS_AER_DEVICE_CONTROL_MASK 0x07; + +typedef union _PCI_EXPRESS_DEVICE_CONTROL_REGISTER { + struct { + USHORT CorrectableErrorEnable:1; + USHORT NonFatalErrorEnable:1; + USHORT FatalErrorEnable:1; + USHORT UnsupportedRequestErrorEnable:1; + USHORT EnableRelaxedOrder:1; + USHORT MaxPayloadSize:3; + USHORT ExtendedTagEnable:1; + USHORT PhantomFunctionsEnable:1; + USHORT AuxPowerEnable:1; + USHORT NoSnoopEnable:1; + USHORT MaxReadRequestSize:3; + USHORT BridgeConfigRetryEnable:1; + } DUMMYSTRUCTNAME; + USHORT AsUSHORT; +} PCI_EXPRESS_DEVICE_CONTROL_REGISTER, *PPCI_EXPRESS_DEVICE_CONTROL_REGISTER; + +#define PCI_EXPRESS_AER_DEVICE_STATUS_MASK 0x0F; + +typedef union _PCI_EXPRESS_DEVICE_STATUS_REGISTER { + struct { + USHORT CorrectableErrorDetected:1; + USHORT NonFatalErrorDetected:1; + USHORT FatalErrorDetected:1; + USHORT UnsupportedRequestDetected:1; + USHORT AuxPowerDetected:1; + USHORT TransactionsPending:1; + USHORT Rsvd:10; + } DUMMYSTRUCTNAME; + USHORT AsUSHORT; +} PCI_EXPRESS_DEVICE_STATUS_REGISTER, *PPCI_EXPRESS_DEVICE_STATUS_REGISTER; + +typedef union _PCI_EXPRESS_LINK_CAPABILITIES_REGISTER { + struct { + ULONG MaximumLinkSpeed:4; + ULONG MaximumLinkWidth:6; + ULONG ActiveStatePMSupport:2; + ULONG L0sExitLatency:3; + ULONG L1ExitLatency:3; + ULONG ClockPowerManagement:1; + ULONG SurpriseDownErrorReportingCapable:1; + ULONG DataLinkLayerActiveReportingCapable:1; + ULONG Rsvd:3; + ULONG PortNumber:8; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_LINK_CAPABILITIES_REGISTER, *PPCI_EXPRESS_LINK_CAPABILITIES_REGISTER; + +typedef union _PCI_EXPRESS_LINK_CONTROL_REGISTER { + struct { + USHORT ActiveStatePMControl:2; + USHORT Rsvd1:1; + USHORT ReadCompletionBoundary:1; + USHORT LinkDisable:1; + USHORT RetrainLink:1; + USHORT CommonClockConfig:1; + USHORT ExtendedSynch:1; + USHORT EnableClockPowerManagement:1; + USHORT Rsvd2:7; + } DUMMYSTRUCTNAME; + USHORT AsUSHORT; +} PCI_EXPRESS_LINK_CONTROL_REGISTER, *PPCI_EXPRESS_LINK_CONTROL_REGISTER; + +typedef union _PCI_EXPRESS_LINK_STATUS_REGISTER { + struct { + USHORT LinkSpeed:4; + USHORT LinkWidth:6; + USHORT Undefined:1; + USHORT LinkTraining:1; + USHORT SlotClockConfig:1; + USHORT DataLinkLayerActive:1; + USHORT Rsvd:2; + } DUMMYSTRUCTNAME; + USHORT AsUSHORT; +} PCI_EXPRESS_LINK_STATUS_REGISTER, *PPCI_EXPRESS_LINK_STATUS_REGISTER; + +typedef union _PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER { + struct { + ULONG AttentionButtonPresent:1; + ULONG PowerControllerPresent:1; + ULONG MRLSensorPresent:1; + ULONG AttentionIndicatorPresent:1; + ULONG PowerIndicatorPresent:1; + ULONG HotPlugSurprise:1; + ULONG HotPlugCapable:1; + ULONG SlotPowerLimit:8; + ULONG SlotPowerLimitScale:2; + ULONG ElectromechanicalLockPresent:1; + ULONG NoCommandCompletedSupport:1; + ULONG PhysicalSlotNumber:13; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER, *PPCI_EXPRESS_SLOT_CAPABILITIES_REGISTER; + +typedef union _PCI_EXPRESS_SLOT_CONTROL_REGISTER { + struct { + USHORT AttentionButtonEnable:1; + USHORT PowerFaultDetectEnable:1; + USHORT MRLSensorEnable:1; + USHORT PresenceDetectEnable:1; + USHORT CommandCompletedEnable:1; + USHORT HotPlugInterruptEnable:1; + USHORT AttentionIndicatorControl:2; + USHORT PowerIndicatorControl:2; + USHORT PowerControllerControl:1; + USHORT ElectromechanicalLockControl:1; + USHORT DataLinkStateChangeEnable:1; + USHORT Rsvd:3; + } DUMMYSTRUCTNAME; + USHORT AsUSHORT; +} PCI_EXPRESS_SLOT_CONTROL_REGISTER, *PPCI_EXPRESS_SLOT_CONTROL_REGISTER; + +typedef union _PCI_EXPRESS_SLOT_STATUS_REGISTER { + struct { + USHORT AttentionButtonPressed:1; + USHORT PowerFaultDetected:1; + USHORT MRLSensorChanged:1; + USHORT PresenceDetectChanged:1; + USHORT CommandCompleted:1; + USHORT MRLSensorState:1; + USHORT PresenceDetectState:1; + USHORT ElectromechanicalLockEngaged:1; + USHORT DataLinkStateChanged:1; + USHORT Rsvd:7; + } DUMMYSTRUCTNAME; + USHORT AsUSHORT; +} PCI_EXPRESS_SLOT_STATUS_REGISTER, *PPCI_EXPRESS_SLOT_STATUS_REGISTER; + +typedef union _PCI_EXPRESS_ROOT_CONTROL_REGISTER { + struct { + USHORT CorrectableSerrEnable:1; + USHORT NonFatalSerrEnable:1; + USHORT FatalSerrEnable:1; + USHORT PMEInterruptEnable:1; + USHORT CRSSoftwareVisibilityEnable:1; + USHORT Rsvd:11; + } DUMMYSTRUCTNAME; + USHORT AsUSHORT; +} PCI_EXPRESS_ROOT_CONTROL_REGISTER, *PPCI_EXPRESS_ROOT_CONTROL_REGISTER; + +typedef union _PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER { + struct { + USHORT CRSSoftwareVisibility:1; + USHORT Rsvd:15; + } DUMMYSTRUCTNAME; + USHORT AsUSHORT; +} PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER, *PPCI_EXPRESS_ROOT_CAPABILITIES_REGISTER; + +typedef union _PCI_EXPRESS_ROOT_STATUS_REGISTER { + struct { + ULONG PMERequestorId:16; + ULONG PMEStatus:1; + ULONG PMEPending:1; + ULONG Rsvd:14; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_ROOT_STATUS_REGISTER, *PPCI_EXPRESS_ROOT_STATUS_REGISTER; + +typedef struct _PCI_EXPRESS_CAPABILITY { + PCI_CAPABILITIES_HEADER Header; + PCI_EXPRESS_CAPABILITIES_REGISTER ExpressCapabilities; + PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER DeviceCapabilities; + PCI_EXPRESS_DEVICE_CONTROL_REGISTER DeviceControl; + PCI_EXPRESS_DEVICE_STATUS_REGISTER DeviceStatus; + PCI_EXPRESS_LINK_CAPABILITIES_REGISTER LinkCapabilities; + PCI_EXPRESS_LINK_CONTROL_REGISTER LinkControl; + PCI_EXPRESS_LINK_STATUS_REGISTER LinkStatus; + PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER SlotCapabilities; + PCI_EXPRESS_SLOT_CONTROL_REGISTER SlotControl; + PCI_EXPRESS_SLOT_STATUS_REGISTER SlotStatus; + PCI_EXPRESS_ROOT_CONTROL_REGISTER RootControl; + PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER RootCapabilities; + PCI_EXPRESS_ROOT_STATUS_REGISTER RootStatus; +} PCI_EXPRESS_CAPABILITY, *PPCI_EXPRESS_CAPABILITY; + +typedef enum { + MRLClosed = 0, + MRLOpen +} PCI_EXPRESS_MRL_STATE; + +typedef enum { + SlotEmpty = 0, + CardPresent +} PCI_EXPRESS_CARD_PRESENCE; + +typedef enum { + IndicatorOn = 1, + IndicatorBlink, + IndicatorOff +} PCI_EXPRESS_INDICATOR_STATE; + +typedef enum { + PowerOn = 0, + PowerOff +} PCI_EXPRESS_POWER_STATE; + +typedef enum { + L0sEntrySupport = 1, + L0sAndL1EntrySupport = 3 +} PCI_EXPRESS_ASPM_SUPPORT; + +typedef enum { + L0sAndL1EntryDisabled, + L0sEntryEnabled, + L1EntryEnabled, + L0sAndL1EntryEnabled +} PCI_EXPRESS_ASPM_CONTROL; + +typedef enum { + L0s_Below64ns = 0, + L0s_64ns_128ns, + L0s_128ns_256ns, + L0s_256ns_512ns, + L0s_512ns_1us, + L0s_1us_2us, + L0s_2us_4us, + L0s_Above4us +} PCI_EXPRESS_L0s_EXIT_LATENCY; + +typedef enum { + L1_Below1us = 0, + L1_1us_2us, + L1_2us_4us, + L1_4us_8us, + L1_8us_16us, + L1_16us_32us, + L1_32us_64us, + L1_Above64us +} PCI_EXPRESS_L1_EXIT_LATENCY; + +typedef enum { + PciExpressEndpoint = 0, + PciExpressLegacyEndpoint, + PciExpressRootPort = 4, + PciExpressUpstreamSwitchPort, + PciExpressDownstreamSwitchPort, + PciExpressToPciXBridge, + PciXToExpressBridge, + PciExpressRootComplexIntegratedEndpoint, + PciExpressRootComplexEventCollector +} PCI_EXPRESS_DEVICE_TYPE; + +typedef enum { + MaxPayload128Bytes = 0, + MaxPayload256Bytes, + MaxPayload512Bytes, + MaxPayload1024Bytes, + MaxPayload2048Bytes, + MaxPayload4096Bytes +} PCI_EXPRESS_MAX_PAYLOAD_SIZE; + +typedef union _PCI_EXPRESS_PME_REQUESTOR_ID { + struct { + USHORT FunctionNumber:3; + USHORT DeviceNumber:5; + USHORT BusNumber:8; + } DUMMYSTRUCTNAME; + USHORT AsUSHORT; +} PCI_EXPRESS_PME_REQUESTOR_ID, *PPCI_EXPRESS_PME_REQUESTOR_ID; + +#if defined(_WIN64) + +#ifndef USE_DMA_MACROS +#define USE_DMA_MACROS +#endif + +#ifndef NO_LEGACY_DRIVERS +#define NO_LEGACY_DRIVERS +#endif + +#endif /* defined(_WIN64) */ + +typedef enum _PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE { + ResourceTypeSingle = 0, + ResourceTypeRange, + ResourceTypeExtendedCounterConfiguration, + ResourceTypeOverflow, + ResourceTypeMax +} PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE; + +typedef struct _PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR { + PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE Type; + ULONG Flags; + union { + ULONG CounterIndex; + ULONG ExtendedRegisterAddress; + struct { + ULONG Begin; + ULONG End; + } Range; + } u; +} PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR, *PPHYSICAL_COUNTER_RESOURCE_DESCRIPTOR; + +typedef struct _PHYSICAL_COUNTER_RESOURCE_LIST { + ULONG Count; + PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR Descriptors[ANYSIZE_ARRAY]; +} PHYSICAL_COUNTER_RESOURCE_LIST, *PPHYSICAL_COUNTER_RESOURCE_LIST; + +typedef VOID +(NTAPI *PciPin2Line)( + IN struct _BUS_HANDLER *BusHandler, + IN struct _BUS_HANDLER *RootHandler, + IN PCI_SLOT_NUMBER SlotNumber, + IN PPCI_COMMON_CONFIG PciData); + +typedef VOID +(NTAPI *PciLine2Pin)( + IN struct _BUS_HANDLER *BusHandler, + IN struct _BUS_HANDLER *RootHandler, + IN PCI_SLOT_NUMBER SlotNumber, + IN PPCI_COMMON_CONFIG PciNewData, + IN PPCI_COMMON_CONFIG PciOldData); + +typedef VOID +(NTAPI *PciReadWriteConfig)( + IN struct _BUS_HANDLER *BusHandler, + IN PCI_SLOT_NUMBER Slot, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +#define PCI_DATA_TAG ' ICP' +#define PCI_DATA_VERSION 1 + +typedef struct _PCIBUSDATA { + ULONG Tag; + ULONG Version; + PciReadWriteConfig ReadConfig; + PciReadWriteConfig WriteConfig; + PciPin2Line Pin2Line; + PciLine2Pin Line2Pin; + PCI_SLOT_NUMBER ParentSlot; + PVOID Reserved[4]; +} PCIBUSDATA, *PPCIBUSDATA; + +#ifndef _PCIINTRF_X_ +#define _PCIINTRF_X_ + +typedef ULONG +(NTAPI *PCI_READ_WRITE_CONFIG)( + IN PVOID Context, + IN ULONG BusOffset, + IN ULONG Slot, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +typedef VOID +(NTAPI *PCI_PIN_TO_LINE)( + IN PVOID Context, + IN PPCI_COMMON_CONFIG PciData); + +typedef VOID +(NTAPI *PCI_LINE_TO_PIN)( + IN PVOID Context, + IN PPCI_COMMON_CONFIG PciNewData, + IN PPCI_COMMON_CONFIG PciOldData); + +typedef VOID +(NTAPI *PCI_ROOT_BUS_CAPABILITY)( + IN PVOID Context, + OUT PPCI_ROOT_BUS_HARDWARE_CAPABILITY HardwareCapability); + +typedef VOID +(NTAPI *PCI_EXPRESS_WAKE_CONTROL)( + IN PVOID Context, + IN BOOLEAN EnableWake); + +typedef struct _PCI_BUS_INTERFACE_STANDARD { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PCI_READ_WRITE_CONFIG ReadConfig; + PCI_READ_WRITE_CONFIG WriteConfig; + PCI_PIN_TO_LINE PinToLine; + PCI_LINE_TO_PIN LineToPin; + PCI_ROOT_BUS_CAPABILITY RootBusCapability; + PCI_EXPRESS_WAKE_CONTROL ExpressWakeControl; +} PCI_BUS_INTERFACE_STANDARD, *PPCI_BUS_INTERFACE_STANDARD; + +#define PCI_BUS_INTERFACE_STANDARD_VERSION 1 + +#endif /* _PCIINTRF_X_ */ + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +#define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX 0x00004000 +#define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX 0x00008000 +#define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_EX \ + (FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX | \ + FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX) + +#define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_DEPRECATED 0x00000200 +#define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_DEPRECATED 0x00000300 +#define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_DEPRECATED 0x00000300 + +#else + +#define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL 0x00000200 +#define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL 0x00000300 +#define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK 0x00000300 + +#define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL +#define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL +#define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_EX FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + +#define FILE_CHARACTERISTICS_PROPAGATED ( FILE_REMOVABLE_MEDIA | \ + FILE_READ_ONLY_DEVICE | \ + FILE_FLOPPY_DISKETTE | \ + FILE_WRITE_ONCE_MEDIA | \ + FILE_DEVICE_SECURE_OPEN ) + +typedef struct _FILE_ALIGNMENT_INFORMATION { + ULONG AlignmentRequirement; +} FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION; + +typedef struct _FILE_NAME_INFORMATION { + ULONG FileNameLength; + WCHAR FileName[1]; +} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION; + + +typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION { + ULONG FileAttributes; + ULONG ReparseTag; +} FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION; + +typedef struct _FILE_DISPOSITION_INFORMATION { + BOOLEAN DeleteFile; +} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; + +typedef struct _FILE_END_OF_FILE_INFORMATION { + LARGE_INTEGER EndOfFile; +} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION; + +typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION { + LARGE_INTEGER ValidDataLength; +} FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION; + +typedef struct _FILE_FS_LABEL_INFORMATION { + ULONG VolumeLabelLength; + WCHAR VolumeLabel[1]; +} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION; + +typedef struct _FILE_FS_VOLUME_INFORMATION { + LARGE_INTEGER VolumeCreationTime; + ULONG VolumeSerialNumber; + ULONG VolumeLabelLength; + BOOLEAN SupportsObjects; + WCHAR VolumeLabel[1]; +} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION; + +typedef struct _FILE_FS_SIZE_INFORMATION { + LARGE_INTEGER TotalAllocationUnits; + LARGE_INTEGER AvailableAllocationUnits; + ULONG SectorsPerAllocationUnit; + ULONG BytesPerSector; +} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION; + +typedef struct _FILE_FS_FULL_SIZE_INFORMATION { + LARGE_INTEGER TotalAllocationUnits; + LARGE_INTEGER CallerAvailableAllocationUnits; + LARGE_INTEGER ActualAvailableAllocationUnits; + ULONG SectorsPerAllocationUnit; + ULONG BytesPerSector; +} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION; + +typedef struct _FILE_FS_OBJECTID_INFORMATION { + UCHAR ObjectId[16]; + UCHAR ExtendedInfo[48]; +} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION; + +typedef union _FILE_SEGMENT_ELEMENT { + PVOID64 Buffer; + ULONGLONG Alignment; +}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT; + +#define IOCTL_AVIO_ALLOCATE_STREAM CTL_CODE(FILE_DEVICE_AVIO, 1, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) +#define IOCTL_AVIO_FREE_STREAM CTL_CODE(FILE_DEVICE_AVIO, 2, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) +#define IOCTL_AVIO_MODIFY_STREAM CTL_CODE(FILE_DEVICE_AVIO, 3, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) + +typedef enum _BUS_DATA_TYPE { + ConfigurationSpaceUndefined = -1, + Cmos, + EisaConfiguration, + Pos, + CbusConfiguration, + PCIConfiguration, + VMEConfiguration, + NuBusConfiguration, + PCMCIAConfiguration, + MPIConfiguration, + MPSAConfiguration, + PNPISAConfiguration, + SgiInternalConfiguration, + MaximumBusDataType +} BUS_DATA_TYPE, *PBUS_DATA_TYPE; + +/* Hardware Abstraction Layer Types */ + +typedef BOOLEAN +(NTAPI *PHAL_RESET_DISPLAY_PARAMETERS)( + IN ULONG Columns, + IN ULONG Rows); + +typedef PBUS_HANDLER +(FASTCALL *pHalHandlerForBus)( + IN INTERFACE_TYPE InterfaceType, + IN ULONG BusNumber); + +typedef VOID +(FASTCALL *pHalReferenceBusHandler)( + IN PBUS_HANDLER BusHandler); + typedef enum _HAL_QUERY_INFORMATION_CLASS { HalInstalledBusInformation, HalProfileSourceInformation, @@ -355,92 +1307,18 @@ typedef enum _HAL_SET_INFORMATION_CLASS { HalProfileDpgoSourceInterruptHandler } HAL_SET_INFORMATION_CLASS, *PHAL_SET_INFORMATION_CLASS; -typedef struct _HAL_PROFILE_SOURCE_INTERVAL { - KPROFILE_SOURCE Source; - ULONG_PTR Interval; -} HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL; - -typedef struct _HAL_PROFILE_SOURCE_INFORMATION { - KPROFILE_SOURCE Source; - BOOLEAN Supported; - ULONG Interval; -} HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION; - -typedef struct _MAP_REGISTER_ENTRY { - PVOID MapRegister; - BOOLEAN WriteToDevice; -} MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY; - -typedef struct _DEBUG_DEVICE_ADDRESS { - UCHAR Type; - BOOLEAN Valid; - UCHAR Reserved[2]; - PUCHAR TranslatedAddress; - ULONG Length; -} DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS; - -typedef struct _DEBUG_MEMORY_REQUIREMENTS { - PHYSICAL_ADDRESS Start; - PHYSICAL_ADDRESS MaxEnd; - PVOID VirtualAddress; - ULONG Length; - BOOLEAN Cached; - BOOLEAN Aligned; -} DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS; - -typedef struct _DEBUG_DEVICE_DESCRIPTOR { - ULONG Bus; - ULONG Slot; - USHORT Segment; - USHORT VendorID; - USHORT DeviceID; - UCHAR BaseClass; - UCHAR SubClass; - UCHAR ProgIf; - BOOLEAN Initialized; - BOOLEAN Configured; - DEBUG_DEVICE_ADDRESS BaseAddress[6]; - DEBUG_MEMORY_REQUIREMENTS Memory; -} DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR; - -typedef struct _PM_DISPATCH_TABLE { - ULONG Signature; - ULONG Version; - PVOID Function[1]; -} PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE; - -typedef enum _RESOURCE_TRANSLATION_DIRECTION { - TranslateChildToParent, - TranslateParentToChild -} RESOURCE_TRANSLATION_DIRECTION; +typedef NTSTATUS +(NTAPI *pHalQuerySystemInformation)( + IN HAL_QUERY_INFORMATION_CLASS InformationClass, + IN ULONG BufferSize, + IN OUT PVOID Buffer, + OUT PULONG ReturnedLength); typedef NTSTATUS -(NTAPI *PTRANSLATE_RESOURCE_HANDLER)( - IN OUT PVOID Context, - IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source, - IN RESOURCE_TRANSLATION_DIRECTION Direction, - IN ULONG AlternativesCount OPTIONAL, - IN IO_RESOURCE_DESCRIPTOR Alternatives[], - IN PDEVICE_OBJECT PhysicalDeviceObject, - OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target); - -typedef NTSTATUS -(NTAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)( - IN PVOID Context OPTIONAL, - IN PIO_RESOURCE_DESCRIPTOR Source, - IN PDEVICE_OBJECT PhysicalDeviceObject, - OUT PULONG TargetCount, - OUT PIO_RESOURCE_DESCRIPTOR *Target); - -typedef struct _TRANSLATOR_INTERFACE { - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PTRANSLATE_RESOURCE_HANDLER TranslateResources; - PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements; -} TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE; +(NTAPI *pHalSetSystemInformation)( + IN HAL_SET_INFORMATION_CLASS InformationClass, + IN ULONG BufferSize, + IN PVOID Buffer); typedef VOID (FASTCALL *pHalExamineMBR)( @@ -471,28 +1349,6 @@ typedef NTSTATUS IN ULONG NumberOfHeads, IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); -typedef PBUS_HANDLER -(FASTCALL *pHalHandlerForBus)( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber); - -typedef VOID -(FASTCALL *pHalReferenceBusHandler)( - IN PBUS_HANDLER BusHandler); - -typedef NTSTATUS -(NTAPI *pHalQuerySystemInformation)( - IN HAL_QUERY_INFORMATION_CLASS InformationClass, - IN ULONG BufferSize, - IN OUT PVOID Buffer, - OUT PULONG ReturnedLength); - -typedef NTSTATUS -(NTAPI *pHalSetSystemInformation)( - IN HAL_SET_INFORMATION_CLASS InformationClass, - IN ULONG BufferSize, - IN PVOID Buffer); - typedef NTSTATUS (NTAPI *pHalQueryBusSlots)( IN PBUS_HANDLER BusHandler, @@ -504,6 +1360,12 @@ typedef NTSTATUS (NTAPI *pHalInitPnpDriver)( VOID); +typedef struct _PM_DISPATCH_TABLE { + ULONG Signature; + ULONG Version; + PVOID Function[1]; +} PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE; + typedef NTSTATUS (NTAPI *pHalInitPowerManagement)( IN PPM_DISPATCH_TABLE PmDriverDispatchTable, @@ -543,12 +1405,7 @@ typedef NTSTATUS IN PHYSICAL_ADDRESS PhysicalAddress, IN LARGE_INTEGER NumberOfBytes); -typedef VOID -(NTAPI *pHalEndOfBoot)( - VOID); - -typedef -BOOLEAN +typedef BOOLEAN (NTAPI *pHalTranslateBusAddress)( IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber, @@ -556,8 +1413,7 @@ BOOLEAN IN OUT PULONG AddressSpace, OUT PPHYSICAL_ADDRESS TranslatedAddress); -typedef -NTSTATUS +typedef NTSTATUS (NTAPI *pHalAssignSlotResources)( IN PUNICODE_STRING RegistryPath, IN PUNICODE_STRING DriverClassName OPTIONAL, @@ -568,23 +1424,24 @@ NTSTATUS IN ULONG SlotNumber, IN OUT PCM_RESOURCE_LIST *AllocatedResources); -typedef -VOID +typedef VOID (NTAPI *pHalHaltSystem)( VOID); -typedef -BOOLEAN +typedef BOOLEAN (NTAPI *pHalResetDisplay)( VOID); -typedef -UCHAR +typedef struct _MAP_REGISTER_ENTRY { + PVOID MapRegister; + BOOLEAN WriteToDevice; +} MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY; + +typedef UCHAR (NTAPI *pHalVectorToIDTEntry)( ULONG Vector); -typedef -BOOLEAN +typedef BOOLEAN (NTAPI *pHalFindBusAddressTranslation)( IN PHYSICAL_ADDRESS BusAddress, IN OUT PULONG AddressSpace, @@ -592,94 +1449,33 @@ BOOLEAN IN OUT PULONG_PTR Context, IN BOOLEAN NextBus); -typedef -NTSTATUS -(NTAPI *pKdSetupPciDeviceForDebugging)( - IN PVOID LoaderBlock OPTIONAL, - IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice); +typedef VOID +(NTAPI *pHalEndOfBoot)( + VOID); -typedef -NTSTATUS -(NTAPI *pKdReleasePciDeviceForDebugging)( - IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice); - -typedef -PVOID -(NTAPI *pKdGetAcpiTablePhase0)( - IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock, - IN ULONG Signature); - -typedef -PVOID +typedef PVOID (NTAPI *pHalGetAcpiTable)( IN ULONG Signature, IN PCSTR OemId OPTIONAL, IN PCSTR OemTableId OPTIONAL); -typedef -VOID -(NTAPI *pKdCheckPowerButton)( - VOID); +#if defined(_IA64_) +typedef NTSTATUS +(*pHalGetErrorCapList)( + IN OUT PULONG CapsListLength, + IN OUT PUCHAR ErrorCapList); -#if (NTDDI_VERSION >= NTDDI_VISTA) -typedef -PVOID -(NTAPI *pKdMapPhysicalMemory64)( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN ULONG NumberPages, - IN BOOLEAN FlushCurrentTLB); - -typedef -VOID -(NTAPI *pKdUnmapVirtualAddress)( - IN PVOID VirtualAddress, - IN ULONG NumberPages, - IN BOOLEAN FlushCurrentTLB); -#else -typedef -PVOID -(NTAPI *pKdMapPhysicalMemory64)( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN ULONG NumberPages); - -typedef -VOID -(NTAPI *pKdUnmapVirtualAddress)( - IN PVOID VirtualAddress, - IN ULONG NumberPages); +typedef NTSTATUS +(*pHalInjectError)( + IN ULONG BufferLength, + IN PUCHAR Buffer); #endif - -typedef -ULONG -(NTAPI *pKdGetPciDataByOffset)( - IN ULONG BusNumber, - IN ULONG SlotNumber, - OUT PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -typedef -ULONG -(NTAPI *pKdSetPciDataByOffset)( - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -typedef BOOLEAN -(NTAPI *PHAL_RESET_DISPLAY_PARAMETERS)( - IN ULONG Columns, - IN ULONG Rows); - -typedef -VOID +typedef VOID (NTAPI *PCI_ERROR_HANDLER_CALLBACK)( VOID); -typedef -VOID +typedef VOID (NTAPI *pHalSetPciErrorHandlerCallback)( IN PCI_ERROR_HANDLER_CALLBACK Callback); @@ -753,78 +1549,706 @@ extern NTKERNELAPI HAL_DISPATCH HalDispatchTable; #define HalMirrorPhysicalMemory HALDISPATCH->HalMirrorPhysicalMemory #define HalEndOfBoot HALDISPATCH->HalEndOfBoot #define HalMirrorVerify HALDISPATCH->HalMirrorVerify - -typedef struct _FILE_ALIGNMENT_INFORMATION { - ULONG AlignmentRequirement; -} FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION; - -typedef struct _FILE_NAME_INFORMATION { - ULONG FileNameLength; - WCHAR FileName[1]; -} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION; - - -typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION { - ULONG FileAttributes; - ULONG ReparseTag; -} FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION; - -typedef struct _FILE_DISPOSITION_INFORMATION { - BOOLEAN DeleteFile; -} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION; - -typedef struct _FILE_END_OF_FILE_INFORMATION { - LARGE_INTEGER EndOfFile; -} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION; - -typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION { - LARGE_INTEGER ValidDataLength; -} FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION; - -typedef union _FILE_SEGMENT_ELEMENT { - PVOID64 Buffer; - ULONGLONG Alignment; -}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT; - -#define SE_UNSOLICITED_INPUT_PRIVILEGE 6 - -#if (NTDDI_VERSION >= NTDDI_WIN2K) -NTSYSAPI -ULONGLONG -NTAPI -VerSetConditionMask( - IN ULONGLONG ConditionMask, - IN ULONG TypeMask, - IN UCHAR Condition); +#define HalGetCachedAcpiTable HALDISPATCH->HalGetCachedAcpiTable +#define HalSetPciErrorHandlerCallback HALDISPATCH->HalSetPciErrorHandlerCallback +#if defined(_IA64_) +#define HalGetErrorCapList HALDISPATCH->HalGetErrorCapList +#define HalInjectError HALDISPATCH->HalInjectError #endif -#define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \ - ((ConditionMask) = VerSetConditionMask((ConditionMask), \ - (TypeBitMask), (ComparisonType))) +typedef struct _HAL_BUS_INFORMATION { + INTERFACE_TYPE BusType; + BUS_DATA_TYPE ConfigurationType; + ULONG BusNumber; + ULONG Reserved; +} HAL_BUS_INFORMATION, *PHAL_BUS_INFORMATION; -/* RtlVerifyVersionInfo() TypeMask */ +typedef struct _HAL_PROFILE_SOURCE_INFORMATION { + KPROFILE_SOURCE Source; + BOOLEAN Supported; + ULONG Interval; +} HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION; -#define VER_MINORVERSION 0x0000001 -#define VER_MAJORVERSION 0x0000002 -#define VER_BUILDNUMBER 0x0000004 -#define VER_PLATFORMID 0x0000008 -#define VER_SERVICEPACKMINOR 0x0000010 -#define VER_SERVICEPACKMAJOR 0x0000020 -#define VER_SUITENAME 0x0000040 -#define VER_PRODUCT_TYPE 0x0000080 +typedef struct _HAL_PROFILE_SOURCE_INFORMATION_EX { + KPROFILE_SOURCE Source; + BOOLEAN Supported; + ULONG_PTR Interval; + ULONG_PTR DefInterval; + ULONG_PTR MaxInterval; + ULONG_PTR MinInterval; +} HAL_PROFILE_SOURCE_INFORMATION_EX, *PHAL_PROFILE_SOURCE_INFORMATION_EX; -/* RtlVerifyVersionInfo() ComparisonType */ +typedef struct _HAL_PROFILE_SOURCE_INTERVAL { + KPROFILE_SOURCE Source; + ULONG_PTR Interval; +} HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL; -#define VER_EQUAL 1 -#define VER_GREATER 2 -#define VER_GREATER_EQUAL 3 -#define VER_LESS 4 -#define VER_LESS_EQUAL 5 -#define VER_AND 6 -#define VER_OR 7 +typedef struct _HAL_PROFILE_SOURCE_LIST { + KPROFILE_SOURCE Source; + PWSTR Description; +} HAL_PROFILE_SOURCE_LIST, *PHAL_PROFILE_SOURCE_LIST; -#define VER_CONDITION_MASK 7 -#define VER_NUM_BITS_PER_CONDITION_MASK 3 +typedef enum _HAL_DISPLAY_BIOS_INFORMATION { + HalDisplayInt10Bios, + HalDisplayEmulatedBios, + HalDisplayNoBios +} HAL_DISPLAY_BIOS_INFORMATION, *PHAL_DISPLAY_BIOS_INFORMATION; + +typedef struct _HAL_POWER_INFORMATION { + ULONG TBD; +} HAL_POWER_INFORMATION, *PHAL_POWER_INFORMATION; + +typedef struct _HAL_PROCESSOR_SPEED_INFO { + ULONG ProcessorSpeed; +} HAL_PROCESSOR_SPEED_INFORMATION, *PHAL_PROCESSOR_SPEED_INFORMATION; + +typedef struct _HAL_CALLBACKS { + PCALLBACK_OBJECT SetSystemInformation; + PCALLBACK_OBJECT BusCheck; +} HAL_CALLBACKS, *PHAL_CALLBACKS; + +typedef struct _HAL_PROCESSOR_FEATURE { + ULONG UsableFeatureBits; +} HAL_PROCESSOR_FEATURE; + +typedef NTSTATUS +(NTAPI *PHALIOREADWRITEHANDLER)( + IN BOOLEAN fRead, + IN ULONG dwAddr, + IN ULONG dwSize, + IN OUT PULONG pdwData); + +typedef struct _HAL_AMLI_BAD_IO_ADDRESS_LIST { + ULONG BadAddrBegin; + ULONG BadAddrSize; + ULONG OSVersionTrigger; + PHALIOREADWRITEHANDLER IOHandler; +} HAL_AMLI_BAD_IO_ADDRESS_LIST, *PHAL_AMLI_BAD_IO_ADDRESS_LIST; + +#if defined(_X86_) || defined(_IA64_) || defined(_AMD64_) + +typedef VOID +(NTAPI *PHALMCAINTERFACELOCK)( + VOID); + +typedef VOID +(NTAPI *PHALMCAINTERFACEUNLOCK)( + VOID); + +typedef NTSTATUS +(NTAPI *PHALMCAINTERFACEREADREGISTER)( + IN UCHAR BankNumber, + IN OUT PVOID Exception); + +typedef struct _HAL_MCA_INTERFACE { + PHALMCAINTERFACELOCK Lock; + PHALMCAINTERFACEUNLOCK Unlock; + PHALMCAINTERFACEREADREGISTER ReadRegister; +} HAL_MCA_INTERFACE; + +typedef enum { + ApicDestinationModePhysical = 1, + ApicDestinationModeLogicalFlat, + ApicDestinationModeLogicalClustered, + ApicDestinationModeUnknown +} HAL_APIC_DESTINATION_MODE, *PHAL_APIC_DESTINATION_MODE; + +#if defined(_AMD64_) + +struct _KTRAP_FRAME; +struct _KEXCEPTION_FRAME; + +typedef ERROR_SEVERITY +(NTAPI *PDRIVER_EXCPTN_CALLBACK)( + IN PVOID Context, + IN struct _KTRAP_FRAME *TrapFrame, + IN struct _KEXCEPTION_FRAME *ExceptionFrame, + IN PMCA_EXCEPTION Exception); + +#endif + +#if defined(_X86_) || defined(_IA64_) +typedef +#if defined(_IA64_) +ERROR_SEVERITY +#else +VOID +#endif +(NTAPI *PDRIVER_EXCPTN_CALLBACK)( + IN PVOID Context, + IN PMCA_EXCEPTION BankLog); +#endif + +typedef PDRIVER_EXCPTN_CALLBACK PDRIVER_MCA_EXCEPTION_CALLBACK; + +typedef struct _MCA_DRIVER_INFO { + PDRIVER_MCA_EXCEPTION_CALLBACK ExceptionCallback; + PKDEFERRED_ROUTINE DpcCallback; + PVOID DeviceContext; +} MCA_DRIVER_INFO, *PMCA_DRIVER_INFO; + +typedef struct _HAL_ERROR_INFO { + ULONG Version; + ULONG InitMaxSize; + ULONG McaMaxSize; + ULONG McaPreviousEventsCount; + ULONG McaCorrectedEventsCount; + ULONG McaKernelDeliveryFails; + ULONG McaDriverDpcQueueFails; + ULONG McaReserved; + ULONG CmcMaxSize; + ULONG CmcPollingInterval; + ULONG CmcInterruptsCount; + ULONG CmcKernelDeliveryFails; + ULONG CmcDriverDpcQueueFails; + ULONG CmcGetStateFails; + ULONG CmcClearStateFails; + ULONG CmcReserved; + ULONGLONG CmcLogId; + ULONG CpeMaxSize; + ULONG CpePollingInterval; + ULONG CpeInterruptsCount; + ULONG CpeKernelDeliveryFails; + ULONG CpeDriverDpcQueueFails; + ULONG CpeGetStateFails; + ULONG CpeClearStateFails; + ULONG CpeInterruptSources; + ULONGLONG CpeLogId; + ULONGLONG KernelReserved[4]; +} HAL_ERROR_INFO, *PHAL_ERROR_INFO; + +#define HAL_MCE_INTERRUPTS_BASED ((ULONG)-1) +#define HAL_MCE_DISABLED ((ULONG)0) + +#define HAL_CMC_INTERRUPTS_BASED HAL_MCE_INTERRUPTS_BASED +#define HAL_CMC_DISABLED HAL_MCE_DISABLED + +#define HAL_CPE_INTERRUPTS_BASED HAL_MCE_INTERRUPTS_BASED +#define HAL_CPE_DISABLED HAL_MCE_DISABLED + +#define HAL_MCA_INTERRUPTS_BASED HAL_MCE_INTERRUPTS_BASED +#define HAL_MCA_DISABLED HAL_MCE_DISABLED + +typedef VOID +(NTAPI *PDRIVER_CMC_EXCEPTION_CALLBACK)( + IN PVOID Context, + IN PCMC_EXCEPTION CmcLog); + +typedef VOID +(NTAPI *PDRIVER_CPE_EXCEPTION_CALLBACK)( + IN PVOID Context, + IN PCPE_EXCEPTION CmcLog); + +typedef struct _CMC_DRIVER_INFO { + PDRIVER_CMC_EXCEPTION_CALLBACK ExceptionCallback; + PKDEFERRED_ROUTINE DpcCallback; + PVOID DeviceContext; +} CMC_DRIVER_INFO, *PCMC_DRIVER_INFO; + +typedef struct _CPE_DRIVER_INFO { + PDRIVER_CPE_EXCEPTION_CALLBACK ExceptionCallback; + PKDEFERRED_ROUTINE DpcCallback; + PVOID DeviceContext; +} CPE_DRIVER_INFO, *PCPE_DRIVER_INFO; + +#endif // defined(_X86_) || defined(_IA64_) || defined(_AMD64_) + +#if defined(_IA64_) + +typedef NTSTATUS +(*HALSENDCROSSPARTITIONIPI)( + IN USHORT ProcessorID, + IN UCHAR HardwareVector); + +typedef NTSTATUS +(*HALRESERVECROSSPARTITIONINTERRUPTVECTOR)( + OUT PULONG Vector, + OUT PKIRQL Irql, + IN OUT PGROUP_AFFINITY Affinity, + OUT PUCHAR HardwareVector); + +typedef VOID +(*HALFREECROSSPARTITIONINTERRUPTVECTOR)( + IN ULONG Vector, + IN PGROUP_AFFINITY Affinity); + +typedef struct _HAL_CROSS_PARTITION_IPI_INTERFACE { + HALSENDCROSSPARTITIONIPI HalSendCrossPartitionIpi; + HALRESERVECROSSPARTITIONINTERRUPTVECTOR HalReserveCrossPartitionInterruptVector; + HALFREECROSSPARTITIONINTERRUPTVECTOR HalFreeCrossPartitionInterruptVector; +} HAL_CROSS_PARTITION_IPI_INTERFACE; + +#define HAL_CROSS_PARTITION_IPI_INTERFACE_MINIMUM_SIZE \ + FIELD_OFFSET(HAL_CROSS_PARTITION_IPI_INTERFACE, \ + HalFreeCrossPartitionInterruptVector) + +#endif /* defined(_IA64_) */ + +typedef struct _HAL_PLATFORM_INFORMATION { + ULONG PlatformFlags; +} HAL_PLATFORM_INFORMATION, *PHAL_PLATFORM_INFORMATION; + +#define HAL_PLATFORM_DISABLE_WRITE_COMBINING 0x01L +#define HAL_PLATFORM_DISABLE_PTCG 0x04L +#define HAL_PLATFORM_DISABLE_UC_MAIN_MEMORY 0x08L +#define HAL_PLATFORM_ENABLE_WRITE_COMBINING_MMIO 0x10L +#define HAL_PLATFORM_ACPI_TABLES_CACHED 0x20L + +/****************************************************************************** + * Kernel Types * + ******************************************************************************/ + +#define NX_SUPPORT_POLICY_ALWAYSOFF 0 +#define NX_SUPPORT_POLICY_ALWAYSON 1 +#define NX_SUPPORT_POLICY_OPTIN 2 +#define NX_SUPPORT_POLICY_OPTOUT 3 + +typedef VOID +(NTAPI *PEXPAND_STACK_CALLOUT)( + IN PVOID Parameter OPTIONAL); + +typedef VOID +(NTAPI *PTIMER_APC_ROUTINE)( + IN PVOID TimerContext, + IN ULONG TimerLowValue, + IN LONG TimerHighValue); + +typedef enum _TIMER_SET_INFORMATION_CLASS { + TimerSetCoalescableTimer, + MaxTimerInfoClass +} TIMER_SET_INFORMATION_CLASS; + +#if (NTDDI_VERSION >= NTDDI_WIN7) +typedef struct _TIMER_SET_COALESCABLE_TIMER_INFO { + IN LARGE_INTEGER DueTime; + IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL; + IN PVOID TimerContext OPTIONAL; + IN struct _COUNTED_REASON_CONTEXT *WakeContext OPTIONAL; + IN ULONG Period OPTIONAL; + IN ULONG TolerableDelay; + OUT PBOOLEAN PreviousState OPTIONAL; +} TIMER_SET_COALESCABLE_TIMER_INFO, *PTIMER_SET_COALESCABLE_TIMER_INFO; +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + +#define XSTATE_LEGACY_FLOATING_POINT 0 +#define XSTATE_LEGACY_SSE 1 +#define XSTATE_GSSE 2 + +#define XSTATE_MASK_LEGACY_FLOATING_POINT (1i64 << (XSTATE_LEGACY_FLOATING_POINT)) +#define XSTATE_MASK_LEGACY_SSE (1i64 << (XSTATE_LEGACY_SSE)) +#define XSTATE_MASK_LEGACY (XSTATE_MASK_LEGACY_FLOATING_POINT | XSTATE_MASK_LEGACY_SSE) +#define XSTATE_MASK_GSSE (1i64 << (XSTATE_GSSE)) + +#define MAXIMUM_XSTATE_FEATURES 64 + +typedef struct _XSTATE_FEATURE { + ULONG Offset; + ULONG Size; +} XSTATE_FEATURE, *PXSTATE_FEATURE; + +typedef struct _XSTATE_CONFIGURATION { + ULONG64 EnabledFeatures; + ULONG Size; + ULONG OptimizedSave:1; + XSTATE_FEATURE Features[MAXIMUM_XSTATE_FEATURES]; +} XSTATE_CONFIGURATION, *PXSTATE_CONFIGURATION; + +#define MAX_WOW64_SHARED_ENTRIES 16 + +typedef struct _KUSER_SHARED_DATA { + ULONG TickCountLowDeprecated; + ULONG TickCountMultiplier; + volatile KSYSTEM_TIME InterruptTime; + volatile KSYSTEM_TIME SystemTime; + volatile KSYSTEM_TIME TimeZoneBias; + USHORT ImageNumberLow; + USHORT ImageNumberHigh; + WCHAR NtSystemRoot[260]; + ULONG MaxStackTraceDepth; + ULONG CryptoExponent; + ULONG TimeZoneId; + ULONG LargePageMinimum; + ULONG Reserved2[7]; + NT_PRODUCT_TYPE NtProductType; + BOOLEAN ProductTypeIsValid; + ULONG NtMajorVersion; + ULONG NtMinorVersion; + BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX]; + ULONG Reserved1; + ULONG Reserved3; + volatile ULONG TimeSlip; + ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture; + ULONG AltArchitecturePad[1]; + LARGE_INTEGER SystemExpirationDate; + ULONG SuiteMask; + BOOLEAN KdDebuggerEnabled; +#if (NTDDI_VERSION >= NTDDI_WINXPSP2) + UCHAR NXSupportPolicy; +#endif + volatile ULONG ActiveConsoleId; + volatile ULONG DismountCount; + ULONG ComPlusPackage; + ULONG LastSystemRITEventTickCount; + ULONG NumberOfPhysicalPages; + BOOLEAN SafeBootMode; +#if (NTDDI_VERSION >= NTDDI_WIN7) + union { + UCHAR TscQpcData; + struct { + UCHAR TscQpcEnabled:1; + UCHAR TscQpcSpareFlag:1; + UCHAR TscQpcShift:6; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + UCHAR TscQpcPad[2]; +#endif +#if (NTDDI_VERSION >= NTDDI_VISTA) + union { + ULONG SharedDataFlags; + struct { + ULONG DbgErrorPortPresent:1; + ULONG DbgElevationEnabled:1; + ULONG DbgVirtEnabled:1; + ULONG DbgInstallerDetectEnabled:1; + ULONG DbgSystemDllRelocated:1; + ULONG DbgDynProcessorEnabled:1; + ULONG DbgSEHValidationEnabled:1; + ULONG SpareBits:25; + } DUMMYSTRUCTNAME2; + } DUMMYUNIONNAME2; +#else + ULONG TraceLogging; +#endif + ULONG DataFlagsPad[1]; + ULONGLONG TestRetInstruction; + ULONG SystemCall; + ULONG SystemCallReturn; + ULONGLONG SystemCallPad[3]; + _ANONYMOUS_UNION union { + volatile KSYSTEM_TIME TickCount; + volatile ULONG64 TickCountQuad; + _ANONYMOUS_STRUCT struct { + ULONG ReservedTickCountOverlay[3]; + ULONG TickCountPad[1]; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME3; + ULONG Cookie; + ULONG CookiePad[1]; +#if (NTDDI_VERSION >= NTDDI_WS03) + LONGLONG ConsoleSessionForegroundProcessId; + ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES]; +#endif +#if (NTDDI_VERSION >= NTDDI_VISTA) +#if (NTDDI_VERSION >= NTDDI_WIN7) + USHORT UserModeGlobalLogger[16]; +#else + USHORT UserModeGlobalLogger[8]; + ULONG HeapTracingPid[2]; + ULONG CritSecTracingPid[2]; +#endif + ULONG ImageFileExecutionOptions; +#if (NTDDI_VERSION >= NTDDI_VISTASP1) + ULONG LangGenerationCount; +#else + /* 4 bytes padding */ +#endif + ULONGLONG Reserved5; + volatile ULONG64 InterruptTimeBias; +#endif +#if (NTDDI_VERSION >= NTDDI_WIN7) + volatile ULONG64 TscQpcBias; + volatile ULONG ActiveProcessorCount; + volatile USHORT ActiveGroupCount; + USHORT Reserved4; + volatile ULONG AitSamplingValue; + volatile ULONG AppCompatFlag; + ULONGLONG SystemDllNativeRelocation; + ULONG SystemDllWowRelocation; + ULONG XStatePad[1]; + XSTATE_CONFIGURATION XState; +#endif +} KUSER_SHARED_DATA, *PKUSER_SHARED_DATA; + +#if (NTDDI_VERSION >= NTDDI_VISTA) +extern NTSYSAPI volatile CCHAR KeNumberProcessors; +#elif (NTDDI_VERSION >= NTDDI_WINXP) +extern NTSYSAPI CCHAR KeNumberProcessors; +#else +extern PCCHAR KeNumberProcessors; +#endif + + +/****************************************************************************** + * Kernel Debugger Types * + ******************************************************************************/ +typedef struct _DEBUG_DEVICE_ADDRESS { + UCHAR Type; + BOOLEAN Valid; + UCHAR Reserved[2]; + PUCHAR TranslatedAddress; + ULONG Length; +} DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS; + +typedef struct _DEBUG_MEMORY_REQUIREMENTS { + PHYSICAL_ADDRESS Start; + PHYSICAL_ADDRESS MaxEnd; + PVOID VirtualAddress; + ULONG Length; + BOOLEAN Cached; + BOOLEAN Aligned; +} DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS; + +typedef struct _DEBUG_DEVICE_DESCRIPTOR { + ULONG Bus; + ULONG Slot; + USHORT Segment; + USHORT VendorID; + USHORT DeviceID; + UCHAR BaseClass; + UCHAR SubClass; + UCHAR ProgIf; + BOOLEAN Initialized; + BOOLEAN Configured; + DEBUG_DEVICE_ADDRESS BaseAddress[6]; + DEBUG_MEMORY_REQUIREMENTS Memory; +} DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR; + +typedef NTSTATUS +(NTAPI *pKdSetupPciDeviceForDebugging)( + IN PVOID LoaderBlock OPTIONAL, + IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice); + +typedef NTSTATUS +(NTAPI *pKdReleasePciDeviceForDebugging)( + IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice); + +typedef PVOID +(NTAPI *pKdGetAcpiTablePhase0)( + IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock, + IN ULONG Signature); + +typedef VOID +(NTAPI *pKdCheckPowerButton)( + VOID); + +#if (NTDDI_VERSION >= NTDDI_VISTA) +typedef PVOID +(NTAPI *pKdMapPhysicalMemory64)( + IN PHYSICAL_ADDRESS PhysicalAddress, + IN ULONG NumberPages, + IN BOOLEAN FlushCurrentTLB); + +typedef VOID +(NTAPI *pKdUnmapVirtualAddress)( + IN PVOID VirtualAddress, + IN ULONG NumberPages, + IN BOOLEAN FlushCurrentTLB); +#else +typedef PVOID +(NTAPI *pKdMapPhysicalMemory64)( + IN PHYSICAL_ADDRESS PhysicalAddress, + IN ULONG NumberPages); + +typedef VOID +(NTAPI *pKdUnmapVirtualAddress)( + IN PVOID VirtualAddress, + IN ULONG NumberPages); +#endif + +typedef ULONG +(NTAPI *pKdGetPciDataByOffset)( + IN ULONG BusNumber, + IN ULONG SlotNumber, + OUT PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +typedef ULONG +(NTAPI *pKdSetPciDataByOffset)( + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); +/****************************************************************************** + * Memory manager Types * + ******************************************************************************/ + +typedef struct _PHYSICAL_MEMORY_RANGE { + PHYSICAL_ADDRESS BaseAddress; + LARGE_INTEGER NumberOfBytes; +} PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE; + +typedef NTSTATUS +(NTAPI *PMM_ROTATE_COPY_CALLBACK_FUNCTION)( + IN PMDL DestinationMdl, + IN PMDL SourceMdl, + IN PVOID Context); + +typedef enum _MM_ROTATE_DIRECTION { + MmToFrameBuffer, + MmToFrameBufferNoCopy, + MmToRegularMemory, + MmToRegularMemoryNoCopy, + MmMaximumRotateDirection +} MM_ROTATE_DIRECTION, *PMM_ROTATE_DIRECTION; + + +/****************************************************************************** + * Process Manager Types * + ******************************************************************************/ + +#define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001 +#define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002 +#define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004 +#define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008 +#define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010 + +typedef struct _QUOTA_LIMITS { + SIZE_T PagedPoolLimit; + SIZE_T NonPagedPoolLimit; + SIZE_T MinimumWorkingSetSize; + SIZE_T MaximumWorkingSetSize; + SIZE_T PagefileLimit; + LARGE_INTEGER TimeLimit; +} QUOTA_LIMITS, *PQUOTA_LIMITS; + +typedef union _RATE_QUOTA_LIMIT { + ULONG RateData; + struct { + ULONG RatePercent:7; + ULONG Reserved0:25; + } DUMMYSTRUCTNAME; +} RATE_QUOTA_LIMIT, *PRATE_QUOTA_LIMIT; + +typedef struct _QUOTA_LIMITS_EX { + SIZE_T PagedPoolLimit; + SIZE_T NonPagedPoolLimit; + SIZE_T MinimumWorkingSetSize; + SIZE_T MaximumWorkingSetSize; + SIZE_T PagefileLimit; + LARGE_INTEGER TimeLimit; + SIZE_T WorkingSetLimit; + SIZE_T Reserved2; + SIZE_T Reserved3; + SIZE_T Reserved4; + ULONG Flags; + RATE_QUOTA_LIMIT CpuRateLimit; +} QUOTA_LIMITS_EX, *PQUOTA_LIMITS_EX; + +typedef struct _IO_COUNTERS { + ULONGLONG ReadOperationCount; + ULONGLONG WriteOperationCount; + ULONGLONG OtherOperationCount; + ULONGLONG ReadTransferCount; + ULONGLONG WriteTransferCount; + ULONGLONG OtherTransferCount; +} IO_COUNTERS, *PIO_COUNTERS; + +typedef struct _VM_COUNTERS { + SIZE_T PeakVirtualSize; + SIZE_T VirtualSize; + ULONG PageFaultCount; + SIZE_T PeakWorkingSetSize; + SIZE_T WorkingSetSize; + SIZE_T QuotaPeakPagedPoolUsage; + SIZE_T QuotaPagedPoolUsage; + SIZE_T QuotaPeakNonPagedPoolUsage; + SIZE_T QuotaNonPagedPoolUsage; + SIZE_T PagefileUsage; + SIZE_T PeakPagefileUsage; +} VM_COUNTERS, *PVM_COUNTERS; + +typedef struct _VM_COUNTERS_EX { + SIZE_T PeakVirtualSize; + SIZE_T VirtualSize; + ULONG PageFaultCount; + SIZE_T PeakWorkingSetSize; + SIZE_T WorkingSetSize; + SIZE_T QuotaPeakPagedPoolUsage; + SIZE_T QuotaPagedPoolUsage; + SIZE_T QuotaPeakNonPagedPoolUsage; + SIZE_T QuotaNonPagedPoolUsage; + SIZE_T PagefileUsage; + SIZE_T PeakPagefileUsage; + SIZE_T PrivateUsage; +} VM_COUNTERS_EX, *PVM_COUNTERS_EX; + +#define MAX_HW_COUNTERS 16 +#define THREAD_PROFILING_FLAG_DISPATCH 0x00000001 + +typedef enum _HARDWARE_COUNTER_TYPE { + PMCCounter, + MaxHardwareCounterType +} HARDWARE_COUNTER_TYPE, *PHARDWARE_COUNTER_TYPE; + +typedef struct _HARDWARE_COUNTER { + HARDWARE_COUNTER_TYPE Type; + ULONG Reserved; + ULONG64 Index; +} HARDWARE_COUNTER, *PHARDWARE_COUNTER; + +typedef struct _POOLED_USAGE_AND_LIMITS { + SIZE_T PeakPagedPoolUsage; + SIZE_T PagedPoolUsage; + SIZE_T PagedPoolLimit; + SIZE_T PeakNonPagedPoolUsage; + SIZE_T NonPagedPoolUsage; + SIZE_T NonPagedPoolLimit; + SIZE_T PeakPagefileUsage; + SIZE_T PagefileUsage; + SIZE_T PagefileLimit; +} POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS; + +typedef struct _PROCESS_ACCESS_TOKEN { + HANDLE Token; + HANDLE Thread; +} PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN; + +#define PROCESS_EXCEPTION_PORT_ALL_STATE_BITS 0x00000003UL +#define PROCESS_EXCEPTION_PORT_ALL_STATE_FLAGS ((ULONG_PTR)((1UL << PROCESS_EXCEPTION_PORT_ALL_STATE_BITS) - 1)) + +typedef struct _PROCESS_EXCEPTION_PORT { + IN HANDLE ExceptionPortHandle; + IN OUT ULONG StateFlags; +} PROCESS_EXCEPTION_PORT, *PPROCESS_EXCEPTION_PORT; + +typedef VOID +(NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)( + IN HANDLE ParentId, + IN HANDLE ProcessId, + IN BOOLEAN Create); + +typedef struct _PS_CREATE_NOTIFY_INFO { + IN SIZE_T Size; + union { + IN ULONG Flags; + struct { + IN ULONG FileOpenNameAvailable:1; + IN ULONG Reserved:31; + }; + }; + IN HANDLE ParentProcessId; + IN CLIENT_ID CreatingThreadId; + IN OUT struct _FILE_OBJECT *FileObject; + IN PCUNICODE_STRING ImageFileName; + IN PCUNICODE_STRING CommandLine OPTIONAL; + IN OUT NTSTATUS CreationStatus; +} PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO; + +typedef VOID +(NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE_EX)( + IN OUT PEPROCESS Process, + IN HANDLE ProcessId, + IN PPS_CREATE_NOTIFY_INFO CreateInfo OPTIONAL); + +typedef VOID +(NTAPI *PCREATE_THREAD_NOTIFY_ROUTINE)( + IN HANDLE ProcessId, + IN HANDLE ThreadId, + IN BOOLEAN Create); + +#define IMAGE_ADDRESSING_MODE_32BIT 3 typedef struct _IMAGE_INFO { _ANONYMOUS_UNION union { @@ -834,7 +2258,7 @@ typedef struct _IMAGE_INFO { ULONG SystemModeImage:1; ULONG ImageMappedToAllPids:1; ULONG ExtendedInfoPresent:1; - ULONG Reserved:22; + ULONG Reserved:21; } DUMMYSTRUCTNAME; } DUMMYUNIONNAME; PVOID ImageBase; @@ -843,24 +2267,24 @@ typedef struct _IMAGE_INFO { ULONG ImageSectionNumber; } IMAGE_INFO, *PIMAGE_INFO; -#define IMAGE_ADDRESSING_MODE_32BIT 3 +typedef struct _IMAGE_INFO_EX { + SIZE_T Size; + IMAGE_INFO ImageInfo; + struct _FILE_OBJECT *FileObject; +} IMAGE_INFO_EX, *PIMAGE_INFO_EX; -typedef enum _BUS_DATA_TYPE { - ConfigurationSpaceUndefined = -1, - Cmos, - EisaConfiguration, - Pos, - CbusConfiguration, - PCIConfiguration, - VMEConfiguration, - NuBusConfiguration, - PCMCIAConfiguration, - MPIConfiguration, - MPSAConfiguration, - PNPISAConfiguration, - SgiInternalConfiguration, - MaximumBusDataType -} BUS_DATA_TYPE, *PBUS_DATA_TYPE; +typedef VOID +(NTAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)( + IN PUNICODE_STRING FullImageName, + IN HANDLE ProcessId, + IN PIMAGE_INFO ImageInfo); + +#define THREAD_CSWITCH_PMU_DISABLE FALSE +#define THREAD_CSWITCH_PMU_ENABLE TRUE + +#define PROCESS_LUID_DOSDEVICES_ONLY 0x00000001 + +#define PROCESS_HANDLE_TRACING_MAX_STACKS 16 typedef struct _NT_TIB { struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; @@ -994,6 +2418,15 @@ typedef enum _THREADINFOCLASS { MaxThreadInfoClass } THREADINFOCLASS; +typedef struct _PAGE_PRIORITY_INFORMATION { + ULONG PagePriority; +} PAGE_PRIORITY_INFORMATION, *PPAGE_PRIORITY_INFORMATION; + +typedef struct _PROCESS_WS_WATCH_INFORMATION { + PVOID FaultingPc; + PVOID FaultingVa; +} PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION; + typedef struct _PROCESS_BASIC_INFORMATION { NTSTATUS ExitStatus; struct _PEB *PebBaseAddress; @@ -1003,10 +2436,20 @@ typedef struct _PROCESS_BASIC_INFORMATION { ULONG_PTR InheritedFromUniqueProcessId; } PROCESS_BASIC_INFORMATION,*PPROCESS_BASIC_INFORMATION; -typedef struct _PROCESS_WS_WATCH_INFORMATION { - PVOID FaultingPc; - PVOID FaultingVa; -} PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION; +typedef struct _PROCESS_EXTENDED_BASIC_INFORMATION { + SIZE_T Size; + PROCESS_BASIC_INFORMATION BasicInfo; + union { + ULONG Flags; + struct { + ULONG IsProtectedProcess:1; + ULONG IsWow64Process:1; + ULONG IsProcessDeleting:1; + ULONG IsCrossSessionCreate:1; + ULONG SpareBits:28; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; +} PROCESS_EXTENDED_BASIC_INFORMATION, *PPROCESS_EXTENDED_BASIC_INFORMATION; typedef struct _PROCESS_DEVICEMAP_INFORMATION { __GNU_EXTENSION union { @@ -1020,514 +2463,263 @@ typedef struct _PROCESS_DEVICEMAP_INFORMATION { }; } PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION; -typedef struct _KERNEL_USER_TIMES { - LARGE_INTEGER CreateTime; - LARGE_INTEGER ExitTime; - LARGE_INTEGER KernelTime; - LARGE_INTEGER UserTime; -} KERNEL_USER_TIMES, *PKERNEL_USER_TIMES; - -typedef struct _PROCESS_ACCESS_TOKEN { - HANDLE Token; - HANDLE Thread; -} PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN; +typedef struct _PROCESS_DEVICEMAP_INFORMATION_EX { + union { + struct { + HANDLE DirectoryHandle; + } Set; + struct { + ULONG DriveMap; + UCHAR DriveType[32]; + } Query; + } DUMMYUNIONNAME; + ULONG Flags; +} PROCESS_DEVICEMAP_INFORMATION_EX, *PPROCESS_DEVICEMAP_INFORMATION_EX; typedef struct _PROCESS_SESSION_INFORMATION { ULONG SessionId; } PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION; -typedef enum _IO_QUERY_DEVICE_DATA_FORMAT { - IoQueryDeviceIdentifier = 0, - IoQueryDeviceConfigurationData, - IoQueryDeviceComponentInformation, - IoQueryDeviceMaxData -} IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT; +typedef struct _PROCESS_HANDLE_TRACING_ENABLE { + ULONG Flags; +} PROCESS_HANDLE_TRACING_ENABLE, *PPROCESS_HANDLE_TRACING_ENABLE; -typedef struct _DISK_SIGNATURE { - ULONG PartitionStyle; - _ANONYMOUS_UNION union { - struct { - ULONG Signature; - ULONG CheckSum; - } Mbr; - struct { - GUID DiskId; - } Gpt; - } DUMMYUNIONNAME; -} DISK_SIGNATURE, *PDISK_SIGNATURE; +typedef struct _PROCESS_HANDLE_TRACING_ENABLE_EX { + ULONG Flags; + ULONG TotalSlots; +} PROCESS_HANDLE_TRACING_ENABLE_EX, *PPROCESS_HANDLE_TRACING_ENABLE_EX; -typedef ULONG_PTR -(NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)( - IN PVOID Context); +typedef struct _PROCESS_HANDLE_TRACING_ENTRY { + HANDLE Handle; + CLIENT_ID ClientId; + ULONG Type; + PVOID Stacks[PROCESS_HANDLE_TRACING_MAX_STACKS]; +} PROCESS_HANDLE_TRACING_ENTRY, *PPROCESS_HANDLE_TRACING_ENTRY; -typedef struct _DRIVER_VERIFIER_THUNK_PAIRS { - PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine; - PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine; -} DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS; +typedef struct _PROCESS_HANDLE_TRACING_QUERY { + HANDLE Handle; + ULONG TotalTraces; + PROCESS_HANDLE_TRACING_ENTRY HandleTrace[1]; +} PROCESS_HANDLE_TRACING_QUERY, *PPROCESS_HANDLE_TRACING_QUERY; -#define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001 -#define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002 -#define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004 -#define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008 -#define DRIVER_VERIFIER_IO_CHECKING 0x0010 +extern NTKERNELAPI PEPROCESS PsInitialSystemProcess; + + +/****************************************************************************** + * Runtime Library Types * + ******************************************************************************/ + + + +#ifndef _RTL_RUN_ONCE_DEF +#define _RTL_RUN_ONCE_DEF + +#define RTL_RUN_ONCE_INIT {0} + +#define RTL_RUN_ONCE_CHECK_ONLY 0x00000001UL +#define RTL_RUN_ONCE_ASYNC 0x00000002UL +#define RTL_RUN_ONCE_INIT_FAILED 0x00000004UL + +#define RTL_RUN_ONCE_CTX_RESERVED_BITS 2 + +#define RTL_HASH_ALLOCATED_HEADER 0x00000001 + +#define RTL_HASH_RESERVED_SIGNATURE 0 + +/* RtlVerifyVersionInfo() ComparisonType */ + +#define VER_EQUAL 1 +#define VER_GREATER 2 +#define VER_GREATER_EQUAL 3 +#define VER_LESS 4 +#define VER_LESS_EQUAL 5 +#define VER_AND 6 +#define VER_OR 7 + +#define VER_CONDITION_MASK 7 +#define VER_NUM_BITS_PER_CONDITION_MASK 3 + +/* RtlVerifyVersionInfo() TypeMask */ + +#define VER_MINORVERSION 0x0000001 +#define VER_MAJORVERSION 0x0000002 +#define VER_BUILDNUMBER 0x0000004 +#define VER_PLATFORMID 0x0000008 +#define VER_SERVICEPACKMINOR 0x0000010 +#define VER_SERVICEPACKMAJOR 0x0000020 +#define VER_SUITENAME 0x0000040 +#define VER_PRODUCT_TYPE 0x0000080 + +#define VER_NT_WORKSTATION 0x0000001 +#define VER_NT_DOMAIN_CONTROLLER 0x0000002 +#define VER_NT_SERVER 0x0000003 + +#define VER_PLATFORM_WIN32s 0 +#define VER_PLATFORM_WIN32_WINDOWS 1 +#define VER_PLATFORM_WIN32_NT 2 + +typedef union _RTL_RUN_ONCE { + PVOID Ptr; +} RTL_RUN_ONCE, *PRTL_RUN_ONCE; + +typedef ULONG /* LOGICAL */ +(NTAPI *PRTL_RUN_ONCE_INIT_FN) ( + IN OUT PRTL_RUN_ONCE RunOnce, + IN OUT PVOID Parameter OPTIONAL, + IN OUT PVOID *Context OPTIONAL); + +#endif /* _RTL_RUN_ONCE_DEF */ + +typedef enum _TABLE_SEARCH_RESULT { + TableEmptyTree, + TableFoundNode, + TableInsertAsLeft, + TableInsertAsRight +} TABLE_SEARCH_RESULT; + +typedef enum _RTL_GENERIC_COMPARE_RESULTS { + GenericLessThan, + GenericGreaterThan, + GenericEqual +} RTL_GENERIC_COMPARE_RESULTS; + +// Forwarder +struct _RTL_AVL_TABLE; + +typedef RTL_GENERIC_COMPARE_RESULTS +(NTAPI *PRTL_AVL_COMPARE_ROUTINE) ( + IN struct _RTL_AVL_TABLE *Table, + IN PVOID FirstStruct, + IN PVOID SecondStruct); + +typedef PVOID +(NTAPI *PRTL_AVL_ALLOCATE_ROUTINE) ( + IN struct _RTL_AVL_TABLE *Table, + IN CLONG ByteSize); typedef VOID -(NTAPI *PTIMER_APC_ROUTINE)( - IN PVOID TimerContext, - IN ULONG TimerLowValue, - IN LONG TimerHighValue); +(NTAPI *PRTL_AVL_FREE_ROUTINE) ( + IN struct _RTL_AVL_TABLE *Table, + IN PVOID Buffer); -typedef struct _KUSER_SHARED_DATA -{ - ULONG TickCountLowDeprecated; - ULONG TickCountMultiplier; - volatile KSYSTEM_TIME InterruptTime; - volatile KSYSTEM_TIME SystemTime; - volatile KSYSTEM_TIME TimeZoneBias; - USHORT ImageNumberLow; - USHORT ImageNumberHigh; - WCHAR NtSystemRoot[260]; - ULONG MaxStackTraceDepth; - ULONG CryptoExponent; - ULONG TimeZoneId; - ULONG LargePageMinimum; - ULONG Reserved2[7]; - NT_PRODUCT_TYPE NtProductType; - BOOLEAN ProductTypeIsValid; - ULONG NtMajorVersion; - ULONG NtMinorVersion; - BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX]; - ULONG Reserved1; - ULONG Reserved3; - volatile ULONG TimeSlip; - ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture; - ULONG AltArchitecturePad[1]; - LARGE_INTEGER SystemExpirationDate; - ULONG SuiteMask; - BOOLEAN KdDebuggerEnabled; -#if (NTDDI_VERSION >= NTDDI_WINXPSP2) - UCHAR NXSupportPolicy; -#endif - volatile ULONG ActiveConsoleId; - volatile ULONG DismountCount; - ULONG ComPlusPackage; - ULONG LastSystemRITEventTickCount; - ULONG NumberOfPhysicalPages; - BOOLEAN SafeBootMode; -#if (NTDDI_VERSION >= NTDDI_WIN7) - union { - UCHAR TscQpcData; - struct { - UCHAR TscQpcEnabled:1; - UCHAR TscQpcSpareFlag:1; - UCHAR TscQpcShift:6; - } DUMMYSTRUCTNAME; - } DUMMYUNIONNAME; - UCHAR TscQpcPad[2]; -#endif -#if (NTDDI_VERSION >= NTDDI_VISTA) - union { - ULONG SharedDataFlags; - struct { - ULONG DbgErrorPortPresent:1; - ULONG DbgElevationEnabled:1; - ULONG DbgVirtEnabled:1; - ULONG DbgInstallerDetectEnabled:1; - ULONG DbgSystemDllRelocated:1; - ULONG DbgDynProcessorEnabled:1; - ULONG DbgSEHValidationEnabled:1; - ULONG SpareBits:25; - } DUMMYSTRUCTNAME2; - } DUMMYUNIONNAME2; -#else - ULONG TraceLogging; -#endif - ULONG DataFlagsPad[1]; - ULONGLONG TestRetInstruction; - ULONG SystemCall; - ULONG SystemCallReturn; - ULONGLONG SystemCallPad[3]; - _ANONYMOUS_UNION union { - volatile KSYSTEM_TIME TickCount; - volatile ULONG64 TickCountQuad; - _ANONYMOUS_STRUCT struct { - ULONG ReservedTickCountOverlay[3]; - ULONG TickCountPad[1]; - } DUMMYSTRUCTNAME; - } DUMMYUNIONNAME3; - ULONG Cookie; - ULONG CookiePad[1]; -#if (NTDDI_VERSION >= NTDDI_WS03) - LONGLONG ConsoleSessionForegroundProcessId; - ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES]; -#endif -#if (NTDDI_VERSION >= NTDDI_VISTA) -#if (NTDDI_VERSION >= NTDDI_WIN7) - USHORT UserModeGlobalLogger[16]; -#else - USHORT UserModeGlobalLogger[8]; - ULONG HeapTracingPid[2]; - ULONG CritSecTracingPid[2]; -#endif - ULONG ImageFileExecutionOptions; -#if (NTDDI_VERSION >= NTDDI_VISTASP1) - ULONG LangGenerationCount; -#else - /* 4 bytes padding */ -#endif - ULONGLONG Reserved5; - volatile ULONG64 InterruptTimeBias; -#endif -#if (NTDDI_VERSION >= NTDDI_WIN7) - volatile ULONG64 TscQpcBias; - volatile ULONG ActiveProcessorCount; - volatile USHORT ActiveGroupCount; - USHORT Reserved4; - volatile ULONG AitSamplingValue; - volatile ULONG AppCompatFlag; - ULONGLONG SystemDllNativeRelocation; - ULONG SystemDllWowRelocation; - ULONG XStatePad[1]; - XSTATE_CONFIGURATION XState; -#endif -} KUSER_SHARED_DATA, *PKUSER_SHARED_DATA; +typedef NTSTATUS +(NTAPI *PRTL_AVL_MATCH_FUNCTION) ( + IN struct _RTL_AVL_TABLE *Table, + IN PVOID UserData, + IN PVOID MatchData); -extern NTKERNELAPI PVOID MmHighestUserAddress; -extern NTKERNELAPI PVOID MmSystemRangeStart; -extern NTKERNELAPI ULONG MmUserProbeAddress; +typedef struct _RTL_BALANCED_LINKS { + struct _RTL_BALANCED_LINKS *Parent; + struct _RTL_BALANCED_LINKS *LeftChild; + struct _RTL_BALANCED_LINKS *RightChild; + CHAR Balance; + UCHAR Reserved[3]; +} RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS; +typedef struct _RTL_AVL_TABLE { + RTL_BALANCED_LINKS BalancedRoot; + PVOID OrderedPointer; + ULONG WhichOrderedElement; + ULONG NumberGenericTableElements; + ULONG DepthOfTree; + PRTL_BALANCED_LINKS RestartKey; + ULONG DeleteCount; + PRTL_AVL_COMPARE_ROUTINE CompareRoutine; + PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine; + PRTL_AVL_FREE_ROUTINE FreeRoutine; + PVOID TableContext; +} RTL_AVL_TABLE, *PRTL_AVL_TABLE; -#ifdef _X86_ +#ifndef RTL_USE_AVL_TABLES -#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress -#define MM_SYSTEM_RANGE_START MmSystemRangeStart -#if defined(_LOCAL_COPY_USER_PROBE_ADDRESS_) -#define MM_USER_PROBE_ADDRESS _LOCAL_COPY_USER_PROBE_ADDRESS_ -extern ULONG _LOCAL_COPY_USER_PROBE_ADDRESS_; -#else -#define MM_USER_PROBE_ADDRESS MmUserProbeAddress -#endif -#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 -#define MM_KSEG0_BASE MM_SYSTEM_RANGE_START -#define MM_SYSTEM_SPACE_END 0xFFFFFFFF -#if !defined (_X86PAE_) -#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000 -#else -#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000 -#endif +struct _RTL_GENERIC_TABLE; -#define KeGetPcr() PCR +typedef RTL_GENERIC_COMPARE_RESULTS +(NTAPI *PRTL_GENERIC_COMPARE_ROUTINE) ( + IN struct _RTL_GENERIC_TABLE *Table, + IN PVOID FirstStruct, + IN PVOID SecondStruct); -#define KERNEL_STACK_SIZE 12288 -#define KERNEL_LARGE_STACK_SIZE 61440 -#define KERNEL_LARGE_STACK_COMMIT 12288 +typedef PVOID +(NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) ( + IN struct _RTL_GENERIC_TABLE *Table, + IN CLONG ByteSize); -#define SIZE_OF_80387_REGISTERS 80 +typedef VOID +(NTAPI *PRTL_GENERIC_FREE_ROUTINE) ( + IN struct _RTL_GENERIC_TABLE *Table, + IN PVOID Buffer); -#define PCR_MINOR_VERSION 1 -#define PCR_MAJOR_VERSION 1 +typedef struct _RTL_SPLAY_LINKS { + struct _RTL_SPLAY_LINKS *Parent; + struct _RTL_SPLAY_LINKS *LeftChild; + struct _RTL_SPLAY_LINKS *RightChild; +} RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS; -#if !defined(RC_INVOKED) +typedef struct _RTL_GENERIC_TABLE { + PRTL_SPLAY_LINKS TableRoot; + LIST_ENTRY InsertOrderList; + PLIST_ENTRY OrderedPointer; + ULONG WhichOrderedElement; + ULONG NumberGenericTableElements; + PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine; + PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine; + PRTL_GENERIC_FREE_ROUTINE FreeRoutine; + PVOID TableContext; +} RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE; -#define CONTEXT_i386 0x10000 -#define CONTEXT_i486 0x10000 -#define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L) -#define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L) -#define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L) -#define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L) -#define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L) -#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L) +#endif /* !RTL_USE_AVL_TABLES */ -#define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS) +#ifdef RTL_USE_AVL_TABLES -#endif /* !defined(RC_INVOKED) */ +#undef PRTL_GENERIC_COMPARE_ROUTINE +#undef RTL_GENERIC_COMPARE_ROUTINE +#undef PRTL_GENERIC_ALLOCATE_ROUTINE +#undef RTL_GENERIC_ALLOCATE_ROUTINE +#undef PRTL_GENERIC_FREE_ROUTINE +#undef RTL_GENERIC_FREE_ROUTINE +#undef RTL_GENERIC_TABLE +#undef PRTL_GENERIC_TABLE -typedef struct _KPCR { - union { - NT_TIB NtTib; - struct { - struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList; - PVOID Used_StackBase; - PVOID Spare2; - PVOID TssCopy; - ULONG ContextSwitches; - KAFFINITY SetMemberCopy; - PVOID Used_Self; - }; - }; - struct _KPCR *SelfPcr; - struct _KPRCB *Prcb; - KIRQL Irql; - ULONG IRR; - ULONG IrrActive; - ULONG IDR; - PVOID KdVersionBlock; - struct _KIDTENTRY *IDT; - struct _KGDTENTRY *GDT; - struct _KTSS *TSS; - USHORT MajorVersion; - USHORT MinorVersion; - KAFFINITY SetMember; - ULONG StallScaleFactor; - UCHAR SpareUnused; - UCHAR Number; - UCHAR Spare0; - UCHAR SecondLevelCacheAssociativity; - ULONG VdmAlert; - ULONG KernelReserved[14]; - ULONG SecondLevelCacheSize; - ULONG HalReserved[16]; -} KPCR, *PKPCR; +#define PRTL_GENERIC_COMPARE_ROUTINE PRTL_AVL_COMPARE_ROUTINE +#define RTL_GENERIC_COMPARE_ROUTINE RTL_AVL_COMPARE_ROUTINE +#define PRTL_GENERIC_ALLOCATE_ROUTINE PRTL_AVL_ALLOCATE_ROUTINE +#define RTL_GENERIC_ALLOCATE_ROUTINE RTL_AVL_ALLOCATE_ROUTINE +#define PRTL_GENERIC_FREE_ROUTINE PRTL_AVL_FREE_ROUTINE +#define RTL_GENERIC_FREE_ROUTINE RTL_AVL_FREE_ROUTINE +#define RTL_GENERIC_TABLE RTL_AVL_TABLE +#define PRTL_GENERIC_TABLE PRTL_AVL_TABLE -FORCEINLINE -ULONG -KeGetCurrentProcessorNumber(VOID) -{ - return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number)); -} +#endif /* RTL_USE_AVL_TABLES */ -typedef struct _FLOATING_SAVE_AREA { - ULONG ControlWord; - ULONG StatusWord; - ULONG TagWord; - ULONG ErrorOffset; - ULONG ErrorSelector; - ULONG DataOffset; - ULONG DataSelector; - UCHAR RegisterArea[SIZE_OF_80387_REGISTERS]; - ULONG Cr0NpxState; -} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; +typedef struct _RTL_DYNAMIC_HASH_TABLE_ENTRY { + LIST_ENTRY Linkage; + ULONG_PTR Signature; +} RTL_DYNAMIC_HASH_TABLE_ENTRY, *PRTL_DYNAMIC_HASH_TABLE_ENTRY; -#include "pshpack4.h" -typedef struct _CONTEXT { - ULONG ContextFlags; - ULONG Dr0; - ULONG Dr1; - ULONG Dr2; - ULONG Dr3; - ULONG Dr6; - ULONG Dr7; - FLOATING_SAVE_AREA FloatSave; - ULONG SegGs; - ULONG SegFs; - ULONG SegEs; - ULONG SegDs; - ULONG Edi; - ULONG Esi; - ULONG Ebx; - ULONG Edx; - ULONG Ecx; - ULONG Eax; - ULONG Ebp; - ULONG Eip; - ULONG SegCs; - ULONG EFlags; - ULONG Esp; - ULONG SegSs; - UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION]; -} CONTEXT; -#include "poppack.h" +typedef struct _RTL_DYNAMIC_HASH_TABLE_CONTEXT { + PLIST_ENTRY ChainHead; + PLIST_ENTRY PrevLinkage; + ULONG_PTR Signature; +} RTL_DYNAMIC_HASH_TABLE_CONTEXT, *PRTL_DYNAMIC_HASH_TABLE_CONTEXT; -#endif /* _X86_ */ +typedef struct _RTL_DYNAMIC_HASH_TABLE_ENUMERATOR { + RTL_DYNAMIC_HASH_TABLE_ENTRY HashEntry; + PLIST_ENTRY ChainHead; + ULONG BucketIndex; +} RTL_DYNAMIC_HASH_TABLE_ENUMERATOR, *PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR; -#ifdef _AMD64_ - -#define PTI_SHIFT 12L -#define PDI_SHIFT 21L -#define PPI_SHIFT 30L -#define PXI_SHIFT 39L -#define PTE_PER_PAGE 512 -#define PDE_PER_PAGE 512 -#define PPE_PER_PAGE 512 -#define PXE_PER_PAGE 512 -#define PTI_MASK_AMD64 (PTE_PER_PAGE - 1) -#define PDI_MASK_AMD64 (PDE_PER_PAGE - 1) -#define PPI_MASK (PPE_PER_PAGE - 1) -#define PXI_MASK (PXE_PER_PAGE - 1) - -#define PXE_BASE 0xFFFFF6FB7DBED000ULL -#define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL -#define PPE_BASE 0xFFFFF6FB7DA00000ULL -#define PDE_BASE 0xFFFFF6FB40000000ULL -#define PTE_BASE 0xFFFFF68000000000ULL -#define PXE_TOP 0xFFFFF6FB7DBEDFFFULL -#define PPE_TOP 0xFFFFF6FB7DBFFFFFULL -#define PDE_TOP 0xFFFFF6FB7FFFFFFFULL -#define PTE_TOP 0xFFFFF6FFFFFFFFFFULL - -#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress -#define MM_SYSTEM_RANGE_START MmSystemRangeStart -#define MM_USER_PROBE_ADDRESS MmUserProbeAddress -#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 -#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL -#define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL - -typedef struct DECLSPEC_ALIGN(16) _CONTEXT { - ULONG64 P1Home; - ULONG64 P2Home; - ULONG64 P3Home; - ULONG64 P4Home; - ULONG64 P5Home; - ULONG64 P6Home; - - /* Control flags */ - ULONG ContextFlags; - ULONG MxCsr; - - /* Segment */ - USHORT SegCs; - USHORT SegDs; - USHORT SegEs; - USHORT SegFs; - USHORT SegGs; - USHORT SegSs; - ULONG EFlags; - - /* Debug */ - ULONG64 Dr0; - ULONG64 Dr1; - ULONG64 Dr2; - ULONG64 Dr3; - ULONG64 Dr6; - ULONG64 Dr7; - - /* Integer */ - ULONG64 Rax; - ULONG64 Rcx; - ULONG64 Rdx; - ULONG64 Rbx; - ULONG64 Rsp; - ULONG64 Rbp; - ULONG64 Rsi; - ULONG64 Rdi; - ULONG64 R8; - ULONG64 R9; - ULONG64 R10; - ULONG64 R11; - ULONG64 R12; - ULONG64 R13; - ULONG64 R14; - ULONG64 R15; - - /* Counter */ - ULONG64 Rip; - - /* Floating point */ - union { - XMM_SAVE_AREA32 FltSave; - struct { - M128A Header[2]; - M128A Legacy[8]; - M128A Xmm0; - M128A Xmm1; - M128A Xmm2; - M128A Xmm3; - M128A Xmm4; - M128A Xmm5; - M128A Xmm6; - M128A Xmm7; - M128A Xmm8; - M128A Xmm9; - M128A Xmm10; - M128A Xmm11; - M128A Xmm12; - M128A Xmm13; - M128A Xmm14; - M128A Xmm15; - } DUMMYSTRUCTNAME; - } DUMMYUNIONNAME; - - /* Vector */ - M128A VectorRegister[26]; - ULONG64 VectorControl; - - /* Debug control */ - ULONG64 DebugControl; - ULONG64 LastBranchToRip; - ULONG64 LastBranchFromRip; - ULONG64 LastExceptionToRip; - ULONG64 LastExceptionFromRip; -} CONTEXT; - -typedef struct _KPCR -{ - _ANONYMOUS_UNION union - { - NT_TIB NtTib; - _ANONYMOUS_STRUCT struct - { - union _KGDTENTRY64 *GdtBase; - struct _KTSS64 *TssBase; - ULONG64 UserRsp; - struct _KPCR *Self; - struct _KPRCB *CurrentPrcb; - PKSPIN_LOCK_QUEUE LockArray; - PVOID Used_Self; - }; - }; - union _KIDTENTRY64 *IdtBase; - ULONG64 Unused[2]; - KIRQL Irql; - UCHAR SecondLevelCacheAssociativity; - UCHAR ObsoleteNumber; - UCHAR Fill0; - ULONG Unused0[3]; - USHORT MajorVersion; - USHORT MinorVersion; - ULONG StallScaleFactor; - PVOID Unused1[3]; - ULONG KernelReserved[15]; - ULONG SecondLevelCacheSize; - ULONG HalReserved[16]; - ULONG Unused2; - PVOID KdVersionBlock; - PVOID Unused3; - ULONG PcrAlign1[24]; -} KPCR, *PKPCR; - -FORCEINLINE -PKPCR -KeGetPcr(VOID) -{ - return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self)); -} - -FORCEINLINE -ULONG -KeGetCurrentProcessorNumber(VOID) -{ - return (ULONG)__readgsword(0x184); -} - -#if !defined(RC_INVOKED) - -#define CONTEXT_AMD64 0x100000 - -#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L) -#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L) -#define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L) -#define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L) -#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L) - -#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) -#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS) - -#define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L) - -#define CONTEXT_EXCEPTION_ACTIVE 0x8000000 -#define CONTEXT_SERVICE_ACTIVE 0x10000000 -#define CONTEXT_EXCEPTION_REQUEST 0x40000000 -#define CONTEXT_EXCEPTION_REPORTING 0x80000000 - -#endif /* RC_INVOKED */ - -#endif /* _AMD64_ */ - -typedef enum _INTERLOCKED_RESULT { - ResultNegative = RESULT_NEGATIVE, - ResultZero = RESULT_ZERO, - ResultPositive = RESULT_POSITIVE -} INTERLOCKED_RESULT; +typedef struct _RTL_DYNAMIC_HASH_TABLE { + ULONG Flags; + ULONG Shift; + ULONG TableSize; + ULONG Pivot; + ULONG DivisorMask; + ULONG NumEntries; + ULONG NonEmptyBuckets; + ULONG NumEnumerators; + PVOID Directory; +} RTL_DYNAMIC_HASH_TABLE, *PRTL_DYNAMIC_HASH_TABLE; typedef struct _OSVERSIONINFOA { ULONG dwOSVersionInfoSize; @@ -1591,24 +2783,461 @@ typedef POSVERSIONINFOA POSVERSIONINFO; typedef LPOSVERSIONINFOA LPOSVERSIONINFO; #endif /* UNICODE */ -/* Executive Types */ +#define HASH_ENTRY_KEY(x) ((x)->Signature) -#define PROTECTED_POOL 0x80000000 +/****************************************************************************** + * Security Manager Types * + ******************************************************************************/ +#define SE_UNSOLICITED_INPUT_PRIVILEGE 6 -typedef struct _ZONE_SEGMENT_HEADER { - SINGLE_LIST_ENTRY SegmentList; - PVOID Reserved; -} ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER; +typedef enum _WELL_KNOWN_SID_TYPE { + WinNullSid = 0, + WinWorldSid = 1, + WinLocalSid = 2, + WinCreatorOwnerSid = 3, + WinCreatorGroupSid = 4, + WinCreatorOwnerServerSid = 5, + WinCreatorGroupServerSid = 6, + WinNtAuthoritySid = 7, + WinDialupSid = 8, + WinNetworkSid = 9, + WinBatchSid = 10, + WinInteractiveSid = 11, + WinServiceSid = 12, + WinAnonymousSid = 13, + WinProxySid = 14, + WinEnterpriseControllersSid = 15, + WinSelfSid = 16, + WinAuthenticatedUserSid = 17, + WinRestrictedCodeSid = 18, + WinTerminalServerSid = 19, + WinRemoteLogonIdSid = 20, + WinLogonIdsSid = 21, + WinLocalSystemSid = 22, + WinLocalServiceSid = 23, + WinNetworkServiceSid = 24, + WinBuiltinDomainSid = 25, + WinBuiltinAdministratorsSid = 26, + WinBuiltinUsersSid = 27, + WinBuiltinGuestsSid = 28, + WinBuiltinPowerUsersSid = 29, + WinBuiltinAccountOperatorsSid = 30, + WinBuiltinSystemOperatorsSid = 31, + WinBuiltinPrintOperatorsSid = 32, + WinBuiltinBackupOperatorsSid = 33, + WinBuiltinReplicatorSid = 34, + WinBuiltinPreWindows2000CompatibleAccessSid = 35, + WinBuiltinRemoteDesktopUsersSid = 36, + WinBuiltinNetworkConfigurationOperatorsSid = 37, + WinAccountAdministratorSid = 38, + WinAccountGuestSid = 39, + WinAccountKrbtgtSid = 40, + WinAccountDomainAdminsSid = 41, + WinAccountDomainUsersSid = 42, + WinAccountDomainGuestsSid = 43, + WinAccountComputersSid = 44, + WinAccountControllersSid = 45, + WinAccountCertAdminsSid = 46, + WinAccountSchemaAdminsSid = 47, + WinAccountEnterpriseAdminsSid = 48, + WinAccountPolicyAdminsSid = 49, + WinAccountRasAndIasServersSid = 50, + WinNTLMAuthenticationSid = 51, + WinDigestAuthenticationSid = 52, + WinSChannelAuthenticationSid = 53, + WinThisOrganizationSid = 54, + WinOtherOrganizationSid = 55, + WinBuiltinIncomingForestTrustBuildersSid = 56, + WinBuiltinPerfMonitoringUsersSid = 57, + WinBuiltinPerfLoggingUsersSid = 58, + WinBuiltinAuthorizationAccessSid = 59, + WinBuiltinTerminalServerLicenseServersSid = 60, + WinBuiltinDCOMUsersSid = 61, + WinBuiltinIUsersSid = 62, + WinIUserSid = 63, + WinBuiltinCryptoOperatorsSid = 64, + WinUntrustedLabelSid = 65, + WinLowLabelSid = 66, + WinMediumLabelSid = 67, + WinHighLabelSid = 68, + WinSystemLabelSid = 69, + WinWriteRestrictedCodeSid = 70, + WinCreatorOwnerRightsSid = 71, + WinCacheablePrincipalsGroupSid = 72, + WinNonCacheablePrincipalsGroupSid = 73, + WinEnterpriseReadonlyControllersSid = 74, + WinAccountReadonlyControllersSid = 75, + WinBuiltinEventLogReadersGroup = 76, + WinNewEnterpriseReadonlyControllersSid = 77, + WinBuiltinCertSvcDComAccessGroup = 78, + WinMediumPlusLabelSid = 79, + WinLocalLogonSid = 80, + WinConsoleLogonSid = 81, + WinThisOrganizationCertificateSid = 82, +} WELL_KNOWN_SID_TYPE; -typedef struct _ZONE_HEADER { - SINGLE_LIST_ENTRY FreeList; - SINGLE_LIST_ENTRY SegmentList; - ULONG BlockSize; - ULONG TotalSegmentSize; -} ZONE_HEADER, *PZONE_HEADER; -/* Executive Functions */ +#if defined(_M_IX86) + +#define PAUSE_PROCESSOR YieldProcessor(); + +#define KERNEL_STACK_SIZE 12288 +#define KERNEL_LARGE_STACK_SIZE 61440 +#define KERNEL_LARGE_STACK_COMMIT 12288 + +#define SIZE_OF_80387_REGISTERS 80 + +#if !defined(RC_INVOKED) + +#define CONTEXT_i386 0x10000 +#define CONTEXT_i486 0x10000 +#define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L) +#define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L) +#define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L) +#define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L) +#define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L) +#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L) + +#define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS) +#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | \ + CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | \ + CONTEXT_EXTENDED_REGISTERS) + +#define CONTEXT_XSTATE (CONTEXT_i386 | 0x00000040L) + +#endif /* !defined(RC_INVOKED) */ + +typedef struct _FLOATING_SAVE_AREA { + ULONG ControlWord; + ULONG StatusWord; + ULONG TagWord; + ULONG ErrorOffset; + ULONG ErrorSelector; + ULONG DataOffset; + ULONG DataSelector; + UCHAR RegisterArea[SIZE_OF_80387_REGISTERS]; + ULONG Cr0NpxState; +} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA; + +#include "pshpack4.h" +typedef struct _CONTEXT { + ULONG ContextFlags; + ULONG Dr0; + ULONG Dr1; + ULONG Dr2; + ULONG Dr3; + ULONG Dr6; + ULONG Dr7; + FLOATING_SAVE_AREA FloatSave; + ULONG SegGs; + ULONG SegFs; + ULONG SegEs; + ULONG SegDs; + ULONG Edi; + ULONG Esi; + ULONG Ebx; + ULONG Edx; + ULONG Ecx; + ULONG Eax; + ULONG Ebp; + ULONG Eip; + ULONG SegCs; + ULONG EFlags; + ULONG Esp; + ULONG SegSs; + UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION]; +} CONTEXT; +#include "poppack.h" + +#define KeGetPcr() PCR + +#define PCR_MINOR_VERSION 1 +#define PCR_MAJOR_VERSION 1 + +typedef struct _KPCR { + union { + NT_TIB NtTib; + struct { + struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList; + PVOID Used_StackBase; + PVOID Spare2; + PVOID TssCopy; + ULONG ContextSwitches; + KAFFINITY SetMemberCopy; + PVOID Used_Self; + }; + }; + struct _KPCR *SelfPcr; + struct _KPRCB *Prcb; + KIRQL Irql; + ULONG IRR; + ULONG IrrActive; + ULONG IDR; + PVOID KdVersionBlock; + struct _KIDTENTRY *IDT; + struct _KGDTENTRY *GDT; + struct _KTSS *TSS; + USHORT MajorVersion; + USHORT MinorVersion; + KAFFINITY SetMember; + ULONG StallScaleFactor; + UCHAR SpareUnused; + UCHAR Number; + UCHAR Spare0; + UCHAR SecondLevelCacheAssociativity; + ULONG VdmAlert; + ULONG KernelReserved[14]; + ULONG SecondLevelCacheSize; + ULONG HalReserved[16]; +} KPCR, *PKPCR; + +FORCEINLINE +ULONG +KeGetCurrentProcessorNumber(VOID) +{ + return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number)); +} + + + + + + +extern NTKERNELAPI PVOID MmHighestUserAddress; +extern NTKERNELAPI PVOID MmSystemRangeStart; +extern NTKERNELAPI ULONG MmUserProbeAddress; + +#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress +#define MM_SYSTEM_RANGE_START MmSystemRangeStart +#if defined(_LOCAL_COPY_USER_PROBE_ADDRESS_) +#define MM_USER_PROBE_ADDRESS _LOCAL_COPY_USER_PROBE_ADDRESS_ +extern ULONG _LOCAL_COPY_USER_PROBE_ADDRESS_; +#else +#define MM_USER_PROBE_ADDRESS MmUserProbeAddress +#endif +#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 +#define MM_KSEG0_BASE MM_SYSTEM_RANGE_START +#define MM_SYSTEM_SPACE_END 0xFFFFFFFF +#if !defined (_X86PAE_) +#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000 +#else +#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000 +#endif + +#elif defined(_M_AMD64) + +#define PAUSE_PROCESSOR YieldProcessor(); + +#define KERNEL_STACK_SIZE 0x6000 +#define KERNEL_LARGE_STACK_SIZE 0x12000 +#define KERNEL_LARGE_STACK_COMMIT KERNEL_STACK_SIZE + +#define KERNEL_MCA_EXCEPTION_STACK_SIZE 0x2000 + +#define EXCEPTION_READ_FAULT 0 +#define EXCEPTION_WRITE_FAULT 1 +#define EXCEPTION_EXECUTE_FAULT 8 + +#if !defined(RC_INVOKED) + +#define CONTEXT_AMD64 0x100000 + +#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L) +#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L) +#define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L) +#define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L) +#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L) + +#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT) +#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS) + +#define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L) + +#define CONTEXT_EXCEPTION_ACTIVE 0x8000000 +#define CONTEXT_SERVICE_ACTIVE 0x10000000 +#define CONTEXT_EXCEPTION_REQUEST 0x40000000 +#define CONTEXT_EXCEPTION_REPORTING 0x80000000 + +#endif /* !defined(RC_INVOKED) */ + +#define INITIAL_MXCSR 0x1f80 +#define INITIAL_FPCSR 0x027f + +typedef struct DECLSPEC_ALIGN(16) _CONTEXT { + ULONG64 P1Home; + ULONG64 P2Home; + ULONG64 P3Home; + ULONG64 P4Home; + ULONG64 P5Home; + ULONG64 P6Home; + ULONG ContextFlags; + ULONG MxCsr; + USHORT SegCs; + USHORT SegDs; + USHORT SegEs; + USHORT SegFs; + USHORT SegGs; + USHORT SegSs; + ULONG EFlags; + ULONG64 Dr0; + ULONG64 Dr1; + ULONG64 Dr2; + ULONG64 Dr3; + ULONG64 Dr6; + ULONG64 Dr7; + ULONG64 Rax; + ULONG64 Rcx; + ULONG64 Rdx; + ULONG64 Rbx; + ULONG64 Rsp; + ULONG64 Rbp; + ULONG64 Rsi; + ULONG64 Rdi; + ULONG64 R8; + ULONG64 R9; + ULONG64 R10; + ULONG64 R11; + ULONG64 R12; + ULONG64 R13; + ULONG64 R14; + ULONG64 R15; + ULONG64 Rip; + union { + XMM_SAVE_AREA32 FltSave; + struct { + M128A Header[2]; + M128A Legacy[8]; + M128A Xmm0; + M128A Xmm1; + M128A Xmm2; + M128A Xmm3; + M128A Xmm4; + M128A Xmm5; + M128A Xmm6; + M128A Xmm7; + M128A Xmm8; + M128A Xmm9; + M128A Xmm10; + M128A Xmm11; + M128A Xmm12; + M128A Xmm13; + M128A Xmm14; + M128A Xmm15; + } DUMMYSTRUCTNAME; + } DUMMYUNIONNAME; + M128A VectorRegister[26]; + ULONG64 VectorControl; + ULONG64 DebugControl; + ULONG64 LastBranchToRip; + ULONG64 LastBranchFromRip; + ULONG64 LastExceptionToRip; + ULONG64 LastExceptionFromRip; +} CONTEXT; + +#define PCR_MINOR_VERSION 1 +#define PCR_MAJOR_VERSION 1 + +typedef struct _KPCR +{ + _ANONYMOUS_UNION union + { + NT_TIB NtTib; + _ANONYMOUS_STRUCT struct + { + union _KGDTENTRY64 *GdtBase; + struct _KTSS64 *TssBase; + ULONG64 UserRsp; + struct _KPCR *Self; + struct _KPRCB *CurrentPrcb; + PKSPIN_LOCK_QUEUE LockArray; + PVOID Used_Self; + }; + }; + union _KIDTENTRY64 *IdtBase; + ULONG64 Unused[2]; + KIRQL Irql; + UCHAR SecondLevelCacheAssociativity; + UCHAR ObsoleteNumber; + UCHAR Fill0; + ULONG Unused0[3]; + USHORT MajorVersion; + USHORT MinorVersion; + ULONG StallScaleFactor; + PVOID Unused1[3]; + ULONG KernelReserved[15]; + ULONG SecondLevelCacheSize; + ULONG HalReserved[16]; + ULONG Unused2; + PVOID KdVersionBlock; + PVOID Unused3; + ULONG PcrAlign1[24]; +} KPCR, *PKPCR; + +FORCEINLINE +PKPCR +KeGetPcr(VOID) +{ + return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self)); +} + +FORCEINLINE +ULONG +KeGetCurrentProcessorNumber(VOID) +{ + return (ULONG)__readgsword(0x184); +} + + +#define PTI_SHIFT 12L +#define PDI_SHIFT 21L +#define PPI_SHIFT 30L +#define PXI_SHIFT 39L +#define PTE_PER_PAGE 512 +#define PDE_PER_PAGE 512 +#define PPE_PER_PAGE 512 +#define PXE_PER_PAGE 512 +#define PTI_MASK_AMD64 (PTE_PER_PAGE - 1) +#define PDI_MASK_AMD64 (PDE_PER_PAGE - 1) +#define PPI_MASK (PPE_PER_PAGE - 1) +#define PXI_MASK (PXE_PER_PAGE - 1) + +#define PXE_BASE 0xFFFFF6FB7DBED000ULL +#define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL +#define PPE_BASE 0xFFFFF6FB7DA00000ULL +#define PDE_BASE 0xFFFFF6FB40000000ULL +#define PTE_BASE 0xFFFFF68000000000ULL +#define PXE_TOP 0xFFFFF6FB7DBEDFFFULL +#define PPE_TOP 0xFFFFF6FB7DBFFFFFULL +#define PDE_TOP 0xFFFFF6FB7FFFFFFFULL +#define PTE_TOP 0xFFFFF6FFFFFFFFFFULL + +extern NTKERNELAPI PVOID MmHighestUserAddress; +extern NTKERNELAPI PVOID MmSystemRangeStart; +extern NTKERNELAPI ULONG64 MmUserProbeAddress; + +#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress +#define MM_SYSTEM_RANGE_START MmSystemRangeStart +#define MM_USER_PROBE_ADDRESS MmUserProbeAddress +#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000 +#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFF080000000000ULL + + +#elif defined(_M_IA64) + +#elif defined(_M_PPC) + + +#elif defined(_M_MIPS) + +#elif defined(_M_ARM) +#else +#error Unknown Architecture +#endif + +/****************************************************************************** + * Executive Functions * + ******************************************************************************/ static __inline PVOID ExAllocateFromZone( IN PZONE_HEADER Zone) @@ -1674,8 +3303,36 @@ ExFreeToZone( #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite #define ExReleaseResourceForThread ExReleaseResourceForThreadLite -#if (NTDDI_VERSION >= NTDDI_WIN2K) +typedef enum _INTERLOCKED_RESULT { + ResultNegative = RESULT_NEGATIVE, + ResultZero = RESULT_ZERO, + ResultPositive = RESULT_POSITIVE +} INTERLOCKED_RESULT; +#ifdef _X86_ +NTKERNELAPI +INTERLOCKED_RESULT +FASTCALL +Exfi386InterlockedIncrementLong( + IN OUT LONG volatile *Addend); + +NTKERNELAPI +INTERLOCKED_RESULT +FASTCALL +Exfi386InterlockedDecrementLong( + IN PLONG Addend); + +NTKERNELAPI +ULONG +FASTCALL +Exfi386InterlockedExchangeUlong( + IN PULONG Target, + IN ULONG Value); +#endif + + + +#if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI NTSTATUS NTAPI @@ -1712,315 +3369,28 @@ NTKERNELAPI DECLSPEC_NORETURN VOID NTAPI -ExRaiseAccessViolation( - VOID); +ExRaiseAccessViolation(VOID); NTKERNELAPI DECLSPEC_NORETURN VOID NTAPI -ExRaiseDatatypeMisalignment( - VOID); +ExRaiseDatatypeMisalignment(VOID); -#endif -#ifdef _X86_ +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ -NTKERNELAPI -INTERLOCKED_RESULT -FASTCALL -Exfi386InterlockedIncrementLong( - IN OUT LONG volatile *Addend); - -NTKERNELAPI -INTERLOCKED_RESULT -FASTCALL -Exfi386InterlockedDecrementLong( - IN PLONG Addend); - -NTKERNELAPI -ULONG -FASTCALL -Exfi386InterlockedExchangeUlong( - IN PULONG Target, - IN ULONG Value); - -#endif /* _X86_ */ - -#ifndef _ARC_DDK_ -#define _ARC_DDK_ -typedef enum _CONFIGURATION_TYPE { - ArcSystem, - CentralProcessor, - FloatingPointProcessor, - PrimaryIcache, - PrimaryDcache, - SecondaryIcache, - SecondaryDcache, - SecondaryCache, - EisaAdapter, - TcAdapter, - ScsiAdapter, - DtiAdapter, - MultiFunctionAdapter, - DiskController, - TapeController, - CdromController, - WormController, - SerialController, - NetworkController, - DisplayController, - ParallelController, - PointerController, - KeyboardController, - AudioController, - OtherController, - DiskPeripheral, - FloppyDiskPeripheral, - TapePeripheral, - ModemPeripheral, - MonitorPeripheral, - PrinterPeripheral, - PointerPeripheral, - KeyboardPeripheral, - TerminalPeripheral, - OtherPeripheral, - LinePeripheral, - NetworkPeripheral, - SystemMemory, - DockingInformation, - RealModeIrqRoutingTable, - RealModePCIEnumeration, - MaximumType -} CONFIGURATION_TYPE, *PCONFIGURATION_TYPE; -#endif /* !_ARC_DDK_ */ - -typedef struct _CONTROLLER_OBJECT { - CSHORT Type; - CSHORT Size; - PVOID ControllerExtension; - KDEVICE_QUEUE DeviceWaitQueue; - ULONG Spare1; - LARGE_INTEGER Spare2; -} CONTROLLER_OBJECT, *PCONTROLLER_OBJECT; - -typedef struct _CONFIGURATION_INFORMATION { - ULONG DiskCount; - ULONG FloppyCount; - ULONG CdRomCount; - ULONG TapeCount; - ULONG ScsiPortCount; - ULONG SerialCount; - ULONG ParallelCount; - BOOLEAN AtDiskPrimaryAddressClaimed; - BOOLEAN AtDiskSecondaryAddressClaimed; - ULONG Version; - ULONG MediumChangerCount; -} CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION; - -typedef -NTSTATUS -(NTAPI *PIO_QUERY_DEVICE_ROUTINE)( - IN PVOID Context, - IN PUNICODE_STRING PathName, - IN INTERFACE_TYPE BusType, - IN ULONG BusNumber, - IN PKEY_VALUE_FULL_INFORMATION *BusInformation, - IN CONFIGURATION_TYPE ControllerType, - IN ULONG ControllerNumber, - IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation, - IN CONFIGURATION_TYPE PeripheralType, - IN ULONG PeripheralNumber, - IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation); - -typedef -VOID -(NTAPI DRIVER_REINITIALIZE)( - IN struct _DRIVER_OBJECT *DriverObject, - IN PVOID Context, - IN ULONG Count); - -typedef DRIVER_REINITIALIZE *PDRIVER_REINITIALIZE; - -/** Filesystem runtime library routines **/ - -#if (NTDDI_VERSION >= NTDDI_WIN2K) -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsTotalDeviceFailure( - IN NTSTATUS Status); -#endif - -/* Hardware Abstraction Layer Types */ - -typedef VOID -(NTAPI *PciPin2Line)( - IN struct _BUS_HANDLER *BusHandler, - IN struct _BUS_HANDLER *RootHandler, - IN PCI_SLOT_NUMBER SlotNumber, - IN PPCI_COMMON_CONFIG PciData); - -typedef VOID -(NTAPI *PciLine2Pin)( - IN struct _BUS_HANDLER *BusHandler, - IN struct _BUS_HANDLER *RootHandler, - IN PCI_SLOT_NUMBER SlotNumber, - IN PPCI_COMMON_CONFIG PciNewData, - IN PPCI_COMMON_CONFIG PciOldData); - -typedef VOID -(NTAPI *PciReadWriteConfig)( - IN struct _BUS_HANDLER *BusHandler, - IN PCI_SLOT_NUMBER Slot, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -#define PCI_DATA_TAG ' ICP' -#define PCI_DATA_VERSION 1 - -typedef struct _PCIBUSDATA { - ULONG Tag; - ULONG Version; - PciReadWriteConfig ReadConfig; - PciReadWriteConfig WriteConfig; - PciPin2Line Pin2Line; - PciLine2Pin Line2Pin; - PCI_SLOT_NUMBER ParentSlot; - PVOID Reserved[4]; -} PCIBUSDATA, *PPCIBUSDATA; /* Hardware Abstraction Layer Functions */ -#if !defined(NO_LEGACY_DRIVERS) - #if (NTDDI_VERSION >= NTDDI_WIN2K) -NTHALAPI -NTSTATUS -NTAPI -HalAssignSlotResources( - IN PUNICODE_STRING RegistryPath, - IN PUNICODE_STRING DriverClassName, - IN PDRIVER_OBJECT DriverObject, - IN PDEVICE_OBJECT DeviceObject, - IN INTERFACE_TYPE BusType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN OUT PCM_RESOURCE_LIST *AllocatedResources); +#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) -NTHALAPI -ULONG -NTAPI -HalGetInterruptVector( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber, - IN ULONG BusInterruptLevel, - IN ULONG BusInterruptVector, - OUT PKIRQL Irql, - OUT PKAFFINITY Affinity); +/* Nothing here */ -NTHALAPI -ULONG -NTAPI -HalSetBusData( - IN BUS_DATA_TYPE BusDataType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN PVOID Buffer, - IN ULONG Length); +#else /* USE_DMA_MACROS ... */ -#endif - -#endif /* !defined(NO_LEGACY_DRIVERS) */ - -#if (NTDDI_VERSION >= NTDDI_WIN2K) - -NTHALAPI -PADAPTER_OBJECT -NTAPI -HalGetAdapter( - IN PDEVICE_DESCRIPTION DeviceDescription, - IN OUT PULONG NumberOfMapRegisters); - -NTHALAPI -BOOLEAN -NTAPI -HalMakeBeep( - IN ULONG Frequency); - -VOID -NTAPI -HalPutDmaAdapter( - IN PADAPTER_OBJECT DmaAdapter); - -NTHALAPI -VOID -NTAPI -HalAcquireDisplayOwnership( - IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters); - -NTHALAPI -ULONG -NTAPI -HalGetBusData( - IN BUS_DATA_TYPE BusDataType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - OUT PVOID Buffer, - IN ULONG Length); - -NTHALAPI -ULONG -NTAPI -HalGetBusDataByOffset( - IN BUS_DATA_TYPE BusDataType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - OUT PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -NTHALAPI -ULONG -NTAPI -HalSetBusDataByOffset( - IN BUS_DATA_TYPE BusDataType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); - -NTHALAPI -BOOLEAN -NTAPI -HalTranslateBusAddress( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber, - IN PHYSICAL_ADDRESS BusAddress, - IN OUT PULONG AddressSpace, - OUT PPHYSICAL_ADDRESS TranslatedAddress); - -#endif - -#if (NTDDI_VERSION >= NTDDI_WINXP) -NTKERNELAPI -VOID -FASTCALL -HalExamineMBR( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG MBRTypeIdentifier, - OUT PVOID *Buffer); -#endif - -#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) -// nothing here -#else - -#if (NTDDI_VERSION >= NTDDI_WIN2K) //DECLSPEC_DEPRECATED_DDK NTHALAPI VOID @@ -2086,12 +3456,207 @@ HalAllocateAdapterChannel( IN ULONG NumberOfMapRegisters, IN PDRIVER_CONTROL ExecutionRoutine); +#endif /* USE_DMA_MACROS ... */ + +#if !defined(NO_LEGACY_DRIVERS) +NTHALAPI +NTSTATUS +NTAPI +HalAssignSlotResources( + IN PUNICODE_STRING RegistryPath, + IN PUNICODE_STRING DriverClassName, + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT DeviceObject, + IN INTERFACE_TYPE BusType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN OUT PCM_RESOURCE_LIST *AllocatedResources); + +NTHALAPI +ULONG +NTAPI +HalGetInterruptVector( + IN INTERFACE_TYPE InterfaceType, + IN ULONG BusNumber, + IN ULONG BusInterruptLevel, + IN ULONG BusInterruptVector, + OUT PKIRQL Irql, + OUT PKAFFINITY Affinity); + +NTHALAPI +ULONG +NTAPI +HalSetBusData( + IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Length); + +NTHALAPI +ULONG +NTAPI +HalGetBusData( + IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + OUT PVOID Buffer, + IN ULONG Length); + +NTHALAPI +BOOLEAN +NTAPI +HalMakeBeep( + IN ULONG Frequency); +#endif /* !defined(NO_LEGACY_DRIVERS) */ + +NTHALAPI +PADAPTER_OBJECT +NTAPI +HalGetAdapter( + IN PDEVICE_DESCRIPTION DeviceDescription, + OUT PULONG NumberOfMapRegisters); + +VOID +NTAPI +HalPutDmaAdapter( + IN PADAPTER_OBJECT DmaAdapter); + +NTHALAPI +VOID +NTAPI +HalAcquireDisplayOwnership( + IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters); + +NTHALAPI +ULONG +NTAPI +HalGetBusDataByOffset( + IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + OUT PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +NTHALAPI +ULONG +NTAPI +HalSetBusDataByOffset( + IN BUS_DATA_TYPE BusDataType, + IN ULONG BusNumber, + IN ULONG SlotNumber, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +NTHALAPI +BOOLEAN +NTAPI +HalTranslateBusAddress( + IN INTERFACE_TYPE InterfaceType, + IN ULONG BusNumber, + IN PHYSICAL_ADDRESS BusAddress, + IN OUT PULONG AddressSpace, + OUT PPHYSICAL_ADDRESS TranslatedAddress); + +NTHALAPI +PVOID +NTAPI +HalAllocateCrashDumpRegisters( + IN PADAPTER_OBJECT AdapterObject, + IN OUT PULONG NumberOfMapRegisters); + +NTSTATUS +NTAPI +HalGetScatterGatherList( + IN PADAPTER_OBJECT DmaAdapter, + IN PDEVICE_OBJECT DeviceObject, + IN PMDL Mdl, + IN PVOID CurrentVa, + IN ULONG Length, + IN PDRIVER_LIST_CONTROL ExecutionRoutine, + IN PVOID Context, + IN BOOLEAN WriteToDevice); + +VOID +NTAPI +HalPutScatterGatherList( + IN PADAPTER_OBJECT DmaAdapter, + IN PSCATTER_GATHER_LIST ScatterGather, + IN BOOLEAN WriteToDevice); + #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ -#endif /* defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) */ +#if (NTDDI_VERSION >= NTDDI_WINXP) +NTKERNELAPI +VOID +FASTCALL +HalExamineMBR( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG MBRTypeIdentifier, + OUT PVOID *Buffer); +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ -/* I/O Manager Functions */ +#if (NTDDI_VERSION >= NTDDI_WIN7) +NTSTATUS +NTAPI +HalAllocateHardwareCounters( + IN PGROUP_AFFINITY GroupAffinty, + IN ULONG GroupCount, + IN PPHYSICAL_COUNTER_RESOURCE_LIST ResourceList, + OUT PHANDLE CounterSetHandle); + +NTSTATUS +NTAPI +HalFreeHardwareCounters( + IN HANDLE CounterSetHandle); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + +#if defined(_IA64_) +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTHALAPI +ULONG +NTAPI +HalGetDmaAlignmentRequirement(VOID); +#endif +#endif /* defined(_IA64_) */ + +#if defined(_M_IX86) || defined(_M_AMD64) +#define HalGetDmaAlignmentRequirement() 1L +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +typedef struct _WHEA_ERROR_SOURCE_DESCRIPTOR *PWHEA_ERROR_SOURCE_DESCRIPTOR; +typedef struct _WHEA_ERROR_RECORD *PWHEA_ERROR_RECORD; + +NTHALAPI +VOID +NTAPI +HalBugCheckSystem( + IN PWHEA_ERROR_SOURCE_DESCRIPTOR ErrorSource, + IN PWHEA_ERROR_RECORD ErrorRecord); + +#else + +typedef struct _WHEA_ERROR_RECORD *PWHEA_ERROR_RECORD; + +NTHALAPI +VOID +NTAPI +HalBugCheckSystem( + IN PWHEA_ERROR_RECORD ErrorRecord); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + + +/****************************************************************************** + * I/O Manager Functions * + ******************************************************************************/ /* * VOID IoAssignArcName( * IN PUNICODE_STRING ArcName, @@ -2107,8 +3672,19 @@ HalAllocateAdapterChannel( */ #define IoDeassignArcName IoDeleteSymbolicLink -#if (NTDDI_VERSION >= NTDDI_WIN2K) +VOID +FORCEINLINE +NTAPI +IoInitializeDriverCreateContext( + PIO_DRIVER_CREATE_CONTEXT DriverContext) +{ + RtlZeroMemory(DriverContext, sizeof(IO_DRIVER_CREATE_CONTEXT)); + DriverContext->Size = sizeof(IO_DRIVER_CREATE_CONTEXT); +} + + +#if (NTDDI_VERSION >= NTDDI_WIN2K) #if !(defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)) NTKERNELAPI NTSTATUS @@ -2121,6 +3697,7 @@ IoAllocateAdapterChannel( IN PVOID Context); #endif +#if !defined(DMA_MACROS_DEFINED) //DECLSPEC_DEPRECATED_DDK NTHALAPI PHYSICAL_ADDRESS @@ -2132,6 +3709,7 @@ IoMapTransfer( IN PVOID CurrentVa, IN OUT PULONG Length, IN BOOLEAN WriteToDevice); +#endif NTKERNELAPI VOID @@ -2163,8 +3741,7 @@ IoFreeController( NTKERNELAPI PCONFIGURATION_INFORMATION NTAPI -IoGetConfigurationInformation( - VOID); +IoGetConfigurationInformation(VOID); NTKERNELAPI PDEVICE_OBJECT @@ -2182,8 +3759,7 @@ IoCancelFileOpen( NTKERNELAPI PGENERIC_MAPPING NTAPI -IoGetFileObjectGenericMapping( - VOID); +IoGetFileObjectGenericMapping(VOID); NTKERNELAPI PIRP @@ -2255,7 +3831,7 @@ IoReportDetectedDevice( IN PCM_RESOURCE_LIST ResourceList OPTIONAL, IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL, IN BOOLEAN ResourceAssigned, - IN OUT PDEVICE_OBJECT *DeviceObject); + IN OUT PDEVICE_OBJECT *DeviceObject OPTIONAL); NTKERNELAPI NTSTATUS @@ -2301,9 +3877,59 @@ IoAssignResources( IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources OPTIONAL, IN OUT PCM_RESOURCE_LIST *AllocatedResources); +NTKERNELAPI +BOOLEAN +NTAPI +IoSetThreadHardErrorMode( + IN BOOLEAN EnableHardErrors); + #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ +#if (NTDDI_VERSION >= NTDDI_WIN2KSP3) + +NTKERNELAPI +BOOLEAN +NTAPI +IoIsFileOriginRemote( + IN PFILE_OBJECT FileObject); + +NTKERNELAPI +NTSTATUS +NTAPI +IoSetFileOrigin( + IN PFILE_OBJECT FileObject, + IN BOOLEAN Remote); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2KSP3) */ + #if (NTDDI_VERSION >= NTDDI_WINXP) +NTKERNELAPI +NTSTATUS +FASTCALL +IoReadPartitionTable( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN BOOLEAN ReturnRecognizedPartitions, + OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer); + +NTKERNELAPI +NTSTATUS +FASTCALL +IoSetPartitionInformation( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG PartitionNumber, + IN ULONG PartitionType); + +NTKERNELAPI +NTSTATUS +FASTCALL +IoWritePartitionTable( + IN PDEVICE_OBJECT DeviceObject, + IN ULONG SectorSize, + IN ULONG SectorsPerTrack, + IN ULONG NumberOfHeads, + IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); NTKERNELAPI NTSTATUS @@ -2320,30 +3946,12 @@ IoReadDiskSignature( IN ULONG BytesPerSector, OUT PDISK_SIGNATURE Signature); -NTKERNELAPI -NTSTATUS -FASTCALL -IoReadPartitionTable( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN BOOLEAN ReturnRecognizedPartitions, - OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer); - NTKERNELAPI NTSTATUS NTAPI IoReadPartitionTableEx( IN PDEVICE_OBJECT DeviceObject, - IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer); - -NTKERNELAPI -NTSTATUS -FASTCALL -IoSetPartitionInformation( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG PartitionNumber, - IN ULONG PartitionType); + OUT struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer); NTKERNELAPI NTSTATUS @@ -2359,12 +3967,6 @@ NTAPI IoSetSystemPartition( IN PUNICODE_STRING VolumeNameString); -NTKERNELAPI -BOOLEAN -NTAPI -IoSetThreadHardErrorMode( - IN BOOLEAN EnableHardErrors); - NTKERNELAPI NTSTATUS NTAPI @@ -2379,16 +3981,6 @@ IoVolumeDeviceToDosName( IN PVOID VolumeDeviceObject, OUT PUNICODE_STRING DosName); -NTKERNELAPI -NTSTATUS -FASTCALL -IoWritePartitionTable( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG SectorsPerTrack, - IN ULONG NumberOfHeads, - IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); - NTKERNELAPI NTSTATUS NTAPI @@ -2396,6 +3988,26 @@ IoWritePartitionTableEx( IN PDEVICE_OBJECT DeviceObject, IN struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout); +NTKERNELAPI +NTSTATUS +NTAPI +IoCreateFileSpecifyDeviceObjectHint( + OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER AllocationSize OPTIONAL, + IN ULONG FileAttributes, + IN ULONG ShareAccess, + IN ULONG Disposition, + IN ULONG CreateOptions, + IN PVOID EaBuffer OPTIONAL, + IN ULONG EaLength, + IN CREATE_FILE_TYPE CreateFileType, + IN PVOID InternalParameters OPTIONAL, + IN ULONG Options, + IN PVOID DeviceObject OPTIONAL); + NTKERNELAPI NTSTATUS NTAPI @@ -2406,8 +4018,100 @@ IoAttachDeviceToDeviceStackSafe( #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ -/** Kernel debugger routines **/ +#if (NTDDI_VERSION >= NTDDI_WS03) +NTKERNELAPI +IO_PAGING_PRIORITY +FASTCALL +IoGetPagingIoPriority( + IN PIRP Irp); + +#endif /* (NTDDI_VERSION >= NTDDI_WS03) */ + +#if (NTDDI_VERSION >= NTDDI_WS03SP1) +BOOLEAN +NTAPI +IoTranslateBusAddress( + IN INTERFACE_TYPE InterfaceType, + IN ULONG BusNumber, + IN PHYSICAL_ADDRESS BusAddress, + IN OUT PULONG AddressSpace, + OUT PPHYSICAL_ADDRESS TranslatedAddress); +#endif + +#if (NTDDI_VERSION >= NTDDI_VISTA) +NTKERNELAPI +NTSTATUS +NTAPI +IoUpdateDiskGeometry( + IN PDEVICE_OBJECT DeviceObject, + IN struct _DISK_GEOMETRY_EX* OldDiskGeometry, + IN struct _DISK_GEOMETRY_EX* NewDiskGeometry); + +PTXN_PARAMETER_BLOCK +NTAPI +IoGetTransactionParameterBlock( + IN PFILE_OBJECT FileObject); + +NTKERNELAPI +NTSTATUS +NTAPI +IoCreateFileEx( + OUT PHANDLE FileHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER AllocationSize OPTIONAL, + IN ULONG FileAttributes, + IN ULONG ShareAccess, + IN ULONG Disposition, + IN ULONG CreateOptions, + IN PVOID EaBuffer OPTIONAL, + IN ULONG EaLength, + IN CREATE_FILE_TYPE CreateFileType, + IN PVOID InternalParameters OPTIONAL, + IN ULONG Options, + IN PIO_DRIVER_CREATE_CONTEXT DriverContext OPTIONAL); + +NTSTATUS +NTAPI +IoSetIrpExtraCreateParameter( + IN OUT PIRP Irp, + IN struct _ECP_LIST *ExtraCreateParameter); + +VOID +NTAPI +IoClearIrpExtraCreateParameter( + IN OUT PIRP Irp); + +NTSTATUS +NTAPI +IoGetIrpExtraCreateParameter( + IN PIRP Irp, + OUT struct _ECP_LIST **ExtraCreateParameter OPTIONAL); + +BOOLEAN +NTAPI +IoIsFileObjectIgnoringSharing( + IN PFILE_OBJECT FileObject); + + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + + +#if (NTDDI_VERSION >= NTDDI_WIN7) +NTSTATUS +NTAPI +IoSetFileObjectIgnoreSharing( + IN PFILE_OBJECT FileObject); + + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + + +/****************************************************************************** + * Kernel Debugger Functions * + ******************************************************************************/ NTSYSAPI ULONG NTAPI @@ -2416,16 +4120,25 @@ DbgPrompt( OUT PCH Response, IN ULONG MaximumResponseLength); -/* Kernel Functions */ +/****************************************************************************** + * Kernel Functions * + ******************************************************************************/ +NTKERNELAPI +VOID +FASTCALL +KeInvalidateRangeAllCaches( + IN PVOID BaseAddress, + IN ULONG Length); + #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI -DECLSPEC_NORETURN VOID NTAPI -KeBugCheck( - IN ULONG BugCheckCode); +KeSetImportanceDpc( + IN OUT PRKDPC Dpc, + IN KDPC_IMPORTANCE Importance); NTKERNELAPI LONG @@ -2442,24 +4155,204 @@ KeSetBasePriorityThread( IN OUT PRKTHREAD Thread, IN LONG Increment); -#endif +NTKERNELAPI +VOID +NTAPI +KeEnterCriticalRegion(VOID); -/* Memory Manager Types */ +NTKERNELAPI +VOID +NTAPI +KeLeaveCriticalRegion(VOID); -typedef struct _PHYSICAL_MEMORY_RANGE { - PHYSICAL_ADDRESS BaseAddress; - LARGE_INTEGER NumberOfBytes; -} PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE; +NTKERNELAPI +DECLSPEC_NORETURN +VOID +NTAPI +KeBugCheck( + IN ULONG BugCheckCode); -/* Memory Manager Functions */ + +#if defined(SINGLE_GROUP_LEGACY_API) + + +NTKERNELAPI +VOID +NTAPI +KeSetTargetProcessorDpc( + IN OUT PRKDPC Dpc, + IN CCHAR Number); + +NTKERNELAPI +KAFFINITY +NTAPI +KeQueryActiveProcessors(VOID); + +#endif /* defined(SINGLE_GROUP_LEGACY_API) */ + + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +#if (NTDDI_VERSION >= NTDDI_WINXP) +NTKERNELAPI +BOOLEAN +NTAPI +KeAreApcsDisabled(VOID); + + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + + +#if (NTDDI_VERSION >= NTDDI_WS03) + + +NTKERNELAPI +BOOLEAN +NTAPI +KeInvalidateAllCaches(VOID); + +#endif /* (NTDDI_VERSION >= NTDDI_WS03) */ + +#if (NTDDI_VERSION >= NTDDI_WS03SP1) + +NTKERNELAPI +NTSTATUS +NTAPI +KeExpandKernelStackAndCallout( + IN PEXPAND_STACK_CALLOUT Callout, + IN PVOID Parameter OPTIONAL, + IN SIZE_T Size); + +NTKERNELAPI +VOID +NTAPI +KeEnterGuardedRegion(VOID); + +NTKERNELAPI +VOID +NTAPI +KeLeaveGuardedRegion(VOID); + + +#endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */ + +#if (NTDDI_VERSION >= NTDDI_VISTA) + + +#if defined(SINGLE_GROUP_LEGACY_API) +NTKERNELAPI +ULONG +NTAPI +KeQueryActiveProcessorCount( + OUT PKAFFINITY ActiveProcessors OPTIONAL); + +NTKERNELAPI +ULONG +NTAPI +KeQueryMaximumProcessorCount(VOID); + +#endif /* SINGLE_GROUP_LEGACY_API */ + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +NTKERNELAPI +ULONG +NTAPI +KeQueryActiveProcessorCountEx( + IN USHORT GroupNumber); + +NTKERNELAPI +ULONG +NTAPI +KeQueryMaximumProcessorCountEx( + IN USHORT GroupNumber); + +NTKERNELAPI +USHORT +NTAPI +KeQueryActiveGroupCount(VOID); + +NTKERNELAPI +USHORT +NTAPI +KeQueryMaximumGroupCount(VOID); + +NTKERNELAPI +KAFFINITY +NTAPI +KeQueryGroupAffinity( + IN USHORT GroupNumber); + +NTKERNELAPI +ULONG +NTAPI +KeGetCurrentProcessorNumberEx( + OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +KeQueryNodeActiveAffinity( + IN USHORT NodeNumber, + OUT PGROUP_AFFINITY Affinity OPTIONAL, + OUT PUSHORT Count OPTIONAL); + +NTKERNELAPI +USHORT +NTAPI +KeQueryNodeMaximumProcessorCount( + IN USHORT NodeNumber); + +NTKERNELAPI +USHORT +NTAPI +KeQueryHighestNodeNumber(VOID); + +NTKERNELAPI +USHORT +NTAPI +KeGetCurrentNodeNumber(VOID); + +NTKERNELAPI +NTSTATUS +NTAPI +KeQueryLogicalProcessorRelationship( + IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL, + IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType, + OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL, + IN OUT PULONG Length); + +NTKERNELAPI +NTSTATUS +NTAPI +KeSetHardwareCounterConfiguration( + IN PHARDWARE_COUNTER CounterArray, + IN ULONG Count); + +NTKERNELAPI +NTSTATUS +NTAPI +KeQueryHardwareCounterConfiguration( + OUT PHARDWARE_COUNTER CounterArray, + IN ULONG MaximumCount, + OUT PULONG Count); + + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + + +/****************************************************************************** + * Memory manager Functions * + ******************************************************************************/ #if (NTDDI_VERSION >= NTDDI_WIN2K) - NTKERNELAPI PPHYSICAL_MEMORY_RANGE NTAPI -MmGetPhysicalMemoryRanges( - VOID); +MmGetPhysicalMemoryRanges(VOID); NTKERNELAPI PHYSICAL_ADDRESS @@ -2533,8 +4426,7 @@ MmIsAddressValid( NTKERNELAPI BOOLEAN NTAPI -MmIsThisAnNtAsSystem( - VOID); +MmIsThisAnNtAsSystem(VOID); NTKERNELAPI VOID @@ -2582,9 +4474,144 @@ MmUnmapVideoDisplay( IN PVOID BaseAddress, IN SIZE_T NumberOfBytes); +NTKERNELAPI +NTSTATUS +NTAPI +MmAddPhysicalMemory( + IN PPHYSICAL_ADDRESS StartAddress, + IN OUT PLARGE_INTEGER NumberOfBytes); + +NTKERNELAPI +PVOID +NTAPI +MmAllocateContiguousMemory( + IN SIZE_T NumberOfBytes, + IN PHYSICAL_ADDRESS HighestAcceptableAddress); + +NTKERNELAPI +PVOID +NTAPI +MmAllocateContiguousMemorySpecifyCache( + IN SIZE_T NumberOfBytes, + IN PHYSICAL_ADDRESS LowestAcceptableAddress, + IN PHYSICAL_ADDRESS HighestAcceptableAddress, + IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL, + IN MEMORY_CACHING_TYPE CacheType); + +NTKERNELAPI +PVOID +NTAPI +MmAllocateContiguousMemorySpecifyCacheNode( + IN SIZE_T NumberOfBytes, + IN PHYSICAL_ADDRESS LowestAcceptableAddress, + IN PHYSICAL_ADDRESS HighestAcceptableAddress, + IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL, + IN MEMORY_CACHING_TYPE CacheType, + IN NODE_REQUIREMENT PreferredNode); + +NTKERNELAPI +VOID +NTAPI +MmFreeContiguousMemory( + IN PVOID BaseAddress); + +NTKERNELAPI +VOID +NTAPI +MmFreeContiguousMemorySpecifyCache( + IN PVOID BaseAddress, + IN SIZE_T NumberOfBytes, + IN MEMORY_CACHING_TYPE CacheType); + + #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ -/* NtXxx Functions */ +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTKERNELAPI +NTSTATUS +NTAPI +MmAdvanceMdl( + IN OUT PMDL Mdl, + IN ULONG NumberOfBytes); + +NTKERNELAPI +PVOID +NTAPI +MmAllocateMappingAddress( + IN SIZE_T NumberOfBytes, + IN ULONG PoolTag); + +NTKERNELAPI +VOID +NTAPI +MmFreeMappingAddress( + IN PVOID BaseAddress, + IN ULONG PoolTag); + +NTKERNELAPI +NTSTATUS +NTAPI +MmIsVerifierEnabled( + OUT PULONG VerifierFlags); + +NTKERNELAPI +PVOID +NTAPI +MmMapLockedPagesWithReservedMapping( + IN PVOID MappingAddress, + IN ULONG PoolTag, + IN PMDL MemoryDescriptorList, + IN MEMORY_CACHING_TYPE CacheType); + +NTKERNELAPI +NTSTATUS +NTAPI +MmProtectMdlSystemAddress( + IN PMDL MemoryDescriptorList, + IN ULONG NewProtect); + +NTKERNELAPI +VOID +NTAPI +MmUnmapReservedMapping( + IN PVOID BaseAddress, + IN ULONG PoolTag, + IN PMDL MemoryDescriptorList); + +NTKERNELAPI +NTSTATUS +NTAPI +MmAddVerifierThunks( + IN PVOID ThunkBuffer, + IN ULONG ThunkBufferSize); + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +#if (NTDDI_VERSION >= NTDDI_WS03) +NTKERNELAPI +NTSTATUS +NTAPI +MmCreateMirror(VOID); +#endif + + +#if (NTDDI_VERSION >= NTDDI_VISTA) +NTSTATUS +NTAPI +MmRotatePhysicalView( + IN PVOID VirtualAddress, + IN OUT PSIZE_T NumberOfBytes, + IN PMDLX NewMdl OPTIONAL, + IN MM_ROTATE_DIRECTION Direction, + IN PMM_ROTATE_COPY_CALLBACK_FUNCTION CopyFunction, + IN PVOID Context OPTIONAL); + +#endif + +/****************************************************************************** + * Process Manager Functions * + ******************************************************************************/ NTSYSCALLAPI NTSTATUS @@ -2605,35 +4632,15 @@ NtQueryInformationProcess( IN ULONG ProcessInformationLength, OUT PULONG ReturnLength OPTIONAL); -/** Process manager types **/ - -typedef VOID -(NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)( - IN HANDLE ParentId, - IN HANDLE ProcessId, - IN BOOLEAN Create); - -typedef VOID -(NTAPI *PCREATE_THREAD_NOTIFY_ROUTINE)( - IN HANDLE ProcessId, - IN HANDLE ThreadId, - IN BOOLEAN Create); - -typedef VOID -(NTAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)( - IN PUNICODE_STRING FullImageName, - IN HANDLE ProcessId, - IN PIMAGE_INFO ImageInfo); - -/** Process manager routines **/ - #if (NTDDI_VERSION >= NTDDI_WIN2K) + NTKERNELAPI NTSTATUS NTAPI -PsSetLoadImageNotifyRoutine( - IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); +PsSetCreateProcessNotifyRoutine( + IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, + IN BOOLEAN Remove); NTKERNELAPI NTSTATUS @@ -2644,21 +4651,18 @@ PsSetCreateThreadNotifyRoutine( NTKERNELAPI NTSTATUS NTAPI -PsSetCreateProcessNotifyRoutine( - IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, - IN BOOLEAN Remove); +PsSetLoadImageNotifyRoutine( + IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); NTKERNELAPI HANDLE NTAPI -PsGetCurrentProcessId( - VOID); +PsGetCurrentProcessId(VOID); NTKERNELAPI HANDLE NTAPI -PsGetCurrentThreadId( - VOID); +PsGetCurrentThreadId(VOID); NTKERNELAPI BOOLEAN @@ -2679,6 +4683,12 @@ NTAPI PsGetProcessId( IN PEPROCESS Process); +NTKERNELAPI +HANDLE +NTAPI +PsGetThreadId( + IN PETHREAD Thread); + NTKERNELAPI NTSTATUS NTAPI @@ -2691,102 +4701,187 @@ NTAPI PsRemoveLoadImageNotifyRoutine( IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); +NTKERNELAPI +LONGLONG +NTAPI +PsGetProcessCreateTimeQuadPart( + IN PEPROCESS Process); + #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ -extern NTKERNELAPI PEPROCESS PsInitialSystemProcess; +#if (NTDDI_VERSION >= NTDDI_WS03) +NTKERNELAPI +HANDLE +NTAPI +PsGetThreadProcessId( + IN PETHREAD Thread); +#endif /* (NTDDI_VERSION >= NTDDI_WS03) */ -/* RTL Types */ +#if (NTDDI_VERSION >= NTDDI_VISTA) -typedef struct _RTL_SPLAY_LINKS { - struct _RTL_SPLAY_LINKS *Parent; - struct _RTL_SPLAY_LINKS *LeftChild; - struct _RTL_SPLAY_LINKS *RightChild; -} RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS; +NTKERNELAPI +BOOLEAN +NTAPI +PsSetCurrentThreadPrefetching( + IN BOOLEAN Prefetching); -/* RTL Functions */ +NTKERNELAPI +BOOLEAN +NTAPI +PsIsCurrentThreadPrefetching(VOID); -#if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_) +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ -#define RtlGetCallersAddress(CallersAddress, CallersCaller) \ - *CallersAddress = (PVOID)_ReturnAddress(); \ - *CallersCaller = NULL; -#else +#if (NTDDI_VERSION >= NTDDI_VISTASP1) +NTKERNELAPI +NTSTATUS +NTAPI +PsSetCreateProcessNotifyRoutineEx( + IN PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine, + IN BOOLEAN Remove); +#endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */ +/****************************************************************************** + * Runtime Library Functions * + ******************************************************************************/ #if (NTDDI_VERSION >= NTDDI_WIN2K) + + + +#ifndef RTL_USE_AVL_TABLES + NTSYSAPI VOID NTAPI -RtlGetCallersAddress( - OUT PVOID *CallersAddress, - OUT PVOID *CallersCaller); -#endif +RtlInitializeGenericTable( + OUT PRTL_GENERIC_TABLE Table, + IN PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine, + IN PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine, + IN PRTL_GENERIC_FREE_ROUTINE FreeRoutine, + IN PVOID TableContext OPTIONAL); -#endif - -#if !defined(MIDL_PASS) - -FORCEINLINE -LUID -NTAPI_INLINE -RtlConvertLongToLuid( - IN LONG Val) -{ - LUID Luid; - LARGE_INTEGER Temp; - - Temp.QuadPart = Val; - Luid.LowPart = Temp.u.LowPart; - Luid.HighPart = Temp.u.HighPart; - return Luid; -} - -FORCEINLINE -LUID -NTAPI_INLINE -RtlConvertUlongToLuid( - IN ULONG Val) -{ - LUID Luid; - - Luid.LowPart = Val; - Luid.HighPart = 0; - return Luid; -} - -#endif - -#if defined(_AMD64_) || defined(_IA64_) -//DECLSPEC_DEPRECATED_DDK_WINXP -__inline -LARGE_INTEGER -NTAPI_INLINE -RtlLargeIntegerDivide( - IN LARGE_INTEGER Dividend, - IN LARGE_INTEGER Divisor, - OUT PLARGE_INTEGER Remainder OPTIONAL) -{ - LARGE_INTEGER ret; - ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart; - if (Remainder) - Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart; - return ret; -} - -#else - -#if (NTDDI_VERSION >= NTDDI_WIN2K) NTSYSAPI -LARGE_INTEGER +PVOID NTAPI -RtlLargeIntegerDivide( - IN LARGE_INTEGER Dividend, - IN LARGE_INTEGER Divisor, - OUT PLARGE_INTEGER Remainder OPTIONAL); -#endif +RtlInsertElementGenericTable( + IN PRTL_GENERIC_TABLE Table, + IN PVOID Buffer, + IN CLONG BufferSize, + OUT PBOOLEAN NewElement OPTIONAL); -#endif /* defined(_AMD64_) || defined(_IA64_) */ +NTSYSAPI +PVOID +NTAPI +RtlInsertElementGenericTableFull( + IN PRTL_GENERIC_TABLE Table, + IN PVOID Buffer, + IN CLONG BufferSize, + OUT PBOOLEAN NewElement OPTIONAL, + IN PVOID NodeOrParent, + IN TABLE_SEARCH_RESULT SearchResult); -#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTSYSAPI +BOOLEAN +NTAPI +RtlDeleteElementGenericTable( + IN PRTL_GENERIC_TABLE Table, + IN PVOID Buffer); + +NTSYSAPI +PVOID +NTAPI +RtlLookupElementGenericTable( + IN PRTL_GENERIC_TABLE Table, + IN PVOID Buffer); + +NTSYSAPI +PVOID +NTAPI +RtlLookupElementGenericTableFull( + IN PRTL_GENERIC_TABLE Table, + IN PVOID Buffer, + OUT PVOID *NodeOrParent, + OUT TABLE_SEARCH_RESULT *SearchResult); + +NTSYSAPI +PVOID +NTAPI +RtlEnumerateGenericTable( + IN PRTL_GENERIC_TABLE Table, + IN BOOLEAN Restart); + +NTSYSAPI +PVOID +NTAPI +RtlEnumerateGenericTableWithoutSplaying( + IN PRTL_GENERIC_TABLE Table, + IN OUT PVOID *RestartKey); + +NTSYSAPI +PVOID +NTAPI +RtlGetElementGenericTable( + IN PRTL_GENERIC_TABLE Table, + IN ULONG I); + +NTSYSAPI +ULONG +NTAPI +RtlNumberGenericTableElements( + IN PRTL_GENERIC_TABLE Table); + +NTSYSAPI +BOOLEAN +NTAPI +RtlIsGenericTableEmpty( + IN PRTL_GENERIC_TABLE Table); + +#endif /* !RTL_USE_AVL_TABLES */ + +#define RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT 8 + +NTSYSAPI +PRTL_SPLAY_LINKS +NTAPI +RtlSplay( + IN OUT PRTL_SPLAY_LINKS Links); + +NTSYSAPI +PRTL_SPLAY_LINKS +NTAPI +RtlDelete( + IN PRTL_SPLAY_LINKS Links); + +NTSYSAPI +VOID +NTAPI +RtlDeleteNoSplay( + IN PRTL_SPLAY_LINKS Links, + IN OUT PRTL_SPLAY_LINKS *Root); + +NTSYSAPI +PRTL_SPLAY_LINKS +NTAPI +RtlSubtreeSuccessor( + IN PRTL_SPLAY_LINKS Links); + +NTSYSAPI +PRTL_SPLAY_LINKS +NTAPI +RtlSubtreePredecessor( + IN PRTL_SPLAY_LINKS Links); + +NTSYSAPI +PRTL_SPLAY_LINKS +NTAPI +RtlRealSuccessor( + IN PRTL_SPLAY_LINKS Links); + +NTSYSAPI +PRTL_SPLAY_LINKS +NTAPI +RtlRealPredecessor( + IN PRTL_SPLAY_LINKS Links); NTSYSAPI BOOLEAN @@ -2845,7 +4940,7 @@ NTAPI RtlCompareString( IN const PSTRING String1, IN const PSTRING String2, - BOOLEAN CaseInSensitive); + IN BOOLEAN CaseInSensitive); NTSYSAPI VOID @@ -2884,9 +4979,513 @@ RtlWalkFrameChain( IN ULONG Count, IN ULONG Flags); + + #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ -/* Security reference monitor routines */ + +#if (NTDDI_VERSION >= NTDDI_WINXP) + + +NTSYSAPI +VOID +NTAPI +RtlInitializeGenericTableAvl( + OUT PRTL_AVL_TABLE Table, + IN PRTL_AVL_COMPARE_ROUTINE CompareRoutine, + IN PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine, + IN PRTL_AVL_FREE_ROUTINE FreeRoutine, + IN PVOID TableContext OPTIONAL); + +NTSYSAPI +PVOID +NTAPI +RtlInsertElementGenericTableAvl( + IN PRTL_AVL_TABLE Table, + IN PVOID Buffer, + IN CLONG BufferSize, + OUT PBOOLEAN NewElement OPTIONAL); + +NTSYSAPI +PVOID +NTAPI +RtlInsertElementGenericTableFullAvl( + IN PRTL_AVL_TABLE Table, + IN PVOID Buffer, + IN CLONG BufferSize, + OUT PBOOLEAN NewElement OPTIONAL, + IN PVOID NodeOrParent, + IN TABLE_SEARCH_RESULT SearchResult); + +NTSYSAPI +BOOLEAN +NTAPI +RtlDeleteElementGenericTableAvl( + IN PRTL_AVL_TABLE Table, + IN PVOID Buffer); + +NTSYSAPI +PVOID +NTAPI +RtlLookupElementGenericTableAvl( + IN PRTL_AVL_TABLE Table, + IN PVOID Buffer); + +NTSYSAPI +PVOID +NTAPI +RtlLookupElementGenericTableFullAvl( + IN PRTL_AVL_TABLE Table, + IN PVOID Buffer, + OUT PVOID *NodeOrParent, + OUT TABLE_SEARCH_RESULT *SearchResult); + +NTSYSAPI +PVOID +NTAPI +RtlEnumerateGenericTableAvl( + IN PRTL_AVL_TABLE Table, + IN BOOLEAN Restart); + +NTSYSAPI +PVOID +NTAPI +RtlEnumerateGenericTableWithoutSplayingAvl( + IN PRTL_AVL_TABLE Table, + IN OUT PVOID *RestartKey); + +NTSYSAPI +PVOID +NTAPI +RtlLookupFirstMatchingElementGenericTableAvl( + IN PRTL_AVL_TABLE Table, + IN PVOID Buffer, + OUT PVOID *RestartKey); + +NTSYSAPI +PVOID +NTAPI +RtlEnumerateGenericTableLikeADirectory( + IN PRTL_AVL_TABLE Table, + IN PRTL_AVL_MATCH_FUNCTION MatchFunction OPTIONAL, + IN PVOID MatchData OPTIONAL, + IN ULONG NextFlag, + IN OUT PVOID *RestartKey, + IN OUT PULONG DeleteCount, + IN PVOID Buffer); + +NTSYSAPI +PVOID +NTAPI +RtlGetElementGenericTableAvl( + IN PRTL_AVL_TABLE Table, + IN ULONG I); + +NTSYSAPI +ULONG +NTAPI +RtlNumberGenericTableElementsAvl( + IN PRTL_AVL_TABLE Table); + +NTSYSAPI +BOOLEAN +NTAPI +RtlIsGenericTableEmptyAvl( + IN PRTL_AVL_TABLE Table); + + + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +#if (NTDDI_VERSION >= NTDDI_VISTA) + + +NTSYSAPI +VOID +NTAPI +RtlRunOnceInitialize( + OUT PRTL_RUN_ONCE RunOnce); + +NTSYSAPI +NTSTATUS +NTAPI +RtlRunOnceExecuteOnce( + IN OUT PRTL_RUN_ONCE RunOnce, + IN PRTL_RUN_ONCE_INIT_FN InitFn, + IN OUT PVOID Parameter OPTIONAL, + OUT PVOID *Context OPTIONAL); + +NTSYSAPI +NTSTATUS +NTAPI +RtlRunOnceBeginInitialize( + IN OUT PRTL_RUN_ONCE RunOnce, + IN ULONG Flags, + OUT PVOID *Context OPTIONAL); + +NTSYSAPI +NTSTATUS +NTAPI +RtlRunOnceComplete( + IN OUT PRTL_RUN_ONCE RunOnce, + IN ULONG Flags, + IN PVOID Context OPTIONAL); + +NTSYSAPI +BOOLEAN +NTAPI +RtlGetProductInfo( + IN ULONG OSMajorVersion, + IN ULONG OSMinorVersion, + IN ULONG SpMajorVersion, + IN ULONG SpMinorVersion, + OUT PULONG ReturnedProductType); + + + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#if (NTDDI_VERSION >= NTDDI_WIN7) + + +NTSYSAPI +BOOLEAN +NTAPI +RtlCreateHashTable( + IN OUT PRTL_DYNAMIC_HASH_TABLE *HashTable OPTIONAL, + IN ULONG Shift, + IN ULONG Flags); + +NTSYSAPI +VOID +NTAPI +RtlDeleteHashTable( + IN PRTL_DYNAMIC_HASH_TABLE HashTable); + +NTSYSAPI +BOOLEAN +NTAPI +RtlInsertEntryHashTable( + IN PRTL_DYNAMIC_HASH_TABLE HashTable, + IN PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry, + IN ULONG_PTR Signature, + IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL); + +NTSYSAPI +BOOLEAN +NTAPI +RtlRemoveEntryHashTable( + IN PRTL_DYNAMIC_HASH_TABLE HashTable, + IN PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry, + IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL); + +NTSYSAPI +PRTL_DYNAMIC_HASH_TABLE_ENTRY +NTAPI +RtlLookupEntryHashTable( + IN PRTL_DYNAMIC_HASH_TABLE HashTable, + IN ULONG_PTR Signature, + OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL); + +NTSYSAPI +PRTL_DYNAMIC_HASH_TABLE_ENTRY +NTAPI +RtlGetNextEntryHashTable( + IN PRTL_DYNAMIC_HASH_TABLE HashTable, + IN PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context); + +NTSYSAPI +BOOLEAN +NTAPI +RtlInitEnumerationHashTable( + IN PRTL_DYNAMIC_HASH_TABLE HashTable, + OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); + +NTSYSAPI +PRTL_DYNAMIC_HASH_TABLE_ENTRY +NTAPI +RtlEnumerateEntryHashTable( + IN PRTL_DYNAMIC_HASH_TABLE HashTable, + IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); + +NTSYSAPI +VOID +NTAPI +RtlEndEnumerationHashTable( + IN PRTL_DYNAMIC_HASH_TABLE HashTable, + IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); + +NTSYSAPI +BOOLEAN +NTAPI +RtlInitWeakEnumerationHashTable( + IN PRTL_DYNAMIC_HASH_TABLE HashTable, + OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); + +NTSYSAPI +PRTL_DYNAMIC_HASH_TABLE_ENTRY +NTAPI +RtlWeaklyEnumerateEntryHashTable( + IN PRTL_DYNAMIC_HASH_TABLE HashTable, + IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); + +NTSYSAPI +VOID +NTAPI +RtlEndWeakEnumerationHashTable( + IN PRTL_DYNAMIC_HASH_TABLE HashTable, + IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); + +NTSYSAPI +BOOLEAN +NTAPI +RtlExpandHashTable( + IN PRTL_DYNAMIC_HASH_TABLE HashTable); + +NTSYSAPI +BOOLEAN +NTAPI +RtlContractHashTable( + IN PRTL_DYNAMIC_HASH_TABLE HashTable); + + + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + + +#if defined(_AMD64_) || defined(_IA64_) + + + +//DECLSPEC_DEPRECATED_DDK_WINXP +FORCEINLINE +LARGE_INTEGER +NTAPI_INLINE +RtlLargeIntegerDivide( + IN LARGE_INTEGER Dividend, + IN LARGE_INTEGER Divisor, + OUT PLARGE_INTEGER Remainder OPTIONAL) +{ + LARGE_INTEGER ret; + ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart; + if (Remainder) + Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart; + return ret; +} + +#else + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTSYSAPI +LARGE_INTEGER +NTAPI +RtlLargeIntegerDivide( + IN LARGE_INTEGER Dividend, + IN LARGE_INTEGER Divisor, + OUT PLARGE_INTEGER Remainder OPTIONAL); +#endif + + +#endif /* defined(_AMD64_) || defined(_IA64_) */ + + + +#ifdef RTL_USE_AVL_TABLES + +#define RtlInitializeGenericTable RtlInitializeGenericTableAvl +#define RtlInsertElementGenericTable RtlInsertElementGenericTableAvl +#define RtlInsertElementGenericTableFull RtlInsertElementGenericTableFullAvl +#define RtlDeleteElementGenericTable RtlDeleteElementGenericTableAvl +#define RtlLookupElementGenericTable RtlLookupElementGenericTableAvl +#define RtlLookupElementGenericTableFull RtlLookupElementGenericTableFullAvl +#define RtlEnumerateGenericTable RtlEnumerateGenericTableAvl +#define RtlEnumerateGenericTableWithoutSplaying RtlEnumerateGenericTableWithoutSplayingAvl +#define RtlGetElementGenericTable RtlGetElementGenericTableAvl +#define RtlNumberGenericTableElements RtlNumberGenericTableElementsAvl +#define RtlIsGenericTableEmpty RtlIsGenericTableEmptyAvl + +#endif /* RTL_USE_AVL_TABLES */ + +#define RtlInitializeSplayLinks(Links) { \ + PRTL_SPLAY_LINKS _SplayLinks; \ + _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \ + _SplayLinks->Parent = _SplayLinks; \ + _SplayLinks->LeftChild = NULL; \ + _SplayLinks->RightChild = NULL; \ +} + +#define RtlIsLeftChild(Links) \ + (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links)) + +#define RtlIsRightChild(Links) \ + (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links)) + +#define RtlRightChild(Links) \ + ((PRTL_SPLAY_LINKS)(Links))->RightChild + +#define RtlIsRoot(Links) \ + (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links)) + +#define RtlLeftChild(Links) \ + ((PRTL_SPLAY_LINKS)(Links))->LeftChild + +#define RtlParent(Links) \ + ((PRTL_SPLAY_LINKS)(Links))->Parent + +#define RtlInsertAsLeftChild(ParentLinks,ChildLinks) \ + { \ + PRTL_SPLAY_LINKS _SplayParent; \ + PRTL_SPLAY_LINKS _SplayChild; \ + _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \ + _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \ + _SplayParent->LeftChild = _SplayChild; \ + _SplayChild->Parent = _SplayParent; \ + } + +#define RtlInsertAsRightChild(ParentLinks,ChildLinks) \ + { \ + PRTL_SPLAY_LINKS _SplayParent; \ + PRTL_SPLAY_LINKS _SplayChild; \ + _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \ + _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \ + _SplayParent->RightChild = _SplayChild; \ + _SplayChild->Parent = _SplayParent; \ + } + +#if !defined(MIDL_PASS) + +FORCEINLINE +LUID +NTAPI_INLINE +RtlConvertLongToLuid( + IN LONG Val) +{ + LUID Luid; + LARGE_INTEGER Temp; + + Temp.QuadPart = Val; + Luid.LowPart = Temp.u.LowPart; + Luid.HighPart = Temp.u.HighPart; + return Luid; +} + +FORCEINLINE +LUID +NTAPI_INLINE +RtlConvertUlongToLuid( + IN ULONG Val) +{ + LUID Luid; + + Luid.LowPart = Val; + Luid.HighPart = 0; + return Luid; +} + +#endif /* !defined(MIDL_PASS) */ + +#if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_) +#define RtlGetCallersAddress(CallersAddress, CallersCaller) \ + *CallersAddress = (PVOID)_ReturnAddress(); \ + *CallersCaller = NULL; +#else +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTSYSAPI +VOID +NTAPI +RtlGetCallersAddress( + OUT PVOID *CallersAddress, + OUT PVOID *CallersCaller); +#endif +#endif + +#if !defined(MIDL_PASS) && !defined(SORTPP_PASS) + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +FORCEINLINE +VOID +NTAPI +RtlInitHashTableContext( + IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context) +{ + Context->ChainHead = NULL; + Context->PrevLinkage = NULL; +} + +FORCEINLINE +VOID +NTAPI +RtlInitHashTableContextFromEnumerator( + IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context, + IN PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator) +{ + Context->ChainHead = Enumerator->ChainHead; + Context->PrevLinkage = Enumerator->HashEntry.Linkage.Blink; +} + +FORCEINLINE +VOID +NTAPI +RtlReleaseHashTableContext( + IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context) +{ + UNREFERENCED_PARAMETER(Context); + return; +} + +FORCEINLINE +ULONG +NTAPI +RtlTotalBucketsHashTable( + IN PRTL_DYNAMIC_HASH_TABLE HashTable) +{ + return HashTable->TableSize; +} + +FORCEINLINE +ULONG +NTAPI +RtlNonEmptyBucketsHashTable( + IN PRTL_DYNAMIC_HASH_TABLE HashTable) +{ + return HashTable->NonEmptyBuckets; +} + +FORCEINLINE +ULONG +NTAPI +RtlEmptyBucketsHashTable( + IN PRTL_DYNAMIC_HASH_TABLE HashTable) +{ + return HashTable->TableSize - HashTable->NonEmptyBuckets; +} + +FORCEINLINE +ULONG +NTAPI +RtlTotalEntriesHashTable( + IN PRTL_DYNAMIC_HASH_TABLE HashTable) +{ + return HashTable->NumEntries; +} + +FORCEINLINE +ULONG +NTAPI +RtlActiveEnumeratorsHashTable( + IN PRTL_DYNAMIC_HASH_TABLE HashTable) +{ + return HashTable->NumEnumerators; +} + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + +#endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */ + +/****************************************************************************** + * Security Manager Functions * + ******************************************************************************/ #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI @@ -2895,12 +5494,42 @@ NTAPI SeSinglePrivilegeCheck( IN LUID PrivilegeValue, IN KPROCESSOR_MODE PreviousMode); -#endif -/* ZwXxx Functions */ + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +/****************************************************************************** + * ZwXxx Functions * + ******************************************************************************/ + + + +NTSYSAPI +NTSTATUS +NTAPI +ZwAllocateLocallyUniqueId( + OUT PLUID Luid); + +NTSYSAPI +NTSTATUS +NTAPI +ZwTerminateProcess( + IN HANDLE ProcessHandle OPTIONAL, + IN NTSTATUS ExitStatus); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenProcess( + OUT PHANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN PCLIENT_ID ClientId OPTIONAL); + #if (NTDDI_VERSION >= NTDDI_WIN2K) + NTSTATUS NTAPI ZwCancelTimer( @@ -2942,12 +5571,190 @@ ZwSetTimer( IN LONG Period OPTIONAL, OUT PBOOLEAN PreviousState OPTIONAL); +NTSYSAPI +NTSTATUS +NTAPI +ZwDisplayString( + IN PUNICODE_STRING String); + +NTSYSAPI +NTSTATUS +NTAPI +ZwPowerInformation( + IN POWER_INFORMATION_LEVEL PowerInformationLevel, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryVolumeInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FsInformation, + IN ULONG Length, + IN FS_INFORMATION_CLASS FsInformationClass); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDeviceIoControlFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG IoControlCode, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength); + + + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +NTSTATUS +NTAPI +ZwSetTimerEx( + IN HANDLE TimerHandle, + IN TIMER_SET_INFORMATION_CLASS TimerSetInformationClass, + IN OUT PVOID TimerSetInformation, + IN ULONG TimerSetInformationLength); + + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + + + +/* UNSORTED */ + +#define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \ + ((ConditionMask) = VerSetConditionMask((ConditionMask), \ + (TypeBitMask), (ComparisonType))) + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTSYSAPI +ULONGLONG +NTAPI +VerSetConditionMask( + IN ULONGLONG ConditionMask, + IN ULONG TypeMask, + IN UCHAR Condition); #endif +typedef struct _KERNEL_USER_TIMES { + LARGE_INTEGER CreateTime; + LARGE_INTEGER ExitTime; + LARGE_INTEGER KernelTime; + LARGE_INTEGER UserTime; +} KERNEL_USER_TIMES, *PKERNEL_USER_TIMES; + +/* NtXxx Functions */ + +typedef enum _SYSTEM_FIRMWARE_TABLE_ACTION { + SystemFirmwareTable_Enumerate, + SystemFirmwareTable_Get +} SYSTEM_FIRMWARE_TABLE_ACTION; + +typedef struct _SYSTEM_FIRMWARE_TABLE_INFORMATION { + ULONG ProviderSignature; + SYSTEM_FIRMWARE_TABLE_ACTION Action; + ULONG TableID; + ULONG TableBufferLength; + UCHAR TableBuffer[ANYSIZE_ARRAY]; +} SYSTEM_FIRMWARE_TABLE_INFORMATION, *PSYSTEM_FIRMWARE_TABLE_INFORMATION; + +typedef NTSTATUS +(__cdecl *PFNFTH)( + IN OUT PSYSTEM_FIRMWARE_TABLE_INFORMATION SystemFirmwareTableInfo); + +typedef struct _SYSTEM_FIRMWARE_TABLE_HANDLER { + ULONG ProviderSignature; + BOOLEAN Register; + PFNFTH FirmwareTableHandler; + PVOID DriverObject; +} SYSTEM_FIRMWARE_TABLE_HANDLER, *PSYSTEM_FIRMWARE_TABLE_HANDLER; + +typedef ULONG_PTR +(NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)( + IN PVOID Context); + +typedef struct _DRIVER_VERIFIER_THUNK_PAIRS { + PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine; + PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine; +} DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS; + +#define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001 +#define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002 +#define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004 +#define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008 +#define DRIVER_VERIFIER_IO_CHECKING 0x0010 + +#define SHARED_GLOBAL_FLAGS_ERROR_PORT_V 0x0 +#define SHARED_GLOBAL_FLAGS_ERROR_PORT (1UL << SHARED_GLOBAL_FLAGS_ERROR_PORT_V) + +#define SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED_V 0x1 +#define SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED (1UL << SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED_V) + +#define SHARED_GLOBAL_FLAGS_VIRT_ENABLED_V 0x2 +#define SHARED_GLOBAL_FLAGS_VIRT_ENABLED (1UL << SHARED_GLOBAL_FLAGS_VIRT_ENABLED_V) + +#define SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED_V 0x3 +#define SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED \ + (1UL << SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED_V) + +#define SHARED_GLOBAL_FLAGS_SPARE_V 0x4 +#define SHARED_GLOBAL_FLAGS_SPARE \ + (1UL << SHARED_GLOBAL_FLAGS_SPARE_V) + +#define SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED_V 0x5 +#define SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED \ + (1UL << SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED_V) + +#define SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED_V 0x6 +#define SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED \ + (1UL << SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED_V) + +#define EX_INIT_BITS(Flags, Bit) \ + *((Flags)) |= (Bit) // Safe to use before concurrently accessible + +#define EX_TEST_SET_BIT(Flags, Bit) \ + InterlockedBitTestAndSet ((PLONG)(Flags), (Bit)) + +#define EX_TEST_CLEAR_BIT(Flags, Bit) \ + InterlockedBitTestAndReset ((PLONG)(Flags), (Bit)) + +#define PCCARD_MAP_ERROR 0x01 +#define PCCARD_DEVICE_PCI 0x10 + +#define PCCARD_SCAN_DISABLED 0x01 +#define PCCARD_MAP_ZERO 0x02 +#define PCCARD_NO_TIMER 0x03 +#define PCCARD_NO_PIC 0x04 +#define PCCARD_NO_LEGACY_BASE 0x05 +#define PCCARD_DUP_LEGACY_BASE 0x06 +#define PCCARD_NO_CONTROLLERS 0x07 + +#define MAXIMUM_EXPANSION_SIZE (KERNEL_LARGE_STACK_SIZE - (PAGE_SIZE / 2)) + +/* Filesystem runtime library routines */ + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsTotalDeviceFailure( + IN NTSTATUS Status); +#endif + +/* FIXME : These definitions below doesn't belong to NTDDK */ #ifdef __cplusplus } #endif - - -#endif /* _NTDDK_ */ diff --git a/reactos/include/ddk/ntifs.h b/reactos/include/ddk/ntifs.h index 87d0470888c..15bace86764 100644 --- a/reactos/include/ddk/ntifs.h +++ b/reactos/include/ddk/ntifs.h @@ -25,32 +25,10 @@ #define _NTIFS_INCLUDED_ #define _GNU_NTIFS_ -/* Helper macro to enable gcc's extension. */ -#ifndef __GNU_EXTENSION -#ifdef __GNUC__ -#define __GNU_EXTENSION __extension__ -#else -#define __GNU_EXTENSION -#endif -#endif - #ifdef __cplusplus extern "C" { #endif -#if !defined(_NTHALDLL_) && !defined(_BLDR_) -#define NTHALAPI DECLSPEC_IMPORT -#else -#define NTHALAPI -#endif - -/* For ReactOS */ -#if !defined(_NTOSKRNL_) && !defined(_BLDR_) -#define NTKERNELAPI DECLSPEC_IMPORT -#else -#define NTKERNELAPI -#endif - /* Dependencies */ #include #include @@ -76,16 +54,6 @@ extern "C" { #define ClearFlag(_F,_SF) ((_F) &= ~(_SF)) #endif -#define PsGetCurrentProcess IoGetCurrentProcess - -#if (NTDDI_VERSION >= NTDDI_VISTA) -extern NTSYSAPI volatile CCHAR KeNumberProcessors; -#elif (NTDDI_VERSION >= NTDDI_WINXP) -extern NTSYSAPI CCHAR KeNumberProcessors; -#else -extern PCCHAR KeNumberProcessors; -#endif - typedef UNICODE_STRING LSA_UNICODE_STRING, *PLSA_UNICODE_STRING; typedef STRING LSA_STRING, *PLSA_STRING; typedef OBJECT_ATTRIBUTES LSA_OBJECT_ATTRIBUTES, *PLSA_OBJECT_ATTRIBUTES; @@ -751,8 +719,6 @@ typedef enum _OBJECT_INFORMATION_CLASS { MaxObjectInfoClass /* FIXME, not in WDK */ } OBJECT_INFORMATION_CLASS; -#if (NTDDI_VERSION >= NTDDI_NT4) - NTSYSCALLAPI NTSTATUS NTAPI @@ -763,8 +729,6 @@ NtQueryObject( IN ULONG ObjectInformationLength, OUT PULONG ReturnLength OPTIONAL); -#endif - #if (NTDDI_VERSION >= NTDDI_WIN2K) NTSYSCALLAPI @@ -2414,95 +2378,11 @@ extern const PRTL_REALLOCATE_STRING_ROUTINE RtlReallocateStringRoutine; #define RTL_SYSTEM_VOLUME_INFORMATION_FOLDER L"System Volume Information" -#define DEVICE_TYPE ULONG - -#define FILE_DEVICE_BEEP 0x00000001 -#define FILE_DEVICE_CD_ROM 0x00000002 -#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 -#define FILE_DEVICE_CONTROLLER 0x00000004 -#define FILE_DEVICE_DATALINK 0x00000005 -#define FILE_DEVICE_DFS 0x00000006 -#define FILE_DEVICE_DISK 0x00000007 -#define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008 -#define FILE_DEVICE_FILE_SYSTEM 0x00000009 -#define FILE_DEVICE_INPORT_PORT 0x0000000a -#define FILE_DEVICE_KEYBOARD 0x0000000b -#define FILE_DEVICE_MAILSLOT 0x0000000c -#define FILE_DEVICE_MIDI_IN 0x0000000d -#define FILE_DEVICE_MIDI_OUT 0x0000000e -#define FILE_DEVICE_MOUSE 0x0000000f -#define FILE_DEVICE_MULTI_UNC_PROVIDER 0x00000010 -#define FILE_DEVICE_NAMED_PIPE 0x00000011 -#define FILE_DEVICE_NETWORK 0x00000012 -#define FILE_DEVICE_NETWORK_BROWSER 0x00000013 -#define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014 -#define FILE_DEVICE_NULL 0x00000015 -#define FILE_DEVICE_PARALLEL_PORT 0x00000016 -#define FILE_DEVICE_PHYSICAL_NETCARD 0x00000017 -#define FILE_DEVICE_PRINTER 0x00000018 -#define FILE_DEVICE_SCANNER 0x00000019 -#define FILE_DEVICE_SERIAL_MOUSE_PORT 0x0000001a -#define FILE_DEVICE_SERIAL_PORT 0x0000001b -#define FILE_DEVICE_SCREEN 0x0000001c -#define FILE_DEVICE_SOUND 0x0000001d -#define FILE_DEVICE_STREAMS 0x0000001e -#define FILE_DEVICE_TAPE 0x0000001f -#define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020 -#define FILE_DEVICE_TRANSPORT 0x00000021 -#define FILE_DEVICE_UNKNOWN 0x00000022 -#define FILE_DEVICE_VIDEO 0x00000023 -#define FILE_DEVICE_VIRTUAL_DISK 0x00000024 -#define FILE_DEVICE_WAVE_IN 0x00000025 -#define FILE_DEVICE_WAVE_OUT 0x00000026 -#define FILE_DEVICE_8042_PORT 0x00000027 -#define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028 -#define FILE_DEVICE_BATTERY 0x00000029 -#define FILE_DEVICE_BUS_EXTENDER 0x0000002a -#define FILE_DEVICE_MODEM 0x0000002b -#define FILE_DEVICE_VDM 0x0000002c -#define FILE_DEVICE_MASS_STORAGE 0x0000002d -#define FILE_DEVICE_SMB 0x0000002e -#define FILE_DEVICE_KS 0x0000002f -#define FILE_DEVICE_CHANGER 0x00000030 -#define FILE_DEVICE_SMARTCARD 0x00000031 -#define FILE_DEVICE_ACPI 0x00000032 -#define FILE_DEVICE_DVD 0x00000033 -#define FILE_DEVICE_FULLSCREEN_VIDEO 0x00000034 -#define FILE_DEVICE_DFS_FILE_SYSTEM 0x00000035 -#define FILE_DEVICE_DFS_VOLUME 0x00000036 -#define FILE_DEVICE_SERENUM 0x00000037 -#define FILE_DEVICE_TERMSRV 0x00000038 -#define FILE_DEVICE_KSEC 0x00000039 -#define FILE_DEVICE_FIPS 0x0000003A -#define FILE_DEVICE_INFINIBAND 0x0000003B -#define FILE_DEVICE_VMBUS 0x0000003E -#define FILE_DEVICE_CRYPT_PROVIDER 0x0000003F -#define FILE_DEVICE_WPD 0x00000040 -#define FILE_DEVICE_BLUETOOTH 0x00000041 -#define FILE_DEVICE_MT_COMPOSITE 0x00000042 -#define FILE_DEVICE_MT_TRANSPORT 0x00000043 -#define FILE_DEVICE_BIOMETRIC 0x00000044 -#define FILE_DEVICE_PMI 0x00000045 - -#define CTL_CODE(DeviceType, Function, Method, Access) \ - (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) - -#define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16) - #define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)(ctrlCode & 3)) -#define METHOD_BUFFERED 0 -#define METHOD_IN_DIRECT 1 -#define METHOD_OUT_DIRECT 2 -#define METHOD_NEITHER 3 #define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT #define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT -#define FILE_ANY_ACCESS 0x00000000 -#define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS -#define FILE_READ_ACCESS 0x00000001 -#define FILE_WRITE_ACCESS 0x00000002 - typedef ULONG LSA_OPERATIONAL_MODE, *PLSA_OPERATIONAL_MODE; typedef enum _SECURITY_LOGON_TYPE { @@ -4673,6 +4553,8 @@ typedef struct _KAPC_STATE { #define KAPC_STATE_ACTUAL_LENGTH (FIELD_OFFSET(KAPC_STATE, UserApcPending) + sizeof(BOOLEAN)) +#define ASSERT_QUEUE(Q) ASSERT(((Q)->Header.Type & KOBJECT_TYPE_MASK) == QueueObject); + typedef struct _KQUEUE { DISPATCHER_HEADER Header; LIST_ENTRY EntryListHead; @@ -4807,7 +4689,7 @@ FASTCALL KeAcquireQueuedSpinLock( IN OUT KSPIN_LOCK_QUEUE_NUMBER Number); -NTHALAPI +_DECL_HAL_KE_IMPORT VOID FASTCALL KeReleaseQueuedSpinLock( @@ -5022,24 +4904,6 @@ typedef NTSTATUS #if (NTDDI_VERSION >= NTDDI_WIN2K) -NTKERNELAPI -VOID -NTAPI -SeCaptureSubjectContext( - OUT PSECURITY_SUBJECT_CONTEXT SubjectContext); - -NTKERNELAPI -VOID -NTAPI -SeLockSubjectContext( - IN PSECURITY_SUBJECT_CONTEXT SubjectContext); - -NTKERNELAPI -VOID -NTAPI -SeUnlockSubjectContext( - IN PSECURITY_SUBJECT_CONTEXT SubjectContext); - NTKERNELAPI VOID NTAPI @@ -5453,18 +5317,6 @@ SeLocateProcessImageName( extern NTKERNELAPI PSE_EXPORTS SeExports; -#if !defined(_PSGETCURRENTTHREAD_) -#define _PSGETCURRENTTHREAD_ - -FORCEINLINE -PETHREAD -PsGetCurrentThread( - VOID) -{ - return (PETHREAD)KeGetCurrentThread(); -} -#endif - #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI @@ -5534,7 +5386,20 @@ PsReturnPoolQuota( IN POOL_TYPE PoolType, IN ULONG_PTR Amount); -#endif +NTKERNELAPI +NTSTATUS +NTAPI +PsAssignImpersonationToken( + IN PETHREAD Thread, + IN HANDLE Token OPTIONAL); + +NTKERNELAPI +HANDLE +NTAPI +PsReferencePrimaryToken( + IN OUT PEPROCESS Process); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_WINXP) @@ -5823,18 +5688,6 @@ IoPageRead( IN PKEVENT Event, OUT PIO_STATUS_BLOCK IoStatusBlock); -NTKERNELAPI -PDEVICE_OBJECT -NTAPI -IoGetAttachedDevice( - IN PDEVICE_OBJECT DeviceObject); - -NTKERNELAPI -PDEVICE_OBJECT -NTAPI -IoGetAttachedDeviceReference( - IN PDEVICE_OBJECT DeviceObject); - NTKERNELAPI PDEVICE_OBJECT NTAPI @@ -5951,42 +5804,6 @@ NTAPI IoSetTopLevelIrp( IN PIRP Irp OPTIONAL); -NTKERNELAPI -VOID -NTAPI -IoStartNextPacket( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN Cancelable); - -NTKERNELAPI -VOID -NTAPI -IoStartNextPacketByKey( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN Cancelable, - IN ULONG Key); - -NTKERNELAPI -VOID -NTAPI -IoStartPacket( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PULONG Key OPTIONAL, - IN PDRIVER_CANCEL CancelFunction OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -IoStartTimer( - IN PDEVICE_OBJECT DeviceObject); - -NTKERNELAPI -VOID -NTAPI -IoStopTimer( - IN PDEVICE_OBJECT DeviceObject); - NTKERNELAPI NTSTATUS NTAPI @@ -6023,12 +5840,6 @@ IoVerifyVolume( IN PDEVICE_OBJECT DeviceObject, IN BOOLEAN AllowRawMount); -NTKERNELAPI -VOID -NTAPI -IoWriteErrorLogEntry( - IN PVOID ElEntry); - NTKERNELAPI NTSTATUS NTAPI @@ -6055,13 +5866,6 @@ IoQueryFileDosDeviceName( IN PFILE_OBJECT FileObject, OUT POBJECT_NAME_INFORMATION *ObjectNameInformation); -VOID -NTAPI -IoSetStartIoAttributes( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN DeferredStartIo, - IN BOOLEAN NonCancelable); - NTKERNELAPI NTSTATUS NTAPI @@ -6160,53 +5964,6 @@ typedef struct _IO_PRIORITY_INFO { #define PO_CB_LID_SWITCH_STATE 4 #define PO_CB_PROCESSOR_POWER_POLICY 5 -#if (NTDDI_VERSION >= NTDDI_WIN2K) - -NTKERNELAPI -PVOID -NTAPI -PoRegisterSystemState( - IN OUT PVOID StateHandle OPTIONAL, - IN EXECUTION_STATE Flags); - -NTKERNELAPI -VOID -NTAPI -PoUnregisterSystemState( - IN OUT PVOID StateHandle); - -NTKERNELAPI -POWER_STATE -NTAPI -PoSetPowerState( - IN PDEVICE_OBJECT DeviceObject, - IN POWER_STATE_TYPE Type, - IN POWER_STATE State); - -NTKERNELAPI -NTSTATUS -NTAPI -PoCallDriver( - IN PDEVICE_OBJECT DeviceObject, - IN OUT PIRP Irp); - -NTKERNELAPI -VOID -NTAPI -PoStartNextPowerIrp( - IN OUT PIRP Irp); - -NTKERNELAPI -PULONG -NTAPI -PoRegisterDeviceForIdleDetection( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG ConservationIdleTime, - IN ULONG PerformanceIdleTime, - IN DEVICE_POWER_STATE State); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ - #if (NTDDI_VERSION >= NTDDI_WINXP) NTKERNELAPI NTSTATUS @@ -6215,84 +5972,6 @@ PoQueueShutdownWorkItem( IN OUT PWORK_QUEUE_ITEM WorkItem); #endif -#if (NTDDI_VERSION >= NTDDI_VISTA) - -NTKERNELAPI -NTSTATUS -NTAPI -PoRegisterPowerSettingCallback( - IN PDEVICE_OBJECT DeviceObject OPTIONAL, - IN LPCGUID SettingGuid, - IN PPOWER_SETTING_CALLBACK Callback, - IN PVOID Context OPTIONAL, - OUT PVOID *Handle); - -NTKERNELAPI -NTSTATUS -PoUnregisterPowerSettingCallback( - IN OUT PVOID Handle); - -#endif - -#if (NTDDI_VERSION >= NTDDI_WIN6SP1) -NTKERNELAPI -VOID -NTAPI -PoSetDeviceBusyEx( - IN OUT PULONG IdlePointer); -#endif - -#if (NTDDI_VERSION >= NTDDI_WIN7) - -NTKERNELAPI -NTSTATUS -NTAPI -PoCreatePowerRequest( - OUT PVOID *PowerRequest, - IN PDEVICE_OBJECT DeviceObject, - IN PCOUNTED_REASON_CONTEXT Context); - -NTKERNELAPI -NTSTATUS -NTAPI -PoSetPowerRequest( - IN OUT PVOID PowerRequest, - IN POWER_REQUEST_TYPE Type); - -NTKERNELAPI -NTSTATUS -NTAPI -PoClearPowerRequest( - IN OUT PVOID PowerRequest, - IN POWER_REQUEST_TYPE Type); - -NTKERNELAPI -VOID -NTAPI -PoDeletePowerRequest( - IN OUT PVOID PowerRequest); - -NTKERNELAPI -VOID -NTAPI -PoStartDeviceBusy( - IN OUT PULONG IdlePointer); - -NTKERNELAPI -VOID -NTAPI -PoEndDeviceBusy( - IN OUT PULONG IdlePointer); - -NTKERNELAPI -BOOLEAN -NTAPI -PoQueryWatchdogTime( - IN PDEVICE_OBJECT Pdo, - OUT PULONG SecondsRemaining); - -#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - #if defined(_IA64_) #if (NTDDI_VERSION >= NTDDI_WIN2K) //DECLSPEC_DEPRECATED_DDK @@ -6568,6 +6247,188 @@ typedef struct _FILE_LOCK { LONG volatile LockRequestsInProgress; } FILE_LOCK, *PFILE_LOCK; +typedef struct _TUNNEL { + FAST_MUTEX Mutex; + PRTL_SPLAY_LINKS Cache; + LIST_ENTRY TimerQueue; + USHORT NumEntries; +} TUNNEL, *PTUNNEL; + +typedef enum _FSRTL_COMPARISON_RESULT { + LessThan = -1, + EqualTo = 0, + GreaterThan = 1 +} FSRTL_COMPARISON_RESULT; + +#define FSRTL_FAT_LEGAL 0x01 +#define FSRTL_HPFS_LEGAL 0x02 +#define FSRTL_NTFS_LEGAL 0x04 +#define FSRTL_WILD_CHARACTER 0x08 +#define FSRTL_OLE_LEGAL 0x10 +#define FSRTL_NTFS_STREAM_LEGAL (FSRTL_NTFS_LEGAL | FSRTL_OLE_LEGAL) + +typedef struct _BASE_MCB { + ULONG MaximumPairCount; + ULONG PairCount; + USHORT PoolType; + USHORT Flags; + PVOID Mapping; +} BASE_MCB, *PBASE_MCB; + +typedef struct _LARGE_MCB { + PKGUARDED_MUTEX GuardedMutex; + BASE_MCB BaseMcb; +} LARGE_MCB, *PLARGE_MCB; + +#define MCB_FLAG_RAISE_ON_ALLOCATION_FAILURE 1 + +typedef struct _MCB { + LARGE_MCB DummyFieldThatSizesThisStructureCorrectly; +} MCB, *PMCB; + +typedef PVOID OPLOCK, *POPLOCK; + +typedef VOID +(NTAPI *POPLOCK_WAIT_COMPLETE_ROUTINE) ( + IN PVOID Context, + IN PIRP Irp); + +typedef VOID +(NTAPI *POPLOCK_FS_PREPOST_IRP) ( + IN PVOID Context, + IN PIRP Irp); + +#if (NTDDI_VERSION >= NTDDI_VISTASP1) +#define OPLOCK_FLAG_COMPLETE_IF_OPLOCKED 0x00000001 +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) +#define OPLOCK_FLAG_OPLOCK_KEY_CHECK_ONLY 0x00000002 +#define OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK 0x00000004 +#define OPLOCK_FLAG_IGNORE_OPLOCK_KEYS 0x00000008 +#define OPLOCK_FSCTRL_FLAG_ALL_KEYS_MATCH 0x00000001 +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +typedef struct _OPLOCK_KEY_ECP_CONTEXT { + GUID OplockKey; + ULONG Reserved; +} OPLOCK_KEY_ECP_CONTEXT, *POPLOCK_KEY_ECP_CONTEXT; + +DEFINE_GUID( GUID_ECP_OPLOCK_KEY, 0x48850596, 0x3050, 0x4be7, 0x98, 0x63, 0xfe, 0xc3, 0x50, 0xce, 0x8d, 0x7f ); + +#endif + +#define FSRTL_VOLUME_DISMOUNT 1 +#define FSRTL_VOLUME_DISMOUNT_FAILED 2 +#define FSRTL_VOLUME_LOCK 3 +#define FSRTL_VOLUME_LOCK_FAILED 4 +#define FSRTL_VOLUME_UNLOCK 5 +#define FSRTL_VOLUME_MOUNT 6 +#define FSRTL_VOLUME_NEEDS_CHKDSK 7 +#define FSRTL_VOLUME_WORM_NEAR_FULL 8 +#define FSRTL_VOLUME_WEARING_OUT 9 +#define FSRTL_VOLUME_FORCED_CLOSED 10 +#define FSRTL_VOLUME_INFO_MAKE_COMPAT 11 +#define FSRTL_VOLUME_PREPARING_EJECT 12 +#define FSRTL_VOLUME_CHANGE_SIZE 13 +#define FSRTL_VOLUME_BACKGROUND_FORMAT 14 + +typedef PVOID PNOTIFY_SYNC; + +typedef BOOLEAN +(NTAPI *PCHECK_FOR_TRAVERSE_ACCESS) ( + IN PVOID NotifyContext, + IN PVOID TargetContext OPTIONAL, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext); + +typedef BOOLEAN +(NTAPI *PFILTER_REPORT_CHANGE) ( + IN PVOID NotifyContext, + IN PVOID FilterContext); + +typedef VOID +(NTAPI *PFSRTL_STACK_OVERFLOW_ROUTINE) ( + IN PVOID Context, + IN PKEVENT Event); + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +#define FSRTL_UNC_PROVIDER_FLAGS_MAILSLOTS_SUPPORTED 0x00000001 +#define FSRTL_UNC_PROVIDER_FLAGS_CSC_ENABLED 0x00000002 +#define FSRTL_UNC_PROVIDER_FLAGS_DOMAIN_SVC_AWARE 0x00000004 + +#define FSRTL_ALLOCATE_ECPLIST_FLAG_CHARGE_QUOTA 0x00000001 + +#define FSRTL_ALLOCATE_ECP_FLAG_CHARGE_QUOTA 0x00000001 +#define FSRTL_ALLOCATE_ECP_FLAG_NONPAGED_POOL 0x00000002 + +#define FSRTL_ECP_LOOKASIDE_FLAG_NONPAGED_POOL 0x00000002 + +#define FSRTL_VIRTDISK_FULLY_ALLOCATED 0x00000001 +#define FSRTL_VIRTDISK_NO_DRIVE_LETTER 0x00000002 + +typedef struct _FSRTL_MUP_PROVIDER_INFO_LEVEL_1 { + ULONG32 ProviderId; +} FSRTL_MUP_PROVIDER_INFO_LEVEL_1, *PFSRTL_MUP_PROVIDER_INFO_LEVEL_1; + +typedef struct _FSRTL_MUP_PROVIDER_INFO_LEVEL_2 { + ULONG32 ProviderId; + UNICODE_STRING ProviderName; +} FSRTL_MUP_PROVIDER_INFO_LEVEL_2, *PFSRTL_MUP_PROVIDER_INFO_LEVEL_2; + +typedef VOID +(*PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK) ( + IN OUT PVOID EcpContext, + IN LPCGUID EcpType); + +typedef struct _ECP_LIST ECP_LIST, *PECP_LIST; + +typedef ULONG FSRTL_ALLOCATE_ECPLIST_FLAGS; +typedef ULONG FSRTL_ALLOCATE_ECP_FLAGS; +typedef ULONG FSRTL_ECP_LOOKASIDE_FLAGS; + +typedef enum _FSRTL_CHANGE_BACKING_TYPE { + ChangeDataControlArea, + ChangeImageControlArea, + ChangeSharedCacheMap +} FSRTL_CHANGE_BACKING_TYPE, *PFSRTL_CHANGE_BACKING_TYPE; + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +typedef struct _FSRTL_PER_FILE_CONTEXT { + LIST_ENTRY Links; + PVOID OwnerId; + PVOID InstanceId; + PFREE_FUNCTION FreeCallback; +} FSRTL_PER_FILE_CONTEXT, *PFSRTL_PER_FILE_CONTEXT; + +typedef struct _FSRTL_PER_STREAM_CONTEXT { + LIST_ENTRY Links; + PVOID OwnerId; + PVOID InstanceId; + PFREE_FUNCTION FreeCallback; +} FSRTL_PER_STREAM_CONTEXT, *PFSRTL_PER_STREAM_CONTEXT; + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +typedef VOID +(*PFN_FSRTLTEARDOWNPERSTREAMCONTEXTS) ( + IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader); +#endif + +typedef struct _FSRTL_PER_FILEOBJECT_CONTEXT { + LIST_ENTRY Links; + PVOID OwnerId; + PVOID InstanceId; +} FSRTL_PER_FILEOBJECT_CONTEXT, *PFSRTL_PER_FILEOBJECT_CONTEXT; + +#define FsRtlEnterFileSystem KeEnterCriticalRegion +#define FsRtlExitFileSystem KeLeaveCriticalRegion + +#define FSRTL_CC_FLUSH_ERROR_FLAG_NO_HARD_ERROR 0x1 +#define FSRTL_CC_FLUSH_ERROR_FLAG_NO_LOG_ENTRY 0x2 + #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI @@ -6845,15 +6706,2181 @@ FsRtlPrivateLock( IN PVOID Context, IN BOOLEAN AlreadySynchronized); +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeTunnelCache( + IN PTUNNEL Cache); + +NTKERNELAPI +VOID +NTAPI +FsRtlAddToTunnelCache( + IN PTUNNEL Cache, + IN ULONGLONG DirectoryKey, + IN PUNICODE_STRING ShortName, + IN PUNICODE_STRING LongName, + IN BOOLEAN KeyByShortName, + IN ULONG DataLength, + IN PVOID Data); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlFindInTunnelCache( + IN PTUNNEL Cache, + IN ULONGLONG DirectoryKey, + IN PUNICODE_STRING Name, + OUT PUNICODE_STRING ShortName, + OUT PUNICODE_STRING LongName, + IN OUT PULONG DataLength, + OUT PVOID Data); + +NTKERNELAPI +VOID +NTAPI +FsRtlDeleteKeyFromTunnelCache( + IN PTUNNEL Cache, + IN ULONGLONG DirectoryKey); + +NTKERNELAPI +VOID +NTAPI +FsRtlDeleteTunnelCache( + IN PTUNNEL Cache); + +NTKERNELAPI +VOID +NTAPI +FsRtlDissectDbcs( + IN ANSI_STRING Name, + OUT PANSI_STRING FirstPart, + OUT PANSI_STRING RemainingPart); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlDoesDbcsContainWildCards( + IN PANSI_STRING Name); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsDbcsInExpression( + IN PANSI_STRING Expression, + IN PANSI_STRING Name); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsFatDbcsLegal( + IN ANSI_STRING DbcsName, + IN BOOLEAN WildCardsPermissible, + IN BOOLEAN PathNamePermissible, + IN BOOLEAN LeadingBackslashPermissible); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsHpfsDbcsLegal( + IN ANSI_STRING DbcsName, + IN BOOLEAN WildCardsPermissible, + IN BOOLEAN PathNamePermissible, + IN BOOLEAN LeadingBackslashPermissible); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlNormalizeNtstatus( + IN NTSTATUS Exception, + IN NTSTATUS GenericException); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsNtstatusExpected( + IN NTSTATUS Ntstatus); + +NTKERNELAPI +PERESOURCE +NTAPI +FsRtlAllocateResource( + VOID); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeLargeMcb( + IN PLARGE_MCB Mcb, + IN POOL_TYPE PoolType); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeLargeMcb( + IN PLARGE_MCB Mcb); + +NTKERNELAPI +VOID +NTAPI +FsRtlResetLargeMcb( + IN PLARGE_MCB Mcb, + IN BOOLEAN SelfSynchronized); + +NTKERNELAPI +VOID +NTAPI +FsRtlTruncateLargeMcb( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAddLargeMcbEntry( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Lbn, + IN LONGLONG SectorCount); + +NTKERNELAPI +VOID +NTAPI +FsRtlRemoveLargeMcbEntry( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG SectorCount); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLargeMcbEntry( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn, + OUT PLONGLONG Lbn OPTIONAL, + OUT PLONGLONG SectorCountFromLbn OPTIONAL, + OUT PLONGLONG StartingLbn OPTIONAL, + OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, + OUT PULONG Index OPTIONAL); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastLargeMcbEntry( + IN PLARGE_MCB Mcb, + OUT PLONGLONG Vbn, + OUT PLONGLONG Lbn); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastLargeMcbEntryAndIndex( + IN PLARGE_MCB OpaqueMcb, + OUT PLONGLONG LargeVbn, + OUT PLONGLONG LargeLbn, + OUT PULONG Index); + +NTKERNELAPI +ULONG +NTAPI +FsRtlNumberOfRunsInLargeMcb( + IN PLARGE_MCB Mcb); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlGetNextLargeMcbEntry( + IN PLARGE_MCB Mcb, + IN ULONG RunIndex, + OUT PLONGLONG Vbn, + OUT PLONGLONG Lbn, + OUT PLONGLONG SectorCount); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlSplitLargeMcb( + IN PLARGE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Amount); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeMcb( + IN PMCB Mcb, + IN POOL_TYPE PoolType); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeMcb( + IN PMCB Mcb); + +NTKERNELAPI +VOID +NTAPI +FsRtlTruncateMcb( + IN PMCB Mcb, + IN VBN Vbn); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAddMcbEntry( + IN PMCB Mcb, + IN VBN Vbn, + IN LBN Lbn, + IN ULONG SectorCount); + +NTKERNELAPI +VOID +NTAPI +FsRtlRemoveMcbEntry( + IN PMCB Mcb, + IN VBN Vbn, + IN ULONG SectorCount); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupMcbEntry( + IN PMCB Mcb, + IN VBN Vbn, + OUT PLBN Lbn, + OUT PULONG SectorCount OPTIONAL, + OUT PULONG Index); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastMcbEntry( + IN PMCB Mcb, + OUT PVBN Vbn, + OUT PLBN Lbn); + +NTKERNELAPI +ULONG +NTAPI +FsRtlNumberOfRunsInMcb( + IN PMCB Mcb); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlGetNextMcbEntry( + IN PMCB Mcb, + IN ULONG RunIndex, + OUT PVBN Vbn, + OUT PLBN Lbn, + OUT PULONG SectorCount); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlBalanceReads( + IN PDEVICE_OBJECT TargetDevice); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeOplock( + IN OUT POPLOCK Oplock); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeOplock( + IN OUT POPLOCK Oplock); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlOplockFsctrl( + IN POPLOCK Oplock, + IN PIRP Irp, + IN ULONG OpenCount); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlCheckOplock( + IN POPLOCK Oplock, + IN PIRP Irp, + IN PVOID Context, + IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, + IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlOplockIsFastIoPossible( + IN POPLOCK Oplock); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlCurrentBatchOplock( + IN POPLOCK Oplock); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlNotifyVolumeEvent( + IN PFILE_OBJECT FileObject, + IN ULONG EventCode); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyInitializeSync( + IN PNOTIFY_SYNC *NotifySync); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyUninitializeSync( + IN PNOTIFY_SYNC *NotifySync); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFullChangeDirectory( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PVOID FsContext, + IN PSTRING FullDirectoryName, + IN BOOLEAN WatchTree, + IN BOOLEAN IgnoreBuffer, + IN ULONG CompletionFilter, + IN PIRP NotifyIrp OPTIONAL, + IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFilterReportChange( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PSTRING FullTargetName, + IN USHORT TargetNameOffset, + IN PSTRING StreamName OPTIONAL, + IN PSTRING NormalizedParentName OPTIONAL, + IN ULONG FilterMatch, + IN ULONG Action, + IN PVOID TargetContext OPTIONAL, + IN PVOID FilterContext OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFullReportChange( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PSTRING FullTargetName, + IN USHORT TargetNameOffset, + IN PSTRING StreamName OPTIONAL, + IN PSTRING NormalizedParentName OPTIONAL, + IN ULONG FilterMatch, + IN ULONG Action, + IN PVOID TargetContext OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyCleanup( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PVOID FsContext); + +NTKERNELAPI +VOID +NTAPI +FsRtlDissectName( + IN UNICODE_STRING Name, + OUT PUNICODE_STRING FirstPart, + OUT PUNICODE_STRING RemainingPart); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlDoesNameContainWildCards( + IN PUNICODE_STRING Name); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAreNamesEqual( + IN PCUNICODE_STRING Name1, + IN PCUNICODE_STRING Name2, + IN BOOLEAN IgnoreCase, + IN PCWCH UpcaseTable OPTIONAL); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsNameInExpression( + IN PUNICODE_STRING Expression, + IN PUNICODE_STRING Name, + IN BOOLEAN IgnoreCase, + IN PWCHAR UpcaseTable OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlPostPagingFileStackOverflow( + IN PVOID Context, + IN PKEVENT Event, + IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine); + +NTKERNELAPI +VOID +NTAPI +FsRtlPostStackOverflow ( + IN PVOID Context, + IN PKEVENT Event, + IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlRegisterUncProvider( + OUT PHANDLE MupHandle, + IN PUNICODE_STRING RedirectorDeviceName, + IN BOOLEAN MailslotsSupported); + +NTKERNELAPI +VOID +NTAPI +FsRtlDeregisterUncProvider( + IN HANDLE Handle); + +NTKERNELAPI +VOID +NTAPI +FsRtlTeardownPerStreamContexts( + IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlCreateSectionForDataScan( + OUT PHANDLE SectionHandle, + OUT PVOID *SectionObject, + OUT PLARGE_INTEGER SectionFileSize OPTIONAL, + IN PFILE_OBJECT FileObject, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PLARGE_INTEGER MaximumSize OPTIONAL, + IN ULONG SectionPageProtection, + IN ULONG AllocationAttributes, + IN ULONG Flags); + #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyFilterChangeDirectory( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList, + IN PVOID FsContext, + IN PSTRING FullDirectoryName, + IN BOOLEAN WatchTree, + IN BOOLEAN IgnoreBuffer, + IN ULONG CompletionFilter, + IN PIRP NotifyIrp OPTIONAL, + IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, + IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL, + IN PFILTER_REPORT_CHANGE FilterCallback OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlInsertPerStreamContext( + IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext, + IN PFSRTL_PER_STREAM_CONTEXT Ptr); + +NTKERNELAPI +PFSRTL_PER_STREAM_CONTEXT +NTAPI +FsRtlLookupPerStreamContextInternal( + IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL); + +NTKERNELAPI +PFSRTL_PER_STREAM_CONTEXT +NTAPI +FsRtlRemovePerStreamContext( + IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlIncrementCcFastReadNotPossible( + VOID); + +NTKERNELAPI +VOID +NTAPI +FsRtlIncrementCcFastReadWait( + VOID); + +NTKERNELAPI +VOID +NTAPI +FsRtlIncrementCcFastReadNoWait( + VOID); + +NTKERNELAPI +VOID +NTAPI +FsRtlIncrementCcFastReadResourceMiss( + VOID); + +NTKERNELAPI +LOGICAL +NTAPI +FsRtlIsPagingFile( + IN PFILE_OBJECT FileObject); + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +#if (NTDDI_VERSION >= NTDDI_WS03) + +NTKERNELAPI + VOID +NTAPI +FsRtlInitializeBaseMcb( + IN PBASE_MCB Mcb, + IN POOL_TYPE PoolType); + +NTKERNELAPI +VOID +NTAPI +FsRtlUninitializeBaseMcb( + IN PBASE_MCB Mcb); + +NTKERNELAPI +VOID +NTAPI +FsRtlResetBaseMcb( + IN PBASE_MCB Mcb); + +NTKERNELAPI +VOID +NTAPI +FsRtlTruncateBaseMcb( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAddBaseMcbEntry( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Lbn, + IN LONGLONG SectorCount); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlRemoveBaseMcbEntry( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG SectorCount); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupBaseMcbEntry( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + OUT PLONGLONG Lbn OPTIONAL, + OUT PLONGLONG SectorCountFromLbn OPTIONAL, + OUT PLONGLONG StartingLbn OPTIONAL, + OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, + OUT PULONG Index OPTIONAL); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastBaseMcbEntry( + IN PBASE_MCB Mcb, + OUT PLONGLONG Vbn, + OUT PLONGLONG Lbn); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlLookupLastBaseMcbEntryAndIndex( + IN PBASE_MCB OpaqueMcb, + IN OUT PLONGLONG LargeVbn, + IN OUT PLONGLONG LargeLbn, + IN OUT PULONG Index); + +NTKERNELAPI +ULONG +NTAPI +FsRtlNumberOfRunsInBaseMcb( + IN PBASE_MCB Mcb); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlGetNextBaseMcbEntry( + IN PBASE_MCB Mcb, + IN ULONG RunIndex, + OUT PLONGLONG Vbn, + OUT PLONGLONG Lbn, + OUT PLONGLONG SectorCount); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlSplitBaseMcb( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Amount); + +#endif /* (NTDDI_VERSION >= NTDDI_WS03) */ + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +BOOLEAN +NTAPI +FsRtlInitializeBaseMcbEx( + IN PBASE_MCB Mcb, + IN POOL_TYPE PoolType, + IN USHORT Flags); + +NTSTATUS +NTAPI +FsRtlAddBaseMcbEntryEx( + IN PBASE_MCB Mcb, + IN LONGLONG Vbn, + IN LONGLONG Lbn, + IN LONGLONG SectorCount); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlCurrentOplock( + IN POPLOCK Oplock); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlOplockBreakToNone( + IN OUT POPLOCK Oplock, + IN PIO_STACK_LOCATION IrpSp OPTIONAL, + IN PIRP Irp, + IN PVOID Context OPTIONAL, + IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, + IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlNotifyVolumeEventEx( + IN PFILE_OBJECT FileObject, + IN ULONG EventCode, + IN PTARGET_DEVICE_CUSTOM_NOTIFICATION Event); + +NTKERNELAPI +VOID +NTAPI +FsRtlNotifyCleanupAll( + IN PNOTIFY_SYNC NotifySync, + IN PLIST_ENTRY NotifyList); + +NTSTATUS +NTAPI +FsRtlRegisterUncProviderEx( + OUT PHANDLE MupHandle, + IN PUNICODE_STRING RedirDevName, + IN PDEVICE_OBJECT DeviceObject, + IN ULONG Flags); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlCancellableWaitForSingleObject( + IN PVOID Object, + IN PLARGE_INTEGER Timeout OPTIONAL, + IN PIRP Irp OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlCancellableWaitForMultipleObjects( + IN ULONG Count, + IN PVOID ObjectArray[], + IN WAIT_TYPE WaitType, + IN PLARGE_INTEGER Timeout OPTIONAL, + IN PKWAIT_BLOCK WaitBlockArray OPTIONAL, + IN PIRP Irp OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlMupGetProviderInfoFromFileObject( + IN PFILE_OBJECT pFileObject, + IN ULONG Level, + OUT PVOID pBuffer, + IN OUT PULONG pBufferSize); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlMupGetProviderIdFromName( + IN PUNICODE_STRING pProviderName, + OUT PULONG32 pProviderId); + +NTKERNELAPI +VOID +NTAPI +FsRtlIncrementCcFastMdlReadWait( + VOID); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlValidateReparsePointBuffer( + IN ULONG BufferLength, + IN PREPARSE_DATA_BUFFER ReparseBuffer); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlRemoveDotsFromPath( + IN OUT PWSTR OriginalString, + IN USHORT PathLength, + OUT USHORT *NewLength); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlAllocateExtraCreateParameterList( + IN FSRTL_ALLOCATE_ECPLIST_FLAGS Flags, + OUT PECP_LIST *EcpList); + +NTKERNELAPI +VOID +NTAPI +FsRtlFreeExtraCreateParameterList( + IN PECP_LIST EcpList); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlAllocateExtraCreateParameter( + IN LPCGUID EcpType, + IN ULONG SizeOfContext, + IN FSRTL_ALLOCATE_ECP_FLAGS Flags, + IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL, + IN ULONG PoolTag, + OUT PVOID *EcpContext); + +NTKERNELAPI +VOID +NTAPI +FsRtlFreeExtraCreateParameter( + IN PVOID EcpContext); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitExtraCreateParameterLookasideList( + IN OUT PVOID Lookaside, + IN FSRTL_ECP_LOOKASIDE_FLAGS Flags, + IN SIZE_T Size, + IN ULONG Tag); + +VOID +NTAPI +FsRtlDeleteExtraCreateParameterLookasideList( + IN OUT PVOID Lookaside, + IN FSRTL_ECP_LOOKASIDE_FLAGS Flags); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlAllocateExtraCreateParameterFromLookasideList( + IN LPCGUID EcpType, + IN ULONG SizeOfContext, + IN FSRTL_ALLOCATE_ECP_FLAGS Flags, + IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL, + IN OUT PVOID LookasideList, + OUT PVOID *EcpContext); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlInsertExtraCreateParameter( + IN OUT PECP_LIST EcpList, + IN OUT PVOID EcpContext); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlFindExtraCreateParameter( + IN PECP_LIST EcpList, + IN LPCGUID EcpType, + OUT PVOID *EcpContext OPTIONAL, + OUT ULONG *EcpContextSize OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlRemoveExtraCreateParameter( + IN OUT PECP_LIST EcpList, + IN LPCGUID EcpType, + OUT PVOID *EcpContext, + OUT ULONG *EcpContextSize OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlGetEcpListFromIrp( + IN PIRP Irp, + OUT PECP_LIST *EcpList OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlSetEcpListIntoIrp( + IN OUT PIRP Irp, + IN PECP_LIST EcpList); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlGetNextExtraCreateParameter( + IN PECP_LIST EcpList, + IN PVOID CurrentEcpContext OPTIONAL, + OUT LPGUID NextEcpType OPTIONAL, + OUT PVOID *NextEcpContext OPTIONAL, + OUT ULONG *NextEcpContextSize OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlAcknowledgeEcp( + IN PVOID EcpContext); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsEcpAcknowledged( + IN PVOID EcpContext); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlIsEcpFromUserMode( + IN PVOID EcpContext); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlChangeBackingFileObject( + IN PFILE_OBJECT CurrentFileObject OPTIONAL, + IN PFILE_OBJECT NewFileObject, + IN FSRTL_CHANGE_BACKING_TYPE ChangeBackingType, + IN ULONG Flags); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlLogCcFlushError( + IN PUNICODE_STRING FileName, + IN PDEVICE_OBJECT DeviceObject, + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN NTSTATUS FlushError, + IN ULONG Flags); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlAreVolumeStartupApplicationsComplete( + VOID); + +NTKERNELAPI +ULONG +NTAPI +FsRtlQueryMaximumVirtualDiskNestingLevel( + VOID); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlGetVirtualDiskNestingLevel( + IN PDEVICE_OBJECT DeviceObject, + OUT PULONG NestingLevel, + OUT PULONG NestingFlags OPTIONAL); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#if (NTDDI_VERSION >= NTDDI_VISTASP1) +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlCheckOplockEx( + IN POPLOCK Oplock, + IN PIRP Irp, + IN ULONG Flags, + IN PVOID Context OPTIONAL, + IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, + IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); + +#endif + #if (NTDDI_VERSION >= NTDDI_WIN7) + NTKERNELAPI BOOLEAN NTAPI FsRtlAreThereCurrentOrInProgressFileLocks( IN PFILE_LOCK FileLock); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlOplockIsSharedRequest( + IN PIRP Irp); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlOplockBreakH( + IN POPLOCK Oplock, + IN PIRP Irp, + IN ULONG Flags, + IN PVOID Context OPTIONAL, + IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, + IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlCurrentOplockH( + IN POPLOCK Oplock); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlOplockBreakToNoneEx( + IN OUT POPLOCK Oplock, + IN PIRP Irp, + IN ULONG Flags, + IN PVOID Context OPTIONAL, + IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, + IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlOplockFsctrlEx( + IN POPLOCK Oplock, + IN PIRP Irp, + IN ULONG OpenCount, + IN ULONG Flags); + +NTKERNELAPI +BOOLEAN +NTAPI +FsRtlOplockKeysEqual( + IN PFILE_OBJECT Fo1 OPTIONAL, + IN PFILE_OBJECT Fo2 OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlInitializeExtraCreateParameterList( + IN OUT PECP_LIST EcpList); + +NTKERNELAPI +VOID +NTAPI +FsRtlInitializeExtraCreateParameter( + IN PECP_HEADER Ecp, + IN ULONG EcpFlags, + IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL, + IN ULONG TotalSize, + IN LPCGUID EcpType, + IN PVOID ListAllocatedFrom OPTIONAL); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlInsertPerFileContext( + IN PVOID* PerFileContextPointer, + IN PFSRTL_PER_FILE_CONTEXT Ptr); + +NTKERNELAPI +PFSRTL_PER_FILE_CONTEXT +NTAPI +FsRtlLookupPerFileContext( + IN PVOID* PerFileContextPointer, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL); + +NTKERNELAPI +PFSRTL_PER_FILE_CONTEXT +NTAPI +FsRtlRemovePerFileContext( + IN PVOID* PerFileContextPointer, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +FsRtlTeardownPerFileContexts( + IN PVOID* PerFileContextPointer); + +NTKERNELAPI +NTSTATUS +NTAPI +FsRtlInsertPerFileObjectContext( + IN PFILE_OBJECT FileObject, + IN PFSRTL_PER_FILEOBJECT_CONTEXT Ptr); + +NTKERNELAPI +PFSRTL_PER_FILEOBJECT_CONTEXT +NTAPI +FsRtlLookupPerFileObjectContext( + IN PFILE_OBJECT FileObject, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL); + +NTKERNELAPI +PFSRTL_PER_FILEOBJECT_CONTEXT +NTAPI +FsRtlRemovePerFileObjectContext( + IN PFILE_OBJECT FileObject, + IN PVOID OwnerId OPTIONAL, + IN PVOID InstanceId OPTIONAL); + +#define FsRtlFastLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) ( \ + FsRtlPrivateLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, NULL, A10, A11) \ +) + +#define FsRtlAreThereCurrentFileLocks(FL) ( \ + ((FL)->FastIoIsQuestionable) \ +) + +#define FsRtlIncrementLockRequestsInProgress(FL) { \ + ASSERT( (FL)->LockRequestsInProgress >= 0 ); \ + (void) \ + (InterlockedIncrement((LONG volatile *)&((FL)->LockRequestsInProgress)));\ +} + +#define FsRtlDecrementLockRequestsInProgress(FL) { \ + ASSERT( (FL)->LockRequestsInProgress > 0 ); \ + (void) \ + (InterlockedDecrement((LONG volatile *)&((FL)->LockRequestsInProgress)));\ +} + +extern NTKERNELAPI PUSHORT NlsOemLeadByteInfo; +#define NLS_OEM_LEAD_BYTE_INFO NlsOemLeadByteInfo + +#ifdef NLS_MB_CODE_PAGE_TAG +#undef NLS_MB_CODE_PAGE_TAG #endif +#define NLS_MB_CODE_PAGE_TAG NlsMbOemCodePageTag + +/* GCC compatible definition, MS one is retarded */ +extern NTKERNELAPI const UCHAR * const FsRtlLegalAnsiCharacterArray; +#define LEGAL_ANSI_CHARACTER_ARRAY FsRtlLegalAnsiCharacterArray + +#define FsRtlIsAnsiCharacterWild(C) ( \ + FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], FSRTL_WILD_CHARACTER ) \ +) + +#define FsRtlIsAnsiCharacterLegalFat(C, WILD) ( \ + FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_FAT_LEGAL) | \ + ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ +) + +#define FsRtlIsAnsiCharacterLegalHpfs(C, WILD) ( \ + FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_HPFS_LEGAL) | \ + ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ +) + +#define FsRtlIsAnsiCharacterLegalNtfs(C, WILD) ( \ + FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_NTFS_LEGAL) | \ + ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ +) + +#define FsRtlIsAnsiCharacterLegalNtfsStream(C,WILD_OK) ( \ + FsRtlTestAnsiCharacter((C), TRUE, (WILD_OK), FSRTL_NTFS_STREAM_LEGAL) \ +) + +#define FsRtlIsAnsiCharacterLegal(C,FLAGS) ( \ + FsRtlTestAnsiCharacter((C), TRUE, FALSE, (FLAGS)) \ +) + +#define FsRtlTestAnsiCharacter(C, DEFAULT_RET, WILD_OK, FLAGS) ( \ + ((SCHAR)(C) < 0) ? DEFAULT_RET : \ + FlagOn( LEGAL_ANSI_CHARACTER_ARRAY[(C)], \ + (FLAGS) | \ + ((WILD_OK) ? FSRTL_WILD_CHARACTER : 0) ) \ +) + +#define FsRtlIsLeadDbcsCharacter(DBCS_CHAR) ( \ + (BOOLEAN)((UCHAR)(DBCS_CHAR) < 0x80 ? FALSE : \ + (NLS_MB_CODE_PAGE_TAG && \ + (NLS_OEM_LEAD_BYTE_INFO[(UCHAR)(DBCS_CHAR)] != 0))) \ +) + +#define FsRtlIsUnicodeCharacterWild(C) ( \ + (((C) >= 0x40) ? \ + FALSE : \ + FlagOn(FsRtlLegalAnsiCharacterArray[(C)], FSRTL_WILD_CHARACTER )) \ +) + +#define FsRtlInitPerFileContext( _fc, _owner, _inst, _cb) \ + ((_fc)->OwnerId = (_owner), \ + (_fc)->InstanceId = (_inst), \ + (_fc)->FreeCallback = (_cb)) + +#define FsRtlGetPerFileContextPointer(_fo) \ + (FsRtlSupportsPerFileContexts(_fo) ? \ + FsRtlGetPerStreamContextPointer(_fo)->FileContextSupportPointer : \ + NULL) + +#define FsRtlSupportsPerFileContexts(_fo) \ + ((FsRtlGetPerStreamContextPointer(_fo) != NULL) && \ + (FsRtlGetPerStreamContextPointer(_fo)->Version >= FSRTL_FCB_HEADER_V1) && \ + (FsRtlGetPerStreamContextPointer(_fo)->FileContextSupportPointer != NULL)) + +#define FsRtlSetupAdvancedHeaderEx( _advhdr, _fmutx, _fctxptr ) \ +{ \ + FsRtlSetupAdvancedHeader( _advhdr, _fmutx ); \ + if ((_fctxptr) != NULL) { \ + (_advhdr)->FileContextSupportPointer = (_fctxptr); \ + } \ +} + +#define FsRtlGetPerStreamContextPointer(FO) ( \ + (PFSRTL_ADVANCED_FCB_HEADER)(FO)->FsContext \ +) + +#define FsRtlInitPerStreamContext(PSC, O, I, FC) ( \ + (PSC)->OwnerId = (O), \ + (PSC)->InstanceId = (I), \ + (PSC)->FreeCallback = (FC) \ +) + +#define FsRtlSupportsPerStreamContexts(FO) ( \ + (BOOLEAN)((NULL != FsRtlGetPerStreamContextPointer(FO) && \ + FlagOn(FsRtlGetPerStreamContextPointer(FO)->Flags2, \ + FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS)) \ +) + +#define FsRtlLookupPerStreamContext(_sc, _oid, _iid) \ + (((NULL != (_sc)) && \ + FlagOn((_sc)->Flags2,FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS) && \ + !IsListEmpty(&(_sc)->FilterContexts)) ? \ + FsRtlLookupPerStreamContextInternal((_sc), (_oid), (_iid)) : \ + NULL) + +VOID +FORCEINLINE +NTAPI +FsRtlSetupAdvancedHeader( + IN PVOID AdvHdr, + IN PFAST_MUTEX FMutex ) +{ + PFSRTL_ADVANCED_FCB_HEADER localAdvHdr = (PFSRTL_ADVANCED_FCB_HEADER)AdvHdr; + + localAdvHdr->Flags |= FSRTL_FLAG_ADVANCED_HEADER; + localAdvHdr->Flags2 |= FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS; +#if (NTDDI_VERSION >= NTDDI_VISTA) + localAdvHdr->Version = FSRTL_FCB_HEADER_V1; +#else + localAdvHdr->Version = FSRTL_FCB_HEADER_V0; +#endif + InitializeListHead( &localAdvHdr->FilterContexts ); + if (FMutex != NULL) { + localAdvHdr->FastMutex = FMutex; + } +#if (NTDDI_VERSION >= NTDDI_VISTA) + *((PULONG_PTR)(&localAdvHdr->PushLock)) = 0; + localAdvHdr->FileContextSupportPointer = NULL; +#endif +} + +#define FsRtlInitPerFileObjectContext(_fc, _owner, _inst) \ + ((_fc)->OwnerId = (_owner), (_fc)->InstanceId = (_inst)) + +#define FsRtlCompleteRequest(IRP,STATUS) { \ + (IRP)->IoStatus.Status = (STATUS); \ + IoCompleteRequest( (IRP), IO_DISK_INCREMENT ); \ +} + +#if (NTDDI_VERSION >= NTDDI_WIN7) +typedef struct _ECP_HEADER ECP_HEADER, *PECP_HEADER; +#endif + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +typedef enum _NETWORK_OPEN_LOCATION_QUALIFIER { + NetworkOpenLocationAny, + NetworkOpenLocationRemote, + NetworkOpenLocationLoopback +} NETWORK_OPEN_LOCATION_QUALIFIER; + +typedef enum _NETWORK_OPEN_INTEGRITY_QUALIFIER { + NetworkOpenIntegrityAny, + NetworkOpenIntegrityNone, + NetworkOpenIntegritySigned, + NetworkOpenIntegrityEncrypted, + NetworkOpenIntegrityMaximum +} NETWORK_OPEN_INTEGRITY_QUALIFIER; + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +#define NETWORK_OPEN_ECP_IN_FLAG_DISABLE_HANDLE_COLLAPSING 0x1 +#define NETWORK_OPEN_ECP_IN_FLAG_DISABLE_HANDLE_DURABILITY 0x2 +#define NETWORK_OPEN_ECP_IN_FLAG_FORCE_BUFFERED_SYNCHRONOUS_IO_HACK 0x80000000 + +typedef struct _NETWORK_OPEN_ECP_CONTEXT { + USHORT Size; + USHORT Reserved; + struct { + struct { + NETWORK_OPEN_LOCATION_QUALIFIER Location; + NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; + ULONG Flags; + } in; + struct { + NETWORK_OPEN_LOCATION_QUALIFIER Location; + NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; + ULONG Flags; + } out; + } DUMMYSTRUCTNAME; +} NETWORK_OPEN_ECP_CONTEXT, *PNETWORK_OPEN_ECP_CONTEXT; + +typedef struct _NETWORK_OPEN_ECP_CONTEXT_V0 { + USHORT Size; + USHORT Reserved; + struct { + struct { + NETWORK_OPEN_LOCATION_QUALIFIER Location; + NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; + } in; + struct { + NETWORK_OPEN_LOCATION_QUALIFIER Location; + NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; + } out; + } DUMMYSTRUCTNAME; +} NETWORK_OPEN_ECP_CONTEXT_V0, *PNETWORK_OPEN_ECP_CONTEXT_V0; + +#elif (NTDDI_VERSION >= NTDDI_VISTA) +typedef struct _NETWORK_OPEN_ECP_CONTEXT { + USHORT Size; + USHORT Reserved; + struct { + struct { + NETWORK_OPEN_LOCATION_QUALIFIER Location; + NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; + } in; + struct { + NETWORK_OPEN_LOCATION_QUALIFIER Location; + NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity; + } out; + } DUMMYSTRUCTNAME; +} NETWORK_OPEN_ECP_CONTEXT, *PNETWORK_OPEN_ECP_CONTEXT; +#endif + +DEFINE_GUID(GUID_ECP_NETWORK_OPEN_CONTEXT, 0xc584edbf, 0x00df, 0x4d28, 0xb8, 0x84, 0x35, 0xba, 0xca, 0x89, 0x11, 0xe8 ); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +typedef struct _PREFETCH_OPEN_ECP_CONTEXT { + PVOID Context; +} PREFETCH_OPEN_ECP_CONTEXT, *PPREFETCH_OPEN_ECP_CONTEXT; + +DEFINE_GUID(GUID_ECP_PREFETCH_OPEN, 0xe1777b21, 0x847e, 0x4837, 0xaa, 0x45, 0x64, 0x16, 0x1d, 0x28, 0x6, 0x55 ); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +DEFINE_GUID (GUID_ECP_NFS_OPEN, 0xf326d30c, 0xe5f8, 0x4fe7, 0xab, 0x74, 0xf5, 0xa3, 0x19, 0x6d, 0x92, 0xdb); +DEFINE_GUID(GUID_ECP_SRV_OPEN, 0xbebfaebc, 0xaabf, 0x489d, 0x9d, 0x2c, 0xe9, 0xe3, 0x61, 0x10, 0x28, 0x53 ); + +typedef struct sockaddr_storage *PSOCKADDR_STORAGE_NFS; + +typedef struct _NFS_OPEN_ECP_CONTEXT { + PUNICODE_STRING ExportAlias; + PSOCKADDR_STORAGE_NFS ClientSocketAddress; +} NFS_OPEN_ECP_CONTEXT, *PNFS_OPEN_ECP_CONTEXT, **PPNFS_OPEN_ECP_CONTEXT; + +typedef struct _SRV_OPEN_ECP_CONTEXT { + PUNICODE_STRING ShareName; + PSOCKADDR_STORAGE_NFS SocketAddress; + BOOLEAN OplockBlockState; + BOOLEAN OplockAppState; + BOOLEAN OplockFinalState; +} SRV_OPEN_ECP_CONTEXT, *PSRV_OPEN_ECP_CONTEXT; + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + +#define VACB_MAPPING_GRANULARITY (0x40000) +#define VACB_OFFSET_SHIFT (18) + +typedef struct _PUBLIC_BCB { + CSHORT NodeTypeCode; + CSHORT NodeByteSize; + ULONG MappedLength; + LARGE_INTEGER MappedFileOffset; +} PUBLIC_BCB, *PPUBLIC_BCB; + +typedef struct _CC_FILE_SIZES { + LARGE_INTEGER AllocationSize; + LARGE_INTEGER FileSize; + LARGE_INTEGER ValidDataLength; +} CC_FILE_SIZES, *PCC_FILE_SIZES; + +typedef BOOLEAN +(NTAPI *PACQUIRE_FOR_LAZY_WRITE) ( + IN PVOID Context, + IN BOOLEAN Wait); + +typedef VOID +(NTAPI *PRELEASE_FROM_LAZY_WRITE) ( + IN PVOID Context); + +typedef BOOLEAN +(NTAPI *PACQUIRE_FOR_READ_AHEAD) ( + IN PVOID Context, + IN BOOLEAN Wait); + +typedef VOID +(NTAPI *PRELEASE_FROM_READ_AHEAD) ( + IN PVOID Context); + +typedef struct _CACHE_MANAGER_CALLBACKS { + PACQUIRE_FOR_LAZY_WRITE AcquireForLazyWrite; + PRELEASE_FROM_LAZY_WRITE ReleaseFromLazyWrite; + PACQUIRE_FOR_READ_AHEAD AcquireForReadAhead; + PRELEASE_FROM_READ_AHEAD ReleaseFromReadAhead; +} CACHE_MANAGER_CALLBACKS, *PCACHE_MANAGER_CALLBACKS; + +typedef struct _CACHE_UNINITIALIZE_EVENT { + struct _CACHE_UNINITIALIZE_EVENT *Next; + KEVENT Event; +} CACHE_UNINITIALIZE_EVENT, *PCACHE_UNINITIALIZE_EVENT; + +typedef VOID +(NTAPI *PDIRTY_PAGE_ROUTINE) ( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN PLARGE_INTEGER OldestLsn, + IN PLARGE_INTEGER NewestLsn, + IN PVOID Context1, + IN PVOID Context2); + +typedef VOID +(NTAPI *PFLUSH_TO_LSN) ( + IN PVOID LogHandle, + IN LARGE_INTEGER Lsn); + +typedef VOID +(NTAPI *PCC_POST_DEFERRED_WRITE) ( + IN PVOID Context1, + IN PVOID Context2); + +#define CcIsFileCached(FO) ( \ + ((FO)->SectionObjectPointer != NULL) && \ + (((PSECTION_OBJECT_POINTERS)(FO)->SectionObjectPointer)->SharedCacheMap != NULL) \ +) + +extern ULONG CcFastMdlReadWait; + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +VOID +NTAPI +CcInitializeCacheMap( + IN PFILE_OBJECT FileObject, + IN PCC_FILE_SIZES FileSizes, + IN BOOLEAN PinAccess, + IN PCACHE_MANAGER_CALLBACKS Callbacks, + IN PVOID LazyWriteContext); + +NTKERNELAPI +BOOLEAN +NTAPI +CcUninitializeCacheMap( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER TruncateSize OPTIONAL, + IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +CcSetFileSizes( + IN PFILE_OBJECT FileObject, + IN PCC_FILE_SIZES FileSizes); + +NTKERNELAPI +VOID +NTAPI +CcSetDirtyPageThreshold( + IN PFILE_OBJECT FileObject, + IN ULONG DirtyPageThreshold); + +NTKERNELAPI +VOID +NTAPI +CcFlushCache( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER FileOffset OPTIONAL, + IN ULONG Length, + OUT PIO_STATUS_BLOCK IoStatus OPTIONAL); + +NTKERNELAPI +LARGE_INTEGER +NTAPI +CcGetFlushedValidData( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN BOOLEAN BcbListHeld); + +NTKERNELAPI +BOOLEAN +NTAPI +CcZeroData( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER StartOffset, + IN PLARGE_INTEGER EndOffset, + IN BOOLEAN Wait); + +NTKERNELAPI +PVOID +NTAPI +CcRemapBcb( + IN PVOID Bcb); + +NTKERNELAPI +VOID +NTAPI +CcRepinBcb( + IN PVOID Bcb); + +NTKERNELAPI +VOID +NTAPI +CcUnpinRepinnedBcb( + IN PVOID Bcb, + IN BOOLEAN WriteThrough, + OUT PIO_STATUS_BLOCK IoStatus); + +NTKERNELAPI +PFILE_OBJECT +NTAPI +CcGetFileObjectFromSectionPtrs( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer); + +NTKERNELAPI +PFILE_OBJECT +NTAPI +CcGetFileObjectFromBcb( + IN PVOID Bcb); + +NTKERNELAPI +BOOLEAN +NTAPI +CcCanIWrite( + IN PFILE_OBJECT FileObject, + IN ULONG BytesToWrite, + IN BOOLEAN Wait, + IN BOOLEAN Retrying); + +NTKERNELAPI +VOID +NTAPI +CcDeferWrite( + IN PFILE_OBJECT FileObject, + IN PCC_POST_DEFERRED_WRITE PostRoutine, + IN PVOID Context1, + IN PVOID Context2, + IN ULONG BytesToWrite, + IN BOOLEAN Retrying); + +NTKERNELAPI +BOOLEAN +NTAPI +CcCopyRead( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + OUT PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus); + +NTKERNELAPI +VOID +NTAPI +CcFastCopyRead( + IN PFILE_OBJECT FileObject, + IN ULONG FileOffset, + IN ULONG Length, + IN ULONG PageCount, + OUT PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus); + +NTKERNELAPI +BOOLEAN +NTAPI +CcCopyWrite( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + IN PVOID Buffer); + +NTKERNELAPI +VOID +NTAPI +CcFastCopyWrite( + IN PFILE_OBJECT FileObject, + IN ULONG FileOffset, + IN ULONG Length, + IN PVOID Buffer); + +NTKERNELAPI +VOID +NTAPI +CcMdlRead( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus); + +NTKERNELAPI +VOID +NTAPI +CcMdlReadComplete( + IN PFILE_OBJECT FileObject, + IN PMDL MdlChain); + +NTKERNELAPI +VOID +NTAPI +CcPrepareMdlWrite( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + OUT PMDL *MdlChain, + OUT PIO_STATUS_BLOCK IoStatus); + +NTKERNELAPI +VOID +NTAPI +CcMdlWriteComplete( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN PMDL MdlChain); + +NTKERNELAPI +VOID +NTAPI +CcScheduleReadAhead( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length); + +NTKERNELAPI +NTSTATUS +NTAPI +CcWaitForCurrentLazyWriterActivity( + VOID); + +NTKERNELAPI +VOID +NTAPI +CcSetReadAheadGranularity( + IN PFILE_OBJECT FileObject, + IN ULONG Granularity); + +NTKERNELAPI +BOOLEAN +NTAPI +CcPinRead( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG Flags, + OUT PVOID *Bcb, + OUT PVOID *Buffer); + +NTKERNELAPI +BOOLEAN +NTAPI +CcPinMappedData( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG Flags, + IN OUT PVOID *Bcb); + +NTKERNELAPI +BOOLEAN +NTAPI +CcPreparePinWrite( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Zero, + IN ULONG Flags, + OUT PVOID *Bcb, + OUT PVOID *Buffer); + +NTKERNELAPI +VOID +NTAPI +CcSetDirtyPinnedData( + IN PVOID BcbVoid, + IN PLARGE_INTEGER Lsn OPTIONAL); + +NTKERNELAPI +VOID +NTAPI +CcUnpinData( + IN PVOID Bcb); + +NTKERNELAPI +VOID +NTAPI +CcSetBcbOwnerPointer( + IN PVOID Bcb, + IN PVOID OwnerPointer); + +NTKERNELAPI +VOID +NTAPI +CcUnpinDataForThread( + IN PVOID Bcb, + IN ERESOURCE_THREAD ResourceThreadId); + +NTKERNELAPI +VOID +NTAPI +CcSetAdditionalCacheAttributes( + IN PFILE_OBJECT FileObject, + IN BOOLEAN DisableReadAhead, + IN BOOLEAN DisableWriteBehind); + +NTKERNELAPI +BOOLEAN +NTAPI +CcIsThereDirtyData( + IN PVPB Vpb); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTKERNELAPI +VOID +NTAPI +CcMdlWriteAbort( + IN PFILE_OBJECT FileObject, + IN PMDL MdlChain); + +NTKERNELAPI +VOID +NTAPI +CcSetLogHandleForFile( + IN PFILE_OBJECT FileObject, + IN PVOID LogHandle, + IN PFLUSH_TO_LSN FlushToLsnRoutine); + +NTKERNELAPI +LARGE_INTEGER +NTAPI +CcGetDirtyPages( + IN PVOID LogHandle, + IN PDIRTY_PAGE_ROUTINE DirtyPageRoutine, + IN PVOID Context1, + IN PVOID Context2); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WINXP) +NTKERNELAPI +BOOLEAN +NTAPI +CcMapData( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN ULONG Flags, + OUT PVOID *Bcb, + OUT PVOID *Buffer); +#elif (NTDDI_VERSION >= NTDDI_WIN2K) +NTKERNELAPI +BOOLEAN +NTAPI +CcMapData( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + OUT PVOID *Bcb, + OUT PVOID *Buffer); +#endif + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTKERNELAPI +NTSTATUS +NTAPI +CcSetFileSizesEx( + IN PFILE_OBJECT FileObject, + IN PCC_FILE_SIZES FileSizes); + +NTKERNELAPI +PFILE_OBJECT +NTAPI +CcGetFileObjectFromSectionPtrsRef( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer); + +NTKERNELAPI +VOID +NTAPI +CcSetParallelFlushFile( + IN PFILE_OBJECT FileObject, + IN BOOLEAN EnableParallelFlush); + +NTKERNELAPI +BOOLEAN +CcIsThereDirtyDataEx( + IN PVPB Vpb, + IN PULONG NumberOfDirtyPages OPTIONAL); + +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) +NTKERNELAPI +VOID +NTAPI +CcCoherencyFlushAndPurgeCache( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER FileOffset OPTIONAL, + IN ULONG Length, + OUT PIO_STATUS_BLOCK IoStatus, + IN ULONG Flags OPTIONAL); +#endif + +#define CcGetFileSizePointer(FO) ( \ + ((PLARGE_INTEGER)((FO)->SectionObjectPointer->SharedCacheMap) + 1) \ +) + +#define UNINITIALIZE_CACHE_MAPS (1) +#define DO_NOT_RETRY_PURGE (2) +#define DO_NOT_PURGE_DIRTY_PAGES (0x4) + +#define CC_FLUSH_AND_PURGE_NO_PURGE (0x1) + +#if (NTDDI_VERSION >= NTDDI_VISTA) +NTKERNELAPI +BOOLEAN +NTAPI +CcPurgeCacheSection( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER FileOffset OPTIONAL, + IN ULONG Length, + IN ULONG Flags); +#elif (NTDDI_VERSION >= NTDDI_WIN2K) +NTKERNELAPI +BOOLEAN +NTAPI +CcPurgeCacheSection( + IN PSECTION_OBJECT_POINTERS SectionObjectPointer, + IN PLARGE_INTEGER FileOffset OPTIONAL, + IN ULONG Length, + IN BOOLEAN UninitializeCacheMaps); +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) +NTKERNELAPI +BOOLEAN +NTAPI +CcCopyWriteWontFlush( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length); +#else +#define CcCopyWriteWontFlush(FO, FOFF, LEN) ((LEN) <= 0x10000) +#endif + +#define CcReadAhead(FO, FOFF, LEN) ( \ + if ((LEN) >= 256) { \ + CcScheduleReadAhead((FO), (FOFF), (LEN)); \ + } \ +) + +#define PIN_WAIT (1) +#define PIN_EXCLUSIVE (2) +#define PIN_NO_READ (4) +#define PIN_IF_BCB (8) +#define PIN_CALLER_TRACKS_DIRTY_DATA (32) +#define PIN_HIGH_PRIORITY (64) + +#define MAP_WAIT 1 +#define MAP_NO_READ (16) +#define MAP_HIGH_PRIORITY (64) + +#define IOCTL_REDIR_QUERY_PATH CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 99, METHOD_NEITHER, FILE_ANY_ACCESS) +#define IOCTL_REDIR_QUERY_PATH_EX CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 100, METHOD_NEITHER, FILE_ANY_ACCESS) + +typedef struct _QUERY_PATH_REQUEST { + ULONG PathNameLength; + PIO_SECURITY_CONTEXT SecurityContext; + WCHAR FilePathName[1]; +} QUERY_PATH_REQUEST, *PQUERY_PATH_REQUEST; + +typedef struct _QUERY_PATH_REQUEST_EX { + PIO_SECURITY_CONTEXT pSecurityContext; + ULONG EaLength; + PVOID pEaBuffer; + UNICODE_STRING PathName; + UNICODE_STRING DomainServiceName; + ULONG_PTR Reserved[ 3 ]; +} QUERY_PATH_REQUEST_EX, *PQUERY_PATH_REQUEST_EX; + +typedef struct _QUERY_PATH_RESPONSE { + ULONG LengthAccepted; +} QUERY_PATH_RESPONSE, *PQUERY_PATH_RESPONSE; + +#define VOLSNAPCONTROLTYPE 0x00000053 +#define IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES CTL_CODE(VOLSNAPCONTROLTYPE, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryObject( + IN HANDLE Handle OPTIONAL, + IN OBJECT_INFORMATION_CLASS ObjectInformationClass, + OUT PVOID ObjectInformation OPTIONAL, + IN ULONG ObjectInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +NTSYSAPI +NTSTATUS +NTAPI +ZwNotifyChangeKey( + IN HANDLE KeyHandle, + IN HANDLE EventHandle OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG NotifyFilter, + IN BOOLEAN WatchSubtree, + OUT PVOID Buffer, + IN ULONG BufferLength, + IN BOOLEAN Asynchronous); + +NTSYSAPI +NTSTATUS +NTAPI +ZwCreateEvent( + OUT PHANDLE EventHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN EVENT_TYPE EventType, + IN BOOLEAN InitialState); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDeleteFile( + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryDirectoryFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass, + IN BOOLEAN ReturnSingleEntry, + IN PUNICODE_STRING FileName OPTIONAL, + IN BOOLEAN RestartScan); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetVolumeInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID FsInformation, + IN ULONG Length, + IN FS_INFORMATION_CLASS FsInformationClass); + +NTSYSAPI +NTSTATUS +NTAPI +ZwFsControlFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN ULONG FsControlCode, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDuplicateObject( + IN HANDLE SourceProcessHandle, + IN HANDLE SourceHandle, + IN HANDLE TargetProcessHandle OPTIONAL, + OUT PHANDLE TargetHandle OPTIONAL, + IN ACCESS_MASK DesiredAccess, + IN ULONG HandleAttributes, + IN ULONG Options); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenDirectoryObject( + OUT PHANDLE DirectoryHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes); + +NTSYSAPI +NTSTATUS +NTAPI +ZwAllocateVirtualMemory( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN ULONG_PTR ZeroBits, + IN OUT PSIZE_T RegionSize, + IN ULONG AllocationType, + IN ULONG Protect); + +NTSYSAPI +NTSTATUS +NTAPI +ZwFreeVirtualMemory( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PSIZE_T RegionSize, + IN ULONG FreeType); + +NTSYSAPI +NTSTATUS +NTAPI +ZwWaitForSingleObject( + IN HANDLE Handle, + IN BOOLEAN Alertable, + IN PLARGE_INTEGER Timeout OPTIONAL); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetEvent( + IN HANDLE EventHandle, + OUT PLONG PreviousState OPTIONAL); + +NTSYSAPI +NTSTATUS +NTAPI +ZwFlushVirtualMemory( + IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PSIZE_T RegionSize, + OUT PIO_STATUS_BLOCK IoStatusBlock); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryInformationToken( + IN HANDLE TokenHandle, + IN TOKEN_INFORMATION_CLASS TokenInformationClass, + OUT PVOID TokenInformation, + IN ULONG Length, + OUT PULONG ResultLength); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetSecurityObject( + IN HANDLE Handle, + IN SECURITY_INFORMATION SecurityInformation, + IN PSECURITY_DESCRIPTOR SecurityDescriptor); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQuerySecurityObject( + IN HANDLE FileHandle, + IN SECURITY_INFORMATION SecurityInformation, + OUT PSECURITY_DESCRIPTOR SecurityDescriptor, + IN ULONG Length, + OUT PULONG ResultLength); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenProcessTokenEx( + IN HANDLE ProcessHandle, + IN ACCESS_MASK DesiredAccess, + IN ULONG HandleAttributes, + OUT PHANDLE TokenHandle); + +NTSYSAPI +NTSTATUS +NTAPI +ZwOpenThreadTokenEx( + IN HANDLE ThreadHandle, + IN ACCESS_MASK DesiredAccess, + IN BOOLEAN OpenAsSelf, + IN ULONG HandleAttributes, + OUT PHANDLE TokenHandle); + +#endif + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTSYSAPI +NTSTATUS +NTAPI +ZwLockFile( + IN HANDLE FileHandle, + IN HANDLE Event OPTIONAL, + IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, + IN PVOID ApcContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER ByteOffset, + IN PLARGE_INTEGER Length, + IN ULONG Key, + IN BOOLEAN FailImmediately, + IN BOOLEAN ExclusiveLock); + +NTSYSAPI +NTSTATUS +NTAPI +ZwUnlockFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PLARGE_INTEGER ByteOffset, + IN PLARGE_INTEGER Length, + IN ULONG Key); + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryQuotaInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN BOOLEAN ReturnSingleEntry, + IN PVOID SidList, + IN ULONG SidListLength, + IN PSID StartSid OPTIONAL, + IN BOOLEAN RestartScan); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetQuotaInformationFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID Buffer, + IN ULONG Length); + +NTSYSAPI +NTSTATUS +NTAPI +ZwFlushBuffersFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#if (NTDDI_VERSION >= NTDDI_WIN7) +NTSYSAPI +NTSTATUS +NTAPI +ZwSetInformationToken( + IN HANDLE TokenHandle, + IN TOKEN_INFORMATION_CLASS TokenInformationClass, + IN PVOID TokenInformation, + IN ULONG TokenInformationLength); +#endif + +NTSYSAPI +NTSTATUS +NTAPI +ZwQueryEaFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN BOOLEAN ReturnSingleEntry, + IN PVOID EaList OPTIONAL, + IN ULONG EaListLength, + IN PULONG EaIndex OPTIONAL, + IN BOOLEAN RestartScan); + +NTSYSAPI +NTSTATUS +NTAPI +ZwSetEaFile( + IN HANDLE FileHandle, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length); + +NTSYSAPI +NTSTATUS +NTAPI +ZwDuplicateToken( + IN HANDLE ExistingTokenHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN BOOLEAN EffectiveOnly, + IN TOKEN_TYPE TokenType, + OUT PHANDLE NewTokenHandle); #pragma pack(push,4) @@ -6863,11 +8890,6 @@ FsRtlAreThereCurrentOrInProgressFileLocks( #include "csq.h" -#ifdef _NTOSKRNL_ -extern PUCHAR FsRtlLegalAnsiCharacterArray; -#else -extern DECLSPEC_IMPORT PUCHAR FsRtlLegalAnsiCharacterArray; -#endif extern PACL SePublicDefaultDacl; extern PACL SeSystemDefaultDacl; @@ -6890,30 +8912,11 @@ extern PACL SeSystemDefaultDacl; #define FILE_VC_QUOTAS_LOG_VIOLATIONS 0x00000004 -#define FSRTL_VOLUME_DISMOUNT 1 -#define FSRTL_VOLUME_DISMOUNT_FAILED 2 -#define FSRTL_VOLUME_LOCK 3 -#define FSRTL_VOLUME_LOCK_FAILED 4 -#define FSRTL_VOLUME_UNLOCK 5 -#define FSRTL_VOLUME_MOUNT 6 - -#define FSRTL_WILD_CHARACTER 0x08 - -#define FSRTL_FAT_LEGAL 0x01 -#define FSRTL_HPFS_LEGAL 0x02 -#define FSRTL_NTFS_LEGAL 0x04 -#define FSRTL_WILD_CHARACTER 0x08 -#define FSRTL_OLE_LEGAL 0x10 -#define FSRTL_NTFS_STREAM_LEGAL 0x14 - #ifdef _X86_ #define HARDWARE_PTE HARDWARE_PTE_X86 #define PHARDWARE_PTE PHARDWARE_PTE_X86 #endif -#define IO_CHECK_CREATE_PARAMETERS 0x0200 -#define IO_ATTACH_DEVICE 0x0400 - #define IO_ATTACH_DEVICE_API 0x80000000 #define IO_TYPE_APC 18 @@ -6932,8 +8935,6 @@ extern PACL SeSystemDefaultDacl; #define MEM_DOS_LIM 0x40000000 -#define MCB_FLAG_RAISE_ON_ALLOCATION_FAILURE 1 - #define OB_TYPE_TYPE 1 #define OB_TYPE_DIRECTORY 2 #define OB_TYPE_SYMBOLIC_LINK 3 @@ -6958,23 +8959,12 @@ extern PACL SeSystemDefaultDacl; #define OB_TYPE_IO_COMPLETION 22 #define OB_TYPE_FILE 23 -#define PIN_WAIT (1) -#define PIN_EXCLUSIVE (2) -#define PIN_NO_READ (4) -#define PIN_IF_BCB (8) - #define SEC_BASED 0x00200000 -#define SECURITY_WORLD_SID_AUTHORITY {0,0,0,0,0,1} -#define SECURITY_WORLD_RID (0x00000000L) - /* end winnt.h */ #define TOKEN_HAS_ADMIN_GROUP 0x08 -#define VACB_MAPPING_GRANULARITY (0x40000) -#define VACB_OFFSET_SHIFT (18) - #if (VER_PRODUCTBUILD >= 1381) #define FSCTL_GET_HFS_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 31, METHOD_BUFFERED, FILE_ANY_ACCESS) #endif /* (VER_PRODUCTBUILD >= 1381) */ @@ -7001,18 +8991,6 @@ extern PACL SeSystemDefaultDacl; #define FSCTL_NETWORK_SET_DOMAIN_NAME CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_ANY_ACCESS) #define FSCTL_NETWORK_REMOTE_BOOT_INIT_SCRT CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 250, METHOD_BUFFERED, FILE_ANY_ACCESS) -#define IOCTL_REDIR_QUERY_PATH CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 99, METHOD_NEITHER, FILE_ANY_ACCESS) - -typedef PVOID OPLOCK, *POPLOCK; - -// -// Forwarders -// -struct _RTL_AVL_TABLE; -struct _RTL_GENERIC_TABLE; - -typedef PVOID PNOTIFY_SYNC; - typedef enum _FILE_STORAGE_TYPE { StorageTypeDefault = 1, StorageTypeDirectory, @@ -7048,17 +9026,6 @@ typedef struct _BITMAP_RANGE { PULONG Bitmap; } BITMAP_RANGE, *PBITMAP_RANGE; -typedef struct _CACHE_UNINITIALIZE_EVENT { - struct _CACHE_UNINITIALIZE_EVENT *Next; - KEVENT Event; -} CACHE_UNINITIALIZE_EVENT, *PCACHE_UNINITIALIZE_EVENT; - -typedef struct _CC_FILE_SIZES { - LARGE_INTEGER AllocationSize; - LARGE_INTEGER FileSize; - LARGE_INTEGER ValidDataLength; -} CC_FILE_SIZES, *PCC_FILE_SIZES; - typedef struct _FILE_COPY_ON_WRITE_INFORMATION { BOOLEAN ReplaceIfExists; HANDLE RootDirectory; @@ -7081,49 +9048,6 @@ typedef struct _FILE_FULL_DIRECTORY_INFORMATION { WCHAR FileName[ANYSIZE_ARRAY]; } FILE_FULL_DIRECTORY_INFORMATION, *PFILE_FULL_DIRECTORY_INFORMATION; -typedef struct _FILE_FS_FULL_SIZE_INFORMATION { - LARGE_INTEGER TotalAllocationUnits; - LARGE_INTEGER CallerAvailableAllocationUnits; - LARGE_INTEGER ActualAvailableAllocationUnits; - ULONG SectorsPerAllocationUnit; - ULONG BytesPerSector; -} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION; - -typedef struct _FILE_FS_LABEL_INFORMATION { - ULONG VolumeLabelLength; - WCHAR VolumeLabel[1]; -} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION; - -#if (VER_PRODUCTBUILD >= 2195) - -typedef struct _FILE_FS_OBJECT_ID_INFORMATION { - UCHAR ObjectId[16]; - UCHAR ExtendedInfo[48]; -} FILE_FS_OBJECT_ID_INFORMATION, *PFILE_FS_OBJECT_ID_INFORMATION; - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -typedef struct _FILE_FS_SIZE_INFORMATION { - LARGE_INTEGER TotalAllocationUnits; - LARGE_INTEGER AvailableAllocationUnits; - ULONG SectorsPerAllocationUnit; - ULONG BytesPerSector; -} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION; - -typedef struct _FILE_FS_VOLUME_INFORMATION { - LARGE_INTEGER VolumeCreationTime; - ULONG VolumeSerialNumber; - ULONG VolumeLabelLength; - BOOLEAN SupportsObjects; - WCHAR VolumeLabel[1]; -} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION; - -typedef struct _FILE_FS_OBJECTID_INFORMATION -{ - UCHAR ObjectId[16]; - UCHAR ExtendedInfo[48]; -} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION; - /* raw internal file lock struct returned from FsRtlGetNextFileLock */ typedef struct _FILE_SHARED_LOCK_ENTRY { PVOID Unknown1; @@ -7208,51 +9132,6 @@ typedef struct _FILE_OLE_STATE_BITS_INFORMATION { ULONG StateBitsMask; } FILE_OLE_STATE_BITS_INFORMATION, *PFILE_OLE_STATE_BITS_INFORMATION; -typedef enum _FSRTL_COMPARISON_RESULT -{ - LessThan = -1, - EqualTo = 0, - GreaterThan = 1 -} FSRTL_COMPARISON_RESULT; - -#if (VER_PRODUCTBUILD >= 2600) - -typedef struct _FSRTL_PER_STREAM_CONTEXT { - LIST_ENTRY Links; - PVOID OwnerId; - PVOID InstanceId; - PFREE_FUNCTION FreeCallback; -} FSRTL_PER_STREAM_CONTEXT, *PFSRTL_PER_STREAM_CONTEXT; - -typedef struct _FSRTL_PER_FILEOBJECT_CONTEXT -{ - LIST_ENTRY Links; - PVOID OwnerId; - PVOID InstanceId; -} FSRTL_PER_FILEOBJECT_CONTEXT, *PFSRTL_PER_FILEOBJECT_CONTEXT; - -#endif /* (VER_PRODUCTBUILD >= 2600) */ - -typedef struct _BASE_MCB -{ - ULONG MaximumPairCount; - ULONG PairCount; - USHORT PoolType; - USHORT Flags; - PVOID Mapping; -} BASE_MCB, *PBASE_MCB; - -typedef struct _LARGE_MCB -{ - PKGUARDED_MUTEX GuardedMutex; - BASE_MCB BaseMcb; -} LARGE_MCB, *PLARGE_MCB; - -typedef struct _MCB -{ - LARGE_MCB DummyFieldThatSizesThisStructureCorrectly; -} MCB, *PMCB; - typedef struct _MAPPING_PAIR { ULONGLONG Vcn; ULONGLONG Lcn; @@ -7264,8 +9143,6 @@ typedef struct _GET_RETRIEVAL_DESCRIPTOR { MAPPING_PAIR Pair[1]; } GET_RETRIEVAL_DESCRIPTOR, *PGET_RETRIEVAL_DESCRIPTOR; -#define ASSERT_QUEUE(Q) ASSERT(((Q)->Header.Type & KOBJECT_TYPE_MASK) == QueueObject); - typedef struct _MBCB { CSHORT NodeTypeCode; CSHORT NodeIsInZone; @@ -7328,189 +9205,6 @@ typedef struct _OBJECT_ALL_TYPES_INFO { OBJECT_TYPE_INFO ObjectsTypeInfo[1]; } OBJECT_ALL_TYPES_INFO, *POBJECT_ALL_TYPES_INFO; -typedef enum _RTL_GENERIC_COMPARE_RESULTS -{ - GenericLessThan, - GenericGreaterThan, - GenericEqual -} RTL_GENERIC_COMPARE_RESULTS; - -typedef enum _TABLE_SEARCH_RESULT -{ - TableEmptyTree, - TableFoundNode, - TableInsertAsLeft, - TableInsertAsRight -} TABLE_SEARCH_RESULT; - -typedef NTSTATUS -(NTAPI *PRTL_AVL_MATCH_FUNCTION)( - struct _RTL_AVL_TABLE *Table, - PVOID UserData, - PVOID MatchData -); - -typedef RTL_GENERIC_COMPARE_RESULTS -(NTAPI *PRTL_AVL_COMPARE_ROUTINE) ( - struct _RTL_AVL_TABLE *Table, - PVOID FirstStruct, - PVOID SecondStruct -); - -typedef RTL_GENERIC_COMPARE_RESULTS -(NTAPI *PRTL_GENERIC_COMPARE_ROUTINE) ( - struct _RTL_GENERIC_TABLE *Table, - PVOID FirstStruct, - PVOID SecondStruct -); - -typedef PVOID -(NTAPI *PRTL_GENERIC_ALLOCATE_ROUTINE) ( - struct _RTL_GENERIC_TABLE *Table, - CLONG ByteSize -); - -typedef VOID -(NTAPI *PRTL_GENERIC_FREE_ROUTINE) ( - struct _RTL_GENERIC_TABLE *Table, - PVOID Buffer -); - -typedef PVOID -(NTAPI *PRTL_AVL_ALLOCATE_ROUTINE) ( - struct _RTL_AVL_TABLE *Table, - CLONG ByteSize -); - -typedef VOID -(NTAPI *PRTL_AVL_FREE_ROUTINE) ( - struct _RTL_AVL_TABLE *Table, - PVOID Buffer -); - -typedef struct _PUBLIC_BCB { - CSHORT NodeTypeCode; - CSHORT NodeByteSize; - ULONG MappedLength; - LARGE_INTEGER MappedFileOffset; -} PUBLIC_BCB, *PPUBLIC_BCB; - -typedef struct _QUERY_PATH_REQUEST { - ULONG PathNameLength; - PIO_SECURITY_CONTEXT SecurityContext; - WCHAR FilePathName[1]; -} QUERY_PATH_REQUEST, *PQUERY_PATH_REQUEST; - -typedef struct _QUERY_PATH_RESPONSE { - ULONG LengthAccepted; -} QUERY_PATH_RESPONSE, *PQUERY_PATH_RESPONSE; - -typedef struct _RTL_BALANCED_LINKS -{ - struct _RTL_BALANCED_LINKS *Parent; - struct _RTL_BALANCED_LINKS *LeftChild; - struct _RTL_BALANCED_LINKS *RightChild; - CHAR Balance; - UCHAR Reserved[3]; -} RTL_BALANCED_LINKS, *PRTL_BALANCED_LINKS; - -typedef struct _RTL_GENERIC_TABLE -{ - PRTL_SPLAY_LINKS TableRoot; - LIST_ENTRY InsertOrderList; - PLIST_ENTRY OrderedPointer; - ULONG WhichOrderedElement; - ULONG NumberGenericTableElements; - PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine; - PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine; - PRTL_GENERIC_FREE_ROUTINE FreeRoutine; - PVOID TableContext; -} RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE; - -#undef PRTL_GENERIC_COMPARE_ROUTINE -#undef PRTL_GENERIC_ALLOCATE_ROUTINE -#undef PRTL_GENERIC_FREE_ROUTINE -#undef RTL_GENERIC_TABLE -#undef PRTL_GENERIC_TABLE - -#define PRTL_GENERIC_COMPARE_ROUTINE PRTL_AVL_COMPARE_ROUTINE -#define PRTL_GENERIC_ALLOCATE_ROUTINE PRTL_AVL_ALLOCATE_ROUTINE -#define PRTL_GENERIC_FREE_ROUTINE PRTL_AVL_FREE_ROUTINE -#define RTL_GENERIC_TABLE RTL_AVL_TABLE -#define PRTL_GENERIC_TABLE PRTL_AVL_TABLE - -#define RtlInitializeGenericTable RtlInitializeGenericTableAvl -#define RtlInsertElementGenericTable RtlInsertElementGenericTableAvl -#define RtlInsertElementGenericTableFull RtlInsertElementGenericTableFullAvl -#define RtlDeleteElementGenericTable RtlDeleteElementGenericTableAvl -#define RtlLookupElementGenericTable RtlLookupElementGenericTableAvl -#define RtlLookupElementGenericTableFull RtlLookupElementGenericTableFullAvl -#define RtlEnumerateGenericTable RtlEnumerateGenericTableAvl -#define RtlEnumerateGenericTableWithoutSplaying RtlEnumerateGenericTableWithoutSplayingAvl -#define RtlGetElementGenericTable RtlGetElementGenericTableAvl -#define RtlNumberGenericTableElements RtlNumberGenericTableElementsAvl -#define RtlIsGenericTableEmpty RtlIsGenericTableEmptyAvl - -typedef struct _RTL_AVL_TABLE -{ - RTL_BALANCED_LINKS BalancedRoot; - PVOID OrderedPointer; - ULONG WhichOrderedElement; - ULONG NumberGenericTableElements; - ULONG DepthOfTree; - PRTL_BALANCED_LINKS RestartKey; - ULONG DeleteCount; - PRTL_AVL_COMPARE_ROUTINE CompareRoutine; - PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine; - PRTL_AVL_FREE_ROUTINE FreeRoutine; - PVOID TableContext; -} RTL_AVL_TABLE, *PRTL_AVL_TABLE; - -NTSYSAPI -VOID -NTAPI -RtlInitializeGenericTableAvl( - PRTL_AVL_TABLE Table, - PRTL_AVL_COMPARE_ROUTINE CompareRoutine, - PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine, - PRTL_AVL_FREE_ROUTINE FreeRoutine, - PVOID TableContext -); - -NTSYSAPI -PVOID -NTAPI -RtlInsertElementGenericTableAvl ( - PRTL_AVL_TABLE Table, - PVOID Buffer, - CLONG BufferSize, - PBOOLEAN NewElement OPTIONAL - ); - -NTSYSAPI -BOOLEAN -NTAPI -RtlDeleteElementGenericTableAvl ( - PRTL_AVL_TABLE Table, - PVOID Buffer - ); - -NTSYSAPI -PVOID -NTAPI -RtlLookupElementGenericTableAvl ( - PRTL_AVL_TABLE Table, - PVOID Buffer - ); - -NTSYSAPI -PVOID -NTAPI -RtlEnumerateGenericTableWithoutSplayingAvl ( - PRTL_AVL_TABLE Table, - PVOID *RestartKey - ); - #if defined(USE_LPC6432) #define LPC_CLIENT_ID CLIENT_ID64 #define LPC_SIZE_T ULONGLONG @@ -7575,13 +9269,6 @@ typedef struct _REMOTE_PORT_VIEW LPC_PVOID ViewBase; } REMOTE_PORT_VIEW, *PREMOTE_PORT_VIEW; -typedef struct _TUNNEL { - FAST_MUTEX Mutex; - PRTL_SPLAY_LINKS Cache; - LIST_ENTRY TimerQueue; - USHORT NumEntries; -} TUNNEL, *PTUNNEL; - typedef struct _VAD_HEADER { PVOID StartVPN; PVOID EndVPN; @@ -7596,150 +9283,6 @@ typedef struct _VAD_HEADER { LIST_ENTRY Secured; } VAD_HEADER, *PVAD_HEADER; -#if (VER_PRODUCTBUILD >= 2600) - -typedef BOOLEAN -(NTAPI *PFILTER_REPORT_CHANGE) ( - IN PVOID NotifyContext, - IN PVOID FilterContext -); - -#endif - -NTKERNELAPI -BOOLEAN -NTAPI -CcCanIWrite ( - IN PFILE_OBJECT FileObject, - IN ULONG BytesToWrite, - IN BOOLEAN Wait, - IN BOOLEAN Retrying -); - -NTKERNELAPI -BOOLEAN -NTAPI -CcCopyRead ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - OUT PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus -); - -NTKERNELAPI -BOOLEAN -NTAPI -CcCopyWrite ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN PVOID Buffer -); - -#define CcCopyWriteWontFlush(FO, FOFF, LEN) ((LEN) <= 0x10000) - -typedef VOID (NTAPI *PCC_POST_DEFERRED_WRITE) ( - IN PVOID Context1, - IN PVOID Context2 -); - -NTKERNELAPI -VOID -NTAPI -CcDeferWrite ( - IN PFILE_OBJECT FileObject, - IN PCC_POST_DEFERRED_WRITE PostRoutine, - IN PVOID Context1, - IN PVOID Context2, - IN ULONG BytesToWrite, - IN BOOLEAN Retrying -); - -NTKERNELAPI -VOID -NTAPI -CcFastCopyRead ( - IN PFILE_OBJECT FileObject, - IN ULONG FileOffset, - IN ULONG Length, - IN ULONG PageCount, - OUT PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus -); - -NTKERNELAPI -VOID -NTAPI -CcFastCopyWrite ( - IN PFILE_OBJECT FileObject, - IN ULONG FileOffset, - IN ULONG Length, - IN PVOID Buffer -); - -NTKERNELAPI -VOID -NTAPI -CcFlushCache ( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN PLARGE_INTEGER FileOffset OPTIONAL, - IN ULONG Length, - OUT PIO_STATUS_BLOCK IoStatus OPTIONAL -); - -typedef VOID (NTAPI *PDIRTY_PAGE_ROUTINE) ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN PLARGE_INTEGER OldestLsn, - IN PLARGE_INTEGER NewestLsn, - IN PVOID Context1, - IN PVOID Context2 -); - -NTKERNELAPI -LARGE_INTEGER -NTAPI -CcGetDirtyPages ( - IN PVOID LogHandle, - IN PDIRTY_PAGE_ROUTINE DirtyPageRoutine, - IN PVOID Context1, - IN PVOID Context2 -); - -NTKERNELAPI -PFILE_OBJECT -NTAPI -CcGetFileObjectFromBcb ( - IN PVOID Bcb -); - -NTKERNELAPI -PFILE_OBJECT -NTAPI -CcGetFileObjectFromSectionPtrs ( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer -); - -#define CcGetFileSizePointer(FO) ( \ - ((PLARGE_INTEGER)((FO)->SectionObjectPointer->SharedCacheMap) + 1) \ -) - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -LARGE_INTEGER -NTAPI -CcGetFlushedValidData ( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN BOOLEAN BcbListHeld -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - NTKERNELAPI LARGE_INTEGER NTAPI @@ -7748,428 +9291,6 @@ CcGetLsnForFileObject ( OUT PLARGE_INTEGER OldestLsn OPTIONAL ); -typedef BOOLEAN (NTAPI *PACQUIRE_FOR_LAZY_WRITE) ( - IN PVOID Context, - IN BOOLEAN Wait -); - -typedef VOID (NTAPI *PRELEASE_FROM_LAZY_WRITE) ( - IN PVOID Context -); - -typedef BOOLEAN (NTAPI *PACQUIRE_FOR_READ_AHEAD) ( - IN PVOID Context, - IN BOOLEAN Wait -); - -typedef VOID (NTAPI *PRELEASE_FROM_READ_AHEAD) ( - IN PVOID Context -); - -typedef struct _CACHE_MANAGER_CALLBACKS { - PACQUIRE_FOR_LAZY_WRITE AcquireForLazyWrite; - PRELEASE_FROM_LAZY_WRITE ReleaseFromLazyWrite; - PACQUIRE_FOR_READ_AHEAD AcquireForReadAhead; - PRELEASE_FROM_READ_AHEAD ReleaseFromReadAhead; -} CACHE_MANAGER_CALLBACKS, *PCACHE_MANAGER_CALLBACKS; - -NTKERNELAPI -VOID -NTAPI -CcInitializeCacheMap ( - IN PFILE_OBJECT FileObject, - IN PCC_FILE_SIZES FileSizes, - IN BOOLEAN PinAccess, - IN PCACHE_MANAGER_CALLBACKS Callbacks, - IN PVOID LazyWriteContext -); - -#define CcIsFileCached(FO) ( \ - ((FO)->SectionObjectPointer != NULL) && \ - (((PSECTION_OBJECT_POINTERS)(FO)->SectionObjectPointer)->SharedCacheMap != NULL) \ -) - -extern ULONG CcFastMdlReadWait; - -NTKERNELAPI -BOOLEAN -NTAPI -CcIsThereDirtyData ( - IN PVPB Vpb -); - -NTKERNELAPI -BOOLEAN -NTAPI -CcMapData ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG Flags, - OUT PVOID *Bcb, - OUT PVOID *Buffer -); - -NTKERNELAPI -VOID -NTAPI -CcMdlRead ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus -); - -NTKERNELAPI -VOID -NTAPI -CcMdlReadComplete ( - IN PFILE_OBJECT FileObject, - IN PMDL MdlChain -); - -NTKERNELAPI -VOID -NTAPI -CcMdlWriteComplete ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN PMDL MdlChain -); - -#define MAP_WAIT 1 - -NTKERNELAPI -BOOLEAN -NTAPI -CcPinMappedData ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG Flags, - IN OUT PVOID *Bcb -); - -NTKERNELAPI -BOOLEAN -NTAPI -CcPinRead ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG Flags, - OUT PVOID *Bcb, - OUT PVOID *Buffer -); - -NTKERNELAPI -VOID -NTAPI -CcPrepareMdlWrite ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus -); - -NTKERNELAPI -BOOLEAN -NTAPI -CcPreparePinWrite ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Zero, - IN ULONG Flags, - OUT PVOID *Bcb, - OUT PVOID *Buffer -); - -NTKERNELAPI -BOOLEAN -NTAPI -CcPurgeCacheSection ( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN PLARGE_INTEGER FileOffset OPTIONAL, - IN ULONG Length, - IN BOOLEAN UninitializeCacheMaps -); - -#define CcReadAhead(FO, FOFF, LEN) ( \ - if ((LEN) >= 256) { \ - CcScheduleReadAhead((FO), (FOFF), (LEN)); \ - } \ -) - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -PVOID -NTAPI -CcRemapBcb ( - IN PVOID Bcb -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTKERNELAPI -VOID -NTAPI -CcRepinBcb ( - IN PVOID Bcb -); - -NTKERNELAPI -VOID -NTAPI -CcScheduleReadAhead ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length -); - -NTKERNELAPI -VOID -NTAPI -CcSetAdditionalCacheAttributes ( - IN PFILE_OBJECT FileObject, - IN BOOLEAN DisableReadAhead, - IN BOOLEAN DisableWriteBehind -); - -NTKERNELAPI -VOID -NTAPI -CcSetBcbOwnerPointer ( - IN PVOID Bcb, - IN PVOID OwnerPointer -); - -NTKERNELAPI -VOID -NTAPI -CcSetDirtyPageThreshold ( - IN PFILE_OBJECT FileObject, - IN ULONG DirtyPageThreshold -); - -NTKERNELAPI -VOID -NTAPI -CcSetDirtyPinnedData ( - IN PVOID BcbVoid, - IN PLARGE_INTEGER Lsn OPTIONAL -); - -NTKERNELAPI -VOID -NTAPI -CcSetFileSizes ( - IN PFILE_OBJECT FileObject, - IN PCC_FILE_SIZES FileSizes -); - -typedef VOID (NTAPI *PFLUSH_TO_LSN) ( - IN PVOID LogHandle, - IN LARGE_INTEGER Lsn -); - -NTKERNELAPI -VOID -NTAPI -CcSetLogHandleForFile ( - IN PFILE_OBJECT FileObject, - IN PVOID LogHandle, - IN PFLUSH_TO_LSN FlushToLsnRoutine -); - -NTKERNELAPI -VOID -NTAPI -CcSetReadAheadGranularity ( - IN PFILE_OBJECT FileObject, - IN ULONG Granularity /* default: PAGE_SIZE */ - /* allowed: 2^n * PAGE_SIZE */ -); - -NTKERNELAPI -BOOLEAN -NTAPI -CcUninitializeCacheMap ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER TruncateSize OPTIONAL, - IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL -); - -NTKERNELAPI -VOID -NTAPI -CcUnpinData ( - IN PVOID Bcb -); - -NTKERNELAPI -VOID -NTAPI -CcUnpinDataForThread ( - IN PVOID Bcb, - IN ERESOURCE_THREAD ResourceThreadId -); - -NTKERNELAPI -VOID -NTAPI -CcUnpinRepinnedBcb ( - IN PVOID Bcb, - IN BOOLEAN WriteThrough, - OUT PIO_STATUS_BLOCK IoStatus -); - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -NTSTATUS -NTAPI -CcWaitForCurrentLazyWriterActivity ( - VOID -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTKERNELAPI -BOOLEAN -NTAPI -CcZeroData ( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER StartOffset, - IN PLARGE_INTEGER EndOffset, - IN BOOLEAN Wait -); - -#if (VER_PRODUCTBUILD >= 2600) - -#ifndef __NTOSKRNL__ -NTKERNELAPI -VOID -FASTCALL -ExInitializeRundownProtection ( - IN PEX_RUNDOWN_REF RunRef -); - -NTKERNELAPI -VOID -FASTCALL -ExReInitializeRundownProtection ( - IN PEX_RUNDOWN_REF RunRef -); - -NTKERNELAPI -BOOLEAN -FASTCALL -ExAcquireRundownProtection ( - IN PEX_RUNDOWN_REF RunRef -); - -NTKERNELAPI -BOOLEAN -FASTCALL -ExAcquireRundownProtectionEx ( - IN PEX_RUNDOWN_REF RunRef, - IN ULONG Count -); - -NTKERNELAPI -VOID -FASTCALL -ExReleaseRundownProtection ( - IN PEX_RUNDOWN_REF RunRef -); - -NTKERNELAPI -VOID -FASTCALL -ExReleaseRundownProtectionEx ( - IN PEX_RUNDOWN_REF RunRef, - IN ULONG Count -); - -NTKERNELAPI -VOID -FASTCALL -ExRundownCompleted ( - IN PEX_RUNDOWN_REF RunRef -); - -NTKERNELAPI -VOID -FASTCALL -ExWaitForRundownProtectionRelease ( - IN PEX_RUNDOWN_REF RunRef -); - -#endif -#endif /* (VER_PRODUCTBUILD >= 2600) */ - - -#define FsRtlSetupAdvancedHeader( _advhdr, _fmutx ) \ -{ \ - SetFlag( (_advhdr)->Flags, FSRTL_FLAG_ADVANCED_HEADER ); \ - SetFlag( (_advhdr)->Flags2, FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS ); \ - (_advhdr)->Version = FSRTL_FCB_HEADER_V1; \ - InitializeListHead( &(_advhdr)->FilterContexts ); \ - if ((_fmutx) != NULL) { \ - (_advhdr)->FastMutex = (_fmutx); \ - } \ - *((PULONG_PTR)(&(_advhdr)->PushLock)) = 0; \ - /*ExInitializePushLock( &(_advhdr)->PushLock ); API Not avaliable downlevel*/\ - (_advhdr)->FileContextSupportPointer = NULL; \ -} - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAddBaseMcbEntry ( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Lbn, - IN LONGLONG SectorCount -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAddLargeMcbEntry ( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Lbn, - IN LONGLONG SectorCount -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAddMcbEntry ( - IN PMCB Mcb, - IN VBN Vbn, - IN LBN Lbn, - IN ULONG SectorCount -); - -NTKERNELAPI -VOID -NTAPI -FsRtlAddToTunnelCache ( - IN PTUNNEL Cache, - IN ULONGLONG DirectoryKey, - IN PUNICODE_STRING ShortName, - IN PUNICODE_STRING LongName, - IN BOOLEAN KeyByShortName, - IN ULONG DataLength, - IN PVOID Data -); - NTKERNELAPI PVOID NTAPI @@ -8204,251 +9325,6 @@ FsRtlAllocatePoolWithTag ( IN ULONG Tag ); -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlAreNamesEqual ( - IN PCUNICODE_STRING Name1, - IN PCUNICODE_STRING Name2, - IN BOOLEAN IgnoreCase, - IN PCWCH UpcaseTable OPTIONAL -); - -#define FsRtlAreThereCurrentFileLocks(FL) ( \ - ((FL)->FastIoIsQuestionable) \ -) - -typedef -VOID -(NTAPI*POPLOCK_WAIT_COMPLETE_ROUTINE) ( - IN PVOID Context, - IN PIRP Irp -); - -typedef -VOID -(NTAPI*POPLOCK_FS_PREPOST_IRP) ( - IN PVOID Context, - IN PIRP Irp -); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlCheckOplock ( - IN POPLOCK Oplock, - IN PIRP Irp, - IN PVOID Context, - IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, - IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlCurrentBatchOplock ( - IN POPLOCK Oplock -); - -NTKERNELAPI -VOID -NTAPI -FsRtlDeleteKeyFromTunnelCache ( - IN PTUNNEL Cache, - IN ULONGLONG DirectoryKey -); - -NTKERNELAPI -VOID -NTAPI -FsRtlDeleteTunnelCache ( - IN PTUNNEL Cache -); - -NTKERNELAPI -VOID -NTAPI -FsRtlDeregisterUncProvider ( - IN HANDLE Handle -); - -NTKERNELAPI -VOID -NTAPI -FsRtlDissectDbcs ( - IN ANSI_STRING Name, - OUT PANSI_STRING FirstPart, - OUT PANSI_STRING RemainingPart -); - -NTKERNELAPI -VOID -NTAPI -FsRtlDissectName ( - IN UNICODE_STRING Name, - OUT PUNICODE_STRING FirstPart, - OUT PUNICODE_STRING RemainingPart -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlDoesDbcsContainWildCards ( - IN PANSI_STRING Name -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlDoesNameContainWildCards ( - IN PUNICODE_STRING Name -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsFatDbcsLegal ( - IN ANSI_STRING DbcsName, - IN BOOLEAN WildCardsPermissible, - IN BOOLEAN PathNamePermissible, - IN BOOLEAN LeadingBackslashPermissible - ); - - -#define FsRtlCompleteRequest(IRP,STATUS) { \ - (IRP)->IoStatus.Status = (STATUS); \ - IoCompleteRequest( (IRP), IO_DISK_INCREMENT ); \ -} - -#define FsRtlEnterFileSystem KeEnterCriticalRegion - -#define FsRtlExitFileSystem KeLeaveCriticalRegion - -#define FsRtlFastLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) ( \ - FsRtlPrivateLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, NULL, A10, A11) \ -) - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlFindInTunnelCache ( - IN PTUNNEL Cache, - IN ULONGLONG DirectoryKey, - IN PUNICODE_STRING Name, - OUT PUNICODE_STRING ShortName, - OUT PUNICODE_STRING LongName, - IN OUT PULONG DataLength, - OUT PVOID Data -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlGetNextBaseMcbEntry ( - IN PBASE_MCB Mcb, - IN ULONG RunIndex, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn, - OUT PLONGLONG SectorCount -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlGetNextLargeMcbEntry ( - IN PLARGE_MCB Mcb, - IN ULONG RunIndex, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn, - OUT PLONGLONG SectorCount -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlGetNextMcbEntry ( - IN PMCB Mcb, - IN ULONG RunIndex, - OUT PVBN Vbn, - OUT PLBN Lbn, - OUT PULONG SectorCount -); - -#define FsRtlGetPerStreamContextPointer(FO) ( \ - (PFSRTL_ADVANCED_FCB_HEADER)(FO)->FsContext \ -) - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeBaseMcb ( - IN PBASE_MCB Mcb, - IN POOL_TYPE PoolType -); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeLargeMcb ( - IN PLARGE_MCB Mcb, - IN POOL_TYPE PoolType -); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeMcb ( - IN PMCB Mcb, - IN POOL_TYPE PoolType -); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeOplock ( - IN OUT POPLOCK Oplock -); - -NTKERNELAPI -VOID -NTAPI -FsRtlInitializeTunnelCache ( - IN PTUNNEL Cache -); - -#define FsRtlInitPerStreamContext(PSC, O, I, FC) ( \ - (PSC)->OwnerId = (O), \ - (PSC)->InstanceId = (I), \ - (PSC)->FreeCallback = (FC) \ -) - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlInsertPerStreamContext ( - IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext, - IN PFSRTL_PER_STREAM_CONTEXT Ptr -); - -#define FsRtlIsAnsiCharacterLegalFat(C, WILD) ( \ - FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_FAT_LEGAL) | \ - ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ -) - -#define FsRtlIsAnsiCharacterLegalHpfs(C, WILD) ( \ - FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_HPFS_LEGAL) | \ - ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ -) - -#define FsRtlIsAnsiCharacterLegalNtfs(C, WILD) ( \ - FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_NTFS_LEGAL) | \ - ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \ -) - -#define FsRtlIsAnsiCharacterWild(C) ( \ - FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], FSRTL_WILD_CHARACTER ) \ -) - NTKERNELAPI BOOLEAN NTAPI @@ -8459,142 +9335,6 @@ FsRtlIsFatDbcsLegal ( IN BOOLEAN LeadingBackslashPermissible ); -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsHpfsDbcsLegal ( - IN ANSI_STRING DbcsName, - IN BOOLEAN WildCardsPermissible, - IN BOOLEAN PathNamePermissible, - IN BOOLEAN LeadingBackslashPermissible -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsNameInExpression ( - IN PUNICODE_STRING Expression, - IN PUNICODE_STRING Name, - IN BOOLEAN IgnoreCase, - IN PWCHAR UpcaseTable OPTIONAL -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsNtstatusExpected ( - IN NTSTATUS Ntstatus -); - -#define NLS_OEM_LEAD_BYTE_INFO NlsOemLeadByteInfo - -extern PUSHORT NlsOemLeadByteInfo; - -#define FsRtlIsLeadDbcsCharacter(DBCS_CHAR) ( \ - (BOOLEAN)((UCHAR)(DBCS_CHAR) < 0x80 ? FALSE : \ - (NLS_MB_CODE_PAGE_TAG && \ - (NLS_OEM_LEAD_BYTE_INFO[(UCHAR)(DBCS_CHAR)] != 0))) \ -) - -#define FsRtlIsUnicodeCharacterWild(C) ( \ - (((C) >= 0x40) ? \ - FALSE : \ - FlagOn(FsRtlLegalAnsiCharacterArray[(C)], FSRTL_WILD_CHARACTER )) \ -) - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupBaseMcbEntry ( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - OUT PLONGLONG Lbn OPTIONAL, - OUT PLONGLONG SectorCountFromLbn OPTIONAL, - OUT PLONGLONG StartingLbn OPTIONAL, - OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, - OUT PULONG Index OPTIONAL -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLargeMcbEntry ( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - OUT PLONGLONG Lbn OPTIONAL, - OUT PLONGLONG SectorCountFromLbn OPTIONAL, - OUT PLONGLONG StartingLbn OPTIONAL, - OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, - OUT PULONG Index OPTIONAL -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastBaseMcbEntry ( - IN PBASE_MCB Mcb, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastLargeMcbEntry ( - IN PLARGE_MCB Mcb, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastMcbEntry ( - IN PMCB Mcb, - OUT PVBN Vbn, - OUT PLBN Lbn -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastBaseMcbEntryAndIndex ( - IN PBASE_MCB OpaqueMcb, - IN OUT PLONGLONG LargeVbn, - IN OUT PLONGLONG LargeLbn, - IN OUT PULONG Index -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupLastLargeMcbEntryAndIndex ( - IN PLARGE_MCB OpaqueMcb, - OUT PLONGLONG LargeVbn, - OUT PLONGLONG LargeLbn, - OUT PULONG Index -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlLookupMcbEntry ( - IN PMCB Mcb, - IN VBN Vbn, - OUT PLBN Lbn, - OUT PULONG SectorCount OPTIONAL, - OUT PULONG Index -); - -NTKERNELAPI -PFSRTL_PER_STREAM_CONTEXT -NTAPI -FsRtlLookupPerStreamContextInternal ( - IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL -); - NTKERNELAPI BOOLEAN NTAPI @@ -8612,14 +9352,6 @@ FsRtlMdlWriteComplete ( IN PMDL MdlChain ); -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlNormalizeNtstatus ( - IN NTSTATUS Exception, - IN NTSTATUS GenericException -); - NTKERNELAPI VOID NTAPI @@ -8633,306 +9365,6 @@ FsRtlNotifyChangeDirectory ( IN PIRP NotifyIrp ); -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyCleanup ( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PVOID FsContext -); - -typedef BOOLEAN (NTAPI *PCHECK_FOR_TRAVERSE_ACCESS) ( - IN PVOID NotifyContext, - IN PVOID TargetContext, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext -); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyFilterChangeDirectory ( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PVOID FsContext, - IN PSTRING FullDirectoryName, - IN BOOLEAN WatchTree, - IN BOOLEAN IgnoreBuffer, - IN ULONG CompletionFilter, - IN PIRP NotifyIrp, - IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL, - IN PFILTER_REPORT_CHANGE FilterCallback OPTIONAL); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyFilterReportChange ( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PSTRING FullTargetName, - IN USHORT TargetNameOffset, - IN PSTRING StreamName OPTIONAL, - IN PSTRING NormalizedParentName OPTIONAL, - IN ULONG FilterMatch, - IN ULONG Action, - IN PVOID TargetContext, - IN PVOID FilterContext); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyFullChangeDirectory ( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PVOID FsContext, - IN PSTRING FullDirectoryName, - IN BOOLEAN WatchTree, - IN BOOLEAN IgnoreBuffer, - IN ULONG CompletionFilter, - IN PIRP NotifyIrp, - IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL -); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyFullReportChange ( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PSTRING FullTargetName, - IN USHORT TargetNameOffset, - IN PSTRING StreamName OPTIONAL, - IN PSTRING NormalizedParentName OPTIONAL, - IN ULONG FilterMatch, - IN ULONG Action, - IN PVOID TargetContext -); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyInitializeSync ( - IN PNOTIFY_SYNC *NotifySync -); - -NTKERNELAPI -VOID -NTAPI -FsRtlNotifyUninitializeSync ( - IN PNOTIFY_SYNC *NotifySync -); - -#if (VER_PRODUCTBUILD >= 2195) - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlNotifyVolumeEvent ( - IN PFILE_OBJECT FileObject, - IN ULONG EventCode -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTKERNELAPI -ULONG -NTAPI -FsRtlNumberOfRunsInBaseMcb ( - IN PBASE_MCB Mcb -); - -NTKERNELAPI -ULONG -NTAPI -FsRtlNumberOfRunsInLargeMcb ( - IN PLARGE_MCB Mcb -); - -NTKERNELAPI -ULONG -NTAPI -FsRtlNumberOfRunsInMcb ( - IN PMCB Mcb -); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlOplockFsctrl ( - IN POPLOCK Oplock, - IN PIRP Irp, - IN ULONG OpenCount -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlOplockIsFastIoPossible ( - IN POPLOCK Oplock -); - -typedef VOID -(NTAPI *PFSRTL_STACK_OVERFLOW_ROUTINE) ( - IN PVOID Context, - IN PKEVENT Event -); - -NTKERNELAPI -VOID -NTAPI -FsRtlPostPagingFileStackOverflow ( - IN PVOID Context, - IN PKEVENT Event, - IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine -); - -NTKERNELAPI -VOID -NTAPI -FsRtlPostStackOverflow ( - IN PVOID Context, - IN PKEVENT Event, - IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine -); - -NTKERNELAPI -NTSTATUS -NTAPI -FsRtlRegisterUncProvider ( - IN OUT PHANDLE MupHandle, - IN PUNICODE_STRING RedirectorDeviceName, - IN BOOLEAN MailslotsSupported -); - -NTKERNELAPI -VOID -NTAPI -FsRtlRemoveBaseMcbEntry ( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG SectorCount -); - -NTKERNELAPI -VOID -NTAPI -FsRtlRemoveLargeMcbEntry ( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG SectorCount -); - -NTKERNELAPI -VOID -NTAPI -FsRtlRemoveMcbEntry ( - IN PMCB Mcb, - IN VBN Vbn, - IN ULONG SectorCount -); - -NTKERNELAPI -PFSRTL_PER_STREAM_CONTEXT -NTAPI -FsRtlRemovePerStreamContext ( - IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL -); - -NTKERNELAPI -VOID -NTAPI -FsRtlResetBaseMcb ( - IN PBASE_MCB Mcb -); - -NTKERNELAPI -VOID -NTAPI -FsRtlResetLargeMcb ( - IN PLARGE_MCB Mcb, - IN BOOLEAN SelfSynchronized -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlSplitBaseMcb ( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Amount -); - -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlSplitLargeMcb ( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Amount -); - -#define FsRtlSupportsPerStreamContexts(FO) ( \ - (BOOLEAN)((NULL != FsRtlGetPerStreamContextPointer(FO) && \ - FlagOn(FsRtlGetPerStreamContextPointer(FO)->Flags2, \ - FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS)) \ -) - -NTKERNELAPI -VOID -NTAPI -FsRtlTruncateBaseMcb ( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn -); - -NTKERNELAPI -VOID -NTAPI -FsRtlTruncateLargeMcb ( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn -); - -NTKERNELAPI -VOID -NTAPI -FsRtlTruncateMcb ( - IN PMCB Mcb, - IN VBN Vbn -); - -NTKERNELAPI -VOID -NTAPI -FsRtlUninitializeBaseMcb ( - IN PBASE_MCB Mcb -); - -NTKERNELAPI -VOID -NTAPI -FsRtlUninitializeLargeMcb ( - IN PLARGE_MCB Mcb -); - -NTKERNELAPI -VOID -NTAPI -FsRtlUninitializeMcb ( - IN PMCB Mcb -); - -NTKERNELAPI -VOID -NTAPI -FsRtlUninitializeOplock ( - IN OUT POPLOCK Oplock -); - NTKERNELAPI NTSTATUS NTAPI @@ -8969,23 +9401,6 @@ ObReferenceObjectByName ( OUT PVOID *Object ); -#if (NTDDI_VERSION >= NTDDI_WIN2K) - -NTKERNELAPI -NTSTATUS -NTAPI -PsAssignImpersonationToken( - IN PETHREAD Thread, - IN HANDLE Token OPTIONAL); - -NTKERNELAPI -HANDLE -NTAPI -PsReferencePrimaryToken( - IN OUT PEPROCESS Process); - -#endif - #define PsDereferenceImpersonationToken(T) \ {if (ARGUMENT_PRESENT(T)) { \ (ObDereferenceObject((T))); \ @@ -9003,14 +9418,6 @@ PsLookupProcessThreadByCid ( OUT PETHREAD *Thread ); -NTSYSAPI -VOID -NTAPI -RtlSecondsSince1970ToTime ( - IN ULONG SecondsSince1970, - OUT PLARGE_INTEGER Time -); - NTSYSAPI NTSTATUS NTAPI @@ -9021,105 +9428,6 @@ RtlSetSaclSecurityDescriptor ( IN BOOLEAN SaclDefaulted ); -NTSYSAPI -NTSTATUS -NTAPI -RtlUnicodeStringToCountedOemString ( - IN OUT POEM_STRING DestinationString, - IN PCUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString -); - -/* RTL Splay Tree Functions */ -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlSplay(PRTL_SPLAY_LINKS Links); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlDelete(PRTL_SPLAY_LINKS Links); - -NTSYSAPI -VOID -NTAPI -RtlDeleteNoSplay( - PRTL_SPLAY_LINKS Links, - PRTL_SPLAY_LINKS *Root -); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlSubtreeSuccessor(PRTL_SPLAY_LINKS Links); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlSubtreePredecessor(PRTL_SPLAY_LINKS Links); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlRealSuccessor(PRTL_SPLAY_LINKS Links); - -NTSYSAPI -PRTL_SPLAY_LINKS -NTAPI -RtlRealPredecessor(PRTL_SPLAY_LINKS Links); - -#define RtlIsLeftChild(Links) \ - (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links)) - -#define RtlIsRightChild(Links) \ - (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links)) - -#define RtlRightChild(Links) \ - ((PRTL_SPLAY_LINKS)(Links))->RightChild - -#define RtlIsRoot(Links) \ - (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links)) - -#define RtlLeftChild(Links) \ - ((PRTL_SPLAY_LINKS)(Links))->LeftChild - -#define RtlParent(Links) \ - ((PRTL_SPLAY_LINKS)(Links))->Parent - -#define RtlInitializeSplayLinks(Links) \ - { \ - PRTL_SPLAY_LINKS _SplayLinks; \ - _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \ - _SplayLinks->Parent = _SplayLinks; \ - _SplayLinks->LeftChild = NULL; \ - _SplayLinks->RightChild = NULL; \ - } - -#define RtlInsertAsLeftChild(ParentLinks,ChildLinks) \ - { \ - PRTL_SPLAY_LINKS _SplayParent; \ - PRTL_SPLAY_LINKS _SplayChild; \ - _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \ - _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \ - _SplayParent->LeftChild = _SplayChild; \ - _SplayChild->Parent = _SplayParent; \ - } - -#define RtlInsertAsRightChild(ParentLinks,ChildLinks) \ - { \ - PRTL_SPLAY_LINKS _SplayParent; \ - PRTL_SPLAY_LINKS _SplayChild; \ - _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \ - _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \ - _SplayParent->RightChild = _SplayChild; \ - _SplayChild->Parent = _SplayParent; \ - } - -// -// RTL time functions -// - #define SeEnableAccessToExports() SeExports = *(PSE_EXPORTS *)SeExports; #if (VER_PRODUCTBUILD >= 2195) @@ -9145,18 +9453,6 @@ ZwAlertThread ( IN HANDLE ThreadHandle ); -NTSYSAPI -NTSTATUS -NTAPI -ZwAllocateVirtualMemory ( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN ULONG_PTR ZeroBits, - IN OUT PSIZE_T RegionSize, - IN ULONG AllocationType, - IN ULONG Protect -); - NTSYSAPI NTSTATUS NTAPI @@ -9202,19 +9498,6 @@ ZwCloseObjectAuditAlarm ( IN BOOLEAN GenerateOnClose ); -NTSYSAPI -NTSTATUS -NTAPI -ZwCreateSection ( - OUT PHANDLE SectionHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN PLARGE_INTEGER MaximumSize OPTIONAL, - IN ULONG SectionPageProtection, - IN ULONG AllocationAttributes, - IN HANDLE FileHandle OPTIONAL -); - NTSYSAPI NTSTATUS NTAPI @@ -9225,71 +9508,6 @@ ZwCreateSymbolicLinkObject ( IN PUNICODE_STRING TargetName ); -NTSYSAPI -NTSTATUS -NTAPI -ZwDeleteFile ( - IN POBJECT_ATTRIBUTES ObjectAttributes -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwDeleteValueKey ( - IN HANDLE Handle, - IN PUNICODE_STRING Name -); - - -#if (NTDDI_VERSION >= NTDDI_WIN2K) -NTSYSAPI -NTSTATUS -NTAPI -ZwDeviceIoControlFile ( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG IoControlCode, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength); -#endif - -NTSYSAPI -NTSTATUS -NTAPI -ZwDisplayString ( - IN PUNICODE_STRING String -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwDuplicateObject ( - IN HANDLE SourceProcessHandle, - IN HANDLE SourceHandle, - IN HANDLE TargetProcessHandle OPTIONAL, - OUT PHANDLE TargetHandle OPTIONAL, - IN ACCESS_MASK DesiredAccess, - IN ULONG HandleAttributes, - IN ULONG Options -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwDuplicateToken ( - IN HANDLE ExistingTokenHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN BOOLEAN EffectiveOnly, - IN TOKEN_TYPE TokenType, - OUT PHANDLE NewTokenHandle -); - NTSYSAPI NTSTATUS NTAPI @@ -9309,46 +9527,6 @@ ZwFlushBuffersFile( #if (VER_PRODUCTBUILD >= 2195) -NTSYSAPI -NTSTATUS -NTAPI -ZwFlushVirtualMemory ( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN OUT PULONG FlushSize, - OUT PIO_STATUS_BLOCK IoStatusBlock -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTSYSAPI -NTSTATUS -NTAPI -ZwFreeVirtualMemory ( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN OUT PSIZE_T RegionSize, - IN ULONG FreeType -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwFsControlFile ( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG FsControlCode, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength -); - -#if (VER_PRODUCTBUILD >= 2195) - NTSYSAPI NTSTATUS NTAPI @@ -9361,14 +9539,6 @@ ZwInitiatePowerAction ( #endif /* (VER_PRODUCTBUILD >= 2195) */ -NTSYSAPI -NTSTATUS -NTAPI -ZwLoadDriver ( - /* "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\" */ - IN PUNICODE_STRING RegistryPath -); - NTSYSAPI NTSTATUS NTAPI @@ -9377,41 +9547,6 @@ ZwLoadKey ( IN POBJECT_ATTRIBUTES FileObjectAttributes ); -NTSYSAPI -NTSTATUS -NTAPI -ZwNotifyChangeKey ( - IN HANDLE KeyHandle, - IN HANDLE EventHandle OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG NotifyFilter, - IN BOOLEAN WatchSubtree, - IN PVOID Buffer, - IN ULONG BufferLength, - IN BOOLEAN Asynchronous -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwOpenDirectoryObject ( - OUT PHANDLE DirectoryHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwOpenProcess ( - OUT PHANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN PCLIENT_ID ClientId OPTIONAL -); - NTSYSAPI NTSTATUS NTAPI @@ -9441,21 +9576,6 @@ ZwOpenThreadToken ( OUT PHANDLE TokenHandle ); -#if (VER_PRODUCTBUILD >= 2195) - -NTSYSAPI -NTSTATUS -NTAPI -ZwPowerInformation ( - IN POWER_INFORMATION_LEVEL PowerInformationLevel, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - NTSYSAPI NTSTATUS NTAPI @@ -9472,23 +9592,6 @@ ZwQueryDefaultLocale ( OUT PLCID Locale ); -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryDirectoryFile ( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass, - IN BOOLEAN ReturnSingleEntry, - IN PUNICODE_STRING FileName OPTIONAL, - IN BOOLEAN RestartScan -); - #if (VER_PRODUCTBUILD >= 2195) NTSYSAPI @@ -9504,21 +9607,6 @@ ZwQueryDirectoryObject ( OUT PULONG ReturnLength OPTIONAL ); -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryEaFile ( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length, - IN BOOLEAN ReturnSingleEntry, - IN PVOID EaList OPTIONAL, - IN ULONG EaListLength, - IN PULONG EaIndex OPTIONAL, - IN BOOLEAN RestartScan -); - #endif /* (VER_PRODUCTBUILD >= 2195) */ NTSYSAPI @@ -9532,39 +9620,6 @@ ZwQueryInformationProcess ( OUT PULONG ReturnLength OPTIONAL ); -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryInformationToken ( - IN HANDLE TokenHandle, - IN TOKEN_INFORMATION_CLASS TokenInformationClass, - OUT PVOID TokenInformation, - IN ULONG Length, - OUT PULONG ResultLength -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwQuerySecurityObject ( - IN HANDLE FileHandle, - IN SECURITY_INFORMATION SecurityInformation, - OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN ULONG Length, - OUT PULONG ResultLength -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwQueryVolumeInformationFile ( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FsInformation, - IN ULONG Length, - IN FS_INFORMATION_CLASS FsInformationClass -); - NTSYSAPI NTSTATUS NTAPI @@ -9620,26 +9675,8 @@ ZwSetDefaultUILanguage ( IN LANGID LanguageId ); -NTSYSAPI -NTSTATUS -NTAPI -ZwSetEaFile ( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length -); - #endif /* (VER_PRODUCTBUILD >= 2195) */ -NTSYSAPI -NTSTATUS -NTAPI -ZwSetEvent ( - IN HANDLE EventHandle, - OUT PLONG PreviousState OPTIONAL -); - NTSYSAPI NTSTATUS NTAPI @@ -9650,19 +9687,6 @@ ZwSetInformationProcess ( IN ULONG ProcessInformationLength ); -#if (VER_PRODUCTBUILD >= 2195) - -NTSYSAPI -NTSTATUS -NTAPI -ZwSetSecurityObject ( - IN HANDLE Handle, - IN SECURITY_INFORMATION SecurityInformation, - IN PSECURITY_DESCRIPTOR SecurityDescriptor -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - NTSYSAPI NTSTATUS NTAPI @@ -9671,37 +9695,6 @@ ZwSetSystemTime ( OUT PLARGE_INTEGER OldTime OPTIONAL ); -#if (VER_PRODUCTBUILD >= 2195) - -NTSYSAPI -NTSTATUS -NTAPI -ZwSetVolumeInformationFile ( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID FsInformation, - IN ULONG Length, - IN FS_INFORMATION_CLASS FsInformationClass -); - -#endif /* (VER_PRODUCTBUILD >= 2195) */ - -NTSYSAPI -NTSTATUS -NTAPI -ZwTerminateProcess ( - IN HANDLE ProcessHandle OPTIONAL, - IN NTSTATUS ExitStatus -); - -NTSYSAPI -NTSTATUS -NTAPI -ZwUnloadDriver ( - /* "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\" */ - IN PUNICODE_STRING RegistryPath -); - NTSYSAPI NTSTATUS NTAPI @@ -9709,16 +9702,6 @@ ZwUnloadKey ( IN POBJECT_ATTRIBUTES KeyObjectAttributes ); -#if (NTDDI_VERSION >= NTDDI_WIN2K) -NTSYSAPI -NTSTATUS -NTAPI -ZwWaitForSingleObject ( - IN HANDLE Handle, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Timeout OPTIONAL); -#endif - NTSYSAPI NTSTATUS NTAPI diff --git a/reactos/include/ddk/ntimage.h b/reactos/include/ddk/ntimage.h index e008a2daa94..8df984763f7 100644 --- a/reactos/include/ddk/ntimage.h +++ b/reactos/include/ddk/ntimage.h @@ -394,22 +394,33 @@ typedef struct _IMAGE_NT_HEADERS64 { ULONG Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER64 OptionalHeader; -} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64; +} IMAGE_NT_HEADERS64; typedef struct _IMAGE_NT_HEADERS { ULONG Signature; IMAGE_FILE_HEADER FileHeader; IMAGE_OPTIONAL_HEADER32 OptionalHeader; -} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32; +} IMAGE_NT_HEADERS32; #ifdef _WIN64 typedef IMAGE_NT_HEADERS64 IMAGE_NT_HEADERS; -typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS; #else typedef IMAGE_NT_HEADERS32 IMAGE_NT_HEADERS; +#endif + +#ifndef _NTDDK_ + +typedef struct _IMAGE_NT_HEADERS *PIMAGE_NT_HEADERS32; +typedef struct _IMAGE_NT_HEADERS64 *PIMAGE_NT_HEADERS64; + +#ifdef _WIN64 +typedef PIMAGE_NT_HEADERS64 PIMAGE_NT_HEADERS; +#else typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS; #endif +#endif /* _NTDDK_ */ + // // Retreives the first image section header from the Nt Header // diff --git a/reactos/include/ddk/wdm.h b/reactos/include/ddk/wdm.h index 4dd5ae3abc9..3a523235742 100644 --- a/reactos/include/ddk/wdm.h +++ b/reactos/include/ddk/wdm.h @@ -38,15 +38,26 @@ #include #include #include +#include #ifndef GUID_DEFINED #include #endif +#ifdef _MAC +#ifndef _INC_STRING +#include +#endif /* _INC_STRING */ +#else +#include +#endif /* _MAC */ + #ifndef _KTMTYPES_ typedef GUID UOW, *PUOW; #endif +typedef GUID *PGUID; + #if (NTDDI_VERSION >= NTDDI_WINXP) #include #endif @@ -133,8 +144,6 @@ struct _IO_RESOURCE_DESCRIPTOR; typedef struct _OBJECT_TYPE *POBJECT_TYPE; typedef struct _HAL_DISPATCH_TABLE *PHAL_DISPATCH_TABLE; typedef struct _HAL_PRIVATE_DISPATCH_TABLE *PHAL_PRIVATE_DISPATCH_TABLE; -typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT; -typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT; typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT; typedef struct _EPROCESS *PEPROCESS; typedef struct _ETHREAD *PETHREAD; @@ -144,6 +153,42 @@ typedef struct _KPROCESS *PKPROCESS; typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD; typedef struct _CONTEXT *PCONTEXT; +#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && ( defined(_NTDDK_) || defined(_NTDRIVER_) || defined(_NTOSP_)) +typedef struct _DMA_ADAPTER *PADAPTER_OBJECT; +#elif defined(_WDM_INCLUDED_) +typedef struct _DMA_ADAPTER *PADAPTER_OBJECT; +#else +typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT; +#endif + +#ifndef DEFINE_GUIDEX +#ifdef _MSC_VER +#define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name +#else +#define DEFINE_GUIDEX(name) EXTERN_C const GUID name +#endif +#endif /* DEFINE_GUIDEX */ + +#ifndef STATICGUIDOF +#define STATICGUIDOF(guid) STATIC_##guid +#endif + +/* GUID Comparison */ +#ifndef __IID_ALIGNED__ +#define __IID_ALIGNED__ +#ifdef __cplusplus +inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2) +{ + return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) && + (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) ); +} +#else +#define IsEqualGUIDAligned(guid1, guid2) \ + ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \ + (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) ) +#endif /* __cplusplus */ +#endif /* !__IID_ALIGNED__ */ + /****************************************************************************** * INTERLOCKED Functions * @@ -482,17 +527,29 @@ typedef SLIST_HEADER SLIST_HEADER32, *PSLIST_HEADER32; #endif /* _SLIST_HEADER_ */ - -/* HACK HACK HACK - GCC (or perhaps LD) is messing this up */ -#if defined(_NTSYSTEM_) || defined(__GNUC__) +/* MS definition is broken! */ +extern BOOLEAN NTSYSAPI NlsMbCodePageTag; +extern BOOLEAN NTSYSAPI NlsMbOemCodePageTag; #define NLS_MB_CODE_PAGE_TAG NlsMbCodePageTag #define NLS_MB_OEM_CODE_PAGE_TAG NlsMbOemCodePageTag -#else -#define NLS_MB_CODE_PAGE_TAG (*NlsMbCodePageTag) -#define NLS_MB_OEM_CODE_PAGE_TAG (*NlsMbOemCodePageTag) -#endif /* _NT_SYSTEM */ -extern BOOLEAN NTSYSAPI NLS_MB_CODE_PAGE_TAG; -extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG; + +#define SHORT_LEAST_SIGNIFICANT_BIT 0 +#define SHORT_MOST_SIGNIFICANT_BIT 1 + +#define LONG_LEAST_SIGNIFICANT_BIT 0 +#define LONG_3RD_MOST_SIGNIFICANT_BIT 1 +#define LONG_2ND_MOST_SIGNIFICANT_BIT 2 +#define LONG_MOST_SIGNIFICANT_BIT 3 + +#define RTLVERLIB_DDI(x) Wdmlib##x + +typedef BOOLEAN +(*PFN_RTL_IS_NTDDI_VERSION_AVAILABLE)( + IN ULONG Version); + +typedef BOOLEAN +(*PFN_RTL_IS_SERVICE_PACK_VERSION_INSTALLED)( + IN ULONG Version); /****************************************************************************** @@ -503,18 +560,116 @@ typedef UCHAR KIRQL, *PKIRQL; typedef CCHAR KPROCESSOR_MODE; typedef LONG KPRIORITY; -typedef ULONG EXECUTION_STATE; - typedef enum _MODE { KernelMode, UserMode, MaximumMode } MODE; +#define CACHE_FULLY_ASSOCIATIVE 0xFF +#define MAXIMUM_SUSPEND_COUNT MAXCHAR + +#define EVENT_QUERY_STATE (0x0001) +#define EVENT_MODIFY_STATE (0x0002) +#define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) + +#define LTP_PC_SMT 0x1 + #if (NTDDI_VERSION < NTDDI_WIN7) || defined(_X86_) || !defined(NT_PROCESSOR_GROUPS) #define SINGLE_GROUP_LEGACY_API 1 #endif +#define SEMAPHORE_QUERY_STATE (0x0001) +#define SEMAPHORE_MODIFY_STATE (0x0002) +#define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) + +typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP { + RelationProcessorCore, + RelationNumaNode, + RelationCache, + RelationProcessorPackage, + RelationGroup, + RelationAll = 0xffff +} LOGICAL_PROCESSOR_RELATIONSHIP; + +typedef enum _PROCESSOR_CACHE_TYPE { + CacheUnified, + CacheInstruction, + CacheData, + CacheTrace +} PROCESSOR_CACHE_TYPE; + +typedef struct _CACHE_DESCRIPTOR { + UCHAR Level; + UCHAR Associativity; + USHORT LineSize; + ULONG Size; + PROCESSOR_CACHE_TYPE Type; +} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR; + +typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION { + ULONG_PTR ProcessorMask; + LOGICAL_PROCESSOR_RELATIONSHIP Relationship; + union { + struct { + UCHAR Flags; + } ProcessorCore; + struct { + ULONG NodeNumber; + } NumaNode; + CACHE_DESCRIPTOR Cache; + ULONGLONG Reserved[2]; + } DUMMYUNIONNAME; +} SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION; + +typedef struct _PROCESSOR_RELATIONSHIP { + UCHAR Flags; + UCHAR Reserved[21]; + USHORT GroupCount; + GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY]; +} PROCESSOR_RELATIONSHIP, *PPROCESSOR_RELATIONSHIP; + +typedef struct _NUMA_NODE_RELATIONSHIP { + ULONG NodeNumber; + UCHAR Reserved[20]; + GROUP_AFFINITY GroupMask; +} NUMA_NODE_RELATIONSHIP, *PNUMA_NODE_RELATIONSHIP; + +typedef struct _CACHE_RELATIONSHIP { + UCHAR Level; + UCHAR Associativity; + USHORT LineSize; + ULONG CacheSize; + PROCESSOR_CACHE_TYPE Type; + UCHAR Reserved[20]; + GROUP_AFFINITY GroupMask; +} CACHE_RELATIONSHIP, *PCACHE_RELATIONSHIP; + +typedef struct _PROCESSOR_GROUP_INFO { + UCHAR MaximumProcessorCount; + UCHAR ActiveProcessorCount; + UCHAR Reserved[38]; + KAFFINITY ActiveProcessorMask; +} PROCESSOR_GROUP_INFO, *PPROCESSOR_GROUP_INFO; + +typedef struct _GROUP_RELATIONSHIP { + USHORT MaximumGroupCount; + USHORT ActiveGroupCount; + UCHAR Reserved[20]; + PROCESSOR_GROUP_INFO GroupInfo[ANYSIZE_ARRAY]; +} GROUP_RELATIONSHIP, *PGROUP_RELATIONSHIP; + +typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX { + LOGICAL_PROCESSOR_RELATIONSHIP Relationship; + ULONG Size; + union { + PROCESSOR_RELATIONSHIP Processor; + NUMA_NODE_RELATIONSHIP NumaNode; + CACHE_RELATIONSHIP Cache; + GROUP_RELATIONSHIP Group; + } DUMMYUNIONNAME; +} SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX;; + /* Processor features */ #define PF_FLOATING_POINT_PRECISION_ERRATA 0 #define PF_FLOATING_POINT_EMULATED 1 @@ -535,7 +690,6 @@ typedef enum _MODE { #define PF_CHANNELS_ENABLED 16 #define PF_XSAVE_ENABLED 17 -#define MAXIMUM_SUPPORTED_EXTENSION 512 #define MAXIMUM_WAIT_OBJECTS 64 #define ASSERT_APC(Object) NT_ASSERT((Object)->Type == ApcObject) @@ -603,6 +757,23 @@ typedef enum _MODE { #define EXCEPTION_NONCONTINUABLE 1 #define EXCEPTION_MAXIMUM_PARAMETERS 15 +#define EXCEPTION_DIVIDED_BY_ZERO 0 +#define EXCEPTION_DEBUG 1 +#define EXCEPTION_NMI 2 +#define EXCEPTION_INT3 3 +#define EXCEPTION_BOUND_CHECK 5 +#define EXCEPTION_INVALID_OPCODE 6 +#define EXCEPTION_NPX_NOT_AVAILABLE 7 +#define EXCEPTION_DOUBLE_FAULT 8 +#define EXCEPTION_NPX_OVERRUN 9 +#define EXCEPTION_INVALID_TSS 0x0A +#define EXCEPTION_SEGMENT_NOT_PRESENT 0x0B +#define EXCEPTION_STACK_FAULT 0x0C +#define EXCEPTION_GP_FAULT 0x0D +#define EXCEPTION_RESERVED_TRAP 0x0F +#define EXCEPTION_NPX_ERROR 0x010 +#define EXCEPTION_ALIGNMENT_CHECK 0x011 + typedef struct _EXCEPTION_RECORD { NTSTATUS ExceptionCode; ULONG ExceptionFlags; @@ -654,6 +825,42 @@ typedef VOID IN ULONG ReasonSpecificDataLength); typedef KBUGCHECK_REASON_CALLBACK_ROUTINE *PKBUGCHECK_REASON_CALLBACK_ROUTINE; +typedef struct _KBUGCHECK_ADD_PAGES { + IN OUT PVOID Context; + IN OUT ULONG Flags; + IN ULONG BugCheckCode; + OUT ULONG_PTR Address; + OUT ULONG_PTR Count; +} KBUGCHECK_ADD_PAGES, *PKBUGCHECK_ADD_PAGES; + +typedef struct _KBUGCHECK_SECONDARY_DUMP_DATA { + IN PVOID InBuffer; + IN ULONG InBufferLength; + IN ULONG MaximumAllowed; + OUT GUID Guid; + OUT PVOID OutBuffer; + OUT ULONG OutBufferLength; +} KBUGCHECK_SECONDARY_DUMP_DATA, *PKBUGCHECK_SECONDARY_DUMP_DATA; + +typedef enum _KBUGCHECK_DUMP_IO_TYPE { + KbDumpIoInvalid, + KbDumpIoHeader, + KbDumpIoBody, + KbDumpIoSecondaryData, + KbDumpIoComplete +} KBUGCHECK_DUMP_IO_TYPE; + +typedef struct _KBUGCHECK_DUMP_IO { + IN ULONG64 Offset; + IN PVOID Buffer; + IN ULONG BufferLength; + IN KBUGCHECK_DUMP_IO_TYPE Type; +} KBUGCHECK_DUMP_IO, *PKBUGCHECK_DUMP_IO; + +#define KB_ADD_PAGES_FLAG_VIRTUAL_ADDRESS 0x00000001UL +#define KB_ADD_PAGES_FLAG_PHYSICAL_ADDRESS 0x00000002UL +#define KB_ADD_PAGES_FLAG_ADDITIONAL_RANGES_EXIST 0x80000000UL + typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD { LIST_ENTRY Entry; PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine; @@ -693,20 +900,31 @@ typedef BOOLEAN IN BOOLEAN Handled); typedef NMI_CALLBACK *PNMI_CALLBACK; -typedef enum _TRACE_INFORMATION_CLASS { - TraceIdClass, - TraceHandleClass, - TraceEnableFlagsClass, - TraceEnableLevelClass, - GlobalLoggerHandleClass, - EventLoggerHandleClass, - AllLoggerHandlesClass, - TraceHandleByNameClass, - LoggerEventsLostClass, - TraceSessionSettingsClass, - LoggerEventsLoggedClass, - MaxTraceInformationClass -} TRACE_INFORMATION_CLASS; +typedef enum _KE_PROCESSOR_CHANGE_NOTIFY_STATE { + KeProcessorAddStartNotify = 0, + KeProcessorAddCompleteNotify, + KeProcessorAddFailureNotify +} KE_PROCESSOR_CHANGE_NOTIFY_STATE; + +typedef struct _KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT { + KE_PROCESSOR_CHANGE_NOTIFY_STATE State; + ULONG NtNumber; + NTSTATUS Status; +#if (NTDDI_VERSION >= NTDDI_WIN7) + PROCESSOR_NUMBER ProcNumber; +#endif +} KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT, *PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT; + +typedef VOID +(NTAPI PROCESSOR_CALLBACK_FUNCTION)( + IN PVOID CallbackContext, + IN PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext, + IN OUT PNTSTATUS OperationStatus); +typedef PROCESSOR_CALLBACK_FUNCTION *PPROCESSOR_CALLBACK_FUNCTION; + +#define KE_PROCESSOR_CHANGE_ADD_EXISTING 1 + +#define INVALID_PROCESSOR_INDEX 0xffffffff typedef enum _KINTERRUPT_POLARITY { InterruptPolarityUnknown, @@ -803,36 +1021,32 @@ typedef enum _KINTERRUPT_MODE { #define THREAD_WAIT_OBJECTS 3 +typedef VOID +(NTAPI KSTART_ROUTINE)( + IN PVOID StartContext); +typedef KSTART_ROUTINE *PKSTART_ROUTINE; + typedef VOID (NTAPI *PKINTERRUPT_ROUTINE)( VOID); +typedef BOOLEAN +(NTAPI KSERVICE_ROUTINE)( + IN struct _KINTERRUPT *Interrupt, + IN PVOID ServiceContext); +typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE; + +typedef BOOLEAN +(NTAPI KMESSAGE_SERVICE_ROUTINE)( + IN struct _KINTERRUPT *Interrupt, + IN PVOID ServiceContext, + IN ULONG MessageID); +typedef KMESSAGE_SERVICE_ROUTINE *PKMESSAGE_SERVICE_ROUTINE; + typedef enum _KD_OPTION { KD_OPTION_SET_BLOCK_ENABLE, } KD_OPTION; -typedef enum _INTERFACE_TYPE { - InterfaceTypeUndefined = -1, - Internal, - Isa, - Eisa, - MicroChannel, - TurboChannel, - PCIBus, - VMEBus, - NuBus, - PCMCIABus, - CBus, - MPIBus, - MPSABus, - ProcessorInternal, - InternalPowerBus, - PNPISABus, - PNPBus, - Vmcs, - MaximumInterfaceType -} INTERFACE_TYPE, *PINTERFACE_TYPE; - typedef VOID (NTAPI *PKNORMAL_ROUTINE)( IN PVOID NormalContext OPTIONAL, @@ -870,6 +1084,14 @@ typedef struct _KAPC { BOOLEAN Inserted; } KAPC, *PKAPC, *RESTRICTED_POINTER PRKAPC; +#define KAPC_OFFSET_TO_SPARE_BYTE0 FIELD_OFFSET(KAPC, SpareByte0) +#define KAPC_OFFSET_TO_SPARE_BYTE1 FIELD_OFFSET(KAPC, SpareByte1) +#define KAPC_OFFSET_TO_SPARE_LONG FIELD_OFFSET(KAPC, SpareLong0) +#define KAPC_OFFSET_TO_SYSTEMARGUMENT1 FIELD_OFFSET(KAPC, SystemArgument1) +#define KAPC_OFFSET_TO_SYSTEMARGUMENT2 FIELD_OFFSET(KAPC, SystemArgument2) +#define KAPC_OFFSET_TO_APCSTATEINDEX FIELD_OFFSET(KAPC, ApcStateIndex) +#define KAPC_ACTUAL_LENGTH (FIELD_OFFSET(KAPC, Inserted) + sizeof(BOOLEAN)) + typedef struct _KDEVICE_QUEUE_ENTRY { LIST_ENTRY DeviceListEntry; ULONG SortKey; @@ -886,10 +1108,27 @@ typedef VOID IN PVOID Parameter2 OPTIONAL, IN PVOID Parameter3 OPTIONAL); -typedef -ULONG_PTR -(NTAPI *PKIPI_BROADCAST_WORKER)( +typedef struct _KIPI_COUNTS { + ULONG Freeze; + ULONG Packet; + ULONG DPC; + ULONG APC; + ULONG FlushSingleTb; + ULONG FlushMultipleTb; + ULONG FlushEntireTb; + ULONG GenericCall; + ULONG ChangeColor; + ULONG SweepDcache; + ULONG SweepIcache; + ULONG SweepIcacheRange; + ULONG FlushIoBuffers; + ULONG GratuitousDPC; +} KIPI_COUNTS, *PKIPI_COUNTS; + +typedef ULONG_PTR +(NTAPI KIPI_BROADCAST_WORKER)( IN ULONG_PTR Argument); +typedef KIPI_BROADCAST_WORKER *PKIPI_BROADCAST_WORKER; typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK; @@ -1088,6 +1327,8 @@ typedef struct _KSEMAPHORE { LONG Limit; } KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE; +#define KSEMAPHORE_ACTUAL_LENGTH (FIELD_OFFSET(KSEMAPHORE, Limit) + sizeof(LONG)) + typedef struct _KGATE { DISPATCHER_HEADER Header; } KGATE, *PKGATE, *RESTRICTED_POINTER PRKGATE; @@ -1128,6 +1369,14 @@ typedef struct _KTIMER { ULONG Period; } KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER; +typedef enum _LOCK_OPERATION { + IoReadAccess, + IoWriteAccess, + IoModifyAccess +} LOCK_OPERATION; + +#define KTIMER_ACTUAL_LENGTH (FIELD_OFFSET(KTIMER, Period) + sizeof(LONG)) + typedef BOOLEAN (NTAPI *PKSYNCHRONIZE_ROUTINE)( IN PVOID SynchronizeContext); @@ -1156,19 +1405,32 @@ typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE { EndAlternatives } ALTERNATIVE_ARCHITECTURE_TYPE; -typedef struct _KSYSTEM_TIME -{ +#ifndef _X86_ + +#ifndef IsNEC_98 +#define IsNEC_98 (FALSE) +#endif + +#ifndef IsNotNEC_98 +#define IsNotNEC_98 (TRUE) +#endif + +#ifndef SetNEC_98 +#define SetNEC_98 +#endif + +#ifndef SetNotNEC_98 +#define SetNotNEC_98 +#endif + +#endif + +typedef struct _KSYSTEM_TIME { ULONG LowPart; LONG High1Time; LONG High2Time; } KSYSTEM_TIME, *PKSYSTEM_TIME; -typedef struct _PNP_BUS_INFORMATION { - GUID BusTypeGuid; - INTERFACE_TYPE LegacyBusType; - ULONG BusNumber; -} PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION; - typedef struct DECLSPEC_ALIGN(16) _M128A { ULONGLONG Low; LONGLONG High; @@ -1200,12 +1462,104 @@ typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT { #endif } XSAVE_FORMAT, *PXSAVE_FORMAT; +typedef struct DECLSPEC_ALIGN(8) _XSAVE_AREA_HEADER { + ULONG64 Mask; + ULONG64 Reserved[7]; +} XSAVE_AREA_HEADER, *PXSAVE_AREA_HEADER; + +typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA { + XSAVE_FORMAT LegacyState; + XSAVE_AREA_HEADER Header; +} XSAVE_AREA, *PXSAVE_AREA; + +typedef struct _XSTATE_CONTEXT { + ULONG64 Mask; + ULONG Length; + ULONG Reserved1; + PXSAVE_AREA Area; +#if defined(_X86_) + ULONG Reserved2; +#endif + PVOID Buffer; +#if defined(_X86_) + ULONG Reserved3; +#endif +} XSTATE_CONTEXT, *PXSTATE_CONTEXT; + +typedef struct _XSTATE_SAVE { +#if defined(_AMD64_) + struct _XSTATE_SAVE* Prev; + struct _KTHREAD* Thread; + UCHAR Level; + XSTATE_CONTEXT XStateContext; +#elif defined(_IA64_) + ULONG Dummy; +#elif defined(_X86_) + union { + struct { + LONG64 Reserved1; + ULONG Reserved2; + struct _XSTATE_SAVE* Prev; + PXSAVE_AREA Reserved3; + struct _KTHREAD* Thread; + PVOID Reserved4; + UCHAR Level; + }; + XSTATE_CONTEXT XStateContext; + }; +#endif +} XSTATE_SAVE, *PXSTATE_SAVE; + +#ifdef _X86_ + +#define MAXIMUM_SUPPORTED_EXTENSION 512 + +#if !defined(__midl) && !defined(MIDL_PASS) +C_ASSERT(sizeof(XSAVE_FORMAT) == MAXIMUM_SUPPORTED_EXTENSION); +#endif + +#endif /* _X86_ */ + +#define XSAVE_ALIGN 64 +#define MINIMAL_XSTATE_AREA_LENGTH sizeof(XSAVE_AREA) + +#if !defined(__midl) && !defined(MIDL_PASS) +C_ASSERT((sizeof(XSAVE_FORMAT) & (XSAVE_ALIGN - 1)) == 0); +C_ASSERT((FIELD_OFFSET(XSAVE_AREA, Header) & (XSAVE_ALIGN - 1)) == 0); +C_ASSERT(MINIMAL_XSTATE_AREA_LENGTH == 512 + 64); +#endif + +typedef struct _CONTEXT_CHUNK { + LONG Offset; + ULONG Length; +} CONTEXT_CHUNK, *PCONTEXT_CHUNK; + +typedef struct _CONTEXT_EX { + CONTEXT_CHUNK All; + CONTEXT_CHUNK Legacy; + CONTEXT_CHUNK XState; +} CONTEXT_EX, *PCONTEXT_EX; + +#define CONTEXT_EX_LENGTH ALIGN_UP_BY(sizeof(CONTEXT_EX), STACK_ALIGN) + +#if (NTDDI_VERSION >= NTDDI_VISTA) +extern NTSYSAPI volatile CCHAR KeNumberProcessors; +#elif (NTDDI_VERSION >= NTDDI_WINXP) +extern NTSYSAPI CCHAR KeNumberProcessors; +#else +extern PCCHAR KeNumberProcessors; +#endif /****************************************************************************** * Memory manager Types * ******************************************************************************/ +#if (NTDDI_VERSION >= NTDDI_WIN2K) +typedef ULONG NODE_REQUIREMENT; +#define MM_ANY_NODE_OK 0x80000000 +#endif + #define MM_DONT_ZERO_ALLOCATION 0x00000001 #define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002 #define MM_ALLOCATE_FULLY_REQUIRED 0x00000004 @@ -1334,12 +1688,6 @@ typedef enum _MM_PAGE_PRIORITY { HighPagePriority = 32 } MM_PAGE_PRIORITY; -typedef enum _LOCK_OPERATION { - IoReadAccess, - IoWriteAccess, - IoModifyAccess -} LOCK_OPERATION; - typedef enum _MM_SYSTEM_SIZE { MmSmallSystem, MmMediumSystem, @@ -1358,12 +1706,6 @@ extern PVOID MmBadPointer; #define EX_RUNDOWN_COUNT_SHIFT 0x1 #define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT) -#ifdef _WIN64 -#define PORT_MAXIMUM_MESSAGE_LENGTH 512 -#else -#define PORT_MAXIMUM_MESSAGE_LENGTH 256 -#endif - typedef struct _FAST_MUTEX { volatile LONG Count; PKTHREAD Owner; @@ -1535,6 +1877,13 @@ typedef struct _EX_RUNDOWN_REF { typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE; +typedef enum _WORK_QUEUE_TYPE { + CriticalWorkQueue, + DelayedWorkQueue, + HyperCriticalWorkQueue, + MaximumWorkQueue +} WORK_QUEUE_TYPE; + typedef VOID (NTAPI WORKER_THREAD_ROUTINE)( IN PVOID Parameter); @@ -1546,6 +1895,78 @@ typedef struct _WORK_QUEUE_ITEM { volatile PVOID Parameter; } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM; +typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD; + +typedef struct _OWNER_ENTRY { + ERESOURCE_THREAD OwnerThread; + union { + struct { + ULONG IoPriorityBoosted:1; + ULONG OwnerReferenced:1; + ULONG OwnerCount:30; + }; + ULONG TableSize; + }; +} OWNER_ENTRY, *POWNER_ENTRY; + +typedef struct _ERESOURCE { + LIST_ENTRY SystemResourcesList; + POWNER_ENTRY OwnerTable; + SHORT ActiveCount; + USHORT Flag; + volatile PKSEMAPHORE SharedWaiters; + volatile PKEVENT ExclusiveWaiters; + OWNER_ENTRY OwnerEntry; + ULONG ActiveEntries; + ULONG ContentionCount; + ULONG NumberOfSharedWaiters; + ULONG NumberOfExclusiveWaiters; +#if defined(_WIN64) + PVOID Reserved2; +#endif + __GNU_EXTENSION union { + PVOID Address; + ULONG_PTR CreatorBackTraceIndex; + }; + KSPIN_LOCK SpinLock; +} ERESOURCE, *PERESOURCE; + +/* ERESOURCE.Flag */ +#define ResourceNeverExclusive 0x0010 +#define ResourceReleaseByOtherThread 0x0020 +#define ResourceOwnedExclusive 0x0080 + +#define RESOURCE_HASH_TABLE_SIZE 64 + +typedef struct _RESOURCE_HASH_ENTRY { + LIST_ENTRY ListEntry; + PVOID Address; + ULONG ContentionCount; + ULONG Number; +} RESOURCE_HASH_ENTRY, *PRESOURCE_HASH_ENTRY; + +typedef struct _RESOURCE_PERFORMANCE_DATA { + ULONG ActiveResourceCount; + ULONG TotalResourceCount; + ULONG ExclusiveAcquire; + ULONG SharedFirstLevel; + ULONG SharedSecondLevel; + ULONG StarveFirstLevel; + ULONG StarveSecondLevel; + ULONG WaitForExclusive; + ULONG OwnerTableExpands; + ULONG MaximumTableExpand; + LIST_ENTRY HashTable[RESOURCE_HASH_TABLE_SIZE]; +} RESOURCE_PERFORMANCE_DATA, *PRESOURCE_PERFORMANCE_DATA; + +/* Global debug flag */ +#if DEVL +extern ULONG NtGlobalFlag; +#define IF_NTOS_DEBUG(FlagName) if (NtGlobalFlag & (FLG_##FlagName)) +#else +#define IF_NTOS_DEBUG(FlagName) if(FALSE) +#endif + /****************************************************************************** * Security Manager Types * @@ -1972,6 +2393,144 @@ typedef enum _POWER_STATE_TYPE { DevicePowerState } POWER_STATE_TYPE, *PPOWER_STATE_TYPE; +#if (NTDDI_VERSION >= NTDDI_VISTA) +typedef struct _SYSTEM_POWER_STATE_CONTEXT { + union { + struct { + ULONG Reserved1:8; + ULONG TargetSystemState:4; + ULONG EffectiveSystemState:4; + ULONG CurrentSystemState:4; + ULONG IgnoreHibernationPath:1; + ULONG PseudoTransition:1; + ULONG Reserved2:10; + } DUMMYSTRUCTNAME; + ULONG ContextAsUlong; + } DUMMYUNIONNAME; +} SYSTEM_POWER_STATE_CONTEXT, *PSYSTEM_POWER_STATE_CONTEXT; +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) +typedef struct _COUNTED_REASON_CONTEXT { + ULONG Version; + ULONG Flags; + union { + struct { + UNICODE_STRING ResourceFileName; + USHORT ResourceReasonId; + ULONG StringCount; + PUNICODE_STRING ReasonStrings; + } DUMMYSTRUCTNAME; + UNICODE_STRING SimpleString; + } DUMMYUNIONNAME; +} COUNTED_REASON_CONTEXT, *PCOUNTED_REASON_CONTEXT; +#endif + +#define IOCTL_QUERY_DEVICE_POWER_STATE \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x0, METHOD_BUFFERED, FILE_READ_ACCESS) + +#define IOCTL_SET_DEVICE_WAKE \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x1, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define IOCTL_CANCEL_DEVICE_WAKE \ + CTL_CODE(FILE_DEVICE_BATTERY, 0x2, METHOD_BUFFERED, FILE_WRITE_ACCESS) + +#define ES_SYSTEM_REQUIRED 0x00000001 +#define ES_DISPLAY_REQUIRED 0x00000002 +#define ES_USER_PRESENT 0x00000004 +#define ES_CONTINUOUS 0x80000000 + +typedef ULONG EXECUTION_STATE, *PEXECUTION_STATE; + +typedef enum { + LT_DONT_CARE, + LT_LOWEST_LATENCY +} LATENCY_TIME; + +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN7) +#define DIAGNOSTIC_REASON_VERSION 0 +#define DIAGNOSTIC_REASON_SIMPLE_STRING 0x00000001 +#define DIAGNOSTIC_REASON_DETAILED_STRING 0x00000002 +#define DIAGNOSTIC_REASON_NOT_SPECIFIED 0x80000000 +#define DIAGNOSTIC_REASON_INVALID_FLAGS (~0x80000003) +#endif + +#define POWER_REQUEST_CONTEXT_VERSION 0 +#define POWER_REQUEST_CONTEXT_SIMPLE_STRING 0x00000001 +#define POWER_REQUEST_CONTEXT_DETAILED_STRING 0x00000002 + +#define PowerRequestMaximum 3 + +typedef enum _POWER_REQUEST_TYPE { + PowerRequestDisplayRequired, + PowerRequestSystemRequired, + PowerRequestAwayModeRequired +} POWER_REQUEST_TYPE, *PPOWER_REQUEST_TYPE; + +#if (NTDDI_VERSION >= NTDDI_WINXP) + +#define PDCAP_D0_SUPPORTED 0x00000001 +#define PDCAP_D1_SUPPORTED 0x00000002 +#define PDCAP_D2_SUPPORTED 0x00000004 +#define PDCAP_D3_SUPPORTED 0x00000008 +#define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010 +#define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020 +#define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040 +#define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080 +#define PDCAP_WARM_EJECT_SUPPORTED 0x00000100 + +typedef struct CM_Power_Data_s { + ULONG PD_Size; + DEVICE_POWER_STATE PD_MostRecentPowerState; + ULONG PD_Capabilities; + ULONG PD_D1Latency; + ULONG PD_D2Latency; + ULONG PD_D3Latency; + DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum]; + SYSTEM_POWER_STATE PD_DeepestSystemWake; +} CM_POWER_DATA, *PCM_POWER_DATA; + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +typedef enum _SYSTEM_POWER_CONDITION { + PoAc, + PoDc, + PoHot, + PoConditionMaximum +} SYSTEM_POWER_CONDITION; + +typedef struct _SET_POWER_SETTING_VALUE { + ULONG Version; + GUID Guid; + SYSTEM_POWER_CONDITION PowerCondition; + ULONG DataLength; + UCHAR Data[ANYSIZE_ARRAY]; +} SET_POWER_SETTING_VALUE, *PSET_POWER_SETTING_VALUE; + +#define POWER_SETTING_VALUE_VERSION (0x1) + +typedef struct _NOTIFY_USER_POWER_SETTING { + GUID Guid; +} NOTIFY_USER_POWER_SETTING, *PNOTIFY_USER_POWER_SETTING; + +typedef struct _APPLICATIONLAUNCH_SETTING_VALUE { + LARGE_INTEGER ActivationTime; + ULONG Flags; + ULONG ButtonInstanceID; +} APPLICATIONLAUNCH_SETTING_VALUE, *PAPPLICATIONLAUNCH_SETTING_VALUE; + +typedef enum _POWER_PLATFORM_ROLE { + PlatformRoleUnspecified = 0, + PlatformRoleDesktop, + PlatformRoleMobile, + PlatformRoleWorkstation, + PlatformRoleEnterpriseServer, + PlatformRoleSOHOServer, + PlatformRoleAppliancePC, + PlatformRolePerformanceServer, + PlatformRoleMaximum +} POWER_PLATFORM_ROLE; + #if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) typedef struct { ULONG Granularity; @@ -2125,12 +2684,6 @@ NTSTATUS IN OUT PVOID Context OPTIONAL); typedef POWER_SETTING_CALLBACK *PPOWER_SETTING_CALLBACK; -#define PO_CB_SYSTEM_POWER_POLICY 0 -#define PO_CB_AC_STATUS 1 -#define PO_CB_BUTTON_COLLISION 2 -#define PO_CB_SYSTEM_STATE_LOCK 3 -#define PO_CB_LID_SWITCH_STATE 4 -#define PO_CB_PROCESSOR_POWER_POLICY 5 /****************************************************************************** * Configuration Manager Types * @@ -2222,6 +2775,15 @@ typedef int CM_RESOURCE_TYPE; REG_OPTION_BACKUP_RESTORE |\ REG_OPTION_OPEN_LINK) +#define REG_OPEN_LEGAL_OPTION \ + (REG_OPTION_RESERVED |\ + REG_OPTION_BACKUP_RESTORE |\ + REG_OPTION_OPEN_LINK) + +#define REG_STANDARD_FORMAT 1 +#define REG_LATEST_FORMAT 2 +#define REG_NO_COMPRESSION 4 + /* Key creation/open disposition */ #define REG_CREATED_NEW_KEY (0x00000001L) #define REG_OPENED_EXISTING_KEY (0x00000002L) @@ -2254,27 +2816,6 @@ typedef int CM_RESOURCE_TYPE; REG_NOTIFY_CHANGE_LAST_SET |\ REG_NOTIFY_CHANGE_SECURITY) -typedef struct _CM_FLOPPY_DEVICE_DATA { - USHORT Version; - USHORT Revision; - CHAR Size[8]; - ULONG MaxDensity; - ULONG MountDensity; - UCHAR StepRateHeadUnloadTime; - UCHAR HeadLoadTime; - UCHAR MotorOffTime; - UCHAR SectorLengthCode; - UCHAR SectorPerTrack; - UCHAR ReadWriteGapLength; - UCHAR DataTransferLength; - UCHAR FormatGapLength; - UCHAR FormatFillCharacter; - UCHAR HeadSettleTime; - UCHAR MotorSettleTime; - UCHAR MaximumTrackValue; - UCHAR DataTransferRate; -} CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA; - #include typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR { UCHAR Type; @@ -2441,6 +2982,50 @@ typedef enum _CM_SHARE_DISPOSITION { #define CM_RESOURCE_DMA_TYPE_B 0x0020 #define CM_RESOURCE_DMA_TYPE_F 0x0040 +typedef struct _DEVICE_FLAGS { + ULONG Failed:1; + ULONG ReadOnly:1; + ULONG Removable:1; + ULONG ConsoleIn:1; + ULONG ConsoleOut:1; + ULONG Input:1; + ULONG Output:1; +} DEVICE_FLAGS, *PDEVICE_FLAGS; + +typedef enum _INTERFACE_TYPE { + InterfaceTypeUndefined = -1, + Internal, + Isa, + Eisa, + MicroChannel, + TurboChannel, + PCIBus, + VMEBus, + NuBus, + PCMCIABus, + CBus, + MPIBus, + MPSABus, + ProcessorInternal, + InternalPowerBus, + PNPISABus, + PNPBus, + Vmcs, + MaximumInterfaceType +} INTERFACE_TYPE, *PINTERFACE_TYPE; + +typedef struct _CM_COMPONENT_INFORMATION { + DEVICE_FLAGS Flags; + ULONG Version; + ULONG Key; + KAFFINITY AffinityMask; +} CM_COMPONENT_INFORMATION, *PCM_COMPONENT_INFORMATION; + +typedef struct _CM_ROM_BLOCK { + ULONG Address; + ULONG Size; +} CM_ROM_BLOCK, *PCM_ROM_BLOCK; + typedef struct _CM_PARTIAL_RESOURCE_LIST { USHORT Version; USHORT Revision; @@ -2459,6 +3044,12 @@ typedef struct _CM_RESOURCE_LIST { CM_FULL_RESOURCE_DESCRIPTOR List[1]; } CM_RESOURCE_LIST, *PCM_RESOURCE_LIST; +typedef struct _PNP_BUS_INFORMATION { + GUID BusTypeGuid; + INTERFACE_TYPE LegacyBusType; + ULONG BusNumber; +} PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION; + #include typedef struct _CM_INT13_DRIVE_PARAMETER { @@ -2469,6 +3060,14 @@ typedef struct _CM_INT13_DRIVE_PARAMETER { USHORT NumberDrives; } CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER; +typedef struct _CM_MCA_POS_DATA { + USHORT AdapterId; + UCHAR PosData1; + UCHAR PosData2; + UCHAR PosData3; + UCHAR PosData4; +} CM_MCA_POS_DATA, *PCM_MCA_POS_DATA; + typedef struct _CM_PNP_BIOS_DEVICE_NODE { USHORT Size; UCHAR Node; @@ -2510,50 +3109,82 @@ typedef struct _CM_KEYBOARD_DEVICE_DATA { USHORT KeyboardFlags; } CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA; -typedef struct _CM_MCA_POS_DATA { - USHORT AdapterId; - UCHAR PosData1; - UCHAR PosData2; - UCHAR PosData3; - UCHAR PosData4; -} CM_MCA_POS_DATA, *PCM_MCA_POS_DATA; - -#if (NTDDI_VERSION >= NTDDI_WINXP) -typedef struct CM_Power_Data_s { - ULONG PD_Size; - DEVICE_POWER_STATE PD_MostRecentPowerState; - ULONG PD_Capabilities; - ULONG PD_D1Latency; - ULONG PD_D2Latency; - ULONG PD_D3Latency; - DEVICE_POWER_STATE PD_PowerStateMapping[PowerSystemMaximum]; - SYSTEM_POWER_STATE PD_DeepestSystemWake; -} CM_POWER_DATA, *PCM_POWER_DATA; - -#define PDCAP_D0_SUPPORTED 0x00000001 -#define PDCAP_D1_SUPPORTED 0x00000002 -#define PDCAP_D2_SUPPORTED 0x00000004 -#define PDCAP_D3_SUPPORTED 0x00000008 -#define PDCAP_WAKE_FROM_D0_SUPPORTED 0x00000010 -#define PDCAP_WAKE_FROM_D1_SUPPORTED 0x00000020 -#define PDCAP_WAKE_FROM_D2_SUPPORTED 0x00000040 -#define PDCAP_WAKE_FROM_D3_SUPPORTED 0x00000080 -#define PDCAP_WARM_EJECT_SUPPORTED 0x00000100 - -#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ - typedef struct _CM_SCSI_DEVICE_DATA { USHORT Version; USHORT Revision; UCHAR HostIdentifier; } CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA; +typedef struct _CM_VIDEO_DEVICE_DATA { + USHORT Version; + USHORT Revision; + ULONG VideoClock; +} CM_VIDEO_DEVICE_DATA, *PCM_VIDEO_DEVICE_DATA; + +typedef struct _CM_SONIC_DEVICE_DATA { + USHORT Version; + USHORT Revision; + USHORT DataConfigurationRegister; + UCHAR EthernetAddress[8]; +} CM_SONIC_DEVICE_DATA, *PCM_SONIC_DEVICE_DATA; + typedef struct _CM_SERIAL_DEVICE_DATA { USHORT Version; USHORT Revision; ULONG BaudClock; } CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA; +typedef struct _CM_MONITOR_DEVICE_DATA { + USHORT Version; + USHORT Revision; + USHORT HorizontalScreenSize; + USHORT VerticalScreenSize; + USHORT HorizontalResolution; + USHORT VerticalResolution; + USHORT HorizontalDisplayTimeLow; + USHORT HorizontalDisplayTime; + USHORT HorizontalDisplayTimeHigh; + USHORT HorizontalBackPorchLow; + USHORT HorizontalBackPorch; + USHORT HorizontalBackPorchHigh; + USHORT HorizontalFrontPorchLow; + USHORT HorizontalFrontPorch; + USHORT HorizontalFrontPorchHigh; + USHORT HorizontalSyncLow; + USHORT HorizontalSync; + USHORT HorizontalSyncHigh; + USHORT VerticalBackPorchLow; + USHORT VerticalBackPorch; + USHORT VerticalBackPorchHigh; + USHORT VerticalFrontPorchLow; + USHORT VerticalFrontPorch; + USHORT VerticalFrontPorchHigh; + USHORT VerticalSyncLow; + USHORT VerticalSync; + USHORT VerticalSyncHigh; +} CM_MONITOR_DEVICE_DATA, *PCM_MONITOR_DEVICE_DATA; + +typedef struct _CM_FLOPPY_DEVICE_DATA { + USHORT Version; + USHORT Revision; + CHAR Size[8]; + ULONG MaxDensity; + ULONG MountDensity; + UCHAR StepRateHeadUnloadTime; + UCHAR HeadLoadTime; + UCHAR MotorOffTime; + UCHAR SectorLengthCode; + UCHAR SectorPerTrack; + UCHAR ReadWriteGapLength; + UCHAR DataTransferLength; + UCHAR FormatGapLength; + UCHAR FormatFillCharacter; + UCHAR HeadSettleTime; + UCHAR MotorSettleTime; + UCHAR MaximumTrackValue; + UCHAR DataTransferRate; +} CM_FLOPPY_DEVICE_DATA, *PCM_FLOPPY_DEVICE_DATA; + typedef enum _KEY_INFORMATION_CLASS { KeyBasicInformation, KeyNodeInformation, @@ -2573,6 +3204,10 @@ typedef struct _KEY_BASIC_INFORMATION { WCHAR Name[1]; } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION; +typedef struct _KEY_CONTROL_FLAGS_INFORMATION { + ULONG ControlFlags; +} KEY_CONTROL_FLAGS_INFORMATION, *PKEY_CONTROL_FLAGS_INFORMATION; + typedef struct _KEY_FULL_INFORMATION { LARGE_INTEGER LastWriteTime; ULONG TitleIndex; @@ -2587,6 +3222,10 @@ typedef struct _KEY_FULL_INFORMATION { WCHAR Class[1]; } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION; +typedef struct _KEY_HANDLE_TAGS_INFORMATION { + ULONG HandleTags; +} KEY_HANDLE_TAGS_INFORMATION, *PKEY_HANDLE_TAGS_INFORMATION; + typedef struct _KEY_NODE_INFORMATION { LARGE_INTEGER LastWriteTime; ULONG TitleIndex; @@ -2596,6 +3235,23 @@ typedef struct _KEY_NODE_INFORMATION { WCHAR Name[1]; } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION; +typedef enum _KEY_SET_INFORMATION_CLASS { + KeyWriteTimeInformation, + KeyWow64FlagsInformation, + KeyControlFlagsInformation, + KeySetVirtualizationInformation, + KeySetDebugInformation, + KeySetHandleTagsInformation, + MaxKeySetInfoClass +} KEY_SET_INFORMATION_CLASS; + +typedef struct _KEY_SET_VIRTUALIZATION_INFORMATION { + ULONG VirtualTarget:1; + ULONG VirtualStore:1; + ULONG VirtualSource:1; + ULONG Reserved:29; +} KEY_SET_VIRTUALIZATION_INFORMATION, *PKEY_SET_VIRTUALIZATION_INFORMATION; + typedef struct _KEY_VALUE_BASIC_INFORMATION { ULONG TitleIndex; ULONG Type; @@ -2640,20 +3296,14 @@ typedef enum _KEY_VALUE_INFORMATION_CLASS { KeyValuePartialInformationAlign64 } KEY_VALUE_INFORMATION_CLASS; +typedef struct _KEY_WOW64_FLAGS_INFORMATION { + ULONG UserFlags; +} KEY_WOW64_FLAGS_INFORMATION, *PKEY_WOW64_FLAGS_INFORMATION; + typedef struct _KEY_WRITE_TIME_INFORMATION { LARGE_INTEGER LastWriteTime; } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION; -typedef enum _KEY_SET_INFORMATION_CLASS { - KeyWriteTimeInformation, - KeyWow64FlagsInformation, - KeyControlFlagsInformation, - KeySetVirtualizationInformation, - KeySetDebugInformation, - KeySetHandleTagsInformation, - MaxKeySetInfoClass -} KEY_SET_INFORMATION_CLASS; - typedef enum _REG_NOTIFY_CLASS { RegNtDeleteKey, RegNtPreDeleteKey = RegNtDeleteKey, @@ -2823,6 +3473,54 @@ typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION { PVOID Reserved; } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION; +typedef struct _REG_RENAME_KEY_INFORMATION { + PVOID Object; + PUNICODE_STRING NewName; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_RENAME_KEY_INFORMATION, *PREG_RENAME_KEY_INFORMATION; + +typedef struct _REG_CREATE_KEY_INFORMATION { + PUNICODE_STRING CompleteName; + PVOID RootObject; + PVOID ObjectType; + ULONG CreateOptions; + PUNICODE_STRING Class; + PVOID SecurityDescriptor; + PVOID SecurityQualityOfService; + ACCESS_MASK DesiredAccess; + ACCESS_MASK GrantedAccess; + PULONG Disposition; + PVOID *ResultObject; + PVOID CallContext; + PVOID RootObjectContext; + PVOID Transaction; + PVOID Reserved; +} REG_CREATE_KEY_INFORMATION, REG_OPEN_KEY_INFORMATION,*PREG_CREATE_KEY_INFORMATION, *PREG_OPEN_KEY_INFORMATION; + +typedef struct _REG_CREATE_KEY_INFORMATION_V1 { + PUNICODE_STRING CompleteName; + PVOID RootObject; + PVOID ObjectType; + ULONG Options; + PUNICODE_STRING Class; + PVOID SecurityDescriptor; + PVOID SecurityQualityOfService; + ACCESS_MASK DesiredAccess; + ACCESS_MASK GrantedAccess; + PULONG Disposition; + PVOID *ResultObject; + PVOID CallContext; + PVOID RootObjectContext; + PVOID Transaction; + ULONG_PTR Version; + PUNICODE_STRING RemainingName; + ULONG Wow64Flags; + ULONG Attributes; + KPROCESSOR_MODE CheckAccessMode; +} REG_CREATE_KEY_INFORMATION_V1, REG_OPEN_KEY_INFORMATION_V1,*PREG_CREATE_KEY_INFORMATION_V1, *PREG_OPEN_KEY_INFORMATION_V1; + typedef struct _REG_PRE_CREATE_KEY_INFORMATION { PUNICODE_STRING CompleteName; } REG_PRE_CREATE_KEY_INFORMATION, REG_PRE_OPEN_KEY_INFORMATION,*PREG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;; @@ -2850,151 +3548,180 @@ typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION { PVOID Reserved; } REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION; +#if (NTDDI_VERSION >= NTDDI_VISTA) + +typedef struct _REG_LOAD_KEY_INFORMATION { + PVOID Object; + PUNICODE_STRING KeyName; + PUNICODE_STRING SourceFile; + ULONG Flags; + PVOID TrustClassObject; + PVOID UserEvent; + ACCESS_MASK DesiredAccess; + PHANDLE RootHandle; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_LOAD_KEY_INFORMATION, *PREG_LOAD_KEY_INFORMATION; + +typedef struct _REG_UNLOAD_KEY_INFORMATION { + PVOID Object; + PVOID UserEvent; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_UNLOAD_KEY_INFORMATION, *PREG_UNLOAD_KEY_INFORMATION; + +typedef struct _REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION { + PVOID Object; + PVOID ObjectContext; + PVOID Reserved; +} REG_CALLBACK_CONTEXT_CLEANUP_INFORMATION, *PREG_CALLBACK_CONTEXT_CLEANUP_INFORMATION; + +typedef struct _REG_QUERY_KEY_SECURITY_INFORMATION { + PVOID Object; + PSECURITY_INFORMATION SecurityInformation; + PSECURITY_DESCRIPTOR SecurityDescriptor; + PULONG Length; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_QUERY_KEY_SECURITY_INFORMATION, *PREG_QUERY_KEY_SECURITY_INFORMATION; + +typedef struct _REG_SET_KEY_SECURITY_INFORMATION { + PVOID Object; + PSECURITY_INFORMATION SecurityInformation; + PSECURITY_DESCRIPTOR SecurityDescriptor; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_SET_KEY_SECURITY_INFORMATION, *PREG_SET_KEY_SECURITY_INFORMATION; + +typedef struct _REG_RESTORE_KEY_INFORMATION { + PVOID Object; + HANDLE FileHandle; + ULONG Flags; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_RESTORE_KEY_INFORMATION, *PREG_RESTORE_KEY_INFORMATION; + +typedef struct _REG_SAVE_KEY_INFORMATION { + PVOID Object; + HANDLE FileHandle; + ULONG Format; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_SAVE_KEY_INFORMATION, *PREG_SAVE_KEY_INFORMATION; + +typedef struct _REG_REPLACE_KEY_INFORMATION { + PVOID Object; + PUNICODE_STRING OldFileName; + PUNICODE_STRING NewFileName; + PVOID CallContext; + PVOID ObjectContext; + PVOID Reserved; +} REG_REPLACE_KEY_INFORMATION, *PREG_REPLACE_KEY_INFORMATION; + +#endif /* NTDDI_VERSION >= NTDDI_VISTA */ + +#define SERVICE_KERNEL_DRIVER 0x00000001 +#define SERVICE_FILE_SYSTEM_DRIVER 0x00000002 +#define SERVICE_ADAPTER 0x00000004 +#define SERVICE_RECOGNIZER_DRIVER 0x00000008 + +#define SERVICE_DRIVER (SERVICE_KERNEL_DRIVER | \ + SERVICE_FILE_SYSTEM_DRIVER | \ + SERVICE_RECOGNIZER_DRIVER) + +#define SERVICE_WIN32_OWN_PROCESS 0x00000010 +#define SERVICE_WIN32_SHARE_PROCESS 0x00000020 +#define SERVICE_WIN32 (SERVICE_WIN32_OWN_PROCESS | \ + SERVICE_WIN32_SHARE_PROCESS) + +#define SERVICE_INTERACTIVE_PROCESS 0x00000100 + +#define SERVICE_TYPE_ALL (SERVICE_WIN32 | \ + SERVICE_ADAPTER | \ + SERVICE_DRIVER | \ + SERVICE_INTERACTIVE_PROCESS) + +/* Service Start Types */ +#define SERVICE_BOOT_START 0x00000000 +#define SERVICE_SYSTEM_START 0x00000001 +#define SERVICE_AUTO_START 0x00000002 +#define SERVICE_DEMAND_START 0x00000003 +#define SERVICE_DISABLED 0x00000004 + +#define SERVICE_ERROR_IGNORE 0x00000000 +#define SERVICE_ERROR_NORMAL 0x00000001 +#define SERVICE_ERROR_SEVERE 0x00000002 +#define SERVICE_ERROR_CRITICAL 0x00000003 + +typedef enum _CM_SERVICE_NODE_TYPE { + DriverType = SERVICE_KERNEL_DRIVER, + FileSystemType = SERVICE_FILE_SYSTEM_DRIVER, + Win32ServiceOwnProcess = SERVICE_WIN32_OWN_PROCESS, + Win32ServiceShareProcess = SERVICE_WIN32_SHARE_PROCESS, + AdapterType = SERVICE_ADAPTER, + RecognizerType = SERVICE_RECOGNIZER_DRIVER +} SERVICE_NODE_TYPE; + +typedef enum _CM_SERVICE_LOAD_TYPE { + BootLoad = SERVICE_BOOT_START, + SystemLoad = SERVICE_SYSTEM_START, + AutoLoad = SERVICE_AUTO_START, + DemandLoad = SERVICE_DEMAND_START, + DisableLoad = SERVICE_DISABLED +} SERVICE_LOAD_TYPE; + +typedef enum _CM_ERROR_CONTROL_TYPE { + IgnoreError = SERVICE_ERROR_IGNORE, + NormalError = SERVICE_ERROR_NORMAL, + SevereError = SERVICE_ERROR_SEVERE, + CriticalError = SERVICE_ERROR_CRITICAL +} SERVICE_ERROR_TYPE; + +#define CM_SERVICE_NETWORK_BOOT_LOAD 0x00000001 +#define CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD 0x00000002 +#define CM_SERVICE_USB_DISK_BOOT_LOAD 0x00000004 + +#define CM_SERVICE_VALID_PROMOTION_MASK (CM_SERVICE_NETWORK_BOOT_LOAD | \ + CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD | \ + CM_SERVICE_USB_DISK_BOOT_LOAD) + /****************************************************************************** * I/O Manager Types * ******************************************************************************/ - /* PCI_COMMON_CONFIG.Command */ -#define PCI_ENABLE_IO_SPACE 0x0001 -#define PCI_ENABLE_MEMORY_SPACE 0x0002 -#define PCI_ENABLE_BUS_MASTER 0x0004 -#define PCI_ENABLE_SPECIAL_CYCLES 0x0008 -#define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010 -#define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020 -#define PCI_ENABLE_PARITY 0x0040 -#define PCI_ENABLE_WAIT_CYCLE 0x0080 -#define PCI_ENABLE_SERR 0x0100 -#define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200 -#define PCI_DISABLE_LEVEL_INTERRUPT 0x0400 +#define WDM_MAJORVERSION 0x06 +#define WDM_MINORVERSION 0x00 -/* PCI_COMMON_CONFIG.Status */ -#define PCI_STATUS_INTERRUPT_PENDING 0x0008 -#define PCI_STATUS_CAPABILITIES_LIST 0x0010 -#define PCI_STATUS_66MHZ_CAPABLE 0x0020 -#define PCI_STATUS_UDF_SUPPORTED 0x0040 -#define PCI_STATUS_FAST_BACK_TO_BACK 0x0080 -#define PCI_STATUS_DATA_PARITY_DETECTED 0x0100 -#define PCI_STATUS_DEVSEL 0x0600 -#define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800 -#define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000 -#define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000 -#define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000 -#define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000 +#if defined(_WIN64) -/* PCI_COMMON_CONFIG.HeaderType */ -#define PCI_MULTIFUNCTION 0x80 -#define PCI_DEVICE_TYPE 0x00 -#define PCI_BRIDGE_TYPE 0x01 -#define PCI_CARDBUS_BRIDGE_TYPE 0x02 +#ifndef USE_DMA_MACROS +#define USE_DMA_MACROS +#endif -#define PCI_CONFIGURATION_TYPE(PciData) \ - (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION) +#ifndef NO_LEGACY_DRIVERS +#define NO_LEGACY_DRIVERS +#endif -#define PCI_MULTIFUNCTION_DEVICE(PciData) \ - ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0) +#endif /* defined(_WIN64) */ -/* PCI device classes */ -#define PCI_CLASS_PRE_20 0x00 -#define PCI_CLASS_MASS_STORAGE_CTLR 0x01 -#define PCI_CLASS_NETWORK_CTLR 0x02 -#define PCI_CLASS_DISPLAY_CTLR 0x03 -#define PCI_CLASS_MULTIMEDIA_DEV 0x04 -#define PCI_CLASS_MEMORY_CTLR 0x05 -#define PCI_CLASS_BRIDGE_DEV 0x06 -#define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07 -#define PCI_CLASS_BASE_SYSTEM_DEV 0x08 -#define PCI_CLASS_INPUT_DEV 0x09 -#define PCI_CLASS_DOCKING_STATION 0x0a -#define PCI_CLASS_PROCESSOR 0x0b -#define PCI_CLASS_SERIAL_BUS_CTLR 0x0c -#define PCI_CLASS_WIRELESS_CTLR 0x0d -#define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e -#define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f -#define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10 -#define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11 +#define STATUS_CONTINUE_COMPLETION STATUS_SUCCESS -/* PCI device subclasses for class 0 */ -#define PCI_SUBCLASS_PRE_20_NON_VGA 0x00 -#define PCI_SUBCLASS_PRE_20_VGA 0x01 - -/* PCI device subclasses for class 1 (mass storage controllers)*/ -#define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00 -#define PCI_SUBCLASS_MSC_IDE_CTLR 0x01 -#define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02 -#define PCI_SUBCLASS_MSC_IPI_CTLR 0x03 -#define PCI_SUBCLASS_MSC_RAID_CTLR 0x04 -#define PCI_SUBCLASS_MSC_OTHER 0x80 - -/* PCI device subclasses for class 2 (network controllers)*/ -#define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00 -#define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01 -#define PCI_SUBCLASS_NET_FDDI_CTLR 0x02 -#define PCI_SUBCLASS_NET_ATM_CTLR 0x03 -#define PCI_SUBCLASS_NET_ISDN_CTLR 0x04 -#define PCI_SUBCLASS_NET_OTHER 0x80 - -/* PCI device subclasses for class 3 (display controllers)*/ -#define PCI_SUBCLASS_VID_VGA_CTLR 0x00 -#define PCI_SUBCLASS_VID_XGA_CTLR 0x01 -#define PCI_SUBCLASS_VID_3D_CTLR 0x02 -#define PCI_SUBCLASS_VID_OTHER 0x80 - -/* PCI device subclasses for class 4 (multimedia device)*/ -#define PCI_SUBCLASS_MM_VIDEO_DEV 0x00 -#define PCI_SUBCLASS_MM_AUDIO_DEV 0x01 -#define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02 -#define PCI_SUBCLASS_MM_OTHER 0x80 - -/* PCI device subclasses for class 5 (memory controller)*/ -#define PCI_SUBCLASS_MEM_RAM 0x00 -#define PCI_SUBCLASS_MEM_FLASH 0x01 -#define PCI_SUBCLASS_MEM_OTHER 0x80 - -/* PCI device subclasses for class 6 (bridge device)*/ -#define PCI_SUBCLASS_BR_HOST 0x00 -#define PCI_SUBCLASS_BR_ISA 0x01 -#define PCI_SUBCLASS_BR_EISA 0x02 -#define PCI_SUBCLASS_BR_MCA 0x03 -#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04 -#define PCI_SUBCLASS_BR_PCMCIA 0x05 -#define PCI_SUBCLASS_BR_NUBUS 0x06 -#define PCI_SUBCLASS_BR_CARDBUS 0x07 -#define PCI_SUBCLASS_BR_RACEWAY 0x08 -#define PCI_SUBCLASS_BR_OTHER 0x80 - -/* PCI device subclasses for class C (serial bus controller)*/ -#define PCI_SUBCLASS_SB_IEEE1394 0x00 -#define PCI_SUBCLASS_SB_ACCESS 0x01 -#define PCI_SUBCLASS_SB_SSA 0x02 -#define PCI_SUBCLASS_SB_USB 0x03 -#define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04 -#define PCI_SUBCLASS_SB_SMBUS 0x05 - -#define PCI_MAX_DEVICES 32 -#define PCI_MAX_FUNCTION 8 -#define PCI_MAX_BRIDGE_NUMBER 0xFF -#define PCI_INVALID_VENDORID 0xFFFF -#define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific)) - -#define PCI_ADDRESS_IO_SPACE 0x00000001 -#define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006 -#define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008 -#define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc -#define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0 -#define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800 - -#define PCI_TYPE_32BIT 0 -#define PCI_TYPE_20BIT 2 -#define PCI_TYPE_64BIT 4 +#define CONNECT_FULLY_SPECIFIED 0x1 +#define CONNECT_LINE_BASED 0x2 +#define CONNECT_MESSAGE_BASED 0x3 +#define CONNECT_FULLY_SPECIFIED_GROUP 0x4 +#define CONNECT_CURRENT_VERSION 0x4 #define POOL_COLD_ALLOCATION 256 #define POOL_QUOTA_FAIL_INSTEAD_OF_RAISE 8 #define POOL_RAISE_IF_ALLOCATION_FAILURE 16 -#define PCI_TYPE0_ADDRESSES 6 -#define PCI_TYPE1_ADDRESSES 2 -#define PCI_TYPE2_ADDRESSES 5 - #define IO_TYPE_ADAPTER 1 #define IO_TYPE_CONTROLLER 2 #define IO_TYPE_DEVICE 3 @@ -3018,47 +3745,6 @@ typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION { #define IO_RESOURCE_DEFAULT 0x02 #define IO_RESOURCE_ALTERNATIVE 0x08 -/* DEVICE_OBJECT.Flags */ -#define DO_VERIFY_VOLUME 0x00000002 -#define DO_BUFFERED_IO 0x00000004 -#define DO_EXCLUSIVE 0x00000008 -#define DO_DIRECT_IO 0x00000010 -#define DO_MAP_IO_BUFFER 0x00000020 -#define DO_DEVICE_INITIALIZING 0x00000080 -#define DO_SHUTDOWN_REGISTERED 0x00000800 -#define DO_BUS_ENUMERATED_DEVICE 0x00001000 -#define DO_POWER_PAGABLE 0x00002000 -#define DO_POWER_INRUSH 0x00004000 - -/* DEVICE_OBJECT.Characteristics */ -#define FILE_REMOVABLE_MEDIA 0x00000001 -#define FILE_READ_ONLY_DEVICE 0x00000002 -#define FILE_FLOPPY_DISKETTE 0x00000004 -#define FILE_WRITE_ONCE_MEDIA 0x00000008 -#define FILE_REMOTE_DEVICE 0x00000010 -#define FILE_DEVICE_IS_MOUNTED 0x00000020 -#define FILE_VIRTUAL_VOLUME 0x00000040 -#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080 -#define FILE_DEVICE_SECURE_OPEN 0x00000100 -#define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800 -#define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000 -#define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000 - -/* DEVICE_OBJECT.AlignmentRequirement */ -#define FILE_BYTE_ALIGNMENT 0x00000000 -#define FILE_WORD_ALIGNMENT 0x00000001 -#define FILE_LONG_ALIGNMENT 0x00000003 -#define FILE_QUAD_ALIGNMENT 0x00000007 -#define FILE_OCTA_ALIGNMENT 0x0000000f -#define FILE_32_BYTE_ALIGNMENT 0x0000001f -#define FILE_64_BYTE_ALIGNMENT 0x0000003f -#define FILE_128_BYTE_ALIGNMENT 0x0000007f -#define FILE_256_BYTE_ALIGNMENT 0x000000ff -#define FILE_512_BYTE_ALIGNMENT 0x000001ff - -/* DEVICE_OBJECT.DeviceType */ -#define DEVICE_TYPE ULONG - #define FILE_DEVICE_BEEP 0x00000001 #define FILE_DEVICE_CD_ROM 0x00000002 #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003 @@ -3127,6 +3813,44 @@ typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION { #define FILE_DEVICE_BIOMETRIC 0x00000044 #define FILE_DEVICE_PMI 0x00000045 +#if defined(NT_PROCESSOR_GROUPS) + +typedef USHORT IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY; + +typedef enum _IRQ_DEVICE_POLICY_USHORT { + IrqPolicyMachineDefault = 0, + IrqPolicyAllCloseProcessors = 1, + IrqPolicyOneCloseProcessor = 2, + IrqPolicyAllProcessorsInMachine = 3, + IrqPolicyAllProcessorsInGroup = 3, + IrqPolicySpecifiedProcessors = 4, + IrqPolicySpreadMessagesAcrossAllProcessors = 5}; + +#else /* defined(NT_PROCESSOR_GROUPS) */ + +typedef enum _IRQ_DEVICE_POLICY { + IrqPolicyMachineDefault = 0, + IrqPolicyAllCloseProcessors, + IrqPolicyOneCloseProcessor, + IrqPolicyAllProcessorsInMachine, + IrqPolicySpecifiedProcessors, + IrqPolicySpreadMessagesAcrossAllProcessors +} IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY; + +#endif + +typedef enum _IRQ_PRIORITY { + IrqPriorityUndefined = 0, + IrqPriorityLow, + IrqPriorityNormal, + IrqPriorityHigh +} IRQ_PRIORITY, *PIRQ_PRIORITY; + +typedef enum _IRQ_GROUP_POLICY { + GroupAffinityAllGroupZero = 0, + GroupAffinityDontCare +} IRQ_GROUP_POLICY, *PIRQ_GROUP_POLICY; + #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR)) typedef struct _OBJECT_HANDLE_INFORMATION { @@ -3139,10 +3863,6 @@ typedef struct _CLIENT_ID { HANDLE UniqueThread; } CLIENT_ID, *PCLIENT_ID; -typedef VOID -(NTAPI *PKSTART_ROUTINE)( - IN PVOID StartContext); - typedef struct _VPB { CSHORT Type; CSHORT Size; @@ -3179,6 +3899,47 @@ typedef struct _WAIT_CONTEXT_BLOCK { PKDPC BufferChainingDpc; } WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK; +/* DEVICE_OBJECT.Flags */ +#define DO_VERIFY_VOLUME 0x00000002 +#define DO_BUFFERED_IO 0x00000004 +#define DO_EXCLUSIVE 0x00000008 +#define DO_DIRECT_IO 0x00000010 +#define DO_MAP_IO_BUFFER 0x00000020 +#define DO_DEVICE_INITIALIZING 0x00000080 +#define DO_SHUTDOWN_REGISTERED 0x00000800 +#define DO_BUS_ENUMERATED_DEVICE 0x00001000 +#define DO_POWER_PAGABLE 0x00002000 +#define DO_POWER_INRUSH 0x00004000 + +/* DEVICE_OBJECT.Characteristics */ +#define FILE_REMOVABLE_MEDIA 0x00000001 +#define FILE_READ_ONLY_DEVICE 0x00000002 +#define FILE_FLOPPY_DISKETTE 0x00000004 +#define FILE_WRITE_ONCE_MEDIA 0x00000008 +#define FILE_REMOTE_DEVICE 0x00000010 +#define FILE_DEVICE_IS_MOUNTED 0x00000020 +#define FILE_VIRTUAL_VOLUME 0x00000040 +#define FILE_AUTOGENERATED_DEVICE_NAME 0x00000080 +#define FILE_DEVICE_SECURE_OPEN 0x00000100 +#define FILE_CHARACTERISTIC_PNP_DEVICE 0x00000800 +#define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000 +#define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000 + +/* DEVICE_OBJECT.AlignmentRequirement */ +#define FILE_BYTE_ALIGNMENT 0x00000000 +#define FILE_WORD_ALIGNMENT 0x00000001 +#define FILE_LONG_ALIGNMENT 0x00000003 +#define FILE_QUAD_ALIGNMENT 0x00000007 +#define FILE_OCTA_ALIGNMENT 0x0000000f +#define FILE_32_BYTE_ALIGNMENT 0x0000001f +#define FILE_64_BYTE_ALIGNMENT 0x0000003f +#define FILE_128_BYTE_ALIGNMENT 0x0000007f +#define FILE_256_BYTE_ALIGNMENT 0x000000ff +#define FILE_512_BYTE_ALIGNMENT 0x000001ff + +/* DEVICE_OBJECT.DeviceType */ +#define DEVICE_TYPE ULONG + typedef struct _DEVICE_OBJECT { CSHORT Type; USHORT Size; @@ -3210,6 +3971,153 @@ typedef struct _DEVICE_OBJECT { PVOID Reserved; } DEVICE_OBJECT, *PDEVICE_OBJECT; +typedef enum _IO_SESSION_STATE { + IoSessionStateCreated = 1, + IoSessionStateInitialized, + IoSessionStateConnected, + IoSessionStateDisconnected, + IoSessionStateDisconnectedLoggedOn, + IoSessionStateLoggedOn, + IoSessionStateLoggedOff, + IoSessionStateTerminated, + IoSessionStateMax +} IO_SESSION_STATE, *PIO_SESSION_STATE; + +typedef enum _IO_COMPLETION_ROUTINE_RESULT { + ContinueCompletion = STATUS_CONTINUE_COMPLETION, + StopCompletion = STATUS_MORE_PROCESSING_REQUIRED +} IO_COMPLETION_ROUTINE_RESULT, *PIO_COMPLETION_ROUTINE_RESULT; + +typedef struct _IO_INTERRUPT_MESSAGE_INFO_ENTRY { + PHYSICAL_ADDRESS MessageAddress; + KAFFINITY TargetProcessorSet; + PKINTERRUPT InterruptObject; + ULONG MessageData; + ULONG Vector; + KIRQL Irql; + KINTERRUPT_MODE Mode; + KINTERRUPT_POLARITY Polarity; +} IO_INTERRUPT_MESSAGE_INFO_ENTRY, *PIO_INTERRUPT_MESSAGE_INFO_ENTRY; + +typedef struct _IO_INTERRUPT_MESSAGE_INFO { + KIRQL UnifiedIrql; + ULONG MessageCount; + IO_INTERRUPT_MESSAGE_INFO_ENTRY MessageInfo[1]; +} IO_INTERRUPT_MESSAGE_INFO, *PIO_INTERRUPT_MESSAGE_INFO; + +typedef struct _IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS { + IN PDEVICE_OBJECT PhysicalDeviceObject; + OUT PKINTERRUPT *InterruptObject; + IN PKSERVICE_ROUTINE ServiceRoutine; + IN PVOID ServiceContext; + IN PKSPIN_LOCK SpinLock OPTIONAL; + IN KIRQL SynchronizeIrql; + IN BOOLEAN FloatingSave; + IN BOOLEAN ShareVector; + IN ULONG Vector; + IN KIRQL Irql; + IN KINTERRUPT_MODE InterruptMode; + IN KAFFINITY ProcessorEnableMask; + IN USHORT Group; +} IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS, *PIO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS; + +typedef struct _IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS { + IN PDEVICE_OBJECT PhysicalDeviceObject; + OUT PKINTERRUPT *InterruptObject; + IN PKSERVICE_ROUTINE ServiceRoutine; + IN PVOID ServiceContext; + IN PKSPIN_LOCK SpinLock OPTIONAL; + IN KIRQL SynchronizeIrql OPTIONAL; + IN BOOLEAN FloatingSave; +} IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS; + +typedef struct _IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS { + IN PDEVICE_OBJECT PhysicalDeviceObject; + union { + OUT PVOID *Generic; + OUT PIO_INTERRUPT_MESSAGE_INFO *InterruptMessageTable; + OUT PKINTERRUPT *InterruptObject; + } ConnectionContext; + IN PKMESSAGE_SERVICE_ROUTINE MessageServiceRoutine; + IN PVOID ServiceContext; + IN PKSPIN_LOCK SpinLock OPTIONAL; + IN KIRQL SynchronizeIrql OPTIONAL; + IN BOOLEAN FloatingSave; + IN PKSERVICE_ROUTINE FallBackServiceRoutine OPTIONAL; +} IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS; + +typedef struct _IO_CONNECT_INTERRUPT_PARAMETERS { + IN OUT ULONG Version; + union { + IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS FullySpecified; + IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS LineBased; + IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS MessageBased; + }; +} IO_CONNECT_INTERRUPT_PARAMETERS, *PIO_CONNECT_INTERRUPT_PARAMETERS; + +typedef struct _IO_DISCONNECT_INTERRUPT_PARAMETERS { + IN ULONG Version; + union { + IN PVOID Generic; + IN PKINTERRUPT InterruptObject; + IN PIO_INTERRUPT_MESSAGE_INFO InterruptMessageTable; + } ConnectionContext; +} IO_DISCONNECT_INTERRUPT_PARAMETERS, *PIO_DISCONNECT_INTERRUPT_PARAMETERS; + +typedef enum _IO_ACCESS_TYPE { + ReadAccess, + WriteAccess, + ModifyAccess +} IO_ACCESS_TYPE; + +typedef enum _IO_ACCESS_MODE { + SequentialAccess, + RandomAccess +} IO_ACCESS_MODE; + +typedef enum _IO_CONTAINER_NOTIFICATION_CLASS { + IoSessionStateNotification, + IoMaxContainerNotificationClass +} IO_CONTAINER_NOTIFICATION_CLASS; + +typedef struct _IO_SESSION_STATE_NOTIFICATION { + ULONG Size; + ULONG Flags; + PVOID IoObject; + ULONG EventMask; + PVOID Context; +} IO_SESSION_STATE_NOTIFICATION, *PIO_SESSION_STATE_NOTIFICATION; + +typedef enum _IO_CONTAINER_INFORMATION_CLASS { + IoSessionStateInformation, + IoMaxContainerInformationClass +} IO_CONTAINER_INFORMATION_CLASS; + +typedef struct _IO_SESSION_STATE_INFORMATION { + ULONG SessionId; + IO_SESSION_STATE SessionState; + BOOLEAN LocalSession; +} IO_SESSION_STATE_INFORMATION, *PIO_SESSION_STATE_INFORMATION; + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +typedef NTSTATUS +(NTAPI *PIO_CONTAINER_NOTIFICATION_FUNCTION)( + VOID); + +typedef NTSTATUS +(NTAPI IO_SESSION_NOTIFICATION_FUNCTION)( + IN PVOID SessionObject, + IN PVOID IoObject, + IN ULONG Event, + IN PVOID Context, + IN PVOID NotificationPayload, + IN ULONG PayloadLength); + +typedef IO_SESSION_NOTIFICATION_FUNCTION *PIO_SESSION_NOTIFICATION_FUNCTION; + +#endif + typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK; typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK { @@ -3338,22 +4246,6 @@ typedef struct _SHARE_ACCESS { } type2; \ } u; -typedef struct _PCI_COMMON_HEADER { - PCI_COMMON_HEADER_LAYOUT -} PCI_COMMON_HEADER, *PPCI_COMMON_HEADER; - -#ifdef __cplusplus -typedef struct _PCI_COMMON_CONFIG { - PCI_COMMON_HEADER_LAYOUT - UCHAR DeviceSpecific[192]; -} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; -#else -typedef struct _PCI_COMMON_CONFIG { - PCI_COMMON_HEADER DUMMYSTRUCTNAME; - UCHAR DeviceSpecific[192]; -} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; -#endif - typedef enum _CREATE_FILE_TYPE { CreateFileTypeNone, CreateFileTypeNamedPipe, @@ -3374,16 +4266,12 @@ typedef struct _IO_STATUS_BLOCK { ULONG_PTR Information; } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; -typedef struct _PCI_SLOT_NUMBER { - union { - struct { - ULONG DeviceNumber : 5; - ULONG FunctionNumber : 3; - ULONG Reserved : 24; - } bits; - ULONG AsULONG; - } u; -} PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER; +#if defined(_WIN64) +typedef struct _IO_STATUS_BLOCK32 { + NTSTATUS Status; + ULONG Information; +} IO_STATUS_BLOCK32, *PIO_STATUS_BLOCK32; +#endif typedef VOID (NTAPI *PIO_APC_ROUTINE)( @@ -3391,16 +4279,35 @@ typedef VOID IN PIO_STATUS_BLOCK IoStatusBlock, IN ULONG Reserved); -typedef VOID -(NTAPI *WMI_NOTIFICATION_CALLBACK)( - PVOID Wnode, - PVOID Context); +#define PIO_APC_ROUTINE_DEFINED -#define WMIREG_ACTION_REGISTER 1 -#define WMIREG_ACTION_DEREGISTER 2 -#define WMIREG_ACTION_REREGISTER 3 -#define WMIREG_ACTION_UPDATE_GUIDS 4 -#define WMIREG_ACTION_BLOCK_IRPS 5 +typedef enum _IO_SESSION_EVENT { + IoSessionEventIgnore = 0, + IoSessionEventCreated, + IoSessionEventTerminated, + IoSessionEventConnected, + IoSessionEventDisconnected, + IoSessionEventLogon, + IoSessionEventLogoff, + IoSessionEventMax +} IO_SESSION_EVENT, *PIO_SESSION_EVENT; + +#define IO_SESSION_STATE_ALL_EVENTS 0xffffffff +#define IO_SESSION_STATE_CREATION_EVENT 0x00000001 +#define IO_SESSION_STATE_TERMINATION_EVENT 0x00000002 +#define IO_SESSION_STATE_CONNECT_EVENT 0x00000004 +#define IO_SESSION_STATE_DISCONNECT_EVENT 0x00000008 +#define IO_SESSION_STATE_LOGON_EVENT 0x00000010 +#define IO_SESSION_STATE_LOGOFF_EVENT 0x00000020 + +#define IO_SESSION_STATE_VALID_EVENT_MASK 0x0000003f + +#define IO_SESSION_MAX_PAYLOAD_SIZE 256L + +typedef struct _IO_SESSION_CONNECT_INFO { + ULONG SessionId; + BOOLEAN LocalSession; +} IO_SESSION_CONNECT_INFO, *PIO_SESSION_CONNECT_INFO; #define EVENT_INCREMENT 1 #define IO_NO_INCREMENT 0 @@ -3469,6 +4376,7 @@ typedef struct _BOOTDISK_INFORMATION_LITE { #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ +#include typedef struct _EISA_MEMORY_TYPE { UCHAR ReadWrite : 1; @@ -3480,7 +4388,6 @@ typedef struct _EISA_MEMORY_TYPE { UCHAR MoreEntries : 1; } EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE; -#include typedef struct _EISA_MEMORY_CONFIGURATION { EISA_MEMORY_TYPE ConfigurationByte; UCHAR DataSize; @@ -3488,7 +4395,6 @@ typedef struct _EISA_MEMORY_CONFIGURATION { UCHAR AddressHighByte; USHORT MemorySize; } EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION; -#include typedef struct _EISA_IRQ_DESCRIPTOR { UCHAR Interrupt : 4; @@ -3522,7 +4428,6 @@ typedef struct _EISA_DMA_CONFIGURATION { DMA_CONFIGURATION_BYTE1 ConfigurationByte1; } EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION; -#include typedef struct _EISA_PORT_DESCRIPTOR { UCHAR NumberPorts : 5; UCHAR Reserved : 1; @@ -3534,7 +4439,17 @@ typedef struct _EISA_PORT_CONFIGURATION { EISA_PORT_DESCRIPTOR Configuration; USHORT PortAddress; } EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION; -#include + +typedef struct _CM_EISA_SLOT_INFORMATION { + UCHAR ReturnCode; + UCHAR ReturnFlags; + UCHAR MajorRevision; + UCHAR MinorRevision; + USHORT Checksum; + UCHAR NumberFunctions; + UCHAR FunctionInformation; + ULONG CompressedId; +} CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION; typedef struct _CM_EISA_FUNCTION_INFORMATION { ULONG CompressedId; @@ -3552,6 +4467,8 @@ typedef struct _CM_EISA_FUNCTION_INFORMATION { UCHAR InitializationData[60]; } CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION; +#include + /* CM_EISA_FUNCTION_INFORMATION.FunctionFlags */ #define EISA_FUNCTION_ENABLED 0x80 @@ -3566,16 +4483,9 @@ typedef struct _CM_EISA_FUNCTION_INFORMATION { (EISA_HAS_PORT_RANGE + EISA_HAS_DMA_ENTRY + EISA_HAS_IRQ_ENTRY \ + EISA_HAS_MEMORY_ENTRY + EISA_HAS_TYPE_ENTRY) -typedef struct _CM_EISA_SLOT_INFORMATION { - UCHAR ReturnCode; - UCHAR ReturnFlags; - UCHAR MajorRevision; - UCHAR MinorRevision; - USHORT Checksum; - UCHAR NumberFunctions; - UCHAR FunctionInformation; - ULONG CompressedId; -} CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION; +#define EISA_MORE_ENTRIES 0x80 +#define EISA_SYSTEM_MEMORY 0x00 +#define EISA_MEMORY_TYPE_RAM 0x01 /* CM_EISA_SLOT_INFORMATION.ReturnCode */ @@ -3622,6 +4532,45 @@ typedef ULONG IN ULONG Length); typedef GET_SET_DEVICE_DATA *PGET_SET_DEVICE_DATA; +typedef enum _DEVICE_INSTALL_STATE { + InstallStateInstalled, + InstallStateNeedsReinstall, + InstallStateFailedInstall, + InstallStateFinishInstall +} DEVICE_INSTALL_STATE, *PDEVICE_INSTALL_STATE; + +typedef struct _LEGACY_BUS_INFORMATION { + GUID BusTypeGuid; + INTERFACE_TYPE LegacyBusType; + ULONG BusNumber; +} LEGACY_BUS_INFORMATION, *PLEGACY_BUS_INFORMATION; + +typedef enum _DEVICE_REMOVAL_POLICY { + RemovalPolicyExpectNoRemoval = 1, + RemovalPolicyExpectOrderlyRemoval = 2, + RemovalPolicyExpectSurpriseRemoval = 3 +} DEVICE_REMOVAL_POLICY, *PDEVICE_REMOVAL_POLICY; + +typedef VOID +(NTAPI*PREENUMERATE_SELF)( + IN PVOID Context); + +typedef struct _REENUMERATE_SELF_INTERFACE_STANDARD { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PREENUMERATE_SELF SurpriseRemoveAndReenumerateSelf; +} REENUMERATE_SELF_INTERFACE_STANDARD, *PREENUMERATE_SELF_INTERFACE_STANDARD; + +typedef VOID +(NTAPI *PIO_DEVICE_EJECT_CALLBACK)( + IN NTSTATUS Status, + IN OUT PVOID Context OPTIONAL); + +#define PCI_DEVICE_PRESENT_INTERFACE_VERSION 1 + /* PCI_DEVICE_PRESENCE_PARAMETERS.Flags */ #define PCI_USE_SUBSYSTEM_IDS 0x00000001 #define PCI_USE_REVISION 0x00000002 @@ -3682,175 +4631,6 @@ typedef struct _PCI_DEVICE_PRESENT_INTERFACE { PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx; } PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE; -typedef -BOOLEAN -(*PGPE_SERVICE_ROUTINE2)( - PVOID ObjectContext, - PVOID ServiceContext -); - -typedef -NTSTATUS -(*PGPE_CONNECT_VECTOR2)( - PVOID Context, - ULONG GpeNumber, - KINTERRUPT_MODE Mode, - BOOLEAN Shareable, - PGPE_SERVICE_ROUTINE2 ServiceRoutine, - PVOID ServiceContext, - PVOID *ObjectContext -); - -typedef -NTSTATUS -(*PGPE_DISCONNECT_VECTOR2)( - PVOID Context, - PVOID ObjectContext -); - -typedef -NTSTATUS -(*PGPE_ENABLE_EVENT2)( - PVOID Context, - PVOID ObjectContext -); - -typedef -NTSTATUS -(*PGPE_DISABLE_EVENT2)( - PVOID Context, - PVOID ObjectContext -); - -typedef -NTSTATUS -(*PGPE_CLEAR_STATUS2)( - PVOID Context, - PVOID ObjectContext -); - -typedef -VOID -(*PDEVICE_NOTIFY_CALLBACK2)( - PVOID NotificationContext, - ULONG NotifyCode -); - -typedef -NTSTATUS -(*PREGISTER_FOR_DEVICE_NOTIFICATIONS2)( - PVOID Context, - PDEVICE_NOTIFY_CALLBACK2 NotificationHandler, - PVOID NotificationContext -); - -typedef -VOID -(*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)( - PVOID Context -); - -typedef struct -{ - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PGPE_CONNECT_VECTOR2 GpeConnectVector; - PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector; - PGPE_ENABLE_EVENT2 GpeEnableEvent; - PGPE_DISABLE_EVENT2 GpeDisableEvent; - PGPE_CLEAR_STATUS2 GpeClearStatus; - PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications; - PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications; -} ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2; - -typedef -BOOLEAN -(*PGPE_SERVICE_ROUTINE)( - PDEVICE_OBJECT ObjectContext, - PVOID ServiceContext -); - -typedef -NTSTATUS -(*PGPE_CONNECT_VECTOR)( - PDEVICE_OBJECT Context, - ULONG GpeNumber, - KINTERRUPT_MODE Mode, - BOOLEAN Shareable, - PGPE_SERVICE_ROUTINE ServiceRoutine, - PVOID ServiceContext, - PVOID *ObjectContext -); - -typedef -NTSTATUS -(*PGPE_DISCONNECT_VECTOR)( - PDEVICE_OBJECT Context, - PVOID ObjectContext -); - -typedef -NTSTATUS -(*PGPE_ENABLE_EVENT)( - PDEVICE_OBJECT Context, - PVOID ObjectContext -); - -typedef -NTSTATUS -(*PGPE_DISABLE_EVENT)( - PDEVICE_OBJECT Context, - PVOID ObjectContext -); - -typedef -NTSTATUS -(*PGPE_CLEAR_STATUS)( - PDEVICE_OBJECT Context, - PVOID ObjectContext -); - -typedef -VOID -(*PDEVICE_NOTIFY_CALLBACK)( - PVOID NotificationContext, - ULONG NotifyCode -); - -typedef -NTSTATUS -(*PREGISTER_FOR_DEVICE_NOTIFICATIONS)( - PDEVICE_OBJECT Context, - PDEVICE_NOTIFY_CALLBACK NotificationHandler, - PVOID NotificationContext -); - -typedef -VOID -(*PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)( - PDEVICE_OBJECT Context, - PDEVICE_NOTIFY_CALLBACK NotificationHandler -); - -typedef struct -{ - USHORT Size; - USHORT Version; - PVOID Context; - PINTERFACE_REFERENCE InterfaceReference; - PINTERFACE_DEREFERENCE InterfaceDereference; - PGPE_CONNECT_VECTOR GpeConnectVector; - PGPE_DISCONNECT_VECTOR GpeDisconnectVector; - PGPE_ENABLE_EVENT GpeEnableEvent; - PGPE_DISABLE_EVENT GpeDisableEvent; - PGPE_CLEAR_STATUS GpeClearStatus; - PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications; - PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications; -} ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD; - typedef struct _DEVICE_CAPABILITIES { USHORT Size; USHORT Version; @@ -3940,6 +4720,139 @@ typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION { struct _FILE_OBJECT *FileObject; } TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION; +#if (NTDDI_VERSION >= NTDDI_VISTA) +#include +#define PLUGPLAY_PROPERTY_PERSISTENT 0x00000001 +#endif + +#define PNP_REPLACE_NO_MAP MAXLONGLONG + +typedef NTSTATUS +(NTAPI *PREPLACE_MAP_MEMORY)( + IN PHYSICAL_ADDRESS TargetPhysicalAddress, + IN PHYSICAL_ADDRESS SparePhysicalAddress, + IN OUT PLARGE_INTEGER NumberOfBytes, + OUT PVOID *TargetAddress, + OUT PVOID *SpareAddress); + +typedef struct _PNP_REPLACE_MEMORY_LIST { + ULONG AllocatedCount; + ULONG Count; + ULONGLONG TotalLength; + struct { + PHYSICAL_ADDRESS Address; + ULONGLONG Length; + } Ranges[ANYSIZE_ARRAY]; +} PNP_REPLACE_MEMORY_LIST, *PPNP_REPLACE_MEMORY_LIST; + +typedef struct _PNP_REPLACE_PROCESSOR_LIST { + PKAFFINITY Affinity; + ULONG GroupCount; + ULONG AllocatedCount; + ULONG Count; + ULONG ApicIds[ANYSIZE_ARRAY]; +} PNP_REPLACE_PROCESSOR_LIST, *PPNP_REPLACE_PROCESSOR_LIST; + +typedef struct _PNP_REPLACE_PROCESSOR_LIST_V1 { + KAFFINITY AffinityMask; + ULONG AllocatedCount; + ULONG Count; + ULONG ApicIds[ANYSIZE_ARRAY]; +} PNP_REPLACE_PROCESSOR_LIST_V1, *PPNP_REPLACE_PROCESSOR_LIST_V1; + +#define PNP_REPLACE_PARAMETERS_VERSION 2 + +typedef struct _PNP_REPLACE_PARAMETERS { + ULONG Size; + ULONG Version; + ULONG64 Target; + ULONG64 Spare; + PPNP_REPLACE_PROCESSOR_LIST TargetProcessors; + PPNP_REPLACE_PROCESSOR_LIST SpareProcessors; + PPNP_REPLACE_MEMORY_LIST TargetMemory; + PPNP_REPLACE_MEMORY_LIST SpareMemory; + PREPLACE_MAP_MEMORY MapMemory; +} PNP_REPLACE_PARAMETERS, *PPNP_REPLACE_PARAMETERS; + +typedef VOID +(NTAPI *PREPLACE_UNLOAD)( + VOID); + +typedef NTSTATUS +(NTAPI *PREPLACE_BEGIN)( + IN PPNP_REPLACE_PARAMETERS Parameters, + OUT PVOID *Context); + +typedef NTSTATUS +(NTAPI *PREPLACE_END)( + IN PVOID Context); + +typedef NTSTATUS +(NTAPI *PREPLACE_MIRROR_PHYSICAL_MEMORY)( + IN PVOID Context, + IN PHYSICAL_ADDRESS PhysicalAddress, + IN LARGE_INTEGER ByteCount); + +typedef NTSTATUS +(NTAPI *PREPLACE_SET_PROCESSOR_ID)( + IN PVOID Context, + IN ULONG ApicId, + IN BOOLEAN Target); + +typedef NTSTATUS +(NTAPI *PREPLACE_SWAP)( + IN PVOID Context); + +typedef NTSTATUS +(NTAPI *PREPLACE_INITIATE_HARDWARE_MIRROR)( + IN PVOID Context); + +typedef NTSTATUS +(NTAPI *PREPLACE_MIRROR_PLATFORM_MEMORY)( + IN PVOID Context); + +typedef NTSTATUS +(NTAPI *PREPLACE_GET_MEMORY_DESTINATION)( + IN PVOID Context, + IN PHYSICAL_ADDRESS SourceAddress, + OUT PPHYSICAL_ADDRESS DestinationAddress); + +typedef NTSTATUS +(NTAPI *PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE)( + IN PVOID Context, + IN BOOLEAN Enable); + +#define PNP_REPLACE_DRIVER_INTERFACE_VERSION 1 +#define PNP_REPLACE_DRIVER_INTERFACE_MINIMUM_SIZE \ + FIELD_OFFSET(PNP_REPLACE_DRIVER_INTERFACE, InitiateHardwareMirror) + +#define PNP_REPLACE_MEMORY_SUPPORTED 0x0001 +#define PNP_REPLACE_PROCESSOR_SUPPORTED 0x0002 +#define PNP_REPLACE_HARDWARE_MEMORY_MIRRORING 0x0004 +#define PNP_REPLACE_HARDWARE_PAGE_COPY 0x0008 +#define PNP_REPLACE_HARDWARE_QUIESCE 0x0010 + +typedef struct _PNP_REPLACE_DRIVER_INTERFACE { + ULONG Size; + ULONG Version; + ULONG Flags; + PREPLACE_UNLOAD Unload; + PREPLACE_BEGIN BeginReplace; + PREPLACE_END EndReplace; + PREPLACE_MIRROR_PHYSICAL_MEMORY MirrorPhysicalMemory; + PREPLACE_SET_PROCESSOR_ID SetProcessorId; + PREPLACE_SWAP Swap; + PREPLACE_INITIATE_HARDWARE_MIRROR InitiateHardwareMirror; + PREPLACE_MIRROR_PLATFORM_MEMORY MirrorPlatformMemory; + PREPLACE_GET_MEMORY_DESTINATION GetMemoryDestination; + PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE EnableDisableHardwareQuiesce; +} PNP_REPLACE_DRIVER_INTERFACE, *PPNP_REPLACE_DRIVER_INTERFACE; + +typedef NTSTATUS +(NTAPI *PREPLACE_DRIVER_INIT)( + IN OUT PPNP_REPLACE_DRIVER_INTERFACE Interface, + IN PVOID Unused); + typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE { DeviceUsageTypeUndefined, DeviceUsageTypePaging, @@ -3986,6 +4899,15 @@ typedef enum _IO_NOTIFICATION_EVENT_CATEGORY { EventCategoryTargetDeviceChange } IO_NOTIFICATION_EVENT_CATEGORY; +typedef enum _IO_PRIORITY_HINT { + IoPriorityVeryLow = 0, + IoPriorityLow, + IoPriorityNormal, + IoPriorityHigh, + IoPriorityCritical, + MaxIoPriorityTypes +} IO_PRIORITY_HINT; + #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001 typedef NTSTATUS @@ -4062,7 +4984,6 @@ typedef struct _FILE_POSITION_INFORMATION { LARGE_INTEGER CurrentByteOffset; } FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION; -#include typedef struct _FILE_BASIC_INFORMATION { LARGE_INTEGER CreationTime; LARGE_INTEGER LastAccessTime; @@ -4070,7 +4991,32 @@ typedef struct _FILE_BASIC_INFORMATION { LARGE_INTEGER ChangeTime; ULONG FileAttributes; } FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION; -#include + +typedef struct _FILE_IO_PRIORITY_HINT_INFORMATION { + IO_PRIORITY_HINT PriorityHint; +} FILE_IO_PRIORITY_HINT_INFORMATION, *PFILE_IO_PRIORITY_HINT_INFORMATION; + +typedef struct _FILE_IO_COMPLETION_NOTIFICATION_INFORMATION { + ULONG Flags; +} FILE_IO_COMPLETION_NOTIFICATION_INFORMATION, *PFILE_IO_COMPLETION_NOTIFICATION_INFORMATION; + +typedef struct _FILE_IOSTATUSBLOCK_RANGE_INFORMATION { + PUCHAR IoStatusBlockRange; + ULONG Length; +} FILE_IOSTATUSBLOCK_RANGE_INFORMATION, *PFILE_IOSTATUSBLOCK_RANGE_INFORMATION; + +typedef struct _FILE_IS_REMOTE_DEVICE_INFORMATION { + BOOLEAN IsRemote; +} FILE_IS_REMOTE_DEVICE_INFORMATION, *PFILE_IS_REMOTE_DEVICE_INFORMATION; + +typedef struct _FILE_NUMA_NODE_INFORMATION { + USHORT NodeNumber; +} FILE_NUMA_NODE_INFORMATION, *PFILE_NUMA_NODE_INFORMATION; + +typedef struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION { + ULONG NumberOfProcessIdsInList; + ULONG_PTR ProcessIdList[1]; +} FILE_PROCESS_IDS_USING_FILE_INFORMATION, *PFILE_PROCESS_IDS_USING_FILE_INFORMATION; typedef struct _FILE_STANDARD_INFORMATION { LARGE_INTEGER AllocationSize; @@ -4117,49 +5063,30 @@ typedef struct _FILE_FULL_EA_INFORMATION { CHAR EaName[1]; } FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION; +typedef struct _FILE_SFIO_RESERVE_INFORMATION { + ULONG RequestsPerPeriod; + ULONG Period; + BOOLEAN RetryFailures; + BOOLEAN Discardable; + ULONG RequestSize; + ULONG NumOutstandingRequests; +} FILE_SFIO_RESERVE_INFORMATION, *PFILE_SFIO_RESERVE_INFORMATION; + +typedef struct _FILE_SFIO_VOLUME_INFORMATION { + ULONG MaximumRequestsPerPeriod; + ULONG MinimumPeriod; + ULONG MinimumTransferSize; +} FILE_SFIO_VOLUME_INFORMATION, *PFILE_SFIO_VOLUME_INFORMATION; + +#define FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 0x1 +#define FILE_SKIP_SET_EVENT_ON_HANDLE 0x2 +#define FILE_SKIP_SET_USER_EVENT_ON_FAST_IO 0x4 + #define FM_LOCK_BIT (0x1) #define FM_LOCK_BIT_V (0x0) #define FM_LOCK_WAITER_WOKEN (0x2) #define FM_LOCK_WAITER_INC (0x4) -typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD; - -typedef struct _OWNER_ENTRY { - ERESOURCE_THREAD OwnerThread; - _ANONYMOUS_UNION union { - LONG OwnerCount; - ULONG TableSize; - } DUMMYUNIONNAME; -} OWNER_ENTRY, *POWNER_ENTRY; - -typedef struct _ERESOURCE -{ - LIST_ENTRY SystemResourcesList; - POWNER_ENTRY OwnerTable; - SHORT ActiveCount; - USHORT Flag; - volatile PKSEMAPHORE SharedWaiters; - volatile PKEVENT ExclusiveWaiters; - OWNER_ENTRY OwnerEntry; - ULONG ActiveEntries; - ULONG ContentionCount; - ULONG NumberOfSharedWaiters; - ULONG NumberOfExclusiveWaiters; - __GNU_EXTENSION union - { - PVOID Address; - ULONG_PTR CreatorBackTraceIndex; - }; - KSPIN_LOCK SpinLock; -} ERESOURCE, *PERESOURCE; - -/* ERESOURCE.Flag */ -#define ResourceNeverExclusive 0x0010 -#define ResourceReleaseByOtherThread 0x0020 -#define ResourceOwnedExclusive 0x0080 - -#define RESOURCE_HASH_TABLE_SIZE 64 - typedef BOOLEAN (NTAPI FAST_IO_CHECK_IF_POSSIBLE)( IN struct _FILE_OBJECT *FileObject, @@ -4703,6 +5630,12 @@ typedef struct _IO_ERROR_LOG_MESSAGE { #define ERROR_LOG_MAXIMUM_SIZE (IO_ERROR_LOG_MESSAGE_LENGTH - \ IO_ERROR_LOG_MESSAGE_HEADER_LENGTH) +#ifdef _WIN64 +#define PORT_MAXIMUM_MESSAGE_LENGTH 512 +#else +#define PORT_MAXIMUM_MESSAGE_LENGTH 256 +#endif + typedef enum _DMA_WIDTH { Width8Bits, Width16Bits, @@ -5159,12 +6092,6 @@ typedef NTSTATUS (NTAPI *PMM_DLL_UNLOAD)( VOID); -typedef BOOLEAN -(NTAPI KSERVICE_ROUTINE)( - IN struct _KINTERRUPT *Interrupt, - IN PVOID ServiceContext); -typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE; - typedef VOID (NTAPI IO_TIMER_ROUTINE)( IN struct _DEVICE_OBJECT *DeviceObject, @@ -5248,12 +6175,135 @@ typedef enum _DEVICE_TEXT_TYPE { DeviceTextLocationInformation } DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE; -typedef enum _WORK_QUEUE_TYPE { - CriticalWorkQueue, - DelayedWorkQueue, - HyperCriticalWorkQueue, - MaximumWorkQueue -} WORK_QUEUE_TYPE; +typedef BOOLEAN +(NTAPI *PGPE_SERVICE_ROUTINE)( + PVOID, + PVOID); + +typedef NTSTATUS +(NTAPI *PGPE_CONNECT_VECTOR)( + PDEVICE_OBJECT, + ULONG, + KINTERRUPT_MODE, + BOOLEAN, + PGPE_SERVICE_ROUTINE, + PVOID, + PVOID); + +typedef NTSTATUS +(NTAPI *PGPE_DISCONNECT_VECTOR)( + PVOID); + +typedef NTSTATUS +(NTAPI *PGPE_ENABLE_EVENT)( + PDEVICE_OBJECT, + PVOID); + +typedef NTSTATUS +(NTAPI *PGPE_DISABLE_EVENT)( + PDEVICE_OBJECT, + PVOID); + +typedef NTSTATUS +(NTAPI *PGPE_CLEAR_STATUS)( + PDEVICE_OBJECT, + PVOID); + +typedef VOID +(NTAPI *PDEVICE_NOTIFY_CALLBACK)( + PVOID, + ULONG); + +typedef NTSTATUS +(NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS)( + PDEVICE_OBJECT, + PDEVICE_NOTIFY_CALLBACK, + PVOID); + +typedef VOID +(NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)( + PDEVICE_OBJECT, + PDEVICE_NOTIFY_CALLBACK); + +typedef struct _ACPI_INTERFACE_STANDARD { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PGPE_CONNECT_VECTOR GpeConnectVector; + PGPE_DISCONNECT_VECTOR GpeDisconnectVector; + PGPE_ENABLE_EVENT GpeEnableEvent; + PGPE_DISABLE_EVENT GpeDisableEvent; + PGPE_CLEAR_STATUS GpeClearStatus; + PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications; + PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications; +} ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD; + +typedef BOOLEAN +(NTAPI *PGPE_SERVICE_ROUTINE2)( + PVOID ObjectContext, + PVOID ServiceContext); + +typedef NTSTATUS +(NTAPI *PGPE_CONNECT_VECTOR2)( + PVOID Context, + ULONG GpeNumber, + KINTERRUPT_MODE Mode, + BOOLEAN Shareable, + PGPE_SERVICE_ROUTINE ServiceRoutine, + PVOID ServiceContext, + PVOID *ObjectContext); + +typedef NTSTATUS +(NTAPI *PGPE_DISCONNECT_VECTOR2)( + PVOID Context, + PVOID ObjectContext); + +typedef NTSTATUS +(NTAPI *PGPE_ENABLE_EVENT2)( + PVOID Context, + PVOID ObjectContext); + +typedef NTSTATUS +(NTAPI *PGPE_DISABLE_EVENT2)( + PVOID Context, + PVOID ObjectContext); + +typedef NTSTATUS +(NTAPI *PGPE_CLEAR_STATUS2)( + PVOID Context, + PVOID ObjectContext); + +typedef VOID +(NTAPI *PDEVICE_NOTIFY_CALLBACK2)( + PVOID NotificationContext, + ULONG NotifyCode); + +typedef NTSTATUS +(NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS2)( + PVOID Context, + PDEVICE_NOTIFY_CALLBACK2 NotificationHandler, + PVOID NotificationContext); + +typedef VOID +(NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)( + PVOID Context); + +typedef struct _ACPI_INTERFACE_STANDARD2 { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PGPE_CONNECT_VECTOR2 GpeConnectVector; + PGPE_DISCONNECT_VECTOR2 GpeDisconnectVector; + PGPE_ENABLE_EVENT2 GpeEnableEvent; + PGPE_DISABLE_EVENT2 GpeDisableEvent; + PGPE_CLEAR_STATUS2 GpeClearStatus; + PREGISTER_FOR_DEVICE_NOTIFICATIONS2 RegisterForDeviceNotifications; + PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2 UnregisterForDeviceNotifications; +} ACPI_INTERFACE_STANDARD2, *PACPI_INTERFACE_STANDARD2; #if !defined(_AMD64_) && !defined(_IA64_) #include @@ -5453,11 +6503,6 @@ typedef struct _IO_STACK_LOCATION { #define SL_INVOKE_ON_SUCCESS 0x40 #define SL_INVOKE_ON_ERROR 0x80 -/* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */ - -#define PCI_WHICHSPACE_CONFIG 0x0 -#define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */ - #define METHOD_BUFFERED 0 #define METHOD_IN_DIRECT 1 #define METHOD_OUT_DIRECT 2 @@ -5587,10 +6632,920 @@ typedef struct _IO_STACK_LOCATION { /* end winnt.h */ +#define WMIREG_ACTION_REGISTER 1 +#define WMIREG_ACTION_DEREGISTER 2 +#define WMIREG_ACTION_REREGISTER 3 +#define WMIREG_ACTION_UPDATE_GUIDS 4 +#define WMIREG_ACTION_BLOCK_IRPS 5 + +#define WMIREGISTER 0 +#define WMIUPDATE 1 + +typedef VOID +(NTAPI FWMI_NOTIFICATION_CALLBACK)( + PVOID Wnode, + PVOID Context); +typedef FWMI_NOTIFICATION_CALLBACK *WMI_NOTIFICATION_CALLBACK; + +#ifndef _PCI_X_ +#define _PCI_X_ + +typedef struct _PCI_SLOT_NUMBER { + union { + struct { + ULONG DeviceNumber:5; + ULONG FunctionNumber:3; + ULONG Reserved:24; + } bits; + ULONG AsULONG; + } u; +} PCI_SLOT_NUMBER, *PPCI_SLOT_NUMBER; + +#define PCI_TYPE0_ADDRESSES 6 +#define PCI_TYPE1_ADDRESSES 2 +#define PCI_TYPE2_ADDRESSES 5 + +typedef struct _PCI_COMMON_HEADER { + PCI_COMMON_HEADER_LAYOUT +} PCI_COMMON_HEADER, *PPCI_COMMON_HEADER; + +#ifdef __cplusplus +typedef struct _PCI_COMMON_CONFIG { + PCI_COMMON_HEADER_LAYOUT + UCHAR DeviceSpecific[192]; +} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; +#else +typedef struct _PCI_COMMON_CONFIG { + PCI_COMMON_HEADER DUMMYSTRUCTNAME; + UCHAR DeviceSpecific[192]; +} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG; +#endif + +#define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET(PCI_COMMON_CONFIG, DeviceSpecific)) + +#define PCI_EXTENDED_CONFIG_LENGTH 0x1000 + +#define PCI_MAX_DEVICES 32 +#define PCI_MAX_FUNCTION 8 +#define PCI_MAX_BRIDGE_NUMBER 0xFF +#define PCI_INVALID_VENDORID 0xFFFF + +/* PCI_COMMON_CONFIG.HeaderType */ +#define PCI_MULTIFUNCTION 0x80 +#define PCI_DEVICE_TYPE 0x00 +#define PCI_BRIDGE_TYPE 0x01 +#define PCI_CARDBUS_BRIDGE_TYPE 0x02 + +#define PCI_CONFIGURATION_TYPE(PciData) \ + (((PPCI_COMMON_CONFIG) (PciData))->HeaderType & ~PCI_MULTIFUNCTION) + +#define PCI_MULTIFUNCTION_DEVICE(PciData) \ + ((((PPCI_COMMON_CONFIG) (PciData))->HeaderType & PCI_MULTIFUNCTION) != 0) + +/* PCI_COMMON_CONFIG.Command */ +#define PCI_ENABLE_IO_SPACE 0x0001 +#define PCI_ENABLE_MEMORY_SPACE 0x0002 +#define PCI_ENABLE_BUS_MASTER 0x0004 +#define PCI_ENABLE_SPECIAL_CYCLES 0x0008 +#define PCI_ENABLE_WRITE_AND_INVALIDATE 0x0010 +#define PCI_ENABLE_VGA_COMPATIBLE_PALETTE 0x0020 +#define PCI_ENABLE_PARITY 0x0040 +#define PCI_ENABLE_WAIT_CYCLE 0x0080 +#define PCI_ENABLE_SERR 0x0100 +#define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200 +#define PCI_DISABLE_LEVEL_INTERRUPT 0x0400 + +/* PCI_COMMON_CONFIG.Status */ +#define PCI_STATUS_INTERRUPT_PENDING 0x0008 +#define PCI_STATUS_CAPABILITIES_LIST 0x0010 +#define PCI_STATUS_66MHZ_CAPABLE 0x0020 +#define PCI_STATUS_UDF_SUPPORTED 0x0040 +#define PCI_STATUS_FAST_BACK_TO_BACK 0x0080 +#define PCI_STATUS_DATA_PARITY_DETECTED 0x0100 +#define PCI_STATUS_DEVSEL 0x0600 +#define PCI_STATUS_SIGNALED_TARGET_ABORT 0x0800 +#define PCI_STATUS_RECEIVED_TARGET_ABORT 0x1000 +#define PCI_STATUS_RECEIVED_MASTER_ABORT 0x2000 +#define PCI_STATUS_SIGNALED_SYSTEM_ERROR 0x4000 +#define PCI_STATUS_DETECTED_PARITY_ERROR 0x8000 + +/* IO_STACK_LOCATION.Parameters.ReadWriteControl.WhichSpace */ + +#define PCI_WHICHSPACE_CONFIG 0x0 +#define PCI_WHICHSPACE_ROM 0x52696350 /* 'PciR' */ + +#define PCI_CAPABILITY_ID_POWER_MANAGEMENT 0x01 +#define PCI_CAPABILITY_ID_AGP 0x02 +#define PCI_CAPABILITY_ID_VPD 0x03 +#define PCI_CAPABILITY_ID_SLOT_ID 0x04 +#define PCI_CAPABILITY_ID_MSI 0x05 +#define PCI_CAPABILITY_ID_CPCI_HOTSWAP 0x06 +#define PCI_CAPABILITY_ID_PCIX 0x07 +#define PCI_CAPABILITY_ID_HYPERTRANSPORT 0x08 +#define PCI_CAPABILITY_ID_VENDOR_SPECIFIC 0x09 +#define PCI_CAPABILITY_ID_DEBUG_PORT 0x0A +#define PCI_CAPABILITY_ID_CPCI_RES_CTRL 0x0B +#define PCI_CAPABILITY_ID_SHPC 0x0C +#define PCI_CAPABILITY_ID_P2P_SSID 0x0D +#define PCI_CAPABILITY_ID_AGP_TARGET 0x0E +#define PCI_CAPABILITY_ID_SECURE 0x0F +#define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10 +#define PCI_CAPABILITY_ID_MSIX 0x11 + +typedef struct _PCI_CAPABILITIES_HEADER { + UCHAR CapabilityID; + UCHAR Next; +} PCI_CAPABILITIES_HEADER, *PPCI_CAPABILITIES_HEADER; + +typedef struct _PCI_PMC { + UCHAR Version:3; + UCHAR PMEClock:1; + UCHAR Rsvd1:1; + UCHAR DeviceSpecificInitialization:1; + UCHAR Rsvd2:2; + struct _PM_SUPPORT { + UCHAR Rsvd2:1; + UCHAR D1:1; + UCHAR D2:1; + UCHAR PMED0:1; + UCHAR PMED1:1; + UCHAR PMED2:1; + UCHAR PMED3Hot:1; + UCHAR PMED3Cold:1; + } Support; +} PCI_PMC, *PPCI_PMC; + +typedef struct _PCI_PMCSR { + USHORT PowerState:2; + USHORT Rsvd1:6; + USHORT PMEEnable:1; + USHORT DataSelect:4; + USHORT DataScale:2; + USHORT PMEStatus:1; +} PCI_PMCSR, *PPCI_PMCSR; + +typedef struct _PCI_PMCSR_BSE { + UCHAR Rsvd1:6; + UCHAR D3HotSupportsStopClock:1; + UCHAR BusPowerClockControlEnabled:1; +} PCI_PMCSR_BSE, *PPCI_PMCSR_BSE; + +typedef struct _PCI_PM_CAPABILITY { + PCI_CAPABILITIES_HEADER Header; + union { + PCI_PMC Capabilities; + USHORT AsUSHORT; + } PMC; + union { + PCI_PMCSR ControlStatus; + USHORT AsUSHORT; + } PMCSR; + union { + PCI_PMCSR_BSE BridgeSupport; + UCHAR AsUCHAR; + } PMCSR_BSE; + UCHAR Data; +} PCI_PM_CAPABILITY, *PPCI_PM_CAPABILITY; + +typedef struct { + PCI_CAPABILITIES_HEADER Header; + union { + struct { + USHORT DataParityErrorRecoveryEnable:1; + USHORT EnableRelaxedOrdering:1; + USHORT MaxMemoryReadByteCount:2; + USHORT MaxOutstandingSplitTransactions:3; + USHORT Reserved:9; + } bits; + USHORT AsUSHORT; + } Command; + union { + struct { + ULONG FunctionNumber:3; + ULONG DeviceNumber:5; + ULONG BusNumber:8; + ULONG Device64Bit:1; + ULONG Capable133MHz:1; + ULONG SplitCompletionDiscarded:1; + ULONG UnexpectedSplitCompletion:1; + ULONG DeviceComplexity:1; + ULONG DesignedMaxMemoryReadByteCount:2; + ULONG DesignedMaxOutstandingSplitTransactions:3; + ULONG DesignedMaxCumulativeReadSize:3; + ULONG ReceivedSplitCompletionErrorMessage:1; + ULONG CapablePCIX266:1; + ULONG CapablePCIX533:1; + } bits; + ULONG AsULONG; + } Status; +} PCI_X_CAPABILITY, *PPCI_X_CAPABILITY; + +#define PCI_EXPRESS_ADVANCED_ERROR_REPORTING_CAP_ID 0x0001 +#define PCI_EXPRESS_VIRTUAL_CHANNEL_CAP_ID 0x0002 +#define PCI_EXPRESS_DEVICE_SERIAL_NUMBER_CAP_ID 0x0003 +#define PCI_EXPRESS_POWER_BUDGETING_CAP_ID 0x0004 +#define PCI_EXPRESS_RC_LINK_DECLARATION_CAP_ID 0x0005 +#define PCI_EXPRESS_RC_INTERNAL_LINK_CONTROL_CAP_ID 0x0006 +#define PCI_EXPRESS_RC_EVENT_COLLECTOR_ENDPOINT_ASSOCIATION_CAP_ID 0x0007 +#define PCI_EXPRESS_MFVC_CAP_ID 0x0008 +#define PCI_EXPRESS_VC_AND_MFVC_CAP_ID 0x0009 +#define PCI_EXPRESS_RCRB_HEADER_CAP_ID 0x000A +#define PCI_EXPRESS_SINGLE_ROOT_IO_VIRTUALIZATION_CAP_ID 0x0010 + +typedef struct _PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER { + USHORT CapabilityID; + USHORT Version:4; + USHORT Next:12; +} PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER, *PPCI_EXPRESS_ENHANCED_CAPABILITY_HEADER; + +typedef struct _PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY { + PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; + ULONG LowSerialNumber; + ULONG HighSerialNumber; +} PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY, *PPCI_EXPRESS_SERIAL_NUMBER_CAPABILITY; + +typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS { + struct { + ULONG Undefined:1; + ULONG Reserved1:3; + ULONG DataLinkProtocolError:1; + ULONG SurpriseDownError:1; + ULONG Reserved2:6; + ULONG PoisonedTLP:1; + ULONG FlowControlProtocolError:1; + ULONG CompletionTimeout:1; + ULONG CompleterAbort:1; + ULONG UnexpectedCompletion:1; + ULONG ReceiverOverflow:1; + ULONG MalformedTLP:1; + ULONG ECRCError:1; + ULONG UnsupportedRequestError:1; + ULONG Reserved3:11; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS; + +typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK { + struct { + ULONG Undefined:1; + ULONG Reserved1:3; + ULONG DataLinkProtocolError:1; + ULONG SurpriseDownError:1; + ULONG Reserved2:6; + ULONG PoisonedTLP:1; + ULONG FlowControlProtocolError:1; + ULONG CompletionTimeout:1; + ULONG CompleterAbort:1; + ULONG UnexpectedCompletion:1; + ULONG ReceiverOverflow:1; + ULONG MalformedTLP:1; + ULONG ECRCError:1; + ULONG UnsupportedRequestError:1; + ULONG Reserved3:11; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_MASK; + +typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY { + struct { + ULONG Undefined:1; + ULONG Reserved1:3; + ULONG DataLinkProtocolError:1; + ULONG SurpriseDownError:1; + ULONG Reserved2:6; + ULONG PoisonedTLP:1; + ULONG FlowControlProtocolError:1; + ULONG CompletionTimeout:1; + ULONG CompleterAbort:1; + ULONG UnexpectedCompletion:1; + ULONG ReceiverOverflow:1; + ULONG MalformedTLP:1; + ULONG ECRCError:1; + ULONG UnsupportedRequestError:1; + ULONG Reserved3:11; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY; + +typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_STATUS { + struct { + ULONG ReceiverError:1; + ULONG Reserved1:5; + ULONG BadTLP:1; + ULONG BadDLLP:1; + ULONG ReplayNumRollover:1; + ULONG Reserved2:3; + ULONG ReplayTimerTimeout:1; + ULONG AdvisoryNonFatalError:1; + ULONG Reserved3:18; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_CORRECTABLE_ERROR_STATUS, *PPCI_CORRECTABLE_ERROR_STATUS; + +typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_MASK { + struct { + ULONG ReceiverError:1; + ULONG Reserved1:5; + ULONG BadTLP:1; + ULONG BadDLLP:1; + ULONG ReplayNumRollover:1; + ULONG Reserved2:3; + ULONG ReplayTimerTimeout:1; + ULONG AdvisoryNonFatalError:1; + ULONG Reserved3:18; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_CORRECTABLE_ERROR_MASK, *PPCI_CORRECTABLE_ERROR_MASK; + +typedef union _PCI_EXPRESS_AER_CAPABILITIES { + struct { + ULONG FirstErrorPointer:5; + ULONG ECRCGenerationCapable:1; + ULONG ECRCGenerationEnable:1; + ULONG ECRCCheckCapable:1; + ULONG ECRCCheckEnable:1; + ULONG Reserved:23; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_AER_CAPABILITIES, *PPCI_EXPRESS_AER_CAPABILITIES; + +typedef union _PCI_EXPRESS_ROOT_ERROR_COMMAND { + struct { + ULONG CorrectableErrorReportingEnable:1; + ULONG NonFatalErrorReportingEnable:1; + ULONG FatalErrorReportingEnable:1; + ULONG Reserved:29; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_ROOT_ERROR_COMMAND, *PPCI_EXPRESS_ROOT_ERROR_COMMAND; + +typedef union _PCI_EXPRESS_ROOT_ERROR_STATUS { + struct { + ULONG CorrectableErrorReceived:1; + ULONG MultipleCorrectableErrorsReceived:1; + ULONG UncorrectableErrorReceived:1; + ULONG MultipleUncorrectableErrorsReceived:1; + ULONG FirstUncorrectableFatal:1; + ULONG NonFatalErrorMessagesReceived:1; + ULONG FatalErrorMessagesReceived:1; + ULONG Reserved:20; + ULONG AdvancedErrorInterruptMessageNumber:5; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_ROOT_ERROR_STATUS, *PPCI_EXPRESS_ROOT_ERROR_STATUS; + +typedef union _PCI_EXPRESS_ERROR_SOURCE_ID { + struct { + USHORT CorrectableSourceIdFun:3; + USHORT CorrectableSourceIdDev:5; + USHORT CorrectableSourceIdBus:8; + USHORT UncorrectableSourceIdFun:3; + USHORT UncorrectableSourceIdDev:5; + USHORT UncorrectableSourceIdBus:8; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_ERROR_SOURCE_ID, *PPCI_EXPRESS_ERROR_SOURCE_ID; + +typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS { + struct { + ULONG TargetAbortOnSplitCompletion:1; + ULONG MasterAbortOnSplitCompletion:1; + ULONG ReceivedTargetAbort:1; + ULONG ReceivedMasterAbort:1; + ULONG RsvdZ:1; + ULONG UnexpectedSplitCompletionError:1; + ULONG UncorrectableSplitCompletion:1; + ULONG UncorrectableDataError:1; + ULONG UncorrectableAttributeError:1; + ULONG UncorrectableAddressError:1; + ULONG DelayedTransactionDiscardTimerExpired:1; + ULONG PERRAsserted:1; + ULONG SERRAsserted:1; + ULONG InternalBridgeError:1; + ULONG Reserved:18; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS; + +typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK { + struct { + ULONG TargetAbortOnSplitCompletion:1; + ULONG MasterAbortOnSplitCompletion:1; + ULONG ReceivedTargetAbort:1; + ULONG ReceivedMasterAbort:1; + ULONG RsvdZ:1; + ULONG UnexpectedSplitCompletionError:1; + ULONG UncorrectableSplitCompletion:1; + ULONG UncorrectableDataError:1; + ULONG UncorrectableAttributeError:1; + ULONG UncorrectableAddressError:1; + ULONG DelayedTransactionDiscardTimerExpired:1; + ULONG PERRAsserted:1; + ULONG SERRAsserted:1; + ULONG InternalBridgeError:1; + ULONG Reserved:18; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK; + +typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY { + struct { + ULONG TargetAbortOnSplitCompletion:1; + ULONG MasterAbortOnSplitCompletion:1; + ULONG ReceivedTargetAbort:1; + ULONG ReceivedMasterAbort:1; + ULONG RsvdZ:1; + ULONG UnexpectedSplitCompletionError:1; + ULONG UncorrectableSplitCompletion:1; + ULONG UncorrectableDataError:1; + ULONG UncorrectableAttributeError:1; + ULONG UncorrectableAddressError:1; + ULONG DelayedTransactionDiscardTimerExpired:1; + ULONG PERRAsserted:1; + ULONG SERRAsserted:1; + ULONG InternalBridgeError:1; + ULONG Reserved:18; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY; + +typedef union _PCI_EXPRESS_SEC_AER_CAPABILITIES { + struct { + ULONG SecondaryUncorrectableFirstErrorPtr:5; + ULONG Reserved:27; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_SEC_AER_CAPABILITIES, *PPCI_EXPRESS_SEC_AER_CAPABILITIES; + +#define ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING 0x00000001 +#define ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING 0x00000002 +#define ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING 0x00000004 + +#define ROOT_CMD_ERROR_REPORTING_ENABLE_MASK \ + (ROOT_CMD_ENABLE_FATAL_ERROR_REPORTING | \ + ROOT_CMD_ENABLE_NONFATAL_ERROR_REPORTING | \ + ROOT_CMD_ENABLE_CORRECTABLE_ERROR_REPORTING) + +typedef struct _PCI_EXPRESS_AER_CAPABILITY { + PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; + PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus; + PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask; + PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity; + PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus; + PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask; + PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl; + ULONG HeaderLog[4]; + PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus; + PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask; + PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity; + PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl; + ULONG SecHeaderLog[4]; +} PCI_EXPRESS_AER_CAPABILITY, *PPCI_EXPRESS_AER_CAPABILITY; + +typedef struct _PCI_EXPRESS_ROOTPORT_AER_CAPABILITY { + PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; + PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus; + PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask; + PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity; + PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus; + PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask; + PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl; + ULONG HeaderLog[4]; + PCI_EXPRESS_ROOT_ERROR_COMMAND RootErrorCommand; + PCI_EXPRESS_ROOT_ERROR_STATUS RootErrorStatus; + PCI_EXPRESS_ERROR_SOURCE_ID ErrorSourceId; +} PCI_EXPRESS_ROOTPORT_AER_CAPABILITY, *PPCI_EXPRESS_ROOTPORT_AER_CAPABILITY; + +typedef struct _PCI_EXPRESS_BRIDGE_AER_CAPABILITY { + PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; + PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS UncorrectableErrorStatus; + PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK UncorrectableErrorMask; + PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY UncorrectableErrorSeverity; + PCI_EXPRESS_CORRECTABLE_ERROR_STATUS CorrectableErrorStatus; + PCI_EXPRESS_CORRECTABLE_ERROR_MASK CorrectableErrorMask; + PCI_EXPRESS_AER_CAPABILITIES CapabilitiesAndControl; + ULONG HeaderLog[4]; + PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS SecUncorrectableErrorStatus; + PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK SecUncorrectableErrorMask; + PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY SecUncorrectableErrorSeverity; + PCI_EXPRESS_SEC_AER_CAPABILITIES SecCapabilitiesAndControl; + ULONG SecHeaderLog[4]; +} PCI_EXPRESS_BRIDGE_AER_CAPABILITY, *PPCI_EXPRESS_BRIDGE_AER_CAPABILITY; + +typedef union _PCI_EXPRESS_SRIOV_CAPS { + struct { + ULONG VFMigrationCapable:1; + ULONG Reserved1:20; + ULONG VFMigrationInterruptNumber:11; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_SRIOV_CAPS, *PPCI_EXPRESS_SRIOV_CAPS; + +typedef union _PCI_EXPRESS_SRIOV_CONTROL { + struct { + USHORT VFEnable:1; + USHORT VFMigrationEnable:1; + USHORT VFMigrationInterruptEnable:1; + USHORT VFMemorySpaceEnable:1; + USHORT ARICapableHierarchy:1; + USHORT Reserved1:11; + } DUMMYSTRUCTNAME; + USHORT AsUSHORT; +} PCI_EXPRESS_SRIOV_CONTROL, *PPCI_EXPRESS_SRIOV_CONTROL; + +typedef union _PCI_EXPRESS_SRIOV_STATUS { + struct { + USHORT VFMigrationStatus:1; + USHORT Reserved1:15; + } DUMMYSTRUCTNAME; + USHORT AsUSHORT; +} PCI_EXPRESS_SRIOV_STATUS, *PPCI_EXPRESS_SRIOV_STATUS; + +typedef union _PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY { + struct { + ULONG VFMigrationStateBIR:3; + ULONG VFMigrationStateOffset:29; + } DUMMYSTRUCTNAME; + ULONG AsULONG; +} PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY, *PPCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY; + +typedef struct _PCI_EXPRESS_SRIOV_CAPABILITY { + PCI_EXPRESS_ENHANCED_CAPABILITY_HEADER Header; + PCI_EXPRESS_SRIOV_CAPS SRIOVCapabilities; + PCI_EXPRESS_SRIOV_CONTROL SRIOVControl; + PCI_EXPRESS_SRIOV_STATUS SRIOVStatus; + USHORT InitialVFs; + USHORT TotalVFs; + USHORT NumVFs; + UCHAR FunctionDependencyLink; + UCHAR RsvdP1; + USHORT FirstVFOffset; + USHORT VFStride; + USHORT RsvdP2; + USHORT VFDeviceId; + ULONG SupportedPageSizes; + ULONG SystemPageSize; + ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; + PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY VFMigrationStateArrayOffset; +} PCI_EXPRESS_SRIOV_CAPABILITY, *PPCI_EXPRESS_SRIOV_CAPABILITY; + +/* PCI device classes */ +#define PCI_CLASS_PRE_20 0x00 +#define PCI_CLASS_MASS_STORAGE_CTLR 0x01 +#define PCI_CLASS_NETWORK_CTLR 0x02 +#define PCI_CLASS_DISPLAY_CTLR 0x03 +#define PCI_CLASS_MULTIMEDIA_DEV 0x04 +#define PCI_CLASS_MEMORY_CTLR 0x05 +#define PCI_CLASS_BRIDGE_DEV 0x06 +#define PCI_CLASS_SIMPLE_COMMS_CTLR 0x07 +#define PCI_CLASS_BASE_SYSTEM_DEV 0x08 +#define PCI_CLASS_INPUT_DEV 0x09 +#define PCI_CLASS_DOCKING_STATION 0x0a +#define PCI_CLASS_PROCESSOR 0x0b +#define PCI_CLASS_SERIAL_BUS_CTLR 0x0c +#define PCI_CLASS_WIRELESS_CTLR 0x0d +#define PCI_CLASS_INTELLIGENT_IO_CTLR 0x0e +#define PCI_CLASS_SATELLITE_COMMS_CTLR 0x0f +#define PCI_CLASS_ENCRYPTION_DECRYPTION 0x10 +#define PCI_CLASS_DATA_ACQ_SIGNAL_PROC 0x11 +#define PCI_CLASS_NOT_DEFINED 0xff + +/* PCI device subclasses for class 0 */ +#define PCI_SUBCLASS_PRE_20_NON_VGA 0x00 +#define PCI_SUBCLASS_PRE_20_VGA 0x01 + +/* PCI device subclasses for class 1 (mass storage controllers)*/ +#define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR 0x00 +#define PCI_SUBCLASS_MSC_IDE_CTLR 0x01 +#define PCI_SUBCLASS_MSC_FLOPPY_CTLR 0x02 +#define PCI_SUBCLASS_MSC_IPI_CTLR 0x03 +#define PCI_SUBCLASS_MSC_RAID_CTLR 0x04 +#define PCI_SUBCLASS_MSC_OTHER 0x80 + +/* PCI device subclasses for class 2 (network controllers)*/ +#define PCI_SUBCLASS_NET_ETHERNET_CTLR 0x00 +#define PCI_SUBCLASS_NET_TOKEN_RING_CTLR 0x01 +#define PCI_SUBCLASS_NET_FDDI_CTLR 0x02 +#define PCI_SUBCLASS_NET_ATM_CTLR 0x03 +#define PCI_SUBCLASS_NET_ISDN_CTLR 0x04 +#define PCI_SUBCLASS_NET_OTHER 0x80 + +/* PCI device subclasses for class 3 (display controllers)*/ +#define PCI_SUBCLASS_VID_VGA_CTLR 0x00 +#define PCI_SUBCLASS_VID_XGA_CTLR 0x01 +#define PCI_SUBCLASS_VID_3D_CTLR 0x02 +#define PCI_SUBCLASS_VID_OTHER 0x80 + +/* PCI device subclasses for class 4 (multimedia device)*/ +#define PCI_SUBCLASS_MM_VIDEO_DEV 0x00 +#define PCI_SUBCLASS_MM_AUDIO_DEV 0x01 +#define PCI_SUBCLASS_MM_TELEPHONY_DEV 0x02 +#define PCI_SUBCLASS_MM_OTHER 0x80 + +/* PCI device subclasses for class 5 (memory controller)*/ +#define PCI_SUBCLASS_MEM_RAM 0x00 +#define PCI_SUBCLASS_MEM_FLASH 0x01 +#define PCI_SUBCLASS_MEM_OTHER 0x80 + +/* PCI device subclasses for class 6 (bridge device)*/ +#define PCI_SUBCLASS_BR_HOST 0x00 +#define PCI_SUBCLASS_BR_ISA 0x01 +#define PCI_SUBCLASS_BR_EISA 0x02 +#define PCI_SUBCLASS_BR_MCA 0x03 +#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04 +#define PCI_SUBCLASS_BR_PCMCIA 0x05 +#define PCI_SUBCLASS_BR_NUBUS 0x06 +#define PCI_SUBCLASS_BR_CARDBUS 0x07 +#define PCI_SUBCLASS_BR_RACEWAY 0x08 +#define PCI_SUBCLASS_BR_OTHER 0x80 + +#define PCI_SUBCLASS_COM_SERIAL 0x00 +#define PCI_SUBCLASS_COM_PARALLEL 0x01 +#define PCI_SUBCLASS_COM_MULTIPORT 0x02 +#define PCI_SUBCLASS_COM_MODEM 0x03 +#define PCI_SUBCLASS_COM_OTHER 0x80 + +#define PCI_SUBCLASS_SYS_INTERRUPT_CTLR 0x00 +#define PCI_SUBCLASS_SYS_DMA_CTLR 0x01 +#define PCI_SUBCLASS_SYS_SYSTEM_TIMER 0x02 +#define PCI_SUBCLASS_SYS_REAL_TIME_CLOCK 0x03 +#define PCI_SUBCLASS_SYS_GEN_HOTPLUG_CTLR 0x04 +#define PCI_SUBCLASS_SYS_SDIO_CTRL 0x05 +#define PCI_SUBCLASS_SYS_OTHER 0x80 + +#define PCI_SUBCLASS_INP_KEYBOARD 0x00 +#define PCI_SUBCLASS_INP_DIGITIZER 0x01 +#define PCI_SUBCLASS_INP_MOUSE 0x02 +#define PCI_SUBCLASS_INP_SCANNER 0x03 +#define PCI_SUBCLASS_INP_GAMEPORT 0x04 +#define PCI_SUBCLASS_INP_OTHER 0x80 + +#define PCI_SUBCLASS_DOC_GENERIC 0x00 +#define PCI_SUBCLASS_DOC_OTHER 0x80 + +#define PCI_SUBCLASS_PROC_386 0x00 +#define PCI_SUBCLASS_PROC_486 0x01 +#define PCI_SUBCLASS_PROC_PENTIUM 0x02 +#define PCI_SUBCLASS_PROC_ALPHA 0x10 +#define PCI_SUBCLASS_PROC_POWERPC 0x20 +#define PCI_SUBCLASS_PROC_COPROCESSOR 0x40 + +/* PCI device subclasses for class C (serial bus controller)*/ +#define PCI_SUBCLASS_SB_IEEE1394 0x00 +#define PCI_SUBCLASS_SB_ACCESS 0x01 +#define PCI_SUBCLASS_SB_SSA 0x02 +#define PCI_SUBCLASS_SB_USB 0x03 +#define PCI_SUBCLASS_SB_FIBRE_CHANNEL 0x04 +#define PCI_SUBCLASS_SB_SMBUS 0x05 + +#define PCI_SUBCLASS_WIRELESS_IRDA 0x00 +#define PCI_SUBCLASS_WIRELESS_CON_IR 0x01 +#define PCI_SUBCLASS_WIRELESS_RF 0x10 +#define PCI_SUBCLASS_WIRELESS_OTHER 0x80 + +#define PCI_SUBCLASS_INTIO_I2O 0x00 + +#define PCI_SUBCLASS_SAT_TV 0x01 +#define PCI_SUBCLASS_SAT_AUDIO 0x02 +#define PCI_SUBCLASS_SAT_VOICE 0x03 +#define PCI_SUBCLASS_SAT_DATA 0x04 + +#define PCI_SUBCLASS_CRYPTO_NET_COMP 0x00 +#define PCI_SUBCLASS_CRYPTO_ENTERTAINMENT 0x10 +#define PCI_SUBCLASS_CRYPTO_OTHER 0x80 + +#define PCI_SUBCLASS_DASP_DPIO 0x00 +#define PCI_SUBCLASS_DASP_OTHER 0x80 + +#define PCI_ADDRESS_IO_SPACE 0x00000001 +#define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006 +#define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008 +#define PCI_ADDRESS_IO_ADDRESS_MASK 0xfffffffc +#define PCI_ADDRESS_MEMORY_ADDRESS_MASK 0xfffffff0 +#define PCI_ADDRESS_ROM_ADDRESS_MASK 0xfffff800 + +#define PCI_TYPE_32BIT 0 +#define PCI_TYPE_20BIT 2 +#define PCI_TYPE_64BIT 4 + +#define PCI_ROMADDRESS_ENABLED 0x00000001 + +#endif /* _PCI_X_ */ + +#define PCI_EXPRESS_LINK_QUIESCENT_INTERFACE_VERSION 1 + +typedef NTSTATUS +(NTAPI PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE)( + IN OUT PVOID Context); +typedef PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE *PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE; + +typedef NTSTATUS +(NTAPI PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE)( + IN OUT PVOID Context); +typedef PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE *PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE; + +typedef struct _PCI_EXPRESS_LINK_QUIESCENT_INTERFACE { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE PciExpressEnterLinkQuiescentMode; + PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE PciExpressExitLinkQuiescentMode; +} PCI_EXPRESS_LINK_QUIESCENT_INTERFACE, *PPCI_EXPRESS_LINK_QUIESCENT_INTERFACE; + +#define PCI_EXPRESS_ROOT_PORT_INTERFACE_VERSION 1 + +typedef ULONG +(NTAPI *PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE)( + IN PVOID Context, + OUT PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +typedef ULONG +(NTAPI *PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE)( + IN PVOID Context, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length); + +typedef struct _PCI_EXPRESS_ROOT_PORT_INTERFACE { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE ReadConfigSpace; + PPCI_EXPRESS_ROOT_PORT_WRITE_CONFIG_SPACE WriteConfigSpace; +} PCI_EXPRESS_ROOT_PORT_INTERFACE, *PPCI_EXPRESS_ROOT_PORT_INTERFACE; + +#define PCI_MSIX_TABLE_CONFIG_INTERFACE_VERSION 1 + +typedef NTSTATUS +(NTAPI PCI_MSIX_SET_ENTRY)( + IN PVOID Context, + IN ULONG TableEntry, + IN ULONG MessageNumber); +typedef PCI_MSIX_SET_ENTRY *PPCI_MSIX_SET_ENTRY; + +typedef NTSTATUS +(NTAPI PCI_MSIX_MASKUNMASK_ENTRY)( + IN PVOID Context, + IN ULONG TableEntry); +typedef PCI_MSIX_MASKUNMASK_ENTRY *PPCI_MSIX_MASKUNMASK_ENTRY; + +typedef NTSTATUS +(NTAPI PCI_MSIX_GET_ENTRY)( + IN PVOID Context, + IN ULONG TableEntry, + OUT PULONG MessageNumber, + OUT PBOOLEAN Masked); +typedef PCI_MSIX_GET_ENTRY *PPCI_MSIX_GET_ENTRY; + +typedef NTSTATUS +(NTAPI PCI_MSIX_GET_TABLE_SIZE)( + IN PVOID Context, + OUT PULONG TableSize); +typedef PCI_MSIX_GET_TABLE_SIZE *PPCI_MSIX_GET_TABLE_SIZE; + +typedef struct _PCI_MSIX_TABLE_CONFIG_INTERFACE { + USHORT Size; + USHORT Version; + PVOID Context; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + PPCI_MSIX_SET_ENTRY SetTableEntry; + PPCI_MSIX_MASKUNMASK_ENTRY MaskTableEntry; + PPCI_MSIX_MASKUNMASK_ENTRY UnmaskTableEntry; + PPCI_MSIX_GET_ENTRY GetTableEntry; + PPCI_MSIX_GET_TABLE_SIZE GetTableSize; +} PCI_MSIX_TABLE_CONFIG_INTERFACE, *PPCI_MSIX_TABLE_CONFIG_INTERFACE; + +#define PCI_MSIX_TABLE_CONFIG_MINIMUM_SIZE \ + RTL_SIZEOF_THROUGH_FIELD(PCI_MSIX_TABLE_CONFIG_INTERFACE, UnmaskTableEntry) + /****************************************************************************** * Object Manager Types * ******************************************************************************/ +#define MAXIMUM_FILENAME_LENGTH 256 +#define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\') + +#define OBJECT_TYPE_CREATE 0x0001 +#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) + +#define DIRECTORY_QUERY 0x0001 +#define DIRECTORY_TRAVERSE 0x0002 +#define DIRECTORY_CREATE_OBJECT 0x0004 +#define DIRECTORY_CREATE_SUBDIRECTORY 0x0008 +#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF) + +#define SYMBOLIC_LINK_QUERY 0x0001 +#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) + +#define DUPLICATE_CLOSE_SOURCE 0x00000001 +#define DUPLICATE_SAME_ACCESS 0x00000002 +#define DUPLICATE_SAME_ATTRIBUTES 0x00000004 + +#define OB_FLT_REGISTRATION_VERSION_0100 0x0100 +#define OB_FLT_REGISTRATION_VERSION OB_FLT_REGISTRATION_VERSION_0100 + +typedef ULONG OB_OPERATION; + +#define OB_OPERATION_HANDLE_CREATE 0x00000001 +#define OB_OPERATION_HANDLE_DUPLICATE 0x00000002 + +typedef struct _OB_PRE_CREATE_HANDLE_INFORMATION { + IN OUT ACCESS_MASK DesiredAccess; + IN ACCESS_MASK OriginalDesiredAccess; +} OB_PRE_CREATE_HANDLE_INFORMATION, *POB_PRE_CREATE_HANDLE_INFORMATION; + +typedef struct _OB_PRE_DUPLICATE_HANDLE_INFORMATION { + IN OUT ACCESS_MASK DesiredAccess; + IN ACCESS_MASK OriginalDesiredAccess; + IN PVOID SourceProcess; + IN PVOID TargetProcess; +} OB_PRE_DUPLICATE_HANDLE_INFORMATION, *POB_PRE_DUPLICATE_HANDLE_INFORMATION; + +typedef union _OB_PRE_OPERATION_PARAMETERS { + IN OUT OB_PRE_CREATE_HANDLE_INFORMATION CreateHandleInformation; + IN OUT OB_PRE_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation; +} OB_PRE_OPERATION_PARAMETERS, *POB_PRE_OPERATION_PARAMETERS; + +typedef struct _OB_PRE_OPERATION_INFORMATION { + IN OB_OPERATION Operation; + union { + IN ULONG Flags; + struct { + IN ULONG KernelHandle:1; + IN ULONG Reserved:31; + }; + }; + IN PVOID Object; + IN POBJECT_TYPE ObjectType; + OUT PVOID CallContext; + IN POB_PRE_OPERATION_PARAMETERS Parameters; +} OB_PRE_OPERATION_INFORMATION, *POB_PRE_OPERATION_INFORMATION; + +typedef struct _OB_POST_CREATE_HANDLE_INFORMATION { + IN ACCESS_MASK GrantedAccess; +} OB_POST_CREATE_HANDLE_INFORMATION, *POB_POST_CREATE_HANDLE_INFORMATION; + +typedef struct _OB_POST_DUPLICATE_HANDLE_INFORMATION { + IN ACCESS_MASK GrantedAccess; +} OB_POST_DUPLICATE_HANDLE_INFORMATION, *POB_POST_DUPLICATE_HANDLE_INFORMATION; + +typedef union _OB_POST_OPERATION_PARAMETERS { + IN OB_POST_CREATE_HANDLE_INFORMATION CreateHandleInformation; + IN OB_POST_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation; +} OB_POST_OPERATION_PARAMETERS, *POB_POST_OPERATION_PARAMETERS; + +typedef struct _OB_POST_OPERATION_INFORMATION { + IN OB_OPERATION Operation; + union { + IN ULONG Flags; + struct { + IN ULONG KernelHandle:1; + IN ULONG Reserved:31; + }; + }; + IN PVOID Object; + IN POBJECT_TYPE ObjectType; + IN PVOID CallContext; + IN NTSTATUS ReturnStatus; + IN POB_POST_OPERATION_PARAMETERS Parameters; +} OB_POST_OPERATION_INFORMATION,*POB_POST_OPERATION_INFORMATION; + +typedef enum _OB_PREOP_CALLBACK_STATUS { + OB_PREOP_SUCCESS +} OB_PREOP_CALLBACK_STATUS, *POB_PREOP_CALLBACK_STATUS; + +typedef OB_PREOP_CALLBACK_STATUS +(NTAPI *POB_PRE_OPERATION_CALLBACK)( + IN PVOID RegistrationContext, + IN OUT POB_PRE_OPERATION_INFORMATION OperationInformation); + +typedef VOID +(NTAPI *POB_POST_OPERATION_CALLBACK)( + IN PVOID RegistrationContext, + IN POB_POST_OPERATION_INFORMATION OperationInformation); + +typedef struct _OB_OPERATION_REGISTRATION { + IN POBJECT_TYPE *ObjectType; + IN OB_OPERATION Operations; + IN POB_PRE_OPERATION_CALLBACK PreOperation; + IN POB_POST_OPERATION_CALLBACK PostOperation; +} OB_OPERATION_REGISTRATION, *POB_OPERATION_REGISTRATION; + +typedef struct _OB_CALLBACK_REGISTRATION { + IN USHORT Version; + IN USHORT OperationRegistrationCount; + IN UNICODE_STRING Altitude; + IN PVOID RegistrationContext; + IN OB_OPERATION_REGISTRATION *OperationRegistration; +} OB_CALLBACK_REGISTRATION, *POB_CALLBACK_REGISTRATION; + typedef struct _OBJECT_NAME_INFORMATION { UNICODE_STRING Name; } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION; @@ -5615,16 +7570,6 @@ extern POBJECT_TYPE NTSYSAPI PsProcessType; #define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008 #define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010 -/* Process Qoutas */ -typedef struct _QUOTA_LIMITS { - SIZE_T PagedPoolLimit; - SIZE_T NonPagedPoolLimit; - SIZE_T MinimumWorkingSetSize; - SIZE_T MaximumWorkingSetSize; - SIZE_T PagefileLimit; - LARGE_INTEGER TimeLimit; -} QUOTA_LIMITS, *PQUOTA_LIMITS; - /* Thread Access Rights */ #define THREAD_TERMINATE 0x0001 #define THREAD_SUSPEND_RESUME 0x0002 @@ -5649,18 +7594,76 @@ typedef struct _QUOTA_LIMITS { #define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3FF) #endif -#define ES_SYSTEM_REQUIRED 0x00000001 -#define ES_DISPLAY_REQUIRED 0x00000002 -#define ES_USER_PRESENT 0x00000004 -#define ES_CONTINUOUS 0x80000000 - #define LOW_PRIORITY 0 #define LOW_REALTIME_PRIORITY 16 #define HIGH_PRIORITY 31 #define MAXIMUM_PRIORITY 32 -#ifdef _X86_ +/****************************************************************************** + * WMI Library Support Types * + ******************************************************************************/ + +#ifdef RUN_WPP +#include +#include +#endif + +#ifndef _TRACEHANDLE_DEFINED +#define _TRACEHANDLE_DEFINED +typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE; +#endif + +#ifndef TRACE_INFORMATION_CLASS_DEFINE + +typedef struct _ETW_TRACE_SESSION_SETTINGS { + ULONG Version; + ULONG BufferSize; + ULONG MinimumBuffers; + ULONG MaximumBuffers; + ULONG LoggerMode; + ULONG FlushTimer; + ULONG FlushThreshold; + ULONG ClockType; +} ETW_TRACE_SESSION_SETTINGS, *PETW_TRACE_SESSION_SETTINGS; + +typedef enum _TRACE_INFORMATION_CLASS { + TraceIdClass, + TraceHandleClass, + TraceEnableFlagsClass, + TraceEnableLevelClass, + GlobalLoggerHandleClass, + EventLoggerHandleClass, + AllLoggerHandlesClass, + TraceHandleByNameClass, + LoggerEventsLostClass, + TraceSessionSettingsClass, + LoggerEventsLoggedClass, + MaxTraceInformationClass +} TRACE_INFORMATION_CLASS; + +#endif /* TRACE_INFORMATION_CLASS_DEFINE */ + +#ifndef _ETW_KM_ +#define _ETW_KM_ +#endif + +#include + +typedef VOID +(NTAPI *PETWENABLECALLBACK)( + IN LPCGUID SourceId, + IN ULONG ControlCode, + IN UCHAR Level, + IN ULONGLONG MatchAnyKeyword, + IN ULONGLONG MatchAllKeyword, + IN PEVENT_FILTER_DESCRIPTOR FilterData OPTIONAL, + IN OUT PVOID CallbackContext OPTIONAL); + +#define EVENT_WRITE_FLAG_NO_FAULTING 0x00000001 + + +#if defined(_M_IX86) /** Kernel definitions for x86 **/ /* Interrupt request levels */ @@ -5821,11 +7824,346 @@ _KeQueryTickCount( } #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount) -#endif /* _X86_ */ +#elif defined(_M_AMD64) +/** Kernel definitions for AMD64 **/ + +/* Interrupt request levels */ +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define CMCI_LEVEL 5 +#define CLOCK_LEVEL 13 +#define IPI_LEVEL 14 +#define DRS_LEVEL 14 +#define POWER_LEVEL 14 +#define PROFILE_LEVEL 15 +#define HIGH_LEVEL 15 + +#define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL +#define SharedUserData ((PKUSER_SHARED_DATA const)KI_USER_SHARED_DATA) +#define SharedInterruptTime (KI_USER_SHARED_DATA + 0x8) +#define SharedSystemTime (KI_USER_SHARED_DATA + 0x14) +#define SharedTickCount (KI_USER_SHARED_DATA + 0x320) + +#define PAGE_SIZE 0x1000 +#define PAGE_SHIFT 12L + +#define EFLAG_SIGN 0x8000 +#define EFLAG_ZERO 0x4000 +#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO) + +#define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) +#define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT) +#define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT) + + +typedef struct _KFLOATING_SAVE { + ULONG Dummy; +} KFLOATING_SAVE, *PKFLOATING_SAVE; + +typedef XSAVE_FORMAT XMM_SAVE_AREA32, *PXMM_SAVE_AREA32; + +#define KeQueryInterruptTime() \ + (*(volatile ULONG64*)SharedInterruptTime) + +#define KeQuerySystemTime(CurrentCount) \ + *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedSystemTime + +#define KeQueryTickCount(CurrentCount) \ + *(ULONG64*)(CurrentCount) = *(volatile ULONG64*)SharedTickCount + +#define KeGetDcacheFillSize() 1L + +#define YieldProcessor _mm_pause + +FORCEINLINE +KIRQL +KeGetCurrentIrql(VOID) +{ + return (KIRQL)__readcr8(); +} + +FORCEINLINE +VOID +KeLowerIrql(IN KIRQL NewIrql) +{ + //ASSERT(KeGetCurrentIrql() >= NewIrql); + __writecr8(NewIrql); +} + +FORCEINLINE +KIRQL +KfRaiseIrql(IN KIRQL NewIrql) +{ + KIRQL OldIrql; + + OldIrql = __readcr8(); + //ASSERT(OldIrql <= NewIrql); + __writecr8(NewIrql); + return OldIrql; +} +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) + +FORCEINLINE +KIRQL +KeRaiseIrqlToDpcLevel(VOID) +{ + return KfRaiseIrql(DISPATCH_LEVEL); +} + +FORCEINLINE +KIRQL +KeRaiseIrqlToSynchLevel(VOID) +{ + return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2 + } + +FORCEINLINE +PKTHREAD +KeGetCurrentThread(VOID) +{ + return (struct _KTHREAD *)__readgsqword(0x188); +} + +/* VOID + * KeFlushIoBuffers( + * IN PMDL Mdl, + * IN BOOLEAN ReadOperation, + * IN BOOLEAN DmaOperation) + */ +#define KeFlushIoBuffers(_Mdl, _ReadOperation, _DmaOperation) + +/* x86 and x64 performs a 0x2C interrupt */ +#define DbgRaiseAssertionFailure __int2c + +#elif defined(_M_IA64) +/** Kernel definitions for IA64 **/ + +/* Interrupt request levels */ +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define CMC_LEVEL 3 +#define DEVICE_LEVEL_BASE 4 +#define PC_LEVEL 12 +#define IPI_LEVEL 14 +#define DRS_LEVEL 14 +#define CLOCK_LEVEL 13 +#define POWER_LEVEL 15 +#define PROFILE_LEVEL 15 +#define HIGH_LEVEL 15 + +#define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000)) +extern volatile LARGE_INTEGER KeTickCount; + +#define PAUSE_PROCESSOR __yield(); + +FORCEINLINE +VOID +KeFlushWriteBuffer(VOID) +{ + __mf (); + return; +} + +NTSYSAPI +PKTHREAD +NTAPI +KeGetCurrentThread(VOID); + + +#elif defined(_M_PPC) + +/* Interrupt request levels */ +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define PROFILE_LEVEL 27 +#define CLOCK1_LEVEL 28 +#define CLOCK2_LEVEL 28 +#define IPI_LEVEL 29 +#define POWER_LEVEL 30 +#define HIGH_LEVEL 31 + +// +// Used to contain PFNs and PFN counts +// +typedef ULONG PFN_COUNT; +typedef ULONG PFN_NUMBER, *PPFN_NUMBER; +typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; + + +typedef struct _KFLOATING_SAVE { + ULONG Dummy; +} KFLOATING_SAVE, *PKFLOATING_SAVE; + +typedef struct _KPCR_TIB { + PVOID ExceptionList; /* 00 */ + PVOID StackBase; /* 04 */ + PVOID StackLimit; /* 08 */ + PVOID SubSystemTib; /* 0C */ + _ANONYMOUS_UNION union { + PVOID FiberData; /* 10 */ + ULONG Version; /* 10 */ + } DUMMYUNIONNAME; + PVOID ArbitraryUserPointer; /* 14 */ + struct _KPCR_TIB *Self; /* 18 */ +} KPCR_TIB, *PKPCR_TIB; /* 1C */ + +#define PCR_MINOR_VERSION 1 +#define PCR_MAJOR_VERSION 1 + +typedef struct _KPCR { + KPCR_TIB Tib; /* 00 */ + struct _KPCR *Self; /* 1C */ + struct _KPRCB *Prcb; /* 20 */ + KIRQL Irql; /* 24 */ + ULONG IRR; /* 28 */ + ULONG IrrActive; /* 2C */ + ULONG IDR; /* 30 */ + PVOID KdVersionBlock; /* 34 */ + PUSHORT IDT; /* 38 */ + PUSHORT GDT; /* 3C */ + struct _KTSS *TSS; /* 40 */ + USHORT MajorVersion; /* 44 */ + USHORT MinorVersion; /* 46 */ + KAFFINITY SetMember; /* 48 */ + ULONG StallScaleFactor; /* 4C */ + UCHAR SpareUnused; /* 50 */ + UCHAR Number; /* 51 */ +} KPCR, *PKPCR; /* 54 */ + +#define KeGetPcr() PCR + +#define YieldProcessor() __asm__ __volatile__("nop"); + +FORCEINLINE +ULONG +NTAPI +KeGetCurrentProcessorNumber(VOID) +{ + ULONG Number; + __asm__ __volatile__ ( + "lwz %0, %c1(12)\n" + : "=r" (Number) + : "i" (FIELD_OFFSET(KPCR, Number)) + ); + return Number; +} + +NTHALAPI +VOID +FASTCALL +KfLowerIrql( + IN KIRQL NewIrql); +#define KeLowerIrql(a) KfLowerIrql(a) + +NTHALAPI +KIRQL +FASTCALL +KfRaiseIrql( + IN KIRQL NewIrql); +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) + +NTHALAPI +KIRQL +NTAPI +KeRaiseIrqlToDpcLevel(VOID); + +NTHALAPI +KIRQL +NTAPI +KeRaiseIrqlToSynchLevel(VOID); + + + +#elif defined(_M_MIPS) +#error MIPS Headers are totally incorrect + +// +// Used to contain PFNs and PFN counts +// +typedef ULONG PFN_COUNT; +typedef ULONG PFN_NUMBER, *PPFN_NUMBER; +typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; + +#define PASSIVE_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define PROFILE_LEVEL 27 +#define IPI_LEVEL 29 +#define HIGH_LEVEL 31 + +typedef struct _KPCR { + struct _KPRCB *Prcb; /* 20 */ + KIRQL Irql; /* 24 */ + ULONG IRR; /* 28 */ + ULONG IDR; /* 30 */ +} KPCR, *PKPCR; + +#define KeGetPcr() PCR + +typedef struct _KFLOATING_SAVE { +} KFLOATING_SAVE, *PKFLOATING_SAVE; + +static __inline +ULONG +NTAPI +KeGetCurrentProcessorNumber(VOID) +{ + return 0; +} + +#define YieldProcessor() __asm__ __volatile__("nop"); + +#define KeLowerIrql(a) KfLowerIrql(a) +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) + +NTKERNELAPI +VOID +NTAPI +KfLowerIrql( + IN KIRQL NewIrql); + +NTKERNELAPI +KIRQL +NTAPI +KfRaiseIrql( + IN KIRQL NewIrql); + +NTKERNELAPI +KIRQL +NTAPI +KeRaiseIrqlToDpcLevel(VOID); + +NTKERNELAPI +KIRQL +NTAPI +KeRaiseIrqlToSynchLevel(VOID); + + +#elif defined(_M_ARM) +#include +#else +#error Unknown Architecture +#endif + +/****************************************************************************** + * Runtime Library Functions * + ******************************************************************************/ + + +#if !defined(MIDL_PASS) && !defined(SORTPP_PASS) + +#define RTL_STATIC_LIST_HEAD(x) LIST_ENTRY x = { &x, &x } + FORCEINLINE VOID InitializeListHead( @@ -5834,34 +8172,6 @@ InitializeListHead( ListHead->Flink = ListHead->Blink = ListHead; } -FORCEINLINE -VOID -InsertHeadList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY Entry) -{ - PLIST_ENTRY OldFlink; - OldFlink = ListHead->Flink; - Entry->Flink = OldFlink; - Entry->Blink = ListHead; - OldFlink->Blink = Entry; - ListHead->Flink = Entry; -} - -FORCEINLINE -VOID -InsertTailList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY Entry) -{ - PLIST_ENTRY OldBlink; - OldBlink = ListHead->Blink; - Entry->Flink = ListHead; - Entry->Blink = OldBlink; - OldBlink->Flink = Entry; - ListHead->Blink = Entry; -} - BOOLEAN FORCEINLINE IsListEmpty( @@ -5870,29 +8180,6 @@ IsListEmpty( return (BOOLEAN)(ListHead->Flink == ListHead); } -FORCEINLINE -PSINGLE_LIST_ENTRY -PopEntryList( - IN OUT PSINGLE_LIST_ENTRY ListHead) -{ - PSINGLE_LIST_ENTRY FirstEntry; - FirstEntry = ListHead->Next; - if (FirstEntry != NULL) { - ListHead->Next = FirstEntry->Next; - } - return FirstEntry; -} - -FORCEINLINE -VOID -PushEntryList( - IN OUT PSINGLE_LIST_ENTRY ListHead, - IN OUT PSINGLE_LIST_ENTRY Entry) -{ - Entry->Next = ListHead->Next; - ListHead->Next = Entry; -} - FORCEINLINE BOOLEAN RemoveEntryList( @@ -5938,6 +8225,73 @@ RemoveTailList( return Entry; } +FORCEINLINE +VOID +InsertTailList( + IN OUT PLIST_ENTRY ListHead, + IN OUT PLIST_ENTRY Entry) +{ + PLIST_ENTRY OldBlink; + OldBlink = ListHead->Blink; + Entry->Flink = ListHead; + Entry->Blink = OldBlink; + OldBlink->Flink = Entry; + ListHead->Blink = Entry; +} + +FORCEINLINE +VOID +InsertHeadList( + IN OUT PLIST_ENTRY ListHead, + IN OUT PLIST_ENTRY Entry) +{ + PLIST_ENTRY OldFlink; + OldFlink = ListHead->Flink; + Entry->Flink = OldFlink; + Entry->Blink = ListHead; + OldFlink->Blink = Entry; + ListHead->Flink = Entry; +} + +FORCEINLINE +VOID +AppendTailList( + IN OUT PLIST_ENTRY ListHead, + IN OUT PLIST_ENTRY ListToAppend) +{ + PLIST_ENTRY ListEnd = ListHead->Blink; + + ListHead->Blink->Flink = ListToAppend; + ListHead->Blink = ListToAppend->Blink; + ListToAppend->Blink->Flink = ListHead; + ListToAppend->Blink = ListEnd; +} + +FORCEINLINE +PSINGLE_LIST_ENTRY +PopEntryList( + IN OUT PSINGLE_LIST_ENTRY ListHead) +{ + PSINGLE_LIST_ENTRY FirstEntry; + FirstEntry = ListHead->Next; + if (FirstEntry != NULL) { + ListHead->Next = FirstEntry->Next; + } + return FirstEntry; +} + +FORCEINLINE +VOID +PushEntryList( + IN OUT PSINGLE_LIST_ENTRY ListHead, + IN OUT PSINGLE_LIST_ENTRY Entry) +{ + Entry->Next = ListHead->Next; + ListHead->Next = Entry; +} + +#endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */ + NTSYSAPI VOID NTAPI @@ -6298,15 +8652,6 @@ RtlFindSetBitsAndClear( IN ULONG NumberToFind, IN ULONG HintIndex); -NTSYSAPI -NTSTATUS -NTAPI -RtlHashUnicodeString( - IN CONST UNICODE_STRING *String, - IN BOOLEAN CaseInSensitive, - IN ULONG HashAlgorithm, - OUT PULONG HashValue); - NTSYSAPI VOID NTAPI @@ -6396,49 +8741,10 @@ RtlQueryRegistryValues( #define LONGLONG_MASK (LONGLONG_SIZE - 1) #define LOWBYTE_MASK 0x00FF -/* VOID - * RtlRetrieveUlong( - * PULONG DestinationAddress, - * PULONG SourceAddress); - */ -#if defined(_AMD64_) -#define RtlRetrieveUlong(DestAddress,SrcAddress) \ - *(ULONG UNALIGNED *)(DestAddress) = *(PULONG)(SrcAddress) -#else -#define RtlRetrieveUlong(DestAddress,SrcAddress) \ - if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ - { \ - ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ - ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ - ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \ - ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \ - } \ - else \ - { \ - *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \ - } -#endif - -/* VOID - * RtlRetrieveUshort( - * PUSHORT DestinationAddress, - * PUSHORT SourceAddress); - */ -#if defined(_AMD64_) -#define RtlRetrieveUshort(DestAddress,SrcAddress) \ - *(USHORT UNALIGNED *)(DestAddress) = *(USHORT)(SrcAddress) -#else -#define RtlRetrieveUshort(DestAddress,SrcAddress) \ - if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ - { \ - ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ - ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ - } \ - else \ - { \ - *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \ - } -#endif +#define FIRSTBYTE(VALUE) ((VALUE) & LOWBYTE_MASK) +#define SECONDBYTE(VALUE) (((VALUE) >> 8) & LOWBYTE_MASK) +#define THIRDBYTE(VALUE) (((VALUE) >> 16) & LOWBYTE_MASK) +#define FOURTHBYTE(VALUE) (((VALUE) >> 24) & LOWBYTE_MASK) NTSYSAPI VOID @@ -6517,17 +8823,7 @@ RtlSetDaclSecurityDescriptor( else { \ *((PULONG)(Address)) = (ULONG) (Value); \ } -#endif -/* VOID - * RtlStoreUlonglong( - * IN OUT PULONGLONG Address, - * ULONGLONG Value); - */ -#if defined(_AMD64_) -#define RtlStoreUlonglong(Address,Value) \ - *(ULONGLONG UNALIGNED *)(Address) = (Value) -#else #define RtlStoreUlonglong(Address,Value) \ if ((ULONG_PTR)(Address) & LONGLONG_MASK) { \ RtlStoreUlong((ULONG_PTR)(Address), \ @@ -6537,30 +8833,7 @@ RtlSetDaclSecurityDescriptor( } else { \ *((PULONGLONG)(Address)) = (ULONGLONG)(Value); \ } -#endif -/* VOID - * RtlStoreUlongPtr( - * IN OUT PULONG_PTR Address, - * IN ULONG_PTR Value); - */ -#ifdef _WIN64 -#define RtlStoreUlongPtr(Address,Value) \ - RtlStoreUlonglong(Address,Value) -#else -#define RtlStoreUlongPtr(Address,Value) \ - RtlStoreUlong(Address,Value) -#endif - -/* VOID - * RtlStoreUshort( - * IN PUSHORT Address, - * IN USHORT Value); - */ -#if defined(_AMD64_) -#define RtlStoreUshort(Address,Value) \ - *(USHORT UNALIGNED *)(Address) = (Value) -#else #define RtlStoreUshort(Address,Value) \ if ((ULONG_PTR)(Address) & SHORT_MASK) { \ ((PUCHAR) (Address))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(Value)); \ @@ -6569,7 +8842,44 @@ RtlSetDaclSecurityDescriptor( else { \ *((PUSHORT) (Address)) = (USHORT)Value; \ } -#endif + +#define RtlRetrieveUshort(DestAddress,SrcAddress) \ + if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ + { \ + ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ + ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ + } \ + else \ + { \ + *((PUSHORT)(DestAddress))=*((PUSHORT)(SrcAddress)); \ + } + +#define RtlRetrieveUlong(DestAddress,SrcAddress) \ + if ((ULONG_PTR)(SrcAddress) & LONG_MASK) \ + { \ + ((PUCHAR)(DestAddress))[0]=((PUCHAR)(SrcAddress))[0]; \ + ((PUCHAR)(DestAddress))[1]=((PUCHAR)(SrcAddress))[1]; \ + ((PUCHAR)(DestAddress))[2]=((PUCHAR)(SrcAddress))[2]; \ + ((PUCHAR)(DestAddress))[3]=((PUCHAR)(SrcAddress))[3]; \ + } \ + else \ + { \ + *((PULONG)(DestAddress))=*((PULONG)(SrcAddress)); \ + } + +#endif /* defined(_AMD64_) */ + +#ifdef _WIN64 +/* VOID + * RtlStoreUlongPtr( + * IN OUT PULONG_PTR Address, + * IN ULONG_PTR Value); + */ +#define RtlStoreUlongPtr(Address,Value) RtlStoreUlonglong(Address,Value) +#else +#define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value) +#endif /* _WIN64 */ + NTSYSAPI BOOLEAN @@ -6835,6 +9145,34 @@ RtlConvertUlongToLargeInteger( return ret; } +//DECLSPEC_DEPRECATED_DDK_WINXP +static __inline +LARGE_INTEGER +NTAPI_INLINE +RtlLargeIntegerShiftLeft( + IN LARGE_INTEGER LargeInteger, + IN CCHAR ShiftCount) +{ + LARGE_INTEGER Result; + + Result.QuadPart = LargeInteger.QuadPart << ShiftCount; + return Result; +} + +//DECLSPEC_DEPRECATED_DDK_WINXP +static __inline +LARGE_INTEGER +NTAPI_INLINE +RtlLargeIntegerShiftRight( + IN LARGE_INTEGER LargeInteger, + IN CCHAR ShiftCount) +{ + LARGE_INTEGER Result; + + Result.QuadPart = (ULONG64)LargeInteger.QuadPart >> ShiftCount; + return Result; +} + //DECLSPEC_DEPRECATED_DDK static __inline ULONG @@ -6849,6 +9187,33 @@ RtlEnlargedUnsignedDivide( return (ULONG)(Dividend.QuadPart / Divisor); } +//DECLSPEC_DEPRECATED_DDK +static __inline +LARGE_INTEGER +NTAPI_INLINE +RtlLargeIntegerNegate( + IN LARGE_INTEGER Subtrahend) +{ + LARGE_INTEGER Difference; + + Difference.QuadPart = -Subtrahend.QuadPart; + return Difference; +} + +//DECLSPEC_DEPRECATED_DDK +static __inline +LARGE_INTEGER +NTAPI_INLINE +RtlLargeIntegerSubtract( + IN LARGE_INTEGER Minuend, + IN LARGE_INTEGER Subtrahend) +{ + LARGE_INTEGER Difference; + + Difference.QuadPart = Minuend.QuadPart - Subtrahend.QuadPart; + return Difference; +} + //DECLSPEC_DEPRECATED_DDK static __inline LARGE_INTEGER @@ -7127,6 +9492,10 @@ RtlCheckBit( (__annotation(L"Debug", L"AssertFail", msg), \ DbgRaiseAssertionFailure(), FALSE) : TRUE) +#define NT_VERIFY NT_ASSERT +#define NT_VERIFYMSG NT_ASSERTMSG +#define NT_VERIFYMSGW NT_ASSERTMSGW + #else /* GCC doesn't support __annotation (nor PDB) */ @@ -7153,8 +9522,8 @@ RtlCheckBit( #define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE) #define NT_ASSERT(exp) ((VOID)0) -#define NT_ASSERTMSG(exp) ((VOID)0) -#define NT_ASSERTMSGW(exp) ((VOID)0) +#define NT_ASSERTMSG(msg, exp) ((VOID)0) +#define NT_ASSERTMSGW(msg, exp) ((VOID)0) #define NT_VERIFY(_exp) ((_exp) ? TRUE : FALSE) #define NT_VERIFYMSG(_msg, _exp ) ((_exp) ? TRUE : FALSE) @@ -7241,16 +9610,61 @@ InterlockedPushEntrySList( #endif /* !defined(_WINBASE_) */ +#define RTL_CONTEXT_EX_OFFSET(ContextEx, Chunk) ((ContextEx)->Chunk.Offset) +#define RTL_CONTEXT_EX_LENGTH(ContextEx, Chunk) ((ContextEx)->Chunk.Length) +#define RTL_CONTEXT_EX_CHUNK(Base, Layout, Chunk) \ + ((PVOID)((PCHAR)(Base) + RTL_CONTEXT_EX_OFFSET(Layout, Chunk))) +#define RTL_CONTEXT_OFFSET(Context, Chunk) \ + RTL_CONTEXT_EX_OFFSET((PCONTEXT_EX)(Context + 1), Chunk) +#define RTL_CONTEXT_LENGTH(Context, Chunk) \ + RTL_CONTEXT_EX_LENGTH((PCONTEXT_EX)(Context + 1), Chunk) +#define RTL_CONTEXT_CHUNK(Context, Chunk) \ + RTL_CONTEXT_EX_CHUNK((PCONTEXT_EX)(Context + 1), \ + (PCONTEXT_EX)(Context + 1), \ + Chunk) + +BOOLEAN +RTLVERLIB_DDI(RtlIsNtDdiVersionAvailable)( + IN ULONG Version); + +BOOLEAN +RTLVERLIB_DDI(RtlIsServicePackVersionInstalled)( + IN ULONG Version); + +#ifndef RtlIsNtDdiVersionAvailable +#define RtlIsNtDdiVersionAvailable WdmlibRtlIsNtDdiVersionAvailable +#endif + +#ifndef RtlIsServicePackVersionInstalled +#define RtlIsServicePackVersionInstalled WdmlibRtlIsServicePackVersionInstalled +#endif + +#define RtlInterlockedSetBits(Flags, Flag) \ + InterlockedOr((PLONG)(Flags), Flag) + +#define RtlInterlockedAndBits(Flags, Flag) \ + InterlockedAnd((PLONG)(Flags), Flag) + +#define RtlInterlockedClearBits(Flags, Flag) \ + RtlInterlockedAndBits(Flags, ~(Flag)) + +#define RtlInterlockedXorBits(Flags, Flag) \ + InterlockedXor(Flags, Flag) + +#define RtlInterlockedSetBitsDiscardReturn(Flags, Flag) \ + (VOID) RtlInterlockedSetBits(Flags, Flag) + +#define RtlInterlockedAndBitsDiscardReturn(Flags, Flag) \ + (VOID) RtlInterlockedAndBits(Flags, Flag) + +#define RtlInterlockedClearBitsDiscardReturn(Flags, Flag) \ + RtlInterlockedAndBitsDiscardReturn(Flags, ~(Flag)) + + /****************************************************************************** * Kernel Functions * ******************************************************************************/ -NTHALAPI -KIRQL -NTAPI -KeGetCurrentIrql( - VOID); - NTKERNELAPI VOID NTAPI @@ -8137,6 +10551,22 @@ KeFlushWriteBuffer(VOID); #define ALIGN_UP_POINTER(ptr, type) \ ALIGN_UP_POINTER_BY(ptr, sizeof(type)) +#ifndef FIELD_OFFSET +#define FIELD_OFFSET(type, field) ((ULONG)&(((type *)0)->field)) +#endif + +#ifndef FIELD_SIZE +#define FIELD_SIZE(type, field) (sizeof(((type *)0)->field)) +#endif + +#define POOL_TAGGING 1 + +#if DBG +#define IF_DEBUG if (TRUE) +#else +#define IF_DEBUG if (FALSE) +#endif /* DBG */ + /* ULONG * BYTE_OFFSET( * IN PVOID Va) @@ -8149,7 +10579,7 @@ KeFlushWriteBuffer(VOID); * IN ULONG Size) */ #define BYTES_TO_PAGES(Size) \ - (((Size) >> PAGE_SHIFT) + (((Size) & (PAGE_SIZE - 1)) != 0)) + (((Size) + PAGE_SIZE - 1) >> PAGE_SHIFT) /* PVOID * PAGE_ALIGN( @@ -8443,7 +10873,16 @@ MmUnmapLockedPages( IN PVOID BaseAddress, IN PMDL MemoryDescriptorList); - +NTKERNELAPI +PVOID +NTAPI +MmAllocateContiguousMemorySpecifyCacheNode( + IN SIZE_T NumberOfBytes, + IN PHYSICAL_ADDRESS LowestAcceptableAddress, + IN PHYSICAL_ADDRESS HighestAcceptableAddress, + IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL, + IN MEMORY_CACHING_TYPE CacheType, + IN NODE_REQUIREMENT PreferredNode); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -8500,6 +10939,22 @@ MmUnmapReservedMapping( IN ULONG PoolTag, IN PMDL MemoryDescriptorList); +NTKERNELAPI +NTSTATUS +NTAPI +MmAddVerifierThunks( + IN PVOID ThunkBuffer, + IN ULONG ThunkBufferSize); + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +#if (NTDDI_VERSION >= NTDDI_WS03) +NTKERNELAPI +LOGICAL +NTAPI +MmIsIoSpaceActive( + IN PHYSICAL_ADDRESS StartAddress, + IN SIZE_T NumberOfBytes); #endif #if (NTDDI_VERSION >= NTDDI_WS03SP1) @@ -8728,6 +11183,40 @@ CmGetBoundTransaction( * I/O Manager Functions * ******************************************************************************/ + +/* + * NTSTATUS + * IoAcquireRemoveLock( + * IN PIO_REMOVE_LOCK RemoveLock, + * IN OPTIONAL PVOID Tag) + */ +#if DBG +#define IoAcquireRemoveLock(RemoveLock, Tag) \ + IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK)) +#else +#define IoAcquireRemoveLock(RemoveLock, Tag) \ + IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK)) +#endif + +/* + * VOID + * IoAdjustPagingPathCount( + * IN PLONG Count, + * IN BOOLEAN Increment) + */ +#define IoAdjustPagingPathCount(_Count, \ + _Increment) \ +{ \ + if (_Increment) \ + { \ + InterlockedIncrement(_Count); \ + } \ + else \ + { \ + InterlockedDecrement(_Count); \ + } \ +} + #if !defined(_M_AMD64) NTHALAPI VOID @@ -9254,43 +11743,6 @@ IoAcquireRemoveLockEx( IN PCSTR File, IN ULONG Line, IN ULONG RemlockSize); -#endif - -/* - * NTSTATUS - * IoAcquireRemoveLock( - * IN PIO_REMOVE_LOCK RemoveLock, - * IN OPTIONAL PVOID Tag) - */ -#if DBG -#define IoAcquireRemoveLock(RemoveLock, Tag) \ - IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK)) -#else -#define IoAcquireRemoveLock(RemoveLock, Tag) \ - IoAcquireRemoveLockEx(RemoveLock, Tag, "", 1, sizeof (IO_REMOVE_LOCK)) -#endif - -/* - * VOID - * IoAdjustPagingPathCount( - * IN PLONG Count, - * IN BOOLEAN Increment) - */ -#define IoAdjustPagingPathCount(_Count, \ - _Increment) \ -{ \ - if (_Increment) \ - { \ - InterlockedIncrement(_Count); \ - } \ - else \ - { \ - InterlockedDecrement(_Count); \ - } \ -} - -#if (NTDDI_VERSION >= NTDDI_WIN2K) - NTKERNELAPI NTSTATUS NTAPI @@ -10086,9 +12538,237 @@ IoWMISetSingleItem( IN ULONG Version, IN ULONG ValueBufferSize, IN PVOID ValueBuffer); +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ +#if (NTDDI_VERSION >= NTDDI_WINXPSP1) +NTKERNELAPI +NTSTATUS +NTAPI +IoValidateDeviceIoControlAccess( + IN PIRP Irp, + IN ULONG RequiredAccess); #endif +#if (NTDDI_VERSION >= NTDDI_WS03) + +NTKERNELAPI +NTSTATUS +NTAPI +IoCsqInitializeEx( + IN PIO_CSQ Csq, + IN PIO_CSQ_INSERT_IRP_EX CsqInsertIrp, + IN PIO_CSQ_REMOVE_IRP CsqRemoveIrp, + IN PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp, + IN PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock, + IN PIO_CSQ_RELEASE_LOCK CsqReleaseLock, + IN PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp); + +NTKERNELAPI +NTSTATUS +NTAPI +IoCsqInsertIrpEx( + IN PIO_CSQ Csq, + IN PIRP Irp, + IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL, + IN PVOID InsertContext OPTIONAL); +#endif /* (NTDDI_VERSION >= NTDDI_WS03) */ + + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTKERNELAPI +NTSTATUS +NTAPI +IoGetBootDiskInformationLite( + OUT PBOOTDISK_INFORMATION_LITE *BootDiskInformation); + +NTKERNELAPI +NTSTATUS +NTAPI +IoCheckShareAccessEx( + IN ACCESS_MASK DesiredAccess, + IN ULONG DesiredShareAccess, + IN OUT PFILE_OBJECT FileObject, + IN OUT PSHARE_ACCESS ShareAccess, + IN BOOLEAN Update, + IN PBOOLEAN WritePermission); + +NTKERNELAPI +NTSTATUS +NTAPI +IoConnectInterruptEx( + IN OUT PIO_CONNECT_INTERRUPT_PARAMETERS Parameters); + +NTKERNELAPI +VOID +NTAPI +IoDisconnectInterruptEx( + IN PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters); + +LOGICAL +NTAPI +IoWithinStackLimits( + IN ULONG_PTR RegionStart, + IN SIZE_T RegionSize); + +NTKERNELAPI +VOID +NTAPI +IoSetShareAccessEx( + IN ACCESS_MASK DesiredAccess, + IN ULONG DesiredShareAccess, + IN OUT PFILE_OBJECT FileObject, + OUT PSHARE_ACCESS ShareAccess, + IN PBOOLEAN WritePermission); + +ULONG +NTAPI +IoSizeofWorkItem(VOID); + +VOID +NTAPI +IoInitializeWorkItem( + IN PVOID IoObject, + IN PIO_WORKITEM IoWorkItem); + +VOID +NTAPI +IoUninitializeWorkItem( + IN PIO_WORKITEM IoWorkItem); + +VOID +NTAPI +IoQueueWorkItemEx( + IN PIO_WORKITEM IoWorkItem, + IN PIO_WORKITEM_ROUTINE_EX WorkerRoutine, + IN WORK_QUEUE_TYPE QueueType, + IN PVOID Context OPTIONAL); + +IO_PRIORITY_HINT +NTAPI +IoGetIoPriorityHint( + IN PIRP Irp); + +NTSTATUS +NTAPI +IoSetIoPriorityHint( + IN PIRP Irp, + IN IO_PRIORITY_HINT PriorityHint); + +NTSTATUS +NTAPI +IoAllocateSfioStreamIdentifier( + IN PFILE_OBJECT FileObject, + IN ULONG Length, + IN PVOID Signature, + OUT PVOID *StreamIdentifier); + +PVOID +NTAPI +IoGetSfioStreamIdentifier( + IN PFILE_OBJECT FileObject, + IN PVOID Signature); + +NTSTATUS +NTAPI +IoFreeSfioStreamIdentifier( + IN PFILE_OBJECT FileObject, + IN PVOID Signature); + +NTKERNELAPI +NTSTATUS +NTAPI +IoRequestDeviceEjectEx( + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN PIO_DEVICE_EJECT_CALLBACK Callback OPTIONAL, + IN PVOID Context OPTIONAL, + IN PDRIVER_OBJECT DriverObject OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +IoSetDevicePropertyData( + IN PDEVICE_OBJECT Pdo, + IN CONST DEVPROPKEY *PropertyKey, + IN LCID Lcid, + IN ULONG Flags, + IN DEVPROPTYPE Type, + IN ULONG Size, + IN PVOID Data OPTIONAL); + +NTKERNELAPI +NTSTATUS +NTAPI +IoGetDevicePropertyData( + PDEVICE_OBJECT Pdo, + CONST DEVPROPKEY *PropertyKey, + LCID Lcid, + ULONG Flags, + ULONG Size, + PVOID Data, + PULONG RequiredSize, + PDEVPROPTYPE Type); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b) + +#if (NTDDI_VERSION >= NTDDI_WS08) +NTKERNELAPI +NTSTATUS +NTAPI +IoReplacePartitionUnit( + IN PDEVICE_OBJECT TargetPdo, + IN PDEVICE_OBJECT SparePdo, + IN ULONG Flags); +#endif + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +NTKERNELAPI +NTSTATUS +NTAPI +IoGetAffinityInterrupt( + IN PKINTERRUPT InterruptObject, + OUT PGROUP_AFFINITY GroupAffinity); + +NTSTATUS +NTAPI +IoGetContainerInformation( + IN IO_CONTAINER_INFORMATION_CLASS InformationClass, + IN PVOID ContainerObject OPTIONAL, + IN OUT PVOID Buffer OPTIONAL, + IN ULONG BufferLength); + +NTSTATUS +NTAPI +IoRegisterContainerNotification( + IN IO_CONTAINER_NOTIFICATION_CLASS NotificationClass, + IN PIO_CONTAINER_NOTIFICATION_FUNCTION CallbackFunction, + IN PVOID NotificationInformation OPTIONAL, + IN ULONG NotificationInformationLength, + OUT PVOID CallbackRegistration); + +VOID +NTAPI +IoUnregisterContainerNotification( + IN PVOID CallbackRegistration); + +NTKERNELAPI +NTSTATUS +NTAPI +IoUnregisterPlugPlayNotificationEx( + IN PVOID NotificationEntry); + +NTKERNELAPI +NTSTATUS +NTAPI +IoGetDeviceNumaNode( + IN PDEVICE_OBJECT Pdo, + OUT PUSHORT NodeNumber); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + #if defined(_WIN64) NTKERNELAPI ULONG @@ -10509,12 +13189,57 @@ PoCreatePowerRequest( #define ExInitializeSListHead InitializeSListHead -#if defined(_X86_) -#if defined(_NTHAL_) +#if defined(_NTHAL_) && defined(_X86_) + +NTKERNELAPI +VOID +FASTCALL +ExiAcquireFastMutex( + IN OUT PFAST_MUTEX FastMutex); + +NTKERNELAPI +VOID +FASTCALL +ExiReleaseFastMutex( + IN OUT PFAST_MUTEX FastMutex); + +NTKERNELAPI +BOOLEAN +FASTCALL +ExiTryToAcquireFastMutex( + IN OUT PFAST_MUTEX FastMutex); + #define ExAcquireFastMutex ExiAcquireFastMutex #define ExReleaseFastMutex ExiReleaseFastMutex #define ExTryToAcquireFastMutex ExiTryToAcquireFastMutex -#endif + +#else + +#if (NTDDI_VERSION >= NTDDI_WIN2K) + +NTKERNELAPI +VOID +FASTCALL +ExAcquireFastMutex( + IN OUT PFAST_MUTEX FastMutex); + +NTKERNELAPI +VOID +FASTCALL +ExReleaseFastMutex( + IN OUT PFAST_MUTEX FastMutex); + +NTKERNELAPI +BOOLEAN +FASTCALL +ExTryToAcquireFastMutex( + IN OUT PFAST_MUTEX FastMutex); + +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ + +#endif /* defined(_NTHAL_) && defined(_X86_) */ + +#if defined(_X86_) #define ExInterlockedAddUlong ExfInterlockedAddUlong #define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList #define ExInterlockedInsertTailList ExfInterlockedInsertTailList @@ -10572,6 +13297,8 @@ FASTCALL ExInterlockedFlushSList( IN OUT PSLIST_HEADER ListHead); +#endif /* !defined(_WIN64) */ + #if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_) NTKERNELAPI @@ -10588,20 +13315,70 @@ ExInterlockedPushEntrySList( IN PSLIST_HEADER ListHead, IN PSINGLE_LIST_ENTRY ListEntry, IN PKSPIN_LOCK Lock); -#else + +NTKERNELAPI +PVOID +NTAPI +ExAllocateFromPagedLookasideList( + IN OUT PPAGED_LOOKASIDE_LIST Lookaside); + +NTKERNELAPI +VOID +NTAPI +ExFreeToPagedLookasideList( + IN OUT PPAGED_LOOKASIDE_LIST Lookaside, + IN PVOID Entry); + +#else /* !_WIN2K_COMPAT_SLIST_USAGE */ + +#if !defined(_WIN64) #define ExInterlockedPopEntrySList(_ListHead, _Lock) \ InterlockedPopEntrySList(_ListHead) #define ExInterlockedPushEntrySList(_ListHead, _ListEntry, _Lock) \ InterlockedPushEntrySList(_ListHead, _ListEntry) -#endif // _WIN2K_COMPAT_SLIST_USAGE +#endif + +static __inline +PVOID +ExAllocateFromPagedLookasideList( + IN OUT PPAGED_LOOKASIDE_LIST Lookaside) +{ + PVOID Entry; + + Lookaside->L.TotalAllocates++; + Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); + if (Entry == NULL) { + Lookaside->L.AllocateMisses++; + Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, + Lookaside->L.Size, + Lookaside->L.Tag); + } + return Entry; +} + +static __inline +VOID +ExFreeToPagedLookasideList( + IN OUT PPAGED_LOOKASIDE_LIST Lookaside, + IN PVOID Entry) +{ + Lookaside->L.TotalFrees++; + if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { + Lookaside->L.FreeMisses++; + (Lookaside->L.Free)(Entry); + } else { + InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); + } +} + +#endif /* _WIN2K_COMPAT_SLIST_USAGE */ -#endif // !defined(_WIN64) /* ERESOURCE_THREAD * ExGetCurrentResourceThread( * VOID); */ -#define ExGetCurrentResourceThread() ((ERESOURCE_THREAD)PsGetCurrentThread()) +#define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread()) #define ExReleaseResource(R) (ExReleaseResourceLite(R)) @@ -10632,24 +13409,6 @@ ExInitializeFastMutex( #if (NTDDI_VERSION >= NTDDI_WIN2K) -NTKERNELAPI -VOID -FASTCALL -ExAcquireFastMutex( - IN OUT PFAST_MUTEX FastMutex); - -NTKERNELAPI -VOID -FASTCALL -ExReleaseFastMutex( - IN OUT PFAST_MUTEX FastMutex); - -NTKERNELAPI -BOOLEAN -FASTCALL -ExTryToAcquireFastMutex( - IN OUT PFAST_MUTEX FastMutex); - NTKERNELAPI VOID FASTCALL @@ -10697,10 +13456,6 @@ ExAllocatePool( IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes); -#ifdef POOL_TAGGING -#define ExAllocatePool(p,n) ExAllocatePoolWithTag(p,n,' kdD') -#endif /* POOL_TAGGING */ - NTKERNELAPI PVOID NTAPI @@ -10708,10 +13463,6 @@ ExAllocatePoolWithQuota( IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes); -#ifdef POOL_TAGGING -#define ExAllocatePoolWithQuota(p,n) ExAllocatePoolWithQuotaTag(p,n,' kdD') -#endif /* POOL_TAGGING */ - NTKERNELAPI PVOID NTAPI @@ -10732,6 +13483,10 @@ ExAllocatePoolWithTag( IN SIZE_T NumberOfBytes, IN ULONG Tag); +#ifndef POOL_TAGGING +#define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b) +#endif + NTKERNELAPI PVOID NTAPI @@ -10780,10 +13535,6 @@ NTAPI ExFreePool( IN PVOID P); -#ifdef POOL_TAGGING -#define ExFreePool(P) ExFreePoolWithTag(P, 0) -#endif - NTKERNELAPI VOID NTAPI @@ -11211,35 +13962,83 @@ ExInitializeLookasideListEx( IN SIZE_T Size, IN ULONG Tag, IN USHORT Depth); -#endif -#if !defined(MIDL_PASS) +NTKERNELAPI +VOID +NTAPI +ExDeleteLookasideListEx( + IN OUT PLOOKASIDE_LIST_EX Lookaside); -static __inline PVOID -ExAllocateFromNPagedLookasideList( - IN PNPAGED_LOOKASIDE_LIST Lookaside) +NTKERNELAPI +VOID +NTAPI +ExFlushLookasideListEx( + IN OUT PLOOKASIDE_LIST_EX Lookaside); + +FORCEINLINE +PVOID +ExAllocateFromLookasideListEx( + IN OUT PLOOKASIDE_LIST_EX Lookaside) { PVOID Entry; Lookaside->L.TotalAllocates += 1; Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); if (Entry == NULL) { - Lookaside->L.AllocateMisses++; - Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, + Lookaside->L.AllocateMisses += 1; + Entry = (Lookaside->L.AllocateEx)(Lookaside->L.Type, Lookaside->L.Size, - Lookaside->L.Tag); + Lookaside->L.Tag, + Lookaside); } return Entry; } +FORCEINLINE +VOID +ExFreeToLookasideListEx( + IN OUT PLOOKASIDE_LIST_EX Lookaside, + IN PVOID Entry) +{ + Lookaside->L.TotalFrees += 1; + if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { + Lookaside->L.FreeMisses += 1; + (Lookaside->L.FreeEx)(Entry, Lookaside); + } else { + InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); + } + return; +} + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#if (NTDDI_VERSION >= NTDDI_WIN7) + +NTKERNELAPI +VOID +NTAPI +ExSetResourceOwnerPointerEx( + IN OUT PERESOURCE Resource, + IN PVOID OwnerPointer, + IN ULONG Flags); + +#define FLAG_OWNER_POINTER_IS_THREAD 0x1 + +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ + static __inline PVOID -ExAllocateFromPagedLookasideList( - IN PPAGED_LOOKASIDE_LIST Lookaside) +ExAllocateFromNPagedLookasideList( + IN OUT PNPAGED_LOOKASIDE_LIST Lookaside) { PVOID Entry; Lookaside->L.TotalAllocates++; +#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_) + Entry = ExInterlockedPopEntrySList(&Lookaside->L.ListHead, + &Lookaside->Lock__ObsoleteButDoNotDelete); +#else Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead); +#endif if (Entry == NULL) { Lookaside->L.AllocateMisses++; Entry = (Lookaside->L.Allocate)(Lookaside->L.Type, @@ -11259,25 +14058,16 @@ ExFreeToNPagedLookasideList( Lookaside->L.FreeMisses++; (Lookaside->L.Free)(Entry); } else { +#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_) + ExInterlockedPushEntrySList(&Lookaside->L.ListHead, + (PSLIST_ENTRY)Entry, + &Lookaside->Lock__ObsoleteButDoNotDelete); +#else InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); +#endif } } -static __inline VOID -ExFreeToPagedLookasideList( - IN PPAGED_LOOKASIDE_LIST Lookaside, - IN PVOID Entry) -{ - Lookaside->L.TotalFrees++; - if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { - Lookaside->L.FreeMisses++; - (Lookaside->L.Free)(Entry); - } else { - InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry); - } -} - -#endif // !defined(MIDL_PASS) /****************************************************************************** * Object Manager Functions * @@ -11513,8 +14303,115 @@ WmiTraceMessageVa( IN va_list MessageArgList); #endif +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +#ifndef TRACE_INFORMATION_CLASS_DEFINE + +#if (NTDDI_VERSION >= NTDDI_WINXP) +NTKERNELAPI +NTSTATUS +NTAPI +WmiQueryTraceInformation( + IN TRACE_INFORMATION_CLASS TraceInformationClass, + OUT PVOID TraceInformation, + IN ULONG TraceInformationLength, + OUT PULONG RequiredLength OPTIONAL, + IN PVOID Buffer OPTIONAL); #endif +#define TRACE_INFORMATION_CLASS_DEFINE + +#endif /* TRACE_INFOPRMATION_CLASS_DEFINE */ + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTSTATUS +NTKERNELAPI +NTAPI +EtwRegister( + IN LPCGUID ProviderId, + IN PETWENABLECALLBACK EnableCallback OPTIONAL, + IN PVOID CallbackContext OPTIONAL, + OUT PREGHANDLE RegHandle); + +NTSTATUS +NTKERNELAPI +NTAPI +EtwUnregister( + IN REGHANDLE RegHandle); + +BOOLEAN +NTKERNELAPI +NTAPI +EtwEventEnabled( + IN REGHANDLE RegHandle, + IN PCEVENT_DESCRIPTOR EventDescriptor); + +BOOLEAN +NTKERNELAPI +NTAPI +EtwProviderEnabled( + IN REGHANDLE RegHandle, + IN UCHAR Level, + IN ULONGLONG Keyword); + +NTSTATUS +NTKERNELAPI +NTAPI +EtwActivityIdControl( + IN ULONG ControlCode, + IN OUT LPGUID ActivityId); + +NTSTATUS +NTKERNELAPI +NTAPI +EtwWrite( + IN REGHANDLE RegHandle, + IN PCEVENT_DESCRIPTOR EventDescriptor, + IN LPCGUID ActivityId OPTIONAL, + IN ULONG UserDataCount, + IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL); + +NTSTATUS +NTKERNELAPI +NTAPI +EtwWriteTransfer( + IN REGHANDLE RegHandle, + IN PCEVENT_DESCRIPTOR EventDescriptor, + IN LPCGUID ActivityId OPTIONAL, + IN LPCGUID RelatedActivityId OPTIONAL, + IN ULONG UserDataCount, + IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL); + +NTSTATUS +NTKERNELAPI +NTAPI +EtwWriteString( + IN REGHANDLE RegHandle, + IN UCHAR Level, + IN ULONGLONG Keyword, + IN LPCGUID ActivityId OPTIONAL, + IN PCWSTR String); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#if (NTDDI_VERSION >= NTDDI_WIN7) +NTSTATUS +NTKERNELAPI +NTAPI +EtwWriteEx( + IN REGHANDLE RegHandle, + IN PCEVENT_DESCRIPTOR EventDescriptor, + IN ULONG64 Filter, + IN ULONG Flags, + IN LPCGUID ActivityId OPTIONAL, + IN LPCGUID RelatedActivityId OPTIONAL, + IN ULONG UserDataCount, + IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL); +#endif + + + /****************************************************************************** * Kernel Debugger Functions * ******************************************************************************/ @@ -11526,8 +14423,86 @@ __cdecl DbgPrint( IN PCSTR Format, IN ...); + +#if (NTDDI_VERSION >= NTDDI_WIN2K) +NTSYSAPI +ULONG +__cdecl +DbgPrintReturnControlC( + IN PCCH Format, + IN ...); #endif +#if (NTDDI_VERSION >= NTDDI_WINXP) + +NTSYSAPI +ULONG +__cdecl +DbgPrintEx( + IN ULONG ComponentId, + IN ULONG Level, + IN PCSTR Format, + IN ...); + +#ifdef _VA_LIST_DEFINED + +NTSYSAPI +ULONG +NTAPI +vDbgPrintEx( + IN ULONG ComponentId, + IN ULONG Level, + IN PCCH Format, + IN va_list ap); + +NTSYSAPI +ULONG +NTAPI +vDbgPrintExWithPrefix( + IN PCCH Prefix, + IN ULONG ComponentId, + IN ULONG Level, + IN PCCH Format, + IN va_list ap); + +#endif /* _VA_LIST_DEFINED */ + +NTSYSAPI +NTSTATUS +NTAPI +DbgQueryDebugFilterState( + IN ULONG ComponentId, + IN ULONG Level); + +NTSYSAPI +NTSTATUS +NTAPI +DbgSetDebugFilterState( + IN ULONG ComponentId, + IN ULONG Level, + IN BOOLEAN State); + +#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +typedef VOID +(*PDEBUG_PRINT_CALLBACK)( + IN PSTRING Output, + IN ULONG ComponentId, + IN ULONG Level); + +NTSYSAPI +NTSTATUS +NTAPI +DbgSetDebugPrintCallback( + IN PDEBUG_PRINT_CALLBACK DebugPrintCallback, + IN BOOLEAN Enable); + +#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ + +#endif /* _DBGNT_ */ + #if DBG #define KdPrint(_x_) DbgPrint _x_ @@ -11571,31 +14546,6 @@ extern BOOLEAN KdDebuggerEnabled; #endif -#ifdef _VA_LIST_DEFINED -#if (NTDDI_VERSION >= NTDDI_WINXP) - -NTSYSAPI -ULONG -NTAPI -vDbgPrintEx( - IN ULONG ComponentId, - IN ULONG Level, - IN PCCH Format, - IN va_list ap); - -NTSYSAPI -ULONG -NTAPI -vDbgPrintExWithPrefix( - IN PCCH Prefix, - IN ULONG ComponentId, - IN ULONG Level, - IN PCCH Format, - IN va_list ap); - -#endif -#endif // _VA_LIST_DEFINED - #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI @@ -11622,42 +14572,7 @@ NTAPI DbgBreakPointWithStatus( IN ULONG Status); -NTSYSAPI -ULONG -_cdecl -DbgPrintReturnControlC( - IN PCCH Format, - IN ...); - -#endif - -#if (NTDDI_VERSION >= NTDDI_WINXP) - -NTSYSAPI -ULONG -_cdecl -DbgPrintEx( - IN ULONG ComponentId, - IN ULONG Level, - IN PCSTR Format, - IN ...); - -NTSYSAPI -NTSTATUS -NTAPI -DbgQueryDebugFilterState( - IN ULONG ComponentId, - IN ULONG Level); - -NTSYSAPI -NTSTATUS -NTAPI -DbgSetDebugFilterState( - IN ULONG ComponentId, - IN ULONG Level, - IN BOOLEAN State); - -#endif +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_WS03) NTKERNELAPI @@ -11678,6 +14593,9 @@ KdChangeOption( OUT PVOID OutBuffer, OUT PULONG OutBufferNeeded OPTIONAL); #endif +/* Hardware Abstraction Layer Functions */ + +#if (NTDDI_VERSION >= NTDDI_WIN2K) #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) @@ -11731,14 +14649,224 @@ HalReadDmaCounter( return counter; } -#endif +FORCEINLINE +ULONG +HalGetDmaAlignment( + IN PDMA_ADAPTER DmaAdapter) +{ + PGET_DMA_ALIGNMENT getDmaAlignment; + ULONG alignment; + getDmaAlignment = *(DmaAdapter)->DmaOperations->GetDmaAlignment; + ASSERT( getDmaAlignment != NULL ); + alignment = getDmaAlignment( DmaAdapter ); + return alignment; +} + +#endif /* USE_DMA_MACROS ... */ +#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #ifndef _NTTMAPI_ #define _NTTMAPI_ #include +#define TRANSACTIONMANAGER_QUERY_INFORMATION (0x0001) +#define TRANSACTIONMANAGER_SET_INFORMATION (0x0002) +#define TRANSACTIONMANAGER_RECOVER (0x0004) +#define TRANSACTIONMANAGER_RENAME (0x0008) +#define TRANSACTIONMANAGER_CREATE_RM (0x0010) +#define TRANSACTIONMANAGER_BIND_TRANSACTION (0x0020) + +#define TRANSACTIONMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\ + TRANSACTIONMANAGER_QUERY_INFORMATION) + +#define TRANSACTIONMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ + TRANSACTIONMANAGER_SET_INFORMATION |\ + TRANSACTIONMANAGER_RECOVER |\ + TRANSACTIONMANAGER_RENAME |\ + TRANSACTIONMANAGER_CREATE_RM) + +#define TRANSACTIONMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE) + +#define TRANSACTIONMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ + TRANSACTIONMANAGER_GENERIC_READ |\ + TRANSACTIONMANAGER_GENERIC_WRITE |\ + TRANSACTIONMANAGER_GENERIC_EXECUTE |\ + TRANSACTIONMANAGER_BIND_TRANSACTION) + +#define TRANSACTION_QUERY_INFORMATION (0x0001) +#define TRANSACTION_SET_INFORMATION (0x0002) +#define TRANSACTION_ENLIST (0x0004) +#define TRANSACTION_COMMIT (0x0008) +#define TRANSACTION_ROLLBACK (0x0010) +#define TRANSACTION_PROPAGATE (0x0020) +#define TRANSACTION_RIGHT_RESERVED1 (0x0040) + +#define TRANSACTION_GENERIC_READ (STANDARD_RIGHTS_READ |\ + TRANSACTION_QUERY_INFORMATION |\ + SYNCHRONIZE) + +#define TRANSACTION_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ + TRANSACTION_SET_INFORMATION |\ + TRANSACTION_COMMIT |\ + TRANSACTION_ENLIST |\ + TRANSACTION_ROLLBACK |\ + TRANSACTION_PROPAGATE |\ + SYNCHRONIZE) + +#define TRANSACTION_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\ + TRANSACTION_COMMIT |\ + TRANSACTION_ROLLBACK |\ + SYNCHRONIZE) + +#define TRANSACTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ + TRANSACTION_GENERIC_READ |\ + TRANSACTION_GENERIC_WRITE |\ + TRANSACTION_GENERIC_EXECUTE) + +#define TRANSACTION_RESOURCE_MANAGER_RIGHTS (TRANSACTION_GENERIC_READ |\ + STANDARD_RIGHTS_WRITE |\ + TRANSACTION_SET_INFORMATION |\ + TRANSACTION_ENLIST |\ + TRANSACTION_ROLLBACK |\ + TRANSACTION_PROPAGATE |\ + SYNCHRONIZE) + +#define RESOURCEMANAGER_QUERY_INFORMATION (0x0001) +#define RESOURCEMANAGER_SET_INFORMATION (0x0002) +#define RESOURCEMANAGER_RECOVER (0x0004) +#define RESOURCEMANAGER_ENLIST (0x0008) +#define RESOURCEMANAGER_GET_NOTIFICATION (0x0010) +#define RESOURCEMANAGER_REGISTER_PROTOCOL (0x0020) +#define RESOURCEMANAGER_COMPLETE_PROPAGATION (0x0040) + +#define RESOURCEMANAGER_GENERIC_READ (STANDARD_RIGHTS_READ |\ + RESOURCEMANAGER_QUERY_INFORMATION |\ + SYNCHRONIZE) + +#define RESOURCEMANAGER_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ + RESOURCEMANAGER_SET_INFORMATION |\ + RESOURCEMANAGER_RECOVER |\ + RESOURCEMANAGER_ENLIST |\ + RESOURCEMANAGER_GET_NOTIFICATION |\ + RESOURCEMANAGER_REGISTER_PROTOCOL |\ + RESOURCEMANAGER_COMPLETE_PROPAGATION |\ + SYNCHRONIZE) + +#define RESOURCEMANAGER_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\ + RESOURCEMANAGER_RECOVER |\ + RESOURCEMANAGER_ENLIST |\ + RESOURCEMANAGER_GET_NOTIFICATION |\ + RESOURCEMANAGER_COMPLETE_PROPAGATION |\ + SYNCHRONIZE) + +#define RESOURCEMANAGER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ + RESOURCEMANAGER_GENERIC_READ |\ + RESOURCEMANAGER_GENERIC_WRITE |\ + RESOURCEMANAGER_GENERIC_EXECUTE) + +#define ENLISTMENT_QUERY_INFORMATION (0x0001) +#define ENLISTMENT_SET_INFORMATION (0x0002) +#define ENLISTMENT_RECOVER (0x0004) +#define ENLISTMENT_SUBORDINATE_RIGHTS (0x0008) +#define ENLISTMENT_SUPERIOR_RIGHTS (0x0010) + +#define ENLISTMENT_GENERIC_READ (STANDARD_RIGHTS_READ |\ + ENLISTMENT_QUERY_INFORMATION) + +#define ENLISTMENT_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\ + ENLISTMENT_SET_INFORMATION |\ + ENLISTMENT_RECOVER |\ + ENLISTMENT_SUBORDINATE_RIGHTS |\ + ENLISTMENT_SUPERIOR_RIGHTS) + +#define ENLISTMENT_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\ + ENLISTMENT_RECOVER |\ + ENLISTMENT_SUBORDINATE_RIGHTS |\ + ENLISTMENT_SUPERIOR_RIGHTS) + +#define ENLISTMENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED |\ + ENLISTMENT_GENERIC_READ |\ + ENLISTMENT_GENERIC_WRITE |\ + ENLISTMENT_GENERIC_EXECUTE) + +typedef enum _TRANSACTION_OUTCOME { + TransactionOutcomeUndetermined = 1, + TransactionOutcomeCommitted, + TransactionOutcomeAborted, +} TRANSACTION_OUTCOME; + + +typedef enum _TRANSACTION_STATE { + TransactionStateNormal = 1, + TransactionStateIndoubt, + TransactionStateCommittedNotify, +} TRANSACTION_STATE; + + +typedef struct _TRANSACTION_BASIC_INFORMATION { + GUID TransactionId; + ULONG State; + ULONG Outcome; +} TRANSACTION_BASIC_INFORMATION, *PTRANSACTION_BASIC_INFORMATION; + +typedef struct _TRANSACTIONMANAGER_BASIC_INFORMATION { + GUID TmIdentity; + LARGE_INTEGER VirtualClock; +} TRANSACTIONMANAGER_BASIC_INFORMATION, *PTRANSACTIONMANAGER_BASIC_INFORMATION; + +typedef struct _TRANSACTIONMANAGER_LOG_INFORMATION { + GUID LogIdentity; +} TRANSACTIONMANAGER_LOG_INFORMATION, *PTRANSACTIONMANAGER_LOG_INFORMATION; + +typedef struct _TRANSACTIONMANAGER_LOGPATH_INFORMATION { + ULONG LogPathLength; + WCHAR LogPath[1]; +} TRANSACTIONMANAGER_LOGPATH_INFORMATION, *PTRANSACTIONMANAGER_LOGPATH_INFORMATION; + +typedef struct _TRANSACTIONMANAGER_RECOVERY_INFORMATION { + ULONGLONG LastRecoveredLsn; +} TRANSACTIONMANAGER_RECOVERY_INFORMATION, *PTRANSACTIONMANAGER_RECOVERY_INFORMATION; + +typedef struct _TRANSACTION_PROPERTIES_INFORMATION { + ULONG IsolationLevel; + ULONG IsolationFlags; + LARGE_INTEGER Timeout; + ULONG Outcome; + ULONG DescriptionLength; + WCHAR Description[1]; +} TRANSACTION_PROPERTIES_INFORMATION, *PTRANSACTION_PROPERTIES_INFORMATION; + +typedef struct _TRANSACTION_BIND_INFORMATION { + HANDLE TmHandle; +} TRANSACTION_BIND_INFORMATION, *PTRANSACTION_BIND_INFORMATION; + +typedef struct _TRANSACTION_ENLISTMENT_PAIR { + GUID EnlistmentId; + GUID ResourceManagerId; +} TRANSACTION_ENLISTMENT_PAIR, *PTRANSACTION_ENLISTMENT_PAIR; + +typedef struct _TRANSACTION_ENLISTMENTS_INFORMATION { + ULONG NumberOfEnlistments; + TRANSACTION_ENLISTMENT_PAIR EnlistmentPair[1]; +} TRANSACTION_ENLISTMENTS_INFORMATION, *PTRANSACTION_ENLISTMENTS_INFORMATION; + +typedef struct _TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION { + TRANSACTION_ENLISTMENT_PAIR SuperiorEnlistmentPair; +} TRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION, *PTRANSACTION_SUPERIOR_ENLISTMENT_INFORMATION; + +typedef struct _RESOURCEMANAGER_BASIC_INFORMATION { + GUID ResourceManagerId; + ULONG DescriptionLength; + WCHAR Description[1]; +} RESOURCEMANAGER_BASIC_INFORMATION, *PRESOURCEMANAGER_BASIC_INFORMATION; + +typedef struct _RESOURCEMANAGER_COMPLETION_INFORMATION { + HANDLE IoCompletionPortHandle; + ULONG_PTR CompletionKey; +} RESOURCEMANAGER_COMPLETION_INFORMATION, *PRESOURCEMANAGER_COMPLETION_INFORMATION; + typedef enum _KTMOBJECT_TYPE { KTMOBJECT_TRANSACTION, KTMOBJECT_TRANSACTION_MANAGER, @@ -11772,12 +14900,421 @@ typedef enum _RESOURCEMANAGER_INFORMATION_CLASS { ResourceManagerCompletionInformation, } RESOURCEMANAGER_INFORMATION_CLASS; +typedef struct _ENLISTMENT_BASIC_INFORMATION { + GUID EnlistmentId; + GUID TransactionId; + GUID ResourceManagerId; +} ENLISTMENT_BASIC_INFORMATION, *PENLISTMENT_BASIC_INFORMATION; + +typedef struct _ENLISTMENT_CRM_INFORMATION { + GUID CrmTransactionManagerId; + GUID CrmResourceManagerId; + GUID CrmEnlistmentId; +} ENLISTMENT_CRM_INFORMATION, *PENLISTMENT_CRM_INFORMATION; + typedef enum _ENLISTMENT_INFORMATION_CLASS { EnlistmentBasicInformation, EnlistmentRecoveryInformation, EnlistmentCrmInformation } ENLISTMENT_INFORMATION_CLASS; +typedef struct _TRANSACTION_LIST_ENTRY { +#if defined(__cplusplus) + ::UOW UOW; +#else + UOW UOW; +#endif +} TRANSACTION_LIST_ENTRY, *PTRANSACTION_LIST_ENTRY; + +typedef struct _TRANSACTION_LIST_INFORMATION { + ULONG NumberOfTransactions; + TRANSACTION_LIST_ENTRY TransactionInformation[1]; +} TRANSACTION_LIST_INFORMATION, *PTRANSACTION_LIST_INFORMATION; + +typedef NTSTATUS +(NTAPI *PFN_NT_CREATE_TRANSACTION)( + OUT PHANDLE TransactionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN LPGUID Uow OPTIONAL, + IN HANDLE TmHandle OPTIONAL, + IN ULONG CreateOptions OPTIONAL, + IN ULONG IsolationLevel OPTIONAL, + IN ULONG IsolationFlags OPTIONAL, + IN PLARGE_INTEGER Timeout OPTIONAL, + IN PUNICODE_STRING Description OPTIONAL); + +typedef NTSTATUS +(NTAPI *PFN_NT_OPEN_TRANSACTION)( + OUT PHANDLE TransactionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN LPGUID Uow OPTIONAL, + IN HANDLE TmHandle OPTIONAL); + +typedef NTSTATUS +(NTAPI *PFN_NT_QUERY_INFORMATION_TRANSACTION)( + IN HANDLE TransactionHandle, + IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + OUT PVOID TransactionInformation, + IN ULONG TransactionInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +typedef NTSTATUS +(NTAPI *PFN_NT_SET_INFORMATION_TRANSACTION)( + IN HANDLE TransactionHandle, + IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + IN PVOID TransactionInformation, + IN ULONG TransactionInformationLength); + +typedef NTSTATUS +(NTAPI *PFN_NT_COMMIT_TRANSACTION)( + IN HANDLE TransactionHandle, + IN BOOLEAN Wait); + +typedef NTSTATUS +(NTAPI *PFN_NT_ROLLBACK_TRANSACTION)( + IN HANDLE TransactionHandle, + IN BOOLEAN Wait); + +#if (NTDDI_VERSION >= NTDDI_VISTA) + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCreateTransactionManager( + OUT PHANDLE TmHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PUNICODE_STRING LogFileName OPTIONAL, + IN ULONG CreateOptions OPTIONAL, + IN ULONG CommitStrength OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtOpenTransactionManager( + OUT PHANDLE TmHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN PUNICODE_STRING LogFileName OPTIONAL, + IN LPGUID TmIdentity OPTIONAL, + IN ULONG OpenOptions OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRenameTransactionManager( + IN PUNICODE_STRING LogFileName, + IN LPGUID ExistingTransactionManagerGuid); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRollforwardTransactionManager( + IN HANDLE TransactionManagerHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRecoverTransactionManager( + IN HANDLE TransactionManagerHandle); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtQueryInformationTransactionManager( + IN HANDLE TransactionManagerHandle, + IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, + OUT PVOID TransactionManagerInformation, + IN ULONG TransactionManagerInformationLength, + OUT PULONG ReturnLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtSetInformationTransactionManager( + IN HANDLE TmHandle OPTIONAL, + IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, + IN PVOID TransactionManagerInformation, + IN ULONG TransactionManagerInformationLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtEnumerateTransactionObject( + IN HANDLE RootObjectHandle OPTIONAL, + IN KTMOBJECT_TYPE QueryType, + IN OUT PKTMOBJECT_CURSOR ObjectCursor, + IN ULONG ObjectCursorLength, + OUT PULONG ReturnLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCreateTransaction( + OUT PHANDLE TransactionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN LPGUID Uow OPTIONAL, + IN HANDLE TmHandle OPTIONAL, + IN ULONG CreateOptions OPTIONAL, + IN ULONG IsolationLevel OPTIONAL, + IN ULONG IsolationFlags OPTIONAL, + IN PLARGE_INTEGER Timeout OPTIONAL, + IN PUNICODE_STRING Description OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtOpenTransaction( + OUT PHANDLE TransactionHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN LPGUID Uow, + IN HANDLE TmHandle OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtQueryInformationTransaction( + IN HANDLE TransactionHandle, + IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + OUT PVOID TransactionInformation, + IN ULONG TransactionInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtSetInformationTransaction( + IN HANDLE TransactionHandle, + IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + IN PVOID TransactionInformation, + IN ULONG TransactionInformationLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCommitTransaction( + IN HANDLE TransactionHandle, + IN BOOLEAN Wait); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRollbackTransaction( + IN HANDLE TransactionHandle, + IN BOOLEAN Wait); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCreateEnlistment( + OUT PHANDLE EnlistmentHandle, + IN ACCESS_MASK DesiredAccess, + IN HANDLE ResourceManagerHandle, + IN HANDLE TransactionHandle, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN ULONG CreateOptions OPTIONAL, + IN NOTIFICATION_MASK NotificationMask, + IN PVOID EnlistmentKey OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtOpenEnlistment( + OUT PHANDLE EnlistmentHandle, + IN ACCESS_MASK DesiredAccess, + IN HANDLE ResourceManagerHandle, + IN LPGUID EnlistmentGuid, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtQueryInformationEnlistment( + IN HANDLE EnlistmentHandle, + IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, + OUT PVOID EnlistmentInformation, + IN ULONG EnlistmentInformationLength, + OUT PULONG ReturnLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtSetInformationEnlistment( + IN HANDLE EnlistmentHandle OPTIONAL, + IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, + IN PVOID EnlistmentInformation, + IN ULONG EnlistmentInformationLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRecoverEnlistment( + IN HANDLE EnlistmentHandle, + IN PVOID EnlistmentKey OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtPrePrepareEnlistment( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtPrepareEnlistment( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCommitEnlistment( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRollbackEnlistment( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtPrePrepareComplete( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtPrepareComplete( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCommitComplete( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtReadOnlyEnlistment( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRollbackComplete( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtSinglePhaseReject( + IN HANDLE EnlistmentHandle, + IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtCreateResourceManager( + OUT PHANDLE ResourceManagerHandle, + IN ACCESS_MASK DesiredAccess, + IN HANDLE TmHandle, + IN LPGUID RmGuid, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN ULONG CreateOptions OPTIONAL, + IN PUNICODE_STRING Description OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtOpenResourceManager( + OUT PHANDLE ResourceManagerHandle, + IN ACCESS_MASK DesiredAccess, + IN HANDLE TmHandle, + IN LPGUID ResourceManagerGuid OPTIONAL, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRecoverResourceManager( + IN HANDLE ResourceManagerHandle); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtGetNotificationResourceManager( + IN HANDLE ResourceManagerHandle, + OUT PTRANSACTION_NOTIFICATION TransactionNotification, + IN ULONG NotificationLength, + IN PLARGE_INTEGER Timeout OPTIONAL, + OUT PULONG ReturnLength OPTIONAL, + IN ULONG Asynchronous, + IN ULONG_PTR AsynchronousContext OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtQueryInformationResourceManager( + IN HANDLE ResourceManagerHandle, + IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, + OUT PVOID ResourceManagerInformation, + IN ULONG ResourceManagerInformationLength, + OUT PULONG ReturnLength OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtSetInformationResourceManager( + IN HANDLE ResourceManagerHandle, + IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, + IN PVOID ResourceManagerInformation, + IN ULONG ResourceManagerInformationLength); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtRegisterProtocolAddressInformation( + IN HANDLE ResourceManager, + IN PCRM_PROTOCOL_ID ProtocolId, + IN ULONG ProtocolInformationSize, + IN PVOID ProtocolInformation, + IN ULONG CreateOptions OPTIONAL); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtPropagationComplete( + IN HANDLE ResourceManagerHandle, + IN ULONG RequestCookie, + IN ULONG BufferLength, + IN PVOID Buffer); + +NTSYSCALLAPI +NTSTATUS +NTAPI +NtPropagationFailed( + IN HANDLE ResourceManagerHandle, + IN ULONG RequestCookie, + IN NTSTATUS PropStatus); + +#endif /* NTDDI_VERSION >= NTDDI_VISTA */ + #endif /* !_NTTMAPI_ */ /****************************************************************************** * ZwXxx Functions * @@ -12469,78 +16006,8 @@ ZwSetInformationKey( IN PVOID KeySetInformation, IN ULONG KeySetInformationLength); -#endif - -/****************************************************************************** - * Unsorted * - ******************************************************************************/ - -/* GUID Comparison */ -#ifndef __IID_ALIGNED__ -#define __IID_ALIGNED__ -#ifdef __cplusplus -inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2) -{ - return ( (*(PLONGLONG)(&guid1) == *(PLONGLONG)(&guid2)) && - (*((PLONGLONG)(&guid1) + 1) == *((PLONGLONG)(&guid2) + 1)) ); -} -#else -#define IsEqualGUIDAligned(guid1, guid2) \ - ( (*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && \ - (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)) ) -#endif /* __cplusplus */ -#endif /* !__IID_ALIGNED__ */ - -typedef enum { - LT_DONT_CARE, - LT_LOWEST_LATENCY -} LATENCY_TIME; - -#define MAXIMUM_SUSPEND_COUNT MAXCHAR - -#define MAXIMUM_FILENAME_LENGTH 256 - -#define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\') - -#define OBJECT_TYPE_CREATE (0x0001) -#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) - -#define DIRECTORY_QUERY (0x0001) -#define DIRECTORY_TRAVERSE (0x0002) -#define DIRECTORY_CREATE_OBJECT (0x0004) -#define DIRECTORY_CREATE_SUBDIRECTORY (0x0008) -#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF) - -#define EVENT_QUERY_STATE (0x0001) -#define EVENT_MODIFY_STATE (0x0002) -#define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) - -#define SEMAPHORE_QUERY_STATE (0x0001) -#define SEMAPHORE_MODIFY_STATE (0x0002) -#define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x3) - -#define SYMBOLIC_LINK_QUERY 0x0001 -#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) - -#define DUPLICATE_CLOSE_SOURCE 0x00000001 -#define DUPLICATE_SAME_ACCESS 0x00000002 -#define DUPLICATE_SAME_ATTRIBUTES 0x00000004 - -/* Global debug flag */ -extern ULONG NtGlobalFlag; - -/* Service Start Types */ -#define SERVICE_BOOT_START 0x00000000 -#define SERVICE_SYSTEM_START 0x00000001 -#define SERVICE_AUTO_START 0x00000002 -#define SERVICE_DEMAND_START 0x00000003 -#define SERVICE_DISABLED 0x00000004 - -#ifndef _TRACEHANDLE_DEFINED -#define _TRACEHANDLE_DEFINED -typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE; -#endif +#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ #ifdef __cplusplus diff --git a/reactos/include/ndk/ketypes.h b/reactos/include/ndk/ketypes.h index d4ae1c545f0..67985379372 100644 --- a/reactos/include/ndk/ketypes.h +++ b/reactos/include/ndk/ketypes.h @@ -546,17 +546,6 @@ typedef enum _KAPC_ENVIRONMENT InsertApcEnvironment } KAPC_ENVIRONMENT; -// -// CPU Cache Types -// -typedef enum _PROCESSOR_CACHE_TYPE -{ - CacheUnified, - CacheInstruction, - CacheData, - CacheTrace, -} PROCESSOR_CACHE_TYPE; - // // PRCB DPC Data // @@ -577,18 +566,6 @@ typedef struct _PP_LOOKASIDE_LIST struct _GENERAL_LOOKASIDE *L; } PP_LOOKASIDE_LIST, *PPP_LOOKASIDE_LIST; -// -// CPU Cache Descriptor -// -typedef struct _CACHE_DESCRIPTOR -{ - UCHAR Level; - UCHAR Associativity; - USHORT LineSize; - ULONG Size; - PROCESSOR_CACHE_TYPE Type; -} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR; - // // Architectural Types //