Files
SHA256/includes/ntddk.inc
T

18744 lines
454 KiB
PHP

MUTEX_LEVEL_VDM_IO equ 1
MUTEX_LEVEL_EX_PROFILE equ 40h
MUTEX_LEVEL_RDR_FILESYS_DATABASE equ 10100000h
MUTEX_LEVEL_RDR_FILESYS_SECURITY equ 10100001h
MUTEX_LEVEL_FILESYSTEM_RAW_VCB equ 11000006h
MUTEX_LEVEL_STREAMS_SUBSYS equ 11001001h
MUTEX_LEVEL_PS_LDT equ 1F000000h
PULONG_PTR TYPEDEF PTR ULONG
;typedef struct _KTHREAD *PKTHREAD;
;typedef struct _ETHREAD *PETHREAD;
;typedef struct _EPROCESS *PEPROCESS;
;typedef struct _PEB *PPEB;
;typedef struct _KINTERRUPT *PKINTERRUPT;
;typedef struct _IO_TIMER *PIO_TIMER;
;typedef struct _OBJECT_TYPE *POBJECT_TYPE;
;typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
;typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT;
;typedef struct _BUS_HANDLER *PBUS_HANDLER;
SLIST_HEADER64 STRUC
Alignment ULONGLONG ?
Next BYTE 5 dup(?)
Sequence BYTE ?
Depth WORD ?
SLIST_HEADER64 ENDS
SLIST_HEADER TYPEDEF SLIST_HEADER64
PSLIST_HEADER TYPEDEF PTR SLIST_HEADER
SLIST_HEADER32 STRUC
Alignment ULONGLONG ?
STRUC
Next SINGLE_LIST_ENTRY<>
Depth USHORT ?
Sequence USHORT ?
ENDS
SLIST_HEADER32 ENDS
PSLIST_HEADER32 TYPEDEF PTR SLIST_HEADER32
;
;#endif
;
;
;//
;// Define alignment macros to align structure sizes and pointers up and down.
;//
;
;#define ALIGN_DOWN(length, type) \
; ((ULONG)(length) & ~(sizeof(type) - 1))
;
;#define ALIGN_UP(length, type) \
; (ALIGN_DOWN(((ULONG)(length) + sizeof(type) - 1), type))
;
;#define ALIGN_DOWN_POINTER(address, type) \
; ((PVOID)((ULONG_PTR)(address) & ~((ULONG_PTR)sizeof(type) - 1)))
;
;#define ALIGN_UP_POINTER(address, type) \
; (ALIGN_DOWN_POINTER(((ULONG_PTR)(address) + sizeof(type) - 1), type))
;
;#define POOL_TAGGING 1
;
;#ifndef DBG
;#define DBG 0
;#endif
;
;#if DBG
;#define IF_DEBUG if (TRUE)
;#else
;#define IF_DEBUG if (FALSE)
;#endif
;
;#if DEVL
;
;
;extern ULONG NtGlobalFlag;
;
;#define IF_NTOS_DEBUG( FlagName ) \
; if (NtGlobalFlag & (FLG_ ## FlagName))
;
;#else
;#define IF_NTOS_DEBUG( FlagName ) if (FALSE)
;#endif
;
;//
;// Kernel definitions that need to be here for forward reference purposes
;//
;
;// begin_ntndis
;//
;// Processor modes.
;//
KPROCESSOR_MODE TYPEDEF CCHAR
MODE TYPEDEF HANDLE
KernelMode equ 0
UserMode equ 1
MaximumMode equ 2
;
;// end_ntndis
;//
;// APC function types
;//
;
;//
;// Put in an empty definition for the KAPC so that the
;// routines can reference it before it is declared.
;begin_ntndis
;DPC routine
KNORMAL_ROUTINE TYPEDEF PROTO NormalContext:PVOID,SystemArgument1:PVOID,SystemArgument2:PVOID
PKNORMAL_ROUTINE TYPEDEF PTR KNORMAL_ROUTINE
KKERNEL_ROUTINE TYPEDEF PROTO Apc:PVOID,NormalRoutine:PKNORMAL_ROUTINE,NormalContext:PVOID,\
SystemArgument1:PVOID,SystemArgument2:PVOID
PKKERNEL_ROUTINE TYPEDEF PTR KKERNEL_ROUTINE
KRUNDOWN_ROUTINE TYPEDEF PROTO Apc:PVOID
PKRUNDOWN_ROUTINE TYPEDEF PTR KRUNDOWN_ROUTINE
KSYNCHRONIZE_ROUTINE TYPEDEF PROTO SynchronizeContext:PVOID
PKSYNCHRONIZE_ROUTINE TYPEDEF PTR KSYNCHRONIZE_ROUTINE
KTRANSFER_ROUTINE TYPEDEF PROTO
PKTRANSFER_ROUTINE TYPEDEF PTR KTRANSFER_ROUTINE
KAPC STRUC
kType CSHORT ?
kSize CSHORT ?
Spare0 ULONG ?
Thread PVOID ?
ApcListEntry LIST_ENTRY<>
KernelRoutine PKKERNEL_ROUTINE ?
RundownRoutine PKRUNDOWN_ROUTINE ?
NormalRoutine PKNORMAL_ROUTINE ?
NormalContext PVOID ?
SystemArgument1 PVOID ?
SystemArgument2 PVOID ?
ApcStateIndex CCHAR ?
ApcMode KPROCESSOR_MODE ?
Inserted BOOLEAN ?
KAPC ENDS
PKAPC TYPEDEF PTR KAPC
;Asynchronous Procedure Call (APC) object
KDEFERRED_ROUTINE TYPEDEF PROTO Dpc:PVOID,DeferredContext:PVOID,SystemArgument1:PVOID,SystemArgument2:PVOID
PKDEFERRED_ROUTINE TYPEDEF PTR KDEFERRED_ROUTINE
; Define DPC importance.
;
; LowImportance - Queue DPC at end of target DPC queue.
; MediumImportance - Queue DPC at end of target DPC queue.
; HighImportance - Queue DPC at front of target DPC DPC queue.
;
; If there is currently a DPC active on the target processor, or a DPC
; interrupt has already been requested on the target processor when a
; DPC is queued, then no further action is necessary. The DPC will be
; executed on the target processor when its queue entry is processed.
;
; If there is not a DPC active on the target processor and a DPC interrupt
; has not been requested on the target processor, then the exact treatment
; of the DPC is dependent on whether the host system is a UP system or an
; MP system.
;
; UP system.
;
; If the DPC is of medium or high importance, the current DPC queue depth
; is greater than the maximum target depth, or current DPC request rate is
; less the minimum target rate, then a DPC interrupt is requested on the
; host processor and the DPC will be processed when the interrupt occurs.
; Otherwise, no DPC interupt is requested and the DPC execution will be
; delayed until the DPC queue depth is greater that the target depth or the
; minimum DPC rate is less than the target rate.
;
; MP system.
;
; If the DPC is being queued to another processor and the depth of the DPC
; queue on the target processor is greater than the maximum target depth or
; the DPC is of high importance, then a DPC interrupt is requested on the
; target processor and the DPC will be processed when the interrupt occurs.
; Otherwise, the DPC execution will be delayed on the target processor until
; the DPC queue depth on the target processor is greater that the maximum
; target depth or the minimum DPC rate on the target processor is less than
; the target mimimum rate.
;
; If the DPC is being queued to the current processor and the DPC is not of
; low importance, the current DPC queue depth is greater than the maximum
; target depth, or the minimum DPC rate is less than the minimum target rate,
; then a DPC interrupt is request on the current processor and the DPV will
; be processed whne the interrupt occurs. Otherwise, no DPC interupt is
; requested and the DPC execution will be delayed until the DPC queue depth
; is greater that the target depth or the minimum DPC rate is less than the
; target rate.
KDPC_IMPORTANCE TYPEDEF DWORD
LowImportance equ 0
MediumImportance equ 1
HighImportance equ 2
;Deferred Procedure Call (DPC) object
KDPC STRUC
kType CSHORT ?
Number UCHAR ?
Importance UCHAR ?
DWORD ?
DpcListEntry LIST_ENTRY<>
DeferredRoutine PKDEFERRED_ROUTINE ?
DeferredContext PVOID ?
SystemArgument1 PVOID ?
SystemArgument2 PVOID ?
kLock PULONG_PTR ?
KDPC ENDS
PKDPC TYPEDEF PTR KDPC
; Interprocessor interrupt worker routine function prototype.
PKIPI_CONTEXT TYPEDEF PVOID
KIPI_WORKER TYPEDEF PROTO PacketContext:PKIPI_CONTEXT,Parameter1:PVOID,Parameter2:PVOID,Parameter3:PVOID
PKIPI_WORKER TYPEDEF PTR KIPI_WORKER
KIPI_COUNTS STRUC
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 ULONG ?
KIPI_COUNTS ENDS
PKIPI_COUNTS TYPEDEF PTR KIPI_COUNTS
;#if defined(NT_UP)
;
;#define HOT_STATISTIC(a) a
;
;#else
;
;#define HOT_STATISTIC(a) (KeGetCurrentPrcb()->a)
;
;#endif
; I/O system definitions.
;
; Define a Memory Descriptor List (MDL)
;
; An MDL describes pages in a virtual buffer in terms of physical pages. The
; pages associated with the buffer are described in an array that is allocated
; just after the MDL header structure itself. In a future compiler this will
; be placed at:
;
; ULONG Pages[];
;
; Until this declaration is permitted, however, one simply calculates the
; base of the array by adding one to the base MDL pointer:
;
; Pages = (PULONG) (Mdl + 1);
;
; Notice that while in the context of the subject thread, the base virtual
; address of a buffer mapped by an MDL may be referenced using the following:
;
; Mdl->StartVa | Mdl->ByteOffset
MDL STRUC
Next PVOID ?
mSize CSHORT ?
MdlFlags CSHORT ?
DWORD ?
Process PVOID ?
MappedSystemVa PVOID ?
StartVa PVOID ?
ByteCount ULONG ?
ByteOffset ULONG ?
MDL ENDS
PMDL TYPEDEF PTR MDL
MDL_MAPPED_TO_SYSTEM_VA equ 0001h
MDL_PAGES_LOCKED equ 0002h
MDL_SOURCE_IS_NONPAGED_POOL equ 0004h
MDL_ALLOCATED_FIXED_SIZE equ 0008h
MDL_PARTIAL equ 0010h
MDL_PARTIAL_HAS_BEEN_MAPPED equ 0020h
MDL_IO_PAGE_READ equ 0040h
MDL_WRITE_OPERATION equ 0080h
MDL_PARENT_MAPPED_SYSTEM_VA equ 0100h
MDL_LOCK_HELD equ 0200h
MDL_PHYSICAL_VIEW equ 0400h
MDL_IO_SPACE equ 0800h
MDL_NETWORK_HEADER equ 1000h
MDL_MAPPING_CAN_FAIL equ 2000h
MDL_ALLOCATED_MUST_SUCCEED equ 4000h
MDL_MAPPING_FLAGS equ MDL_MAPPED_TO_SYSTEM_VA or MDL_PAGES_LOCKED or MDL_SOURCE_IS_NONPAGED_POOL or MDL_PARTIAL_HAS_BEEN_MAPPED or \
MDL_PARENT_MAPPED_SYSTEM_VA or MDL_LOCK_HELD or MDL_SYSTEM_VA or MDL_IO_SPACE
; end_ntndis
; switch to DBG when appropriate
;#if DBG
;#define PAGED_CODE() \
; if (KeGetCurrentIrql() > APC_LEVEL) { \
; KdPrint(( "EX: Pageable code called at IRQL %d\n", KeGetCurrentIrql() )); \
; ASSERT(FALSE); \
; }
;#else
;#define PAGED_CODE()
;#endif
; Define function decoration depending on whether a driver, a file system,
; or a kernel component is being built.
; end_wdm
;#if (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_)) && !defined(_BLDR_)
;
;#define NTKERNELAPI DECLSPEC_IMPORT // wdm
;
;#else
;
;#define NTKERNELAPI
;
;#endif
; Define function decoration depending on whether the HAL or other kernel
; component is being build.
;#if !defined(_NTHAL_) && !defined(_BLDR_)
;
;#define NTHALAPI DECLSPEC_IMPORT // wdm
;
;#else
;
;#define NTHALAPI
;
;#endif
; Define an access token from a programmer's viewpoint. The structure is
; completely opaque and the programer is only allowed to have pointers
; to tokens.
PACCESS_TOKEN TYPEDEF PVOID ;winnt
PSECURITY_DESCRIPTOR TYPEDEF PVOID ;winnt
; Define a pointer to the Security ID data type (an opaque data type)
PSID TYPEDEF PVOID ;winnt
ACCESS_MASK TYPEDEF ULONG
PACCESS_MASK TYPEDEF ACCESS_MASK
;end_winnt
;The following are masks for the predefined standard access types
;
;DELETE equ 00010000h
;READ_CONTROL equ 00020000h
;WRITE_DAC equ 00040000h
;WRITE_OWNER equ 00080000h
;SYNCHRONIZE equ 00100000h
;STANDARD_RIGHTS_REQUIRED equ 000F0000h
;STANDARD_RIGHTS_READ equ READ_CONTROL
;STANDARD_RIGHTS_WRITE equ READ_CONTROL
;STANDARD_RIGHTS_EXECUTE equ READ_CONTROL
;STANDARD_RIGHTS_ALL equ 001F0000h
;SPECIFIC_RIGHTS_ALL equ 0000FFFFh
;; AccessSystemAcl access type
;ACCESS_SYSTEM_SECURITY equ 01000000h
;;MaximumAllowed access type
;#define MAXIMUM_ALLOWED (0x02000000L)
;
;//
;// These are the generic rights.
;//
;
;#define GENERIC_READ (0x80000000L)
;#define GENERIC_WRITE (0x40000000L)
;#define GENERIC_EXECUTE (0x20000000L)
;#define GENERIC_ALL (0x10000000L)
;
;
;//
;// Define the generic mapping array. This is used to denote the
;// mapping of each generic access right to a specific access mask.
;//
;
;typedef struct _GENERIC_MAPPING {
; ACCESS_MASK GenericRead;
; ACCESS_MASK GenericWrite;
; ACCESS_MASK GenericExecute;
; ACCESS_MASK GenericAll;
;} GENERIC_MAPPING;
;typedef GENERIC_MAPPING *PGENERIC_MAPPING;
;
;
;
;////////////////////////////////////////////////////////////////////////
;// //
;// LUID_AND_ATTRIBUTES //
;// //
;////////////////////////////////////////////////////////////////////////
;//
;//
;
;
;;include pshpack4.inc
;
;typedef struct _LUID_AND_ATTRIBUTES {
; LUID Luid;
; ULONG Attributes;
; } LUID_AND_ATTRIBUTES, * PLUID_AND_ATTRIBUTES;
;typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
;typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
;
;#include <poppack.h>
;
;// This is the *current* ACL revision
;
;#define ACL_REVISION (2)
;#define ACL_REVISION_DS (4)
;
;// This is the history of ACL revisions. Add a new one whenever
;// ACL_REVISION is updated
;
;#define ACL_REVISION1 (1)
;#define MIN_ACL_REVISION ACL_REVISION2
;#define ACL_REVISION2 (2)
;#define ACL_REVISION3 (3)
;#define ACL_REVISION4 (4)
;#define MAX_ACL_REVISION ACL_REVISION4
;
;typedef struct _ACL {
; UCHAR AclRevision;
; UCHAR Sbz1;
; USHORT AclSize;
; USHORT AceCount;
; USHORT Sbz2;
;} ACL;
;typedef ACL *PACL;
;
;//
;// Current security descriptor revision value
;//
;
;#define SECURITY_DESCRIPTOR_REVISION (1)
;#define SECURITY_DESCRIPTOR_REVISION1 (1)
;
;//
;// Privilege attributes
;//
;
;#define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
;#define SE_PRIVILEGE_ENABLED (0x00000002L)
;#define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
;
;//
;// Privilege Set Control flags
;//
;
;#define PRIVILEGE_SET_ALL_NECESSARY (1)
;
;//
;// Privilege Set - This is defined for a privilege set of one.
;// If more than one privilege is needed, then this structure
;// will need to be allocated with more space.
;//
;// Note: don't change this structure without fixing the INITIAL_PRIVILEGE_SET
;// structure (defined in se.h)
;//
;
;typedef struct _PRIVILEGE_SET {
; ULONG PrivilegeCount;
; ULONG Control;
; LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
; } PRIVILEGE_SET, * PPRIVILEGE_SET;
;
;//
;// These must be converted to LUIDs before use.
;//
;
;#define SE_MIN_WELL_KNOWN_PRIVILEGE (2L)
;#define SE_CREATE_TOKEN_PRIVILEGE (2L)
;#define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE (3L)
;#define SE_LOCK_MEMORY_PRIVILEGE (4L)
;#define SE_INCREASE_QUOTA_PRIVILEGE (5L)
;
;//
;// Unsolicited Input is obsolete and unused.
;//
;
;#define SE_UNSOLICITED_INPUT_PRIVILEGE (6L)
;
;#define SE_MACHINE_ACCOUNT_PRIVILEGE (6L)
;#define SE_TCB_PRIVILEGE (7L)
;#define SE_SECURITY_PRIVILEGE (8L)
;#define SE_TAKE_OWNERSHIP_PRIVILEGE (9L)
;#define SE_LOAD_DRIVER_PRIVILEGE (10L)
;#define SE_SYSTEM_PROFILE_PRIVILEGE (11L)
;#define SE_SYSTEMTIME_PRIVILEGE (12L)
;#define SE_PROF_SINGLE_PROCESS_PRIVILEGE (13L)
;#define SE_INC_BASE_PRIORITY_PRIVILEGE (14L)
;#define SE_CREATE_PAGEFILE_PRIVILEGE (15L)
;#define SE_CREATE_PERMANENT_PRIVILEGE (16L)
;#define SE_BACKUP_PRIVILEGE (17L)
;#define SE_RESTORE_PRIVILEGE (18L)
;#define SE_SHUTDOWN_PRIVILEGE (19L)
;#define SE_DEBUG_PRIVILEGE (20L)
;#define SE_AUDIT_PRIVILEGE (21L)
;#define SE_SYSTEM_ENVIRONMENT_PRIVILEGE (22L)
;#define SE_CHANGE_NOTIFY_PRIVILEGE (23L)
;#define SE_REMOTE_SHUTDOWN_PRIVILEGE (24L)
;#define SE_UNDOCK_PRIVILEGE (25L)
;#define SE_SYNC_AGENT_PRIVILEGE (26L)
;#define SE_ENABLE_DELEGATION_PRIVILEGE (27L)
;#define SE_MAX_WELL_KNOWN_PRIVILEGE (SE_ENABLE_DELEGATION_PRIVILEGE)
;
;//
;// Impersonation Level
;//
;// Impersonation level is represented by a pair of bits in Windows.
;// If a new impersonation level is added or lowest value is changed from
;// 0 to something else, fix the Windows CreateFile call.
;//
;
;typedef enum _SECURITY_IMPERSONATION_LEVEL {
; SecurityAnonymous,
; SecurityIdentification,
; SecurityImpersonation,
; SecurityDelegation
; } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
;
;#define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
;
;#define DEFAULT_IMPERSONATION_LEVEL SecurityImpersonation
;
;//
;// Security Tracking Mode
;//
;
;#define SECURITY_DYNAMIC_TRACKING (TRUE)
;#define SECURITY_STATIC_TRACKING (FALSE)
;
;typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE,
; * PSECURITY_CONTEXT_TRACKING_MODE;
;
;
;
;//
;// Quality Of Service
;//
;
;typedef struct _SECURITY_QUALITY_OF_SERVICE {
; ULONG Length;
; SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
; SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
; BOOLEAN EffectiveOnly;
; } SECURITY_QUALITY_OF_SERVICE, * PSECURITY_QUALITY_OF_SERVICE;
;
;
;//
;// Used to represent information related to a thread impersonation
;//
;
;typedef struct _SE_IMPERSONATION_STATE {
; PACCESS_TOKEN Token;
; BOOLEAN CopyOnOpen;
; BOOLEAN EffectiveOnly;
; SECURITY_IMPERSONATION_LEVEL Level;
;} SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
;
;
;typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;
;
;#define OWNER_SECURITY_INFORMATION (0x00000001L)
;#define GROUP_SECURITY_INFORMATION (0x00000002L)
;#define DACL_SECURITY_INFORMATION (0x00000004L)
;#define SACL_SECURITY_INFORMATION (0x00000008L)
;
;#define PROTECTED_DACL_SECURITY_INFORMATION (0x80000000L)
;#define PROTECTED_SACL_SECURITY_INFORMATION (0x40000000L)
;#define UNPROTECTED_DACL_SECURITY_INFORMATION (0x20000000L)
;#define UNPROTECTED_SACL_SECURITY_INFORMATION (0x10000000L)
;
;
;#define LOW_PRIORITY 0 // Lowest thread priority level
;#define LOW_REALTIME_PRIORITY 16 // Lowest realtime priority level
;#define HIGH_PRIORITY 31 // Highest thread priority level
;#define MAXIMUM_PRIORITY 32 // Number of thread priority levels
;// begin_winnt
;#define MAXIMUM_WAIT_OBJECTS 64 // Maximum number of wait objects
;
;#define MAXIMUM_SUSPEND_COUNT MAXCHAR // Maximum times thread can be suspended
;// end_winnt
;
;//
;// Thread affinity
;//
;
;typedef ULONG KAFFINITY;
;typedef KAFFINITY *PKAFFINITY;
;
;//
;// Thread priority
;//
;
;typedef LONG KPRIORITY;
;
;//
;// Spin Lock
;//
;
;// begin_ntndis begin_winnt
;
;typedef ULONG_PTR KSPIN_LOCK;
;typedef KSPIN_LOCK *PKSPIN_LOCK;
;
;// end_ntndis end_winnt
;
;//
;// Interrupt routine (first level dispatch)
;//
;
;typedef
;VOID
;(*PKINTERRUPT_ROUTINE) (
; VOID
; );
;
;//
;// Profile source types
;//
;typedef enum _KPROFILE_SOURCE {
; ProfileTime,
; ProfileAlignmentFixup,
; ProfileTotalIssues,
; ProfilePipelineDry,
; ProfileLoadInstructions,
; ProfilePipelineFrozen,
; ProfileBranchInstructions,
; ProfileTotalNonissues,
; ProfileDcacheMisses,
; ProfileIcacheMisses,
; ProfileCacheMisses,
; ProfileBranchMispredictions,
; ProfileStoreInstructions,
; ProfileFpInstructions,
; ProfileIntegerInstructions,
; Profile2Issue,
; Profile3Issue,
; Profile4Issue,
; ProfileSpecialInstructions,
; ProfileTotalCycles,
; ProfileIcacheIssues,
; ProfileDcacheAccesses,
; ProfileMemoryBarrierCycles,
; ProfileLoadLinkedIssues,
; ProfileMaximum
;} KPROFILE_SOURCE;
;
;//
;// for move macros
;//
;#ifdef _MAC
;#ifndef _INC_STRING
;#include <string.h>
;#endif /* _INC_STRING */
;#else
;#include <string.h>
;#endif // _MAC
;
;//
;// If debugging support enabled, define an ASSERT macro that works. Otherwise
;// define the ASSERT macro to expand to an empty expression.
;//
;
;#if DBG
;NTSYSAPI
;VOID
;NTAPI
;RtlAssert(
; PVOID FailedAssertion,
; PVOID FileName,
; ULONG LineNumber,
; PCHAR Message
; );
;
;#define ASSERT( exp ) \
; if (!(exp)) \
; RtlAssert( #exp, __FILE__, __LINE__, NULL )
;
;#define ASSERTMSG( msg, exp ) \
; if (!(exp)) \
; RtlAssert( #exp, __FILE__, __LINE__, msg )
;
;#else
;#define ASSERT( exp )
;#define ASSERTMSG( msg, exp )
;#endif // DBG
;
;//
;// Doubly-linked list manipulation routines. Implemented as macros
;// but logically these are procedures.
;//
;
;//
;// VOID
;// InitializeListHead(
;// PLIST_ENTRY ListHead
;// );
;//
;
;#define InitializeListHead(ListHead) (\
; (ListHead)->Flink = (ListHead)->Blink = (ListHead))
;
;//
;// BOOLEAN
;// IsListEmpty(
;// PLIST_ENTRY ListHead
;// );
;//
;
;#define IsListEmpty(ListHead) \
; ((ListHead)->Flink == (ListHead))
;
;//
;// PLIST_ENTRY
;// RemoveHeadList(
;// PLIST_ENTRY ListHead
;// );
;//
;
;#define RemoveHeadList(ListHead) \
; (ListHead)->Flink;\
; {RemoveEntryList((ListHead)->Flink)}
;
;//
;// PLIST_ENTRY
;// RemoveTailList(
;// PLIST_ENTRY ListHead
;// );
;//
;
;#define RemoveTailList(ListHead) \
; (ListHead)->Blink;\
; {RemoveEntryList((ListHead)->Blink)}
;
;//
;// VOID
;// RemoveEntryList(
;// PLIST_ENTRY Entry
;// );
;//
;
;#define RemoveEntryList(Entry) {\
; PLIST_ENTRY _EX_Blink;\
; PLIST_ENTRY _EX_Flink;\
; _EX_Flink = (Entry)->Flink;\
; _EX_Blink = (Entry)->Blink;\
; _EX_Blink->Flink = _EX_Flink;\
; _EX_Flink->Blink = _EX_Blink;\
; }
;
;//
;// VOID
;// InsertTailList(
;// PLIST_ENTRY ListHead,
;// PLIST_ENTRY Entry
;// );
;//
;
;#define InsertTailList(ListHead,Entry) {\
; PLIST_ENTRY _EX_Blink;\
; PLIST_ENTRY _EX_ListHead;\
; _EX_ListHead = (ListHead);\
; _EX_Blink = _EX_ListHead->Blink;\
; (Entry)->Flink = _EX_ListHead;\
; (Entry)->Blink = _EX_Blink;\
; _EX_Blink->Flink = (Entry);\
; _EX_ListHead->Blink = (Entry);\
; }
;
;//
;// VOID
;// InsertHeadList(
;// PLIST_ENTRY ListHead,
;// PLIST_ENTRY Entry
;// );
;//
;
;#define InsertHeadList(ListHead,Entry) {\
; PLIST_ENTRY _EX_Flink;\
; PLIST_ENTRY _EX_ListHead;\
; _EX_ListHead = (ListHead);\
; _EX_Flink = _EX_ListHead->Flink;\
; (Entry)->Flink = _EX_Flink;\
; (Entry)->Blink = _EX_ListHead;\
; _EX_Flink->Blink = (Entry);\
; _EX_ListHead->Flink = (Entry);\
; }
;
;//
;//
;// PSINGLE_LIST_ENTRY
;// PopEntryList(
;// PSINGLE_LIST_ENTRY ListHead
;// );
;//
;
;#define PopEntryList(ListHead) \
; (ListHead)->Next;\
; {\
; PSINGLE_LIST_ENTRY FirstEntry;\
; FirstEntry = (ListHead)->Next;\
; if (FirstEntry != NULL) { \
; (ListHead)->Next = FirstEntry->Next;\
; } \
; }
;
;
;//
;// VOID
;// PushEntryList(
;// PSINGLE_LIST_ENTRY ListHead,
;// PSINGLE_LIST_ENTRY Entry
;// );
;//
;
;#define PushEntryList(ListHead,Entry) \
; (Entry)->Next = (ListHead)->Next; \
; (ListHead)->Next = (Entry)
;
;// end_wdm end_nthal end_ntifs end_ntndis
;
;
;
;#if defined(_M_ALPHA) || defined(_M_AXP64) || defined(_M_IA64)
;PVOID
;_ReturnAddress (
; VOID
; );
;
;#pragma intrinsic(_ReturnAddress)
;
;#define RtlGetCallersAddress(CallersAddress, CallersCaller) \
; *CallersAddress = (PVOID)_ReturnAddress(); \
; *CallersCaller = NULL;
;#else
;NTSYSAPI
;VOID
;NTAPI
;RtlGetCallersAddress(
; OUT PVOID *CallersAddress,
; OUT PVOID *CallersCaller
; );
;#endif
;
;NTSYSAPI
;ULONG
;NTAPI
;RtlWalkFrameChain (
; OUT PVOID *Callers,
; IN ULONG Count,
; IN ULONG Flags);
;
;//
;// Subroutines for dealing with the Registry
;//
;
;typedef NTSTATUS (NTAPI * PRTL_QUERY_REGISTRY_ROUTINE)(
; IN PWSTR ValueName,
; IN ULONG ValueType,
; IN PVOID ValueData,
; IN ULONG ValueLength,
; IN PVOID Context,
; IN PVOID EntryContext
; );
;
;typedef struct _RTL_QUERY_REGISTRY_TABLE {
; PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
; ULONG Flags;
; PWSTR Name;
; PVOID EntryContext;
; ULONG DefaultType;
; PVOID DefaultData;
; ULONG DefaultLength;
;
;} RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
;
;
;//
;// The following flags specify how the Name field of a RTL_QUERY_REGISTRY_TABLE
;// entry is interpreted. A NULL name indicates the end of the table.
;//
;
;#define RTL_QUERY_REGISTRY_SUBKEY 0x00000001 // Name is a subkey and remainder of
; // table or until next subkey are value
; // names for that subkey to look at.
;
;#define RTL_QUERY_REGISTRY_TOPKEY 0x00000002 // Reset current key to original key for
; // this and all following table entries.
;
;#define RTL_QUERY_REGISTRY_REQUIRED 0x00000004 // Fail if no match found for this table
; // entry.
;
;#define RTL_QUERY_REGISTRY_NOVALUE 0x00000008 // Used to mark a table entry that has no
; // value name, just wants a call out, not
; // an enumeration of all values.
;
;#define RTL_QUERY_REGISTRY_NOEXPAND 0x00000010 // Used to suppress the expansion of
; // REG_MULTI_SZ into multiple callouts or
; // to prevent the expansion of environment
; // variable values in REG_EXPAND_SZ
;
;#define RTL_QUERY_REGISTRY_DIRECT 0x00000020 // QueryRoutine field ignored. EntryContext
; // field points to location to store value.
; // For null terminated strings, EntryContext
; // points to UNICODE_STRING structure that
; // that describes maximum size of buffer.
; // If .Buffer field is NULL then a buffer is
; // allocated.
; //
;
;#define RTL_QUERY_REGISTRY_DELETE 0x00000040 // Used to delete value keys after they
; // are queried.
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlQueryRegistryValues(
; IN ULONG RelativeTo,
; IN PCWSTR Path,
; IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
; IN PVOID Context,
; IN PVOID Environment OPTIONAL
; );
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlWriteRegistryValue(
; IN ULONG RelativeTo,
; IN PCWSTR Path,
; IN PCWSTR ValueName,
; IN ULONG ValueType,
; IN PVOID ValueData,
; IN ULONG ValueLength
; );
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlDeleteRegistryValue(
; IN ULONG RelativeTo,
; IN PCWSTR Path,
; IN PCWSTR ValueName
; );
;
;// end_wdm
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlCreateRegistryKey(
; IN ULONG RelativeTo,
; IN PWSTR Path
; );
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlCheckRegistryKey(
; IN ULONG RelativeTo,
; IN PWSTR Path
; );
;
;// begin_wdm
;//
;// The following values for the RelativeTo parameter determine what the
;// Path parameter to RtlQueryRegistryValues is relative to.
;//
;
RTL_REGISTRY_ABSOLUTE equ 0 ; Path is a full path
RTL_REGISTRY_SERVICES equ 1 ; \Registry\Machine\System\CurrentControlSet\Services
RTL_REGISTRY_CONTROL equ 2 ; \Registry\Machine\System\CurrentControlSet\Control
RTL_REGISTRY_WINDOWS_NT equ 3 ; \Registry\Machine\Software\Microsoft\Windows NT\CurrentVersion
RTL_REGISTRY_DEVICEMAP equ 4 ; \Registry\Machine\Hardware\DeviceMap
RTL_REGISTRY_USER equ 5 ; \Registry\User\CurrentUser
RTL_REGISTRY_MAXIMUM equ 6
RTL_REGISTRY_HANDLE equ 40000000h ; Low order bits are registry handle
RTL_REGISTRY_OPTIONAL equ 80000000h ; Indicates the key node is optional
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlCharToInteger (
; PCSZ String,
; ULONG Base,
; PULONG Value
; );
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlIntegerToUnicodeString (
; ULONG Value,
; ULONG Base,
; PUNICODE_STRING String
; );
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlInt64ToUnicodeString (
; IN ULONGLONG Value,
; IN ULONG Base OPTIONAL,
; IN OUT PUNICODE_STRING String
; );
;
;#ifdef _WIN64
;#define RtlIntPtrToUnicodeString(Value, Base, String) RtlInt64ToUnicodeString(Value, Base, String)
;#else
;#define RtlIntPtrToUnicodeString(Value, Base, String) RtlIntegerToUnicodeString(Value, Base, String)
;#endif
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlUnicodeStringToInteger (
; PUNICODE_STRING String,
; ULONG Base,
; PULONG Value
; );
;
;
;//
;// String manipulation routines
;//
;
;#ifdef _NTSYSTEM_
;
;#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 // _NTSYSTEM_
;
;extern BOOLEAN NLS_MB_CODE_PAGE_TAG; // TRUE -> Multibyte CP, FALSE -> Singlebyte
;extern BOOLEAN NLS_MB_OEM_CODE_PAGE_TAG; // TRUE -> Multibyte CP, FALSE -> Singlebyte
;
;NTSYSAPI
;VOID
;NTAPI
;RtlInitString(
; PSTRING DestinationString,
; PCSZ SourceString
; );
;
;NTSYSAPI
;VOID
;NTAPI
;RtlInitAnsiString(
; PANSI_STRING DestinationString,
; PCSZ SourceString
; );
;
;NTSYSAPI
;VOID
;NTAPI
;RtlInitUnicodeString(
; PUNICODE_STRING DestinationString,
; PCWSTR SourceString
; );
;
;
;NTSYSAPI
;VOID
;NTAPI
;RtlCopyString(
; PSTRING DestinationString,
; PSTRING SourceString
; );
;
;NTSYSAPI
;CHAR
;NTAPI
;RtlUpperChar (
; CHAR Character
; );
;
;NTSYSAPI
;LONG
;NTAPI
;RtlCompareString(
; PSTRING String1,
; PSTRING String2,
; BOOLEAN CaseInSensitive
; );
;
;NTSYSAPI
;BOOLEAN
;NTAPI
;RtlEqualString(
; PSTRING String1,
; PSTRING String2,
; BOOLEAN CaseInSensitive
; );
;
;
;NTSYSAPI
;VOID
;NTAPI
;RtlUpperString(
; PSTRING DestinationString,
; PSTRING SourceString
; );
;
;//
;// NLS String functions
;//
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlAnsiStringToUnicodeString(
; PUNICODE_STRING DestinationString,
; PANSI_STRING SourceString,
; BOOLEAN AllocateDestinationString
; );
;
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlUnicodeStringToAnsiString(
; PANSI_STRING DestinationString,
; PUNICODE_STRING SourceString,
; BOOLEAN AllocateDestinationString
; );
;
;
;NTSYSAPI
;LONG
;NTAPI
;RtlCompareUnicodeString(
; PUNICODE_STRING String1,
; PUNICODE_STRING String2,
; BOOLEAN CaseInSensitive
; );
;
;NTSYSAPI
;BOOLEAN
;NTAPI
;RtlEqualUnicodeString(
; const UNICODE_STRING *String1,
; const UNICODE_STRING *String2,
; BOOLEAN CaseInSensitive
; );
;
;// end_wdm
;
;NTSYSAPI
;BOOLEAN
;NTAPI
;RtlPrefixUnicodeString(
; IN PUNICODE_STRING String1,
; IN PUNICODE_STRING String2,
; IN BOOLEAN CaseInSensitive
; );
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlUpcaseUnicodeString(
; PUNICODE_STRING DestinationString,
; PCUNICODE_STRING SourceString,
; BOOLEAN AllocateDestinationString
; );
;
;
;NTSYSAPI
;VOID
;NTAPI
;RtlCopyUnicodeString(
; PUNICODE_STRING DestinationString,
; PUNICODE_STRING SourceString
; );
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlAppendUnicodeStringToString (
; PUNICODE_STRING Destination,
; PUNICODE_STRING Source
; );
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlAppendUnicodeToString (
; PUNICODE_STRING Destination,
; PCWSTR Source
; );
;
;// end_ntndis end_wdm
;
;NTSYSAPI
;WCHAR
;NTAPI
;RtlUpcaseUnicodeChar(
; WCHAR SourceCharacter
; );
;
;// begin_wdm
;
;NTSYSAPI
;VOID
;NTAPI
;RtlFreeUnicodeString(
; PUNICODE_STRING UnicodeString
; );
;
;NTSYSAPI
;VOID
;NTAPI
;RtlFreeAnsiString(
; PANSI_STRING AnsiString
; );
;
;
;NTSYSAPI
;ULONG
;NTAPI
;RtlxAnsiStringToUnicodeSize(
; PANSI_STRING AnsiString
; );
;
;//
;// NTSYSAPI
;// ULONG
;// NTAPI
;// RtlAnsiStringToUnicodeSize(
;// PANSI_STRING AnsiString
;// );
;//
;
;#define RtlAnsiStringToUnicodeSize(STRING) ( \
; NLS_MB_CODE_PAGE_TAG ? \
; RtlxAnsiStringToUnicodeSize(STRING) : \
; ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
;)
;
;
;// begin_ntminiport
;
;#include <guiddef.h>
;
;// end_ntminiport
;
;#ifndef DEFINE_GUIDEX
; #define DEFINE_GUIDEX(name) EXTERN_C const CDECL GUID name
;#endif // !defined(DEFINE_GUIDEX)
;
;#ifndef STATICGUIDOF
; #define STATICGUIDOF(guid) STATIC_##guid
;#endif // !defined(STATICGUIDOF)
;
;#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 // !__cplusplus
; #define IsEqualGUIDAligned(guid1, guid2) \
; ((*(PLONGLONG)(guid1) == *(PLONGLONG)(guid2)) && (*((PLONGLONG)(guid1) + 1) == *((PLONGLONG)(guid2) + 1)))
; #endif // !__cplusplus
;#endif // !__IID_ALIGNED__
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlStringFromGUID(
; IN REFGUID Guid,
; OUT PUNICODE_STRING GuidString
; );
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlGUIDFromString(
; IN PUNICODE_STRING GuidString,
; OUT GUID* Guid
; );
;
;//
;// Fast primitives to compare, move, and zero memory
;//
;
;// begin_winnt begin_ntndis
;
;NTSYSAPI
;SIZE_T
;NTAPI
;RtlCompareMemory (
; const VOID *Source1,
; const VOID *Source2,
; SIZE_T Length
; );
;
;#if defined(_M_AXP64) || defined(_M_IA64)
;
;#define RtlEqualMemory(Source1, Source2, Length) \
; ((Length) == RtlCompareMemory(Source1, Source2, Length))
;
;NTSYSAPI
;VOID
;NTAPI
;RtlCopyMemory (
; VOID UNALIGNED *Destination,
; CONST VOID UNALIGNED *Source,
; SIZE_T Length
; );
;
;NTSYSAPI
;VOID
;NTAPI
;RtlCopyMemory32 (
; VOID UNALIGNED *Destination,
; CONST VOID UNALIGNED *Source,
; ULONG Length
; );
;
;NTSYSAPI
;VOID
;NTAPI
;RtlMoveMemory (
; VOID UNALIGNED *Destination,
; CONST VOID UNALIGNED *Source,
; SIZE_T Length
; );
;
;NTSYSAPI
;VOID
;NTAPI
;RtlFillMemory (
; VOID UNALIGNED *Destination,
; SIZE_T Length,
; UCHAR Fill
; );
;
;NTSYSAPI
;VOID
;NTAPI
;RtlZeroMemory (
; VOID UNALIGNED *Destination,
; SIZE_T Length
; );
;
;#else
;
;#define RtlEqualMemory(Destination,Source,Length) (!memcmp((Destination),(Source),(Length)))
;#define RtlMoveMemory(Destination,Source,Length) memmove((Destination),(Source),(Length))
;#define RtlCopyMemory(Destination,Source,Length) memcpy((Destination),(Source),(Length))
;#define RtlFillMemory(Destination,Length,Fill) memset((Destination),(Fill),(Length))
;#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))
;
;#endif
;
;// end_ntndis end_winnt
;
;#if defined(_M_ALPHA)
;
;//
;// Guaranteed byte granularity memory copy function.
;//
;
;NTSYSAPI
;VOID
;NTAPI
;RtlCopyBytes (
; PVOID Destination,
; CONST VOID *Source,
; SIZE_T Length
; );
;
;//
;// Guaranteed byte granularity memory zero function.
;//
;
;NTSYSAPI
;VOID
;NTAPI
;RtlZeroBytes (
; PVOID Destination,
; SIZE_T Length
; );
;
;//
;// Guaranteed byte granularity memory fill function.
;//
;
;NTSYSAPI
;VOID
;NTAPI
;RtlFillBytes (
; PVOID Destination,
; SIZE_T Length,
; UCHAR Fill
; );
;
;#else
;
;#define RtlCopyBytes RtlCopyMemory
;#define RtlZeroBytes RtlZeroMemory
;#define RtlFillBytes RtlFillMemory
;
;#endif
;
;//
;// Define kernel debugger print prototypes and macros.
;//
;// N.B. The following function cannot be directly imported because there are
;// a few places in the source tree where this function is redefined.
;//
;
;VOID
;NTAPI
;DbgBreakPoint(
; VOID
; );
;
;// end_wdm
;
;NTSYSAPI
;VOID
;NTAPI
;DbgBreakPointWithStatus(
; IN ULONG Status
; );
;
;// begin_wdm
;
;#define DBG_STATUS_CONTROL_C 1
;#define DBG_STATUS_SYSRQ 2
;#define DBG_STATUS_BUGCHECK_FIRST 3
;#define DBG_STATUS_BUGCHECK_SECOND 4
;#define DBG_STATUS_FATAL 5
;#define DBG_STATUS_DEBUG_CONTROL 6
;
;#if DBG
;
;#define KdPrint(_x_) DbgPrint _x_
;#define KdBreakPoint() DbgBreakPoint()
;
;// end_wdm
;
;#define KdBreakPointWithStatus(s) DbgBreakPointWithStatus(s)
;
;// begin_wdm
;
;#else
;
;#define KdPrint(_x_)
;#define KdBreakPoint()
;
;// end_wdm
;
;#define KdBreakPointWithStatus(s)
;
;// begin_wdm
;#endif
;
;#ifndef _DBGNT_
;
;ULONG
;_cdecl
;DbgPrint(
; PCH Format,
; ...
; );
;
;// end_wdm
;
;ULONG
;_cdecl
;DbgPrintReturnControlC(
; PCH Format,
; ...
; );
;
;// begin_wdm
;#endif // _DBGNT_
;//
;// Large integer arithmetic routines.
;//
;
;//
;// Large integer add - 64-bits + 64-bits -> 64-bits
;//
;
;#if !defined(MIDL_PASS)
;
;__inline
;LARGE_INTEGER
;NTAPI
;RtlLargeIntegerAdd (
; LARGE_INTEGER Addend1,
; LARGE_INTEGER Addend2
; )
;{
; LARGE_INTEGER Sum;
;
; Sum.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
; return Sum;
;}
;
;//
;// Enlarged integer multiply - 32-bits * 32-bits -> 64-bits
;//
;
;__inline
;LARGE_INTEGER
;NTAPI
;RtlEnlargedIntegerMultiply (
; LONG Multiplicand,
; LONG Multiplier
; )
;{
; LARGE_INTEGER Product;
;
; Product.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
; return Product;
;}
;
;//
;// Unsigned enlarged integer multiply - 32-bits * 32-bits -> 64-bits
;//
;
;__inline
;LARGE_INTEGER
;NTAPI
;RtlEnlargedUnsignedMultiply (
; ULONG Multiplicand,
; ULONG Multiplier
; )
;{
; LARGE_INTEGER Product;
;
; Product.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
; return Product;
;}
;
;//
;// Enlarged integer divide - 64-bits / 32-bits > 32-bits
;//
;
;__inline
;ULONG
;NTAPI
;RtlEnlargedUnsignedDivide (
; IN ULARGE_INTEGER Dividend,
; IN ULONG Divisor,
; IN PULONG Remainder
; )
;{
; ULONG Quotient;
;
; Quotient = (ULONG)(Dividend.QuadPart / Divisor);
; if (ARGUMENT_PRESENT( Remainder )) {
;
; *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
; }
;
; return Quotient;
;}
;
;//
;// Large integer negation - -(64-bits)
;//
;
;__inline
;LARGE_INTEGER
;NTAPI
;RtlLargeIntegerNegate (
; LARGE_INTEGER Subtrahend
; )
;{
; LARGE_INTEGER Difference;
;
; Difference.QuadPart = -Subtrahend.QuadPart;
; return Difference;
;}
;
;//
;// Large integer subtract - 64-bits - 64-bits -> 64-bits.
;//
;
;__inline
;LARGE_INTEGER
;NTAPI
;RtlLargeIntegerSubtract (
; LARGE_INTEGER Minuend,
; LARGE_INTEGER Subtrahend
; )
;{
; LARGE_INTEGER Difference;
;
; Difference.QuadPart = Minuend.QuadPart - Subtrahend.QuadPart;
; return Difference;
;}
;
;#endif
;
;//
;// Extended large integer magic divide - 64-bits / 32-bits -> 64-bits
;//
;
;NTSYSAPI
;LARGE_INTEGER
;NTAPI
;RtlExtendedMagicDivide (
; LARGE_INTEGER Dividend,
; LARGE_INTEGER MagicDivisor,
; CCHAR ShiftCount
; );
;
;//
;// Large Integer divide - 64-bits / 32-bits -> 64-bits
;//
;
;NTSYSAPI
;LARGE_INTEGER
;NTAPI
;RtlExtendedLargeIntegerDivide (
; LARGE_INTEGER Dividend,
; ULONG Divisor,
; PULONG Remainder
; );
;
;// end_wdm
;//
;// Large Integer divide - 64-bits / 32-bits -> 64-bits
;//
;
;NTSYSAPI
;LARGE_INTEGER
;NTAPI
;RtlLargeIntegerDivide (
; LARGE_INTEGER Dividend,
; LARGE_INTEGER Divisor,
; PLARGE_INTEGER Remainder
; );
;
;// begin_wdm
;//
;// Extended integer multiply - 32-bits * 64-bits -> 64-bits
;//
;
;NTSYSAPI
;LARGE_INTEGER
;NTAPI
;RtlExtendedIntegerMultiply (
; LARGE_INTEGER Multiplicand,
; LONG Multiplier
; );
;
;//
;// Large integer and - 64-bite & 64-bits -> 64-bits.
;//
;
;#define RtlLargeIntegerAnd(Result, Source, Mask) \
; { \
; Result.HighPart = Source.HighPart & Mask.HighPart; \
; Result.LowPart = Source.LowPart & Mask.LowPart; \
; }
;
;//
;// Large integer conversion routines.
;//
;
;#if defined(MIDL_PASS) || defined(__cplusplus) || !defined(_M_IX86)
;
;//
;// Convert signed integer to large integer.
;//
;
;NTSYSAPI
;LARGE_INTEGER
;NTAPI
;RtlConvertLongToLargeInteger (
; LONG SignedInteger
; );
;
;//
;// Convert unsigned integer to large integer.
;//
;
;NTSYSAPI
;LARGE_INTEGER
;NTAPI
;RtlConvertUlongToLargeInteger (
; ULONG UnsignedInteger
; );
;
;
;//
;// Large integer shift routines.
;//
;
;NTSYSAPI
;LARGE_INTEGER
;NTAPI
;RtlLargeIntegerShiftLeft (
; LARGE_INTEGER LargeInteger,
; CCHAR ShiftCount
; );
;
;NTSYSAPI
;LARGE_INTEGER
;NTAPI
;RtlLargeIntegerShiftRight (
; LARGE_INTEGER LargeInteger,
; CCHAR ShiftCount
; );
;
;NTSYSAPI
;LARGE_INTEGER
;NTAPI
;RtlLargeIntegerArithmeticShift (
; LARGE_INTEGER LargeInteger,
; CCHAR ShiftCount
; );
;
;#else
;
;#if _MSC_VER >= 1200
;#pragma warning(push)
;#endif
;#pragma warning(disable:4035) // re-enable below
;
;//
;// Convert signed integer to large integer.
;//
;
;__inline LARGE_INTEGER
;NTAPI
;RtlConvertLongToLargeInteger (
; LONG SignedInteger
; )
;{
; __asm {
; mov eax, SignedInteger
; cdq ; (edx:eax) = signed LargeInt
; }
;}
;
;//
;// Convert unsigned integer to large integer.
;//
;
;__inline LARGE_INTEGER
;NTAPI
;RtlConvertUlongToLargeInteger (
; ULONG UnsignedInteger
; )
;{
; __asm {
; sub edx, edx ; zero highpart
; mov eax, UnsignedInteger
; }
;}
;
;//
;// Large integer shift routines.
;//
;
;__inline LARGE_INTEGER
;NTAPI
;RtlLargeIntegerShiftLeft (
; LARGE_INTEGER LargeInteger,
; CCHAR ShiftCount
; )
;{
; __asm {
; mov cl, ShiftCount
; and cl, 0x3f ; mod 64
;
; cmp cl, 32
; jc short sl10
;
; mov edx, LargeInteger.LowPart ; ShiftCount >= 32
; xor eax, eax ; lowpart is zero
; shl edx, cl ; store highpart
; jmp short done
;
;sl10:
; mov eax, LargeInteger.LowPart ; ShiftCount < 32
; mov edx, LargeInteger.HighPart
; shld edx, eax, cl
; shl eax, cl
;done:
; }
;}
;
;
;__inline LARGE_INTEGER
;NTAPI
;RtlLargeIntegerShiftRight (
; LARGE_INTEGER LargeInteger,
; CCHAR ShiftCount
; )
;{
; __asm {
; mov cl, ShiftCount
; and cl, 0x3f ; mod 64
;
; cmp cl, 32
; jc short sr10
;
; mov eax, LargeInteger.HighPart ; ShiftCount >= 32
; xor edx, edx ; lowpart is zero
; shr eax, cl ; store highpart
; jmp short done
;
;sr10:
; mov eax, LargeInteger.LowPart ; ShiftCount < 32
; mov edx, LargeInteger.HighPart
; shrd eax, edx, cl
; shr edx, cl
;done:
; }
;}
;
;
;__inline LARGE_INTEGER
;NTAPI
;RtlLargeIntegerArithmeticShift (
; LARGE_INTEGER LargeInteger,
; CCHAR ShiftCount
; )
;{
; __asm {
; mov cl, ShiftCount
; and cl, 3fh ; mod 64
;
; cmp cl, 32
; jc short sar10
;
; mov eax, LargeInteger.HighPart
; sar eax, cl
; bt eax, 31 ; sign bit set?
; sbb edx, edx ; duplicate sign bit into highpart
; jmp short done
;sar10:
; mov eax, LargeInteger.LowPart ; (eax) = LargeInteger.LowPart
; mov edx, LargeInteger.HighPart ; (edx) = LargeInteger.HighPart
; shrd eax, edx, cl
; sar edx, cl
;done:
; }
;}
;
;#if _MSC_VER >= 1200
;#pragma warning(pop)
;#else
;#pragma warning(default:4035)
;#endif
;
;#endif
;
;//
;// Large integer comparison routines.
;//
;// BOOLEAN
;// RtlLargeIntegerGreaterThan (
;// LARGE_INTEGER Operand1,
;// LARGE_INTEGER Operand2
;// );
;//
;// BOOLEAN
;// RtlLargeIntegerGreaterThanOrEqualTo (
;// LARGE_INTEGER Operand1,
;// LARGE_INTEGER Operand2
;// );
;//
;// BOOLEAN
;// RtlLargeIntegerEqualTo (
;// LARGE_INTEGER Operand1,
;// LARGE_INTEGER Operand2
;// );
;//
;// BOOLEAN
;// RtlLargeIntegerNotEqualTo (
;// LARGE_INTEGER Operand1,
;// LARGE_INTEGER Operand2
;// );
;//
;// BOOLEAN
;// RtlLargeIntegerLessThan (
;// LARGE_INTEGER Operand1,
;// LARGE_INTEGER Operand2
;// );
;//
;// BOOLEAN
;// RtlLargeIntegerLessThanOrEqualTo (
;// LARGE_INTEGER Operand1,
;// LARGE_INTEGER Operand2
;// );
;//
;// BOOLEAN
;// RtlLargeIntegerGreaterThanZero (
;// LARGE_INTEGER Operand
;// );
;//
;// BOOLEAN
;// RtlLargeIntegerGreaterOrEqualToZero (
;// LARGE_INTEGER Operand
;// );
;//
;// BOOLEAN
;// RtlLargeIntegerEqualToZero (
;// LARGE_INTEGER Operand
;// );
;//
;// BOOLEAN
;// RtlLargeIntegerNotEqualToZero (
;// LARGE_INTEGER Operand
;// );
;//
;// BOOLEAN
;// RtlLargeIntegerLessThanZero (
;// LARGE_INTEGER Operand
;// );
;//
;// BOOLEAN
;// RtlLargeIntegerLessOrEqualToZero (
;// LARGE_INTEGER Operand
;// );
;//
;
;#define RtlLargeIntegerGreaterThan(X,Y) ( \
; (((X).HighPart == (Y).HighPart) && ((X).LowPart > (Y).LowPart)) || \
; ((X).HighPart > (Y).HighPart) \
;)
;
;#define RtlLargeIntegerGreaterThanOrEqualTo(X,Y) ( \
; (((X).HighPart == (Y).HighPart) && ((X).LowPart >= (Y).LowPart)) || \
; ((X).HighPart > (Y).HighPart) \
;)
;
;#define RtlLargeIntegerEqualTo(X,Y) ( \
; !(((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \
;)
;
;#define RtlLargeIntegerNotEqualTo(X,Y) ( \
; (((X).LowPart ^ (Y).LowPart) | ((X).HighPart ^ (Y).HighPart)) \
;)
;
;#define RtlLargeIntegerLessThan(X,Y) ( \
; (((X).HighPart == (Y).HighPart) && ((X).LowPart < (Y).LowPart)) || \
; ((X).HighPart < (Y).HighPart) \
;)
;
;#define RtlLargeIntegerLessThanOrEqualTo(X,Y) ( \
; (((X).HighPart == (Y).HighPart) && ((X).LowPart <= (Y).LowPart)) || \
; ((X).HighPart < (Y).HighPart) \
;)
;
;#define RtlLargeIntegerGreaterThanZero(X) ( \
; (((X).HighPart == 0) && ((X).LowPart > 0)) || \
; ((X).HighPart > 0 ) \
;)
;
;#define RtlLargeIntegerGreaterOrEqualToZero(X) ( \
; (X).HighPart >= 0 \
;)
;
;#define RtlLargeIntegerEqualToZero(X) ( \
; !((X).LowPart | (X).HighPart) \
;)
;
;#define RtlLargeIntegerNotEqualToZero(X) ( \
; ((X).LowPart | (X).HighPart) \
;)
;
;#define RtlLargeIntegerLessThanZero(X) ( \
; ((X).HighPart < 0) \
;)
;
;#define RtlLargeIntegerLessOrEqualToZero(X) ( \
; ((X).HighPart < 0) || !((X).LowPart | (X).HighPart) \
;)
;
;
;//
;// Time conversion routines
;//
;
;typedef struct _TIME_FIELDS {
; CSHORT Year; // range [1601...]
; CSHORT Month; // range [1..12]
; CSHORT Day; // range [1..31]
; CSHORT Hour; // range [0..23]
; CSHORT Minute; // range [0..59]
; CSHORT Second; // range [0..59]
; CSHORT Milliseconds;// range [0..999]
; CSHORT Weekday; // range [0..6] == [Sunday..Saturday]
;} TIME_FIELDS;
;typedef TIME_FIELDS *PTIME_FIELDS;
;
;
;NTSYSAPI
;VOID
;NTAPI
;RtlTimeToTimeFields (
; PLARGE_INTEGER Time,
; PTIME_FIELDS TimeFields
; );
;
;//
;// A time field record (Weekday ignored) -> 64 bit Time value
;//
;
;NTSYSAPI
;BOOLEAN
;NTAPI
;RtlTimeFieldsToTime (
; PTIME_FIELDS TimeFields,
; PLARGE_INTEGER Time
; );
;
;//
;// The following macros store and retrieve USHORTS and ULONGS from potentially
;// unaligned addresses, avoiding alignment faults. they should probably be
;// rewritten in assembler
;//
;
;#define SHORT_SIZE (sizeof(USHORT))
;#define SHORT_MASK (SHORT_SIZE - 1)
;#define LONG_SIZE (sizeof(LONG))
;#define LONGLONG_SIZE (sizeof(LONGLONG))
;#define LONG_MASK (LONG_SIZE - 1)
;#define LONGLONG_MASK (LONGLONG_SIZE - 1)
;#define LOWBYTE_MASK 0x00FF
;
;#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)
;
;//
;// if MIPS Big Endian, order of bytes is reversed.
;//
;
;#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
;
;//++
;//
;// VOID
;// RtlStoreUshort (
;// PUSHORT ADDRESS
;// USHORT VALUE
;// )
;//
;// Routine Description:
;//
;// This macro stores a USHORT value in at a particular address, avoiding
;// alignment faults.
;//
;// Arguments:
;//
;// ADDRESS - where to store USHORT value
;// VALUE - USHORT to store
;//
;// Return Value:
;//
;// none.
;//
;//--
;
;#define RtlStoreUshort(ADDRESS,VALUE) \
; if ((ULONG_PTR)(ADDRESS) & SHORT_MASK) { \
; ((PUCHAR) (ADDRESS))[SHORT_LEAST_SIGNIFICANT_BIT] = (UCHAR)(FIRSTBYTE(VALUE)); \
; ((PUCHAR) (ADDRESS))[SHORT_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(VALUE)); \
; } \
; else { \
; *((PUSHORT) (ADDRESS)) = (USHORT) VALUE; \
; }
;
;
;//++
;//
;// VOID
;// RtlStoreUlong (
;// PULONG ADDRESS
;// ULONG VALUE
;// )
;//
;// Routine Description:
;//
;// This macro stores a ULONG value in at a particular address, avoiding
;// alignment faults.
;//
;// Arguments:
;//
;// ADDRESS - where to store ULONG value
;// VALUE - ULONG to store
;//
;// Return Value:
;//
;// none.
;//
;// Note:
;// Depending on the machine, we might want to call storeushort in the
;// unaligned case.
;//
;//--
;
;#define RtlStoreUlong(ADDRESS,VALUE) \
; if ((ULONG_PTR)(ADDRESS) & LONG_MASK) { \
; ((PUCHAR) (ADDRESS))[LONG_LEAST_SIGNIFICANT_BIT ] = (UCHAR)(FIRSTBYTE(VALUE)); \
; ((PUCHAR) (ADDRESS))[LONG_3RD_MOST_SIGNIFICANT_BIT ] = (UCHAR)(SECONDBYTE(VALUE)); \
; ((PUCHAR) (ADDRESS))[LONG_2ND_MOST_SIGNIFICANT_BIT ] = (UCHAR)(THIRDBYTE(VALUE)); \
; ((PUCHAR) (ADDRESS))[LONG_MOST_SIGNIFICANT_BIT ] = (UCHAR)(FOURTHBYTE(VALUE)); \
; } \
; else { \
; *((PULONG) (ADDRESS)) = (ULONG) (VALUE); \
; }
;
;//++
;//
;// VOID
;// RtlStoreUlonglong (
;// PULONGLONG ADDRESS
;// ULONG VALUE
;// )
;//
;// Routine Description:
;//
;// This macro stores a ULONGLONG value in at a particular address, avoiding
;// alignment faults.
;//
;// Arguments:
;//
;// ADDRESS - where to store ULONGLONG value
;// VALUE - ULONGLONG to store
;//
;// Return Value:
;//
;// none.
;//
;//--
;
;#define RtlStoreUlonglong(ADDRESS,VALUE) \
; if ((ULONG_PTR)(ADDRESS) & LONGLONG_MASK) { \
; RtlStoreUlong((ULONG_PTR)(ADDRESS), \
; (ULONGLONG)(VALUE) & 0xFFFFFFFF); \
; RtlStoreUlong((ULONG_PTR)(ADDRESS)+sizeof(ULONG), \
; (ULONGLONG)(VALUE) >> 32); \
; } else { \
; *((PULONGLONG)(ADDRESS)) = (ULONGLONG)(VALUE); \
; }
;
;//++
;//
;// VOID
;// RtlStoreUlongPtr (
;// PULONG_PTR ADDRESS
;// ULONG_PTR VALUE
;// )
;//
;// Routine Description:
;//
;// This macro stores a ULONG_PTR value in at a particular address, avoiding
;// alignment faults.
;//
;// Arguments:
;//
;// ADDRESS - where to store ULONG_PTR value
;// VALUE - ULONG_PTR to store
;//
;// Return Value:
;//
;// none.
;//
;//--
;
;#ifdef _WIN64
;
;#define RtlStoreUlongPtr(ADDRESS,VALUE) \
; RtlStoreUlonglong(ADDRESS,VALUE)
;
;#else
;
;#define RtlStoreUlongPtr(ADDRESS,VALUE) \
; RtlStoreUlong(ADDRESS,VALUE)
;
;#endif
;
;//++
;//
;// VOID
;// RtlRetrieveUshort (
;// PUSHORT DESTINATION_ADDRESS
;// PUSHORT SOURCE_ADDRESS
;// )
;//
;// Routine Description:
;//
;// This macro retrieves a USHORT value from the SOURCE address, avoiding
;// alignment faults. The DESTINATION address is assumed to be aligned.
;//
;// Arguments:
;//
;// DESTINATION_ADDRESS - where to store USHORT value
;// SOURCE_ADDRESS - where to retrieve USHORT value from
;//
;// Return Value:
;//
;// none.
;//
;//--
;
;#define RtlRetrieveUshort(DEST_ADDRESS,SRC_ADDRESS) \
; if ((ULONG_PTR)SRC_ADDRESS & SHORT_MASK) { \
; ((PUCHAR) DEST_ADDRESS)[0] = ((PUCHAR) SRC_ADDRESS)[0]; \
; ((PUCHAR) DEST_ADDRESS)[1] = ((PUCHAR) SRC_ADDRESS)[1]; \
; } \
; else { \
; *((PUSHORT) DEST_ADDRESS) = *((PUSHORT) SRC_ADDRESS); \
; } \
;
;//++
;//
;// VOID
;// RtlRetrieveUlong (
;// PULONG DESTINATION_ADDRESS
;// PULONG SOURCE_ADDRESS
;// )
;//
;// Routine Description:
;//
;// This macro retrieves a ULONG value from the SOURCE address, avoiding
;// alignment faults. The DESTINATION address is assumed to be aligned.
;//
;// Arguments:
;//
;// DESTINATION_ADDRESS - where to store ULONG value
;// SOURCE_ADDRESS - where to retrieve ULONG value from
;//
;// Return Value:
;//
;// none.
;//
;// Note:
;// Depending on the machine, we might want to call retrieveushort in the
;// unaligned case.
;//
;//--
;
;#define RtlRetrieveUlong(DEST_ADDRESS,SRC_ADDRESS) \
; if ((ULONG_PTR)SRC_ADDRESS & LONG_MASK) { \
; ((PUCHAR) DEST_ADDRESS)[0] = ((PUCHAR) SRC_ADDRESS)[0]; \
; ((PUCHAR) DEST_ADDRESS)[1] = ((PUCHAR) SRC_ADDRESS)[1]; \
; ((PUCHAR) DEST_ADDRESS)[2] = ((PUCHAR) SRC_ADDRESS)[2]; \
; ((PUCHAR) DEST_ADDRESS)[3] = ((PUCHAR) SRC_ADDRESS)[3]; \
; } \
; else { \
; *((PULONG) DEST_ADDRESS) = *((PULONG) SRC_ADDRESS); \
; }
;//
;// BitMap routines. The following structure, routines, and macros are
;// for manipulating bitmaps. The user is responsible for allocating a bitmap
;// structure (which is really a header) and a buffer (which must be longword
;// aligned and multiple longwords in size).
;//
;
;typedef struct _RTL_BITMAP {
; ULONG SizeOfBitMap; // Number of bits in bit map
; PULONG Buffer; // Pointer to the bit map itself
;} RTL_BITMAP;
;typedef RTL_BITMAP *PRTL_BITMAP;
;
;//
;// The following routine initializes a new bitmap. It does not alter the
;// data currently in the bitmap. This routine must be called before
;// any other bitmap routine/macro.
;//
;
;NTSYSAPI
;VOID
;NTAPI
;RtlInitializeBitMap (
; PRTL_BITMAP BitMapHeader,
; PULONG BitMapBuffer,
; ULONG SizeOfBitMap
; );
;
;//
;// The following two routines either clear or set all of the bits
;// in a bitmap.
;//
;
;NTSYSAPI
;VOID
;NTAPI
;RtlClearAllBits (
; PRTL_BITMAP BitMapHeader
; );
;
;NTSYSAPI
;VOID
;NTAPI
;RtlSetAllBits (
; PRTL_BITMAP BitMapHeader
; );
;
;//
;// The following two routines locate a contiguous region of either
;// clear or set bits within the bitmap. The region will be at least
;// as large as the number specified, and the search of the bitmap will
;// begin at the specified hint index (which is a bit index within the
;// bitmap, zero based). The return value is the bit index of the located
;// region (zero based) or -1 (i.e., 0xffffffff) if such a region cannot
;// be located
;//
;
;NTSYSAPI
;ULONG
;NTAPI
;RtlFindClearBits (
; PRTL_BITMAP BitMapHeader,
; ULONG NumberToFind,
; ULONG HintIndex
; );
;
;NTSYSAPI
;ULONG
;NTAPI
;RtlFindSetBits (
; PRTL_BITMAP BitMapHeader,
; ULONG NumberToFind,
; ULONG HintIndex
; );
;
;//
;// The following two routines locate a contiguous region of either
;// clear or set bits within the bitmap and either set or clear the bits
;// within the located region. The region will be as large as the number
;// specified, and the search for the region will begin at the specified
;// hint index (which is a bit index within the bitmap, zero based). The
;// return value is the bit index of the located region (zero based) or
;// -1 (i.e., 0xffffffff) if such a region cannot be located. If a region
;// cannot be located then the setting/clearing of the bitmap is not performed.
;//
;
;NTSYSAPI
;ULONG
;NTAPI
;RtlFindClearBitsAndSet (
; PRTL_BITMAP BitMapHeader,
; ULONG NumberToFind,
; ULONG HintIndex
; );
;
;NTSYSAPI
;ULONG
;NTAPI
;RtlFindSetBitsAndClear (
; PRTL_BITMAP BitMapHeader,
; ULONG NumberToFind,
; ULONG HintIndex
; );
;
;//
;// The following two routines clear or set bits within a specified region
;// of the bitmap. The starting index is zero based.
;//
;
;NTSYSAPI
;VOID
;NTAPI
;RtlClearBits (
; PRTL_BITMAP BitMapHeader,
; ULONG StartingIndex,
; ULONG NumberToClear
; );
;
;NTSYSAPI
;VOID
;NTAPI
;RtlSetBits (
; PRTL_BITMAP BitMapHeader,
; ULONG StartingIndex,
; ULONG NumberToSet
; );
;
;//
;// The following routine locates a set of contiguous regions of clear
;// bits within the bitmap. The caller specifies whether to return the
;// longest runs or just the first found lcoated. The following structure is
;// used to denote a contiguous run of bits. The two routines return an array
;// of this structure, one for each run located.
;//
;
;typedef struct _RTL_BITMAP_RUN {
;
; ULONG StartingIndex;
; ULONG NumberOfBits;
;
;} RTL_BITMAP_RUN;
;typedef RTL_BITMAP_RUN *PRTL_BITMAP_RUN;
;
;NTSYSAPI
;ULONG
;NTAPI
;RtlFindClearRuns (
; PRTL_BITMAP BitMapHeader,
; PRTL_BITMAP_RUN RunArray,
; ULONG SizeOfRunArray,
; BOOLEAN LocateLongestRuns
; );
;
;//
;// The following routine locates the longest contiguous region of
;// clear bits within the bitmap. The returned starting index value
;// denotes the first contiguous region located satisfying our requirements
;// The return value is the length (in bits) of the longest region found.
;//
;
;NTSYSAPI
;ULONG
;NTAPI
;RtlFindLongestRunClear (
; PRTL_BITMAP BitMapHeader,
; PULONG StartingIndex
; );
;
;//
;// The following routine locates the first contiguous region of
;// clear bits within the bitmap. The returned starting index value
;// denotes the first contiguous region located satisfying our requirements
;// The return value is the length (in bits) of the region found.
;//
;
;NTSYSAPI
;ULONG
;NTAPI
;RtlFindFirstRunClear (
; PRTL_BITMAP BitMapHeader,
; PULONG StartingIndex
; );
;
;//
;// The following macro returns the value of the bit stored within the
;// bitmap at the specified location. If the bit is set a value of 1 is
;// returned otherwise a value of 0 is returned.
;//
;// ULONG
;// RtlCheckBit (
;// PRTL_BITMAP BitMapHeader,
;// ULONG BitPosition
;// );
;//
;//
;// To implement CheckBit the macro retrieves the longword containing the
;// bit in question, shifts the longword to get the bit in question into the
;// low order bit position and masks out all other bits.
;//
;
;#define RtlCheckBit(BMH,BP) ((((BMH)->Buffer[(BP) / 32]) >> ((BP) % 32)) & 0x1)
;
;//
;// The following two procedures return to the caller the total number of
;// clear or set bits within the specified bitmap.
;//
;
;NTSYSAPI
;ULONG
;NTAPI
;RtlNumberOfClearBits (
; PRTL_BITMAP BitMapHeader
; );
;
;NTSYSAPI
;ULONG
;NTAPI
;RtlNumberOfSetBits (
; PRTL_BITMAP BitMapHeader
; );
;
;//
;// The following two procedures return to the caller a boolean value
;// indicating if the specified range of bits are all clear or set.
;//
;
;NTSYSAPI
;BOOLEAN
;NTAPI
;RtlAreBitsClear (
; PRTL_BITMAP BitMapHeader,
; ULONG StartingIndex,
; ULONG Length
; );
;
;NTSYSAPI
;BOOLEAN
;NTAPI
;RtlAreBitsSet (
; PRTL_BITMAP BitMapHeader,
; ULONG StartingIndex,
; ULONG Length
; );
;
;NTSYSAPI
;ULONG
;NTAPI
;RtlFindNextForwardRunClear (
; IN PRTL_BITMAP BitMapHeader,
; IN ULONG FromIndex,
; IN PULONG StartingRunIndex
; );
;
;NTSYSAPI
;ULONG
;NTAPI
;RtlFindLastBackwardRunClear (
; IN PRTL_BITMAP BitMapHeader,
; IN ULONG FromIndex,
; IN PULONG StartingRunIndex
; );
;
;//
;// The following two procedures return to the caller a value indicating
;// the position within a ULONGLONG of the most or least significant non-zero
;// bit. A value of zero results in a return value of -1.
;//
;
;NTSYSAPI
;CCHAR
;NTAPI
;RtlFindLeastSignificantBit (
; IN ULONGLONG Set
; );
;
;NTSYSAPI
;CCHAR
;NTAPI
;RtlFindMostSignificantBit (
; IN ULONGLONG Set
; );
;
;
;//
;// BOOLEAN
;// RtlEqualLuid(
;// PLUID L1,
;// PLUID L2
;// );
;
;#define RtlEqualLuid(L1, L2) (((L1)->LowPart == (L2)->LowPart) && \
; ((L1)->HighPart == (L2)->HighPart))
;
;//
;// BOOLEAN
;// RtlIsZeroLuid(
;// PLUID L1
;// );
;//
;#define RtlIsZeroLuid(L1) ((BOOLEAN) (((L1)->LowPart | (L1)->HighPart) == 0))
;
;
;#if !defined(MIDL_PASS)
;
;__inline LUID
;NTAPI
;RtlConvertLongToLuid(
; LONG Long
; )
;{
; LUID TempLuid;
; LARGE_INTEGER TempLi;
;
; TempLi = RtlConvertLongToLargeInteger(Long);
; TempLuid.LowPart = TempLi.LowPart;
; TempLuid.HighPart = TempLi.HighPart;
; return(TempLuid);
;}
;
;__inline LUID
;NTAPI
;RtlConvertUlongToLuid(
; ULONG Ulong
; )
;{
; LUID TempLuid;
;
; TempLuid.LowPart = Ulong;
; TempLuid.HighPart = 0;
; return(TempLuid);
;}
;#endif
;
;
;NTSYSAPI
;VOID
;NTAPI
;RtlMapGenericMask(
; PACCESS_MASK AccessMask,
; PGENERIC_MAPPING GenericMapping
; );
;//
;// SecurityDescriptor RTL routine definitions
;//
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlCreateSecurityDescriptor (
; PSECURITY_DESCRIPTOR SecurityDescriptor,
; ULONG Revision
; );
;
;
;NTSYSAPI
;BOOLEAN
;NTAPI
;RtlValidSecurityDescriptor (
; PSECURITY_DESCRIPTOR SecurityDescriptor
; );
;
;
;NTSYSAPI
;ULONG
;NTAPI
;RtlLengthSecurityDescriptor (
; PSECURITY_DESCRIPTOR SecurityDescriptor
; );
;
;NTSYSAPI
;BOOLEAN
;NTAPI
;RtlValidRelativeSecurityDescriptor (
; IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
; IN ULONG SecurityDescriptorLength,
; IN SECURITY_INFORMATION RequiredInformation
; );
;
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlSetDaclSecurityDescriptor (
; PSECURITY_DESCRIPTOR SecurityDescriptor,
; BOOLEAN DaclPresent,
; PACL Dacl,
; BOOLEAN DaclDefaulted
; );
;
;
;//
;// Range list package
;//
;
;typedef struct _RTL_RANGE {
;
; //
; // The start of the range
; //
; ULONGLONG Start; // Read only
;
; //
; // The end of the range
; //
; ULONGLONG End; // Read only
;
; //
; // Data the user passed in when they created the range
; //
; PVOID UserData; // Read/Write
;
; //
; // The owner of the range
; //
; PVOID Owner; // Read/Write
;
; //
; // User defined flags the user specified when they created the range
; //
; UCHAR Attributes; // Read/Write
;
; //
; // Flags (RTL_RANGE_*)
; //
; UCHAR Flags; // Read only
;
;} RTL_RANGE, *PRTL_RANGE;
;
;
;#define RTL_RANGE_SHARED 0x01
;#define RTL_RANGE_CONFLICT 0x02
;
;typedef struct _RTL_RANGE_LIST {
;
; //
; // The list of ranges
; //
; LIST_ENTRY ListHead;
;
; //
; // These always come in useful
; //
; ULONG Flags; // use RANGE_LIST_FLAG_*
;
; //
; // The number of entries in the list
; //
; ULONG Count;
;
; //
; // Every time an add/delete operation is performed on the list this is
; // incremented. It is checked during iteration to ensure that the list
; // hasn't changed between GetFirst/GetNext or GetNext/GetNext calls
; //
; ULONG Stamp;
;
;} RTL_RANGE_LIST, *PRTL_RANGE_LIST;
;
;typedef struct _RANGE_LIST_ITERATOR {
;
; PLIST_ENTRY RangeListHead;
; PLIST_ENTRY MergedHead;
; PVOID Current;
; ULONG Stamp;
;
;} RTL_RANGE_LIST_ITERATOR, *PRTL_RANGE_LIST_ITERATOR;
;
;
;NTSYSAPI
;VOID
;NTAPI
;RtlInitializeRangeList(
; IN OUT PRTL_RANGE_LIST RangeList
; );
;
;NTSYSAPI
;VOID
;NTAPI
;RtlFreeRangeList(
; IN PRTL_RANGE_LIST RangeList
; );
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlCopyRangeList(
; OUT PRTL_RANGE_LIST CopyRangeList,
; IN PRTL_RANGE_LIST RangeList
; );
;
;#define RTL_RANGE_LIST_ADD_IF_CONFLICT 0x00000001
;#define RTL_RANGE_LIST_ADD_SHARED 0x00000002
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlAddRange(
; IN OUT PRTL_RANGE_LIST RangeList,
; IN ULONGLONG Start,
; IN ULONGLONG End,
; IN UCHAR Attributes,
; IN ULONG Flags,
; IN PVOID UserData, OPTIONAL
; IN PVOID Owner OPTIONAL
; );
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlDeleteRange(
; IN OUT PRTL_RANGE_LIST RangeList,
; IN ULONGLONG Start,
; IN ULONGLONG End,
; IN PVOID Owner
; );
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlDeleteOwnersRanges(
; IN OUT PRTL_RANGE_LIST RangeList,
; IN PVOID Owner
; );
;
;#define RTL_RANGE_LIST_SHARED_OK 0x00000001
;#define RTL_RANGE_LIST_NULL_CONFLICT_OK 0x00000002
;
;typedef
;BOOLEAN
;(*PRTL_CONFLICT_RANGE_CALLBACK) (
; IN PVOID Context,
; IN PRTL_RANGE Range
; );
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlFindRange(
; IN PRTL_RANGE_LIST RangeList,
; IN ULONGLONG Minimum,
; IN ULONGLONG Maximum,
; IN ULONG Length,
; IN ULONG Alignment,
; IN ULONG Flags,
; IN UCHAR AttributeAvailableMask,
; IN PVOID Context OPTIONAL,
; IN PRTL_CONFLICT_RANGE_CALLBACK Callback OPTIONAL,
; OUT PULONGLONG Start
; );
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlIsRangeAvailable(
; IN PRTL_RANGE_LIST RangeList,
; IN ULONGLONG Start,
; IN ULONGLONG End,
; IN ULONG Flags,
; IN UCHAR AttributeAvailableMask,
; IN PVOID Context OPTIONAL,
; IN PRTL_CONFLICT_RANGE_CALLBACK Callback OPTIONAL,
; OUT PBOOLEAN Available
; );
;
;#define FOR_ALL_RANGES(RangeList, Iterator, Current) \
; for (RtlGetFirstRange((RangeList), (Iterator), &(Current)); \
; (Current) != NULL; \
; RtlGetNextRange((Iterator), &(Current), TRUE) \
; )
;
;#define FOR_ALL_RANGES_BACKWARDS(RangeList, Iterator, Current) \
; for (RtlGetLastRange((RangeList), (Iterator), &(Current)); \
; (Current) != NULL; \
; RtlGetNextRange((Iterator), &(Current), FALSE) \
; )
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlGetFirstRange(
; IN PRTL_RANGE_LIST RangeList,
; OUT PRTL_RANGE_LIST_ITERATOR Iterator,
; OUT PRTL_RANGE *Range
; );
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlGetLastRange(
; IN PRTL_RANGE_LIST RangeList,
; OUT PRTL_RANGE_LIST_ITERATOR Iterator,
; OUT PRTL_RANGE *Range
; );
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlGetNextRange(
; IN OUT PRTL_RANGE_LIST_ITERATOR Iterator,
; OUT PRTL_RANGE *Range,
; IN BOOLEAN MoveForwards
; );
;
;#define RTL_RANGE_LIST_MERGE_IF_CONFLICT RTL_RANGE_LIST_ADD_IF_CONFLICT
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlMergeRangeLists(
; OUT PRTL_RANGE_LIST MergedRangeList,
; IN PRTL_RANGE_LIST RangeList1,
; IN PRTL_RANGE_LIST RangeList2,
; IN ULONG Flags
; );
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlInvertRangeList(
; OUT PRTL_RANGE_LIST InvertedRangeList,
; IN PRTL_RANGE_LIST RangeList
; );
;
;// end_nthal
;
;// begin_wdm
;
;//
;// Byte swap routines. These are used to convert from little-endian to
;// big-endian and vice-versa.
;//
;
;USHORT
;FASTCALL
;RtlUshortByteSwap(
; IN USHORT Source
; );
;
;ULONG
;FASTCALL
;RtlUlongByteSwap(
; IN ULONG Source
; );
;
;ULONGLONG
;FASTCALL
;RtlUlonglongByteSwap(
; IN ULONGLONG Source
; );
;
;
;//
;// Routine for converting from a volume device object to a DOS name.
;//
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;RtlVolumeDeviceToDosName(
; IN PVOID VolumeDeviceObject,
; OUT PUNICODE_STRING DosName
; );
;
;typedef struct _OSVERSIONINFOA {
; ULONG dwOSVersionInfoSize;
; ULONG dwMajorVersion;
; ULONG dwMinorVersion;
; ULONG dwBuildNumber;
; ULONG dwPlatformId;
; CHAR szCSDVersion[ 128 ]; // Maintenance string for PSS usage
;} OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
;
;typedef struct _OSVERSIONINFOW {
; ULONG dwOSVersionInfoSize;
; ULONG dwMajorVersion;
; ULONG dwMinorVersion;
; ULONG dwBuildNumber;
; ULONG dwPlatformId;
; WCHAR szCSDVersion[ 128 ]; // Maintenance string for PSS usage
;} OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
;#ifdef UNICODE
;typedef OSVERSIONINFOW OSVERSIONINFO;
;typedef POSVERSIONINFOW POSVERSIONINFO;
;typedef LPOSVERSIONINFOW LPOSVERSIONINFO;
;#else
;typedef OSVERSIONINFOA OSVERSIONINFO;
;typedef POSVERSIONINFOA POSVERSIONINFO;
;typedef LPOSVERSIONINFOA LPOSVERSIONINFO;
;#endif // UNICODE
;
;typedef struct _OSVERSIONINFOEXA {
; ULONG dwOSVersionInfoSize;
; ULONG dwMajorVersion;
; ULONG dwMinorVersion;
; ULONG dwBuildNumber;
; ULONG dwPlatformId;
; CHAR szCSDVersion[ 128 ]; // Maintenance string for PSS usage
; USHORT wServicePackMajor;
; USHORT wServicePackMinor;
; USHORT wSuiteMask;
; UCHAR wProductType;
; UCHAR wReserved;
;} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
;typedef struct _OSVERSIONINFOEXW {
; ULONG dwOSVersionInfoSize;
; ULONG dwMajorVersion;
; ULONG dwMinorVersion;
; ULONG dwBuildNumber;
; ULONG dwPlatformId;
; WCHAR szCSDVersion[ 128 ]; // Maintenance string for PSS usage
; USHORT wServicePackMajor;
; USHORT wServicePackMinor;
; USHORT wSuiteMask;
; UCHAR wProductType;
; UCHAR wReserved;
;} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
;#ifdef UNICODE
;typedef OSVERSIONINFOEXW OSVERSIONINFOEX;
;typedef POSVERSIONINFOEXW POSVERSIONINFOEX;
;typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;
;#else
;typedef OSVERSIONINFOEXA OSVERSIONINFOEX;
;typedef POSVERSIONINFOEXA POSVERSIONINFOEX;
;typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX;
;#endif // UNICODE
;
;//
;// RtlVerifyVersionInfo() conditions
;//
;
;#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() type mask bits
;//
;
;#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
;
;//
;// RtlVerifyVersionInfo() os product type values
;//
;
;#define VER_NT_WORKSTATION 0x0000001
;#define VER_NT_DOMAIN_CONTROLLER 0x0000002
;#define VER_NT_SERVER 0x0000003
;
;//
;// dwPlatformId defines:
;//
;
;#define VER_PLATFORM_WIN32s 0
;#define VER_PLATFORM_WIN32_WINDOWS 1
;#define VER_PLATFORM_WIN32_NT 2
;
;
;//
;//
;// VerifyVersionInfo() macro to set the condition mask
;//
;// For documentation sakes here's the old version of the macro that got
;// changed to call an API
;// #define VER_SET_CONDITION(_m_,_t_,_c_) _m_=(_m_|(_c_<<(1<<_t_)))
;//
;
;#define VER_SET_CONDITION(_m_,_t_,_c_) \
; ((_m_)=VerSetConditionMask((_m_),(_t_),(_c_)))
;
;ULONGLONG
;NTAPI
;VerSetConditionMask(
; IN ULONGLONG ConditionMask,
; IN ULONG TypeMask,
; IN UCHAR Condition
; );
;//
;// end_winnt
;//
;
;NTSYSAPI
;NTSTATUS
;RtlGetVersion(
; OUT PRTL_OSVERSIONINFOW lpVersionInformation
; );
;
;NTSYSAPI
;NTSTATUS
;RtlVerifyVersionInfo(
; IN PRTL_OSVERSIONINFOEXW VersionInfo,
; IN ULONG TypeMask,
; IN ULONGLONG ConditionMask
; );
;
;//
;//
;// Define the various device type values. Note that values used by Microsoft
;// Corporation are in the range 0-32767, and 32768-65535 are reserved for use
;// by customers.
;//
;
;#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
;FILE_DEVICE_NETWORK equ 12h
;#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
;
;//
;// Macro definition for defining IOCTL and FSCTL function control codes. Note
;// that function codes 0-2047 are reserved for Microsoft Corporation, and
;// 2048-4095 are reserved for customers.
;//
;
;#define CTL_CODE( DeviceType, Function, Method, Access ) ( \
; ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
;)
;
;//
;// Macro to extract device type out of the device io control code
;//
;#define DEVICE_TYPE_FROM_CTL_CODE(ctrlCode) (((ULONG)(ctrlCode & 0xffff0000)) >> 16)
;
;//
;// Define the method codes for how buffers are passed for I/O and FS controls
;//
;
;#define METHOD_BUFFERED 0
;#define METHOD_IN_DIRECT 1
;#define METHOD_OUT_DIRECT 2
;#define METHOD_NEITHER 3
;
;//
;// Define the access check value for any access
;//
;//
;// The FILE_READ_ACCESS and FILE_WRITE_ACCESS constants are also defined in
;// ntioapi.h as FILE_READ_DATA and FILE_WRITE_DATA. The values for these
;// constants *MUST* always be in sync.
;//
;//
;// FILE_SPECIAL_ACCESS is checked by the NT I/O system the same as FILE_ANY_ACCESS.
;// The file systems, however, may add additional access checks for I/O and FS controls
;// that use this value.
;//
;
;
;#define FILE_ANY_ACCESS 0
;#define FILE_SPECIAL_ACCESS (FILE_ANY_ACCESS)
;#define FILE_READ_ACCESS ( 0x0001 ) // file & pipe
;#define FILE_WRITE_ACCESS ( 0x0002 ) // file & pipe
;
;// begin_winnt
;
;//
;// Define access rights to files and directories
;//
;
;//
;// The FILE_READ_DATA and FILE_WRITE_DATA constants are also defined in
;// devioctl.h as FILE_READ_ACCESS and FILE_WRITE_ACCESS. The values for these
;// constants *MUST* always be in sync.
;// The values are redefined in devioctl.h because they must be available to
;// both DOS and NT.
;//
;
;#define FILE_READ_DATA ( 0x0001 ) // file & pipe
;#define FILE_LIST_DIRECTORY ( 0x0001 ) // directory
;
;#define FILE_WRITE_DATA ( 0x0002 ) // file & pipe
;#define FILE_ADD_FILE ( 0x0002 ) // directory
;
;#define FILE_APPEND_DATA ( 0x0004 ) // file
;#define FILE_ADD_SUBDIRECTORY ( 0x0004 ) // directory
;#define FILE_CREATE_PIPE_INSTANCE ( 0x0004 ) // named pipe
;
;
;#define FILE_READ_EA ( 0x0008 ) // file & directory
;
;#define FILE_WRITE_EA ( 0x0010 ) // file & directory
;
;#define FILE_EXECUTE ( 0x0020 ) // file
;#define FILE_TRAVERSE ( 0x0020 ) // directory
;
;#define FILE_DELETE_CHILD ( 0x0040 ) // directory
;
;#define FILE_READ_ATTRIBUTES ( 0x0080 ) // all
;
;#define FILE_WRITE_ATTRIBUTES ( 0x0100 ) // all
;
;#define FILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF)
;
;#define FILE_GENERIC_READ (STANDARD_RIGHTS_READ |\
; FILE_READ_DATA |\
; FILE_READ_ATTRIBUTES |\
; FILE_READ_EA |\
; SYNCHRONIZE)
;
;
;#define FILE_GENERIC_WRITE (STANDARD_RIGHTS_WRITE |\
; FILE_WRITE_DATA |\
; FILE_WRITE_ATTRIBUTES |\
; FILE_WRITE_EA |\
; FILE_APPEND_DATA |\
; SYNCHRONIZE)
;
;
;#define FILE_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
; FILE_READ_ATTRIBUTES |\
; FILE_EXECUTE |\
; SYNCHRONIZE)
;
;// end_winnt
;
;
;//
;// Define share access rights to files and directories
;//
;
;#define FILE_SHARE_READ 0x00000001 // winnt
;#define FILE_SHARE_WRITE 0x00000002 // winnt
;#define FILE_SHARE_DELETE 0x00000004 // winnt
;#define FILE_SHARE_VALID_FLAGS 0x00000007
;
;//
;// Define the file attributes values
;//
;// Note: 0x00000008 is reserved for use for the old DOS VOLID (volume ID)
;// and is therefore not considered valid in NT.
;//
;// Note: 0x00000010 is reserved for use for the old DOS SUBDIRECTORY flag
;// and is therefore not considered valid in NT. This flag has
;// been disassociated with file attributes since the other flags are
;// protected with READ_ and WRITE_ATTRIBUTES access to the file.
;//
;// Note: Note also that the order of these flags is set to allow both the
;// FAT and the Pinball File Systems to directly set the attributes
;// flags in attributes words without having to pick each flag out
;// individually. The order of these flags should not be changed!
;//
;
;#define FILE_ATTRIBUTE_READONLY 0x00000001 // winnt
;#define FILE_ATTRIBUTE_HIDDEN 0x00000002 // winnt
;#define FILE_ATTRIBUTE_SYSTEM 0x00000004 // winnt
;//OLD DOS VOLID 0x00000008
;
;#define FILE_ATTRIBUTE_DIRECTORY 0x00000010 // winnt
;#define FILE_ATTRIBUTE_ARCHIVE 0x00000020 // winnt
;#define FILE_ATTRIBUTE_DEVICE 0x00000040 // winnt
;#define FILE_ATTRIBUTE_NORMAL 0x00000080 // winnt
;
;#define FILE_ATTRIBUTE_TEMPORARY 0x00000100 // winnt
;#define FILE_ATTRIBUTE_SPARSE_FILE 0x00000200 // winnt
;#define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400 // winnt
;#define FILE_ATTRIBUTE_COMPRESSED 0x00000800 // winnt
;
;#define FILE_ATTRIBUTE_OFFLINE 0x00001000 // winnt
;#define FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 0x00002000 // winnt
;#define FILE_ATTRIBUTE_ENCRYPTED 0x00004000 // winnt
;
;//
;// This definition is old and will disappear shortly
;//
;
;#define FILE_ATTRIBUTE_CONTENT_INDEXED FILE_ATTRIBUTE_NOT_CONTENT_INDEXED
;
;#define FILE_ATTRIBUTE_VALID_FLAGS 0x00007fb7
;#define FILE_ATTRIBUTE_VALID_SET_FLAGS 0x000031a7
;
;//
;// Define the create disposition values
;//
;
;#define FILE_SUPERSEDE 0x00000000
;#define FILE_OPEN 0x00000001
;#define FILE_CREATE 0x00000002
;#define FILE_OPEN_IF 0x00000003
;#define FILE_OVERWRITE 0x00000004
;#define FILE_OVERWRITE_IF 0x00000005
;#define FILE_MAXIMUM_DISPOSITION 0x00000005
;
;//
;// Define the create/open option flags
;//
;
;#define FILE_DIRECTORY_FILE 0x00000001
;#define FILE_WRITE_THROUGH 0x00000002
;#define FILE_SEQUENTIAL_ONLY 0x00000004
;#define FILE_NO_INTERMEDIATE_BUFFERING 0x00000008
;
;#define FILE_SYNCHRONOUS_IO_ALERT 0x00000010
;#define FILE_SYNCHRONOUS_IO_NONALERT 0x00000020
;#define FILE_NON_DIRECTORY_FILE 0x00000040
;#define FILE_CREATE_TREE_CONNECTION 0x00000080
;
;#define FILE_COMPLETE_IF_OPLOCKED 0x00000100
;#define FILE_NO_EA_KNOWLEDGE 0x00000200
;#define FILE_OPEN_FOR_RECOVERY 0x00000400
;#define FILE_RANDOM_ACCESS 0x00000800
;
;#define FILE_DELETE_ON_CLOSE 0x00001000
;#define FILE_OPEN_BY_FILE_ID 0x00002000
;#define FILE_OPEN_FOR_BACKUP_INTENT 0x00004000
;#define FILE_NO_COMPRESSION 0x00008000
;
;#define FILE_RESERVE_OPFILTER 0x00100000
;#define FILE_OPEN_REPARSE_POINT 0x00200000
;#define FILE_OPEN_NO_RECALL 0x00400000
;#define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
;
;#define FILE_COPY_STRUCTURED_STORAGE 0x00000041
;#define FILE_STRUCTURED_STORAGE 0x00000441
;
;#define FILE_VALID_OPTION_FLAGS 0x00ffffff
;#define FILE_VALID_PIPE_OPTION_FLAGS 0x00000032
;#define FILE_VALID_MAILSLOT_OPTION_FLAGS 0x00000032
;#define FILE_VALID_SET_FLAGS 0x00000036
;
;//
;// Define the I/O status information return values for NtCreateFile/NtOpenFile
;//
;
;#define FILE_SUPERSEDED 0x00000000
;#define FILE_OPENED 0x00000001
;#define FILE_CREATED 0x00000002
;#define FILE_OVERWRITTEN 0x00000003
;#define FILE_EXISTS 0x00000004
;#define FILE_DOES_NOT_EXIST 0x00000005
;
;//
;// Define special ByteOffset parameters for read and write operations
;//
;
;#define FILE_WRITE_TO_END_OF_FILE 0xffffffff
;#define FILE_USE_FILE_POINTER_POSITION 0xfffffffe
;
;//
;// Define alignment requirement values
;//
;
;#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
;
;//
;// Define the maximum length of a filename string
;//
;
;#define MAXIMUM_FILENAME_LENGTH 256
;
;//
;// Define the various device characteristics flags
;//
;
;#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
;
;// end_wdm
;
;//
;// flags specified here will be propagated up and down a device stack
;// after FDO and all filter devices are added, but before the device
;// stack is started
;//
;
;#define FILE_CHARACTERISTICS_PROPAGATED ( FILE_REMOVABLE_MEDIA | \
; FILE_READ_ONLY_DEVICE | \
; FILE_FLOPPY_DISKETTE | \
; FILE_WRITE_ONCE_MEDIA | \
; FILE_DEVICE_SECURE_OPEN )
;
;//
;// Define the base asynchronous I/O argument types
;//
;
;typedef struct _IO_STATUS_BLOCK {
; union {
; NTSTATUS Status;
; PVOID Pointer;
; };
;
; ULONG_PTR Information;
;} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
;
;#if defined(_WIN64)
;typedef struct _IO_STATUS_BLOCK32 {
; NTSTATUS Status;
; ULONG Information;
;} IO_STATUS_BLOCK32, *PIO_STATUS_BLOCK32;
;#endif
;
;
;//
;// Define an Asynchronous Procedure Call from I/O viewpoint
;//
;
;typedef
;VOID
;(NTAPI *PIO_APC_ROUTINE) (
; IN PVOID ApcContext,
; IN PIO_STATUS_BLOCK IoStatusBlock,
; IN ULONG Reserved
; );
;#define PIO_APC_ROUTINE_DEFINED
;
;//
;// Define the file information class values
;//
;// WARNING: The order of the following values are assumed by the I/O system.
;// Any changes made here should be reflected there as well.
;//
;
;typedef enum _FILE_INFORMATION_CLASS {
;// end_wdm
; FileDirectoryInformation = 1,
; FileFullDirectoryInformation, // 2
; FileBothDirectoryInformation, // 3
; FileBasicInformation, // 4 wdm
; FileStandardInformation, // 5 wdm
; FileInternalInformation, // 6
; FileEaInformation, // 7
; FileAccessInformation, // 8
; FileNameInformation, // 9
; FileRenameInformation, // 10
; FileLinkInformation, // 11
; FileNamesInformation, // 12
; FileDispositionInformation, // 13
; FilePositionInformation, // 14 wdm
; FileFullEaInformation, // 15
; FileModeInformation, // 16
; FileAlignmentInformation, // 17
; FileAllInformation, // 18
; FileAllocationInformation, // 19
; FileEndOfFileInformation, // 20 wdm
; FileAlternateNameInformation, // 21
; FileStreamInformation, // 22
; FilePipeInformation, // 23
; FilePipeLocalInformation, // 24
; FilePipeRemoteInformation, // 25
; FileMailslotQueryInformation, // 26
; FileMailslotSetInformation, // 27
; FileCompressionInformation, // 28
; FileObjectIdInformation, // 29
; FileCompletionInformation, // 30
; FileMoveClusterInformation, // 31
; FileQuotaInformation, // 32
; FileReparsePointInformation, // 33
; FileNetworkOpenInformation, // 34
; FileAttributeTagInformation, // 35
; FileTrackingInformation, // 36
; FileMaximumInformation
;// begin_wdm
;} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
;
;//
;// Define the various structures which are returned on query operations
;//
;
;typedef struct _FILE_BASIC_INFORMATION {
; LARGE_INTEGER CreationTime;
; LARGE_INTEGER LastAccessTime;
; LARGE_INTEGER LastWriteTime;
; LARGE_INTEGER ChangeTime;
; ULONG FileAttributes;
;} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
;
;typedef struct _FILE_STANDARD_INFORMATION {
; LARGE_INTEGER AllocationSize;
; LARGE_INTEGER EndOfFile;
; ULONG NumberOfLinks;
; BOOLEAN DeletePending;
; BOOLEAN Directory;
;} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
;
;typedef struct _FILE_POSITION_INFORMATION {
; LARGE_INTEGER CurrentByteOffset;
;} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
;
;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_NETWORK_OPEN_INFORMATION {
; LARGE_INTEGER CreationTime;
; LARGE_INTEGER LastAccessTime;
; LARGE_INTEGER LastWriteTime;
; LARGE_INTEGER ChangeTime;
; LARGE_INTEGER AllocationSize;
; LARGE_INTEGER EndOfFile;
; ULONG FileAttributes;
;} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_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_FULL_EA_INFORMATION {
; ULONG NextEntryOffset;
; UCHAR Flags;
; UCHAR EaNameLength;
; USHORT EaValueLength;
; CHAR EaName[1];
;} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
;
;//
;// Define the file system information class values
;//
;// WARNING: The order of the following values are assumed by the I/O system.
;// Any changes made here should be reflected there as well.
;
;typedef enum _FSINFOCLASS {
; FileFsVolumeInformation = 1,
; FileFsLabelInformation, // 2
; FileFsSizeInformation, // 3
; FileFsDeviceInformation, // 4
; FileFsAttributeInformation, // 5
; FileFsControlInformation, // 6
; FileFsFullSizeInformation, // 7
; FileFsObjectIdInformation, // 8
; FileFsMaximumInformation
;} FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
;
;typedef struct _FILE_FS_DEVICE_INFORMATION {
; DEVICE_TYPE DeviceType;
; ULONG Characteristics;
;} FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
;
;
;//
;// Define segement buffer structure for scatter/gather read/write.
;//
;
;typedef union _FILE_SEGMENT_ELEMENT {
; PVOID64 Buffer;
; ULONGLONG Alignment;
;}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
;
;//
;// Define the I/O bus interface types.
;//
;
;typedef enum _INTERFACE_TYPE {
; InterfaceTypeUndefined = -1,
; Internal,
; Isa,
; Eisa,
; MicroChannel,
; TurboChannel,
; PCIBus,
; VMEBus,
; NuBus,
; PCMCIABus,
; CBus,
; MPIBus,
; MPSABus,
; ProcessorInternal,
; InternalPowerBus,
; PNPISABus,
; PNPBus,
; MaximumInterfaceType
;}INTERFACE_TYPE, *PINTERFACE_TYPE;
;
;//
;// Define the DMA transfer widths.
;//
;
;typedef enum _DMA_WIDTH {
; Width8Bits,
; Width16Bits,
; Width32Bits,
; MaximumDmaWidth
;}DMA_WIDTH, *PDMA_WIDTH;
;
;//
;// Define DMA transfer speeds.
;//
;
;typedef enum _DMA_SPEED {
; Compatible,
; TypeA,
; TypeB,
; TypeC,
; TypeF,
; MaximumDmaSpeed
;}DMA_SPEED, *PDMA_SPEED;
;
;//
;// Define Interface reference/dereference routines for
;// Interfaces exported by IRP_MN_QUERY_INTERFACE
;//
;
;typedef VOID (*PINTERFACE_REFERENCE)(PVOID Context);
;typedef VOID (*PINTERFACE_DEREFERENCE)(PVOID Context);
;
;// end_wdm
;
;//
;// Define types of bus information.
;//
;
;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;
;
;//
;// Define I/O Driver error log packet structure. This structure is filled in
;// by the driver.
;//
;
;typedef struct _IO_ERROR_LOG_PACKET {
; UCHAR MajorFunctionCode;
; UCHAR RetryCount;
; USHORT DumpDataSize;
; USHORT NumberOfStrings;
; USHORT StringOffset;
; USHORT EventCategory;
; NTSTATUS ErrorCode;
; ULONG UniqueErrorValue;
; NTSTATUS FinalStatus;
; ULONG SequenceNumber;
; ULONG IoControlCode;
; LARGE_INTEGER DeviceOffset;
; ULONG DumpData[1];
;}IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
;
;//
;// Define the I/O error log message. This message is sent by the error log
;// thread over the lpc port.
;//
;
;typedef struct _IO_ERROR_LOG_MESSAGE {
; USHORT Type;
; USHORT Size;
; USHORT DriverNameLength;
; LARGE_INTEGER TimeStamp;
; ULONG DriverNameOffset;
; IO_ERROR_LOG_PACKET EntryData;
;}IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
;
;//
;// Define the maximum message size that will be sent over the LPC to the
;// application reading the error log entries.
;//
;
;//
;// Regardless of LPC size restrictions, ERROR_LOG_MAXIMUM_SIZE must remain
;// a value that can fit in a UCHAR.
;//
;
;#define ERROR_LOG_LIMIT_SIZE (256-16)
;
;//
;// This limit, exclusive of IO_ERROR_LOG_MESSAGE_HEADER_LENGTH, also applies
;// to IO_ERROR_LOG_MESSAGE_LENGTH
;//
;
;#define IO_ERROR_LOG_MESSAGE_HEADER_LENGTH (sizeof(IO_ERROR_LOG_MESSAGE) - \
; sizeof(IO_ERROR_LOG_PACKET) + \
; (sizeof(WCHAR) * 40))
;
;#define ERROR_LOG_MESSAGE_LIMIT_SIZE \
; (ERROR_LOG_LIMIT_SIZE + IO_ERROR_LOG_MESSAGE_HEADER_LENGTH)
;
;//
;// IO_ERROR_LOG_MESSAGE_LENGTH is
;// min(PORT_MAXIMUM_MESSAGE_LENGTH, ERROR_LOG_MESSAGE_LIMIT_SIZE)
;//
;
;#define IO_ERROR_LOG_MESSAGE_LENGTH \
; ((PORT_MAXIMUM_MESSAGE_LENGTH > ERROR_LOG_MESSAGE_LIMIT_SIZE) ? \
; ERROR_LOG_MESSAGE_LIMIT_SIZE : \
; PORT_MAXIMUM_MESSAGE_LENGTH)
;
;//
;// Define the maximum packet size a driver can allocate.
;//
;
;#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
;//
;// Registry Specific Access Rights.
;//
;
;#define KEY_QUERY_VALUE (0x0001)
;#define KEY_SET_VALUE (0x0002)
;#define KEY_CREATE_SUB_KEY (0x0004)
;#define KEY_ENUMERATE_SUB_KEYS (0x0008)
;#define KEY_NOTIFY (0x0010)
;#define KEY_CREATE_LINK (0x0020)
;
;#define KEY_READ ((STANDARD_RIGHTS_READ |\
; KEY_QUERY_VALUE |\
; KEY_ENUMERATE_SUB_KEYS |\
; KEY_NOTIFY) \
; & \
; (~SYNCHRONIZE))
;
;
;#define KEY_WRITE ((STANDARD_RIGHTS_WRITE |\
; KEY_SET_VALUE |\
; KEY_CREATE_SUB_KEY) \
; & \
; (~SYNCHRONIZE))
;
;#define KEY_EXECUTE ((KEY_READ) \
; & \
; (~SYNCHRONIZE))
;
;#define KEY_ALL_ACCESS ((STANDARD_RIGHTS_ALL |\
; KEY_QUERY_VALUE |\
; KEY_SET_VALUE |\
; KEY_CREATE_SUB_KEY |\
; KEY_ENUMERATE_SUB_KEYS |\
; KEY_NOTIFY |\
; KEY_CREATE_LINK) \
; & \
; (~SYNCHRONIZE))
;
;//
;// Open/Create Options
;//
;
;#define REG_OPTION_RESERVED (0x00000000L) // Parameter is reserved
;
;#define REG_OPTION_NON_VOLATILE (0x00000000L) // Key is preserved
; // when system is rebooted
;
;#define REG_OPTION_VOLATILE (0x00000001L) // Key is not preserved
; // when system is rebooted
;
;#define REG_OPTION_CREATE_LINK (0x00000002L) // Created key is a
; // symbolic link
;
;#define REG_OPTION_BACKUP_RESTORE (0x00000004L) // open for backup or restore
; // special access rules
; // privilege required
;
;#define REG_OPTION_OPEN_LINK (0x00000008L) // Open symbolic link
;
;#define REG_LEGAL_OPTION \
; (REG_OPTION_RESERVED |\
; REG_OPTION_NON_VOLATILE |\
; REG_OPTION_VOLATILE |\
; REG_OPTION_CREATE_LINK |\
; REG_OPTION_BACKUP_RESTORE |\
; REG_OPTION_OPEN_LINK)
;
;//
;// Key creation/open disposition
;//
;
;#define REG_CREATED_NEW_KEY (0x00000001L) // New Registry Key created
;#define REG_OPENED_EXISTING_KEY (0x00000002L) // Existing Key opened
;
;//
;// Key restore flags
;//
;
;#define REG_WHOLE_HIVE_VOLATILE (0x00000001L) // Restore whole hive volatile
;#define REG_REFRESH_HIVE (0x00000002L) // Unwind changes to last flush
;#define REG_NO_LAZY_FLUSH (0x00000004L) // Never lazy flush this hive
;#define REG_FORCE_RESTORE (0x00000008L) // Force the restore process even when we have open handles on subkeys
;
;//
;// Key query structures
;//
;
;typedef struct _KEY_BASIC_INFORMATION {
; LARGE_INTEGER LastWriteTime;
; ULONG TitleIndex;
; ULONG NameLength;
; WCHAR Name[1]; // Variable length string
;} KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
;
;typedef struct _KEY_NODE_INFORMATION {
; LARGE_INTEGER LastWriteTime;
; ULONG TitleIndex;
; ULONG ClassOffset;
; ULONG ClassLength;
; ULONG NameLength;
; WCHAR Name[1]; // Variable length string
;// Class[1]; // Variable length string not declared
;} KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
;
;typedef struct _KEY_FULL_INFORMATION {
; LARGE_INTEGER LastWriteTime;
; ULONG TitleIndex;
; ULONG ClassOffset;
; ULONG ClassLength;
; ULONG SubKeys;
; ULONG MaxNameLen;
; ULONG MaxClassLen;
; ULONG Values;
; ULONG MaxValueNameLen;
; ULONG MaxValueDataLen;
; WCHAR Class[1]; // Variable length
;} KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
;
;// end_wdm
;typedef struct _KEY_NAME_INFORMATION {
; ULONG NameLength;
; WCHAR Name[1]; // Variable length string
;} KEY_NAME_INFORMATION, *PKEY_NAME_INFORMATION;
;
;// begin_wdm
;typedef enum _KEY_INFORMATION_CLASS {
; KeyBasicInformation,
; KeyNodeInformation,
; KeyFullInformation
;// end_wdm
; ,
; KeyNameInformation
;// begin_wdm
;} KEY_INFORMATION_CLASS;
;
;typedef struct _KEY_WRITE_TIME_INFORMATION {
; LARGE_INTEGER LastWriteTime;
;} KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;
;
;typedef enum _KEY_SET_INFORMATION_CLASS {
; KeyWriteTimeInformation
;} KEY_SET_INFORMATION_CLASS;
;
;//
;// Value entry query structures
;//
;
;typedef struct _KEY_VALUE_BASIC_INFORMATION {
; ULONG TitleIndex;
; ULONG Type;
; ULONG NameLength;
; WCHAR Name[1]; // Variable size
;} KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
;
;typedef struct _KEY_VALUE_FULL_INFORMATION {
; ULONG TitleIndex;
; ULONG Type;
; ULONG DataOffset;
; ULONG DataLength;
; ULONG NameLength;
; WCHAR Name[1]; // Variable size
;// Data[1]; // Variable size data not declared
;} KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
;
;typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
; ULONG TitleIndex;
; ULONG Type;
; ULONG DataLength;
; UCHAR Data[1]; // Variable size
;} KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
;
;typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
; ULONG Type;
; ULONG DataLength;
; UCHAR Data[1]; // Variable size
;} KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
;
;typedef struct _KEY_VALUE_ENTRY {
; PUNICODE_STRING ValueName;
; ULONG DataLength;
; ULONG DataOffset;
; ULONG Type;
;} KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
;
;typedef enum _KEY_VALUE_INFORMATION_CLASS {
; KeyValueBasicInformation,
; KeyValueFullInformation,
; KeyValuePartialInformation,
; KeyValueFullInformationAlign64,
; KeyValuePartialInformationAlign64
;} KEY_VALUE_INFORMATION_CLASS;
;
;
;
;#define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
;
;//
;// Object Manager Object Type Specific Access Rights.
;//
;
;#define OBJECT_TYPE_CREATE (0x0001)
;
;#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
;
;//
;// Object Manager Directory Specific Access Rights.
;//
;
;#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)
;
;//
;// Object Manager Symbolic Link Specific Access Rights.
;//
;
;#define SYMBOLIC_LINK_QUERY (0x0001)
;
;#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
;
;typedef struct _OBJECT_NAME_INFORMATION {
; UNICODE_STRING Name;
;} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
;#define DUPLICATE_CLOSE_SOURCE 0x00000001 // winnt
;#define DUPLICATE_SAME_ACCESS 0x00000002 // winnt
;#define DUPLICATE_SAME_ATTRIBUTES 0x00000004
;
;//
;// Section Information Structures.
;//
;
;typedef enum _SECTION_INHERIT {
; ViewShare = 1,
; ViewUnmap = 2
;} SECTION_INHERIT;
;
;//
;// Section Access Rights.
;//
;
;// begin_winnt
;#define SECTION_QUERY 0x0001
;#define SECTION_MAP_WRITE 0x0002
;#define SECTION_MAP_READ 0x0004
;#define SECTION_MAP_EXECUTE 0x0008
;#define SECTION_EXTEND_SIZE 0x0010
;
;#define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
; SECTION_MAP_WRITE | \
; SECTION_MAP_READ | \
; SECTION_MAP_EXECUTE | \
; SECTION_EXTEND_SIZE)
;// end_winnt
;
;#define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
;
;#define PAGE_NOACCESS 0x01 // winnt
;#define PAGE_READONLY 0x02 // winnt
;#define PAGE_READWRITE 0x04 // winnt
;#define PAGE_WRITECOPY 0x08 // winnt
;#define PAGE_EXECUTE 0x10 // winnt
;#define PAGE_EXECUTE_READ 0x20 // winnt
;#define PAGE_EXECUTE_READWRITE 0x40 // winnt
;#define PAGE_EXECUTE_WRITECOPY 0x80 // winnt
;#define PAGE_GUARD 0x100 // winnt
;#define PAGE_NOCACHE 0x200 // winnt
;#define PAGE_WRITECOMBINE 0x400 // winnt
;
;#define MEM_COMMIT 0x1000
;#define MEM_RESERVE 0x2000
;#define MEM_DECOMMIT 0x4000
;#define MEM_RELEASE 0x8000
;#define MEM_FREE 0x10000
;#define MEM_PRIVATE 0x20000
;#define MEM_MAPPED 0x40000
;#define MEM_RESET 0x80000
;#define MEM_TOP_DOWN 0x100000
;#define MEM_LARGE_PAGES 0x20000000
;#define MEM_4MB_PAGES 0x80000000
;#define SEC_RESERVE 0x4000000
;#define PROCESS_DUP_HANDLE (0x0040) // winnt
;#define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
; 0xFFF)
;
;// end_ntifs
;
;#define MAXIMUM_PROCESSORS 32
;
;// end_winnt
;
;//
;// Thread Specific Access Rights
;//
;
;#define THREAD_TERMINATE (0x0001) // winnt
;#define THREAD_SET_INFORMATION (0x0020) // winnt
;
;#define THREAD_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \
; 0x3FF)
;
;//
;// ClientId
;//
;
;typedef struct _CLIENT_ID {
; HANDLE UniqueProcess;
; HANDLE UniqueThread;
;} CLIENT_ID;
;typedef CLIENT_ID *PCLIENT_ID;
;
;//
;// Thread Environment Block (and portable part of Thread Information Block)
;//
;
;//
;// NT_TIB - Thread Information Block - Portable part.
;//
;// This is the subsystem portable part of the Thread Information Block.
;// It appears as the first part of the TEB for all threads which have
;// a user mode component.
;//
;//
;
;// begin_winnt
;
;typedef struct _NT_TIB {
; struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
; PVOID StackBase;
; PVOID StackLimit;
; PVOID SubSystemTib;
; union {
; PVOID FiberData;
; ULONG Version;
; };
; PVOID ArbitraryUserPointer;
; struct _NT_TIB *Self;
;} NT_TIB;
;typedef NT_TIB *PNT_TIB;
;//
;// Process Information Classes
;//
;
;typedef enum _PROCESSINFOCLASS {
; ProcessBasicInformation,
; ProcessQuotaLimits,
; ProcessIoCounters,
; ProcessVmCounters,
; ProcessTimes,
; ProcessBasePriority,
; ProcessRaisePriority,
; ProcessDebugPort,
; ProcessExceptionPort,
; ProcessAccessToken,
; ProcessLdtInformation,
; ProcessLdtSize,
; ProcessDefaultHardErrorMode,
; ProcessIoPortHandlers, // Note: this is kernel mode only
; ProcessPooledUsageAndLimits,
; ProcessWorkingSetWatch,
; ProcessUserModeIOPL,
; ProcessEnableAlignmentFaultFixup,
; ProcessPriorityClass,
; ProcessWx86Information,
; ProcessHandleCount,
; ProcessAffinityMask,
; ProcessPriorityBoost,
; ProcessDeviceMap,
; ProcessSessionInformation,
; ProcessForegroundInformation,
; ProcessWow64Information,
; MaxProcessInfoClass
; } PROCESSINFOCLASS;
;//
;// Thread Information Classes
;//
;
;typedef enum _THREADINFOCLASS {
; ThreadBasicInformation,
; ThreadTimes,
; ThreadPriority,
; ThreadBasePriority,
; ThreadAffinityMask,
; ThreadImpersonationToken,
; ThreadDescriptorTableEntry,
; ThreadEnableAlignmentFaultFixup,
; ThreadEventPair_Reusable,
; ThreadQuerySetWin32StartAddress,
; ThreadZeroTlsCell,
; ThreadPerformanceCount,
; ThreadAmILastThread,
; ThreadIdealProcessor,
; ThreadPriorityBoost,
; ThreadSetTlsArrayAddress,
; ThreadIsIoPending,
; ThreadHideFromDebugger,
; MaxThreadInfoClass
; } THREADINFOCLASS;
;//
;// Process Information Structures
;//
;
;//
;// PageFaultHistory Information
;// NtQueryInformationProcess using ProcessWorkingSetWatch
;//
;typedef struct _PROCESS_WS_WATCH_INFORMATION {
; PVOID FaultingPc;
; PVOID FaultingVa;
;} PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;
;
;//
;// Basic Process Information
;// NtQueryInformationProcess using ProcessBasicInfo
;//
;
;typedef struct _PROCESS_BASIC_INFORMATION {
; NTSTATUS ExitStatus;
; PPEB PebBaseAddress;
; ULONG_PTR AffinityMask;
; KPRIORITY BasePriority;
; ULONG_PTR UniqueProcessId;
; ULONG_PTR InheritedFromUniqueProcessId;
;} PROCESS_BASIC_INFORMATION;
;typedef PROCESS_BASIC_INFORMATION *PPROCESS_BASIC_INFORMATION;
;
;
;//
;// Process Device Map information
;// NtQueryInformationProcess using ProcessDeviceMap
;// NtSetInformationProcess using ProcessDeviceMap
;//
;
;typedef struct _PROCESS_DEVICEMAP_INFORMATION {
; union {
; struct {
; HANDLE DirectoryHandle;
; } Set;
; struct {
; ULONG DriveMap;
; UCHAR DriveType[ 32 ];
; } Query;
; };
;} PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
;
;
;//
;// Multi-User Session specific Process Information
;// NtQueryInformationProcess using ProcessSessionInformation
;//
;
;typedef struct _PROCESS_SESSION_INFORMATION {
; ULONG SessionId;
;} PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;
;
;
;//
;// Process Quotas
;// NtQueryInformationProcess using ProcessQuotaLimits
;// NtQueryInformationProcess using ProcessPooledQuotaLimits
;// NtSetInformationProcess using ProcessQuotaLimits
;//
;
;// begin_winnt begin_ntsrv
;
;typedef struct _QUOTA_LIMITS {
; SIZE_T PagedPoolLimit;
; SIZE_T NonPagedPoolLimit;
; SIZE_T MinimumWorkingSetSize;
; SIZE_T MaximumWorkingSetSize;
; SIZE_T PagefileLimit;
; LARGE_INTEGER TimeLimit;
;} QUOTA_LIMITS;
;typedef QUOTA_LIMITS *PQUOTA_LIMITS;
;
;// end_winnt end_ntsrv
;
;//
;// Process I/O Counters
;// NtQueryInformationProcess using ProcessIoCounters
;//
;
;// begin_winnt
;typedef struct _IO_COUNTERS {
; ULONGLONG ReadOperationCount;
; ULONGLONG WriteOperationCount;
; ULONGLONG OtherOperationCount;
; ULONGLONG ReadTransferCount;
; ULONGLONG WriteTransferCount;
; ULONGLONG OtherTransferCount;
;} IO_COUNTERS;
;typedef IO_COUNTERS *PIO_COUNTERS;
;// end_winnt
;
;//
;// Process Virtual Memory Counters
;// NtQueryInformationProcess using ProcessVmCounters
;//
;
;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;
;typedef VM_COUNTERS *PVM_COUNTERS;
;
;//
;// Process Pooled Quota Usage and Limits
;// NtQueryInformationProcess using ProcessPooledUsageAndLimits
;//
;
;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;
;typedef POOLED_USAGE_AND_LIMITS *PPOOLED_USAGE_AND_LIMITS;
;
;//
;// Process Security Context Information
;// NtSetInformationProcess using ProcessAccessToken
;// PROCESS_SET_ACCESS_TOKEN access to the process is needed
;// to use this info level.
;//
;
;typedef struct _PROCESS_ACCESS_TOKEN {
;
; //
; // Handle to Primary token to assign to the process.
; // TOKEN_ASSIGN_PRIMARY access to this token is needed.
; //
;
; HANDLE Token;
;
; //
; // Handle to the initial thread of the process.
; // A process's access token can only be changed if the process has
; // no threads or one thread. If the process has no threads, this
; // field must be set to NULL. Otherwise, it must contain a handle
; // open to the process's only thread. THREAD_QUERY_INFORMATION access
; // is needed via this handle.
;
; HANDLE Thread;
;
;} PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
;
;//
;// Process/Thread System and User Time
;// NtQueryInformationProcess using ProcessTimes
;// NtQueryInformationThread using ThreadTimes
;//
;
;typedef struct _KERNEL_USER_TIMES {
; LARGE_INTEGER CreateTime;
; LARGE_INTEGER ExitTime;
; LARGE_INTEGER KernelTime;
; LARGE_INTEGER UserTime;
;} KERNEL_USER_TIMES;
;typedef KERNEL_USER_TIMES *PKERNEL_USER_TIMES;
;NTSYSCALLAPI
;NTSTATUS
;NTAPI
;NtOpenProcess (
; OUT PHANDLE ProcessHandle,
; IN ACCESS_MASK DesiredAccess,
; IN POBJECT_ATTRIBUTES ObjectAttributes,
; IN PCLIENT_ID ClientId OPTIONAL
; );
;#define NtCurrentProcess() ( (HANDLE) -1 )
;NTSYSCALLAPI
;NTSTATUS
;NTAPI
;NtQueryInformationProcess(
; IN HANDLE ProcessHandle,
; IN PROCESSINFOCLASS ProcessInformationClass,
; OUT PVOID ProcessInformation,
; IN ULONG ProcessInformationLength,
; OUT PULONG ReturnLength OPTIONAL
; );
;#define NtCurrentThread() ( (HANDLE) -2 )
;
;#ifndef _PO_DDK_
;#define _PO_DDK_
;
;typedef enum _SYSTEM_POWER_STATE {
; PowerSystemUnspecified = 0,
; PowerSystemWorking,
; PowerSystemSleeping1,
; PowerSystemSleeping2,
; PowerSystemSleeping3,
; PowerSystemHibernate,
; PowerSystemShutdown,
; PowerSystemMaximum
;} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
;
;typedef enum {
; PowerActionNone = 0,
; PowerActionReserved,
; PowerActionSleep,
; PowerActionHibernate,
; PowerActionShutdown,
; PowerActionShutdownReset,
; PowerActionShutdownOff,
; PowerActionWarmEject
;} POWER_ACTION, *PPOWER_ACTION;
;
;typedef enum _DEVICE_POWER_STATE {
; PowerDeviceUnspecified = 0,
; PowerDeviceD0,
; PowerDeviceD1,
; PowerDeviceD2,
; PowerDeviceD3,
; PowerDeviceMaximum
;} DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
;
;typedef union _POWER_STATE {
; SYSTEM_POWER_STATE SystemState;
; DEVICE_POWER_STATE DeviceState;
;} POWER_STATE, *PPOWER_STATE;
;
;typedef enum _POWER_STATE_TYPE {
; SystemPowerState = 0,
; DevicePowerState
;} POWER_STATE_TYPE, *PPOWER_STATE_TYPE;
;
;
;//
;// Generic power related IOCTLs
;//
;
;#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)
;
;
;//
;// Defines for W32 interfaces
;//
;
;// begin_winnt
;
;#define ES_SYSTEM_REQUIRED ((ULONG)0x00000001)
;#define ES_DISPLAY_REQUIRED ((ULONG)0x00000002)
;#define ES_USER_PRESENT ((ULONG)0x00000004)
;#define ES_CONTINUOUS ((ULONG)0x80000000)
;
;typedef ULONG EXECUTION_STATE;
;
;typedef enum {
; LT_DONT_CARE,
; LT_LOWEST_LATENCY
;} LATENCY_TIME;
;
;// end_winnt end_ntminiport end_wdm end_ntifs
;
;typedef enum {
; SystemPowerPolicyAc,
; SystemPowerPolicyDc,
; VerifySystemPolicyAc,
; VerifySystemPolicyDc,
; SystemPowerCapabilities,
; SystemBatteryState,
; SystemPowerStateHandler,
; ProcessorStateHandler,
; SystemPowerPolicyCurrent,
; AdministratorPowerPolicy,
; SystemReserveHiberFile,
; ProcessorInformation,
; SystemPowerInformation
;} POWER_INFORMATION_LEVEL;
;
;// begin_ntminiport begin_wdm begin_ntifs
;
;#endif // !_PO_DDK_
;
;
;#if defined(_X86_)
;
;//
;// Types to use to contain PFNs and their counts.
;//
;
;typedef ULONG PFN_COUNT;
;
;typedef LONG SPFN_NUMBER, *PSPFN_NUMBER;
;typedef ULONG PFN_NUMBER, *PPFN_NUMBER;
;
;//
;// Define maximum size of flush multiple TB request.
;//
;
;#define FLUSH_MULTIPLE_MAXIMUM 16
;
;//
;// Indicate that the i386 compiler supports the pragma textout construct.
;//
;
;#define ALLOC_PRAGMA 1
;//
;// Indicate that the i386 compiler supports the DATA_SEG("INIT") and
;// DATA_SEG("PAGE") pragmas
;//
;
;#define ALLOC_DATA_PRAGMA 1
;
;#define NORMAL_DISPATCH_LENGTH 106
;#define DISPATCH_LENGTH NORMAL_DISPATCH_LENGTH
;//
;// STATUS register for each MCA bank.
;//
;
;typedef union _MCI_STATS {
; struct {
; USHORT McaCod;
; USHORT MsCod;
; ULONG OtherInfo : 25;
; ULONG Damage : 1;
; ULONG AddressValid : 1;
; ULONG MiscValid : 1;
; ULONG Enabled : 1;
; ULONG UnCorrected : 1;
; ULONG OverFlow : 1;
; ULONG Valid : 1;
; } MciStats;
;
; ULONGLONG QuadPart;
;
;} MCI_STATS, *PMCI_STATS;
;
;//
;// Interrupt Request Level definitions
;//
;
;#define PASSIVE_LEVEL 0 // Passive release level
;#define LOW_LEVEL 0 // Lowest interrupt level
;#define APC_LEVEL 1 // APC interrupt level
;#define DISPATCH_LEVEL 2 // Dispatcher level
;
;#define PROFILE_LEVEL 27 // timer used for profiling.
;#define CLOCK1_LEVEL 28 // Interval clock 1 level - Not used on x86
;#define CLOCK2_LEVEL 28 // Interval clock 2 level
;#define IPI_LEVEL 29 // Interprocessor interrupt level
;#define POWER_LEVEL 30 // Power failure level
;#define HIGH_LEVEL 31 // Highest interrupt level
;#define SYNCH_LEVEL (IPI_LEVEL-1) // synchronization level
;
;//
;// I/O space read and write macros.
;//
;// These have to be actual functions on the 386, because we need
;// to use assembler, but cannot return a value if we inline it.
;//
;// The READ/WRITE_REGISTER_* calls manipulate I/O registers in MEMORY space.
;// (Use x86 move instructions, with LOCK prefix to force correct behavior
;// w.r.t. caches and write buffers.)
;//
;// The READ/WRITE_PORT_* calls manipulate I/O registers in PORT space.
;// (Use x86 in/out instructions.)
;//
;
;NTHALAPI
;UCHAR
;READ_REGISTER_UCHAR(
; PUCHAR Register
; );
;
;NTHALAPI
;USHORT
;READ_REGISTER_USHORT(
; PUSHORT Register
; );
;
;NTHALAPI
;ULONG
;READ_REGISTER_ULONG(
; PULONG Register
; );
;
;NTHALAPI
;VOID
;READ_REGISTER_BUFFER_UCHAR(
; PUCHAR Register,
; PUCHAR Buffer,
; ULONG Count
; );
;
;NTHALAPI
;VOID
;READ_REGISTER_BUFFER_USHORT(
; PUSHORT Register,
; PUSHORT Buffer,
; ULONG Count
; );
;
;NTHALAPI
;VOID
;READ_REGISTER_BUFFER_ULONG(
; PULONG Register,
; PULONG Buffer,
; ULONG Count
; );
;
;
;NTHALAPI
;VOID
;WRITE_REGISTER_UCHAR(
; PUCHAR Register,
; UCHAR Value
; );
;
;NTHALAPI
;VOID
;WRITE_REGISTER_USHORT(
; PUSHORT Register,
; USHORT Value
; );
;
;NTHALAPI
;VOID
;WRITE_REGISTER_ULONG(
; PULONG Register,
; ULONG Value
; );
;
;NTHALAPI
;VOID
;WRITE_REGISTER_BUFFER_UCHAR(
; PUCHAR Register,
; PUCHAR Buffer,
; ULONG Count
; );
;
;NTHALAPI
;VOID
;WRITE_REGISTER_BUFFER_USHORT(
; PUSHORT Register,
; PUSHORT Buffer,
; ULONG Count
; );
;
;NTHALAPI
;VOID
;WRITE_REGISTER_BUFFER_ULONG(
; PULONG Register,
; PULONG Buffer,
; ULONG Count
; );
;
;NTHALAPI
;UCHAR
;READ_PORT_UCHAR(
; PUCHAR Port
; );
;
;NTHALAPI
;USHORT
;READ_PORT_USHORT(
; PUSHORT Port
; );
;
;NTHALAPI
;ULONG
;READ_PORT_ULONG(
; PULONG Port
; );
;
;NTHALAPI
;VOID
;READ_PORT_BUFFER_UCHAR(
; PUCHAR Port,
; PUCHAR Buffer,
; ULONG Count
; );
;
;NTHALAPI
;VOID
;READ_PORT_BUFFER_USHORT(
; PUSHORT Port,
; PUSHORT Buffer,
; ULONG Count
; );
;
;NTHALAPI
;VOID
;READ_PORT_BUFFER_ULONG(
; PULONG Port,
; PULONG Buffer,
; ULONG Count
; );
;
;NTHALAPI
;VOID
;WRITE_PORT_UCHAR(
; PUCHAR Port,
; UCHAR Value
; );
;
;NTHALAPI
;VOID
;WRITE_PORT_USHORT(
; PUSHORT Port,
; USHORT Value
; );
;
;NTHALAPI
;VOID
;WRITE_PORT_ULONG(
; PULONG Port,
; ULONG Value
; );
;
;NTHALAPI
;VOID
;WRITE_PORT_BUFFER_UCHAR(
; PUCHAR Port,
; PUCHAR Buffer,
; ULONG Count
; );
;
;NTHALAPI
;VOID
;WRITE_PORT_BUFFER_USHORT(
; PUSHORT Port,
; PUSHORT Buffer,
; ULONG Count
; );
;
;NTHALAPI
;VOID
;WRITE_PORT_BUFFER_ULONG(
; PULONG Port,
; PULONG Buffer,
; ULONG Count
; );
;
;// end_ntndis
;//
;// Get data cache fill size.
;//
;
;#define KeGetDcacheFillSize() 1L
;
;
;#define KeFlushIoBuffers(Mdl, ReadOperation, DmaOperation)
;
;
;#define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
;#define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
;#define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
;#define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
;
;
;#define KeQueryTickCount(CurrentCount ) { \
; volatile PKSYSTEM_TIME _TickCount = *((PKSYSTEM_TIME *)(&KeTickCount)); \
; while (TRUE) { \
; (CurrentCount)->HighPart = _TickCount->High1Time; \
; (CurrentCount)->LowPart = _TickCount->LowPart; \
; if ((CurrentCount)->HighPart == _TickCount->High2Time) break; \
; _asm { rep nop } \
; } \
;}
;
;
;//
;// Processor Control Region Structure Definition
;//
;
;#define PCR_MINOR_VERSION 1
;#define PCR_MAJOR_VERSION 1
;
;typedef struct _KPCR {
;
;//
;// Start of the architecturally defined section of the PCR. This section
;// may be directly addressed by vendor/platform specific HAL code and will
;// not change from version to version of NT.
;//
;
; NT_TIB NtTib;
; struct _KPCR *SelfPcr; // flat address of this PCR
; struct _KPRCB *Prcb; // pointer to Prcb
; KIRQL Irql;
; ULONG IRR;
; ULONG IrrActive;
; ULONG IDR;
; ULONG Reserved2;
;
; struct _KIDTENTRY *IDT;
; struct _KGDTENTRY *GDT;
; struct _KTSS *TSS;
; USHORT MajorVersion;
; USHORT MinorVersion;
; KAFFINITY SetMember;
; ULONG StallScaleFactor;
; UCHAR DebugActive;
; UCHAR Number;
;
;} KPCR;
;typedef KPCR *PKPCR;
;
;//
;// The non-volatile 387 state
;//
;
;typedef struct _KFLOATING_SAVE {
; ULONG ControlWord;
; ULONG StatusWord;
; ULONG ErrorOffset;
; ULONG ErrorSelector;
; ULONG DataOffset; // Not used in wdm
; ULONG DataSelector;
; ULONG Cr0NpxState;
; ULONG Spare1; // Not used in wdm
;} KFLOATING_SAVE, *PKFLOATING_SAVE;
;
;//
;// i386 Specific portions of mm component
;//
;
;//
;// Define the page size for the Intel 386 as 4096 (0x1000).
;//
;
;#define PAGE_SIZE 0x1000
;
;//
;// Define the number of trailing zeroes in a page aligned virtual address.
;// This is used as the shift count when shifting virtual addresses to
;// virtual page numbers.
;//
;
;#define PAGE_SHIFT 12L
;
;// end_ntndis end_wdm
;//
;// Define the number of bits to shift to right justify the Page Directory Index
;// field of a PTE.
;//
;
;#define PDI_SHIFT_X86 22
;#define PDI_SHIFT_X86PAE 21
;
;#if !defined (_X86PAE_)
;#define PDI_SHIFT PDI_SHIFT_X86
;#else
;#define PDI_SHIFT PDI_SHIFT_X86PAE
;#define PPI_SHIFT 30
;#endif
;
;//
;// Define the number of bits to shift to right justify the Page Table Index
;// field of a PTE.
;//
;
;#define PTI_SHIFT 12
;
;//
;// Define the highest user address and user probe address.
;//
;
;
;extern PVOID *MmHighestUserAddress;
;extern PVOID *MmSystemRangeStart;
;extern ULONG *MmUserProbeAddress;
;
;#define MM_HIGHEST_USER_ADDRESS *MmHighestUserAddress
;#define MM_SYSTEM_RANGE_START *MmSystemRangeStart
;#define MM_USER_PROBE_ADDRESS *MmUserProbeAddress
;
;//
;// The lowest user address reserves the low 64k.
;//
;
;#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
;
;//
;// The lowest address for system space.
;//
;
;#if !defined (_X86PAE_)
;#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000
;#else
;#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
;#endif
;
;// begin_wdm
;
;#define MmGetProcedureAddress(Address) (Address)
;#define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
;
;
;#define KI_USER_SHARED_DATA 0xffdf0000
;#define SharedUserData ((KUSER_SHARED_DATA * const) KI_USER_SHARED_DATA)
;
;//
;// Result type definition for i386. (Machine specific enumerate type
;// which is return type for portable exinterlockedincrement/decrement
;// procedures.) In general, you should use the enumerated type defined
;// in ex.h instead of directly referencing these constants.
;//
;
;// Flags loaded into AH by LAHF instruction
;
;#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)
;
;//
;// Convert various portable ExInterlock APIs into their architectural
;// equivalents.
;//
;
;#define ExInterlockedIncrementLong(Addend,Lock) \
; Exfi386InterlockedIncrementLong(Addend)
;
;#define ExInterlockedDecrementLong(Addend,Lock) \
; Exfi386InterlockedDecrementLong(Addend)
;
;#define ExInterlockedExchangeUlong(Target,Value,Lock) \
; Exfi386InterlockedExchangeUlong(Target,Value)
;
;// begin_wdm
;
;#define ExInterlockedAddUlong ExfInterlockedAddUlong
;#define ExInterlockedInsertHeadList ExfInterlockedInsertHeadList
;#define ExInterlockedInsertTailList ExfInterlockedInsertTailList
;#define ExInterlockedRemoveHeadList ExfInterlockedRemoveHeadList
;#define ExInterlockedPopEntryList ExfInterlockedPopEntryList
;#define ExInterlockedPushEntryList ExfInterlockedPushEntryList
;
;// end_wdm
;
;//
;// Prototypes for architectural specific versions of Exi386 Api
;//
;
;//
;// Interlocked result type is portable, but its values are machine specific.
;// Constants for value are in i386.h, mips.h, etc.
;//
;
;typedef enum _INTERLOCKED_RESULT {
; ResultNegative = RESULT_NEGATIVE,
; ResultZero = RESULT_ZERO,
; ResultPositive = RESULT_POSITIVE
;} INTERLOCKED_RESULT;
;
;NTKERNELAPI
;INTERLOCKED_RESULT
;FASTCALL
;Exfi386InterlockedIncrementLong (
; IN PLONG Addend
; );
;
;NTKERNELAPI
;INTERLOCKED_RESULT
;FASTCALL
;Exfi386InterlockedDecrementLong (
; IN PLONG Addend
; );
;
;NTKERNELAPI
;LARGE_INTEGER
;ExInterlockedExchangeAddLargeInteger (
; IN PLARGE_INTEGER Addend,
; IN LARGE_INTEGER Increment,
; IN PKSPIN_LOCK Lock
; );
;
;NTKERNELAPI
;ULONG
;FASTCALL
;Exfi386InterlockedExchangeUlong (
; IN PULONG Target,
; IN ULONG Value
; );
;
;//
;// Intrinsic interlocked functions
;//
;
;#if (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(NO_INTERLOCKED_INTRINSICS)) && !defined(_WINBASE_)
;
;// begin_wdm
;
;NTKERNELAPI
;LONG
;FASTCALL
;InterlockedIncrement(
; IN PLONG Addend
; );
;
;NTKERNELAPI
;LONG
;FASTCALL
;InterlockedDecrement(
; IN PLONG Addend
; );
;
;NTKERNELAPI
;LONG
;FASTCALL
;InterlockedExchange(
; IN OUT PLONG Target,
; IN LONG Value
; );
;
;#define InterlockedExchangePointer(Target, Value) \
; (PVOID)InterlockedExchange((PLONG)(Target), (LONG)(Value))
;
;LONG
;FASTCALL
;InterlockedExchangeAdd(
; IN OUT PLONG Addend,
; IN LONG Increment
; );
;
;NTKERNELAPI
;LONG
;FASTCALL
;InterlockedCompareExchange(
; IN OUT PLONG Destination,
; IN LONG ExChange,
; IN LONG Comperand
; );
;
;#define InterlockedCompareExchangePointer(Destination, ExChange, Comperand) \
; (PVOID)InterlockedCompareExchange((PLONG)Destination, (LONG)ExChange, (LONG)Comperand)
;
;// end_wdm
;
;#endif
;
;
;#if !defined(MIDL_PASS) && defined(_M_IX86)
;
;//
;// i386 function definitions
;//
;
;#pragma warning(disable:4035) // re-enable below
;
; #define _PCR fs:[0]
;
;//
;// Get current IRQL.
;//
;// On x86 this function resides in the HAL
;//
;
;NTHALAPI
;KIRQL
;KeGetCurrentIrql();
;
;// end_wdm
;//
;// Get the current processor number
;//
;
;__inline ULONG KeGetCurrentProcessorNumber(VOID)
;{
; __asm { movzx eax, _PCR KPCR.Number }
;}
;
;
;#endif // !defined(MIDL_PASS) && defined(_M_IX86)
;
;
;NTKERNELAPI
;NTSTATUS
;NTAPI
;KeSaveFloatingPointState (
; OUT PKFLOATING_SAVE FloatSave
; );
;
;NTKERNELAPI
;NTSTATUS
;NTAPI
;KeRestoreFloatingPointState (
; IN PKFLOATING_SAVE FloatSave
; );
;
;
;#endif // defined(_X86_)
;
;
;// Use the following for kernel mode runtime checks of X86 system architecture
;
;#ifdef _X86_
;
;#ifdef IsNEC_98
;#undef IsNEC_98
;#endif
;
;#ifdef IsNotNEC_98
;#undef IsNotNEC_98
;#endif
;
;#ifdef SetNEC_98
;#undef SetNEC_98
;#endif
;
;#ifdef SetNotNEC_98
;#undef SetNotNEC_98
;#endif
;
;#define IsNEC_98 (SharedUserData->AlternativeArchitecture == NEC98x86)
;#define IsNotNEC_98 (SharedUserData->AlternativeArchitecture != NEC98x86)
;#define SetNEC_98 SharedUserData->AlternativeArchitecture = NEC98x86
;#define SetNotNEC_98 SharedUserData->AlternativeArchitecture = StandardDesign
;
;#endif
;
;
;#if defined(_ALPHA_)
;#ifdef __cplusplus
;extern "C" {
;#endif
;
;//
;// Types to use to contain PFNs and their counts.
;//
;
;typedef ULONG PFN_COUNT;
;
;typedef LONG_PTR SPFN_NUMBER, *PSPFN_NUMBER;
;typedef ULONG_PTR PFN_NUMBER, *PPFN_NUMBER;
;
;//
;// Define maximum size of flush multiple TB request.
;//
;
;#define FLUSH_MULTIPLE_MAXIMUM 16
;
;//
;// Indicate that the Alpha compiler supports the pragma textout construct.
;//
;
;#define ALLOC_PRAGMA 1
;
;// end_ntndis
;//
;// Include the Alpha instruction definitions
;//
;
;#include "alphaops.h"
;
;//
;// Include reference machine definitions.
;//
;
;#include "alpharef.h"
;
;//
;// Define macro to generate import names.
;//
;
;#define IMPORT_NAME(name) __imp_##name
;
;//
;// Define length of interrupt vector table.
;//
;
;#define MAXIMUM_VECTOR 256
;
;//
;// Define bus error routine type.
;//
;
;struct _EXCEPTION_RECORD;
;struct _KEXCEPTION_FRAME;
;struct _KTRAP_FRAME;
;
;typedef
;BOOLEAN
;(*PKBUS_ERROR_ROUTINE) (
; IN struct _EXCEPTION_RECORD *ExceptionRecord,
; IN struct _KEXCEPTION_FRAME *ExceptionFrame,
; IN struct _KTRAP_FRAME *TrapFrame
; );
;
;
;#define PCR_MINOR_VERSION 1
;#define PCR_MAJOR_VERSION 1
;
;typedef struct _KPCR {
;
;//
;// Major and minor version numbers of the PCR.
;//
;
; ULONG MinorVersion;
; ULONG MajorVersion;
;
;//
;// Start of the architecturally defined section of the PCR. This section
;// may be directly addressed by vendor/platform specific PAL/HAL code and will
;// not change from version to version of NT.
;
;//
;// PALcode information.
;//
;
; ULONGLONG PalBaseAddress;
; ULONG PalMajorVersion;
; ULONG PalMinorVersion;
; ULONG PalSequenceVersion;
; ULONG PalMajorSpecification;
; ULONG PalMinorSpecification;
;
;//
;// Firmware restart information.
;//
;
; ULONGLONG FirmwareRestartAddress;
; PVOID RestartBlock;
;
;//
;// Reserved per-processor region for the PAL (3K-8 bytes).
;//
;
; ULONGLONG PalReserved[383];
;
;//
;// Alignment fixup count updated by PAL and read by kernel.
;//
;
; ULONGLONG PalAlignmentFixupCount;
;
;//
;// Panic Stack Address.
;//
;
; PVOID PanicStack;
;
;//
;// Processor parameters.
;//
;
; ULONG ProcessorType;
; ULONG ProcessorRevision;
; ULONG PhysicalAddressBits;
; ULONG MaximumAddressSpaceNumber;
; ULONG PageSize;
; ULONG FirstLevelDcacheSize;
; ULONG FirstLevelDcacheFillSize;
; ULONG FirstLevelIcacheSize;
; ULONG FirstLevelIcacheFillSize;
;
;//
;// System Parameters.
;//
;
; ULONG FirmwareRevisionId;
; UCHAR SystemType[8];
; ULONG SystemVariant;
; ULONG SystemRevision;
; UCHAR SystemSerialNumber[16];
; ULONG CycleClockPeriod;
; ULONG SecondLevelCacheSize;
; ULONG SecondLevelCacheFillSize;
; ULONG ThirdLevelCacheSize;
; ULONG ThirdLevelCacheFillSize;
; ULONG FourthLevelCacheSize;
; ULONG FourthLevelCacheFillSize;
;
;//
;// Pointer to processor control block.
;//
;
; struct _KPRCB *Prcb;
;
;//
;// Processor identification.
;//
;
; CCHAR Number;
; KAFFINITY SetMember;
;
;//
;// Reserved per-processor region for the HAL (.5K bytes).
;//
;
; ULONGLONG HalReserved[64];
;
;//
;// IRQL mapping tables.
;//
;
; ULONG IrqlTable[8];
;
;#define SFW_IMT_ENTRIES 4
;#define HDW_IMT_ENTRIES 128
;
; struct _IRQLMASK {
; USHORT IrqlTableIndex; // synchronization irql level
; USHORT IDTIndex; // vector in IDT
; } IrqlMask[SFW_IMT_ENTRIES + HDW_IMT_ENTRIES];
;
;//
;// Interrupt Dispatch Table (IDT).
;//
;
; PKINTERRUPT_ROUTINE InterruptRoutine[MAXIMUM_VECTOR];
;
;//
;// Reserved vectors mask, these vectors cannot be attached to via
;// standard interrupt objects.
;//
;
; ULONG ReservedVectors;
;
;//
;// Complement of processor affinity mask.
;//
;
; KAFFINITY NotMember;
;
; ULONG InterruptInProgress;
; ULONG DpcRequested;
;
;//
;// Pointer to machine check handler
;//
;
; PKBUS_ERROR_ROUTINE MachineCheckError;
;
;//
;// DPC Stack.
;//
;
; PVOID DpcStack;
;
;//
;// End of the architecturally defined section of the PCR. This section
;// may be directly addressed by vendor/platform specific HAL code and will
;// not change from version to version of NT. Some of these values are
;// reserved for chip-specific palcode.
;} KPCR, *PKPCR;
;
;#if defined(_AXP64_)
;
;#define KI_USER_SHARED_DATA 0xffffffffff000000UI64
;
;#else
;
;#define KI_USER_SHARED_DATA 0xff000000UL
;
;#endif
;
;#define SharedUserData ((KUSER_SHARED_DATA * const) KI_USER_SHARED_DATA)
;
;// begin_wdm
;//
;// length of dispatch code in interrupt template
;//
;#define DISPATCH_LENGTH 4
;
;//
;// Define IRQL levels across the architecture.
;//
;
;#define PASSIVE_LEVEL 0
;#define LOW_LEVEL 0
;#define APC_LEVEL 1
;#define DISPATCH_LEVEL 2
;#define HIGH_LEVEL 7
;#define SYNCH_LEVEL (IPI_LEVEL-1)
;
;//
;// Non-volatile floating point state
;//
;
;typedef struct _KFLOATING_SAVE {
; ULONGLONG Fpcr;
; ULONGLONG SoftFpcr;
; ULONG Reserved1; // These reserved words are here to make it
; ULONG Reserved2; // the same size as i386/WDM.
; ULONG Reserved3;
; ULONG Reserved4;
;} KFLOATING_SAVE, *PKFLOATING_SAVE;
;
;//
;// Processor Control Block (PRCB)
;//
;
;#define PRCB_MINOR_VERSION 1
;#define PRCB_MAJOR_VERSION 2
;#define PRCB_BUILD_DEBUG 0x0001
;#define PRCB_BUILD_UNIPROCESSOR 0x0002
;
;typedef struct _KPRCB {
;
;//
;// Major and minor version numbers of the PCR.
;//
;
; USHORT MinorVersion;
; USHORT MajorVersion;
;
;//
;// Start of the architecturally defined section of the PRCB. This section
;// may be directly addressed by vendor/platform specific HAL code and will
;// not change from version to version of NT.
;//
;
; struct _KTHREAD *CurrentThread;
; struct _KTHREAD *NextThread;
; struct _KTHREAD *IdleThread;
; CCHAR Number;
; CCHAR Reserved;
; USHORT BuildType;
; KAFFINITY SetMember;
; struct _RESTART_BLOCK *RestartBlock;
;
;//
;// End of the architecturally defined section of the PRCB. This section
;// may be directly addressed by vendor/platform specific HAL code and will
;// not change from version to version of NT.
;//
;} KPRCB, *PKPRCB, *RESTRICTED_POINTER PRKPRCB;
;//
;// I/O space read and write macros.
;//
;// These have to be actual functions on Alpha, because we need
;// to shift the VA and OR in the BYTE ENABLES.
;//
;// These can become INLINEs if we require that ALL Alpha systems shift
;// the same number of bits and have the SAME byte enables.
;//
;// The READ/WRITE_REGISTER_* calls manipulate I/O registers in MEMORY space?
;//
;// The READ/WRITE_PORT_* calls manipulate I/O registers in PORT space?
;//
;
;NTHALAPI
;UCHAR
;READ_REGISTER_UCHAR(
; PUCHAR Register
; );
;
;NTHALAPI
;USHORT
;READ_REGISTER_USHORT(
; PUSHORT Register
; );
;
;NTHALAPI
;ULONG
;READ_REGISTER_ULONG(
; PULONG Register
; );
;
;NTHALAPI
;VOID
;READ_REGISTER_BUFFER_UCHAR(
; PUCHAR Register,
; PUCHAR Buffer,
; ULONG Count
; );
;
;NTHALAPI
;VOID
;READ_REGISTER_BUFFER_USHORT(
; PUSHORT Register,
; PUSHORT Buffer,
; ULONG Count
; );
;
;NTHALAPI
;VOID
;READ_REGISTER_BUFFER_ULONG(
; PULONG Register,
; PULONG Buffer,
; ULONG Count
; );
;
;
;NTHALAPI
;VOID
;WRITE_REGISTER_UCHAR(
; PUCHAR Register,
; UCHAR Value
; );
;
;NTHALAPI
;VOID
;WRITE_REGISTER_USHORT(
; PUSHORT Register,
; USHORT Value
; );
;
;NTHALAPI
;VOID
;WRITE_REGISTER_ULONG(
; PULONG Register,
; ULONG Value
; );
;
;NTHALAPI
;VOID
;WRITE_REGISTER_BUFFER_UCHAR(
; PUCHAR Register,
; PUCHAR Buffer,
; ULONG Count
; );
;
;NTHALAPI
;VOID
;WRITE_REGISTER_BUFFER_USHORT(
; PUSHORT Register,
; PUSHORT Buffer,
; ULONG Count
; );
;
;NTHALAPI
;VOID
;WRITE_REGISTER_BUFFER_ULONG(
; PULONG Register,
; PULONG Buffer,
; ULONG Count
; );
;
;NTHALAPI
;UCHAR
;READ_PORT_UCHAR(
; PUCHAR Port
; );
;
;NTHALAPI
;USHORT
;READ_PORT_USHORT(
; PUSHORT Port
; );
;
;NTHALAPI
;ULONG
;READ_PORT_ULONG(
; PULONG Port
; );
;
;NTHALAPI
;VOID
;READ_PORT_BUFFER_UCHAR(
; PUCHAR Port,
; PUCHAR Buffer,
; ULONG Count
; );
;
;NTHALAPI
;VOID
;READ_PORT_BUFFER_USHORT(
; PUSHORT Port,
; PUSHORT Buffer,
; ULONG Count
; );
;
;NTHALAPI
;VOID
;READ_PORT_BUFFER_ULONG(
; PULONG Port,
; PULONG Buffer,
; ULONG Count
; );
;
;NTHALAPI
;VOID
;WRITE_PORT_UCHAR(
; PUCHAR Port,
; UCHAR Value
; );
;
;NTHALAPI
;VOID
;WRITE_PORT_USHORT(
; PUSHORT Port,
; USHORT Value
; );
;
;NTHALAPI
;VOID
;WRITE_PORT_ULONG(
; PULONG Port,
; ULONG Value
; );
;
;NTHALAPI
;VOID
;WRITE_PORT_BUFFER_UCHAR(
; PUCHAR Port,
; PUCHAR Buffer,
; ULONG Count
; );
;
;NTHALAPI
;VOID
;WRITE_PORT_BUFFER_USHORT(
; PUSHORT Port,
; PUSHORT Buffer,
; ULONG Count
; );
;
;NTHALAPI
;VOID
;WRITE_PORT_BUFFER_ULONG(
; PULONG Port,
; PULONG Buffer,
; ULONG Count
; );
;
;// end_ntndis end_wdm
;//
;// Define Interlocked operation result values.
;//
;
;#define RESULT_ZERO 0
;#define RESULT_NEGATIVE 1
;#define RESULT_POSITIVE 2
;
;//
;// Interlocked result type is portable, but its values are machine specific.
;// Constants for value are in i386.h, mips.h, etc.
;//
;
;typedef enum _INTERLOCKED_RESULT {
; ResultNegative = RESULT_NEGATIVE,
; ResultZero = RESULT_ZERO,
; ResultPositive = RESULT_POSITIVE
;} INTERLOCKED_RESULT;
;
;//
;// Convert portable interlock interfaces to architecture specific interfaces.
;//
;
;#define ExInterlockedIncrementLong(Addend, Lock) \
; ExAlphaInterlockedIncrementLong(Addend)
;
;#define ExInterlockedDecrementLong(Addend, Lock) \
; ExAlphaInterlockedDecrementLong(Addend)
;
;#define ExInterlockedExchangeAddLargeInteger(Target, Value, Lock) \
; ExpInterlockedExchangeAddLargeInteger(Target, Value)
;
;#define ExInterlockedExchangeUlong(Target, Value, Lock) \
; ExAlphaInterlockedExchangeUlong(Target, Value)
;
;NTKERNELAPI
;INTERLOCKED_RESULT
;ExAlphaInterlockedIncrementLong (
; IN PLONG Addend
; );
;
;NTKERNELAPI
;INTERLOCKED_RESULT
;ExAlphaInterlockedDecrementLong (
; IN PLONG Addend
; );
;
;NTKERNELAPI
;LARGE_INTEGER
;ExpInterlockedExchangeAddLargeInteger (
; IN PLARGE_INTEGER Addend,
; IN LARGE_INTEGER Increment
; );
;
;NTKERNELAPI
;ULONG
;ExAlphaInterlockedExchangeUlong (
; IN PULONG Target,
; IN ULONG Value
; );
;
;// begin_wdm
;
;#if defined(_M_ALPHA) && !defined(RC_INVOKED)
;
;#define InterlockedIncrement _InterlockedIncrement
;#define InterlockedDecrement _InterlockedDecrement
;#define InterlockedExchange _InterlockedExchange
;#define InterlockedExchangeAdd _InterlockedExchangeAdd
;
;LONG
;InterlockedIncrement (
; IN OUT PLONG Addend
; );
;
;LONG
;InterlockedDecrement (
; IN OUT PLONG Addend
; );
;
;LONG
;InterlockedExchange (
; IN OUT PLONG Target,
; LONG Value
; );
;
;#if defined(_M_AXP64)
;
;#define InterlockedCompareExchange _InterlockedCompareExchange
;#define InterlockedCompareExchange64 _InterlockedCompareExchange64
;#define InterlockedExchangePointer _InterlockedExchangePointer
;#define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
;#define InterlockedExchange64 _InterlockedExchange64
;
;LONG
;InterlockedCompareExchange (
; IN OUT PLONG Destination,
; IN LONG ExChange,
; IN LONG Comperand
; );
;
;LONGLONG
;InterlockedCompareExchange64 (
; IN OUT PLONGLONG Destination,
; IN LONGLONG ExChange,
; IN LONGLONG Comperand
; );
;
;PVOID
;InterlockedExchangePointer (
; IN OUT PVOID *Target,
; IN PVOID Value
; );
;
;PVOID
;InterlockedCompareExchangePointer (
; IN OUT PVOID *Destination,
; IN PVOID ExChange,
; IN PVOID Comperand
; );
;
;LONGLONG
;InterlockedExchange64(
; IN OUT PLONGLONG Target,
; IN LONGLONG Value
; );
;
;#pragma intrinsic(_InterlockedCompareExchange64)
;#pragma intrinsic(_InterlockedExchangePointer)
;#pragma intrinsic(_InterlockedCompareExchangePointer)
;#pragma intrinsic(_InterlockedExchange64)
;
;#else
;
;#define InterlockedExchangePointer(Target, Value) \
; (PVOID)InterlockedExchange((PLONG)(Target), (LONG)(Value))
;
;#define InterlockedCompareExchange(Destination, ExChange, Comperand) \
; (LONG)_InterlockedCompareExchange((PVOID *)(Destination), (PVOID)(ExChange), (PVOID)(Comperand))
;
;#define InterlockedCompareExchangePointer(Destination, ExChange, Comperand) \
; _InterlockedCompareExchange(Destination, ExChange, Comperand)
;
;PVOID
;_InterlockedCompareExchange (
; IN OUT PVOID *Destination,
; IN PVOID ExChange,
; IN PVOID Comperand
; );
;
;NTKERNELAPI
;LONGLONG
;ExpInterlockedCompareExchange64 (
; IN OUT PLONGLONG Destination,
; IN PLONGLONG Exchange,
; IN PLONGLONG Comperand
; );
;
;#endif
;
;LONG
;InterlockedExchangeAdd(
; IN OUT PLONG Addend,
; IN LONG Value
; );
;
;#pragma intrinsic(_InterlockedIncrement)
;#pragma intrinsic(_InterlockedDecrement)
;#pragma intrinsic(_InterlockedExchange)
;#pragma intrinsic(_InterlockedExchangeAdd)
;#pragma intrinsic(_InterlockedCompareExchange)
;
;#endif
;
;// there is a lot of other stuff that could go in here
;// probe macros
;// others
;
;//
;// Define the page size for the Alpha ev4 and lca as 8k.
;//
;
;#define PAGE_SIZE 0x2000
;
;//
;// Define the number of trailing zeroes in a page aligned virtual address.
;// This is used as the shift count when shifting virtual addresses to
;// virtual page numbers.
;//
;
;#define PAGE_SHIFT 13L
;
;
;//
;// The highest user address reserves 64K bytes for a guard page. This is so
;// the probing of addresses from kernel mode only have to check the
;// starting address for structures of 64K bytes or less.
;//
;
;#if defined(_AXP64_)
;
;#define MM_HIGHEST_USER_ADDRESS (PVOID)0x3FFFFFEFFFF // highest user address
;#define MM_USER_PROBE_ADDRESS 0x3FFFFFF0000UI64 // guard page address
;#define MM_SYSTEM_RANGE_START (PVOID)0xFFFFFC0000000000 // start of system space
;
;#else
;
;#define MM_HIGHEST_USER_ADDRESS (PVOID)0x7FFEFFFF // highest user address
;#define MM_USER_PROBE_ADDRESS 0x7FFF0000 // starting address of guard page
;#define MM_SYSTEM_RANGE_START (PVOID)KSEG0_BASE // start of system space
;
;#endif
;
;
;//
;// The following definitions are required for the debugger data block.
;//
;
;extern PVOID MmHighestUserAddress;
;extern PVOID MmSystemRangeStart;
;extern ULONG_PTR MmUserProbeAddress;
;
;//
;// The lowest user address reserves the low 64k.
;//
;
;#define MM_LOWEST_USER_ADDRESS (PVOID)0x00010000
;
;// begin_wdm
;
;#define MmGetProcedureAddress(Address) (Address)
;#define MmLockPagableCodeSection(Address) MmLockPagableDataSection(Address)
;
;//
;// The lowest address for system space.
;//
;
;#if defined(_AXP64_)
;
;#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xFFFFFE0200000000
;
;#else
;
;#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000
;
;#endif
;
;
;//
;// Define prototypes to access PCR values
;//
;
;NTKERNELAPI
;KIRQL
;KeGetCurrentIrql();
;
;
;NTSTATUS
;KeSaveFloatingPointState (
; OUT PKFLOATING_SAVE FloatSave
; );
;
;NTSTATUS
;KeRestoreFloatingPointState (
; IN PKFLOATING_SAVE FloatSave
; );
;
;//
;// Get address of current PRCB.
;//
;
;#define KeGetCurrentPrcb() (PCR->Prcb)
;
;//
;// Get current processor number.
;//
;
;#define KeGetCurrentProcessorNumber() KeGetCurrentPrcb()->Number
;
;//
;// Cache and write buffer flush functions.
;//
;
;VOID
;KeFlushIoBuffers (
; IN PMDL Mdl,
; IN BOOLEAN ReadOperation,
; IN BOOLEAN DmaOperation
; );
;
;
;#define KeQueryTickCount(CurrentCount ) \
; *(PULONGLONG)(CurrentCount) = **((volatile ULONGLONG **)(&KeTickCount));
;
;
;#define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
;#define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
;#define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
;#define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
;
;#ifdef __cplusplus
;} // extern "C"
;#endif
;#endif // _ALPHA_
;
;#if defined(_IA64_)
;
;//
;// Types to use to contain PFNs and their counts.
;//
;
;typedef ULONG PFN_COUNT;
;
;typedef LONG_PTR SPFN_NUMBER, *PSPFN_NUMBER;
;typedef ULONG_PTR PFN_NUMBER, *PPFN_NUMBER;
;
;//
;// Define maximum size of flush multiple TB request.
;//
;
;#define FLUSH_MULTIPLE_MAXIMUM 100
;
;//
;// Indicate that the IA64 compiler supports the pragma textout construct.
;//
;
;#define ALLOC_PRAGMA 1
;
;//
;// Define intrinsic calls and their prototypes
;//
;
;#include "ia64reg.h"
;
;// Please contact INTEL to get IA64-specific information
;
;// end_wdm end_ntndis
;
;//
;// Define macro to generate import names.
;//
;
;#define IMPORT_NAME(name) __imp_##name
;
;// begin_wdm
;
;//
;// Define length of interrupt vector table.
;//
;
;// Please contact INTEL to get IA64-specific information
;#define MAXIMUM_VECTOR 256
;
;// end_wdm
;
;
;//
;// IA64 specific interlocked operation result values.
;//
;
;#define RESULT_ZERO 0
;#define RESULT_NEGATIVE 1
;#define RESULT_POSITIVE 2
;
;//
;// Interlocked result type is portable, but its values are machine specific.
;// Constants for values are in i386.h, mips.h, etc.
;//
;
;typedef enum _INTERLOCKED_RESULT {
; ResultNegative = RESULT_NEGATIVE,
; ResultZero = RESULT_ZERO,
; ResultPositive = RESULT_POSITIVE
;} INTERLOCKED_RESULT;
;
;//
;// Convert portable interlock interfaces to architecture specific interfaces.
;//
;
;#define ExInterlockedIncrementLong(Addend, Lock) \
; ExIa64InterlockedIncrementLong(Addend)
;
;#define ExInterlockedDecrementLong(Addend, Lock) \
; ExIa64InterlockedDecrementLong(Addend)
;
;#define ExInterlockedExchangeAddLargeInteger(Target, Value, Lock) \
; ExpInterlockedExchangeAddLargeInteger(Target, Value)
;
;#define ExInterlockedExchangeUlong(Target, Value, Lock) \
; ExIa64InterlockedExchangeUlong(Target, Value)
;
;NTKERNELAPI
;INTERLOCKED_RESULT
;ExIa64InterlockedIncrementLong (
; IN PLONG Addend
; );
;
;NTKERNELAPI
;INTERLOCKED_RESULT
;ExIa64InterlockedDecrementLong (
; IN PLONG Addend
; );
;
;NTKERNELAPI
;LARGE_INTEGER
;ExpInterlockedExchangeAddLargeInteger (
; IN PLARGE_INTEGER Addend,
; IN LARGE_INTEGER Increment
; );
;
;NTKERNELAPI
;ULONG
;ExIa64InterlockedExchangeUlong (
; IN PULONG Target,
; IN ULONG Value
; );
;
;// begin_wdm
;
;//
;// IA64 Interrupt Definitions.
;//
;// Define length of interrupt object dispatch code in longwords.
;//
;
;// Please contact INTEL to get IA64-specific information
;
;//
;// Begin of a block of definitions that must be synchronized with kxia64.h.
;//
;
;//
;// Define Interrupt Request Levels.
;//
;
;#define PASSIVE_LEVEL 0 // Passive release level
;#define LOW_LEVEL 0 // Lowest interrupt level
;#define APC_LEVEL 1 // APC interrupt level
;#define DISPATCH_LEVEL 2 // Dispatcher level
;#define CMC_LEVEL 3 // Correctable machine check level
;#define DEVICE_LEVEL_BASE 4 // 4 - 11 - Device IRQLs
;#define PROFILE_LEVEL 12 // Profiling level
;#define PC_LEVEL 12 // Performance Counter IRQL
;#define SYNCH_LEVEL (IPI_LEVEL-1) // Synchronization level
;#define IPI_LEVEL 14 // IPI IRQL
;#define CLOCK_LEVEL 13 // Clock Timer IRQL
;#define POWER_LEVEL 15 // Power failure level
;#define HIGH_LEVEL 15 // Highest interrupt level
;
;// Please contact INTEL to get IA64-specific information
;
;//
;// End of a block of definitions that must be synchronized with kxia64.h.
;//
;
;//
;// Define profile intervals.
;//
;
;#define DEFAULT_PROFILE_COUNT 0x40000000 // ~= 20 seconds @50mhz
;#define DEFAULT_PROFILE_INTERVAL (10 * 500) // 500 microseconds
;#define MAXIMUM_PROFILE_INTERVAL (10 * 1000 * 1000) // 1 second
;#define MINIMUM_PROFILE_INTERVAL (10 * 40) // 40 microseconds
;
;#if defined(_M_IA64) && !defined(RC_INVOKED)
;
;#define InterlockedAdd _InterlockedAdd
;#define InterlockedIncrement _InterlockedIncrement
;#define InterlockedDecrement _InterlockedDecrement
;#define InterlockedExchange _InterlockedExchange
;#define InterlockedExchangeAdd _InterlockedExchangeAdd
;
;#define InterlockedAdd64 _InterlockedAdd64
;#define InterlockedIncrement64 _InterlockedIncrement64
;#define InterlockedDecrement64 _InterlockedDecrement64
;#define InterlockedExchange64 _InterlockedExchange64
;#define InterlockedExchangeAdd64 _InterlockedExchangeAdd64
;#define InterlockedCompareExchange64 _InterlockedCompareExchange64
;
;#define InterlockedCompareExchange _InterlockedCompareExchange
;#define InterlockedExchangePointer _InterlockedExchangePointer
;#define InterlockedCompareExchangePointer _InterlockedCompareExchangePointer
;
;LONG
;__cdecl
;InterlockedAdd (
; LONG *Addend,
; LONG Value
; );
;
;LONGLONG
;__cdecl
;InterlockedAdd64 (
; LONGLONG *Addend,
; LONGLONG Value
; );
;
;LONG
;__cdecl
;InterlockedIncrement(
; IN OUT PLONG Addend
; );
;
;LONG
;__cdecl
;InterlockedDecrement(
; IN OUT PLONG Addend
; );
;
;LONG
;__cdecl
;InterlockedExchange(
; IN OUT PLONG Target,
; IN LONG Value
; );
;
;LONG
;__cdecl
;InterlockedExchangeAdd(
; IN OUT PLONG Addend,
; IN LONG Value
; );
;
;LONG
;__cdecl
;InterlockedCompareExchange (
; IN OUT PLONG Destination,
; IN LONG ExChange,
; IN LONG Comperand
; );
;
;LONGLONG
;__cdecl
;InterlockedIncrement64(
; IN OUT PLONGLONG Addend
; );
;
;LONGLONG
;__cdecl
;InterlockedDecrement64(
; IN OUT PLONGLONG Addend
; );
;
;LONGLONG
;__cdecl
;InterlockedExchange64(
; IN OUT PLONGLONG Target,
; IN LONGLONG Value
; );
;
;LONGLONG
;__cdecl
;InterlockedExchangeAdd64(
; IN OUT PLONGLONG Addend,
; IN LONGLONG Value
; );
;
;LONGLONG
;__cdecl
;InterlockedCompareExchange64 (
; IN OUT PLONGLONG Destination,
; IN LONGLONG ExChange,
; IN LONGLONG Comperand
; );
;
;PVOID
;__cdecl
;InterlockedCompareExchangePointer (
; IN OUT PVOID *Destination,
; IN PVOID Exchange,
; IN PVOID Comperand
; );
;
;PVOID
;__cdecl
;InterlockedExchangePointer(
; IN OUT PVOID *Target,
; IN PVOID Value
; );
;
;#pragma intrinsic(_InterlockedAdd)
;#pragma intrinsic(_InterlockedIncrement)
;#pragma intrinsic(_InterlockedDecrement)
;#pragma intrinsic(_InterlockedExchange)
;#pragma intrinsic(_InterlockedCompareExchange)
;#pragma intrinsic(_InterlockedExchangeAdd)
;#pragma intrinsic(_InterlockedAdd64)
;#pragma intrinsic(_InterlockedIncrement64)
;#pragma intrinsic(_InterlockedDecrement64)
;#pragma intrinsic(_InterlockedExchange64)
;#pragma intrinsic(_InterlockedCompareExchange64)
;#pragma intrinsic(_InterlockedExchangeAdd64)
;#pragma intrinsic(_InterlockedExchangePointer)
;#pragma intrinsic(_InterlockedCompareExchangePointer)
;
;#endif // defined(_M_IA64) && !defined(RC_INVOKED)
;
;
;#define KI_USER_SHARED_DATA ((ULONG_PTR)(KADDRESS_BASE + 0xFFFE0000))
;#define SharedUserData ((KUSER_SHARED_DATA * const)KI_USER_SHARED_DATA)
;
;//
;// Prototype for get current IRQL. **** TBD (read TPR)
;//
;
;NTKERNELAPI
;KIRQL
;KeGetCurrentIrql();
;
;// end_wdm
;
;//
;// Get address of current processor block.
;//
;
;#define KeGetCurrentPrcb() PCR->Prcb
;
;//
;// Get address of processor control region.
;//
;
;#define KeGetPcr() PCR
;
;//
;// Get address of current kernel thread object.
;//
;
;#define KeGetCurrentThread() PCR->CurrentThread
;
;//
;// Get current processor number.
;//
;
;#define KeGetCurrentProcessorNumber() PCR->Number
;
;//
;// Get data cache fill size.
;//
;
;#define KeGetDcacheFillSize() PCR->DcacheFillSize
;
;
;#define KeSaveFloatingPointState(a) STATUS_SUCCESS
;#define KeRestoreFloatingPointState(a) STATUS_SUCCESS
;
;
;//
;// Define the page size
;//
;
;#define PAGE_SIZE 0x2000
;
;//
;// Define the number of trailing zeroes in a page aligned virtual address.
;// This is used as the shift count when shifting virtual addresses to
;// virtual page numbers.
;//
;
;#define PAGE_SHIFT 13L
;
;//
;// Cache and write buffer flush functions.
;//
;
;NTKERNELAPI
;VOID
;KeFlushIoBuffers (
; IN PMDL Mdl,
; IN BOOLEAN ReadOperation,
; IN BOOLEAN DmaOperation
; );
;
;
;//
;// Kernel breakin breakpoint
;//
;
;VOID
;KeBreakinBreakpoint (
; VOID
; );
;
;
;#define ExAcquireSpinLock(Lock, OldIrql) KeAcquireSpinLock((Lock), (OldIrql))
;#define ExReleaseSpinLock(Lock, OldIrql) KeReleaseSpinLock((Lock), (OldIrql))
;#define ExAcquireSpinLockAtDpcLevel(Lock) KeAcquireSpinLockAtDpcLevel(Lock)
;#define ExReleaseSpinLockFromDpcLevel(Lock) KeReleaseSpinLockFromDpcLevel(Lock)
;
;
;#if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_)
;
;// begin_wdm
;
;#define KeQueryTickCount(CurrentCount ) \
; *(PULONGLONG)(CurrentCount) = **((volatile ULONGLONG **)(&KeTickCount));
;
;// end_wdm
;
;#else
;
;#define KiQueryTickCount(CurrentCount) \
; *(PULONGLONG)(CurrentCount) = KeTickCount;
;
;NTKERNELAPI
;VOID
;KeQueryTickCount (
; OUT PLARGE_INTEGER CurrentCount
; );
;
;#endif // defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_)
;
;//
;// I/O space read and write macros.
;//
;
;NTHALAPI
;UCHAR
;READ_PORT_UCHAR (
; PUCHAR RegisterAddress
; );
;
;NTHALAPI
;USHORT
;READ_PORT_USHORT (
; PUSHORT RegisterAddress
; );
;
;NTHALAPI
;ULONG
;READ_PORT_ULONG (
; PULONG RegisterAddress
; );
;
;NTHALAPI
;VOID
;READ_PORT_BUFFER_UCHAR (
; PUCHAR portAddress,
; PUCHAR readBuffer,
; ULONG readCount
; );
;
;NTHALAPI
;VOID
;READ_PORT_BUFFER_USHORT (
; PUSHORT portAddress,
; PUSHORT readBuffer,
; ULONG readCount
; );
;
;NTHALAPI
;VOID
;READ_PORT_BUFFER_ULONG (
; PULONG portAddress,
; PULONG readBuffer,
; ULONG readCount
; );
;
;NTHALAPI
;VOID
;WRITE_PORT_UCHAR (
; PUCHAR portAddress,
; UCHAR Data
; );
;
;NTHALAPI
;VOID
;WRITE_PORT_USHORT (
; PUSHORT portAddress,
; USHORT Data
; );
;
;NTHALAPI
;VOID
;WRITE_PORT_ULONG (
; PULONG portAddress,
; ULONG Data
; );
;
;NTHALAPI
;VOID
;WRITE_PORT_BUFFER_UCHAR (
; PUCHAR portAddress,
; PUCHAR writeBuffer,
; ULONG writeCount
; );
;
;NTHALAPI
;VOID
;WRITE_PORT_BUFFER_USHORT (
; PUSHORT portAddress,
; PUSHORT writeBuffer,
; ULONG writeCount
; );
;
;NTHALAPI
;VOID
;WRITE_PORT_BUFFER_ULONG (
; PULONG portAddress,
; PULONG writeBuffer,
; ULONG writeCount
; );
;
;
;#define READ_REGISTER_UCHAR(x) \
; (__mf(), *(volatile UCHAR * const)(x))
;
;#define READ_REGISTER_USHORT(x) \
; (__mf(), *(volatile USHORT * const)(x))
;
;#define READ_REGISTER_ULONG(x) \
; (__mf(), *(volatile ULONG * const)(x))
;
;#define READ_REGISTER_BUFFER_UCHAR(x, y, z) { \
; PUCHAR registerBuffer = x; \
; PUCHAR readBuffer = y; \
; ULONG readCount; \
; __mf(); \
; for (readCount = z; readCount--; readBuffer++, registerBuffer++) { \
; *readBuffer = *(volatile UCHAR * const)(registerBuffer); \
; } \
;}
;
;#define READ_REGISTER_BUFFER_USHORT(x, y, z) { \
; PUSHORT registerBuffer = x; \
; PUSHORT readBuffer = y; \
; ULONG readCount; \
; __mf(); \
; for (readCount = z; readCount--; readBuffer++, registerBuffer++) { \
; *readBuffer = *(volatile USHORT * const)(registerBuffer); \
; } \
;}
;
;#define READ_REGISTER_BUFFER_ULONG(x, y, z) { \
; PULONG registerBuffer = x; \
; PULONG readBuffer = y; \
; ULONG readCount; \
; __mf(); \
; for (readCount = z; readCount--; readBuffer++, registerBuffer++) { \
; *readBuffer = *(volatile ULONG * const)(registerBuffer); \
; } \
;}
;
;#define WRITE_REGISTER_UCHAR(x, y) { \
; *(volatile UCHAR * const)(x) = y; \
; KeFlushWriteBuffer(); \
;}
;
;#define WRITE_REGISTER_USHORT(x, y) { \
; *(volatile USHORT * const)(x) = y; \
; KeFlushWriteBuffer(); \
;}
;
;#define WRITE_REGISTER_ULONG(x, y) { \
; *(volatile ULONG * const)(x) = y; \
; KeFlushWriteBuffer(); \
;}
;
;#define WRITE_REGISTER_BUFFER_UCHAR(x, y, z) { \
; PUCHAR registerBuffer = x; \
; PUCHAR writeBuffer = y; \
; ULONG writeCount; \
; for (writeCount = z; writeCount--; writeBuffer++, registerBuffer++) { \
; *(volatile UCHAR * const)(registerBuffer) = *writeBuffer; \
; } \
; KeFlushWriteBuffer(); \
;}
;
;#define WRITE_REGISTER_BUFFER_USHORT(x, y, z) { \
; PUSHORT registerBuffer = x; \
; PUSHORT writeBuffer = y; \
; ULONG writeCount; \
; for (writeCount = z; writeCount--; writeBuffer++, registerBuffer++) { \
; *(volatile USHORT * const)(registerBuffer) = *writeBuffer; \
; } \
; KeFlushWriteBuffer(); \
;}
;
;#define WRITE_REGISTER_BUFFER_ULONG(x, y, z) { \
; PULONG registerBuffer = x; \
; PULONG writeBuffer = y; \
; ULONG writeCount; \
; for (writeCount = z; writeCount--; writeBuffer++, registerBuffer++) { \
; *(volatile ULONG * const)(registerBuffer) = *writeBuffer; \
; } \
; KeFlushWriteBuffer(); \
;}
;
;//
;// Non-volatile floating point state
;//
;
;typedef struct _KFLOATING_SAVE {
; ULONG Reserved;
;} KFLOATING_SAVE, *PKFLOATING_SAVE;
;
;//
;// STATUS register for each MCA bank.
;//
;
;typedef union _MCI_STATS {
; struct {
; USHORT McaCod;
; USHORT MsCod;
; ULONG OtherInfo : 25;
; ULONG Damage : 1;
; ULONG AddressValid : 1;
; ULONG MiscValid : 1;
; ULONG Enabled : 1;
; ULONG UnCorrected : 1;
; ULONG OverFlow : 1;
; ULONG Valid : 1;
; } MciStats;
;
; ULONGLONG QuadPart;
;
;} MCI_STATS, *PMCI_STATS;
;
;
;//
;// Processor Control Block (PRCB)
;//
;
;#define PRCB_MINOR_VERSION 1
;#define PRCB_MAJOR_VERSION 1
;#define PRCB_BUILD_DEBUG 0x0001
;#define PRCB_BUILD_UNIPROCESSOR 0x0002
;
;struct _RESTART_BLOCK;
;
;typedef struct _KPRCB {
;
;//
;// Major and minor version numbers of the PCR.
;//
;
; USHORT MinorVersion;
; USHORT MajorVersion;
;
;//
;// Start of the architecturally defined section of the PRCB. This section
;// may be directly addressed by vendor/platform specific HAL code and will
;// not change from version to version of NT.
;//
;//
;
; struct _KTHREAD *CurrentThread;
; struct _KTHREAD *RESTRICTED_POINTER NextThread;
; struct _KTHREAD *IdleThread;
; CCHAR Number;
; CCHAR Reserved;
; USHORT BuildType;
; KAFFINITY SetMember;
; struct _RESTART_BLOCK *RestartBlock;
; ULONG_PTR PcrPage;
; ULONG Spares1[4];
;
;//
;// Space reserved for the system.
;//
;
; ULONGLONG SystemReserved[8];
;
;//
;// Space reserved for the HAL.
;//
;
; ULONGLONG HalReserved[16];
;
;//
;// End of the architecturally defined section of the PRCB.
;} KPRCB, *PKPRCB, *RESTRICTED_POINTER PRKPRCB;
;
;// begin_ntndis
;
;//
;// Define Processor Control Region Structure.
;//
;
;PCR_MINOR_VERSION equ 1
;PCR_MAJOR_VERSION equ 1
;
;typedef struct _KPCR {
;
;//
;// Major and minor version numbers of the PCR.
;//
; ULONG MinorVersion;
; ULONG MajorVersion;
;
;//
;// Start of the architecturally defined section of the PCR. This section
;// may be directly addressed by vendor/platform specific HAL code and will
;// not change from version to version of NT.
;//
;
;//
;// First and second level cache parameters.
;//
;
; ULONG FirstLevelDcacheSize;
; ULONG FirstLevelDcacheFillSize;
; ULONG FirstLevelIcacheSize;
; ULONG FirstLevelIcacheFillSize;
; ULONG SecondLevelDcacheSize;
; ULONG SecondLevelDcacheFillSize;
; ULONG SecondLevelIcacheSize;
; ULONG SecondLevelIcacheFillSize;
;
;//
;// Data cache alignment and fill size used for cache flushing and alignment.
;// These fields are set to the larger of the first and second level data
;// cache fill sizes.
;//
;
; ULONG DcacheAlignment;
; ULONG DcacheFillSize;
;
;//
;// Instruction cache alignment and fill size used for cache flushing and
;// alignment. These fields are set to the larger of the first and second
;// level data cache fill sizes.
;//
;
; ULONG IcacheAlignment;
; ULONG IcacheFillSize;
;
;//
;// Processor identification from PrId register.
;//
;
; ULONG ProcessorId;
;
;//
;// Profiling data.
;//
;
; ULONG ProfileInterval;
; ULONG ProfileCount;
;
;//
;// Stall execution count and scale factor.
;//
;
; ULONG StallExecutionCount;
; ULONG StallScaleFactor;
;
; ULONG InterruptionCount;
;
;//
;// Space reserved for the system.
;//
;
; ULONGLONG SystemReserved[6];
;
;//
;// Space reserved for the HAL
;//
;
; ULONGLONG HalReserved[64];
;
;//
;// IRQL mapping tables.
;//
;
; UCHAR IrqlMask[64];
; UCHAR IrqlTable[64];
;
;//
;// External Interrupt vectors.
;//
;
; PKINTERRUPT_ROUTINE InterruptRoutine[MAXIMUM_VECTOR];
;
;//
;// Reserved interrupt vector mask.
;//
;
; ULONG ReservedVectors;
;
;//
;// Processor affinity mask.
;//
;
; KAFFINITY SetMember;
;
;//
;// Complement of the processor affinity mask.
;//
;
; KAFFINITY NotMember;
;
;//
;// Pointer to processor control block.
;//
;
; struct _KPRCB *Prcb;
;
;//
;// Shadow copy of Prcb->CurrentThread for fast access
;//
;
; struct _KTHREAD *CurrentThread;
;
;//
;// Processor number.
;//
;
; CCHAR Number; // Processor Number
; UCHAR DebugActive; // debug register active in user flag
; UCHAR KernelDebugActive; // debug register active in kernel flag
; UCHAR CurrentIrql; // Current IRQL
; union {
; USHORT SoftwareInterruptPending; // Software Interrupt Pending Flag
; struct {
; UCHAR ApcInterrupt; // 0x01 if APC int pending
; UCHAR DispatchInterrupt; // 0x01 if dispatch int pending
; };
; };
;
;//
;// End of the architecturally defined section of the PCR. This section
;// may be directly addressed by vendor/platform specific HAL code and will
;// not change from version to version of NT.
;//
;
;
;} KPCR, *PKPCR;
;
;//
;// The highest user address reserves 64K bytes for a guard page. This
;// the probing of address from kernel mode to only have to check the
;// starting address for structures of 64k bytes or less.
;//
;
;#define MM_HIGHEST_USER_ADDRESS (PVOID) (ULONG_PTR)((UADDRESS_BASE + 0x3FFFFFEFFFF)) // highest user address
;#define MM_USER_PROBE_ADDRESS ((ULONG_PTR)(UADDRESS_BASE + 0x3FFFFFF0000UI64)) // starting address of guard page
;#define MM_SYSTEM_RANGE_START (PVOID) (KSEG0_BASE) // start of system space
;
;//
;// The following definitions are required for the debugger data block.
;//
;
;extern PVOID MmHighestUserAddress;
;extern PVOID MmSystemRangeStart;
;extern ULONG_PTR MmUserProbeAddress;
;
;//
;// The lowest user address reserves the low 64k.
;//
;
;#define MM_LOWEST_USER_ADDRESS (PVOID)((ULONG_PTR)(UADDRESS_BASE+0x00010000))
;
;// begin_wdm
;
;#define MmGetProcedureAddress(Address) (Address)
;#define MmLockPagableCodeSection(PLabelAddress) \
; MmLockPagableDataSection((PVOID)(*((PULONGLONG)PLabelAddress)))
;
;//
;// The lowest address for system space.
;//
;
;#define MM_LOWEST_SYSTEM_ADDRESS ((PVOID)((ULONG_PTR)(KADDRESS_BASE + 0xC0C00000)))
;#endif // defined(_IA64_)
;
;#if defined(_X86_)
;
;//
;// Define system time structure.
;//
;
;typedef struct _KSYSTEM_TIME {
; ULONG LowPart;
; LONG High1Time;
; LONG High2Time;
;} KSYSTEM_TIME, *PKSYSTEM_TIME;
;
;#endif
;
;
;#ifdef _X86_
;
;//
;// Disable these two pramas that evaluate to "sti" "cli" on x86 so that driver
;// writers to not leave them inadvertantly in their code.
;//
;
;#if !defined(MIDL_PASS)
;#if !defined(RC_INVOKED)
;
;#if _MSC_VER >= 1200
;#pragma warning(push)
;#endif
;#pragma warning(disable:4164) // disable C4164 warning so that apps that
; // build with /Od don't get weird errors !
;#ifdef _M_IX86
;#pragma function(_enable)
;#pragma function(_disable)
;#endif
;
;#if _MSC_VER >= 1200
;#pragma warning(pop)
;#else
;#pragma warning(default:4164) // reenable C4164 warning
;#endif
;
;#endif
;#endif
;
;//
;// Size of kernel mode stack.
;//
;
;#define KERNEL_STACK_SIZE 12288
;
;//
;// Define size of large kernel mode stack for callbacks.
;//
;
;#define KERNEL_LARGE_STACK_SIZE 61440
;
;//
;// Define number of pages to initialize in a large kernel stack.
;//
;
;#define KERNEL_LARGE_STACK_COMMIT 12288
;
;#ifdef _X86_
;
;//
;// Define the size of the 80387 save area, which is in the context frame.
;//
;
;#define SIZE_OF_80387_REGISTERS 80
;
;//
;// The following flags control the contents of the CONTEXT structure.
;//
;
;#if !defined(RC_INVOKED)
;
;CONTEXT_i386 equ 00010000h ; this assumes that i386 and
;CONTEXT_i486 equ 00010000h ; i486 have identical context records
;
;// end_wx86
;
;#define CONTEXT_CONTROL (CONTEXT_i386 | 0x00000001L) // SS:SP, CS:IP, FLAGS, BP
;#define CONTEXT_INTEGER (CONTEXT_i386 | 0x00000002L) // AX, BX, CX, DX, SI, DI
;#define CONTEXT_SEGMENTS (CONTEXT_i386 | 0x00000004L) // DS, ES, FS, GS
;#define CONTEXT_FLOATING_POINT (CONTEXT_i386 | 0x00000008L) // 387 state
;#define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386 | 0x00000010L) // DB 0-3,6,7
;#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386 | 0x00000020L) // cpu specific extensions
;
;#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER |\
; CONTEXT_SEGMENTS)
;
;// begin_wx86
;
;#endif
;
;#define MAXIMUM_SUPPORTED_EXTENSION 512
;
;FLOATING_SAVE_AREA STRUC
; ControlWord ULONG ?
; ULONG StatusWord;
; ULONG TagWord;
; ULONG ErrorOffset;
; ULONG ErrorSelector;
; ULONG DataOffset;
; ULONG DataSelector;
; UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
; ULONG Cr0NpxState;
;FLOATING_SAVE_AREA ENDS
;
;typedef FLOATING_SAVE_AREA *PFLOATING_SAVE_AREA;
;
;//
;// Context Frame
;//
;// This frame has a several purposes: 1) it is used as an argument to
;// NtContinue, 2) is is used to constuct a call frame for APC delivery,
;// and 3) it is used in the user level thread creation routines.
;//
;// The layout of the record conforms to a standard call frame.
;//
;
;typedef struct _CONTEXT {
;
; //
; // The flags values within this flag control the contents of
; // a CONTEXT record.
; //
; // If the context record is used as an input parameter, then
; // for each portion of the context record controlled by a flag
; // whose value is set, it is assumed that that portion of the
; // context record contains valid context. If the context record
; // is being used to modify a threads context, then only that
; // portion of the threads context will be modified.
; //
; // If the context record is used as an IN OUT parameter to capture
; // the context of a thread, then only those portions of the thread's
; // context corresponding to set flags will be returned.
; //
; // The context record is never used as an OUT only parameter.
; //
;
; ULONG ContextFlags;
;
; //
; // This section is specified/returned if CONTEXT_DEBUG_REGISTERS is
; // set in ContextFlags. Note that CONTEXT_DEBUG_REGISTERS is NOT
; // included in CONTEXT_FULL.
; //
;
; ULONG Dr0;
; ULONG Dr1;
; ULONG Dr2;
; ULONG Dr3;
; ULONG Dr6;
; ULONG Dr7;
;
; //
; // This section is specified/returned if the
; // ContextFlags word contians the flag CONTEXT_FLOATING_POINT.
; //
;
; FLOATING_SAVE_AREA FloatSave;
;
; //
; // This section is specified/returned if the
; // ContextFlags word contians the flag CONTEXT_SEGMENTS.
; //
;
; ULONG SegGs;
; ULONG SegFs;
; ULONG SegEs;
; ULONG SegDs;
;
; //
; // This section is specified/returned if the
; // ContextFlags word contians the flag CONTEXT_INTEGER.
; //
;
; ULONG Edi;
; ULONG Esi;
; ULONG Ebx;
; ULONG Edx;
; ULONG Ecx;
; ULONG Eax;
;
; //
; // This section is specified/returned if the
; // ContextFlags word contians the flag CONTEXT_CONTROL.
; //
;
; ULONG Ebp;
; ULONG Eip;
; ULONG SegCs; // MUST BE SANITIZED
; ULONG EFlags; // MUST BE SANITIZED
; ULONG Esp;
; ULONG SegSs;
;
; //
; // This section is specified/returned if the ContextFlags word
; // contains the flag CONTEXT_EXTENDED_REGISTERS.
; // The format and contexts are processor specific
; //
;
; UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
;
;} CONTEXT;
;
;
;
;typedef CONTEXT *PCONTEXT;
;
;// begin_ntminiport
;
;#endif //_X86_
;
;#endif // _X86_
;
;#if defined(_ALPHA_)
;
;//
;// Define system time structure.
;//
;
;typedef ULONGLONG KSYSTEM_TIME;
;typedef KSYSTEM_TIME *PKSYSTEM_TIME;
;
;#endif
;
;#ifdef _ALPHA_
;//
;// Define size of kernel mode stack.
;//
;
;#if defined(_AXP64_)
;
;#define KERNEL_STACK_SIZE 0x6000
;
;#else
;
;#define KERNEL_STACK_SIZE 0x4000
;
;#endif
;
;//
;// Define size of large kernel mode stack for callbacks.
;//
;
;#define KERNEL_LARGE_STACK_SIZE 65536
;
;//
;// Define number of pages to initialize in a large kernel stack.
;//
;
;#define KERNEL_LARGE_STACK_COMMIT KERNEL_STACK_SIZE
;
;//
;// The following flags control the contents of the CONTEXT structure.
;//
;
;#if !defined(RC_INVOKED)
;
;#define CONTEXT_ALPHA 0x00020000
;
;#define CONTEXT_CONTROL (CONTEXT_ALPHA | 0x00000001L)
;#define CONTEXT_FLOATING_POINT (CONTEXT_ALPHA | 0x00000002L)
;#define CONTEXT_INTEGER (CONTEXT_ALPHA | 0x00000004L)
;
;#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER)
;
;#endif
;
;#ifndef _PORTABLE_32BIT_CONTEXT
;
;//
;// Context Frame
;//
;// This frame has a several purposes: 1) it is used as an argument to
;// NtContinue, 2) it is used to construct a call frame for APC delivery,
;// 3) it is used to construct a call frame for exception dispatching
;// in user mode, 4) it is used in the user level thread creation
;// routines, and 5) it is used to to pass thread state to debuggers.
;//
;// N.B. Because this record is used as a call frame, it must be EXACTLY
;// a multiple of 16 bytes in length.
;//
;// There are two variations of the context structure. This is the real one.
;//
;
;typedef struct _CONTEXT {
;
; //
; // This section is specified/returned if the ContextFlags word contains
; // the flag CONTEXT_FLOATING_POINT.
; //
;
; ULONGLONG FltF0;
; ULONGLONG FltF1;
; ULONGLONG FltF2;
; ULONGLONG FltF3;
; ULONGLONG FltF4;
; ULONGLONG FltF5;
; ULONGLONG FltF6;
; ULONGLONG FltF7;
; ULONGLONG FltF8;
; ULONGLONG FltF9;
; ULONGLONG FltF10;
; ULONGLONG FltF11;
; ULONGLONG FltF12;
; ULONGLONG FltF13;
; ULONGLONG FltF14;
; ULONGLONG FltF15;
; ULONGLONG FltF16;
; ULONGLONG FltF17;
; ULONGLONG FltF18;
; ULONGLONG FltF19;
; ULONGLONG FltF20;
; ULONGLONG FltF21;
; ULONGLONG FltF22;
; ULONGLONG FltF23;
; ULONGLONG FltF24;
; ULONGLONG FltF25;
; ULONGLONG FltF26;
; ULONGLONG FltF27;
; ULONGLONG FltF28;
; ULONGLONG FltF29;
; ULONGLONG FltF30;
; ULONGLONG FltF31;
;
; //
; // This section is specified/returned if the ContextFlags word contains
; // the flag CONTEXT_INTEGER.
; //
; // N.B. The registers gp, sp, and ra are defined in this section, but are
; // considered part of the control context rather than part of the integer
; // context.
; //
;
; ULONGLONG IntV0; // $0: return value register, v0
; ULONGLONG IntT0; // $1: temporary registers, t0 - t7
; ULONGLONG IntT1; // $2:
; ULONGLONG IntT2; // $3:
; ULONGLONG IntT3; // $4:
; ULONGLONG IntT4; // $5:
; ULONGLONG IntT5; // $6:
; ULONGLONG IntT6; // $7:
; ULONGLONG IntT7; // $8:
; ULONGLONG IntS0; // $9: nonvolatile registers, s0 - s5
; ULONGLONG IntS1; // $10:
; ULONGLONG IntS2; // $11:
; ULONGLONG IntS3; // $12:
; ULONGLONG IntS4; // $13:
; ULONGLONG IntS5; // $14:
; ULONGLONG IntFp; // $15: frame pointer register, fp/s6
; ULONGLONG IntA0; // $16: argument registers, a0 - a5
; ULONGLONG IntA1; // $17:
; ULONGLONG IntA2; // $18:
; ULONGLONG IntA3; // $19:
; ULONGLONG IntA4; // $20:
; ULONGLONG IntA5; // $21:
; ULONGLONG IntT8; // $22: temporary registers, t8 - t11
; ULONGLONG IntT9; // $23:
; ULONGLONG IntT10; // $24:
; ULONGLONG IntT11; // $25:
; ULONGLONG IntRa; // $26: return address register, ra
; ULONGLONG IntT12; // $27: temporary register, t12
; ULONGLONG IntAt; // $28: assembler temp register, at
; ULONGLONG IntGp; // $29: global pointer register, gp
; ULONGLONG IntSp; // $30: stack pointer register, sp
; ULONGLONG IntZero; // $31: zero register, zero
;
; //
; // This section is specified/returned if the ContextFlags word contains
; // the flag CONTEXT_FLOATING_POINT.
; //
;
; ULONGLONG Fpcr; // floating point control register
; ULONGLONG SoftFpcr; // software extension to FPCR
;
; //
; // This section is specified/returned if the ContextFlags word contains
; // the flag CONTEXT_CONTROL.
; //
; // N.B. The registers gp, sp, and ra are defined in the integer section,
; // but are considered part of the control context rather than part of
; // the integer context.
; //
;
; ULONGLONG Fir; // (fault instruction) continuation address
; ULONG Psr; // processor status
;
; //
; // The flags values within this flag control the contents of
; // a CONTEXT record.
; //
; // If the context record is used as an input parameter, then
; // for each portion of the context record controlled by a flag
; // whose value is set, it is assumed that that portion of the
; // context record contains valid context. If the context record
; // is being used to modify a thread's context, then only that
; // portion of the threads context will be modified.
; //
; // If the context record is used as an IN OUT parameter to capture
; // the context of a thread, then only those portions of the thread's
; // context corresponding to set flags will be returned.
; //
; // The context record is never used as an OUT only parameter.
; //
;
; ULONG ContextFlags;
; ULONG Fill[4]; // padding for 16-byte stack frame alignment
;
;} CONTEXT, *PCONTEXT;
;
;#else
;
;#error _PORTABLE_32BIT_CONTEXT no longer supported on Alpha.
;
;#endif // _PORTABLE_32BIT_CONTEXT
;
;#endif
;#ifdef _IA64_
;
;//
;// Define system time structure (use alpha approach).
;//
;
;typedef ULONGLONG KSYSTEM_TIME;
;typedef KSYSTEM_TIME *PKSYSTEM_TIME;
;
;#endif // _IA64_
;
;#ifdef _IA64_
;
;// Please contact INTEL to get IA64-specific information
;//
;// Define size of kernel mode stack.
;//
;
;#define KERNEL_STACK_SIZE 0x8000
;
;//
;// Define size of large kernel mode stack for callbacks.
;//
;
;#define KERNEL_LARGE_STACK_SIZE 0xC000
;
;//
;// Define number of pages to initialize in a large kernel stack.
;//
;
;KERNEL_LARGE_STACK_COMMIT equ 8000h
;
;//
;// Intel-IA64-Filler ; Define size of kernel mode backing store stack.
;//
;
;#define KERNEL_BSTORE_SIZE 0x4000
;
;//
;// Intel-IA64-Filler ; Define size of large kernel mode backing store for callbacks.
;//
;
;#define KERNEL_LARGE_BSTORE_SIZE 0x8000
;
;//
;// Intel-IA64-Filler ; Define number of pages to initialize in a large kernel backing store
;//
;
;#define KERNEL_LARGE_BSTORE_COMMIT 0x4000
;
;//
;// Define base address for kernel and user space
;//
;
;#define UREGION_INDEX 0
;
;#define KREGION_INDEX 7
;
;#define UADDRESS_BASE ((ULONGLONG)UREGION_INDEX << 61)
;
;
;#define KADDRESS_BASE ((ULONGLONG)KREGION_INDEX << 61)
;
;
;//
;// The following flags control the contents of the CONTEXT structure.
;//
;
;#if !defined(RC_INVOKED)
;
;// Please contact INTEL to get IA64-specific information
;
;#endif // !defined(RC_INVOKED)
;
;//
;// Context Frame
;//
;// This frame has a several purposes: 1) it is used as an argument to
;// NtContinue, 2) it is used to construct a call frame for APC delivery,
;// 3) it is used to construct a call frame for exception dispatching
;// in user mode, 4) it is used in the user level thread creation
;// routines, and 5) it is used to to pass thread state to debuggers.
;//
;// N.B. Because this record is used as a call frame, it must be EXACTLY
;// a multiple of 16 bytes in length and aligned on a 16-byte boundary.
;//
;
;typedef struct _CONTEXT {
;
; //
; // The flags values within this flag control the contents of
; // a CONTEXT record.
; //
; // If the context record is used as an input parameter, then
; // for each portion of the context record controlled by a flag
; // whose value is set, it is assumed that that portion of the
; // context record contains valid context. If the context record
; // is being used to modify a thread's context, then only that
; // portion of the threads context will be modified.
; //
; // If the context record is used as an IN OUT parameter to capture
; // the context of a thread, then only those portions of the thread's
; // context corresponding to set flags will be returned.
; //
; // The context record is never used as an OUT only parameter.
; //
;
; ULONG ContextFlags;
; ULONG Fill1[3]; // for alignment of following on 16-byte boundary
;
; //
; // This section is specified/returned if the ContextFlags word contains
; // the flag CONTEXT_DEBUG.
; //
; // N.B. CONTEXT_DEBUG is *not* part of CONTEXT_FULL.
; //
;
;// Please contact INTEL to get IA64-specific information
;
;} CONTEXT, *PCONTEXT;
;
;//
;// Followings are the data structures that required to support Legacy x86
;//
;
;
;//
;// Define the size of the 80387 save area, which is in the context frame.
;//
;
;#define SIZE_OF_80387_REGISTERS 80
;
;//
;// The following flags control the contents of the CONTEXT structure.
;//
;
;#if !defined(RC_INVOKED)
;
;#define CONTEXT_i386 0x00010000 // this assumes that i386 and
;#define CONTEXT_i486 0x00010000 // i486 have identical context records
;#define CONTEXT_X86 0x00010000 // X86 have identical context records
;
;#define CONTEXT86_CONTROL (CONTEXT_i386 | 0x00000001L) // SS:SP, CS:IP, FLAGS, BP
;#define CONTEXT86_INTEGER (CONTEXT_i386 | 0x00000002L) // AX, BX, CX, DX, SI, DI
;#define CONTEXT86_SEGMENTS (CONTEXT_i386 | 0x00000004L) // DS, ES, FS, GS
;#define CONTEXT86_FLOATING_POINT (CONTEXT_i386 | 0x00000008L) // 387 state
;#define CONTEXT86_DEBUG_REGISTERS (CONTEXT_i386 | 0x00000010L) // DB 0-3,6,7
;
;#define CONTEXT86_FULL (CONTEXT86_CONTROL | CONTEXT86_INTEGER |\
; CONTEXT86_SEGMENTS) // context corresponding to set flags will be returned.
;
;#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;
;
;typedef FLOATING_SAVE_AREA *PFLOATING_SAVE_AREA;
;
;//
;// Context Frame
;//
;// This frame has a several purposes: 1) it is used as an argument to
;// NtContinue, 2) is is used to constuct a call frame for APC delivery,
;// and 3) it is used in the user level thread creation routines.
;//
;// The layout of the record conforms to a standard call frame.
;//
;
;typedef struct _CONTEXT86 {
;
; //
; // The flags values within this flag control the contents of
; // a CONTEXT record.
; //
; // If the context record is used as an input parameter, then
; // for each portion of the context record controlled by a flag
; // whose value is set, it is assumed that that portion of the
; // context record contains valid context. If the context record
; // is being used to modify a threads context, then only that
; // portion of the threads context will be modified.
; //
; // If the context record is used as an IN OUT parameter to capture
; // the context of a thread, then only those portions of the thread's
; // context corresponding to set flags will be returned.
; //
; // The context record is never used as an OUT only parameter.
; //
;
; ULONG ContextFlags;
;
; //
; // This section is specified/returned if CONTEXT_DEBUG_REGISTERS is
; // set in ContextFlags. Note that CONTEXT_DEBUG_REGISTERS is NOT
; // included in CONTEXT_FULL.
; //
;
; ULONG Dr0;
; ULONG Dr1;
; ULONG Dr2;
; ULONG Dr3;
; ULONG Dr6;
; ULONG Dr7;
;
; //
; // This section is specified/returned if the
; // ContextFlags word contians the flag CONTEXT_FLOATING_POINT.
; //
;
; FLOATING_SAVE_AREA FloatSave;
;
; //
; // This section is specified/returned if the
; // ContextFlags word contians the flag CONTEXT_SEGMENTS.
; //
;
; ULONG SegGs;
; ULONG SegFs;
; ULONG SegEs;
; ULONG SegDs;
;
; //
; // This section is specified/returned if the
; // ContextFlags word contians the flag CONTEXT_INTEGER.
; //
; //
;
; ULONG Edi;
; ULONG Esi;
; ULONG Ebx;
; ULONG Edx;
; ULONG Ecx;
; ULONG Eax;
;
; //
; // This section is specified/returned if the
; // ContextFlags word contians the flag CONTEXT_CONTROL.
; //
;
; ULONG Ebp;
; ULONG Eip;
; ULONG SegCs; // MUST BE SANITIZED
; ULONG EFlags; // MUST BE SANITIZED
; ULONG Esp;
; ULONG SegSs;
;
;} CONTEXT86;
;
;// end_winnt
;
;typedef CONTEXT86 *PCONTEXT86;
;
;#define CONTEXT86_TO_PROGRAM_COUNTER(Context) (PVOID)((Context)->Eip)
;
;#define CONTEXT86_LENGTH (sizeof(CONTEXT86))
;#define CONTEXT86_ALIGN (sizeof(ULONG))
;#define CONTEXT86_ROUND (CONTEXT86_ALIGN - 1)
;
;//
;// GDT selectors - These defines are R0 selector numbers, which means
;// they happen to match the byte offset relative to
;// the base of the GDT.
;//
;
;#define KGDT_NULL 0
;#define KGDT_R0_CODE 8
;#define KGDT_R0_DATA 16
;#define KGDT_R3_CODE 24
;#define KGDT_R3_DATA 32
;#define KGDT_TSS 40
;#define KGDT_R0_PCR 48
;#define KGDT_R3_TEB 56
;#define KGDT_VDM_TILE 64
;#define KGDT_LDT 72
;#define KGDT_DF_TSS 80
;#define KGDT_NMI_TSS 88
;
;//
;// GDT selectors - These defines are R0 selector numbers, which means
;// they happen to match the byte offset relative to
;// the base of the GDT.
;//
;
;#define KGDT_NULL 0
;#define KGDT_R3_CODE 24
;#define KGDT_R3_DATA 32
;#define KGDT_R3_TEB 56
;#define KGDT_VDM_TILE 64
;
;//
;// GDT table is now reside in TEB structure, and the entries can only
;// accomerdate 24 entries. We purposely take away KGDT_NUMBER and use
;// GDT_TABLE_SIZE
;//
;
;#define GDT_ENTRIES 24
;#define GDT_TABLE_SIZE (GDT_ENTRIES<<3)
;
;
;// begin_winnt
;
;#ifndef _LDT_ENTRY_DEFINED
;#define _LDT_ENTRY_DEFINED
;
;//
;// LDT descriptor entry
;//
;
;typedef struct _LDT_ENTRY {
; USHORT LimitLow;
; USHORT BaseLow;
; union {
; struct {
; UCHAR BaseMid;
; UCHAR Flags1; // Declare as bytes to avoid alignment
; UCHAR Flags2; // Problems.
; UCHAR BaseHi;
; } Bytes;
; struct {
; ULONG BaseMid : 8;
; ULONG Type : 5;
; ULONG Dpl : 2;
; ULONG Pres : 1;
; ULONG LimitHi : 4;
; ULONG Sys : 1;
; ULONG Reserved_0 : 1;
; ULONG Default_Big : 1;
; ULONG Granularity : 1;
; ULONG BaseHi : 8;
; } Bits;
; } HighWord;
;} LDT_ENTRY, *PLDT_ENTRY;
;
;#endif // _LDT_ENTRY_DEFINED
;
;// end_winnt
;
;#define LDT_TABLE_SIZE ( 8 * 1024 * sizeof(LDT_ENTRY) )
;
;//
;// Process Ldt Information
;// NtQueryInformationProcess using ProcessLdtInformation
;//
;
;typedef struct _LDT_INFORMATION {
; ULONG Start;
; ULONG Length;
; LDT_ENTRY LdtEntries[1];
;} PROCESS_LDT_INFORMATION, *PPROCESS_LDT_INFORMATION;
;
;//
;// Process Ldt Size
;// NtSetInformationProcess using ProcessLdtSize
;//
;
;typedef struct _LDT_SIZE {
; ULONG Length;
;} PROCESS_LDT_SIZE, *PPROCESS_LDT_SIZE;
;
;//
;// Thread Descriptor Table Entry
;// NtQueryInformationThread using ThreadDescriptorTableEntry
;//
;
;// begin_windbgkd
;
;#ifndef _DESCRIPTOR_TABLE_ENTRY_DEFINED
;#define _DESCRIPTOR_TABLE_ENTRY_DEFINED
;
;typedef struct _DESCRIPTOR_TABLE_ENTRY {
; ULONG Selector;
; LDT_ENTRY Descriptor;
;} DESCRIPTOR_TABLE_ENTRY, *PDESCRIPTOR_TABLE_ENTRY;
;
;#endif // _DESCRIPTOR_TABLE_ENTRY_DEFINED
;
;// end_windbgkd
;
;// begin_winnt
;
;//
;// Plabel descriptor structure definition
;//
;
;// Please contact INTEL to get IA64-specific information
;
;// end_winnt
;
;#endif // _IA64_
;//
;// Event Specific Access Rights.
;//
;
;#define EVENT_QUERY_STATE 0x0001
;#define EVENT_MODIFY_STATE 0x0002 // winnt
;#define EVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3) // winnt
;
;//
;// Semaphore Specific Access Rights.
;//
;
;#define SEMAPHORE_QUERY_STATE 0x0001
;#define SEMAPHORE_MODIFY_STATE 0x0002 // winnt
;
;#define SEMAPHORE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3) // winnt
;
;//
;// Timer APC routine definition.
;//
;
;typedef
;VOID
;(*PTIMER_APC_ROUTINE) (
; IN PVOID TimerContext,
; IN ULONG TimerLowValue,
; IN LONG TimerHighValue
; );
;
;
;//
;// Defined processor features
;//
;
;PF_FLOATING_POINT_PRECISION_ERRATA equ 0
;#define PF_FLOATING_POINT_EMULATED 1 // winnt
;#define PF_COMPARE_EXCHANGE_DOUBLE 2 // winnt
;#define PF_MMX_INSTRUCTIONS_AVAILABLE 3 // winnt
;#define PF_PPC_MOVEMEM_64BIT_OK 4 // winnt
;#define PF_ALPHA_BYTE_INSTRUCTIONS 5 // winnt
;#define PF_XMMI_INSTRUCTIONS_AVAILABLE 6 // winnt
;#define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7 // winnt
;#define PF_RDTSC_INSTRUCTION_AVAILABLE 8 // winnt
;#define PF_PAE_ENABLED 9 // winnt
;
;typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE {
; StandardDesign, // None == 0 == standard design
; NEC98x86, // NEC PC98xx series on X86
; EndAlternatives // past end of known alternatives
;} ALTERNATIVE_ARCHITECTURE_TYPE;
;
;// correctly define these run-time definitions for non X86 machines
;
;#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
;
;#define PROCESSOR_FEATURE_MAX 64
;
;#if defined(REMOTE_BOOT)
;//
;// Defined system flags.
;//
;
;/* the following two lines should be tagged with "winnt" when REMOTE_BOOT is on. */
;#define SYSTEM_FLAG_REMOTE_BOOT_CLIENT 0x00000001
;#define SYSTEM_FLAG_DISKLESS_CLIENT 0x00000002
;#endif // defined(REMOTE_BOOT)
;
;//
;// Define data shared between kernel and user mode.
;//
;// N.B. User mode has read only access to this data
;//
;#ifdef _MAC
;#pragma warning( disable : 4121)
;#endif
;
;typedef struct _KUSER_SHARED_DATA {
;
; //
; // Current low 32-bit of tick count and tick count multiplier.
; //
; // N.B. The tick count is updated each time the clock ticks.
; //
;
; volatile ULONG TickCountLow;
; ULONG TickCountMultiplier;
;
; //
; // Current 64-bit interrupt time in 100ns units.
; //
;
; volatile KSYSTEM_TIME InterruptTime;
;#if defined(_WIN64)
; volatile LONG InterruptHigh2Time;
;#endif
;
; //
; // Current 64-bit system time in 100ns units.
; //
;
;#if defined(_WIN64)
; volatile ULONG SystemLowTime;
; volatile LONG SystemHigh1Time;
; volatile LONG SystemHigh2Time;
;#else
; volatile KSYSTEM_TIME SystemTime;
;#endif
;
; //
; // Current 64-bit time zone bias.
; //
;
; volatile KSYSTEM_TIME TimeZoneBias;
;#if defined(_WIN64)
; volatile LONG TimeZoneBiasHigh2Time;
;#endif
;
; //
; // Support image magic number range for the host system.
; //
; // N.B. This is an inclusive range.
; //
;
; USHORT ImageNumberLow;
; USHORT ImageNumberHigh;
;
; //
; // Copy of system root in Unicode
; //
;
; WCHAR NtSystemRoot[ 260 ];
;
; //
; // Maximum stack trace depth if tracing enabled.
; //
;
; ULONG MaxStackTraceDepth;
;
; //
; // Crypto Exponent
; //
;
; ULONG CryptoExponent;
;
; //
; // TimeZoneId
; //
;
; ULONG TimeZoneId;
;
; ULONG Reserved2[ 8 ];
;
; //
; // product type
; //
;
; NT_PRODUCT_TYPE NtProductType;
; BOOLEAN ProductTypeIsValid;
;
; //
; // NT Version. Note that each process sees a version from its PEB, but
; // if the process is running with an altered view of the system version,
; // the following two fields are used to correctly identify the version
; //
;
; ULONG NtMajorVersion;
; ULONG NtMinorVersion;
;
; //
; // Processor Feature Bits
; //
;
; BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX];
;
; //
; // Reserved fields - do not use
; //
; ULONG Reserved1;
; ULONG Reserved3;
;
; //
; // Time slippage while in debugger
; //
;
; volatile ULONG TimeSlip;
;
; //
; // Alternative system architecture. Example: NEC PC98xx on x86
; //
;
; ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture;
;
; //
; // If the system is an evaluation unit, the following field contains the
; // date and time that the evaluation unit expires. A value of 0 indicates
; // that there is no expiration. A non-zero value is the UTC absolute time
; // that the system expires.
; //
;
; LARGE_INTEGER SystemExpirationDate;
;
; //
; // Suite Support
; //
; ULONG SuiteMask;
;
;#if defined(REMOTE_BOOT)
; //
; // System flags.
; //
;
; ULONG SystemFlags;
;
; //
; // Server path to remote boot root. Only valid for remote boot clients.
; //
;
; WCHAR RemoteBootServerPath[ 260 ];
;#endif // defined(REMOTE_BOOT)
;
; //
; // TRUE if a kernel debugger is connected/enabled
; //
; BOOLEAN KdDebuggerEnabled;
;
;} KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;
;
;
;#ifdef _MAC
;#pragma warning( default : 4121 )
;#endif
;
;// begin_winnt
;//
;// Predefined Value Types.
;//
;
;#define REG_NONE ( 0 ) // No value type
;#define REG_SZ ( 1 ) // Unicode nul terminated string
;#define REG_EXPAND_SZ ( 2 ) // Unicode nul terminated string
; // (with environment variable references)
;#define REG_BINARY ( 3 ) // Free form binary
;#define REG_DWORD ( 4 ) // 32-bit number
;#define REG_DWORD_LITTLE_ENDIAN ( 4 ) // 32-bit number (same as REG_DWORD)
;#define REG_DWORD_BIG_ENDIAN ( 5 ) // 32-bit number
;#define REG_LINK ( 6 ) // Symbolic Link (unicode)
;#define REG_MULTI_SZ ( 7 ) // Multiple Unicode strings
;#define REG_RESOURCE_LIST ( 8 ) // Resource list in the resource map
;#define REG_FULL_RESOURCE_DESCRIPTOR ( 9 ) // Resource list in the hardware description
;#define REG_RESOURCE_REQUIREMENTS_LIST ( 10 )
;#define REG_QWORD ( 11 ) // 64-bit number
;#define REG_QWORD_LITTLE_ENDIAN ( 11 ) // 64-bit number (same as REG_QWORD)
;
;//
;// Service Types (Bit Mask)
;//
;#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)
;
;//
;// Start Type
;//
;
;#define SERVICE_BOOT_START 0x00000000
;#define SERVICE_SYSTEM_START 0x00000001
;#define SERVICE_AUTO_START 0x00000002
;#define SERVICE_DEMAND_START 0x00000003
;#define SERVICE_DISABLED 0x00000004
;
;//
;// Error control type
;//
;#define SERVICE_ERROR_IGNORE 0x00000000
;#define SERVICE_ERROR_NORMAL 0x00000001
;#define SERVICE_ERROR_SEVERE 0x00000002
;#define SERVICE_ERROR_CRITICAL 0x00000003
;
;//
;//
;// Define the registry driver node enumerations
;//
;
;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;
;
;// end_winnt
;
;//
;// Resource List definitions
;//
;
;// begin_ntminiport begin_ntndis
;
;//
;// Defines the Type in the RESOURCE_DESCRIPTOR
;//
;// NOTE: For all CM_RESOURCE_TYPE values, there must be a
;// corresponding ResType value in the 32-bit ConfigMgr headerfile
;// (cfgmgr32.h). Values in the range [0x6,0x80) use the same values
;// as their ConfigMgr counterparts. CM_RESOURCE_TYPE values with
;// the high bit set (i.e., in the range [0x80,0xFF]), are
;// non-arbitrated resources. These correspond to the same values
;// in cfgmgr32.h that have their high bit set (however, since
;// cfgmgr32.h uses 16 bits for ResType values, these values are in
;// the range [0x8000,0x807F). Note that ConfigMgr ResType values
;// cannot be in the range [0x8080,0xFFFF), because they would not
;// be able to map into CM_RESOURCE_TYPE values. (0xFFFF itself is
;// a special value, because it maps to CmResourceTypeDeviceSpecific.)
;//
;
;typedef int CM_RESOURCE_TYPE;
;
;// CmResourceTypeNull is reserved
;
;#define CmResourceTypeNull 0 // ResType_All or ResType_None (0x0000)
;#define CmResourceTypePort 1 // ResType_IO (0x0002)
;#define CmResourceTypeInterrupt 2 // ResType_IRQ (0x0004)
;#define CmResourceTypeMemory 3 // ResType_Mem (0x0001)
;#define CmResourceTypeDma 4 // ResType_DMA (0x0003)
;#define CmResourceTypeDeviceSpecific 5 // ResType_ClassSpecific (0xFFFF)
;#define CmResourceTypeBusNumber 6 // ResType_BusNumber (0x0006)
;// end_wdm
;#define CmResourceTypeMaximum 7
;#define CmResourceTypeAssignedResource 8 // BUGBUG--remove
;#define CmResourceTypeSubAllocateFrom 9 // BUGBUG--remove
;// begin_wdm
;#define CmResourceTypeNonArbitrated 128 // Not arbitrated if 0x80 bit set
;#define CmResourceTypeConfigData 128 // ResType_Reserved (0x8000)
;#define CmResourceTypeDevicePrivate 129 // ResType_DevicePrivate (0x8001)
;#define CmResourceTypePcCardConfig 130 // ResType_PcCardConfig (0x8002)
;#define CmResourceTypeMfCardConfig 131 // ResType_MfCardConfig (0x8003)
;
;//
;// Defines the ShareDisposition in the RESOURCE_DESCRIPTOR
;//
;
;typedef enum _CM_SHARE_DISPOSITION {
; CmResourceShareUndetermined = 0, // Reserved
; CmResourceShareDeviceExclusive,
; CmResourceShareDriverExclusive,
; CmResourceShareShared
;} CM_SHARE_DISPOSITION;
;
;//
;// Define the PASSIGNED_RESOURCE type
;//
;
;#ifndef PASSIGNED_RESOURCE_DEFINED
;#define PASSIGNED_RESOURCE_DEFINED
;typedef PVOID PASSIGNED_RESOURCE;
;#endif // PASSIGNED_RESOURCE_DEFINED
;
;// end_wdm
;
;//
;// Define the bit masks for Flags common for all CM_RESOURCE_TYPE
;//
;// BUGBUG--remove the following 3 flags...
;//
;#define CM_RESOURCE_COMMON_COMPUTE_LENGTH_FROM_DEPENDENTS 0x8000
;#define CM_RESOURCE_COMMON_NOT_REASSIGNED 0x4000
;#define CM_RESOURCE_COMMON_SUBSTRACTIVE 0x2000
;
;// begin_wdm
;
;//
;// Define the bit masks for Flags when type is CmResourceTypeInterrupt
;//
;
;#define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0
;#define CM_RESOURCE_INTERRUPT_LATCHED 1
;
;//
;// Define the bit masks for Flags when type is CmResourceTypeMemory
;//
;
;#define CM_RESOURCE_MEMORY_READ_WRITE 0x0000
;#define CM_RESOURCE_MEMORY_READ_ONLY 0x0001
;#define CM_RESOURCE_MEMORY_WRITE_ONLY 0x0002
;#define CM_RESOURCE_MEMORY_PREFETCHABLE 0x0004
;
;#define CM_RESOURCE_MEMORY_COMBINEDWRITE 0x0008
;#define CM_RESOURCE_MEMORY_24 0x0010
;#define CM_RESOURCE_MEMORY_CACHEABLE 0x0020
;
;//
;// Define the bit masks for Flags when type is CmResourceTypePort
;//
;
;#define CM_RESOURCE_PORT_MEMORY 0x0000
;#define CM_RESOURCE_PORT_IO 0x0001
;// end_wdm
;#define CM_RESOURCE_PORT_FORWARD_FIRST_256_OF_EACH_1024 0x0002 // BUGBUG--remove
;// begin_wdm
;#define CM_RESOURCE_PORT_10_BIT_DECODE 0x0004
;#define CM_RESOURCE_PORT_12_BIT_DECODE 0x0008
;#define CM_RESOURCE_PORT_16_BIT_DECODE 0x0010
;#define CM_RESOURCE_PORT_POSITIVE_DECODE 0x0020
;#define CM_RESOURCE_PORT_PASSIVE_DECODE 0x0040
;#define CM_RESOURCE_PORT_WINDOW_DECODE 0x0080
;
;//
;// Define the bit masks for Flags when type is CmResourceTypeDma
;//
;
;#define CM_RESOURCE_DMA_8 0x0000
;#define CM_RESOURCE_DMA_16 0x0001
;#define CM_RESOURCE_DMA_32 0x0002
;#define CM_RESOURCE_DMA_8_AND_16 0x0004
;#define CM_RESOURCE_DMA_BUS_MASTER 0x0008
;#define CM_RESOURCE_DMA_TYPE_A 0x0010
;#define CM_RESOURCE_DMA_TYPE_B 0x0020
;#define CM_RESOURCE_DMA_TYPE_F 0x0040
;// end_wdm
;
;//
;// Define the bit masks for Flags when type is CmResourceTypeBusNumber
;//
;
;#define CM_RESOURCE_BUSNUMBER_SUBALLOCATE_FIRST_VALUE 0x0001 // BUGBUG--remove
;
;//
;// Define the bit masks for Flags when type is CmResourceTypeSubAllocateFrom
;//
;
;#define CM_RESOURCE_SUBALLOCATEFROM_FIXED_TRANSLATION 0x0001 // BUGBUG--remove
;#define CM_RESOURCE_SUBALLOCATEFROM_WIRED_TRANSLATION 0x0002 // BUGBUG--remove
;
;// end_ntminiport end_ntndis
;
;// begin_wdm
;
;//
;// This structure defines one type of resource used by a driver.
;//
;// There can only be *1* DeviceSpecificData block. It must be located at
;// the end of all resource descriptors in a full descriptor block.
;//
;
;//
;// Make sure alignment is made properly by compiler; otherwise move
;// flags back to the top of the structure (common to all members of the
;// union).
;//
;// begin_ntndis
;
;#include "pshpack4.h"
;typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
; UCHAR Type;
; UCHAR ShareDisposition;
; USHORT Flags;
; union {
;
; //
; // Range of resources, inclusive. These are physical, bus relative.
; // It is known that Port and Memory below have the exact same layout
; // as Generic.
; //
;
; struct {
; PHYSICAL_ADDRESS Start;
; ULONG Length;
; } Generic;
;
; //
; // end_wdm
; // Range of port numbers, inclusive. These are physical, bus
; // relative. The value should be the same as the one passed to
; // HalTranslateBusAddress().
; // begin_wdm
; //
;
; struct {
; PHYSICAL_ADDRESS Start;
; ULONG Length;
; } Port;
;
; //
; // end_wdm
; // IRQL and vector. Should be same values as were passed to
; // HalGetInterruptVector().
; // begin_wdm
; //
;
; struct {
; ULONG Level;
; ULONG Vector;
; ULONG Affinity;
; } Interrupt;
;
; //
; // Range of memory addresses, inclusive. These are physical, bus
; // relative. The value should be the same as the one passed to
; // HalTranslateBusAddress().
; //
;
; struct {
; PHYSICAL_ADDRESS Start; // 64 bit physical addresses.
; ULONG Length;
; } Memory;
;
; //
; // Physical DMA channel.
; //
;
; struct {
; ULONG Channel;
; ULONG Port;
; ULONG Reserved1;
; } Dma;
;
; //
; // Device driver private data, usually used to help it figure
; // what the resource assignments decisions that were made.
; //
;
; struct {
; ULONG Data[3];
; } DevicePrivate;
;
; //
; // Bus Number information.
; //
;
; struct {
; ULONG Start;
; ULONG Length;
; ULONG Reserved;
; } BusNumber;
;
; //
; // Device Specific information defined by the driver.
; // The DataSize field indicates the size of the data in bytes. The
; // data is located immediately after the DeviceSpecificData field in
; // the structure.
; //
;
; struct {
; ULONG DataSize;
; ULONG Reserved1;
; ULONG Reserved2;
; } DeviceSpecificData;
; } u;
;} CM_PARTIAL_RESOURCE_DESCRIPTOR, *PCM_PARTIAL_RESOURCE_DESCRIPTOR;
;#include "poppack.h"
;
;//
;// A Partial Resource List is what can be found in the ARC firmware
;// or will be generated by ntdetect.com.
;// The configuration manager will transform this structure into a Full
;// resource descriptor when it is about to store it in the regsitry.
;//
;// Note: There must a be a convention to the order of fields of same type,
;// (defined on a device by device basis) so that the fields can make sense
;// to a driver (i.e. when multiple memory ranges are necessary).
;//
;
;typedef struct _CM_PARTIAL_RESOURCE_LIST {
; USHORT Version;
; USHORT Revision;
; ULONG Count;
; CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
;} CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
;
;//
;// A Full Resource Descriptor is what can be found in the registry.
;// This is what will be returned to a driver when it queries the registry
;// to get device information; it will be stored under a key in the hardware
;// description tree.
;//
;// end_wdm
;// Note: The BusNumber and Type are redundant information, but we will keep
;// it since it allows the driver _not_ to append it when it is creating
;// a resource list which could possibly span multiple buses.
;//
;// begin_wdm
;// Note: There must a be a convention to the order of fields of same type,
;// (defined on a device by device basis) so that the fields can make sense
;// to a driver (i.e. when multiple memory ranges are necessary).
;//
;
;typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
; INTERFACE_TYPE InterfaceType; // unused for WDM
; ULONG BusNumber; // unused for WDM
; CM_PARTIAL_RESOURCE_LIST PartialResourceList;
;} CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
;
;//
;// The Resource list is what will be stored by the drivers into the
;// resource map via the IO API.
;//
;
;typedef struct _CM_RESOURCE_LIST {
; ULONG Count;
; CM_FULL_RESOURCE_DESCRIPTOR List[1];
;} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
;
;// end_ntndis
;//
;// Define the structures used to interpret configuration data of
;// \\Registry\machine\hardware\description tree.
;// Basically, these structures are used to interpret component
;// sepcific data.
;//
;
;//
;// Define DEVICE_FLAGS
;//
;
;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;
;
;//
;// Define Component Information structure
;//
;
;typedef struct _CM_COMPONENT_INFORMATION {
; DEVICE_FLAGS Flags;
; ULONG Version;
; ULONG Key;
; ULONG AffinityMask;
;} CM_COMPONENT_INFORMATION, *PCM_COMPONENT_INFORMATION;
;
;//
;// The following structures are used to interpret x86
;// DeviceSpecificData of CM_PARTIAL_RESOURCE_DESCRIPTOR.
;// (Most of the structures are defined by BIOS. They are
;// not aligned on word (or dword) boundary.
;//
;
;//
;// Define the Rom Block structure
;//
;
;typedef struct _CM_ROM_BLOCK {
; ULONG Address;
; ULONG Size;
;} CM_ROM_BLOCK, *PCM_ROM_BLOCK;
;
;// begin_ntminiport begin_ntndis
;
;#include "pshpack1.h"
;
;// end_ntminiport end_ntndis
;
;//
;// Define INT13 driver parameter block
;//
;
;typedef struct _CM_INT13_DRIVE_PARAMETER {
; USHORT DriveSelect;
; ULONG MaxCylinders;
; USHORT SectorsPerTrack;
; USHORT MaxHeads;
; USHORT NumberDrives;
;} CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
;
;// begin_ntminiport begin_ntndis
;
;//
;// Define Mca POS data block for slot
;//
;
;typedef struct _CM_MCA_POS_DATA {
; USHORT AdapterId;
; UCHAR PosData1;
; UCHAR PosData2;
; UCHAR PosData3;
; UCHAR PosData4;
;} CM_MCA_POS_DATA, *PCM_MCA_POS_DATA;
;
;//
;// Memory configuration of eisa data block structure
;//
;
;typedef struct _EISA_MEMORY_TYPE {
; UCHAR ReadWrite: 1;
; UCHAR Cached : 1;
; UCHAR Reserved0 :1;
; UCHAR Type:2;
; UCHAR Shared:1;
; UCHAR Reserved1 :1;
; UCHAR MoreEntries : 1;
;} EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
;
;typedef struct _EISA_MEMORY_CONFIGURATION {
; EISA_MEMORY_TYPE ConfigurationByte;
; UCHAR DataSize;
; USHORT AddressLowWord;
; UCHAR AddressHighByte;
; USHORT MemorySize;
;} EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
;
;
;//
;// Interrupt configurationn of eisa data block structure
;//
;
;typedef struct _EISA_IRQ_DESCRIPTOR {
; UCHAR Interrupt : 4;
; UCHAR Reserved :1;
; UCHAR LevelTriggered :1;
; UCHAR Shared : 1;
; UCHAR MoreEntries : 1;
;} EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
;
;typedef struct _EISA_IRQ_CONFIGURATION {
; EISA_IRQ_DESCRIPTOR ConfigurationByte;
; UCHAR Reserved;
;} EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
;
;
;//
;// DMA description of eisa data block structure
;//
;
;typedef struct _DMA_CONFIGURATION_BYTE0 {
; UCHAR Channel : 3;
; UCHAR Reserved : 3;
; UCHAR Shared :1;
; UCHAR MoreEntries :1;
;} DMA_CONFIGURATION_BYTE0;
;
;typedef struct _DMA_CONFIGURATION_BYTE1 {
; UCHAR Reserved0 : 2;
; UCHAR TransferSize : 2;
; UCHAR Timing : 2;
; UCHAR Reserved1 : 2;
;} DMA_CONFIGURATION_BYTE1;
;
;typedef struct _EISA_DMA_CONFIGURATION {
; DMA_CONFIGURATION_BYTE0 ConfigurationByte0;
; DMA_CONFIGURATION_BYTE1 ConfigurationByte1;
;} EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
;
;
;//
;// Port description of eisa data block structure
;//
;
;typedef struct _EISA_PORT_DESCRIPTOR {
; UCHAR NumberPorts : 5;
; UCHAR Reserved :1;
; UCHAR Shared :1;
; UCHAR MoreEntries : 1;
;} EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
;
;typedef struct _EISA_PORT_CONFIGURATION {
; EISA_PORT_DESCRIPTOR Configuration;
; USHORT PortAddress;
;} EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
;
;
;//
;// Eisa slot information definition
;// N.B. This structure is different from the one defined
;// in ARC eisa addendum.
;//
;
;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;
;
;
;//
;// Eisa function information definition
;//
;
;typedef struct _CM_EISA_FUNCTION_INFORMATION {
; ULONG CompressedId;
; UCHAR IdSlotFlags1;
; UCHAR IdSlotFlags2;
; UCHAR MinorRevision;
; UCHAR MajorRevision;
; UCHAR Selections[26];
; UCHAR FunctionFlags;
; UCHAR TypeString[80];
; EISA_MEMORY_CONFIGURATION EisaMemory[9];
; EISA_IRQ_CONFIGURATION EisaIrq[7];
; EISA_DMA_CONFIGURATION EisaDma[4];
; EISA_PORT_CONFIGURATION EisaPort[20];
; UCHAR InitializationData[60];
;} CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
;
;//
;// The following defines the way pnp bios information is stored in
;// the registry \\HKEY_LOCAL_MACHINE\HARDWARE\Description\System\MultifunctionAdapter\x
;// key, where x is an integer number indicating adapter instance. The
;// "Identifier" of the key must equal to "PNP BIOS" and the
;// "ConfigurationData" is organized as follow:
;//
;// CM_PNP_BIOS_INSTALLATION_CHECK +
;// CM_PNP_BIOS_DEVICE_NODE for device 1 +
;// CM_PNP_BIOS_DEVICE_NODE for device 2 +
;// ...
;// CM_PNP_BIOS_DEVICE_NODE for device n
;//
;
;//
;// Pnp BIOS device node structure
;//
;
;typedef struct _CM_PNP_BIOS_DEVICE_NODE {
; USHORT Size;
; UCHAR Node;
; ULONG ProductId;
; UCHAR DeviceType[3];
; USHORT DeviceAttributes;
; // followed by AllocatedResourceBlock, PossibleResourceBlock
; // and CompatibleDeviceId
;} CM_PNP_BIOS_DEVICE_NODE,*PCM_PNP_BIOS_DEVICE_NODE;
;
;//
;// Pnp BIOS Installation check
;//
;
;typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK {
; UCHAR Signature[4]; // $PnP (ascii)
; UCHAR Revision;
; UCHAR Length;
; USHORT ControlField;
; UCHAR Checksum;
; ULONG EventFlagAddress; // Physical address
; USHORT RealModeEntryOffset;
; USHORT RealModeEntrySegment;
; USHORT ProtectedModeEntryOffset;
; ULONG ProtectedModeCodeBaseAddress;
; ULONG OemDeviceId;
; USHORT RealModeDataBaseAddress;
; ULONG ProtectedModeDataBaseAddress;
;} CM_PNP_BIOS_INSTALLATION_CHECK, *PCM_PNP_BIOS_INSTALLATION_CHECK;
;
;#include "poppack.h"
;
;//
;// Masks for EISA function information
;//
;
;#define EISA_FUNCTION_ENABLED 0x80
;#define EISA_FREE_FORM_DATA 0x40
;#define EISA_HAS_PORT_INIT_ENTRY 0x20
;#define EISA_HAS_PORT_RANGE 0x10
;#define EISA_HAS_DMA_ENTRY 0x08
;#define EISA_HAS_IRQ_ENTRY 0x04
;#define EISA_HAS_MEMORY_ENTRY 0x02
;#define EISA_HAS_TYPE_ENTRY 0x01
;#define EISA_HAS_INFORMATION EISA_HAS_PORT_RANGE + \
; EISA_HAS_DMA_ENTRY + \
; EISA_HAS_IRQ_ENTRY + \
; EISA_HAS_MEMORY_ENTRY + \
; EISA_HAS_TYPE_ENTRY
;
;//
;// Masks for EISA memory configuration
;//
;
;#define EISA_MORE_ENTRIES 0x80
;#define EISA_SYSTEM_MEMORY 0x00
;#define EISA_MEMORY_TYPE_RAM 0x01
;
;//
;// Returned error code for EISA bios call
;//
;
;#define EISA_INVALID_SLOT 0x80
;#define EISA_INVALID_FUNCTION 0x81
;#define EISA_INVALID_CONFIGURATION 0x82
;#define EISA_EMPTY_SLOT 0x83
;#define EISA_INVALID_BIOS_CALL 0x86
;
;// end_ntminiport end_ntndis
;
;//
;// The following structures are used to interpret mips
;// DeviceSpecificData of CM_PARTIAL_RESOURCE_DESCRIPTOR.
;//
;
;//
;// Device data records for adapters.
;//
;
;//
;// The device data record for the Emulex SCSI controller.
;//
;
;typedef struct _CM_SCSI_DEVICE_DATA {
; USHORT Version;
; USHORT Revision;
; UCHAR HostIdentifier;
;} CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
;
;//
;// Device data records for controllers.
;//
;
;//
;// The device data record for the Video controller.
;//
;
;typedef struct _CM_VIDEO_DEVICE_DATA {
; USHORT Version;
; USHORT Revision;
; ULONG VideoClock;
;} CM_VIDEO_DEVICE_DATA, *PCM_VIDEO_DEVICE_DATA;
;
;//
;// The device data record for the SONIC network controller.
;//
;
;typedef struct _CM_SONIC_DEVICE_DATA {
; USHORT Version;
; USHORT Revision;
; USHORT DataConfigurationRegister;
; UCHAR EthernetAddress[8];
;} CM_SONIC_DEVICE_DATA, *PCM_SONIC_DEVICE_DATA;
;
;//
;// The device data record for the serial controller.
;//
;
;typedef struct _CM_SERIAL_DEVICE_DATA {
; USHORT Version;
; USHORT Revision;
; ULONG BaudClock;
;} CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
;
;//
;// Device data records for peripherals.
;//
;
;//
;// The device data record for the Monitor peripheral.
;//
;
;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;
;
;//
;// The device data record for the Floppy peripheral.
;//
;
;typedef struct _CM_FLOPPY_DEVICE_DATA {
; USHORT Version;
; USHORT Revision;
; CHAR Size[8];
; ULONG MaxDensity;
; ULONG MountDensity;
; //
; // New data fields for version >= 2.0
; //
; 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;
;
;//
;// The device data record for the Keyboard peripheral.
;// The KeyboardFlags is defined (by x86 BIOS INT 16h, function 02) as:
;// bit 7 : Insert on
;// bit 6 : Caps Lock on
;// bit 5 : Num Lock on
;// bit 4 : Scroll Lock on
;// bit 3 : Alt Key is down
;// bit 2 : Ctrl Key is down
;// bit 1 : Left shift key is down
;// bit 0 : Right shift key is down
;//
;
;typedef struct _CM_KEYBOARD_DEVICE_DATA {
; USHORT Version;
; USHORT Revision;
; UCHAR Type;
; UCHAR Subtype;
; USHORT KeyboardFlags;
;} CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
;
;//
;// Declaration of the structure for disk geometries
;//
;
;typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA {
; ULONG BytesPerSector;
; ULONG NumberOfCylinders;
; ULONG SectorsPerTrack;
; ULONG NumberOfHeads;
;} CM_DISK_GEOMETRY_DEVICE_DATA, *PCM_DISK_GEOMETRY_DEVICE_DATA;
;
;// end_wdm
;//
;// Declaration of the structure for the PcCard ISA IRQ map
;//
;
;typedef struct _CM_PCCARD_DEVICE_DATA {
; UCHAR Flags;
; UCHAR ErrorCode;
; USHORT Reserved;
; ULONG BusData;
; ULONG DeviceId;
; ULONG LegacyBaseAddress;
; UCHAR IRQMap[16];
;} CM_PCCARD_DEVICE_DATA, *PCM_PCCARD_DEVICE_DATA;
;
;// Definitions for Flags
;
;#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
;
;// begin_wdm
;// begin_ntminiport
;
;//
;// Defines Resource Options
;//
;
;#define IO_RESOURCE_PREFERRED 0x01
;#define IO_RESOURCE_DEFAULT 0x02
;#define IO_RESOURCE_ALTERNATIVE 0x08
;
;
;//
;// This structure defines one type of resource requested by the driver
;//
;
;typedef struct _IO_RESOURCE_DESCRIPTOR {
; UCHAR Option;
; UCHAR Type; // use CM_RESOURCE_TYPE
; UCHAR ShareDisposition; // use CM_SHARE_DISPOSITION
; UCHAR Spare1;
; USHORT Flags; // use CM resource flag defines
; USHORT Spare2; // align
;
; union {
; struct {
; ULONG Length;
; ULONG Alignment;
; PHYSICAL_ADDRESS MinimumAddress;
; PHYSICAL_ADDRESS MaximumAddress;
; } Port;
;
; struct {
; ULONG Length;
; ULONG Alignment;
; PHYSICAL_ADDRESS MinimumAddress;
; PHYSICAL_ADDRESS MaximumAddress;
; } Memory;
;
; struct {
; ULONG MinimumVector;
; ULONG MaximumVector;
; } Interrupt;
;
; struct {
; ULONG MinimumChannel;
; ULONG MaximumChannel;
; } Dma;
;
; struct {
; ULONG Length;
; ULONG Alignment;
; PHYSICAL_ADDRESS MinimumAddress;
; PHYSICAL_ADDRESS MaximumAddress;
; } Generic;
;
; struct {
; ULONG Data[3];
; } DevicePrivate;
;
; //
; // Bus Number information.
; //
;
; struct {
; ULONG Length;
; ULONG MinBusNumber;
; ULONG MaxBusNumber;
; ULONG Reserved;
; } BusNumber;
;
;// end_wdm
;
; struct {
; PASSIGNED_RESOURCE AssignedResource;
; } AssignedResource; // will be obsoleted
;
; struct {
; UCHAR Type; // use CM_RESOURCE_TYPE
; UCHAR Reserved[3];
; PASSIGNED_RESOURCE AssignedResource;
; PHYSICAL_ADDRESS Transformation;
; } SubAllocateFrom; // will be obsoleted
;
;// begin_wdm
;
; struct {
; ULONG Priority; // use LCPRI_Xxx values in cfg.h
; ULONG Reserved1;
; ULONG Reserved2;
; } ConfigData;
;
; } u;
;
;} IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
;
;// end_ntminiport
;
;
;typedef struct _IO_RESOURCE_LIST {
; USHORT Version;
; USHORT Revision;
;
; ULONG Count;
; IO_RESOURCE_DESCRIPTOR Descriptors[1];
;} IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
;
;
;typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
; ULONG ListSize;
; INTERFACE_TYPE InterfaceType; // unused for WDM
; ULONG BusNumber; // unused for WDM
; ULONG SlotNumber;
; ULONG Reserved[3];
; ULONG AlternativeLists;
; IO_RESOURCE_LIST List[1];
;} IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
;
;//
;// Exception flag definitions.
;//
;
;// begin_winnt
;#define EXCEPTION_NONCONTINUABLE 0x1 // Noncontinuable exception
;// end_winnt
;
;//
;// Define maximum number of exception parameters.
;//
;
;// begin_winnt
;#define EXCEPTION_MAXIMUM_PARAMETERS 15 // maximum number of exception parameters
;
;//
;// Exception record definition.
;//
;
;typedef struct _EXCEPTION_RECORD {
; NTSTATUS ExceptionCode;
; ULONG ExceptionFlags;
; struct _EXCEPTION_RECORD *ExceptionRecord;
; PVOID ExceptionAddress;
; ULONG NumberParameters;
; ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
; } EXCEPTION_RECORD;
;
;typedef EXCEPTION_RECORD *PEXCEPTION_RECORD;
;
;typedef struct _EXCEPTION_RECORD32 {
; NTSTATUS ExceptionCode;
; ULONG ExceptionFlags;
; ULONG ExceptionRecord;
; ULONG ExceptionAddress;
; ULONG NumberParameters;
; ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
;} EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
;
;typedef struct _EXCEPTION_RECORD64 {
; NTSTATUS ExceptionCode;
; ULONG ExceptionFlags;
; ULONG64 ExceptionRecord;
; ULONG64 ExceptionAddress;
; ULONG NumberParameters;
; ULONG __unusedAlignment;
; ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
;} EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
;
;//
;// Typedef for pointer returned by exception_info()
;//
;
;typedef struct _EXCEPTION_POINTERS {
; PEXCEPTION_RECORD ExceptionRecord;
; PCONTEXT ContextRecord;
;} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
;// end_winnt
;
;//
;// Define configuration routine types.
;//
;// Configuration information.
;//
;
;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,
; MaximumType
;} CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
;
;#define THREAD_WAIT_OBJECTS 3 // Builtin usable wait blocks
;
;//
;// Interrupt modes.
;//
;
;typedef enum _KINTERRUPT_MODE {
; LevelSensitive,
; Latched
; } KINTERRUPT_MODE;
;
;//
;// Wait reasons
;//
;
;typedef enum _KWAIT_REASON {
; Executive,
; FreePage,
; PageIn,
; PoolAllocation,
; DelayExecution,
; Suspended,
; UserRequest,
; WrExecutive,
; WrFreePage,
; WrPageIn,
; WrPoolAllocation,
; WrDelayExecution,
; WrSuspended,
; WrUserRequest,
; WrEventPair,
; WrQueue,
; WrLpcReceive,
; WrLpcReply,
; WrVirtualMemory,
; WrPageOut,
; WrRendezvous,
; Spare2,
; Spare3,
; Spare4,
; Spare5,
; Spare6,
; WrKernel,
; MaximumWaitReason
; } KWAIT_REASON;
;
;//
;// Common dispatcher object header
;//
;// N.B. The size field contains the number of dwords in the structure.
;//
;
;typedef struct _DISPATCHER_HEADER {
; UCHAR Type;
; UCHAR Absolute;
; UCHAR Size;
; UCHAR Inserted;
; LONG SignalState;
; LIST_ENTRY WaitListHead;
;} DISPATCHER_HEADER;
;
;
;typedef struct _KWAIT_BLOCK {
; LIST_ENTRY WaitListEntry;
; struct _KTHREAD *RESTRICTED_POINTER Thread;
; PVOID Object;
; struct _KWAIT_BLOCK *RESTRICTED_POINTER NextWaitBlock;
; USHORT WaitKey;
; USHORT WaitType;
;} KWAIT_BLOCK, *PKWAIT_BLOCK, *RESTRICTED_POINTER PRKWAIT_BLOCK;
;
;//
;// Thread start function
;//
;
;typedef
;VOID
;(*PKSTART_ROUTINE) (
; IN PVOID StartContext
; );
;
;//
;// Kernel object structure definitions
;//
;
;//
;// Device Queue object and entry
;//
;
;typedef struct _KDEVICE_QUEUE {
; CSHORT Type;
; CSHORT Size;
; LIST_ENTRY DeviceListHead;
; KSPIN_LOCK Lock;
; BOOLEAN Busy;
;} KDEVICE_QUEUE, *PKDEVICE_QUEUE, *RESTRICTED_POINTER PRKDEVICE_QUEUE;
;
;typedef struct _KDEVICE_QUEUE_ENTRY {
; LIST_ENTRY DeviceListEntry;
; ULONG SortKey;
; BOOLEAN Inserted;
;} KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY, *RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
;
;// begin_ntndis
;//
;// Event object
;//
;
;typedef struct _KEVENT {
; DISPATCHER_HEADER Header;
;} KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
;
;//
;// Define the interrupt service function type and the empty struct
;// type.
;//
;typedef
;BOOLEAN
;(*PKSERVICE_ROUTINE) (
; IN struct _KINTERRUPT *Interrupt,
; IN PVOID ServiceContext
; );
;//
;// Mutant object
;//
;
;typedef struct _KMUTANT {
; DISPATCHER_HEADER Header;
; LIST_ENTRY MutantListEntry;
; struct _KTHREAD *RESTRICTED_POINTER OwnerThread;
; BOOLEAN Abandoned;
; UCHAR ApcDisable;
;} KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;
;
;//
;//
;// Semaphore object
;//
;
;typedef struct _KSEMAPHORE {
; DISPATCHER_HEADER Header;
; LONG Limit;
;} KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
;
;// begin_ntndis
;//
;// Timer object
;//
;
;typedef struct _KTIMER {
; DISPATCHER_HEADER Header;
; ULARGE_INTEGER DueTime;
; LIST_ENTRY TimerListEntry;
; struct _KDPC *Dpc;
; LONG Period;
;} KTIMER, *PKTIMER, *RESTRICTED_POINTER PRKTIMER;
;
;//
;// DPC object
;//
;
;NTKERNELAPI
;VOID
;KeInitializeDpc (
; IN PRKDPC Dpc,
; IN PKDEFERRED_ROUTINE DeferredRoutine,
; IN PVOID DeferredContext
; );
;
;NTKERNELAPI
;BOOLEAN
;KeInsertQueueDpc (
; IN PRKDPC Dpc,
; IN PVOID SystemArgument1,
; IN PVOID SystemArgument2
; );
;
;NTKERNELAPI
;BOOLEAN
;KeRemoveQueueDpc (
; IN PRKDPC Dpc
; );
;
;// end_wdm
;
;NTKERNELAPI
;VOID
;KeSetImportanceDpc (
; IN PRKDPC Dpc,
; IN KDPC_IMPORTANCE Importance
; );
;
;NTKERNELAPI
;VOID
;KeSetTargetProcessorDpc (
; IN PRKDPC Dpc,
; IN CCHAR Number
; );
;
;// begin_wdm
;//
;// Device queue object
;//
;
;NTKERNELAPI
;VOID
;KeInitializeDeviceQueue (
; IN PKDEVICE_QUEUE DeviceQueue
; );
;
;NTKERNELAPI
;BOOLEAN
;KeInsertDeviceQueue (
; IN PKDEVICE_QUEUE DeviceQueue,
; IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
; );
;
;NTKERNELAPI
;BOOLEAN
;KeInsertByKeyDeviceQueue (
; IN PKDEVICE_QUEUE DeviceQueue,
; IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
; IN ULONG SortKey
; );
;
;NTKERNELAPI
;PKDEVICE_QUEUE_ENTRY
;KeRemoveDeviceQueue (
; IN PKDEVICE_QUEUE DeviceQueue
; );
;
;NTKERNELAPI
;PKDEVICE_QUEUE_ENTRY
;KeRemoveByKeyDeviceQueue (
; IN PKDEVICE_QUEUE DeviceQueue,
; IN ULONG SortKey
; );
;
;NTKERNELAPI
;BOOLEAN
;KeRemoveEntryDeviceQueue (
; IN PKDEVICE_QUEUE DeviceQueue,
; IN PKDEVICE_QUEUE_ENTRY DeviceQueueEntry
; );
;
;NTKERNELAPI
;BOOLEAN
;KeSynchronizeExecution (
; IN PKINTERRUPT Interrupt,
; IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
; IN PVOID SynchronizeContext
; );
;
;//
;// Kernel dispatcher object functions
;//
;// Event Object
;//
;
;
;NTKERNELAPI
;VOID
;KeInitializeEvent (
; IN PRKEVENT Event,
; IN EVENT_TYPE Type,
; IN BOOLEAN State
; );
;
;NTKERNELAPI
;VOID
;KeClearEvent (
; IN PRKEVENT Event
; );
;
;NTKERNELAPI
;LONG
;KePulseEvent (
; IN PRKEVENT Event,
; IN KPRIORITY Increment,
; IN BOOLEAN Wait
; );
;
;NTKERNELAPI
;LONG
;KeReadStateEvent (
; IN PRKEVENT Event
; );
;
;// begin_wdm
;
;NTKERNELAPI
;LONG
;KeResetEvent (
; IN PRKEVENT Event
; );
;
;NTKERNELAPI
;LONG
;KeSetEvent (
; IN PRKEVENT Event,
; IN KPRIORITY Increment,
; IN BOOLEAN Wait
; );
;
;//
;// Mutex object
;//
;
;NTKERNELAPI
;VOID
;KeInitializeMutex (
; IN PRKMUTEX Mutex,
; IN ULONG Level
; );
;
;#define KeReadStateMutex(Mutex) KeReadStateMutant(Mutex)
;
;NTKERNELAPI
;LONG
;KeReleaseMutex (
; IN PRKMUTEX Mutex,
; IN BOOLEAN Wait
; );
;
;//
;// Semaphore object
;//
;
;NTKERNELAPI
;VOID
;KeInitializeSemaphore (
; IN PRKSEMAPHORE Semaphore,
; IN LONG Count,
; IN LONG Limit
; );
;
;NTKERNELAPI
;LONG
;KeReadStateSemaphore (
; IN PRKSEMAPHORE Semaphore
; );
;
;NTKERNELAPI
;LONG
;KeReleaseSemaphore (
; IN PRKSEMAPHORE Semaphore,
; IN KPRIORITY Increment,
; IN LONG Adjustment,
; IN BOOLEAN Wait
; );
;
;NTKERNELAPI
;NTSTATUS
;KeDelayExecutionThread (
; IN KPROCESSOR_MODE WaitMode,
; IN BOOLEAN Alertable,
; IN PLARGE_INTEGER Interval
; );
;
;NTKERNELAPI
;KPRIORITY
;KeQueryPriorityThread (
; IN PKTHREAD Thread
; );
;
;NTKERNELAPI
;LONG
;KeSetBasePriorityThread (
; IN PKTHREAD Thread,
; IN LONG Increment
; );
;
;NTKERNELAPI
;KPRIORITY
;KeSetPriorityThread (
; IN PKTHREAD Thread,
; IN KPRIORITY Priority
; );
;
;
;#if (defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_)) && !defined(_NTSYSTEM_DRIVER_)
;
;// begin_wdm
;
;NTKERNELAPI
;VOID
;KeEnterCriticalRegion (
; VOID
; );
;
;NTKERNELAPI
;VOID
;KeLeaveCriticalRegion (
; VOID
; );
;
;// end_wdm
;
;#else
;
;//++
;//
;// VOID
;// KeEnterCriticalRegion (
;// VOID
;// )
;//
;//
;// Routine Description:
;//
;// This function disables kernel APC's.
;//
;// N.B. The following code does not require any interlocks. There are
;// two cases of interest: 1) On an MP system, the thread cannot
;// be running on two processors as once, and 2) if the thread is
;// is interrupted to deliver a kernel mode APC which also calls
;// this routine, the values read and stored will stack and unstack
;// properly.
;//
;// Arguments:
;//
;// None.
;//
;// Return Value:
;//
;// None.
;//--
;
;#define KeEnterCriticalRegion() KeGetCurrentThread()->KernelApcDisable -= 1;
;
;//++
;//
;// VOID
;// KeLeaveCriticalRegion (
;// VOID
;// )
;//
;//
;// Routine Description:
;//
;// This function enables kernel APC's.
;//
;// N.B. The following code does not require any interlocks. There are
;// two cases of interest: 1) On an MP system, the thread cannot
;// be running on two processors as once, and 2) if the thread is
;// is interrupted to deliver a kernel mode APC which also calls
;// this routine, the values read and stored will stack and unstack
;// properly.
;//
;// Arguments:
;//
;// None.
;//
;// Return Value:
;//
;// None.
;//--
;
;#define KeLeaveCriticalRegion() KiLeaveCriticalRegion()
;
;#endif
;
;// begin_wdm
;
;//
;// Timer object
;//
;
;NTKERNELAPI
;VOID
;KeInitializeTimer (
; IN PKTIMER Timer
; );
;
;NTKERNELAPI
;VOID
;KeInitializeTimerEx (
; IN PKTIMER Timer,
; IN TIMER_TYPE Type
; );
;
;NTKERNELAPI
;BOOLEAN
;KeCancelTimer (
; IN PKTIMER
; );
;
;NTKERNELAPI
;BOOLEAN
;KeReadStateTimer (
; PKTIMER Timer
; );
;
;NTKERNELAPI
;BOOLEAN
;KeSetTimer (
; IN PKTIMER Timer,
; IN LARGE_INTEGER DueTime,
; IN PKDPC Dpc OPTIONAL
; );
;
;NTKERNELAPI
;BOOLEAN
;KeSetTimerEx (
; IN PKTIMER Timer,
; IN LARGE_INTEGER DueTime,
; IN LONG Period OPTIONAL,
; IN PKDPC Dpc OPTIONAL
; );
;
;
;#define KeWaitForMutexObject KeWaitForSingleObject
;
;NTKERNELAPI
;NTSTATUS
;KeWaitForMultipleObjects (
; IN ULONG Count,
; IN PVOID Object[],
; IN WAIT_TYPE WaitType,
; IN KWAIT_REASON WaitReason,
; IN KPROCESSOR_MODE WaitMode,
; IN BOOLEAN Alertable,
; IN PLARGE_INTEGER Timeout OPTIONAL,
; IN PKWAIT_BLOCK WaitBlockArray OPTIONAL
; );
;
;NTKERNELAPI
;NTSTATUS
;KeWaitForSingleObject (
; IN PVOID Object,
; IN KWAIT_REASON WaitReason,
; IN KPROCESSOR_MODE WaitMode,
; IN BOOLEAN Alertable,
; IN PLARGE_INTEGER Timeout OPTIONAL
; );
;
;
;//
;// On X86 the following routines are defined in the HAL and imported by
;// all other modules.
;//
;
;#if defined(_X86_) && !defined(_NTHAL_)
;
;#define _DECL_HAL_KE_IMPORT __declspec(dllimport)
;
;#else
;
;#define _DECL_HAL_KE_IMPORT
;
;#endif
;
;//
;// spin lock functions
;//
;
;NTKERNELAPI
;VOID
;NTAPI
;KeInitializeSpinLock (
; IN PKSPIN_LOCK SpinLock
; );
;
;#if defined(_X86_)
;
;NTKERNELAPI
;VOID
;FASTCALL
;KefAcquireSpinLockAtDpcLevel (
; IN PKSPIN_LOCK SpinLock
; );
;
;NTKERNELAPI
;VOID
;FASTCALL
;KefReleaseSpinLockFromDpcLevel (
; IN PKSPIN_LOCK SpinLock
; );
;
;#define KeAcquireSpinLockAtDpcLevel(a) KefAcquireSpinLockAtDpcLevel(a)
;#define KeReleaseSpinLockFromDpcLevel(a) KefReleaseSpinLockFromDpcLevel(a)
;
;_DECL_HAL_KE_IMPORT
;KIRQL
;FASTCALL
;KfAcquireSpinLock (
; IN PKSPIN_LOCK SpinLock
; );
;
;_DECL_HAL_KE_IMPORT
;VOID
;FASTCALL
;KfReleaseSpinLock (
; IN PKSPIN_LOCK SpinLock,
; IN KIRQL NewIrql
; );
;
;// end_wdm
;
;_DECL_HAL_KE_IMPORT
;KIRQL
;FASTCALL
;KeAcquireSpinLockRaiseToSynch (
; IN PKSPIN_LOCK SpinLock
; );
;
;// begin_wdm
;
;#define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
;#define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
;
;#else
;
;NTKERNELAPI
;KIRQL
;FASTCALL
;KeAcquireSpinLockRaiseToSynch (
; IN PKSPIN_LOCK SpinLock
; );
;
;NTKERNELAPI
;VOID
;KeAcquireSpinLockAtDpcLevel (
; IN PKSPIN_LOCK SpinLock
; );
;
;NTKERNELAPI
;VOID
;KeReleaseSpinLockFromDpcLevel (
; IN PKSPIN_LOCK SpinLock
; );
;
;NTKERNELAPI
;KIRQL
;KeAcquireSpinLockRaiseToDpc (
; IN PKSPIN_LOCK SpinLock
; );
;
;#define KeAcquireSpinLock(SpinLock, OldIrql) \
; *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock)
;
;NTKERNELAPI
;VOID
;KeReleaseSpinLock (
; IN PKSPIN_LOCK SpinLock,
; IN KIRQL NewIrql
; );
;
;#endif
;
;
;#if defined(_X86_)
;
;_DECL_HAL_KE_IMPORT
;VOID
;FASTCALL
;KfLowerIrql (
; IN KIRQL NewIrql
; );
;
;_DECL_HAL_KE_IMPORT
;KIRQL
;FASTCALL
;KfRaiseIrql (
; IN KIRQL NewIrql
; );
;
;// end_wdm
;
;_DECL_HAL_KE_IMPORT
;KIRQL
;KeRaiseIrqlToDpcLevel(
; VOID
; );
;
;_DECL_HAL_KE_IMPORT
;KIRQL
;KeRaiseIrqlToSynchLevel(
; VOID
; );
;
;// begin_wdm
;
;#define KeLowerIrql(a) KfLowerIrql(a)
;#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
;
;// end_wdm
;
;// begin_wdm
;
;#elif defined(_ALPHA_)
;
;#define KeLowerIrql(a) __swpirql(a)
;#define KeRaiseIrql(a,b) *(b) = __swpirql(a)
;
;// end_wdm
;
;#define KfRaiseIrql(a) __swpirql(a)
;#define KeRaiseIrqlToDpcLevel() __swpirql(DISPATCH_LEVEL)
;#define KeRaiseIrqlToSynchLevel() __swpirql((UCHAR)KiSynchIrql)
;
;// begin_wdm
;
;#elif defined(_IA64_)
;
;VOID
;KeLowerIrql (
; IN KIRQL NewIrql
; );
;
;VOID
;KeRaiseIrql (
; IN KIRQL NewIrql,
; OUT PKIRQL OldIrql
; );
;
;// end_wdm
;
;KIRQL
;KeRaiseIrqlToDpcLevel (
; VOID
; );
;
;KIRQL
;KeRaiseIrqlToSynchLevel (
; VOID
; );
;
;// begin_wdm
;
;#endif
;
;//
;// Miscellaneous kernel functions
;//
;
;// end_wdm
;
;BOOLEAN
;KeGetBugMessageText(
; IN ULONG MessageId,
; IN PANSI_STRING ReturnedString OPTIONAL
; );
;
;typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
; BufferEmpty,
; BufferInserted,
; BufferStarted,
; BufferFinished,
; BufferIncomplete
;} KBUGCHECK_BUFFER_DUMP_STATE;
;
;typedef
;VOID
;(*PKBUGCHECK_CALLBACK_ROUTINE) (
; IN PVOID Buffer,
; IN ULONG Length
; );
;
;typedef struct _KBUGCHECK_CALLBACK_RECORD {
; LIST_ENTRY Entry;
; PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
; PVOID Buffer;
; ULONG Length;
; PUCHAR Component;
; ULONG_PTR Checksum;
; UCHAR State;
;} KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
;
;NTKERNELAPI
;DECLSPEC_NORETURN
;VOID
;NTAPI
;KeBugCheck (
; IN ULONG BugCheckCode
; );
;
;// begin_wdm
;
;NTKERNELAPI
;DECLSPEC_NORETURN
;VOID
;KeBugCheckEx(
; IN ULONG BugCheckCode,
; IN ULONG_PTR BugCheckParameter1,
; IN ULONG_PTR BugCheckParameter2,
; IN ULONG_PTR BugCheckParameter3,
; IN ULONG_PTR BugCheckParameter4
; );
;
;// end_wdm
;
;#define KeInitializeCallbackRecord(CallbackRecord) \
; (CallbackRecord)->State = BufferEmpty
;
;NTKERNELAPI
;BOOLEAN
;KeDeregisterBugCheckCallback (
; IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord
; );
;
;NTKERNELAPI
;BOOLEAN
;KeRegisterBugCheckCallback (
; IN PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
; IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
; IN PVOID Buffer,
; IN ULONG Length,
; IN PUCHAR Component
; );
;
;NTKERNELAPI
;VOID
;KeEnterKernelDebugger (
; VOID
; );
;
;
;NTKERNELAPI
;ULONGLONG
;KeQueryInterruptTime (
; VOID
; );
;
;NTKERNELAPI
;VOID
;KeQuerySystemTime (
; OUT PLARGE_INTEGER CurrentTime
; );
;
;NTKERNELAPI
;ULONG
;KeQueryTimeIncrement (
; VOID
; );
;
;// end_wdm
;NTKERNELAPI
;KAFFINITY
;KeQueryActiveProcessors (
; VOID
; );
;
;//
;// Context swap notify routine.
;//
;
;typedef
;VOID
;(FASTCALL *PSWAP_CONTEXT_NOTIFY_ROUTINE)(
; IN HANDLE OldThreadId,
; IN HANDLE NewThreadId
; );
;
;NTKERNELAPI
;VOID
;FASTCALL
;KeSetSwapContextNotifyRoutine(
; IN PSWAP_CONTEXT_NOTIFY_ROUTINE NotifyRoutine
; );
;
;//
;// Thread select notify routine.
;//
;
;typedef
;LOGICAL
;(FASTCALL *PTHREAD_SELECT_NOTIFY_ROUTINE)(
; IN HANDLE ThreadId
; );
;
;NTKERNELAPI
;VOID
;FASTCALL
;KeSetThreadSelectNotifyRoutine(
; IN PTHREAD_SELECT_NOTIFY_ROUTINE NotifyRoutine
; );
;
;//
;// Time update notify routine.
;//
;
;typedef
;VOID
;(FASTCALL *PTIME_UPDATE_NOTIFY_ROUTINE)(
; IN HANDLE ThreadId,
; IN KPROCESSOR_MODE Mode
; );
;
;NTKERNELAPI
;VOID
;FASTCALL
;KeSetTimeUpdateNotifyRoutine(
; IN PTIME_UPDATE_NOTIFY_ROUTINE NotifyRoutine
; );
;
;extern volatile KSYSTEM_TIME KeTickCount;
;
;typedef enum _MEMORY_CACHING_TYPE_ORIG {
; MmFrameBufferCached = 2
;} MEMORY_CACHING_TYPE_ORIG;
;
;typedef enum _MEMORY_CACHING_TYPE {
; MmNonCached = FALSE,
; MmCached = TRUE,
; MmWriteCombined = MmFrameBufferCached,
; MmHardwareCoherentCached,
; MmNonCachedUnordered, // IA64
; MmUSWCCached,
; MmMaximumCacheType
;} MEMORY_CACHING_TYPE;
;
;//
;// Define external data.
;// because of indirection for all drivers external to ntoskrnl these are actually ptrs
;//
;
;#if defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_WDMDDK_)
;
;extern PBOOLEAN KdDebuggerNotPresent;
;extern PBOOLEAN KdDebuggerEnabled;
;
;#else
;
;extern BOOLEAN KdDebuggerNotPresent;
;extern BOOLEAN KdDebuggerEnabled;
;
;#endif
;
;
;
;
;typedef struct _DBGKD_DEBUG_DATA_HEADER64 *PDBGKD_DEBUG_DATA_HEADER64;
;
;BOOLEAN
;KdRegisterDebuggerDataBlock(
; IN ULONG Tag,
; IN PDBGKD_DEBUG_DATA_HEADER64 DataHeader,
; IN ULONG Size
; );
;
;VOID
;KdDeregisterDebuggerDataBlock32(
; IN PDBGKD_DEBUG_DATA_HEADER64 DataHeader
; );
;
;VOID
;KdDisableDebugger(
; VOID
; );
;
;VOID
;KdEnableDebugger(
; VOID
; );
;
;//
;// Pool Allocation routines (in pool.c)
;//
;
;typedef enum _POOL_TYPE {
; NonPagedPool,
; PagedPool,
; NonPagedPoolMustSucceed,
; DontUseThisType,
; NonPagedPoolCacheAligned,
; PagedPoolCacheAligned,
; NonPagedPoolCacheAlignedMustS,
; MaxPoolType
;
; // end_wdm
; ,
; //
; // Note these per session types are carefully chosen so that the appropriate
; // masking still applies as well as MaxPoolType above.
; //
;
; NonPagedPoolSession = 32,
; PagedPoolSession = NonPagedPoolSession + 1,
; NonPagedPoolMustSucceedSession = PagedPoolSession + 1,
; DontUseThisTypeSession = NonPagedPoolMustSucceedSession + 1,
; NonPagedPoolCacheAlignedSession = DontUseThisTypeSession + 1,
; PagedPoolCacheAlignedSession = NonPagedPoolCacheAlignedSession + 1,
; NonPagedPoolCacheAlignedMustSSession = PagedPoolCacheAlignedSession + 1,
;
; // begin_wdm
;
; } POOL_TYPE;
;
;
;NTKERNELAPI
;PVOID
;ExAllocatePool(
; IN POOL_TYPE PoolType,
; IN SIZE_T NumberOfBytes
; );
;
;NTKERNELAPI
;PVOID
;ExAllocatePoolWithQuota(
; IN POOL_TYPE PoolType,
; IN SIZE_T NumberOfBytes
; );
;
;NTKERNELAPI
;PVOID
;NTAPI
;ExAllocatePoolWithTag(
; IN POOL_TYPE PoolType,
; IN SIZE_T NumberOfBytes,
; IN ULONG Tag
; );
;
;// end_wdm
;
;//
;// _EX_POOL_PRIORITY_ provides a method for the system to handle requests
;// intelligently in low resource conditions.
;//
;// LowPoolPriority should be used when it is acceptable to the driver for the
;// mapping request to fail if the system is low on resources. An example of
;// this could be for a non-critical network connection where the driver can
;// handle the failure case when system resources are close to being depleted.
;//
;// NormalPoolPriority should be used when it is acceptable to the driver for the
;// mapping request to fail if the system is very low on resources. An example
;// of this could be for a non-critical local filesystem request.
;//
;// HighPoolPriority should be used when it is unacceptable to the driver for the
;// mapping request to fail unless the system is completely out of resources.
;// An example of this would be the paging file path in a driver.
;//
;// SpecialPool can be specified to bound the allocation at a page end (or
;// beginning). This should only be done on systems being debugged as the
;// memory cost is expensive.
;//
;// N.B. These values are very carefully chosen so that the pool allocation
;// code can quickly crack the priority request.
;//
;
;typedef enum _EX_POOL_PRIORITY {
; LowPoolPriority,
; LowPoolPrioritySpecialPoolOverrun = 8,
; LowPoolPrioritySpecialPoolUnderrun = 9,
; NormalPoolPriority = 16,
; NormalPoolPrioritySpecialPoolOverrun = 24,
; NormalPoolPrioritySpecialPoolUnderrun = 25,
; HighPoolPriority = 32,
; HighPoolPrioritySpecialPoolOverrun = 40,
; HighPoolPrioritySpecialPoolUnderrun = 41
;
; } EX_POOL_PRIORITY;
;
;NTKERNELAPI
;PVOID
;NTAPI
;ExAllocatePoolWithTagPriority(
; IN POOL_TYPE PoolType,
; IN SIZE_T NumberOfBytes,
; IN ULONG Tag,
; IN EX_POOL_PRIORITY Priority
; );
;
;// begin_wdm
;
;#ifndef POOL_TAGGING
;#define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
;#endif //POOL_TAGGING
;
;NTKERNELAPI
;PVOID
;ExAllocatePoolWithQuotaTag(
; IN POOL_TYPE PoolType,
; IN SIZE_T NumberOfBytes,
; IN ULONG Tag
; );
;
;#ifndef POOL_TAGGING
;#define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
;#endif //POOL_TAGGING
;
;NTKERNELAPI
;VOID
;NTAPI
;ExFreePool(
; IN PVOID P
; );
;
;//
;// Routines to support fast mutexes.
;//
;
;typedef struct _FAST_MUTEX {
; LONG Count;
; PKTHREAD Owner;
; ULONG Contention;
; KEVENT Event;
; ULONG OldIrql;
;} FAST_MUTEX, *PFAST_MUTEX;
;
;#if DBG
;#define ExInitializeFastMutex(_FastMutex) \
; (_FastMutex)->Count = 1; \
; (_FastMutex)->Owner = NULL; \
; (_FastMutex)->Contention = 0; \
; KeInitializeEvent(&(_FastMutex)->Event, \
; SynchronizationEvent, \
; FALSE);
;#else
;#define ExInitializeFastMutex(_FastMutex) \
; (_FastMutex)->Count = 1; \
; (_FastMutex)->Contention = 0; \
; KeInitializeEvent(&(_FastMutex)->Event, \
; SynchronizationEvent, \
; FALSE);
;#endif // DBG
;
;NTKERNELAPI
;VOID
;FASTCALL
;ExAcquireFastMutexUnsafe (
; IN PFAST_MUTEX FastMutex
; );
;
;NTKERNELAPI
;VOID
;FASTCALL
;ExReleaseFastMutexUnsafe (
; IN PFAST_MUTEX FastMutex
; );
;
;#if defined(_ALPHA_) || defined(_IA64_)
;
;NTKERNELAPI
;VOID
;FASTCALL
;ExAcquireFastMutex (
; IN PFAST_MUTEX FastMutex
; );
;
;NTKERNELAPI
;VOID
;FASTCALL
;ExReleaseFastMutex (
; IN PFAST_MUTEX FastMutex
; );
;
;// end_wdm
;
;NTKERNELAPI
;BOOLEAN
;FASTCALL
;ExTryToAcquireFastMutex (
; IN PFAST_MUTEX FastMutex
; );
;
;// begin_wdm
;
;#elif defined(_X86_)
;
;NTHALAPI
;VOID
;FASTCALL
;ExAcquireFastMutex (
; IN PFAST_MUTEX FastMutex
; );
;
;NTHALAPI
;VOID
;FASTCALL
;ExReleaseFastMutex (
; IN PFAST_MUTEX FastMutex
; );
;
;// end_wdm
;
;NTHALAPI
;BOOLEAN
;FASTCALL
;ExTryToAcquireFastMutex (
; IN PFAST_MUTEX FastMutex
; );
;
;// begin_wdm
;
;#else
;
;#error "Target architecture not defined"
;
;#endif
;
;//
;
;NTKERNELAPI
;VOID
;FASTCALL
;ExInterlockedAddLargeStatistic (
; IN PLARGE_INTEGER Addend,
; IN ULONG Increment
; );
;
;// end_ntndis
;
;NTKERNELAPI
;LARGE_INTEGER
;ExInterlockedAddLargeInteger (
; IN PLARGE_INTEGER Addend,
; IN LARGE_INTEGER Increment,
; IN PKSPIN_LOCK Lock
; );
;
;
;NTKERNELAPI
;ULONG
;FASTCALL
;ExInterlockedAddUlong (
; IN PULONG Addend,
; IN ULONG Increment,
; IN PKSPIN_LOCK Lock
; );
;
;
;#if defined(_AXP64_)
;
;#define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
; InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
;
;#elif defined(_ALPHA_)
;
;#define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
; ExpInterlockedCompareExchange64(Destination, Exchange, Comperand)
;
;#elif defined(_IA64_)
;
;#define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
; InterlockedCompareExchange64(Destination, *(Exchange), *(Comperand))
;
;#else
;
;NTKERNELAPI
;LONGLONG
;FASTCALL
;ExInterlockedCompareExchange64 (
; IN PLONGLONG Destination,
; IN PLONGLONG Exchange,
; IN PLONGLONG Comperand,
; IN PKSPIN_LOCK Lock
; );
;
;#endif
;
;NTKERNELAPI
;PLIST_ENTRY
;FASTCALL
;ExInterlockedInsertHeadList (
; IN PLIST_ENTRY ListHead,
; IN PLIST_ENTRY ListEntry,
; IN PKSPIN_LOCK Lock
; );
;
;NTKERNELAPI
;PLIST_ENTRY
;FASTCALL
;ExInterlockedInsertTailList (
; IN PLIST_ENTRY ListHead,
; IN PLIST_ENTRY ListEntry,
; IN PKSPIN_LOCK Lock
; );
;
;NTKERNELAPI
;PLIST_ENTRY
;FASTCALL
;ExInterlockedRemoveHeadList (
; IN PLIST_ENTRY ListHead,
; IN PKSPIN_LOCK Lock
; );
;
;NTKERNELAPI
;PSINGLE_LIST_ENTRY
;FASTCALL
;ExInterlockedPopEntryList (
; IN PSINGLE_LIST_ENTRY ListHead,
; IN PKSPIN_LOCK Lock
; );
;
;NTKERNELAPI
;PSINGLE_LIST_ENTRY
;FASTCALL
;ExInterlockedPushEntryList (
; IN PSINGLE_LIST_ENTRY ListHead,
; IN PSINGLE_LIST_ENTRY ListEntry,
; IN PKSPIN_LOCK Lock
; );
;
;// begin_ntndis
;
;//
;// Define interlocked sequenced listhead functions.
;//
;// A sequenced interlocked list is a singly linked list with a header that
;// contains the current depth and a sequence number. Each time an entry is
;// inserted or removed from the list the depth is updated and the sequence
;// number is incremented. This enables MIPS, Alpha, and Pentium and later
;// machines to insert and remove from the list without the use of spinlocks.
;// The PowerPc, however, must use a spinlock to synchronize access to the
;// list.
;//
;// N.B. A spinlock must be specified with SLIST operations. However, it may
;// not actually be used.
;//
;
;/*++
;
;VOID
;ExInitializeSListHead (
; IN PSLIST_HEADER SListHead
; )
;
;Routine Description:
;
; This function initializes a sequenced singly linked listhead.
;
;Arguments:
;
; SListHead - Supplies a pointer to a sequenced singly linked listhead.
;
;Return Value:
;
; None.
;
;--*/
;
;#define ExInitializeSListHead(_listhead_) (_listhead_)->Alignment = 0
;
;/*++
;
;USHORT
;ExQueryDepthSList (
; IN PSLIST_HEADERT SListHead
; )
;
;Routine Description:
;
; This function queries the current number of entries contained in a
; sequenced single linked list.
;
;Arguments:
;
; SListHead - Supplies a pointer to the sequenced listhead which is
; be queried.
;
;Return Value:
;
; The current number of entries in the sequenced singly linked list is
; returned as the function value.
;
;--*/
;
;#define ExQueryDepthSList(_listhead_) (USHORT)(_listhead_)->Depth
;
;#if defined(_MIPS_) || defined(_ALPHA_) || defined(_IA64_)
;
;#define ExInterlockedPopEntrySList(Head, Lock) \
; ExpInterlockedPopEntrySList(Head)
;
;#define ExInterlockedPushEntrySList(Head, Entry, Lock) \
; ExpInterlockedPushEntrySList(Head, Entry)
;
;#define ExInterlockedFlushSList(Head) \
; ExpInterlockedFlushSList(Head)
;
;NTKERNELAPI
;PSINGLE_LIST_ENTRY
;ExpInterlockedPopEntrySList (
; IN PSLIST_HEADER ListHead
; );
;
;NTKERNELAPI
;PSINGLE_LIST_ENTRY
;ExpInterlockedPushEntrySList (
; IN PSLIST_HEADER ListHead,
; IN PSINGLE_LIST_ENTRY ListEntry
; );
;
;NTKERNELAPI
;PSINGLE_LIST_ENTRY
;ExpInterlockedFlushSList (
; IN PSLIST_HEADER ListHead
; );
;
;#else
;
;NTKERNELAPI
;PSINGLE_LIST_ENTRY
;FASTCALL
;ExInterlockedPopEntrySList (
; IN PSLIST_HEADER ListHead,
; IN PKSPIN_LOCK Lock
; );
;
;NTKERNELAPI
;PSINGLE_LIST_ENTRY
;FASTCALL
;ExInterlockedPushEntrySList (
; IN PSLIST_HEADER ListHead,
; IN PSINGLE_LIST_ENTRY ListEntry,
; IN PKSPIN_LOCK Lock
; );
;
;NTKERNELAPI
;PSINGLE_LIST_ENTRY
;FASTCALL
;ExInterlockedFlushSList (
; IN PSLIST_HEADER ListHead
; );
;
;#endif
;
;
;typedef
;PVOID
;(*PALLOCATE_FUNCTION) (
; IN POOL_TYPE PoolType,
; IN SIZE_T NumberOfBytes,
; IN ULONG Tag
; );
;
;typedef
;VOID
;(*PFREE_FUNCTION) (
; IN PVOID Buffer
; );
;
;typedef struct _GENERAL_LOOKASIDE {
; SLIST_HEADER ListHead;
; USHORT Depth;
; USHORT MaximumDepth;
; ULONG TotalAllocates;
; union {
; ULONG AllocateMisses;
; ULONG AllocateHits;
; };
;
; ULONG TotalFrees;
; union {
; ULONG FreeMisses;
; ULONG FreeHits;
; };
;
; POOL_TYPE Type;
; ULONG Tag;
; ULONG Size;
; PALLOCATE_FUNCTION Allocate;
; PFREE_FUNCTION Free;
; LIST_ENTRY ListEntry;
; ULONG LastTotalAllocates;
; union {
; ULONG LastAllocateMisses;
; ULONG LastAllocateHits;
; };
;
; ULONG Future[2];
;} GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
;
;typedef struct _NPAGED_LOOKASIDE_LIST {
; GENERAL_LOOKASIDE L;
; KSPIN_LOCK Lock;
;} NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
;
;
;NTKERNELAPI
;VOID
;ExInitializeNPagedLookasideList (
; IN PNPAGED_LOOKASIDE_LIST Lookaside,
; IN PALLOCATE_FUNCTION Allocate,
; IN PFREE_FUNCTION Free,
; IN ULONG Flags,
; IN SIZE_T Size,
; IN ULONG Tag,
; IN USHORT Depth
; );
;
;NTKERNELAPI
;VOID
;ExDeleteNPagedLookasideList (
; IN PNPAGED_LOOKASIDE_LIST Lookaside
; );
;
;__inline
;PVOID
;ExAllocateFromNPagedLookasideList(
; IN PNPAGED_LOOKASIDE_LIST Lookaside
; )
;
;/*++
;
;Routine Description:
;
; This function removes (pops) the first entry from the specified
; nonpaged lookaside list.
;
;Arguments:
;
; Lookaside - Supplies a pointer to a nonpaged lookaside list structure.
;
;Return Value:
;
; If an entry is removed from the specified lookaside list, then the
; address of the entry is returned as the function value. Otherwise,
; NULL is returned.
;
;--*/
;
;{
;
; PVOID Entry;
;
; Lookaside->L.TotalAllocates += 1;
; Entry = ExInterlockedPopEntrySList(&Lookaside->L.ListHead, &Lookaside->Lock);
; if (Entry == NULL) {
; Lookaside->L.AllocateMisses += 1;
; Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
; Lookaside->L.Size,
; Lookaside->L.Tag);
; }
;
; return Entry;
;}
;
;__inline
;VOID
;ExFreeToNPagedLookasideList(
; IN PNPAGED_LOOKASIDE_LIST Lookaside,
; IN PVOID Entry
; )
;
;/*++
;
;Routine Description:
;
; This function inserts (pushes) the specified entry into the specified
; nonpaged lookaside list.
;
;Arguments:
;
; Lookaside - Supplies a pointer to a nonpaged lookaside list structure.
;
; Entry - Supples a pointer to the entry that is inserted in the
; lookaside list.
;
;Return Value:
;
; None.
;
;--*/
;
;{
;
; Lookaside->L.TotalFrees += 1;
; if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
; Lookaside->L.FreeMisses += 1;
; (Lookaside->L.Free)(Entry);
;
; } else {
; ExInterlockedPushEntrySList(&Lookaside->L.ListHead,
; (PSINGLE_LIST_ENTRY)Entry,
; &Lookaside->Lock);
; }
;
; return;
;}
;
;// end_ntndis
;
;typedef struct _PAGED_LOOKASIDE_LIST {
; GENERAL_LOOKASIDE L;
; FAST_MUTEX Lock;
;} PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
;
;NTKERNELAPI
;VOID
;ExInitializePagedLookasideList (
; IN PPAGED_LOOKASIDE_LIST Lookaside,
; IN PALLOCATE_FUNCTION Allocate,
; IN PFREE_FUNCTION Free,
; IN ULONG Flags,
; IN SIZE_T Size,
; IN ULONG Tag,
; IN USHORT Depth
; );
;
;NTKERNELAPI
;VOID
;ExDeletePagedLookasideList (
; IN PPAGED_LOOKASIDE_LIST Lookaside
; );
;
;#if defined(_X86_)
;
;NTKERNELAPI
;PVOID
;ExAllocateFromPagedLookasideList(
; IN PPAGED_LOOKASIDE_LIST Lookaside
; );
;
;NTKERNELAPI
;VOID
;ExFreeToPagedLookasideList(
; IN PPAGED_LOOKASIDE_LIST Lookaside,
; IN PVOID Entry
; );
;
;#else
;
;__inline
;PVOID
;ExAllocateFromPagedLookasideList(
; IN PPAGED_LOOKASIDE_LIST Lookaside
; )
;
;/*++
;
;Routine Description:
;
; This function removes (pops) the first entry from the specified
; paged lookaside list.
;
;Arguments:
;
; Lookaside - Supplies a pointer to a paged lookaside list structure.
;
;Return Value:
;
; If an entry is removed from the specified lookaside list, then the
; address of the entry is returned as the function value. Otherwise,
; NULL is returned.
;
;--*/
;
;{
;
; PVOID Entry;
;
; Lookaside->L.TotalAllocates += 1;
; Entry = ExInterlockedPopEntrySList(&Lookaside->L.ListHead, NULL);
; if (Entry == NULL) {
; Lookaside->L.AllocateMisses += 1;
; Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
; Lookaside->L.Size,
; Lookaside->L.Tag);
; }
;
; return Entry;
;}
;
;__inline
;VOID
;ExFreeToPagedLookasideList(
; IN PPAGED_LOOKASIDE_LIST Lookaside,
; IN PVOID Entry
; )
;
;/*++
;
;Routine Description:
;
; This function inserts (pushes) the specified entry into the specified
; paged lookaside list.
;
;Arguments:
;
; Lookaside - Supplies a pointer to a nonpaged lookaside list structure.
;
; Entry - Supples a pointer to the entry that is inserted in the
; lookaside list.
;
;Return Value:
;
; None.
;
;--*/
;
;{
;
; Lookaside->L.TotalFrees += 1;
; if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
; Lookaside->L.FreeMisses += 1;
; (Lookaside->L.Free)(Entry);
;
; } else {
; ExInterlockedPushEntrySList(&Lookaside->L.ListHead,
; (PSINGLE_LIST_ENTRY)Entry,
; NULL);
; }
;
; return;
;}
;
;#endif
;
;
;NTKERNELAPI
;VOID
;NTAPI
;ProbeForRead(
; IN CONST VOID *Address,
; IN ULONG Length,
; IN ULONG Alignment
; );
;
;//
;// Common probe for write functions.
;//
;
;NTKERNELAPI
;VOID
;NTAPI
;ProbeForWrite (
; IN PVOID Address,
; IN ULONG Length,
; IN ULONG Alignment
; );
;
;//
;// Worker Thread
;//
;
;typedef enum _WORK_QUEUE_TYPE {
; CriticalWorkQueue,
; DelayedWorkQueue,
; HyperCriticalWorkQueue,
; MaximumWorkQueue
;} WORK_QUEUE_TYPE;
;
;typedef
;VOID
;(*PWORKER_THREAD_ROUTINE)(
; IN PVOID Parameter
; );
;
;typedef struct _WORK_QUEUE_ITEM {
; LIST_ENTRY List;
; PWORKER_THREAD_ROUTINE WorkerRoutine;
; PVOID Parameter;
;} WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
;
;
;#define ExInitializeWorkItem(Item, Routine, Context) \
; (Item)->WorkerRoutine = (Routine); \
; (Item)->Parameter = (Context); \
; (Item)->List.Flink = NULL;
;
;NTKERNELAPI
;VOID
;ExQueueWorkItem(
; IN PWORK_QUEUE_ITEM WorkItem,
; IN WORK_QUEUE_TYPE QueueType
; );
;
;// end_wdm
;
;NTKERNELAPI
;BOOLEAN
;ExIsProcessorFeaturePresent(
; ULONG ProcessorFeature
; );
;
;//
;// Zone Allocation
;//
;
;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;
;
;
;NTKERNELAPI
;NTSTATUS
;ExInitializeZone(
; IN PZONE_HEADER Zone,
; IN ULONG BlockSize,
; IN PVOID InitialSegment,
; IN ULONG InitialSegmentSize
; );
;
;NTKERNELAPI
;NTSTATUS
;ExExtendZone(
; IN PZONE_HEADER Zone,
; IN PVOID Segment,
; IN ULONG SegmentSize
; );
;
;NTKERNELAPI
;NTSTATUS
;ExInterlockedExtendZone(
; IN PZONE_HEADER Zone,
; IN PVOID Segment,
; IN ULONG SegmentSize,
; IN PKSPIN_LOCK Lock
; );
;
;//++
;//
;// PVOID
;// ExAllocateFromZone(
;// IN PZONE_HEADER Zone
;// )
;//
;// Routine Description:
;//
;// This routine removes an entry from the zone and returns a pointer to it.
;//
;// Arguments:
;//
;// Zone - Pointer to the zone header controlling the storage from which the
;// entry is to be allocated.
;//
;// Return Value:
;//
;// The function value is a pointer to the storage allocated from the zone.
;//
;//--
;
;#define ExAllocateFromZone(Zone) \
; (PVOID)((Zone)->FreeList.Next); \
; if ( (Zone)->FreeList.Next ) (Zone)->FreeList.Next = (Zone)->FreeList.Next->Next
;
;
;//++
;//
;// PVOID
;// ExFreeToZone(
;// IN PZONE_HEADER Zone,
;// IN PVOID Block
;// )
;//
;// Routine Description:
;//
;// This routine places the specified block of storage back onto the free
;// list in the specified zone.
;//
;// Arguments:
;//
;// Zone - Pointer to the zone header controlling the storage to which the
;// entry is to be inserted.
;//
;// Block - Pointer to the block of storage to be freed back to the zone.
;//
;// Return Value:
;//
;// Pointer to previous block of storage that was at the head of the free
;// list. NULL implies the zone went from no available free blocks to
;// at least one free block.
;//
;//--
;
;#define ExFreeToZone(Zone,Block) \
; ( ((PSINGLE_LIST_ENTRY)(Block))->Next = (Zone)->FreeList.Next, \
; (Zone)->FreeList.Next = ((PSINGLE_LIST_ENTRY)(Block)), \
; ((PSINGLE_LIST_ENTRY)(Block))->Next \
; )
;
;//++
;//
;// BOOLEAN
;// ExIsFullZone(
;// IN PZONE_HEADER Zone
;// )
;//
;// Routine Description:
;//
;// This routine determines if the specified zone is full or not. A zone
;// is considered full if the free list is empty.
;//
;// Arguments:
;//
;// Zone - Pointer to the zone header to be tested.
;//
;// Return Value:
;//
;// TRUE if the zone is full and FALSE otherwise.
;//
;//--
;
;#define ExIsFullZone(Zone) \
; ( (Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY)NULL )
;
;//++
;//
;// PVOID
;// ExInterlockedAllocateFromZone(
;// IN PZONE_HEADER Zone,
;// IN PKSPIN_LOCK Lock
;// )
;//
;// Routine Description:
;//
;// This routine removes an entry from the zone and returns a pointer to it.
;// The removal is performed with the specified lock owned for the sequence
;// to make it MP-safe.
;//
;// Arguments:
;//
;// Zone - Pointer to the zone header controlling the storage from which the
;// entry is to be allocated.
;//
;// Lock - Pointer to the spin lock which should be obtained before removing
;// the entry from the allocation list. The lock is released before
;// returning to the caller.
;//
;// Return Value:
;//
;// The function value is a pointer to the storage allocated from the zone.
;//
;//--
;
;#define ExInterlockedAllocateFromZone(Zone,Lock) \
; (PVOID) ExInterlockedPopEntryList( &(Zone)->FreeList, Lock )
;
;//++
;//
;// PVOID
;// ExInterlockedFreeToZone(
;// IN PZONE_HEADER Zone,
;// IN PVOID Block,
;// IN PKSPIN_LOCK Lock
;// )
;//
;// Routine Description:
;//
;// This routine places the specified block of storage back onto the free
;// list in the specified zone. The insertion is performed with the lock
;// owned for the sequence to make it MP-safe.
;//
;// Arguments:
;//
;// Zone - Pointer to the zone header controlling the storage to which the
;// entry is to be inserted.
;//
;// Block - Pointer to the block of storage to be freed back to the zone.
;//
;// Lock - Pointer to the spin lock which should be obtained before inserting
;// the entry onto the free list. The lock is released before returning
;// to the caller.
;//
;// Return Value:
;//
;// Pointer to previous block of storage that was at the head of the free
;// list. NULL implies the zone went from no available free blocks to
;// at least one free block.
;//
;//--
;
;#define ExInterlockedFreeToZone(Zone,Block,Lock) \
; ExInterlockedPushEntryList( &(Zone)->FreeList, ((PSINGLE_LIST_ENTRY) (Block)), Lock )
;
;
;//++
;//
;// BOOLEAN
;// ExIsObjectInFirstZoneSegment(
;// IN PZONE_HEADER Zone,
;// IN PVOID Object
;// )
;//
;// Routine Description:
;//
;// This routine determines if the specified pointer lives in the zone.
;//
;// Arguments:
;//
;// Zone - Pointer to the zone header controlling the storage to which the
;// object may belong.
;//
;// Object - Pointer to the object in question.
;//
;// Return Value:
;//
;// TRUE if the Object came from the first segment of zone.
;//
;//--
;
;#define ExIsObjectInFirstZoneSegment(Zone,Object) ((BOOLEAN) \
; (((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
; ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
; (Zone)->TotalSegmentSize)) \
;)
;
;//
;// Define executive resource data structures.
;//
;
;typedef ULONG_PTR ERESOURCE_THREAD;
;typedef ERESOURCE_THREAD *PERESOURCE_THREAD;
;
;typedef struct _OWNER_ENTRY {
; ERESOURCE_THREAD OwnerThread;
; union {
; LONG OwnerCount;
; ULONG TableSize;
; };
;
;} OWNER_ENTRY, *POWNER_ENTRY;
;
;typedef struct _ERESOURCE {
; LIST_ENTRY SystemResourcesList;
; POWNER_ENTRY OwnerTable;
; SHORT ActiveCount;
; USHORT Flag;
; PKSEMAPHORE SharedWaiters;
; PKEVENT ExclusiveWaiters;
; OWNER_ENTRY OwnerThreads[2];
; ULONG ContentionCount;
; USHORT NumberOfSharedWaiters;
; USHORT NumberOfExclusiveWaiters;
; union {
; PVOID Address;
; ULONG_PTR CreatorBackTraceIndex;
; };
;
; KSPIN_LOCK SpinLock;
;} ERESOURCE, *PERESOURCE;
;
;//
;// Values for ERESOURCE.Flag
;//
;
;#define ResourceNeverExclusive 0x10
;#define ResourceReleaseByOtherThread 0x20
;#define ResourceOwnedExclusive 0x80
;
;#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;
;
;//
;// Define executive resource function prototypes.
;//
;
;NTKERNELAPI
;NTSTATUS
;ExInitializeResourceLite(
; IN PERESOURCE Resource
; );
;
;NTKERNELAPI
;NTSTATUS
;ExReinitializeResourceLite(
; IN PERESOURCE Resource
; );
;
;NTKERNELAPI
;BOOLEAN
;ExAcquireResourceSharedLite(
; IN PERESOURCE Resource,
; IN BOOLEAN Wait
; );
;
;NTKERNELAPI
;BOOLEAN
;ExAcquireResourceExclusiveLite(
; IN PERESOURCE Resource,
; IN BOOLEAN Wait
; );
;
;NTKERNELAPI
;BOOLEAN
;ExAcquireSharedStarveExclusive(
; IN PERESOURCE Resource,
; IN BOOLEAN Wait
; );
;
;NTKERNELAPI
;BOOLEAN
;ExAcquireSharedWaitForExclusive(
; IN PERESOURCE Resource,
; IN BOOLEAN Wait
; );
;
;NTKERNELAPI
;BOOLEAN
;ExTryToAcquireResourceExclusiveLite(
; IN PERESOURCE Resource
; );
;
;//
;// VOID
;// ExReleaseResource(
;// IN PERESOURCE Resource
;// );
;//
;
;#define ExReleaseResource(R) (ExReleaseResourceLite(R))
;
;NTKERNELAPI
;VOID
;FASTCALL
;ExReleaseResourceLite(
; IN PERESOURCE Resource
; );
;
;NTKERNELAPI
;VOID
;ExReleaseResourceForThreadLite(
; IN PERESOURCE Resource,
; IN ERESOURCE_THREAD ResourceThreadId
; );
;
;NTKERNELAPI
;VOID
;ExSetResourceOwnerPointer(
; IN PERESOURCE Resource,
; IN PVOID OwnerPointer
; );
;
;NTKERNELAPI
;VOID
;ExConvertExclusiveToSharedLite(
; IN PERESOURCE Resource
; );
;
;NTKERNELAPI
;NTSTATUS
;ExDeleteResourceLite (
; IN PERESOURCE Resource
; );
;
;NTKERNELAPI
;ULONG
;ExGetExclusiveWaiterCount (
; IN PERESOURCE Resource
; );
;
;NTKERNELAPI
;ULONG
;ExGetSharedWaiterCount (
; IN PERESOURCE Resource
; );
;
;//
;// ERESOURCE_THREAD
;// ExGetCurrentResourceThread(
;// );
;//
;
;#define ExGetCurrentResourceThread() ((ULONG_PTR)PsGetCurrentThread())
;
;NTKERNELAPI
;BOOLEAN
;ExIsResourceAcquiredExclusiveLite (
; IN PERESOURCE Resource
; );
;
;NTKERNELAPI
;ULONG
;ExIsResourceAcquiredSharedLite (
; IN PERESOURCE Resource
; );
;
;//
;// ntddk.h stole the entrypoints we wanted so fix them up here.
;//
;
;#define ExInitializeResource ExInitializeResourceLite
;#define ExAcquireResourceShared ExAcquireResourceSharedLite
;#define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
;#define ExReleaseResourceForThread ExReleaseResourceForThreadLite
;#define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
;#define ExDeleteResource ExDeleteResourceLite
;#define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
;#define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
;
;
;//
;// Get previous mode
;//
;
;NTKERNELAPI
;KPROCESSOR_MODE
;ExGetPreviousMode(
; VOID
; );
;//
;// Raise status from kernel mode.
;//
;
;NTKERNELAPI
;VOID
;NTAPI
;ExRaiseStatus (
; IN NTSTATUS Status
; );
;
;// end_wdm
;
;NTKERNELAPI
;VOID
;ExRaiseDatatypeMisalignment (
; VOID
; );
;
;NTKERNELAPI
;VOID
;ExRaiseAccessViolation (
; VOID
; );
;
;//
;// Set timer resolution.
;//
;
;NTKERNELAPI
;ULONG
;ExSetTimerResolution (
; IN ULONG DesiredTime,
; IN BOOLEAN SetResolution
; );
;
;// end_wdm
;//
;// Subtract time zone bias from system time to get local time.
;//
;
;NTKERNELAPI
;VOID
;ExSystemTimeToLocalTime (
; IN PLARGE_INTEGER SystemTime,
; OUT PLARGE_INTEGER LocalTime
; );
;
;//
;// Add time zone bias to local time to get system time.
;//
;
;NTKERNELAPI
;VOID
;ExLocalTimeToSystemTime (
; IN PLARGE_INTEGER LocalTime,
; OUT PLARGE_INTEGER SystemTime
; );
;
;
;//
;// Define the type for Callback function.
;//
;
;typedef struct _CALLBACK_OBJECT *PCALLBACK_OBJECT;
;
;typedef VOID (*PCALLBACK_FUNCTION ) (
; IN PVOID CallbackContext,
; IN PVOID Argument1,
; IN PVOID Argument2
; );
;
;
;NTKERNELAPI
;NTSTATUS
;ExCreateCallback (
; OUT PCALLBACK_OBJECT *CallbackObject,
; IN POBJECT_ATTRIBUTES ObjectAttributes,
; IN BOOLEAN Create,
; IN BOOLEAN AllowMultipleCallbacks
; );
;
;NTKERNELAPI
;PVOID
;ExRegisterCallback (
; IN PCALLBACK_OBJECT CallbackObject,
; IN PCALLBACK_FUNCTION CallbackFunction,
; IN PVOID CallbackContext
; );
;
;NTKERNELAPI
;VOID
;ExUnregisterCallback (
; IN PVOID CallbackRegistration
; );
;
;NTKERNELAPI
;VOID
;ExNotifyCallback (
; IN PVOID CallbackObject,
; IN PVOID Argument1,
; IN PVOID Argument2
; );
;
;
;//
;// UUID Generation
;//
;
;typedef GUID UUID;
;
;NTKERNELAPI
;NTSTATUS
;ExUuidCreate(
; OUT UUID *Uuid
; );
;
;//
;// Priority increment definitions. The comment for each definition gives
;// the names of the system services that use the definition when satisfying
;// a wait.
;//
;
;//
;// Priority increment used when satisfying a wait on an executive event
;// (NtPulseEvent and NtSetEvent)
;//
;
;#define EVENT_INCREMENT 1
;
;//
;// Priority increment when no I/O has been done. This is used by device
;// and file system drivers when completing an IRP (IoCompleteRequest).
;//
;
;#define IO_NO_INCREMENT 0
;
;//
;// Priority increment for completing CD-ROM I/O. This is used by CD-ROM device
;// and file system drivers when completing an IRP (IoCompleteRequest)
;//
;
;#define IO_CD_ROM_INCREMENT 1
;
;//
;// Priority increment for completing disk I/O. This is used by disk device
;// and file system drivers when completing an IRP (IoCompleteRequest)
;//
;
;#define IO_DISK_INCREMENT 1
;
;// end_ntifs
;//
;// Priority increment for completing keyboard I/O. This is used by keyboard
;// device drivers when completing an IRP (IoCompleteRequest)
;//
;
;#define IO_KEYBOARD_INCREMENT 6
;
;// begin_ntifs
;//
;// Priority increment for completing mailslot I/O. This is used by the mail-
;// slot file system driver when completing an IRP (IoCompleteRequest).
;//
;
;#define IO_MAILSLOT_INCREMENT 2
;
;// end_ntifs
;//
;// Priority increment for completing mouse I/O. This is used by mouse device
;// drivers when completing an IRP (IoCompleteRequest)
;//
;
;#define IO_MOUSE_INCREMENT 6
;
;// begin_ntifs
;//
;// Priority increment for completing named pipe I/O. This is used by the
;// named pipe file system driver when completing an IRP (IoCompleteRequest).
;//
;
;#define IO_NAMED_PIPE_INCREMENT 2
;
;//
;// Priority increment for completing network I/O. This is used by network
;// device and network file system drivers when completing an IRP
;// (IoCompleteRequest).
;//
;
;#define IO_NETWORK_INCREMENT 2
;
;// end_ntifs
;//
;// Priority increment for completing parallel I/O. This is used by parallel
;// device drivers when completing an IRP (IoCompleteRequest)
;//
;
;#define IO_PARALLEL_INCREMENT 1
;
;//
;// Priority increment for completing serial I/O. This is used by serial device
;// drivers when completing an IRP (IoCompleteRequest)
;//
;
;#define IO_SERIAL_INCREMENT 2
;
;//
;// Priority increment for completing sound I/O. This is used by sound device
;// drivers when completing an IRP (IoCompleteRequest)
;//
;
;#define IO_SOUND_INCREMENT 8
;
;//
;// Priority increment for completing video I/O. This is used by video device
;// drivers when completing an IRP (IoCompleteRequest)
;//
;
;#define IO_VIDEO_INCREMENT 1
;
;//
;// Priority increment used when satisfying a wait on an executive semaphore
;// (NtReleaseSemaphore)
;//
;
;#define SEMAPHORE_INCREMENT 1
;
;//
;// Indicates the system may do I/O to physical addresses above 4 GB.
;//
;
;extern PBOOLEAN Mm64BitPhysicalAddress;
;
;
;//
;// Define maximum disk transfer size to be used by MM and Cache Manager,
;// so that packet-oriented disk drivers can optimize their packet allocation
;// to this size.
;//
;
;#define MM_MAXIMUM_DISK_IO_SIZE (0x10000)
;
;//++
;//
;// ULONG_PTR
;// ROUND_TO_PAGES (
;// IN ULONG_PTR Size
;// )
;//
;// Routine Description:
;//
;// The ROUND_TO_PAGES macro takes a size in bytes and rounds it up to a
;// multiple of the page size.
;//
;// NOTE: This macro fails for values 0xFFFFFFFF - (PAGE_SIZE - 1).
;//
;// Arguments:
;//
;// Size - Size in bytes to round up to a page multiple.
;//
;// Return Value:
;//
;// Returns the size rounded up to a multiple of the page size.
;//
;//--
;
;#define ROUND_TO_PAGES(Size) (((ULONG_PTR)(Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
;
;//++
;//
;// ULONG
;// BYTES_TO_PAGES (
;// IN ULONG Size
;// )
;//
;// Routine Description:
;//
;// The BYTES_TO_PAGES macro takes the size in bytes and calculates the
;// number of pages required to contain the bytes.
;//
;// Arguments:
;//
;// Size - Size in bytes.
;//
;// Return Value:
;//
;// Returns the number of pages required to contain the specified size.
;//
;//--
;
;#define BYTES_TO_PAGES(Size) ((ULONG)((ULONG_PTR)(Size) >> PAGE_SHIFT) + \
; (((ULONG)(Size) & (PAGE_SIZE - 1)) != 0))
;
;//++
;//
;// ULONG
;// BYTE_OFFSET (
;// IN PVOID Va
;// )
;//
;// Routine Description:
;//
;// The BYTE_OFFSET macro takes a virtual address and returns the byte offset
;// of that address within the page.
;//
;// Arguments:
;//
;// Va - Virtual address.
;//
;// Return Value:
;//
;// Returns the byte offset portion of the virtual address.
;//
;//--
;
;#define BYTE_OFFSET(Va) ((ULONG)((LONG_PTR)(Va) & (PAGE_SIZE - 1)))
;
;//++
;//
;// PVOID
;// PAGE_ALIGN (
;// IN PVOID Va
;// )
;//
;// Routine Description:
;//
;// The PAGE_ALIGN macro takes a virtual address and returns a page-aligned
;// virtual address for that page.
;//
;// Arguments:
;//
;// Va - Virtual address.
;//
;// Return Value:
;//
;// Returns the page aligned virtual address.
;//
;//--
;
;#define PAGE_ALIGN(Va) ((PVOID)((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
;
;//++
;//
;// ULONG
;// ADDRESS_AND_SIZE_TO_SPAN_PAGES (
;// IN PVOID Va,
;// IN ULONG Size
;// )
;//
;// Routine Description:
;//
;// The ADDRESS_AND_SIZE_TO_SPAN_PAGES macro takes a virtual address and
;// size and returns the number of pages spanned by the size.
;//
;// Arguments:
;//
;// Va - Virtual address.
;//
;// Size - Size in bytes.
;//
;// Return Value:
;//
;// Returns the number of pages spanned by the size.
;//
;//--
;
;#define ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va,Size) \
; (((((Size) - 1) >> PAGE_SHIFT) + \
; (((((ULONG)(Size-1)&(PAGE_SIZE-1)) + (PtrToUlong(Va) & (PAGE_SIZE -1)))) >> PAGE_SHIFT)) + 1L)
;
;#define COMPUTE_PAGES_SPANNED(Va, Size) \
; ((ULONG)((((ULONG_PTR)(Va) & (PAGE_SIZE -1)) + (Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
;
;
;//++
;// PPFN_NUMBER
;// MmGetMdlPfnArray (
;// IN PMDL Mdl
;// )
;//
;// Routine Description:
;//
;// The MmGetMdlPfnArray routine returns the virtual address of the
;// first element of the array of physical page numbers associated with
;// the MDL.
;//
;// Arguments:
;//
;// Mdl - Pointer to an MDL.
;//
;// Return Value:
;//
;// Returns the virtual address of the first element of the array of
;// physical page numbers associated with the MDL.
;//
;//--
;
;#define MmGetMdlPfnArray(Mdl) ((PPFN_NUMBER)(Mdl + 1))
;
;//++
;//
;// PVOID
;// MmGetMdlVirtualAddress (
;// IN PMDL Mdl
;// )
;//
;// Routine Description:
;//
;// The MmGetMdlVirtualAddress returns the virtual address of the buffer
;// described by the Mdl.
;//
;// Arguments:
;//
;// Mdl - Pointer to an MDL.
;//
;// Return Value:
;//
;// Returns the virtual address of the buffer described by the Mdl
;//
;//--
;
;#define MmGetMdlVirtualAddress(Mdl) \
; ((PVOID) ((PCHAR) ((Mdl)->StartVa) + (Mdl)->ByteOffset))
;
;//++
;//
;// ULONG
;// MmGetMdlByteCount (
;// IN PMDL Mdl
;// )
;//
;// Routine Description:
;//
;// The MmGetMdlByteCount returns the length in bytes of the buffer
;// described by the Mdl.
;//
;// Arguments:
;//
;// Mdl - Pointer to an MDL.
;//
;// Return Value:
;//
;// Returns the byte count of the buffer described by the Mdl
;//
;//--
;
;#define MmGetMdlByteCount(Mdl) ((Mdl)->ByteCount)
;
;//++
;//
;// ULONG
;// MmGetMdlByteOffset (
;// IN PMDL Mdl
;// )
;//
;// Routine Description:
;//
;// The MmGetMdlByteOffset returns the byte offset within the page
;// of the buffer described by the Mdl.
;//
;// Arguments:
;//
;// Mdl - Pointer to an MDL.
;//
;// Return Value:
;//
;// Returns the byte offset within the page of the buffer described by the Mdl
;//
;//--
;
;#define MmGetMdlByteOffset(Mdl) ((Mdl)->ByteOffset)
;
;//++
;//
;// PVOID
;// MmGetMdlStartVa (
;// IN PMDL Mdl
;// )
;//
;// Routine Description:
;//
;// The MmGetMdlBaseVa returns the virtual address of the buffer
;// described by the Mdl rounded down to the nearest page.
;//
;// Arguments:
;//
;// Mdl - Pointer to an MDL.
;//
;// Return Value:
;//
;// Returns the returns the starting virtual address of the MDL.
;//
;//
;//--
;
;#define MmGetMdlBaseVa(Mdl) ((Mdl)->StartVa)
;
;typedef enum _MM_SYSTEM_SIZE {
; MmSmallSystem,
; MmMediumSystem,
; MmLargeSystem
;} MM_SYSTEMSIZE;
;
;NTKERNELAPI
;MM_SYSTEMSIZE
;MmQuerySystemSize(
; VOID
; );
;
;// end_wdm
;
;NTKERNELAPI
;BOOLEAN
;MmIsThisAnNtAsSystem(
; VOID
; );
;
;// begin_wdm
;
;typedef enum _LOCK_OPERATION {
; IoReadAccess,
; IoWriteAccess,
; IoModifyAccess
;} LOCK_OPERATION;
;
;
;NTKERNELAPI
;VOID
;MmProbeAndLockProcessPages (
; IN OUT PMDL MemoryDescriptorList,
; IN PEPROCESS Process,
; IN KPROCESSOR_MODE AccessMode,
; IN LOCK_OPERATION Operation
; );
;
;
;// begin_nthal
;//
;// I/O support routines.
;//
;
;NTKERNELAPI
;VOID
;MmProbeAndLockPages (
; IN OUT PMDL MemoryDescriptorList,
; IN KPROCESSOR_MODE AccessMode,
; IN LOCK_OPERATION Operation
; );
;
;
;NTKERNELAPI
;VOID
;MmUnlockPages (
; IN PMDL MemoryDescriptorList
; );
;
;NTKERNELAPI
;VOID
;MmBuildMdlForNonPagedPool (
; IN OUT PMDL MemoryDescriptorList
; );
;
;NTKERNELAPI
;PVOID
;MmMapLockedPages (
; IN PMDL MemoryDescriptorList,
; IN KPROCESSOR_MODE AccessMode
; );
;
;NTKERNELAPI
;PVOID
;MmGetSystemRoutineAddress (
; IN PUNICODE_STRING SystemRoutineName
; );
;
;// end_wdm
;
;NTKERNELAPI
;NTSTATUS
;MmMapUserAddressesToPage (
; IN PVOID BaseAddress,
; IN SIZE_T NumberOfBytes,
; IN PVOID PageAddress
; );
;
;// begin_wdm
;
;//
;// _MM_PAGE_PRIORITY_ provides a method for the system to handle requests
;// intelligently in low resource conditions.
;//
;// LowPagePriority should be used when it is acceptable to the driver for the
;// mapping request to fail if the system is low on resources. An example of
;// this could be for a non-critical network connection where the driver can
;// handle the failure case when system resources are close to being depleted.
;//
;// NormalPagePriority should be used when it is acceptable to the driver for the
;// mapping request to fail if the system is very low on resources. An example
;// of this could be for a non-critical local filesystem request.
;//
;// HighPagePriority should be used when it is unacceptable to the driver for the
;// mapping request to fail unless the system is completely out of resources.
;// An example of this would be the paging file path in a driver.
;//
;
;typedef enum _MM_PAGE_PRIORITY {
; LowPagePriority,
; NormalPagePriority = 16,
; HighPagePriority = 32
;} MM_PAGE_PRIORITY;
;
;//
;// Note: This function is not available in WDM 1.0
;//
;NTKERNELAPI
;PVOID
;MmMapLockedPagesSpecifyCache (
; IN PMDL MemoryDescriptorList,
; IN KPROCESSOR_MODE AccessMode,
; IN MEMORY_CACHING_TYPE CacheType,
; IN PVOID BaseAddress,
; IN ULONG BugCheckOnFailure,
; IN MM_PAGE_PRIORITY Priority
; );
;
;NTKERNELAPI
;VOID
;MmUnmapLockedPages (
; IN PVOID BaseAddress,
; IN PMDL MemoryDescriptorList
; );
;
;// end_wdm
;
;typedef struct _PHYSICAL_MEMORY_RANGE {
; PHYSICAL_ADDRESS BaseAddress;
; LARGE_INTEGER NumberOfBytes;
;} PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
;
;NTKERNELAPI
;NTSTATUS
;MmAddPhysicalMemory (
; IN PPHYSICAL_ADDRESS StartAddress,
; IN OUT PLARGE_INTEGER NumberOfBytes
; );
;
;NTKERNELAPI
;NTSTATUS
;MmRemovePhysicalMemory (
; IN PPHYSICAL_ADDRESS StartAddress,
; IN OUT PLARGE_INTEGER NumberOfBytes
; );
;
;NTKERNELAPI
;PPHYSICAL_MEMORY_RANGE
;MmGetPhysicalMemoryRanges (
; VOID
; );
;
;NTKERNELAPI
;PMDL
;MmAllocatePagesForMdl (
; IN PHYSICAL_ADDRESS LowAddress,
; IN PHYSICAL_ADDRESS HighAddress,
; IN PHYSICAL_ADDRESS SkipBytes,
; IN SIZE_T TotalBytes
; );
;
;NTKERNELAPI
;VOID
;MmFreePagesFromMdl (
; IN PMDL MemoryDescriptorList
; );
;
;// begin_wdm
;
;NTKERNELAPI
;PVOID
;MmMapIoSpace (
; IN PHYSICAL_ADDRESS PhysicalAddress,
; IN SIZE_T NumberOfBytes,
; IN MEMORY_CACHING_TYPE CacheType
; );
;
;NTKERNELAPI
;VOID
;MmUnmapIoSpace (
; IN PVOID BaseAddress,
; IN SIZE_T NumberOfBytes
; );
;
;
;NTKERNELAPI
;PVOID
;MmMapVideoDisplay (
; IN PHYSICAL_ADDRESS PhysicalAddress,
; IN SIZE_T NumberOfBytes,
; IN MEMORY_CACHING_TYPE CacheType
; );
;
;NTKERNELAPI
;VOID
;MmUnmapVideoDisplay (
; IN PVOID BaseAddress,
; IN SIZE_T NumberOfBytes
; );
;
;NTKERNELAPI
;PHYSICAL_ADDRESS
;MmGetPhysicalAddress (
; IN PVOID BaseAddress
; );
;
;NTKERNELAPI
;PVOID
;MmGetVirtualForPhysical (
; IN PHYSICAL_ADDRESS PhysicalAddress
; );
;
;NTKERNELAPI
;PVOID
;MmAllocateContiguousMemory (
; IN SIZE_T NumberOfBytes,
; IN PHYSICAL_ADDRESS HighestAcceptableAddress
; );
;
;NTKERNELAPI
;PVOID
;MmAllocateContiguousMemorySpecifyCache (
; IN SIZE_T NumberOfBytes,
; IN PHYSICAL_ADDRESS LowestAcceptableAddress,
; IN PHYSICAL_ADDRESS HighestAcceptableAddress,
; IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
; IN MEMORY_CACHING_TYPE CacheType
; );
;
;NTKERNELAPI
;VOID
;MmFreeContiguousMemory (
; IN PVOID BaseAddress
; );
;
;NTKERNELAPI
;VOID
;MmFreeContiguousMemorySpecifyCache (
; IN PVOID BaseAddress,
; IN SIZE_T NumberOfBytes,
; IN MEMORY_CACHING_TYPE CacheType
; );
;
;
;NTKERNELAPI
;PVOID
;MmAllocateNonCachedMemory (
; IN SIZE_T NumberOfBytes
; );
;
;NTKERNELAPI
;VOID
;MmFreeNonCachedMemory (
; IN PVOID BaseAddress,
; IN SIZE_T NumberOfBytes
; );
;
;NTKERNELAPI
;BOOLEAN
;MmIsAddressValid (
; IN PVOID VirtualAddress
; );
;
;NTKERNELAPI
;BOOLEAN
;MmIsNonPagedSystemAddressValid (
; IN PVOID VirtualAddress
; );
;
;// begin_wdm
;
;NTKERNELAPI
;SIZE_T
;MmSizeOfMdl(
; IN PVOID Base,
; IN SIZE_T Length
; );
;
;NTKERNELAPI
;PMDL
;MmCreateMdl(
; IN PMDL MemoryDescriptorList OPTIONAL,
; IN PVOID Base,
; IN SIZE_T Length
; );
;
;NTKERNELAPI
;PVOID
;MmLockPagableDataSection(
; IN PVOID AddressWithinSection
; );
;
;// end_wdm
;
;NTKERNELAPI
;VOID
;MmLockPagableSectionByHandle (
; IN PVOID ImageSectionHandle
; );
;
;NTKERNELAPI
;VOID
;MmResetDriverPaging (
; IN PVOID AddressWithinSection
; );
;
;
;NTKERNELAPI
;PVOID
;MmPageEntireDriver (
; IN PVOID AddressWithinSection
; );
;
;NTKERNELAPI
;VOID
;MmUnlockPagableImageSection(
; IN PVOID ImageSectionHandle
; );
;
;// end_wdm
;
;NTKERNELAPI
;HANDLE
;MmSecureVirtualMemory (
; IN PVOID Address,
; IN SIZE_T Size,
; IN ULONG ProbeMode
; );
;
;NTKERNELAPI
;VOID
;MmUnsecureVirtualMemory (
; IN HANDLE SecureHandle
; );
;
;NTKERNELAPI
;NTSTATUS
;MmMapViewInSystemSpace (
; IN PVOID Section,
; OUT PVOID *MappedBase,
; IN PSIZE_T ViewSize
; );
;
;NTKERNELAPI
;NTSTATUS
;MmUnmapViewInSystemSpace (
; IN PVOID MappedBase
; );
;
;NTKERNELAPI
;NTSTATUS
;MmMapViewInSessionSpace (
; IN PVOID Section,
; OUT PVOID *MappedBase,
; IN OUT PSIZE_T ViewSize
; );
;
;NTKERNELAPI
;NTSTATUS
;MmUnmapViewInSessionSpace (
; IN PVOID MappedBase
; );
;
;// begin_wdm
;
;//++
;//
;// VOID
;// MmInitializeMdl (
;// IN PMDL MemoryDescriptorList,
;// IN PVOID BaseVa,
;// IN SIZE_T Length
;// )
;//
;// Routine Description:
;//
;// This routine initializes the header of a Memory Descriptor List (MDL).
;//
;// Arguments:
;//
;// MemoryDescriptorList - Pointer to the MDL to initialize.
;//
;// BaseVa - Base virtual address mapped by the MDL.
;//
;// Length - Length, in bytes, of the buffer mapped by the MDL.
;//
;// Return Value:
;//
;// None.
;//
;//--
;
;#define MmInitializeMdl(MemoryDescriptorList, BaseVa, Length) { \
; (MemoryDescriptorList)->Next = (PMDL) NULL; \
; (MemoryDescriptorList)->Size = (CSHORT)(sizeof(MDL) + \
; (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES((BaseVa), (Length)))); \
; (MemoryDescriptorList)->MdlFlags = 0; \
; (MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN((BaseVa)); \
; (MemoryDescriptorList)->ByteOffset = BYTE_OFFSET((BaseVa)); \
; (MemoryDescriptorList)->ByteCount = (ULONG)(Length); \
; }
;
;//++
;//
;// PVOID
;// MmGetSystemAddressForMdlSafe (
;// IN PMDL MDL,
;// IN MM_PAGE_PRIORITY PRIORITY
;// )
;//
;// Routine Description:
;//
;// This routine returns the mapped address of an MDL. If the
;// Mdl is not already mapped or a system address, it is mapped.
;//
;// Arguments:
;//
;// MemoryDescriptorList - Pointer to the MDL to map.
;//
;// Priority - Supplies an indication as to how important it is that this
;// request succeed under low available PTE conditions.
;//
;// Return Value:
;//
;// Returns the base address where the pages are mapped. The base address
;// has the same offset as the virtual address in the MDL.
;//
;// Unlike MmGetSystemAddressForMdl, Safe guarantees that it will always
;// return NULL on failure instead of bugchecking the system.
;//
;// This macro is not usable by WDM 1.0 drivers as 1.0 did not include
;// MmMapLockedPagesSpecifyCache. The solution for WDM 1.0 drivers is to
;// provide synchronization and set/reset the MDL_MAPPING_CAN_FAIL bit.
;//
;//--
;
;#define MmGetSystemAddressForMdlSafe(MDL, PRIORITY) \
; (((MDL)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
; MDL_SOURCE_IS_NONPAGED_POOL)) ? \
; ((MDL)->MappedSystemVa) : \
; (MmMapLockedPagesSpecifyCache((MDL), \
; KernelMode, \
; MmCached, \
; NULL, \
; FALSE, \
; (PRIORITY))))
;
;//++
;//
;// PVOID
;// MmGetSystemAddressForMdl (
;// IN PMDL MDL
;// )
;//
;// Routine Description:
;//
;// This routine returns the mapped address of an MDL, if the
;// Mdl is not already mapped or a system address, it is mapped.
;//
;// Arguments:
;//
;// MemoryDescriptorList - Pointer to the MDL to map.
;//
;// Return Value:
;//
;// Returns the base address where the pages are mapped. The base address
;// has the same offset as the virtual address in the MDL.
;//
;//--
;
;//#define MmGetSystemAddressForMdl(MDL)
;// (((MDL)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA)) ?
;// ((MDL)->MappedSystemVa) :
;// ((((MDL)->MdlFlags & (MDL_SOURCE_IS_NONPAGED_POOL)) ?
;// ((PVOID)((ULONG)(MDL)->StartVa | (MDL)->ByteOffset)) :
;// (MmMapLockedPages((MDL),KernelMode)))))
;
;#define MmGetSystemAddressForMdl(MDL) \
; (((MDL)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
; MDL_SOURCE_IS_NONPAGED_POOL)) ? \
; ((MDL)->MappedSystemVa) : \
; (MmMapLockedPages((MDL),KernelMode)))
;
;//++
;//
;// VOID
;// MmPrepareMdlForReuse (
;// IN PMDL MDL
;// )
;//
;// Routine Description:
;//
;// This routine will take all of the steps necessary to allow an MDL to be
;// re-used.
;//
;// Arguments:
;//
;// MemoryDescriptorList - Pointer to the MDL that will be re-used.
;//
;// Return Value:
;//
;// None.
;//
;//--
;
;#define MmPrepareMdlForReuse(MDL) \
; if (((MDL)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
; ASSERT(((MDL)->MdlFlags & MDL_PARTIAL) != 0); \
; MmUnmapLockedPages( (MDL)->MappedSystemVa, (MDL) ); \
; } else if (((MDL)->MdlFlags & MDL_PARTIAL) == 0) { \
; ASSERT(((MDL)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
; }
;
;typedef NTSTATUS (*PMM_DLL_INITIALIZE)(
; IN PUNICODE_STRING RegistryPath
; );
;
;typedef NTSTATUS (*PMM_DLL_UNLOAD)(
; VOID
; );
;
;
;
;//
;// Define an empty typedef for the _DRIVER_OBJECT structure so it may be
;// referenced by function types before it is actually defined.
;//
;struct _DRIVER_OBJECT;
;
;NTKERNELAPI
;LOGICAL
;MmIsDriverVerifying (
; IN struct _DRIVER_OBJECT *DriverObject
; );
;
;//
;// Security operation codes
;//
;
;typedef enum _SECURITY_OPERATION_CODE {
; SetSecurityDescriptor,
; QuerySecurityDescriptor,
; DeleteSecurityDescriptor,
; AssignSecurityDescriptor
; } SECURITY_OPERATION_CODE, *PSECURITY_OPERATION_CODE;
;
;//
;// Data structure used to capture subject security context
;// for access validations and auditing.
;//
;// THE FIELDS OF THIS DATA STRUCTURE SHOULD BE CONSIDERED OPAQUE
;// BY ALL EXCEPT THE SECURITY ROUTINES.
;//
;
;typedef struct _SECURITY_SUBJECT_CONTEXT {
; PACCESS_TOKEN ClientToken;
; SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
; PACCESS_TOKEN PrimaryToken;
; PVOID ProcessAuditId;
; } SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
;
;///////////////////////////////////////////////////////////////////////////////
;// //
;// ACCESS_STATE and related structures //
;// //
;///////////////////////////////////////////////////////////////////////////////
;
;//
;// Initial Privilege Set - Room for three privileges, which should
;// be enough for most applications. This structure exists so that
;// it can be imbedded in an ACCESS_STATE structure. Use PRIVILEGE_SET
;// for all other references to Privilege sets.
;//
;
;#define INITIAL_PRIVILEGE_COUNT 3
;
;typedef struct _INITIAL_PRIVILEGE_SET {
; ULONG PrivilegeCount;
; ULONG Control;
; LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT];
; } INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
;
;
;
;//
;// Combine the information that describes the state
;// of an access-in-progress into a single structure
;//
;
;
;typedef struct _ACCESS_STATE {
; LUID OperationID;
; BOOLEAN SecurityEvaluated;
; BOOLEAN GenerateAudit;
; BOOLEAN GenerateOnClose;
; BOOLEAN PrivilegesAllocated;
; ULONG Flags;
; ACCESS_MASK RemainingDesiredAccess;
; ACCESS_MASK PreviouslyGrantedAccess;
; ACCESS_MASK OriginalDesiredAccess;
; SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
; PSECURITY_DESCRIPTOR SecurityDescriptor;
; PVOID AuxData;
; union {
; INITIAL_PRIVILEGE_SET InitialPrivilegeSet;
; PRIVILEGE_SET PrivilegeSet;
; } Privileges;
;
; BOOLEAN AuditPrivileges;
; UNICODE_STRING ObjectName;
; UNICODE_STRING ObjectTypeName;
;
; } ACCESS_STATE, *PACCESS_STATE;
;
;
;NTKERNELAPI
;NTSTATUS
;SeAssignSecurity (
; IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
; IN PSECURITY_DESCRIPTOR ExplicitDescriptor,
; OUT PSECURITY_DESCRIPTOR *NewDescriptor,
; IN BOOLEAN IsDirectoryObject,
; IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
; IN PGENERIC_MAPPING GenericMapping,
; IN POOL_TYPE PoolType
; );
;
;NTKERNELAPI
;NTSTATUS
;SeAssignSecurityEx (
; IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
; IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
; OUT PSECURITY_DESCRIPTOR *NewDescriptor,
; IN GUID *ObjectType OPTIONAL,
; IN BOOLEAN IsDirectoryObject,
; IN ULONG AutoInheritFlags,
; IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
; IN PGENERIC_MAPPING GenericMapping,
; IN POOL_TYPE PoolType
; );
;
;NTKERNELAPI
;NTSTATUS
;SeDeassignSecurity (
; IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor
; );
;
;NTKERNELAPI
;BOOLEAN
;SeAccessCheck (
; IN PSECURITY_DESCRIPTOR SecurityDescriptor,
; IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
; IN BOOLEAN SubjectContextLocked,
; IN ACCESS_MASK DesiredAccess,
; IN ACCESS_MASK PreviouslyGrantedAccess,
; OUT PPRIVILEGE_SET *Privileges OPTIONAL,
; IN PGENERIC_MAPPING GenericMapping,
; IN KPROCESSOR_MODE AccessMode,
; OUT PACCESS_MASK GrantedAccess,
; OUT PNTSTATUS AccessStatus
; );
;
;
;NTKERNELAPI
;BOOLEAN
;SeValidSecurityDescriptor(
; IN ULONG Length,
; IN PSECURITY_DESCRIPTOR SecurityDescriptor
; );
;
;NTKERNELAPI
;BOOLEAN
;SeSinglePrivilegeCheck(
; LUID PrivilegeValue,
; KPROCESSOR_MODE PreviousMode
; );
;//
;// System Thread and Process Creation and Termination
;//
;
;NTKERNELAPI
;NTSTATUS
;PsCreateSystemThread(
; OUT PHANDLE ThreadHandle,
; IN ULONG DesiredAccess,
; IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
; IN HANDLE ProcessHandle OPTIONAL,
; OUT PCLIENT_ID ClientId OPTIONAL,
; IN PKSTART_ROUTINE StartRoutine,
; IN PVOID StartContext
; );
;
;NTKERNELAPI
;NTSTATUS
;PsTerminateSystemThread(
; IN NTSTATUS ExitStatus
; );
;
;
;typedef
;VOID
;(*PCREATE_PROCESS_NOTIFY_ROUTINE)(
; IN HANDLE ParentId,
; IN HANDLE ProcessId,
; IN BOOLEAN Create
; );
;
;NTSTATUS
;PsSetCreateProcessNotifyRoutine(
; IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
; IN BOOLEAN Remove
; );
;
;typedef
;VOID
;(*PCREATE_THREAD_NOTIFY_ROUTINE)(
; IN HANDLE ProcessId,
; IN HANDLE ThreadId,
; IN BOOLEAN Create
; );
;
;NTSTATUS
;PsSetCreateThreadNotifyRoutine(
; IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine
; );
;
;//
;// Structures for Load Image Notify
;//
;
;typedef struct _IMAGE_INFO {
; union {
; ULONG Properties;
; struct {
; ULONG ImageAddressingMode : 8; // code addressing mode
; ULONG SystemModeImage : 1; // system mode image
; ULONG ImageMappedToAllPids : 1; // image mapped into all processes
; ULONG Reserved : 22;
; };
; };
; PVOID ImageBase;
; ULONG ImageSelector;
; SIZE_T ImageSize;
; ULONG ImageSectionNumber;
;} IMAGE_INFO, *PIMAGE_INFO;
;
;#define IMAGE_ADDRESSING_MODE_32BIT 3
;
;typedef
;VOID
;(*PLOAD_IMAGE_NOTIFY_ROUTINE)(
; IN PUNICODE_STRING FullImageName,
; IN HANDLE ProcessId, // pid into which image is being mapped
; IN PIMAGE_INFO ImageInfo
; );
;
;NTSTATUS
;PsSetLoadImageNotifyRoutine(
; IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine
; );
;
;HANDLE
;PsGetCurrentProcessId( VOID );
;
;HANDLE
;PsGetCurrentThreadId( VOID );
;
;BOOLEAN
;PsGetVersion(
; PULONG MajorVersion OPTIONAL,
; PULONG MinorVersion OPTIONAL,
; PULONG BuildNumber OPTIONAL,
; PUNICODE_STRING CSDVersion OPTIONAL
; );
;
;//
;// Define I/O system data structure type codes. Each major data structure in
;// the I/O system has a type code The type field in each structure is at the
;// same offset. The following values can be used to determine which type of
;// data structure a pointer refers to.
;//
;
;#define IO_TYPE_ADAPTER 0x00000001
;#define IO_TYPE_CONTROLLER 0x00000002
;#define IO_TYPE_DEVICE 0x00000003
;#define IO_TYPE_DRIVER 0x00000004
;#define IO_TYPE_FILE 0x00000005
;#define IO_TYPE_IRP 0x00000006
;#define IO_TYPE_MASTER_ADAPTER 0x00000007
;#define IO_TYPE_OPEN_PACKET 0x00000008
;#define IO_TYPE_TIMER 0x00000009
;#define IO_TYPE_VPB 0x0000000a
;#define IO_TYPE_ERROR_LOG 0x0000000b
;#define IO_TYPE_ERROR_MESSAGE 0x0000000c
;#define IO_TYPE_DEVICE_OBJECT_EXTENSION 0x0000000d
;
;
;//
;// Define the major function codes for IRPs.
;//
;
;
;#define IRP_MJ_CREATE 0x00
;#define IRP_MJ_CREATE_NAMED_PIPE 0x01
;#define IRP_MJ_CLOSE 0x02
;#define IRP_MJ_READ 0x03
;#define IRP_MJ_WRITE 0x04
;#define IRP_MJ_QUERY_INFORMATION 0x05
;#define IRP_MJ_SET_INFORMATION 0x06
;#define IRP_MJ_QUERY_EA 0x07
;#define IRP_MJ_SET_EA 0x08
;#define IRP_MJ_FLUSH_BUFFERS 0x09
;#define IRP_MJ_QUERY_VOLUME_INFORMATION 0x0a
;#define IRP_MJ_SET_VOLUME_INFORMATION 0x0b
;#define IRP_MJ_DIRECTORY_CONTROL 0x0c
;#define IRP_MJ_FILE_SYSTEM_CONTROL 0x0d
;#define IRP_MJ_DEVICE_CONTROL 0x0e
;#define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f
;#define IRP_MJ_SHUTDOWN 0x10
;#define IRP_MJ_LOCK_CONTROL 0x11
;#define IRP_MJ_CLEANUP 0x12
;#define IRP_MJ_CREATE_MAILSLOT 0x13
;#define IRP_MJ_QUERY_SECURITY 0x14
;#define IRP_MJ_SET_SECURITY 0x15
;#define IRP_MJ_POWER 0x16
;#define IRP_MJ_SYSTEM_CONTROL 0x17
;#define IRP_MJ_DEVICE_CHANGE 0x18
;#define IRP_MJ_QUERY_QUOTA 0x19
;#define IRP_MJ_SET_QUOTA 0x1a
;#define IRP_MJ_PNP 0x1b
;#define IRP_MJ_PNP_POWER IRP_MJ_PNP // Obsolete....
;#define IRP_MJ_MAXIMUM_FUNCTION 0x1b
;
;//
;// Make the Scsi major code the same as internal device control.
;//
;
;#define IRP_MJ_SCSI IRP_MJ_INTERNAL_DEVICE_CONTROL
;
;//
;// Define the minor function codes for IRPs. The lower 128 codes, from 0x00 to
;// 0x7f are reserved to Microsoft. The upper 128 codes, from 0x80 to 0xff, are
;// reserved to customers of Microsoft.
;//
;
;// end_wdm end_ntndis
;//
;// Directory control minor function codes
;//
;
;#define IRP_MN_QUERY_DIRECTORY 0x01
;#define IRP_MN_NOTIFY_CHANGE_DIRECTORY 0x02
;
;//
;// File system control minor function codes. Note that "user request" is
;// assumed to be zero by both the I/O system and file systems. Do not change
;// this value.
;//
;
;#define IRP_MN_USER_FS_REQUEST 0x00
;#define IRP_MN_MOUNT_VOLUME 0x01
;#define IRP_MN_VERIFY_VOLUME 0x02
;#define IRP_MN_LOAD_FILE_SYSTEM 0x03
;#define IRP_MN_TRACK_LINK 0x04 // To be obsoleted soon
;#define IRP_MN_KERNEL_CALL 0x04
;
;//
;// Lock control minor function codes
;//
;
;#define IRP_MN_LOCK 0x01
;#define IRP_MN_UNLOCK_SINGLE 0x02
;#define IRP_MN_UNLOCK_ALL 0x03
;#define IRP_MN_UNLOCK_ALL_BY_KEY 0x04
;
;//
;// Read and Write minor function codes for file systems supporting Lan Manager
;// software. All of these subfunction codes are invalid if the file has been
;// opened with FO_NO_INTERMEDIATE_BUFFERING. They are also invalid in combi-
;// nation with synchronous calls (Irp Flag or file open option).
;//
;// Note that "normal" is assumed to be zero by both the I/O system and file
;// systems. Do not change this value.
;//
;
;#define IRP_MN_NORMAL 0x00
;#define IRP_MN_DPC 0x01
;#define IRP_MN_MDL 0x02
;#define IRP_MN_COMPLETE 0x04
;#define IRP_MN_COMPRESSED 0x08
;
;#define IRP_MN_MDL_DPC (IRP_MN_MDL | IRP_MN_DPC)
;#define IRP_MN_COMPLETE_MDL (IRP_MN_COMPLETE | IRP_MN_MDL)
;#define IRP_MN_COMPLETE_MDL_DPC (IRP_MN_COMPLETE_MDL | IRP_MN_DPC)
;
;// begin_wdm
;//
;// Device Control Request minor function codes for SCSI support. Note that
;// user requests are assumed to be zero.
;//
;
;#define IRP_MN_SCSI_CLASS 0x01
;
;//
;// PNP minor function codes.
;//
;
;#define IRP_MN_START_DEVICE 0x00
;#define IRP_MN_QUERY_REMOVE_DEVICE 0x01
;#define IRP_MN_REMOVE_DEVICE 0x02
;#define IRP_MN_CANCEL_REMOVE_DEVICE 0x03
;#define IRP_MN_STOP_DEVICE 0x04
;#define IRP_MN_QUERY_STOP_DEVICE 0x05
;#define IRP_MN_CANCEL_STOP_DEVICE 0x06
;
;#define IRP_MN_QUERY_DEVICE_RELATIONS 0x07
;#define IRP_MN_QUERY_INTERFACE 0x08
;#define IRP_MN_QUERY_CAPABILITIES 0x09
;#define IRP_MN_QUERY_RESOURCES 0x0A
;#define IRP_MN_QUERY_RESOURCE_REQUIREMENTS 0x0B
;#define IRP_MN_QUERY_DEVICE_TEXT 0x0C
;#define IRP_MN_FILTER_RESOURCE_REQUIREMENTS 0x0D
;
;#define IRP_MN_READ_CONFIG 0x0F
;#define IRP_MN_WRITE_CONFIG 0x10
;#define IRP_MN_EJECT 0x11
;#define IRP_MN_SET_LOCK 0x12
;#define IRP_MN_QUERY_ID 0x13
;#define IRP_MN_QUERY_PNP_DEVICE_STATE 0x14
;#define IRP_MN_QUERY_BUS_INFORMATION 0x15
;#define IRP_MN_DEVICE_USAGE_NOTIFICATION 0x16
;#define IRP_MN_SURPRISE_REMOVAL 0x17
;// end_wdm
;#define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
;// begin_wdm
;
;//
;// POWER minor function codes
;//
;#define IRP_MN_WAIT_WAKE 0x00
;#define IRP_MN_POWER_SEQUENCE 0x01
;#define IRP_MN_SET_POWER 0x02
;#define IRP_MN_QUERY_POWER 0x03
;
;// begin_ntminiport
;//
;// WMI minor function codes under IRP_MJ_SYSTEM_CONTROL
;//
;
;#define IRP_MN_QUERY_ALL_DATA 0x00
;#define IRP_MN_QUERY_SINGLE_INSTANCE 0x01
;#define IRP_MN_CHANGE_SINGLE_INSTANCE 0x02
;#define IRP_MN_CHANGE_SINGLE_ITEM 0x03
;#define IRP_MN_ENABLE_EVENTS 0x04
;#define IRP_MN_DISABLE_EVENTS 0x05
;#define IRP_MN_ENABLE_COLLECTION 0x06
;#define IRP_MN_DISABLE_COLLECTION 0x07
;#define IRP_MN_REGINFO 0x08
;#define IRP_MN_EXECUTE_METHOD 0x09
;
;// end_ntminiport
;
;//
;// Define option flags for IoCreateFile. Note that these values must be
;// exactly the same as the SL_... flags for a create function. Note also
;// that there are flags that may be passed to IoCreateFile that are not
;// placed in the stack location for the create IRP. These flags start in
;// the next byte.
;//
;
;#define IO_FORCE_ACCESS_CHECK 0x0001
;#define IO_OPEN_PAGING_FILE 0x0002
;#define IO_OPEN_TARGET_DIRECTORY 0x0004
;#define IO_NO_PARAMETER_CHECKING 0x0100
;
;//
;// Define Information fields for whether or not a REPARSE or a REMOUNT has
;// occurred in the file system.
;//
;
;#define IO_REPARSE 0x0
;#define IO_REMOUNT 0x1
;
;//
;// Define callout routine type for use in IoQueryDeviceDescription().
;//
;
;typedef NTSTATUS (*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
; );
;
;//
;// Defines the order of the information in the array of
;// PKEY_VALUE_FULL_INFORMATION.
;//
;
;typedef enum _IO_QUERY_DEVICE_DATA_FORMAT {
; IoQueryDeviceIdentifier = 0,
; IoQueryDeviceConfigurationData,
; IoQueryDeviceComponentInformation,
; IoQueryDeviceMaxData
;} IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT;
;
;// begin_wdm begin_ntifs
;//
;// Define the objects that can be created by IoCreateFile.
;//
;
;typedef enum _CREATE_FILE_TYPE {
; CreateFileTypeNone,
; CreateFileTypeNamedPipe,
; CreateFileTypeMailslot
;} CREATE_FILE_TYPE;
;
;//
;// Define the structures used by the I/O system
;//
;
;//
;// Define empty typedefs for the _IRP, _DEVICE_OBJECT, and _DRIVER_OBJECT
;// structures so they may be referenced by function types before they are
;// actually defined.
;//
;struct _DEVICE_DESCRIPTION;
;struct _DEVICE_OBJECT;
;struct _DMA_ADAPTER;
;struct _DRIVER_OBJECT;
;struct _DRIVE_LAYOUT_INFORMATION;
;struct _DISK_PARTITION;
;struct _FILE_OBJECT;
;struct _IRP;
;struct _SCSI_REQUEST_BLOCK;
;
;//
;// Define the I/O version of a DPC routine.
;//
;
;typedef
;VOID
;(*PIO_DPC_ROUTINE) (
; IN PKDPC Dpc,
; IN struct _DEVICE_OBJECT *DeviceObject,
; IN struct _IRP *Irp,
; IN PVOID Context
; );
;
;//
;// Define driver timer routine type.
;//
;
;typedef
;VOID
;(*PIO_TIMER_ROUTINE) (
; IN struct _DEVICE_OBJECT *DeviceObject,
; IN PVOID Context
; );
;
;//
;// Define driver initialization routine type.
;//
;
;typedef
;NTSTATUS
;(*PDRIVER_INITIALIZE) (
; IN struct _DRIVER_OBJECT *DriverObject,
; IN PUNICODE_STRING RegistryPath
; );
;
;// end_wdm
;//
;// Define driver reinitialization routine type.
;//
;
;typedef
;VOID
;(*PDRIVER_REINITIALIZE) (
; IN struct _DRIVER_OBJECT *DriverObject,
; IN PVOID Context,
; IN ULONG Count
; );
;
;// begin_wdm begin_ntndis
;//
;// Define driver cancel routine type.
;//
;
;typedef
;VOID
;(*PDRIVER_CANCEL) (
; IN struct _DEVICE_OBJECT *DeviceObject,
; IN struct _IRP *Irp
; );
;
;//
;// Define driver dispatch routine type.
;//
;
;typedef
;NTSTATUS
;(*PDRIVER_DISPATCH) (
; IN struct _DEVICE_OBJECT *DeviceObject,
; IN struct _IRP *Irp
; );
;
;//
;// Define driver start I/O routine type.
;//
;
;typedef
;VOID
;(*PDRIVER_STARTIO) (
; IN struct _DEVICE_OBJECT *DeviceObject,
; IN struct _IRP *Irp
; );
;
;//
;// Define driver unload routine type.
;//
;
;typedef
;VOID
;(*PDRIVER_UNLOAD) (
; IN struct _DRIVER_OBJECT *DriverObject
; );
;
;//
;// Define driver AddDevice routine type.
;//
;
;typedef
;NTSTATUS
;(*PDRIVER_ADD_DEVICE) (
; IN struct _DRIVER_OBJECT *DriverObject,
; IN struct _DEVICE_OBJECT *PhysicalDeviceObject
; );
;
;
;//
;// Define fast I/O procedure prototypes.
;//
;// Fast I/O read and write procedures.
;//
;
;typedef
;BOOLEAN
;(*PFAST_IO_CHECK_IF_POSSIBLE) (
; IN struct _FILE_OBJECT *FileObject,
; IN PLARGE_INTEGER FileOffset,
; IN ULONG Length,
; IN BOOLEAN Wait,
; IN ULONG LockKey,
; IN BOOLEAN CheckForReadOperation,
; OUT PIO_STATUS_BLOCK IoStatus,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;typedef
;BOOLEAN
;(*PFAST_IO_READ) (
; IN struct _FILE_OBJECT *FileObject,
; IN PLARGE_INTEGER FileOffset,
; IN ULONG Length,
; IN BOOLEAN Wait,
; IN ULONG LockKey,
; OUT PVOID Buffer,
; OUT PIO_STATUS_BLOCK IoStatus,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;typedef
;BOOLEAN
;(*PFAST_IO_WRITE) (
; IN struct _FILE_OBJECT *FileObject,
; IN PLARGE_INTEGER FileOffset,
; IN ULONG Length,
; IN BOOLEAN Wait,
; IN ULONG LockKey,
; IN PVOID Buffer,
; OUT PIO_STATUS_BLOCK IoStatus,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;//
;// Fast I/O query basic and standard information procedures.
;//
;
;typedef
;BOOLEAN
;(*PFAST_IO_QUERY_BASIC_INFO) (
; IN struct _FILE_OBJECT *FileObject,
; IN BOOLEAN Wait,
; OUT PFILE_BASIC_INFORMATION Buffer,
; OUT PIO_STATUS_BLOCK IoStatus,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;typedef
;BOOLEAN
;(*PFAST_IO_QUERY_STANDARD_INFO) (
; IN struct _FILE_OBJECT *FileObject,
; IN BOOLEAN Wait,
; OUT PFILE_STANDARD_INFORMATION Buffer,
; OUT PIO_STATUS_BLOCK IoStatus,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;//
;// Fast I/O lock and unlock procedures.
;//
;
;typedef
;BOOLEAN
;(*PFAST_IO_LOCK) (
; IN struct _FILE_OBJECT *FileObject,
; IN PLARGE_INTEGER FileOffset,
; IN PLARGE_INTEGER Length,
; PEPROCESS ProcessId,
; ULONG Key,
; BOOLEAN FailImmediately,
; BOOLEAN ExclusiveLock,
; OUT PIO_STATUS_BLOCK IoStatus,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;typedef
;BOOLEAN
;(*PFAST_IO_UNLOCK_SINGLE) (
; IN struct _FILE_OBJECT *FileObject,
; IN PLARGE_INTEGER FileOffset,
; IN PLARGE_INTEGER Length,
; PEPROCESS ProcessId,
; ULONG Key,
; OUT PIO_STATUS_BLOCK IoStatus,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;typedef
;BOOLEAN
;(*PFAST_IO_UNLOCK_ALL) (
; IN struct _FILE_OBJECT *FileObject,
; PEPROCESS ProcessId,
; OUT PIO_STATUS_BLOCK IoStatus,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;typedef
;BOOLEAN
;(*PFAST_IO_UNLOCK_ALL_BY_KEY) (
; IN struct _FILE_OBJECT *FileObject,
; PVOID ProcessId,
; ULONG Key,
; OUT PIO_STATUS_BLOCK IoStatus,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;//
;// Fast I/O device control procedure.
;//
;
;typedef
;BOOLEAN
;(*PFAST_IO_DEVICE_CONTROL) (
; IN struct _FILE_OBJECT *FileObject,
; IN BOOLEAN Wait,
; IN PVOID InputBuffer OPTIONAL,
; IN ULONG InputBufferLength,
; OUT PVOID OutputBuffer OPTIONAL,
; IN ULONG OutputBufferLength,
; IN ULONG IoControlCode,
; OUT PIO_STATUS_BLOCK IoStatus,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;//
;// Define callbacks for NtCreateSection to synchronize correctly with
;// the file system. It pre-acquires the resources that will be needed
;// when calling to query and set file/allocation size in the file system.
;//
;
;typedef
;VOID
;(*PFAST_IO_ACQUIRE_FILE) (
; IN struct _FILE_OBJECT *FileObject
; );
;
;typedef
;VOID
;(*PFAST_IO_RELEASE_FILE) (
; IN struct _FILE_OBJECT *FileObject
; );
;
;//
;// Define callback for drivers that have device objects attached to lower-
;// level drivers' device objects. This callback is made when the lower-level
;// driver is deleting its device object.
;//
;
;typedef
;VOID
;(*PFAST_IO_DETACH_DEVICE) (
; IN struct _DEVICE_OBJECT *SourceDevice,
; IN struct _DEVICE_OBJECT *TargetDevice
; );
;
;//
;// This structure is used by the server to quickly get the information needed
;// to service a server open call. It is takes what would be two fast io calls
;// one for basic information and the other for standard information and makes
;// it into one call.
;//
;
;typedef
;BOOLEAN
;(*PFAST_IO_QUERY_NETWORK_OPEN_INFO) (
; IN struct _FILE_OBJECT *FileObject,
; IN BOOLEAN Wait,
; OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
; OUT struct _IO_STATUS_BLOCK *IoStatus,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;//
;// Define Mdl-based routines for the server to call
;//
;
;typedef
;BOOLEAN
;(*PFAST_IO_MDL_READ) (
; IN struct _FILE_OBJECT *FileObject,
; IN PLARGE_INTEGER FileOffset,
; IN ULONG Length,
; IN ULONG LockKey,
; OUT PMDL *MdlChain,
; OUT PIO_STATUS_BLOCK IoStatus,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;typedef
;BOOLEAN
;(*PFAST_IO_MDL_READ_COMPLETE) (
; IN struct _FILE_OBJECT *FileObject,
; IN PMDL MdlChain,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;typedef
;BOOLEAN
;(*PFAST_IO_PREPARE_MDL_WRITE) (
; IN struct _FILE_OBJECT *FileObject,
; IN PLARGE_INTEGER FileOffset,
; IN ULONG Length,
; IN ULONG LockKey,
; OUT PMDL *MdlChain,
; OUT PIO_STATUS_BLOCK IoStatus,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;typedef
;BOOLEAN
;(*PFAST_IO_MDL_WRITE_COMPLETE) (
; IN struct _FILE_OBJECT *FileObject,
; IN PLARGE_INTEGER FileOffset,
; IN PMDL MdlChain,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;//
;// If this routine is present, it will be called by FsRtl
;// to acquire the file for the mapped page writer.
;//
;
;typedef
;NTSTATUS
;(*PFAST_IO_ACQUIRE_FOR_MOD_WRITE) (
; IN struct _FILE_OBJECT *FileObject,
; IN PLARGE_INTEGER EndingOffset,
; OUT struct _ERESOURCE **ResourceToRelease,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;typedef
;NTSTATUS
;(*PFAST_IO_RELEASE_FOR_MOD_WRITE) (
; IN struct _FILE_OBJECT *FileObject,
; IN struct _ERESOURCE *ResourceToRelease,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;//
;// If this routine is present, it will be called by FsRtl
;// to acquire the file for the mapped page writer.
;//
;
;typedef
;NTSTATUS
;(*PFAST_IO_ACQUIRE_FOR_CCFLUSH) (
; IN struct _FILE_OBJECT *FileObject,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;typedef
;NTSTATUS
;(*PFAST_IO_RELEASE_FOR_CCFLUSH) (
; IN struct _FILE_OBJECT *FileObject,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;typedef
;BOOLEAN
;(*PFAST_IO_READ_COMPRESSED) (
; IN struct _FILE_OBJECT *FileObject,
; IN PLARGE_INTEGER FileOffset,
; IN ULONG Length,
; IN ULONG LockKey,
; OUT PVOID Buffer,
; OUT PMDL *MdlChain,
; OUT PIO_STATUS_BLOCK IoStatus,
; OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
; IN ULONG CompressedDataInfoLength,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;typedef
;BOOLEAN
;(*PFAST_IO_WRITE_COMPRESSED) (
; IN struct _FILE_OBJECT *FileObject,
; IN PLARGE_INTEGER FileOffset,
; IN ULONG Length,
; IN ULONG LockKey,
; IN PVOID Buffer,
; OUT PMDL *MdlChain,
; OUT PIO_STATUS_BLOCK IoStatus,
; IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
; IN ULONG CompressedDataInfoLength,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;typedef
;BOOLEAN
;(*PFAST_IO_MDL_READ_COMPLETE_COMPRESSED) (
; IN struct _FILE_OBJECT *FileObject,
; IN PMDL MdlChain,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;typedef
;BOOLEAN
;(*PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED) (
; IN struct _FILE_OBJECT *FileObject,
; IN PLARGE_INTEGER FileOffset,
; IN PMDL MdlChain,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;typedef
;BOOLEAN
;(*PFAST_IO_QUERY_OPEN) (
; IN struct _IRP *Irp,
; OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
; IN struct _DEVICE_OBJECT *DeviceObject
; );
;
;//
;// Define the structure to describe the Fast I/O dispatch routines. Any
;// additions made to this structure MUST be added monotonically to the end
;// of the structure, and fields CANNOT be removed from the middle.
;//
;
;typedef struct _FAST_IO_DISPATCH {
; ULONG SizeOfFastIoDispatch;
; PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible;
; PFAST_IO_READ FastIoRead;
; PFAST_IO_WRITE FastIoWrite;
; PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo;
; PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo;
; PFAST_IO_LOCK FastIoLock;
; PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle;
; PFAST_IO_UNLOCK_ALL FastIoUnlockAll;
; PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey;
; PFAST_IO_DEVICE_CONTROL FastIoDeviceControl;
; PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection;
; PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection;
; PFAST_IO_DETACH_DEVICE FastIoDetachDevice;
; PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo;
; PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite;
; PFAST_IO_MDL_READ MdlRead;
; PFAST_IO_MDL_READ_COMPLETE MdlReadComplete;
; PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite;
; PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete;
; PFAST_IO_READ_COMPRESSED FastIoReadCompressed;
; PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed;
; PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed;
; PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed;
; PFAST_IO_QUERY_OPEN FastIoQueryOpen;
; PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite;
; PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush;
; PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush;
;} FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
;
;//
;// Define the actions that a driver execution routine may request of the
;// adapter/controller allocation routines upon return.
;//
;
;typedef enum _IO_ALLOCATION_ACTION {
; KeepObject = 1,
; DeallocateObject,
; DeallocateObjectKeepRegisters
;} IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION;
;
;//
;// Define device driver adapter/controller execution routine.
;//
;
;typedef
;IO_ALLOCATION_ACTION
;(*PDRIVER_CONTROL) (
; IN struct _DEVICE_OBJECT *DeviceObject,
; IN struct _IRP *Irp,
; IN PVOID MapRegisterBase,
; IN PVOID Context
; );
;
;//
;// Define the I/O system's security context type for use by file system's
;// when checking access to volumes, files, and directories.
;//
;
;typedef struct _IO_SECURITY_CONTEXT {
; PSECURITY_QUALITY_OF_SERVICE SecurityQos;
; PACCESS_STATE AccessState;
; ACCESS_MASK DesiredAccess;
; ULONG FullCreateOptions;
;} IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
;
;//
;// Define Volume Parameter Block (VPB) flags.
;//
;
;#define VPB_MOUNTED 0x00000001
;#define VPB_LOCKED 0x00000002
;#define VPB_PERSISTENT 0x00000004
;#define VPB_REMOVE_PENDING 0x00000008
;#define VPB_RAW_MOUNT 0x00000010
;
;
;//
;// Volume Parameter Block (VPB)
;//
;
;#define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR)) // 32 characters
;
;typedef struct _VPB {
; CSHORT Type;
; CSHORT Size;
; USHORT Flags;
; USHORT VolumeLabelLength; // in bytes
; struct _DEVICE_OBJECT *DeviceObject;
; struct _DEVICE_OBJECT *RealDevice;
; ULONG SerialNumber;
; ULONG ReferenceCount;
; WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
;} VPB, *PVPB;
;
;
;#if defined(_AXP64_)
;
;//
;// Use __inline DMA macros (hal.h)
;//
;#ifndef USE_DMA_MACROS
;#define USE_DMA_MACROS
;#endif
;
;//
;// Only PnP drivers!
;//
;#ifndef NO_LEGACY_DRIVERS
;#define NO_LEGACY_DRIVERS
;#endif
;
;#endif // _AXP64_
;
;
;#if defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_))
;
;// begin_wdm
;//
;// Define object type specific fields of various objects used by the I/O system
;//
;
;typedef struct _DMA_ADAPTER *PADAPTER_OBJECT;
;
;// end_wdm
;#else
;
;//
;// Define object type specific fields of various objects used by the I/O system
;//
;
;typedef struct _ADAPTER_OBJECT *PADAPTER_OBJECT; // ntndis
;
;#endif // USE_DMA_MACROS && (_NTDDK_ || _NTDRIVER_)
;
;// begin_wdm
;//
;// Define Wait Context Block (WCB)
;//
;
;typedef struct _WAIT_CONTEXT_BLOCK {
; KDEVICE_QUEUE_ENTRY WaitQueueEntry;
; PDRIVER_CONTROL DeviceRoutine;
; PVOID DeviceContext;
; ULONG NumberOfMapRegisters;
; PVOID DeviceObject;
; PVOID CurrentIrp;
; PKDPC BufferChainingDpc;
;} WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
;
;// end_wdm
;
;typedef struct _CONTROLLER_OBJECT {
; CSHORT Type;
; CSHORT Size;
; PVOID ControllerExtension;
; KDEVICE_QUEUE DeviceWaitQueue;
;
; ULONG Spare1;
; LARGE_INTEGER Spare2;
;
;} CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
;
;// begin_wdm
;//
;// Define Device Object (DO) flags
;//
;#define DO_VERIFY_VOLUME 0x00000002h
;#define DO_BUFFERED_IO 0x00000004h
;#define DO_EXCLUSIVE 0x00000008h
;#define DO_DIRECT_IO 0x00000010h
;#define DO_MAP_IO_BUFFER 0x00000020h
;#define DO_DEVICE_HAS_NAME 0x00000040h
;#define DO_DEVICE_INITIALIZING 0x00000080h
;#define DO_SYSTEM_BOOT_PARTITION 0x00000100h
;#define DO_LONG_TERM_REQUESTS 0x00000200h
;#define DO_NEVER_LAST_DEVICE 0x00000400h
;#define DO_SHUTDOWN_REGISTERED 0x00000800h
;#define DO_BUS_ENUMERATED_DEVICE 0x00001000h
;#define DO_POWER_PAGABLE 0x00002000h
;#define DO_POWER_INRUSH 0x00004000h
;#define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
;//
;// Device Object structure definition
;//
;
;DEVICE_OBJECT {
; dType CSHORT
; dSize USHORT
; ReferenceCount LONG ?
; DriverObject PVIOD ?
; NextDevice PVOID ?
; AttachedDevice PVOID ?
; CurrentIrp PVOID ?
; PIO_TIMER Timer;
; ULONG Flags; // See above: DO_...
; ULONG Characteristics; // See ntioapi: FILE_...
; PVPB Vpb;
; PVOID DeviceExtension;
; DEVICE_TYPE DeviceType;
; CCHAR StackSize;
; union {
; LIST_ENTRY ListEntry;
; WAIT_CONTEXT_BLOCK Wcb;
; } Queue;
; ULONG AlignmentRequirement;
; KDEVICE_QUEUE DeviceQueue;
; KDPC Dpc;
; ULONG ActiveThreadCount;
; PSECURITY_DESCRIPTOR SecurityDescriptor;
; KEVENT DeviceLock;
;
; USHORT SectorSize;
; USHORT Spare1;
;
; struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
; PVOID Reserved;
;} DEVICE_OBJECT;
;typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT; // ntndis
;
;
;struct _DEVICE_OBJECT_POWER_EXTENSION;
;
;DEVOBJ_EXTENSION STRUC
; dType CSHORT ?
; dSize USHORT ?
; Reserved DWORD ?
; DeviceObject PDEVICE_OBJECT ?
;DEVOBJ_EXTENSION ENDS
;PDEVOBJ_EXTENSION TYPEDEF PTR DEVOBJ_EXTENSION
;DRVO_UNLOAD_INVOKED equ 00000001h
;DRVO_LEGACY_DRIVER equ 00000002h
;DRVO_BUILTIN_DRIVER equ 00000004h ; Driver objects for Hal, PnP Mgr
;DRVO_REINIT_REGISTERED equ 00000008h
;DRVO_INITIALIZED equ 00000010h
;DRVO_BOOTREINIT_REGISTERED equ 00000020h
;DRVO_LEGACY_RESOURCES equ 00000040h
;DRIVER_EXTENSION STRUC
; DriverObject PVOID ?
; AddDevice PDRIVER_ADD_DEVICE ?
; Count ULONG ?
; Reserved DWORD ?
; ServiceKeyName UNICODE_STRING<>
;DRIVER_EXTENSION ENDS
;PDRIVER_EXTENSION TYPEDEF PTR DRIVER_EXTENSION
;DRIVER_OBJECT STRUC
; dType CSHORT ?
; dSize CSHORT ?
; Reserved1 DWORD ?
; DeviceObject PDEVICE_OBJECT ?
; Flags ULONG ?
; Reserved2 DWORD ?
; DriverStart PVOID ?
; DriverSize ULONG ?
; Reserved3 DWORD ?
; DriverSection PVOID ?
; DriverExtension PDRIVER_EXTENSION ?
; DriverName UNICODE_STRING<>
; HardwareDatabase PUNICODE_STRING ?
; FastIoDispatch PFAST_IO_DISPATCH ?
; DriverInit PDRIVER_INITIALIZE ?
; DriverStartIo PDRIVER_STARTIO ?
; DriverUnload PDRIVER_UNLOAD ?
; MajorFunction PDRIVER_DISPATCH IRP_MJ_MAXIMUM_FUNCTION + 1 dup(?)
;DRIVER_OBJECT ENDS
;PDRIVER_OBJECT TYPEDEF PTR DRIVER_OBJECT
;
;//
;// The following structure is pointed to by the SectionObject pointer field
;// of a file object, and is allocated by the various NT file systems.
;//
;SECTION_OBJECT_POINTERS STRUC
; DataSectionObject PVOID ?
; SharedCacheMap PVOID ?
; ImageSectionObject PVOID ?
;SECTION_OBJECT_POINTERS ENDS
;PSECTION_OBJECT_POINTERS TYPEDEF PTR SECTION_OBJECT_POINTERS
;
;//
;// Define the format of a completion message.
;//
;
;typedef struct _IO_COMPLETION_CONTEXT {
; PVOID Port;
; PVOID Key;
;} IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
;
;//
;// Define File Object (FO) flags
;//
;
;#define FO_FILE_OPEN 0x00000001
;#define FO_SYNCHRONOUS_IO 0x00000002
;#define FO_ALERTABLE_IO 0x00000004
;#define FO_NO_INTERMEDIATE_BUFFERING 0x00000008
;#define FO_WRITE_THROUGH 0x00000010
;#define FO_SEQUENTIAL_ONLY 0x00000020
;#define FO_CACHE_SUPPORTED 0x00000040
;#define FO_NAMED_PIPE 0x00000080
;#define FO_STREAM_FILE 0x00000100
;#define FO_MAILSLOT 0x00000200
;#define FO_GENERATE_AUDIT_ON_CLOSE 0x00000400
;#define FO_DIRECT_DEVICE_OPEN 0x00000800
;#define FO_FILE_MODIFIED 0x00001000
;#define FO_FILE_SIZE_CHANGED 0x00002000
;#define FO_CLEANUP_COMPLETE 0x00004000
;#define FO_TEMPORARY_FILE 0x00008000
;#define FO_DELETE_ON_CLOSE 0x00010000
;#define FO_OPENED_CASE_SENSITIVE 0x00020000
;#define FO_HANDLE_CREATED 0x00040000
;#define FO_FILE_FAST_IO_READ 0x00080000
;#define FO_RANDOM_ACCESS 0x00100000
;#define FO_FILE_OPEN_CANCELLED 0x00200000
;#define FO_VOLUME_OPEN 0x00400000
;
;typedef struct _FILE_OBJECT {
; CSHORT Type;
; CSHORT Size;
; PDEVICE_OBJECT DeviceObject;
; PVPB Vpb;
; PVOID FsContext;
; PVOID FsContext2;
; PSECTION_OBJECT_POINTERS SectionObjectPointer;
; PVOID PrivateCacheMap;
; NTSTATUS FinalStatus;
; struct _FILE_OBJECT *RelatedFileObject;
; BOOLEAN LockOperation;
; BOOLEAN DeletePending;
; BOOLEAN ReadAccess;
; BOOLEAN WriteAccess;
; BOOLEAN DeleteAccess;
; BOOLEAN SharedRead;
; BOOLEAN SharedWrite;
; BOOLEAN SharedDelete;
; ULONG Flags;
; UNICODE_STRING FileName;
; LARGE_INTEGER CurrentByteOffset;
; ULONG Waiters;
; ULONG Busy;
; PVOID LastLock;
; KEVENT Lock;
; KEVENT Event;
; PIO_COMPLETION_CONTEXT CompletionContext;
;} FILE_OBJECT;
;typedef struct _FILE_OBJECT *PFILE_OBJECT; // ntndis
;
;//
;// Define I/O Request Packet (IRP) flags
;//
;
;#define IRP_NOCACHE 0x00000001
;#define IRP_PAGING_IO 0x00000002
;#define IRP_MOUNT_COMPLETION 0x00000002
;#define IRP_SYNCHRONOUS_API 0x00000004
;#define IRP_ASSOCIATED_IRP 0x00000008
;#define IRP_BUFFERED_IO 0x00000010
;#define IRP_DEALLOCATE_BUFFER 0x00000020
;#define IRP_INPUT_OPERATION 0x00000040
;#define IRP_SYNCHRONOUS_PAGING_IO 0x00000040
;#define IRP_CREATE_OPERATION 0x00000080
;#define IRP_READ_OPERATION 0x00000100
;#define IRP_WRITE_OPERATION 0x00000200
;#define IRP_CLOSE_OPERATION 0x00000400
;// end_wdm
;
;#define IRP_DEFER_IO_COMPLETION 0x00000800
;#define IRP_OB_QUERY_NAME 0x00001000
;#define IRP_HOLD_DEVICE_QUEUE 0x00002000
;#define IRP_RETRY_IO_COMPLETION 0x00004000
;
;// begin_wdm
;//
;// Define I/O request packet (IRP) alternate flags for allocation control.
;//
;
;#define IRP_QUOTA_CHARGED 0x01
;#define IRP_ALLOCATED_MUST_SUCCEED 0x02
;#define IRP_ALLOCATED_FIXED_SIZE 0x04
;#define IRP_LOOKASIDE_ALLOCATION 0x08
;
;//
;// I/O Request Packet (IRP) definition
;//
;
;typedef struct _IRP {
; CSHORT Type;
; USHORT Size;
;
; //
; // Define the common fields used to control the IRP.
; //
;
; //
; // Define a pointer to the Memory Descriptor List (MDL) for this I/O
; // request. This field is only used if the I/O is "direct I/O".
; //
;
; PMDL MdlAddress;
;
; //
; // Flags word - used to remember various flags.
; //
;
; ULONG Flags;
;
; //
; // The following union is used for one of three purposes:
; //
; // 1. This IRP is an associated IRP. The field is a pointer to a master
; // IRP.
; //
; // 2. This is the master IRP. The field is the count of the number of
; // IRPs which must complete (associated IRPs) before the master can
; // complete.
; //
; // 3. This operation is being buffered and the field is the address of
; // the system space buffer.
; //
;
; union {
; struct _IRP *MasterIrp;
; LONG IrpCount;
; PVOID SystemBuffer;
; } AssociatedIrp;
;
; //
; // Thread list entry - allows queueing the IRP to the thread pending I/O
; // request packet list.
; //
;
; LIST_ENTRY ThreadListEntry;
;
; //
; // I/O status - final status of operation.
; //
;
; IO_STATUS_BLOCK IoStatus;
;
; //
; // Requestor mode - mode of the original requestor of this operation.
; //
;
; KPROCESSOR_MODE RequestorMode;
;
; //
; // Pending returned - TRUE if pending was initially returned as the
; // status for this packet.
; //
;
; BOOLEAN PendingReturned;
;
; //
; // Stack state information.
; //
;
; CHAR StackCount;
; CHAR CurrentLocation;
;
; //
; // Cancel - packet has been canceled.
; //
;
; BOOLEAN Cancel;
;
; //
; // Cancel Irql - Irql at which the cancel spinlock was acquired.
; //
;
; KIRQL CancelIrql;
;
; //
; // ApcEnvironment - Used to save the APC environment at the time that the
; // packet was initialized.
; //
;
; CCHAR ApcEnvironment;
;
; //
; // Allocation control flags.
; //
;
; UCHAR AllocationFlags;
;
; //
; // User parameters.
; //
;
; PIO_STATUS_BLOCK UserIosb;
; PKEVENT UserEvent;
; union {
; struct {
; PIO_APC_ROUTINE UserApcRoutine;
; PVOID UserApcContext;
; } AsynchronousParameters;
; LARGE_INTEGER AllocationSize;
; } Overlay;
;
; //
; // CancelRoutine - Used to contain the address of a cancel routine supplied
; // by a device driver when the IRP is in a cancelable state.
; //
;
; PDRIVER_CANCEL CancelRoutine;
;
; //
; // Note that the UserBuffer parameter is outside of the stack so that I/O
; // completion can copy data back into the user's address space without
; // having to know exactly which service was being invoked. The length
; // of the copy is stored in the second half of the I/O status block. If
; // the UserBuffer field is NULL, then no copy is performed.
; //
;
; PVOID UserBuffer;
;
; //
; // Kernel structures
; //
; // The following section contains kernel structures which the IRP needs
; // in order to place various work information in kernel controller system
; // queues. Because the size and alignment cannot be controlled, they are
; // placed here at the end so they just hang off and do not affect the
; // alignment of other fields in the IRP.
; //
;
; union {
;
; struct {
;
; union {
;
; //
; // DeviceQueueEntry - The device queue entry field is used to
; // queue the IRP to the device driver device queue.
; //
;
; KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
;
; struct {
;
; //
; // The following are available to the driver to use in
; // whatever manner is desired, while the driver owns the
; // packet.
; //
;
; PVOID DriverContext[4];
;
; } ;
;
; } ;
;
; //
; // Thread - pointer to caller's Thread Control Block.
; //
;
; PETHREAD Thread;
;
; //
; // Auxiliary buffer - pointer to any auxiliary buffer that is
; // required to pass information to a driver that is not contained
; // in a normal buffer.
; //
;
; PCHAR AuxiliaryBuffer;
;
; //
; // The following unnamed structure must be exactly identical
; // to the unnamed structure used in the minipacket header used
; // for completion queue entries.
; //
;
; struct {
;
; //
; // List entry - used to queue the packet to completion queue, among
; // others.
; //
;
; LIST_ENTRY ListEntry;
;
; union {
;
; //
; // Current stack location - contains a pointer to the current
; // IO_STACK_LOCATION structure in the IRP stack. This field
; // should never be directly accessed by drivers. They should
; // use the standard functions.
; //
;
; struct _IO_STACK_LOCATION *CurrentStackLocation;
;
; //
; // Minipacket type.
; //
;
; ULONG PacketType;
; };
; };
;
; //
; // Original file object - pointer to the original file object
; // that was used to open the file. This field is owned by the
; // I/O system and should not be used by any other drivers.
; //
;
; PFILE_OBJECT OriginalFileObject;
;
; } Overlay;
;
; //
; // APC - This APC control block is used for the special kernel APC as
; // well as for the caller's APC, if one was specified in the original
; // argument list. If so, then the APC is reused for the normal APC for
; // whatever mode the caller was in and the "special" routine that is
; // invoked before the APC gets control simply deallocates the IRP.
; //
;
; KAPC Apc;
;
; //
; // CompletionKey - This is the key that is used to distinguish
; // individual I/O operations initiated on a single file handle.
; //
;
; PVOID CompletionKey;
;
; } Tail;
;
;} IRP, *PIRP;
;
;//
;// Define completion routine types for use in stack locations in an IRP
;//
;
;typedef
;NTSTATUS
;(*PIO_COMPLETION_ROUTINE) (
; IN PDEVICE_OBJECT DeviceObject,
; IN PIRP Irp,
; IN PVOID Context
; );
;
;//
;// Define stack location control flags
;//
;
;#define SL_PENDING_RETURNED 0x01
;#define SL_INVOKE_ON_CANCEL 0x20
;#define SL_INVOKE_ON_SUCCESS 0x40
;#define SL_INVOKE_ON_ERROR 0x80
;
;//
;// Define flags for various functions
;//
;
;//
;// Create / Create Named Pipe
;//
;// The following flags must exactly match those in the IoCreateFile call's
;// options. The case sensitive flag is added in later, by the parse routine,
;// and is not an actual option to open. Rather, it is part of the object
;// manager's attributes structure.
;//
;
;#define SL_FORCE_ACCESS_CHECK 0x01
;#define SL_OPEN_PAGING_FILE 0x02
;#define SL_OPEN_TARGET_DIRECTORY 0x04
;
;#define SL_CASE_SENSITIVE 0x80
;
;//
;// Read / Write
;//
;
;#define SL_KEY_SPECIFIED 0x01
;#define SL_OVERRIDE_VERIFY_VOLUME 0x02
;#define SL_WRITE_THROUGH 0x04
;#define SL_FT_SEQUENTIAL_WRITE 0x08
;
;//
;// Device I/O Control
;//
;//
;// Same SL_OVERRIDE_VERIFY_VOLUME as for read/write above.
;//
;
;//
;// Lock
;//
;
;#define SL_FAIL_IMMEDIATELY 0x01
;#define SL_EXCLUSIVE_LOCK 0x02
;
;//
;// QueryDirectory / QueryEa / QueryQuota
;//
;
;#define SL_RESTART_SCAN 0x01
;#define SL_RETURN_SINGLE_ENTRY 0x02
;#define SL_INDEX_SPECIFIED 0x04
;
;//
;// NotifyDirectory
;//
;
;#define SL_WATCH_TREE 0x01
;
;//
;// FileSystemControl
;//
;// minor: mount/verify volume
;//
;
;#define SL_ALLOW_RAW_MOUNT 0x01
;
;//
;// Define PNP/POWER types required by IRP_MJ_PNP/IRP_MJ_POWER.
;//
;
;typedef enum _DEVICE_RELATION_TYPE {
; BusRelations,
; EjectionRelations,
; PowerRelations,
; RemovalRelations,
; TargetDeviceRelation
;} DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
;
;typedef struct _DEVICE_RELATIONS {
; ULONG Count;
; PDEVICE_OBJECT Objects[1]; // variable length
;} DEVICE_RELATIONS, *PDEVICE_RELATIONS;
;
;typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
; DeviceUsageTypeUndefined,
; DeviceUsageTypePaging,
; DeviceUsageTypeHibernation,
; DeviceUsageTypeDumpFile
;} DEVICE_USAGE_NOTIFICATION_TYPE;
;
;// begin_ntminiport
;
;typedef struct _INTERFACE {
; USHORT Size;
; USHORT Version;
; PVOID Context;
; PINTERFACE_REFERENCE InterfaceReference;
; PINTERFACE_DEREFERENCE InterfaceDereference;
; // interface specific entries go here
;} INTERFACE, *PINTERFACE;
;
;// end_ntminiport
;
;typedef struct _DEVICE_CAPABILITIES {
; USHORT Size;
; USHORT Version; // the version documented here is version 1
; ULONG DeviceD1:1;
; ULONG DeviceD2:1;
; ULONG LockSupported:1;
; ULONG EjectSupported:1; // Ejectable in S0
; ULONG Removable:1;
; ULONG DockDevice:1;
; ULONG UniqueID:1;
; ULONG SilentInstall:1;
; ULONG RawDeviceOK:1;
; ULONG SurpriseRemovalOK:1;
; ULONG WakeFromD0:1;
; ULONG WakeFromD1:1;
; ULONG WakeFromD2:1;
; ULONG WakeFromD3:1;
; ULONG HardwareDisabled:1;
; ULONG NonDynamic:1;
; ULONG WarmEjectSupported:1;
; ULONG NoDisplayInUI:1;
; ULONG Reserved:14;
;
; ULONG Address;
; ULONG UINumber;
;
; DEVICE_POWER_STATE DeviceState[PowerSystemMaximum];
; SYSTEM_POWER_STATE SystemWake;
; DEVICE_POWER_STATE DeviceWake;
; ULONG D1Latency;
; ULONG D2Latency;
; ULONG D3Latency;
;} DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
;
;typedef struct _POWER_SEQUENCE {
; ULONG SequenceD1;
; ULONG SequenceD2;
; ULONG SequenceD3;
;} POWER_SEQUENCE, *PPOWER_SEQUENCE;
;
;typedef enum {
; BusQueryDeviceID = 0, // <Enumerator>\<Enumerator-specific device id>
; BusQueryHardwareIDs = 1, // Hardware ids
; BusQueryCompatibleIDs = 2, // compatible device ids
; BusQueryInstanceID = 3, // persistent id for this instance of the device
; BusQueryDeviceSerialNumber = 4 // serial number for this device
;} BUS_QUERY_ID_TYPE, *PBUS_QUERY_ID_TYPE;
;
;typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
;
;#define PNP_DEVICE_DISABLED 0x00000001
;#define PNP_DEVICE_DONT_DISPLAY_IN_UI 0x00000002
;#define PNP_DEVICE_FAILED 0x00000004
;#define PNP_DEVICE_REMOVED 0x00000008
;#define PNP_DEVICE_RESOURCE_REQUIREMENTS_CHANGED 0x00000010
;#define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
;
;typedef enum {
; DeviceTextDescription = 0, // DeviceDesc property
; DeviceTextLocationInformation = 1 // DeviceLocation property
;} DEVICE_TEXT_TYPE, *PDEVICE_TEXT_TYPE;
;
;//
;// Define I/O Request Packet (IRP) stack locations
;//
;
;#if !defined(_ALPHA_) && !defined(_IA64_)
;#include "pshpack4.h"
;#endif
;
;#if defined(_WIN64)
;#define POINTER_ALIGNMENT DECLSPEC_ALIGN(8)
;#else
;#define POINTER_ALIGNMENT
;#endif
;
;typedef struct _IO_STACK_LOCATION {
; UCHAR MajorFunction;
; UCHAR MinorFunction;
; UCHAR Flags;
; UCHAR Control;
;
; //
; // The following user parameters are based on the service that is being
; // invoked. Drivers and file systems can determine which set to use based
; // on the above major and minor function codes.
; //
;
; union {
;
; //
; // System service parameters for: NtCreateFile
; //
;
; struct {
; PIO_SECURITY_CONTEXT SecurityContext;
; ULONG Options;
; USHORT POINTER_ALIGNMENT FileAttributes;
; USHORT ShareAccess;
; ULONG POINTER_ALIGNMENT EaLength;
; } Create;
;
;
; //
; // System service parameters for: NtReadFile
; //
;
; struct {
; ULONG Length;
; ULONG POINTER_ALIGNMENT Key;
; LARGE_INTEGER ByteOffset;
; } Read;
;
; //
; // System service parameters for: NtWriteFile
; //
;
; struct {
; ULONG Length;
; ULONG POINTER_ALIGNMENT Key;
; LARGE_INTEGER ByteOffset;
; } Write;
;
;
; //
; // System service parameters for: NtQueryInformationFile
; //
;
; struct {
; ULONG Length;
; FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
; } QueryFile;
;
; //
; // System service parameters for: NtSetInformationFile
; //
;
; struct {
; ULONG Length;
; FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
; PFILE_OBJECT FileObject;
; union {
; struct {
; BOOLEAN ReplaceIfExists;
; BOOLEAN AdvanceOnly;
; };
; ULONG ClusterCount;
; HANDLE DeleteHandle;
; };
; } SetFile;
;
;
; //
; // System service parameters for: NtQueryVolumeInformationFile
; //
;
; struct {
; ULONG Length;
; FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
; } QueryVolume;
;
;
; //
; // System service parameters for: NtFlushBuffersFile
; //
; // No extra user-supplied parameters.
; //
;
;
; //
; // System service parameters for: NtDeviceIoControlFile
; //
; // Note that the user's output buffer is stored in the UserBuffer field
; // and the user's input buffer is stored in the SystemBuffer field.
; //
;
; struct {
; ULONG OutputBufferLength;
; ULONG POINTER_ALIGNMENT InputBufferLength;
; ULONG POINTER_ALIGNMENT IoControlCode;
; PVOID Type3InputBuffer;
; } DeviceIoControl;
;
;// end_wdm
; //
; // System service parameters for: NtQuerySecurityObject
; //
;
; struct {
; SECURITY_INFORMATION SecurityInformation;
; ULONG POINTER_ALIGNMENT Length;
; } QuerySecurity;
;
; //
; // System service parameters for: NtSetSecurityObject
; //
;
; struct {
; SECURITY_INFORMATION SecurityInformation;
; PSECURITY_DESCRIPTOR SecurityDescriptor;
; } SetSecurity;
;
;// begin_wdm
; //
; // Non-system service parameters.
; //
; // Parameters for MountVolume
; //
;
; struct {
; PVPB Vpb;
; PDEVICE_OBJECT DeviceObject;
; } MountVolume;
;
; //
; // Parameters for VerifyVolume
; //
;
; struct {
; PVPB Vpb;
; PDEVICE_OBJECT DeviceObject;
; } VerifyVolume;
;
; //
; // Parameters for Scsi with internal device contorl.
; //
;
; struct {
; struct _SCSI_REQUEST_BLOCK *Srb;
; } Scsi;
;
;
; //
; // Parameters for IRP_MN_QUERY_DEVICE_RELATIONS
; //
;
; struct {
; DEVICE_RELATION_TYPE Type;
; } QueryDeviceRelations;
;
; //
; // Parameters for IRP_MN_QUERY_INTERFACE
; //
;
; struct {
; CONST GUID *InterfaceType;
; USHORT Size;
; USHORT Version;
; PINTERFACE Interface;
; PVOID InterfaceSpecificData;
; } QueryInterface;
;
;// end_ntifs
;
; //
; // Parameters for IRP_MN_QUERY_CAPABILITIES
; //
;
; struct {
; PDEVICE_CAPABILITIES Capabilities;
; } DeviceCapabilities;
;
; //
; // Parameters for IRP_MN_FILTER_RESOURCE_REQUIREMENTS
; //
;
; struct {
; PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
; } FilterResourceRequirements;
;
; //
; // Parameters for IRP_MN_READ_CONFIG and IRP_MN_WRITE_CONFIG
; //
;
; struct {
; ULONG WhichSpace;
; PVOID Buffer;
; ULONG Offset;
; ULONG POINTER_ALIGNMENT Length;
; } ReadWriteConfig;
;
; //
; // Parameters for IRP_MN_SET_LOCK
; //
;
; struct {
; BOOLEAN Lock;
; } SetLock;
;
; //
; // Parameters for IRP_MN_QUERY_ID
; //
;
; struct {
; BUS_QUERY_ID_TYPE IdType;
; } QueryId;
;
; //
; // Parameters for IRP_MN_QUERY_DEVICE_TEXT
; //
;
; struct {
; DEVICE_TEXT_TYPE DeviceTextType;
; LCID POINTER_ALIGNMENT LocaleId;
; } QueryDeviceText;
;
; //
; // Parameters for IRP_MN_DEVICE_USAGE_NOTIFICATION
; //
;
; struct {
; BOOLEAN InPath;
; BOOLEAN Reserved[3];
; DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
; } UsageNotification;
;
; //
; // Parameters for IRP_MN_WAIT_WAKE
; //
;
; struct {
; SYSTEM_POWER_STATE PowerState;
; } WaitWake;
;
; //
; // Parameter for IRP_MN_POWER_SEQUENCE
; //
;
; struct {
; PPOWER_SEQUENCE PowerSequence;
; } PowerSequence;
;
; //
; // Parameters for IRP_MN_SET_POWER and IRP_MN_QUERY_POWER
; //
;
; struct {
; ULONG SystemContext;
; POWER_STATE_TYPE POINTER_ALIGNMENT Type;
; POWER_STATE POINTER_ALIGNMENT State;
; POWER_ACTION POINTER_ALIGNMENT ShutdownType;
; } Power;
;
; //
; // Parameters for StartDevice
; //
;
; struct {
; PCM_RESOURCE_LIST AllocatedResources;
; PCM_RESOURCE_LIST AllocatedResourcesTranslated;
; } StartDevice;
;
;// begin_ntifs
; //
; // Parameters for Cleanup
; //
; // No extra parameters supplied
; //
;
; //
; // WMI Irps
; //
;
; struct {
; ULONG_PTR ProviderId;
; PVOID DataPath;
; ULONG BufferSize;
; PVOID Buffer;
; } WMI;
;
; //
; // Others - driver-specific
; //
;
; struct {
; PVOID Argument1;
; PVOID Argument2;
; PVOID Argument3;
; PVOID Argument4;
; } Others;
;
; } Parameters;
;
; //
; // Save a pointer to this device driver's device object for this request
; // so it can be passed to the completion routine if needed.
; //
;
; PDEVICE_OBJECT DeviceObject;
;
; //
; // The following location contains a pointer to the file object for this
; //
;
; PFILE_OBJECT FileObject;
;
; //
; // The following routine is invoked depending on the flags in the above
; // flags field.
; //
;
; PIO_COMPLETION_ROUTINE CompletionRoutine;
;
; //
; // The following is used to store the address of the context parameter
; // that should be passed to the CompletionRoutine.
; //
;
; PVOID Context;
;
;} IO_STACK_LOCATION, *PIO_STACK_LOCATION;
;#if !defined(_ALPHA_) && !defined(_IA64_)
;#include "poppack.h"
;#endif
;
;//
;// Define the share access structure used by file systems to determine
;// whether or not another accessor may open the file.
;//
;
;typedef struct _SHARE_ACCESS {
; ULONG OpenCount;
; ULONG Readers;
; ULONG Writers;
; ULONG Deleters;
; ULONG SharedRead;
; ULONG SharedWrite;
; ULONG SharedDelete;
;} SHARE_ACCESS, *PSHARE_ACCESS;
;
;// end_wdm
;
;//
;// The following structure is used by drivers that are initializing to
;// determine the number of devices of a particular type that have already
;// been initialized. It is also used to track whether or not the AtDisk
;// address range has already been claimed. Finally, it is used by the
;// NtQuerySystemInformation system service to return device type counts.
;//
;
;typedef struct _CONFIGURATION_INFORMATION {
;
; //
; // This field indicates the total number of disks in the system. This
; // number should be used by the driver to determine the name of new
; // disks. This field should be updated by the driver as it finds new
; // disks.
; //
;
; ULONG DiskCount; // Count of hard disks thus far
; ULONG FloppyCount; // Count of floppy disks thus far
; ULONG CdRomCount; // Count of CD-ROM drives thus far
; ULONG TapeCount; // Count of tape drives thus far
; ULONG ScsiPortCount; // Count of SCSI port adapters thus far
; ULONG SerialCount; // Count of serial devices thus far
; ULONG ParallelCount; // Count of parallel devices thus far
;
; //
; // These next two fields indicate ownership of one of the two IO address
; // spaces that are used by WD1003-compatable disk controllers.
; //
;
; BOOLEAN AtDiskPrimaryAddressClaimed; // 0x1F0 - 0x1FF
; BOOLEAN AtDiskSecondaryAddressClaimed; // 0x170 - 0x17F
;
; //
; // Indicates the structure version, as anything value belong this will have been added.
; // Use the structure size as the version.
; //
;
; ULONG Version;
;
; //
; // Indicates the total number of medium changer devices in the system.
; // This field will be updated by the drivers as it determines that
; // new devices have been found and will be supported.
; //
;
; ULONG MediumChangerCount;
;
;} CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
;
;//
;// Public I/O routine definitions
;//
;
;NTKERNELAPI
;VOID
;IoAcquireCancelSpinLock(
; OUT PKIRQL Irql
; );
;
;
;NTKERNELAPI
;NTSTATUS
;IoAllocateAdapterChannel(
; IN PADAPTER_OBJECT AdapterObject,
; IN PDEVICE_OBJECT DeviceObject,
; IN ULONG NumberOfMapRegisters,
; IN PDRIVER_CONTROL ExecutionRoutine,
; IN PVOID Context
; );
;
;NTKERNELAPI
;VOID
;IoAllocateController(
; IN PCONTROLLER_OBJECT ControllerObject,
; IN PDEVICE_OBJECT DeviceObject,
; IN PDRIVER_CONTROL ExecutionRoutine,
; IN PVOID Context
; );
;
;// begin_wdm
;
;NTKERNELAPI
;NTSTATUS
;IoAllocateDriverObjectExtension(
; IN PDRIVER_OBJECT DriverObject,
; IN PVOID ClientIdentificationAddress,
; IN ULONG DriverObjectExtensionSize,
; OUT PVOID *DriverObjectExtension
; );
;
;// begin_ntifs
;
;NTKERNELAPI
;PVOID
;IoAllocateErrorLogEntry(
; IN PVOID IoObject,
; IN UCHAR EntrySize
; );
;
;NTKERNELAPI
;PIRP
;IoAllocateIrp(
; IN CCHAR StackSize,
; IN BOOLEAN ChargeQuota
; );
;
;NTKERNELAPI
;PMDL
;IoAllocateMdl(
; IN PVOID VirtualAddress,
; IN ULONG Length,
; IN BOOLEAN SecondaryBuffer,
; IN BOOLEAN ChargeQuota,
; IN OUT PIRP Irp OPTIONAL
; );
;
;// end_wdm end_ntifs
;//++
;//
;// VOID
;// IoAssignArcName(
;// IN PUNICODE_STRING ArcName,
;// IN PUNICODE_STRING DeviceName
;// )
;//
;// Routine Description:
;//
;// This routine is invoked by drivers of bootable media to create a symbolic
;// link between the ARC name of their device and its NT name. This allows
;// the system to determine which device in the system was actually booted
;// from since the ARC firmware only deals in ARC names, and NT only deals
;// in NT names.
;//
;// Arguments:
;//
;// ArcName - Supplies the Unicode string representing the ARC name.
;//
;// DeviceName - Supplies the name to which the ARCname refers.
;//
;// Return Value:
;//
;// None.
;//
;//--
;
;#define IoAssignArcName( ArcName, DeviceName ) ( \
; IoCreateSymbolicLink( (ArcName), (DeviceName) ) )
;
;NTKERNELAPI
;NTSTATUS
;IoAssignResources (
; IN PUNICODE_STRING RegistryPath,
; IN PUNICODE_STRING DriverClassName OPTIONAL,
; IN PDRIVER_OBJECT DriverObject,
; IN PDEVICE_OBJECT DeviceObject OPTIONAL,
; IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources,
; IN OUT PCM_RESOURCE_LIST *AllocatedResources
; );
;
;
;NTKERNELAPI
;NTSTATUS
;IoAttachDevice(
; IN PDEVICE_OBJECT SourceDevice,
; IN PUNICODE_STRING TargetDevice,
; OUT PDEVICE_OBJECT *AttachedDevice
; );
;
;// end_wdm
;
;NTKERNELAPI
;NTSTATUS
;IoAttachDeviceByPointer(
; IN PDEVICE_OBJECT SourceDevice,
; IN PDEVICE_OBJECT TargetDevice
; );
;
;// begin_wdm
;
;NTKERNELAPI
;PDEVICE_OBJECT
;IoAttachDeviceToDeviceStack(
; IN PDEVICE_OBJECT SourceDevice,
; IN PDEVICE_OBJECT TargetDevice
; );
;
;NTKERNELAPI
;PIRP
;IoBuildAsynchronousFsdRequest(
; IN ULONG MajorFunction,
; IN PDEVICE_OBJECT DeviceObject,
; IN OUT PVOID Buffer OPTIONAL,
; IN ULONG Length OPTIONAL,
; IN PLARGE_INTEGER StartingOffset OPTIONAL,
; IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL
; );
;
;NTKERNELAPI
;PIRP
;IoBuildDeviceIoControlRequest(
; IN ULONG IoControlCode,
; IN PDEVICE_OBJECT DeviceObject,
; IN PVOID InputBuffer OPTIONAL,
; IN ULONG InputBufferLength,
; OUT PVOID OutputBuffer OPTIONAL,
; IN ULONG OutputBufferLength,
; IN BOOLEAN InternalDeviceIoControl,
; IN PKEVENT Event,
; OUT PIO_STATUS_BLOCK IoStatusBlock
; );
;
;NTKERNELAPI
;VOID
;IoBuildPartialMdl(
; IN PMDL SourceMdl,
; IN OUT PMDL TargetMdl,
; IN PVOID VirtualAddress,
; IN ULONG Length
; );
;
;typedef struct _BOOTDISK_INFORMATION {
; LONGLONG BootPartitionOffset;
; LONGLONG SystemPartitionOffset;
; ULONG BootDeviceSignature;
; ULONG SystemDeviceSignature;
;} BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
;
;NTKERNELAPI
;NTSTATUS
;IoGetBootDiskInformation(
; IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
; IN ULONG Size
; );
;
;
;NTKERNELAPI
;PIRP
;IoBuildSynchronousFsdRequest(
; IN ULONG MajorFunction,
; IN PDEVICE_OBJECT DeviceObject,
; IN OUT PVOID Buffer OPTIONAL,
; IN ULONG Length OPTIONAL,
; IN PLARGE_INTEGER StartingOffset OPTIONAL,
; IN PKEVENT Event,
; OUT PIO_STATUS_BLOCK IoStatusBlock
; );
;
;NTKERNELAPI
;NTSTATUS
;FASTCALL
;IofCallDriver(
; IN PDEVICE_OBJECT DeviceObject,
; IN OUT PIRP Irp
; );
;
;#define IoCallDriver(a,b) \
; IofCallDriver(a,b)
;
;NTKERNELAPI
;BOOLEAN
;IoCancelIrp(
; IN PIRP Irp
; );
;
;
;NTKERNELAPI
;NTSTATUS
;IoCheckShareAccess(
; IN ACCESS_MASK DesiredAccess,
; IN ULONG DesiredShareAccess,
; IN OUT PFILE_OBJECT FileObject,
; IN OUT PSHARE_ACCESS ShareAccess,
; IN BOOLEAN Update
; );
;
;NTKERNELAPI
;VOID
;FASTCALL
;IofCompleteRequest(
; IN PIRP Irp,
; IN CCHAR PriorityBoost
; );
;
;#define IoCompleteRequest(a,b) \
; IofCompleteRequest(a,b)
;
;// end_ntifs
;
;NTKERNELAPI
;NTSTATUS
;IoConnectInterrupt(
; OUT PKINTERRUPT *InterruptObject,
; IN PKSERVICE_ROUTINE ServiceRoutine,
; IN PVOID ServiceContext,
; IN PKSPIN_LOCK SpinLock OPTIONAL,
; IN ULONG Vector,
; IN KIRQL Irql,
; IN KIRQL SynchronizeIrql,
; IN KINTERRUPT_MODE InterruptMode,
; IN BOOLEAN ShareVector,
; IN KAFFINITY ProcessorEnableMask,
; IN BOOLEAN FloatingSave
; );
;
;// end_wdm
;
;NTKERNELAPI
;PCONTROLLER_OBJECT
;IoCreateController(
; IN ULONG Size
; );
;
;// begin_wdm begin_ntifs
;
;NTKERNELAPI
;NTSTATUS
;IoCreateDevice(
; IN PDRIVER_OBJECT DriverObject,
; IN ULONG DeviceExtensionSize,
; IN PUNICODE_STRING DeviceName OPTIONAL,
; IN DEVICE_TYPE DeviceType,
; IN ULONG DeviceCharacteristics,
; IN BOOLEAN Exclusive,
; OUT PDEVICE_OBJECT *DeviceObject
; );
;
;#define WDM_MAJORVERSION 0x01
;#define WDM_MINORVERSION 0x10
;
;NTKERNELAPI
;BOOLEAN
;IoIsWdmVersionAvailable(
; IN UCHAR MajorVersion,
; IN UCHAR MinorVersion
; );
;
;// end_nthal
;
;NTKERNELAPI
;NTSTATUS
;IoCreateFile(
; 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 ExtraCreateParameters OPTIONAL,
; IN ULONG Options
; );
;
;
;NTKERNELAPI
;PKEVENT
;IoCreateNotificationEvent(
; IN PUNICODE_STRING EventName,
; OUT PHANDLE EventHandle
; );
;
;NTKERNELAPI
;NTSTATUS
;IoCreateSymbolicLink(
; IN PUNICODE_STRING SymbolicLinkName,
; IN PUNICODE_STRING DeviceName
; );
;
;// end_wdm
;
;NTKERNELAPI
;PKEVENT
;IoCreateSynchronizationEvent(
; IN PUNICODE_STRING EventName,
; OUT PHANDLE EventHandle
; );
;
;// begin_wdm
;
;NTKERNELAPI
;NTSTATUS
;IoCreateUnprotectedSymbolicLink(
; IN PUNICODE_STRING SymbolicLinkName,
; IN PUNICODE_STRING DeviceName
; );
;
;// end_wdm
;
;//++
;//
;// VOID
;// IoDeassignArcName(
;// IN PUNICODE_STRING ArcName
;// )
;//
;// Routine Description:
;//
;// This routine is invoked by drivers to deassign an ARC name that they
;// created to a device. This is generally only called if the driver is
;// deleting the device object, which means that the driver is probably
;// unloading.
;//
;// Arguments:
;//
;// ArcName - Supplies the ARC name to be removed.
;//
;// Return Value:
;//
;// None.
;//
;//--
;
;#define IoDeassignArcName( ArcName ) ( \
; IoDeleteSymbolicLink( (ArcName) ) )
;
;// end_ntifs
;
;NTKERNELAPI
;VOID
;IoDeleteController(
; IN PCONTROLLER_OBJECT ControllerObject
; );
;
;// begin_wdm begin_ntifs
;
;NTKERNELAPI
;VOID
;IoDeleteDevice(
; IN PDEVICE_OBJECT DeviceObject
; );
;
;NTKERNELAPI
;NTSTATUS
;IoDeleteSymbolicLink(
; IN PUNICODE_STRING SymbolicLinkName
; );
;
;NTKERNELAPI
;VOID
;IoDetachDevice(
; IN OUT PDEVICE_OBJECT TargetDevice
; );
;
;// end_ntifs
;
;NTKERNELAPI
;VOID
;IoDisconnectInterrupt(
; IN PKINTERRUPT InterruptObject
; );
;
;
;NTKERNELAPI
;VOID
;IoFreeController(
; IN PCONTROLLER_OBJECT ControllerObject
; );
;
;// begin_wdm begin_ntifs
;
;NTKERNELAPI
;VOID
;IoFreeIrp(
; IN PIRP Irp
; );
;
;NTKERNELAPI
;VOID
;IoFreeMdl(
; IN PMDL Mdl
; );
;
;NTKERNELAPI
;PDEVICE_OBJECT
;IoGetAttachedDeviceReference(
; IN PDEVICE_OBJECT DeviceObject
; );
;
;NTKERNELAPI
;PCONFIGURATION_INFORMATION
;IoGetConfigurationInformation( VOID );
;
;//++
;//
;// PIO_STACK_LOCATION
;// IoGetCurrentIrpStackLocation(
;// IN PIRP Irp
;// )
;//
;// Routine Description:
;//
;// This routine is invoked to return a pointer to the current stack location
;// in an I/O Request Packet (IRP).
;//
;// Arguments:
;//
;// Irp - Pointer to the I/O Request Packet.
;//
;// Return Value:
;//
;// The function value is a pointer to the current stack location in the
;// packet.
;//
;//--
;
;#define IoGetCurrentIrpStackLocation( Irp ) ( (Irp)->Tail.Overlay.CurrentStackLocation )
;
;// end_nthal end_wdm
;
;NTKERNELAPI
;PDEVICE_OBJECT
;IoGetDeviceToVerify(
; IN PETHREAD Thread
; );
;
;// begin_wdm
;
;NTKERNELAPI
;PVOID
;IoGetDriverObjectExtension(
; IN PDRIVER_OBJECT DriverObject,
; IN PVOID ClientIdentificationAddress
; );
;
;NTKERNELAPI
;PEPROCESS
;IoGetCurrentProcess(
; VOID
; );
;
;// begin_nthal
;
;NTKERNELAPI
;NTSTATUS
;IoGetDeviceObjectPointer(
; IN PUNICODE_STRING ObjectName,
; IN ACCESS_MASK DesiredAccess,
; OUT PFILE_OBJECT *FileObject,
; OUT PDEVICE_OBJECT *DeviceObject
; );
;
;NTKERNELAPI
;struct _DMA_ADAPTER *
;IoGetDmaAdapter(
; IN PDEVICE_OBJECT PhysicalDeviceObject, OPTIONAL // required for PnP drivers
; IN struct _DEVICE_DESCRIPTION *DeviceDescription,
; IN OUT PULONG NumberOfMapRegisters
; );
;
;// end_wdm
;
;NTKERNELAPI
;PGENERIC_MAPPING
;IoGetFileObjectGenericMapping(
; VOID
; );
;
;// end_nthal
;
;
;// begin_wdm
;
;//++
;//
;// ULONG
;// IoGetFunctionCodeFromCtlCode(
;// IN ULONG ControlCode
;// )
;//
;// Routine Description:
;//
;// This routine extracts the function code from IOCTL and FSCTL function
;// control codes.
;// This routine should only be used by kernel mode code.
;//
;// Arguments:
;//
;// ControlCode - A function control code (IOCTL or FSCTL) from which the
;// function code must be extracted.
;//
;// Return Value:
;//
;// The extracted function code.
;//
;// Note:
;//
;// The CTL_CODE macro, used to create IOCTL and FSCTL function control
;// codes, is defined in ntioapi.h
;//
;//--
;
;#define IoGetFunctionCodeFromCtlCode( ControlCode ) (\
; ( ControlCode >> 2) & 0x00000FFF )
;
;// begin_nthal end_wdm
;
;NTKERNELAPI
;PVOID
;IoGetInitialStack(
; VOID
; );
;
;NTKERNELAPI
;VOID
;IoGetStackLimits (
; OUT PULONG_PTR LowLimit,
; OUT PULONG_PTR HighLimit
; );
;
;
;//
;// The following function is used to tell the caller how much stack is available
;//
;
;__inline
;ULONG_PTR
;IoGetRemainingStackSize (
; VOID
; )
;{
; ULONG_PTR Top;
; ULONG_PTR Bottom;
;
; IoGetStackLimits( &Bottom, &Top );
; return((ULONG_PTR)(&Top) - Bottom );
;}
;
;// begin_wdm
;
;//++
;//
;// PIO_STACK_LOCATION
;// IoGetNextIrpStackLocation(
;// IN PIRP Irp
;// )
;//
;// Routine Description:
;//
;// This routine is invoked to return a pointer to the next stack location
;// in an I/O Request Packet (IRP).
;//
;// Arguments:
;//
;// Irp - Pointer to the I/O Request Packet.
;//
;// Return Value:
;//
;// The function value is a pointer to the next stack location in the packet.
;//
;//--
;
;#define IoGetNextIrpStackLocation( Irp ) (\
; (Irp)->Tail.Overlay.CurrentStackLocation - 1 )
;
;NTKERNELAPI
;PDEVICE_OBJECT
;IoGetRelatedDeviceObject(
; IN PFILE_OBJECT FileObject
; );
;
;
;//++
;//
;// VOID
;// IoInitializeDpcRequest(
;// IN PDEVICE_OBJECT DeviceObject,
;// IN PIO_DPC_ROUTINE DpcRoutine
;// )
;//
;// Routine Description:
;//
;// This routine is invoked to initialize the DPC in a device object for a
;// device driver during its initialization routine. The DPC is used later
;// when the driver interrupt service routine requests that a DPC routine
;// be queued for later execution.
;//
;// Arguments:
;//
;// DeviceObject - Pointer to the device object that the request is for.
;//
;// DpcRoutine - Address of the driver's DPC routine to be executed when
;// the DPC is dequeued for processing.
;//
;// Return Value:
;//
;// None.
;//
;//--
;
;#define IoInitializeDpcRequest( DeviceObject, DpcRoutine ) (\
; KeInitializeDpc( &(DeviceObject)->Dpc, \
; (PKDEFERRED_ROUTINE) (DpcRoutine), \
; (DeviceObject) ) )
;
;NTKERNELAPI
;VOID
;IoInitializeIrp(
; IN OUT PIRP Irp,
; IN USHORT PacketSize,
; IN CCHAR StackSize
; );
;
;NTKERNELAPI
;NTSTATUS
;IoInitializeTimer(
; IN PDEVICE_OBJECT DeviceObject,
; IN PIO_TIMER_ROUTINE TimerRoutine,
; IN PVOID Context
; );
;
;
;NTKERNELAPI
;VOID
;IoReuseIrp(
; IN OUT PIRP Irp,
; IN NTSTATUS Iostatus
; );
;
;
;NTKERNELAPI
;VOID
;IoCancelFileOpen(
; IN PDEVICE_OBJECT DeviceObject,
; IN PFILE_OBJECT FileObject
; );
;
;//++
;//
;// BOOLEAN
;// IoIsErrorUserInduced(
;// IN NTSTATUS Status
;// )
;//
;// Routine Description:
;//
;// This routine is invoked to determine if an error was as a
;// result of user actions. Typically these error are related
;// to removable media and will result in a pop-up.
;//
;// Arguments:
;//
;// Status - The status value to check.
;//
;// Return Value:
;// The function value is TRUE if the user induced the error,
;// otherwise FALSE is returned.
;//
;//--
;#define IoIsErrorUserInduced( Status ) ((BOOLEAN) \
; (((Status) == STATUS_DEVICE_NOT_READY) || \
; ((Status) == STATUS_IO_TIMEOUT) || \
; ((Status) == STATUS_MEDIA_WRITE_PROTECTED) || \
; ((Status) == STATUS_NO_MEDIA_IN_DEVICE) || \
; ((Status) == STATUS_VERIFY_REQUIRED) || \
; ((Status) == STATUS_UNRECOGNIZED_MEDIA) || \
; ((Status) == STATUS_WRONG_VOLUME)))
;
;
;NTKERNELAPI
;PIRP
;IoMakeAssociatedIrp(
; IN PIRP Irp,
; IN CCHAR StackSize
; );
;
;// begin_wdm
;
;//++
;//
;// VOID
;// IoMarkIrpPending(
;// IN OUT PIRP Irp
;// )
;//
;// Routine Description:
;//
;// This routine marks the specified I/O Request Packet (IRP) to indicate
;// that an initial status of STATUS_PENDING was returned to the caller.
;// This is used so that I/O completion can determine whether or not to
;// fully complete the I/O operation requested by the packet.
;//
;// Arguments:
;//
;// Irp - Pointer to the I/O Request Packet to be marked pending.
;//
;// Return Value:
;//
;// None.
;//
;//--
;
;#define IoMarkIrpPending( Irp ) ( \
; IoGetCurrentIrpStackLocation( (Irp) )->Control |= SL_PENDING_RETURNED )
;
;NTKERNELAPI
;NTSTATUS
;IoQueryDeviceDescription(
; IN PINTERFACE_TYPE BusType OPTIONAL,
; IN PULONG BusNumber OPTIONAL,
; IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
; IN PULONG ControllerNumber OPTIONAL,
; IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
; IN PULONG PeripheralNumber OPTIONAL,
; IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
; IN PVOID Context
; );
;
;NTKERNELAPI
;VOID
;IoRaiseHardError(
; IN PIRP Irp,
; IN PVPB Vpb OPTIONAL,
; IN PDEVICE_OBJECT RealDeviceObject
; );
;
;NTKERNELAPI
;BOOLEAN
;IoRaiseInformationalHardError(
; IN NTSTATUS ErrorStatus,
; IN PUNICODE_STRING String OPTIONAL,
; IN PKTHREAD Thread OPTIONAL
; );
;
;NTKERNELAPI
;BOOLEAN
;IoSetThreadHardErrorMode(
; IN BOOLEAN EnableHardErrors
; );
;
;NTKERNELAPI
;VOID
;IoRegisterBootDriverReinitialization(
; IN PDRIVER_OBJECT DriverObject,
; IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
; IN PVOID Context
; );
;
;NTKERNELAPI
;VOID
;IoRegisterDriverReinitialization(
; IN PDRIVER_OBJECT DriverObject,
; IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
; IN PVOID Context
; );
;
;
;NTKERNELAPI
;NTSTATUS
;IoRegisterShutdownNotification(
; IN PDEVICE_OBJECT DeviceObject
; );
;
;NTKERNELAPI
;NTSTATUS
;IoRegisterLastChanceShutdownNotification(
; IN PDEVICE_OBJECT DeviceObject
; );
;
;// begin_wdm
;
;NTKERNELAPI
;VOID
;IoReleaseCancelSpinLock(
; IN KIRQL Irql
; );
;
;
;NTKERNELAPI
;VOID
;IoRemoveShareAccess(
; IN PFILE_OBJECT FileObject,
; IN OUT PSHARE_ACCESS ShareAccess
; );
;
;
;NTKERNELAPI
;NTSTATUS
;IoReportResourceUsage(
; IN PUNICODE_STRING DriverClassName OPTIONAL,
; IN PDRIVER_OBJECT DriverObject,
; IN PCM_RESOURCE_LIST DriverList OPTIONAL,
; IN ULONG DriverListSize OPTIONAL,
; IN PDEVICE_OBJECT DeviceObject,
; IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
; IN ULONG DeviceListSize OPTIONAL,
; IN BOOLEAN OverrideConflict,
; OUT PBOOLEAN ConflictDetected
; );
;
;// begin_wdm
;
;//++
;//
;// VOID
;// IoRequestDpc(
;// IN PDEVICE_OBJECT DeviceObject,
;// IN PIRP Irp,
;// IN PVOID Context
;// )
;//
;// Routine Description:
;//
;// This routine is invoked by the device driver's interrupt service routine
;// to request that a DPC routine be queued for later execution at a lower
;// IRQL.
;//
;// Arguments:
;//
;// DeviceObject - Device object for which the request is being processed.
;//
;// Irp - Pointer to the current I/O Request Packet (IRP) for the specified
;// device.
;//
;// Context - Provides a general context parameter to be passed to the
;// DPC routine.
;//
;// Return Value:
;//
;// None.
;//
;//--
;
;#define IoRequestDpc( DeviceObject, Irp, Context ) ( \
; KeInsertQueueDpc( &(DeviceObject)->Dpc, (Irp), (Context) ) )
;
;//++
;//
;// PDRIVER_CANCEL
;// IoSetCancelRoutine(
;// IN PIRP Irp,
;// IN PDRIVER_CANCEL CancelRoutine
;// )
;//
;// Routine Description:
;//
;// This routine is invoked to set the address of a cancel routine which
;// is to be invoked when an I/O packet has been canceled.
;//
;// Arguments:
;//
;// Irp - Pointer to the I/O Request Packet itself.
;//
;// CancelRoutine - Address of the cancel routine that is to be invoked
;// if the IRP is cancelled.
;//
;// Return Value:
;//
;// Previous value of CancelRoutine field in the IRP.
;//
;//--
;
;#define IoSetCancelRoutine( Irp, NewCancelRoutine ) ( \
; (PDRIVER_CANCEL) InterlockedExchangePointer( (PVOID *) &(Irp)->CancelRoutine, (PVOID) (NewCancelRoutine) ) )
;
;//++
;//
;// VOID
;// IoSetCompletionRoutine(
;// IN PIRP Irp,
;// IN PIO_COMPLETION_ROUTINE CompletionRoutine,
;// IN PVOID Context,
;// IN BOOLEAN InvokeOnSuccess,
;// IN BOOLEAN InvokeOnError,
;// IN BOOLEAN InvokeOnCancel
;// )
;//
;// Routine Description:
;//
;// This routine is invoked to set the address of a completion routine which
;// is to be invoked when an I/O packet has been completed by a lower-level
;// driver.
;//
;// Arguments:
;//
;// Irp - Pointer to the I/O Request Packet itself.
;//
;// CompletionRoutine - Address of the completion routine that is to be
;// invoked once the next level driver completes the packet.
;//
;// Context - Specifies a context parameter to be passed to the completion
;// routine.
;//
;// InvokeOnSuccess - Specifies that the completion routine is invoked when the
;// operation is successfully completed.
;//
;// InvokeOnError - Specifies that the completion routine is invoked when the
;// operation completes with an error status.
;//
;// InvokeOnCancel - Specifies that the completion routine is invoked when the
;// operation is being canceled.
;//
;// Return Value:
;//
;// None.
;//
;//--
;
;#define IoSetCompletionRoutine( Irp, Routine, CompletionContext, Success, Error, Cancel ) { \
; PIO_STACK_LOCATION irpSp; \
; ASSERT( (Success) | (Error) | (Cancel) ? (Routine) != NULL : TRUE ); \
; irpSp = IoGetNextIrpStackLocation( (Irp) ); \
; irpSp->CompletionRoutine = (Routine); \
; irpSp->Context = (CompletionContext); \
; irpSp->Control = 0; \
; if ((Success)) { irpSp->Control = SL_INVOKE_ON_SUCCESS; } \
; if ((Error)) { irpSp->Control |= SL_INVOKE_ON_ERROR; } \
; if ((Cancel)) { irpSp->Control |= SL_INVOKE_ON_CANCEL; } }
;
;
;NTKERNELAPI
;VOID
;IoSetHardErrorOrVerifyDevice(
; IN PIRP Irp,
; IN PDEVICE_OBJECT DeviceObject
; );
;
;
;//++
;//
;// VOID
;// IoSetNextIrpStackLocation (
;// IN OUT PIRP Irp
;// )
;//
;// Routine Description:
;//
;// This routine is invoked to set the current IRP stack location to
;// the next stack location, i.e. it "pushes" the stack.
;//
;// Arguments:
;//
;// Irp - Pointer to the I/O Request Packet (IRP).
;//
;// Return Value:
;//
;// None.
;//
;//--
;
;#define IoSetNextIrpStackLocation( Irp ) { \
; (Irp)->CurrentLocation--; \
; (Irp)->Tail.Overlay.CurrentStackLocation--; }
;
;//++
;//
;// VOID
;// IoCopyCurrentIrpStackLocationToNext(
;// IN PIRP Irp
;// )
;//
;// Routine Description:
;//
;// This routine is invoked to copy the IRP stack arguments and file
;// pointer from the current IrpStackLocation to the next
;// in an I/O Request Packet (IRP).
;//
;// If the caller wants to call IoCallDriver with a completion routine
;// but does not wish to change the arguments otherwise,
;// the caller first calls IoCopyCurrentIrpStackLocationToNext,
;// then IoSetCompletionRoutine, then IoCallDriver.
;//
;// Arguments:
;//
;// Irp - Pointer to the I/O Request Packet.
;//
;// Return Value:
;//
;// None.
;//
;//--
;
;#define IoCopyCurrentIrpStackLocationToNext( Irp ) { \
; PIO_STACK_LOCATION irpSp; \
; PIO_STACK_LOCATION nextIrpSp; \
; irpSp = IoGetCurrentIrpStackLocation( (Irp) ); \
; nextIrpSp = IoGetNextIrpStackLocation( (Irp) ); \
; RtlCopyMemory( nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); \
; nextIrpSp->Control = 0; }
;
;//++
;//
;// VOID
;// IoSkipCurrentIrpStackLocation (
;// IN PIRP Irp
;// )
;//
;// Routine Description:
;//
;// This routine is invoked to increment the current stack location of
;// a given IRP.
;//
;// If the caller wishes to call the next driver in a stack, and does not
;// wish to change the arguments, nor does he wish to set a completion
;// routine, then the caller first calls IoSkipCurrentIrpStackLocation
;// and the calls IoCallDriver.
;//
;// Arguments:
;//
;// Irp - Pointer to the I/O Request Packet.
;//
;// Return Value:
;//
;// None
;//
;//--
;
;#define IoSkipCurrentIrpStackLocation( Irp ) \
; (Irp)->CurrentLocation++; \
; (Irp)->Tail.Overlay.CurrentStackLocation++;
;
;
;NTKERNELAPI
;VOID
;IoSetShareAccess(
; IN ACCESS_MASK DesiredAccess,
; IN ULONG DesiredShareAccess,
; IN OUT PFILE_OBJECT FileObject,
; OUT PSHARE_ACCESS ShareAccess
; );
;
;
;
;typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
;
;typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
; BOOLEAN Removed;
; BOOLEAN Reserved [3];
; LONG IoCount;
; KEVENT RemoveEvent;
;
;} IO_REMOVE_LOCK_COMMON_BLOCK;
;
;typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
; LONG Signature;
; LONG HighWatermark;
; LONGLONG MaxLockedTicks;
; LONG AllocateTag;
; LIST_ENTRY LockList;
; KSPIN_LOCK Spin;
; LONG LowMemoryCount;
; ULONG Reserved1[4];
; PVOID Reserved2;
; PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
;} IO_REMOVE_LOCK_DBG_BLOCK;
;
;typedef struct _IO_REMOVE_LOCK {
; IO_REMOVE_LOCK_COMMON_BLOCK Common;
;#if DBG
; IO_REMOVE_LOCK_DBG_BLOCK Dbg;
;#endif
;} IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
;
;#define IoInitializeRemoveLock(Lock, Tag, Maxmin, HighWater) \
; IoInitializeRemoveLockEx (Lock, Tag, Maxmin, HighWater, sizeof (IO_REMOVE_LOCK))
;
;NTSYSAPI
;VOID
;NTAPI
;IoInitializeRemoveLockEx(
; IN PIO_REMOVE_LOCK Lock,
; IN ULONG AllocateTag, // Used only on checked kernels
; IN ULONG MaxLockedMinutes, // Used only on checked kernels
; IN ULONG HighWatermark, // Used only on checked kernels
; IN ULONG RemlockSize // are we checked or free
; );
;//
;// Initialize a remove lock.
;//
;// Note: Allocation for remove locks needs to be within the device extension,
;// so that the memory for this structure stays allocated until such time as the
;// device object itself is deallocated.
;//
;
;#define IoAcquireRemoveLock(RemoveLock, Tag) \
; IoAcquireRemoveLockEx(RemoveLock, Tag, __FILE__, __LINE__, sizeof (IO_REMOVE_LOCK))
;
;NTSYSAPI
;NTSTATUS
;NTAPI
;IoAcquireRemoveLockEx (
; IN PIO_REMOVE_LOCK RemoveLock,
; IN OPTIONAL PVOID Tag, // Optional
; IN PCSTR File,
; IN ULONG Line,
; IN ULONG RemlockSize // are we checked or free
; );
;
;//
;// Routine Description:
;//
;// This routine is called to acquire the remove lock for a device object.
;// While the lock is held, the caller can assume that no pending pnp REMOVE
;// requests will be completed.
;//
;// The lock should be acquired immediately upon entering a dispatch routine.
;// It should also be acquired before creating any new reference to the
;// device object if there's a chance of releasing the reference before the
;// new one is done, in addition to references to the driver code itself,
;// which is removed from memory when the last device object goes.
;//
;// Arguments:
;//
;// RemoveLock - A pointer to an initialized REMOVE_LOCK structure.
;//
;// Tag - Used for tracking lock allocation and release. The same tag
;// specified when acquiring the lock must be used to release the lock.
;// Tags are only checked in checked versions of the driver.
;//
;// File - set to __FILE__ as the location in the code where the lock was taken.
;//
;// Line - set to __LINE__.
;//
;// Return Value:
;//
;// Returns whether or not the remove lock was obtained.
;// If successful the caller should continue with work calling
;// IoReleaseRemoveLock when finished.
;//
;// If not successful the lock was not obtained. The caller should abort the
;// work but not call IoReleaseRemoveLock.
;//
;
;#define IoReleaseRemoveLock(RemoveLock, Tag) \
; IoReleaseRemoveLockEx(RemoveLock, Tag, sizeof (IO_REMOVE_LOCK))
;
;NTSYSAPI
;VOID
;NTAPI
;IoReleaseRemoveLockEx(
; IN PIO_REMOVE_LOCK RemoveLock,
; IN PVOID Tag, // Optional
; IN ULONG RemlockSize // are we checked or free
; );
;//
;//
;// Routine Description:
;//
;// This routine is called to release the remove lock on the device object. It
;// must be called when finished using a previously locked reference to the
;// device object. If an Tag was specified when acquiring the lock then the
;// same Tag must be specified when releasing the lock.
;//
;// When the lock count reduces to zero, this routine will signal the waiting
;// event to release the waiting thread deleting the device object protected
;// by this lock.
;//
;// Arguments:
;//
;// DeviceObject - the device object to lock
;//
;// Tag - The TAG (if any) specified when acquiring the lock. This is used
;// for lock tracking purposes
;//
;// Return Value:
;//
;// none
;//
;
;#define IoReleaseRemoveLockAndWait(RemoveLock, Tag) \
; IoReleaseRemoveLockAndWaitEx(RemoveLock, Tag, sizeof (IO_REMOVE_LOCK))
;
;NTSYSAPI
;VOID
;NTAPI
;IoReleaseRemoveLockAndWaitEx(
; IN PIO_REMOVE_LOCK RemoveLock,
; IN PVOID Tag,
; IN ULONG RemlockSize // are we checked or free
; );
;//
;//
;// Routine Description:
;//
;// This routine is called when the client would like to delete the
;// remove-locked resource. This routine will block until all the remove
;// locks have released.
;//
;// This routine MUST be called after acquiring the lock.
;//
;// Arguments:
;//
;// RemoveLock
;//
;// Return Value:
;//
;// none
;//
;
;
;//++
;//
;// USHORT
;// IoSizeOfIrp(
;// IN CCHAR StackSize
;// )
;//
;// Routine Description:
;//
;// Determines the size of an IRP given the number of stack locations
;// the IRP will have.
;//
;// Arguments:
;//
;// StackSize - Number of stack locations for the IRP.
;//
;// Return Value:
;//
;// Size in bytes of the IRP.
;//
;//--
;
;#define IoSizeOfIrp( StackSize ) \
; ((USHORT) (sizeof( IRP ) + ((StackSize) * (sizeof( IO_STACK_LOCATION )))))
;
;// end_ntifs
;
;
;NTKERNELAPI
;VOID
;IoStartNextPacket(
; IN PDEVICE_OBJECT DeviceObject,
; IN BOOLEAN Cancelable
; );
;
;NTKERNELAPI
;VOID
;IoStartNextPacketByKey(
; IN PDEVICE_OBJECT DeviceObject,
; IN BOOLEAN Cancelable,
; IN ULONG Key
; );
;
;NTKERNELAPI
;VOID
;IoStartPacket(
; IN PDEVICE_OBJECT DeviceObject,
; IN PIRP Irp,
; IN PULONG Key OPTIONAL,
; IN PDRIVER_CANCEL CancelFunction OPTIONAL
; );
;
;// begin_ntifs
;
;NTKERNELAPI
;VOID
;IoStartTimer(
; IN PDEVICE_OBJECT DeviceObject
; );
;
;NTKERNELAPI
;VOID
;IoStopTimer(
; IN PDEVICE_OBJECT DeviceObject
; );
;
;
;NTKERNELAPI
;VOID
;IoUnregisterShutdownNotification(
; IN PDEVICE_OBJECT DeviceObject
; );
;
;// end_wdm
;
;NTKERNELAPI
;VOID
;IoUpdateShareAccess(
; IN PFILE_OBJECT FileObject,
; IN OUT PSHARE_ACCESS ShareAccess
; );
;
;NTKERNELAPI
;VOID
;IoWriteErrorLogEntry(
; IN PVOID ElEntry
; );
;
;typedef struct _IO_WORKITEM *PIO_WORKITEM;
;
;typedef
;VOID
;(*PIO_WORKITEM_ROUTINE) (
; IN PDEVICE_OBJECT DeviceObject,
; IN PVOID Context
; );
;
;PIO_WORKITEM
;IoAllocateWorkItem(
; PDEVICE_OBJECT DeviceObject
; );
;
;VOID
;IoFreeWorkItem(
; PIO_WORKITEM IoWorkItem
; );
;
;VOID
;IoQueueWorkItem(
; IN PIO_WORKITEM IoWorkItem,
; IN PIO_WORKITEM_ROUTINE WorkerRoutine,
; IN WORK_QUEUE_TYPE QueueType,
; IN PVOID Context
; );
;
;// end_ntsrv
;
;// begin_ntifs
;
;NTKERNELAPI
;NTSTATUS
;IoWMIRegistrationControl(
; IN PDEVICE_OBJECT DeviceObject,
; IN ULONG Action
;);
;
;//
;// Action code for IoWMIRetgistrationControl api
;//
;
;#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
;
;//
;// Code passed in IRP_MN_REGINFO WMI irp
;//
;
;#define WMIREGISTER 0
;#define WMIUPDATE 1
;
;NTKERNELAPI
;NTSTATUS
;IoWMIAllocateInstanceIds(
; IN GUID *Guid,
; IN ULONG InstanceCount,
; OUT ULONG *FirstInstanceId
; );
;
;NTKERNELAPI
;NTSTATUS
;IoWMISuggestInstanceName(
; IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
; IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
; IN BOOLEAN CombineNames,
; OUT PUNICODE_STRING SuggestedInstanceName
; );
;
;NTKERNELAPI
;NTSTATUS
;IoWMIWriteEvent(
; IN PVOID WnodeEventItem
; );
;
;#if defined(_WIN64)
;ULONG IoWMIDeviceObjectToProviderId(
; PDEVICE_OBJECT DeviceObject
; );
;#else
;#define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject))
;#endif
;
;
;//
;// Define PnP Device Property for IoGetDeviceProperty
;//
;
;typedef enum {
; DevicePropertyDeviceDescription,
; DevicePropertyHardwareID,
; DevicePropertyCompatibleIDs,
; DevicePropertyBootConfiguration,
; DevicePropertyBootConfigurationTranslated,
; DevicePropertyClassName,
; DevicePropertyClassGuid,
; DevicePropertyDriverKeyName,
; DevicePropertyManufacturer,
; DevicePropertyFriendlyName,
; DevicePropertyLocationInformation,
; DevicePropertyPhysicalDeviceObjectName,
; DevicePropertyBusTypeGuid,
; DevicePropertyLegacyBusType,
; DevicePropertyBusNumber,
; DevicePropertyEnumeratorName,
; DevicePropertyAddress,
; DevicePropertyUINumber
;} DEVICE_REGISTRY_PROPERTY;
;
;typedef BOOLEAN (*PTRANSLATE_BUS_ADDRESS)(
; IN PVOID Context,
; IN PHYSICAL_ADDRESS BusAddress,
; IN ULONG Length,
; IN OUT PULONG AddressSpace,
; OUT PPHYSICAL_ADDRESS TranslatedAddress
; );
;
;typedef struct _DMA_ADAPTER *(*PGET_DMA_ADAPTER)(
; IN PVOID Context,
; IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
; OUT PULONG NumberOfMapRegisters
; );
;
;typedef ULONG (*PGET_SET_DEVICE_DATA)(
; IN PVOID Context,
; IN ULONG DataType,
; IN PVOID Buffer,
; IN ULONG Offset,
; IN ULONG Length
; );
;
;//
;// Define structure returned in response to IRP_MN_QUERY_BUS_INFORMATION by a
;// PDO indicating the type of bus the device exists on.
;//
;
;typedef struct _PNP_BUS_INFORMATION {
; GUID BusTypeGuid;
; INTERFACE_TYPE LegacyBusType;
; ULONG BusNumber;
;} PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;
;
;//
;// Define structure returned in response to IRP_MN_QUERY_LEGACY_BUS_INFORMATION
;// by an FDO indicating the type of bus it is. This is normally the same bus
;// type as the device's children (i.e., as retrieved from the child PDO's via
;// IRP_MN_QUERY_BUS_INFORMATION) except for cases like CardBus, which can
;// support both 16-bit (PCMCIABus) and 32-bit (PCIBus) cards.
;//
;
;typedef struct _LEGACY_BUS_INFORMATION {
; GUID BusTypeGuid;
; INTERFACE_TYPE LegacyBusType;
; ULONG BusNumber;
;} LEGACY_BUS_INFORMATION, *PLEGACY_BUS_INFORMATION;
;
;typedef struct _BUS_INTERFACE_STANDARD {
; //
; // generic interface header
; //
; USHORT Size;
; USHORT Version;
; PVOID Context;
; PINTERFACE_REFERENCE InterfaceReference;
; PINTERFACE_DEREFERENCE InterfaceDereference;
; //
; // standard bus interfaces
; //
; PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
; PGET_DMA_ADAPTER GetDmaAdapter;
; PGET_SET_DEVICE_DATA SetBusData;
; PGET_SET_DEVICE_DATA GetBusData;
;
;} BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
;
;//
;// The following definitions are used in ACPI QueryInterface
;//
;typedef BOOLEAN (* PGPE_SERVICE_ROUTINE) (
; PVOID,
; PVOID);
;
;typedef NTSTATUS (* PGPE_CONNECT_VECTOR) (
; PDEVICE_OBJECT,
; ULONG,
; KINTERRUPT_MODE,
; BOOLEAN,
; PGPE_SERVICE_ROUTINE,
; PVOID,
; PVOID);
;
;typedef NTSTATUS (* PGPE_DISCONNECT_VECTOR) (
; PVOID);
;
;typedef NTSTATUS (* PGPE_ENABLE_EVENT) (
; PDEVICE_OBJECT,
; PVOID);
;
;typedef NTSTATUS (* PGPE_DISABLE_EVENT) (
; PDEVICE_OBJECT,
; PVOID);
;
;typedef NTSTATUS (* PGPE_CLEAR_STATUS) (
; PDEVICE_OBJECT,
; PVOID);
;
;typedef VOID (* PDEVICE_NOTIFY_CALLBACK) (
; PVOID,
; ULONG);
;
;typedef NTSTATUS (* PREGISTER_FOR_DEVICE_NOTIFICATIONS) (
; PDEVICE_OBJECT,
; PDEVICE_NOTIFY_CALLBACK,
; PVOID);
;
;typedef void (* PUNREGISTER_FOR_DEVICE_NOTIFICATIONS) (
; PDEVICE_OBJECT,
; PDEVICE_NOTIFY_CALLBACK);
;
;typedef struct _ACPI_INTERFACE_STANDARD {
; //
; // Generic interface header
; //
; USHORT Size;
; USHORT Version;
; PVOID Context;
; PINTERFACE_REFERENCE InterfaceReference;
; PINTERFACE_DEREFERENCE InterfaceDereference;
; //
; // ACPI interfaces
; //
; 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;
;
;// end_wdm
;
;typedef enum _ACPI_REG_TYPE {
; PM1a_ENABLE,
; PM1b_ENABLE,
; PM1a_STATUS,
; PM1b_STATUS,
; PM1a_CONTROL,
; PM1b_CONTROL,
; GP_STATUS,
; GP_ENABLE,
; SMI_CMD,
; MaxRegType
;} ACPI_REG_TYPE, *PACPI_REG_TYPE;
;
;typedef USHORT (*PREAD_ACPI_REGISTER) (
; IN ACPI_REG_TYPE AcpiReg,
; IN ULONG Register);
;
;typedef VOID (*PWRITE_ACPI_REGISTER) (
; IN ACPI_REG_TYPE AcpiReg,
; IN ULONG Register,
; IN USHORT Value
; );
;
;typedef struct ACPI_REGS_INTERFACE_STANDARD {
; //
; // generic interface header
; //
; USHORT Size;
; USHORT Version;
; PVOID Context;
; PINTERFACE_REFERENCE InterfaceReference;
; PINTERFACE_DEREFERENCE InterfaceDereference;
;
; //
; // READ/WRITE_ACPI_REGISTER functions
; //
; PREAD_ACPI_REGISTER ReadAcpiRegister;
; PWRITE_ACPI_REGISTER WriteAcpiRegister;
;
;} ACPI_REGS_INTERFACE_STANDARD, *PACPI_REGS_INTERFACE_STANDARD;
;
;//
;// These definitions are used for getting PCI Interrupt Routing interfaces
;//
;
;typedef struct {
; PVOID LinkNode;
; ULONG StaticVector;
; UCHAR Flags;
;} ROUTING_TOKEN, *PROUTING_TOKEN;
;
;//
;// Flag indicating that the device supports
;// MSI interrupt routing or that the provided token contains
;// MSI routing information
;//
;
;#define PCI_MSI_ROUTING 0x1
;
;typedef
;NTSTATUS
;(*PGET_INTERRUPT_ROUTING)(
; IN PDEVICE_OBJECT Pdo,
; OUT ULONG *Bus,
; OUT ULONG *PciSlot,
; OUT UCHAR *InterruptLine,
; OUT UCHAR *InterruptPin,
; OUT UCHAR *ClassCode,
; OUT UCHAR *SubClassCode,
; OUT PDEVICE_OBJECT *ParentPdo,
; OUT ROUTING_TOKEN *RoutingToken,
; OUT UCHAR *Flags
; );
;
;typedef
;NTSTATUS
;(*PSET_INTERRUPT_ROUTING_TOKEN)(
; IN PDEVICE_OBJECT Pdo,
; IN PROUTING_TOKEN RoutingToken
; );
;
;typedef
;VOID
;(*PUPDATE_INTERRUPT_LINE)(
; IN PDEVICE_OBJECT Pdo,
; IN UCHAR LineRegister
; );
;
;typedef struct _INT_ROUTE_INTERFACE_STANDARD {
; //
; // generic interface header
; //
; USHORT Size;
; USHORT Version;
; PVOID Context;
; PINTERFACE_REFERENCE InterfaceReference;
; PINTERFACE_DEREFERENCE InterfaceDereference;
; //
; // standard bus interfaces
; //
; PGET_INTERRUPT_ROUTING GetInterruptRouting;
; PSET_INTERRUPT_ROUTING_TOKEN SetInterruptRoutingToken;
; PUPDATE_INTERRUPT_LINE UpdateInterruptLine;
;
;} INT_ROUTE_INTERFACE_STANDARD, *PINT_ROUTE_INTERFACE_STANDARD;
;
;// Some well-known interface versions supported by the PCI Bus Driver
;
;#define PCI_INT_ROUTE_INTRF_STANDARD_VER 1
;
;
;typedef struct _IO_ASSIGNED_RESOURCES {
; ULONG Count;
; PASSIGNED_RESOURCE AssignedResources[1];
;} IO_ASSIGNED_RESOURCES, *PIO_ASSIGNED_RESOURCES;
;
;NTKERNELAPI
;NTSTATUS
;IoGetAssignedResourcesForSuballocation (
; IN INTERFACE_TYPE InterfaceType,
; IN ULONG BusNumber,
; IN ULONG SlotNumber,
; IN PIO_RESOURCE_DESCRIPTOR ResourceDescriptor,
; OUT PIO_ASSIGNED_RESOURCES *List
; );
;
;NTKERNELAPI
;NTSTATUS
;IoReportDetectedDevice(
; IN PDRIVER_OBJECT DriverObject,
; IN INTERFACE_TYPE LegacyBusType,
; IN ULONG BusNumber,
; IN ULONG SlotNumber,
; IN PCM_RESOURCE_LIST ResourceList,
; IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
; IN BOOLEAN ResourceAssigned,
; IN OUT PDEVICE_OBJECT *DeviceObject
; );
;
;// begin_wdm
;
;NTKERNELAPI
;VOID
;IoInvalidateDeviceRelations(
; IN PDEVICE_OBJECT DeviceObject,
; IN DEVICE_RELATION_TYPE Type
; );
;
;NTKERNELAPI
;VOID
;IoRequestDeviceEject(
; IN PDEVICE_OBJECT PhysicalDeviceObject
; );
;
;NTKERNELAPI
;NTSTATUS
;IoGetDeviceProperty(
; IN PDEVICE_OBJECT DeviceObject,
; IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
; IN ULONG BufferLength,
; OUT PVOID PropertyBuffer,
; OUT PULONG ResultLength
; );
;
;//
;// The following definitions are used in IoOpenDeviceRegistryKey
;//
;
;#define PLUGPLAY_REGKEY_DEVICE 1
;#define PLUGPLAY_REGKEY_DRIVER 2
;#define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
;
;NTKERNELAPI
;NTSTATUS
;IoOpenDeviceRegistryKey(
; IN PDEVICE_OBJECT DeviceObject,
; IN ULONG DevInstKeyType,
; IN ACCESS_MASK DesiredAccess,
; OUT PHANDLE DevInstRegKey
; );
;
;NTKERNELAPI
;NTSTATUS
;NTAPI
;IoRegisterDeviceInterface(
; IN PDEVICE_OBJECT PhysicalDeviceObject,
; IN CONST GUID *InterfaceClassGuid,
; IN PUNICODE_STRING ReferenceString, OPTIONAL
; OUT PUNICODE_STRING SymbolicLinkName
; );
;
;NTKERNELAPI
;NTSTATUS
;IoOpenDeviceInterfaceRegistryKey(
; IN PUNICODE_STRING SymbolicLinkName,
; IN ACCESS_MASK DesiredAccess,
; OUT PHANDLE DeviceInterfaceKey
; );
;
;// begin_ntsrv
;
;NTKERNELAPI
;NTSTATUS
;IoSetDeviceInterfaceState(
; IN PUNICODE_STRING SymbolicLinkName,
; IN BOOLEAN Enable
; );
;
;// end_ntsrv
;
;NTKERNELAPI
;NTSTATUS
;NTAPI
;IoGetDeviceInterfaces(
; IN CONST GUID *InterfaceClassGuid,
; IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
; IN ULONG Flags,
; OUT PWSTR *SymbolicLinkList
; );
;
;#define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
;
;NTKERNELAPI
;NTSTATUS
;NTAPI
;IoGetDeviceInterfaceAlias(
; IN PUNICODE_STRING SymbolicLinkName,
; IN CONST GUID *AliasInterfaceClassGuid,
; OUT PUNICODE_STRING AliasSymbolicLinkName
; );
;
;//
;// Define PnP notification event categories
;//
;
;typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
; EventCategoryReserved,
; EventCategoryHardwareProfileChange,
; EventCategoryDeviceInterfaceChange,
; EventCategoryTargetDeviceChange
;} IO_NOTIFICATION_EVENT_CATEGORY;
;
;//
;// Define flags that modify the behavior of IoRegisterPlugPlayNotification
;// for the various event categories...
;//
;
;#define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
;
;typedef
;NTSTATUS
;(*PDRIVER_NOTIFICATION_CALLBACK_ROUTINE) (
; IN PVOID NotificationStructure,
; IN PVOID Context
;);
;
;
;NTKERNELAPI
;NTSTATUS
;IoRegisterPlugPlayNotification(
; IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
; IN ULONG EventCategoryFlags,
; IN PVOID EventCategoryData OPTIONAL,
; IN PDRIVER_OBJECT DriverObject,
; IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
; IN PVOID Context,
; OUT PVOID *NotificationEntry
; );
;
;NTKERNELAPI
;NTSTATUS
;IoUnregisterPlugPlayNotification(
; IN PVOID NotificationEntry
; );
;
;NTKERNELAPI
;NTSTATUS
;IoReportTargetDeviceChange(
; IN PDEVICE_OBJECT PhysicalDeviceObject,
; IN PVOID NotificationStructure // always begins with a PLUGPLAY_NOTIFICATION_HEADER
; );
;
;typedef
;VOID
;(*PDEVICE_CHANGE_COMPLETE_CALLBACK)(
; IN PVOID Context
; );
;
;NTKERNELAPI
;VOID
;IoInvalidateDeviceState(
; IN PDEVICE_OBJECT PhysicalDeviceObject
; );
;
;#define IoAdjustPagingPathCount(_count_,_paging_) { \
; if (_paging_) { \
; InterlockedIncrement(_count_); \
; } else { \
; InterlockedDecrement(_count_); \
; } \
;}
;
;// end_wdm
;
;NTKERNELAPI
;NTSTATUS
;IoReportTargetDeviceChangeAsynchronous(
; IN PDEVICE_OBJECT PhysicalDeviceObject,
; IN PVOID NotificationStructure, // always begins with a PLUGPLAY_NOTIFICATION_HEADER
; IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback, OPTIONAL
; IN PVOID Context OPTIONAL
; );
;
;
;//
;// Resource arbiter declarations
;//
;
;typedef enum _ARBITER_ACTION {
; ArbiterActionTestAllocation,
; ArbiterActionRetestAllocation,
; ArbiterActionCommitAllocation,
; ArbiterActionRollbackAllocation,
; ArbiterActionQueryAllocatedResources,
; ArbiterActionWriteReservedResources,
; ArbiterActionQueryConflict,
; ArbiterActionQueryArbitrate,
; ArbiterActionAddReserved,
; ArbiterActionBootAllocation
;} ARBITER_ACTION, *PARBITER_ACTION;
;
;typedef struct _ARBITER_CONFLICT_INFO {
; //
; // The device object owning the device that is causing the conflict
; //
; PDEVICE_OBJECT OwningObject;
;
; //
; // The start of the conflicting range
; //
; ULONGLONG Start;
;
; //
; // The end of the conflicting range
; //
; ULONGLONG End;
;
;} ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO;
;
;//
;// The parameters for those actions
;//
;
;typedef struct _ARBITER_PARAMETERS {
;
; union {
;
; struct {
;
; //
; // Doubly linked list of ARBITER_LIST_ENTRY's
; //
; IN OUT PLIST_ENTRY ArbitrationList;
;
; //
; // The size of the AllocateFrom array
; //
; IN ULONG AllocateFromCount;
;
; //
; // Array of resource descriptors describing the resources available
; // to the arbiter for it to arbitrate
; //
; IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
;
; } TestAllocation;
;
; struct {
;
; //
; // Doubly linked list of ARBITER_LIST_ENTRY's
; //
; IN OUT PLIST_ENTRY ArbitrationList;
;
; //
; // The size of the AllocateFrom array
; //
; IN ULONG AllocateFromCount;
;
; //
; // Array of resource descriptors describing the resources available
; // to the arbiter for it to arbitrate
; //
; IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
;
; } RetestAllocation;
;
; struct {
;
; //
; // Doubly linked list of ARBITER_LIST_ENTRY's
; //
; IN OUT PLIST_ENTRY ArbitrationList;
;
; } BootAllocation;
;
; struct {
;
; //
; // The resources that are currently allocated
; //
; OUT PCM_PARTIAL_RESOURCE_LIST *AllocatedResources;
;
; } QueryAllocatedResources;
;
; struct {
;
; //
; // This is the device we are trying to find a conflict for
; //
; IN PDEVICE_OBJECT PhysicalDeviceObject;
;
; //
; // This is the resource to find the conflict for
; //
; IN PIO_RESOURCE_DESCRIPTOR ConflictingResource;
;
; //
; // Number of devices conflicting on the resource
; //
; OUT PULONG ConflictCount;
;
; //
; // Pointer to array describing the conflicting device objects and ranges
; //
; OUT PARBITER_CONFLICT_INFO *Conflicts;
;
; } QueryConflict;
;
; struct {
;
; //
; // Doubly linked list of ARBITER_LIST_ENTRY's - should have
; // only one entry
; //
; IN PLIST_ENTRY ArbitrationList;
;
; } QueryArbitrate;
;
; struct {
;
; //
; // Indicates the device whose resources are to be marked as reserved
; //
; PDEVICE_OBJECT ReserveDevice;
;
; } AddReserved;
;
; } Parameters;
;
;} ARBITER_PARAMETERS, *PARBITER_PARAMETERS;
;
;
;
;typedef enum _ARBITER_REQUEST_SOURCE {
;
; ArbiterRequestUndefined = -1,
; ArbiterRequestLegacyReported, // IoReportResourceUsage
; ArbiterRequestHalReported, // IoReportHalResourceUsage
; ArbiterRequestLegacyAssigned, // IoAssignResources
; ArbiterRequestPnpDetected, // IoReportResourceForDetection
; ArbiterRequestPnpEnumerated // IRP_MN_QUERY_RESOURCE_REQUIREMENTS
;
;} ARBITER_REQUEST_SOURCE;
;
;
;typedef enum _ARBITER_RESULT {
;
; ArbiterResultUndefined = -1,
; ArbiterResultSuccess,
; ArbiterResultExternalConflict, // This indicates that the request can never be solved for devices in this list
; ArbiterResultNullRequest // The request was for length zero and thus no translation should be attempted
;
;} ARBITER_RESULT;
;
;//
;// ARBITER_FLAG_BOOT_CONFIG - this indicates that the request is for the
;// resources assigned by the firmware/BIOS. It should be succeeded even if
;// it conflicts with another devices boot config.
;//
;
;#define ARBITER_FLAG_BOOT_CONFIG 0x00000001
;
;NTKERNELAPI
;NTSTATUS
;IoReportResourceForDetection(
; IN PDRIVER_OBJECT DriverObject,
; IN PCM_RESOURCE_LIST DriverList OPTIONAL,
; IN ULONG DriverListSize OPTIONAL,
; IN PDEVICE_OBJECT DeviceObject OPTIONAL,
; IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
; IN ULONG DeviceListSize OPTIONAL,
; OUT PBOOLEAN ConflictDetected
; );
;
;
;typedef struct _ARBITER_LIST_ENTRY {
;
; //
; // This is a doubly linked list of entries for easy sorting
; //
; LIST_ENTRY ListEntry;
;
; //
; // The number of alternative allocation
; //
; ULONG AlternativeCount;
;
; //
; // Pointer to an array of resource descriptors for the possible allocations
; //
; PIO_RESOURCE_DESCRIPTOR Alternatives;
;
; //
; // The device object of the device requesting these resources.
; //
; PDEVICE_OBJECT PhysicalDeviceObject;
;
; //
; // Indicates where the request came from
; //
; ARBITER_REQUEST_SOURCE RequestSource;
;
; //
; // Flags these indicate a variety of things (use ARBITER_FLAG_*)
; //
; ULONG Flags;
;
; //
; // Space to aid the arbiter in processing the list it is initialized to 0 when
; // the entry is created. The system will not attempt to interpret it.
; //
; LONG_PTR WorkSpace;
;
; //
; // Interface Type, Slot Number and Bus Number from Resource Requirements list,
; // used only for reverse identification.
; //
; INTERFACE_TYPE InterfaceType;
; ULONG SlotNumber;
; ULONG BusNumber;
;
; //
; // A pointer to a descriptor to indicate the resource that was allocated.
; // This is allocated by the system and filled in by the arbiter in response to an
; // ArbiterActionTestAllocation.
; //
; PCM_PARTIAL_RESOURCE_DESCRIPTOR Assignment;
;
; //
; // Pointer to the alternative that was chosen from to provide the assignment.
; // This is filled in by the arbiter in response to an ArbiterActionTestAllocation.
; //
; PIO_RESOURCE_DESCRIPTOR SelectedAlternative;
;
; //
; // The result of the operation
; // This is filled in by the arbiter in response to an ArbiterActionTestAllocation.
; //
; ARBITER_RESULT Result;
;
;} ARBITER_LIST_ENTRY, *PARBITER_LIST_ENTRY;
;
;//
;// The arbiter's entry point
;//
;
;typedef
;NTSTATUS
;(*PARBITER_HANDLER) (
; IN PVOID Context,
; IN ARBITER_ACTION Action,
; IN OUT PARBITER_PARAMETERS Parameters
; );
;
;//
;// Arbiter interface
;//
;
;//
;// A partial arbiter is one which may not arbitrate all the resources for
;// its children but may defer to the next arbiter in the chain by returning
;// STATUS_ARBITRATION_UNHANDLED.
;//
;
;#define ARBITER_PARTIAL 0x00000001
;
;
;typedef struct _ARBITER_INTERFACE {
;
; //
; // Generic interface header
; //
; USHORT Size;
; USHORT Version;
; PVOID Context;
; PINTERFACE_REFERENCE InterfaceReference;
; PINTERFACE_DEREFERENCE InterfaceDereference;
;
; //
; // Entry point to the arbiter
; //
; PARBITER_HANDLER ArbiterHandler;
;
; //
; // Other information about the arbiter, use ARBITER_* flags
; //
; ULONG Flags;
;
;} ARBITER_INTERFACE, *PARBITER_INTERFACE;
;
;//
;// The directions translation can take place in
;//
;
;typedef enum _RESOURCE_TRANSLATION_DIRECTION {
; TranslateChildToParent,
; TranslateParentToChild
;} RESOURCE_TRANSLATION_DIRECTION;
;
;//
;// Translation functions
;//
;
;typedef
;NTSTATUS
;(*PTRANSLATE_RESOURCE_HANDLER)(
; IN PVOID Context,
; IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source,
; IN RESOURCE_TRANSLATION_DIRECTION Direction,
; IN ULONG AlternativesCount, OPTIONAL
; IN IO_RESOURCE_DESCRIPTOR Alternatives[], OPTIONAL
; IN PDEVICE_OBJECT PhysicalDeviceObject,
; OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target
;);
;
;typedef
;NTSTATUS
;(*PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)(
; IN PVOID Context,
; IN PIO_RESOURCE_DESCRIPTOR Source,
; IN PDEVICE_OBJECT PhysicalDeviceObject,
; OUT PULONG TargetCount,
; OUT PIO_RESOURCE_DESCRIPTOR *Target
;);
;
;//
;// Translator Interface
;//
;
;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;
;
;// end_wdm
;
;//
;// Legacy Device Detection Handler
;//
;
;typedef
;NTSTATUS
;(*PLEGACY_DEVICE_DETECTION_HANDLER)(
; IN PVOID Context,
; IN INTERFACE_TYPE LegacyBusType,
; IN ULONG BusNumber,
; IN ULONG SlotNumber,
; OUT PDEVICE_OBJECT *PhysicalDeviceObject
;);
;
;//
;// Legacy Device Detection Interface
;//
;
;typedef struct _LEGACY_DEVICE_DETECTION_INTERFACE {
; USHORT Size;
; USHORT Version;
; PVOID Context;
; PINTERFACE_REFERENCE InterfaceReference;
; PINTERFACE_DEREFERENCE InterfaceDereference;
; PLEGACY_DEVICE_DETECTION_HANDLER LegacyDeviceDetection;
;} LEGACY_DEVICE_DETECTION_INTERFACE, *PLEGACY_DEVICE_DETECTION_INTERFACE;
;
;
;//
;// Header structure for all Plug&Play notification events...
;//
;
;typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
; USHORT Version; // presently at version 1.
; USHORT Size; // size (in bytes) of header + event-specific data.
; GUID Event;
; //
; // Event-specific stuff starts here.
; //
;} PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
;
;//
;// Notification structure for all EventCategoryHardwareProfileChange events...
;//
;
;typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
; USHORT Version;
; USHORT Size;
; GUID Event;
; //
; // (No event-specific data)
; //
;} HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
;
;
;//
;// Notification structure for all EventCategoryDeviceInterfaceChange events...
;//
;
;typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
; USHORT Version;
; USHORT Size;
; GUID Event;
; //
; // Event-specific data
; //
; GUID InterfaceClassGuid;
; PUNICODE_STRING SymbolicLinkName;
;} DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
;
;
;//
;// Notification structures for EventCategoryTargetDeviceChange...
;//
;
;//
;// The following structure is used for TargetDeviceQueryRemove,
;// TargetDeviceRemoveCancelled, and TargetDeviceRemoveComplete:
;//
;typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
; USHORT Version;
; USHORT Size;
; GUID Event;
; //
; // Event-specific data
; //
; PFILE_OBJECT FileObject;
;} TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
;
;//
;// The following structure header is used for all other (i.e., 3rd-party)
;// target device change events. The structure accommodates both a
;// variable-length binary data buffer, and a variable-length unicode text
;// buffer. The header must indicate where the text buffer begins, so that
;// the data can be delivered in the appropriate format (ANSI or Unicode)
;// to user-mode recipients (i.e., that have registered for handle-based
;// notification via RegisterDeviceNotification).
;//
;
;typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
; USHORT Version;
; USHORT Size;
; GUID Event;
; //
; // Event-specific data
; //
; PFILE_OBJECT FileObject; // This field must be set to NULL by callers of
; // IoReportTargetDeviceChange. Clients that
; // have registered for target device change
; // notification on the affected PDO will be
; // called with this field set to the file object
; // they specified during registration.
; //
; LONG NameBufferOffset; // offset (in bytes) from beginning of
; // CustomDataBuffer where text begins (-1 if none)
; //
; UCHAR CustomDataBuffer[1]; // variable-length buffer, containing (optionally)
; // a binary data at the start of the buffer,
; // followed by an optional unicode text buffer
; // (word-aligned).
; //
;} TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
;
;//
;// Define the device description structure.
;//
;
;typedef struct _DEVICE_DESCRIPTION {
; ULONG Version;
; BOOLEAN Master;
; BOOLEAN ScatterGather;
; BOOLEAN DemandMode;
; BOOLEAN AutoInitialize;
; BOOLEAN Dma32BitAddresses;
; BOOLEAN IgnoreCount;
; BOOLEAN Reserved1; // must be false
; BOOLEAN Dma64BitAddresses;
; ULONG BusNumber; // unused for WDM
; ULONG DmaChannel;
; INTERFACE_TYPE InterfaceType;
; DMA_WIDTH DmaWidth;
; DMA_SPEED DmaSpeed;
; ULONG MaximumLength;
; ULONG DmaPort;
;} DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
;
;//
;// Define the supported version numbers for the device description structure.
;//
;
;#define DEVICE_DESCRIPTION_VERSION 0
;#define DEVICE_DESCRIPTION_VERSION1 1
;
;//
;// The following function prototypes are for HAL routines with a prefix of Hal.
;//
;// General functions.
;//
;
;typedef
;BOOLEAN
;(*PHAL_RESET_DISPLAY_PARAMETERS) (
; IN ULONG Columns,
; IN ULONG Rows
; );
;
;NTHALAPI
;VOID
;HalAcquireDisplayOwnership (
; IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters
; );
;
;#if defined(_ALPHA_) || defined(_IA64_)
;
;NTHALAPI
;ULONG
;HalGetDmaAlignmentRequirement (
; VOID
; );
;
;#endif
;
;#if defined(_M_IX86)
;
;#define HalGetDmaAlignmentRequirement() 1L
;#endif
;
;NTHALAPI
;VOID
;KeFlushWriteBuffer (
; VOID
; );
;
;//
;// I/O driver configuration functions.
;//
;#if !defined(NO_LEGACY_DRIVERS)
;NTHALAPI
;NTSTATUS
;HalAssignSlotResources (
; IN PUNICODE_STRING RegistryPath,
; IN PUNICODE_STRING DriverClassName OPTIONAL,
; 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
;HalGetInterruptVector(
; IN INTERFACE_TYPE InterfaceType,
; IN ULONG BusNumber,
; IN ULONG BusInterruptLevel,
; IN ULONG BusInterruptVector,
; OUT PKIRQL Irql,
; OUT PKAFFINITY Affinity
; );
;
;NTHALAPI
;ULONG
;HalSetBusData(
; IN BUS_DATA_TYPE BusDataType,
; IN ULONG BusNumber,
; IN ULONG SlotNumber,
; IN PVOID Buffer,
; IN ULONG Length
; );
;#endif // NO_LEGACY_DRIVERS
;
;NTHALAPI
;ULONG
;HalSetBusDataByOffset(
; IN BUS_DATA_TYPE BusDataType,
; IN ULONG BusNumber,
; IN ULONG SlotNumber,
; IN PVOID Buffer,
; IN ULONG Offset,
; IN ULONG Length
; );
;
;NTHALAPI
;BOOLEAN
;HalTranslateBusAddress(
; IN INTERFACE_TYPE InterfaceType,
; IN ULONG BusNumber,
; IN PHYSICAL_ADDRESS BusAddress,
; IN OUT PULONG AddressSpace,
; OUT PPHYSICAL_ADDRESS TranslatedAddress
; );
;
;//
;// Values for AddressSpace parameter of HalTranslateBusAddress
;//
;// BUGBUG--figure out which flags should be added to resource descriptor structures
;//
;// 0x0 - Memory space
;// 0x1 - Port space
;// 0x2 - 0x1F - Address spaces specific for Alpha
;// 0x2 - UserMode view of memory space
;// 0x3 - UserMode view of port space
;// 0x4 - Dense memory space
;// 0x5 - reserved
;// 0x6 - UserMode view of dense memory space
;// 0x7 - 0x1F - reserved
;//
;
;NTHALAPI
;PVOID
;HalAllocateCrashDumpRegisters(
; IN PADAPTER_OBJECT AdapterObject,
; IN OUT PULONG NumberOfMapRegisters
; );
;
;#if !defined(NO_LEGACY_DRIVERS)
;NTHALAPI
;ULONG
;HalGetBusData(
; IN BUS_DATA_TYPE BusDataType,
; IN ULONG BusNumber,
; IN ULONG SlotNumber,
; IN PVOID Buffer,
; IN ULONG Length
; );
;#endif // NO_LEGACY_DRIVERS
;
;NTHALAPI
;ULONG
;HalGetBusDataByOffset(
; IN BUS_DATA_TYPE BusDataType,
; IN ULONG BusNumber,
; IN ULONG SlotNumber,
; IN PVOID Buffer,
; IN ULONG Offset,
; IN ULONG Length
; );
;
;NTHALAPI
;PADAPTER_OBJECT
;HalGetAdapter(
; IN PDEVICE_DESCRIPTION DeviceDescription,
; IN OUT PULONG NumberOfMapRegisters
; );
;
;//
;// System beep functions.
;//
;#if !defined(NO_LEGACY_DRIVERS)
;NTHALAPI
;BOOLEAN
;HalMakeBeep(
; IN ULONG Frequency
; );
;#endif // NO_LEGACY_DRIVERS
;
;//
;// The following function prototypes are for HAL routines with a prefix of Io.
;//
;// DMA adapter object functions.
;//
;
;
;
;#if defined(NO_LEGACY_DRIVERS)
;NTKERNELAPI
;NTSTATUS
;IoReadPartitionTable(
; IN PDEVICE_OBJECT DeviceObject,
; IN ULONG SectorSize,
; IN BOOLEAN ReturnRecognizedPartitions,
; OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer
; );
;
;NTKERNELAPI
;NTSTATUS
;IoSetPartitionInformation(
; IN PDEVICE_OBJECT DeviceObject,
; IN ULONG SectorSize,
; IN ULONG PartitionNumber,
; IN ULONG PartitionType
; );
;
;NTKERNELAPI
;NTSTATUS
;IoWritePartitionTable(
; IN PDEVICE_OBJECT DeviceObject,
; IN ULONG SectorSize,
; IN ULONG SectorsPerTrack,
; IN ULONG NumberOfHeads,
; IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer
; );
;
;#else
;NTHALAPI
;NTSTATUS
;IoReadPartitionTable(
; IN PDEVICE_OBJECT DeviceObject,
; IN ULONG SectorSize,
; IN BOOLEAN ReturnRecognizedPartitions,
; OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer
; );
;
;NTHALAPI
;NTSTATUS
;IoSetPartitionInformation(
; IN PDEVICE_OBJECT DeviceObject,
; IN ULONG SectorSize,
; IN ULONG PartitionNumber,
; IN ULONG PartitionType
; );
;
;NTHALAPI
;NTSTATUS
;IoWritePartitionTable(
; IN PDEVICE_OBJECT DeviceObject,
; IN ULONG SectorSize,
; IN ULONG SectorsPerTrack,
; IN ULONG NumberOfHeads,
; IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer
; );
;#endif // NO_LEGACY_DRIVERS
;
;//
;// Performance counter function.
;//
;
;NTHALAPI
;LARGE_INTEGER
;KeQueryPerformanceCounter (
; IN PLARGE_INTEGER PerformanceFrequency OPTIONAL
; );
;
;// begin_ntndis
;//
;// Stall processor execution function.
;//
;
;NTHALAPI
;VOID
;KeStallExecutionProcessor (
; IN ULONG MicroSeconds
; );
;
;
;typedef
;VOID
;(*PDEVICE_CONTROL_COMPLETION)(
; IN struct _DEVICE_CONTROL_CONTEXT *ControlContext
; );
;
;typedef struct _DEVICE_CONTROL_CONTEXT {
; NTSTATUS Status;
; PDEVICE_HANDLER_OBJECT DeviceHandler;
; PDEVICE_OBJECT DeviceObject;
; ULONG ControlCode;
; PVOID Buffer;
; PULONG BufferLength;
; PVOID Context;
;} DEVICE_CONTROL_CONTEXT, *PDEVICE_CONTROL_CONTEXT;
;
;typedef
;PBUS_HANDLER
;(FASTCALL *pHalHandlerForBus) (
; IN INTERFACE_TYPE InterfaceType,
; IN ULONG BusNumber
; );
;typedef
;VOID
;(FASTCALL *pHalReferenceBusHandler) (
; IN PBUS_HANDLER BusHandler
; );
;
;//*****************************************************************************
;// HAL Function dispatch
;//
;
;typedef enum _HAL_QUERY_INFORMATION_CLASS {
; HalInstalledBusInformation,
; HalProfileSourceInformation,
; HalInformationClassUnused1,
; HalPowerInformation,
; HalProcessorSpeedInformation,
; HalCallbackInformation,
; HalMapRegisterInformation,
; HalMcaLogInformation,
; HalFrameBufferCachingInformation,
; HalDisplayBiosInformation,
; HalProcessorFeatureInformation
; // information levels >= 0x8000000 reserved for OEM use
;} HAL_QUERY_INFORMATION_CLASS, *PHAL_QUERY_INFORMATION_CLASS;
;
;
;typedef enum _HAL_SET_INFORMATION_CLASS {
; HalProfileSourceInterval,
; HalProfileSourceInterruptHandler,
; HalMcaRegisterDriver
;} HAL_SET_INFORMATION_CLASS, *PHAL_SET_INFORMATION_CLASS;
;
;
;typedef
;NTSTATUS
;(*pHalQuerySystemInformation)(
; IN HAL_QUERY_INFORMATION_CLASS InformationClass,
; IN ULONG BufferSize,
; IN OUT PVOID Buffer,
; OUT PULONG ReturnedLength
; );
;
;NTSTATUS
;HaliQuerySystemInformation(
; IN HAL_SET_INFORMATION_CLASS InformationClass,
; IN ULONG BufferSize,
; IN OUT PVOID Buffer,
; OUT PULONG ReturnedLength
; );
;
;typedef
;NTSTATUS
;(*pHalSetSystemInformation)(
; IN HAL_SET_INFORMATION_CLASS InformationClass,
; IN ULONG BufferSize,
; IN PVOID Buffer
; );
;
;NTSTATUS
;HaliSetSystemInformation(
; IN HAL_SET_INFORMATION_CLASS InformationClass,
; IN ULONG BufferSize,
; IN PVOID Buffer
; );
;
;typedef
;VOID
;(FASTCALL *pHalExamineMBR)(
; IN PDEVICE_OBJECT DeviceObject,
; IN ULONG SectorSize,
; IN ULONG MBRTypeIdentifier,
; OUT PVOID *Buffer
; );
;
;typedef
;VOID
;(FASTCALL *pHalIoAssignDriveLetters)(
; IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
; IN PSTRING NtDeviceName,
; OUT PUCHAR NtSystemPath,
; OUT PSTRING NtSystemPathString
; );
;
;typedef
;NTSTATUS
;(FASTCALL *pHalIoReadPartitionTable)(
; IN PDEVICE_OBJECT DeviceObject,
; IN ULONG SectorSize,
; IN BOOLEAN ReturnRecognizedPartitions,
; OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer
; );
;
;typedef
;NTSTATUS
;(FASTCALL *pHalIoSetPartitionInformation)(
; IN PDEVICE_OBJECT DeviceObject,
; IN ULONG SectorSize,
; IN ULONG PartitionNumber,
; IN ULONG PartitionType
; );
;
;typedef
;NTSTATUS
;(FASTCALL *pHalIoWritePartitionTable)(
; IN PDEVICE_OBJECT DeviceObject,
; IN ULONG SectorSize,
; IN ULONG SectorsPerTrack,
; IN ULONG NumberOfHeads,
; IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer
; );
;
;typedef
;NTSTATUS
;(*pHalQueryBusSlots)(
; IN PBUS_HANDLER BusHandler,
; IN ULONG BufferSize,
; OUT PULONG SlotNumbers,
; OUT PULONG ReturnedLength
; );
;
;typedef
;NTSTATUS
;(*pHalInitPnpDriver)(
; VOID
; );
;
;NTSTATUS
;HaliInitPnpDriver(
; VOID
; );
;
;typedef struct _PM_DISPATCH_TABLE {
; ULONG Signature;
; ULONG Version;
; PVOID Function[1];
;} PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE;
;
;typedef
;NTSTATUS
;(*pHalInitPowerManagement)(
; IN PPM_DISPATCH_TABLE PmDriverDispatchTable,
; OUT PPM_DISPATCH_TABLE *PmHalDispatchTable
; );
;
;NTSTATUS
;HaliInitPowerManagement(
; IN PPM_DISPATCH_TABLE PmDriverDispatchTable,
; IN OUT PPM_DISPATCH_TABLE *PmHalDispatchTable
; );
;
;typedef
;struct _DMA_ADAPTER *
;(*pHalGetDmaAdapter)(
; IN PVOID Context,
; IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
; OUT PULONG NumberOfMapRegisters
; );
;
;struct _DMA_ADAPTER *
;HaliGetDmaAdapter(
; IN PVOID Context,
; IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
; OUT PULONG NumberOfMapRegisters
; );
;
;typedef
;NTSTATUS
;(*pHalGetInterruptTranslator)(
; IN INTERFACE_TYPE ParentInterfaceType,
; IN ULONG ParentBusNumber,
; IN INTERFACE_TYPE BridgeInterfaceType,
; IN USHORT Size,
; IN USHORT Version,
; OUT PTRANSLATOR_INTERFACE Translator,
; OUT PULONG BridgeBusNumber
; );
;
;NTSTATUS
;HaliGetInterruptTranslator(
; IN INTERFACE_TYPE ParentInterfaceType,
; IN ULONG ParentBusNumber,
; IN INTERFACE_TYPE BridgeInterfaceType,
; IN USHORT Size,
; IN USHORT Version,
; OUT PTRANSLATOR_INTERFACE Translator,
; OUT PULONG BridgeBusNumber
; );
;
;typedef
;BOOLEAN
;(*pHalTranslateBusAddress)(
; IN INTERFACE_TYPE InterfaceType,
; IN ULONG BusNumber,
; IN PHYSICAL_ADDRESS BusAddress,
; IN OUT PULONG AddressSpace,
; OUT PPHYSICAL_ADDRESS TranslatedAddress
; );
;
;typedef
;NTSTATUS
;(*pHalAssignSlotResources) (
; IN PUNICODE_STRING RegistryPath,
; IN PUNICODE_STRING DriverClassName OPTIONAL,
; IN PDRIVER_OBJECT DriverObject,
; IN PDEVICE_OBJECT DeviceObject,
; IN INTERFACE_TYPE BusType,
; IN ULONG BusNumber,
; IN ULONG SlotNumber,
; IN OUT PCM_RESOURCE_LIST *AllocatedResources
; );
;
;typedef
;VOID
;(*pHalHaltSystem) (
; VOID
; );
;
;typedef
;VOID
;(*pHalResetDisplay) (
; VOID
; );
;
;typedef
;BOOLEAN
;(*pHalFindBusAddressTranslation) (
; IN PHYSICAL_ADDRESS BusAddress,
; IN OUT PULONG AddressSpace,
; OUT PPHYSICAL_ADDRESS TranslatedAddress,
; IN OUT PULONG_PTR Context,
; IN BOOLEAN NextBus
; );
;
;typedef struct {
; ULONG Version;
; pHalQuerySystemInformation HalQuerySystemInformation;
; pHalSetSystemInformation HalSetSystemInformation;
; pHalQueryBusSlots HalQueryBusSlots;
; ULONG Spare1;
; pHalExamineMBR HalExamineMBR;
; pHalIoAssignDriveLetters HalIoAssignDriveLetters;
; pHalIoReadPartitionTable HalIoReadPartitionTable;
; pHalIoSetPartitionInformation HalIoSetPartitionInformation;
; pHalIoWritePartitionTable HalIoWritePartitionTable;
;
; pHalHandlerForBus HalReferenceHandlerForBus;
; pHalReferenceBusHandler HalReferenceBusHandler;
; pHalReferenceBusHandler HalDereferenceBusHandler;
;
; pHalInitPnpDriver HalInitPnpDriver;
; pHalInitPowerManagement HalInitPowerManagement;
;
; pHalGetDmaAdapter HalGetDmaAdapter;
; pHalGetInterruptTranslator HalGetInterruptTranslator;
;} HAL_DISPATCH, *PHAL_DISPATCH;
;
;#if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_)
;
;extern PHAL_DISPATCH HalDispatchTable;
;#define HALDISPATCH HalDispatchTable
;
;#else
;
;extern HAL_DISPATCH HalDispatchTable;
;#define HALDISPATCH (&HalDispatchTable)
;
;#endif
;
;#define HAL_DISPATCH_VERSION 2
;
;#define HalDispatchTableVersion HALDISPATCH->Version
;#define HalQuerySystemInformation HALDISPATCH->HalQuerySystemInformation
;#define HalSetSystemInformation HALDISPATCH->HalSetSystemInformation
;#define HalQueryBusSlots HALDISPATCH->HalQueryBusSlots
;#define HalExamineMBR HALDISPATCH->HalExamineMBR
;#define HalIoAssignDriveLetters HALDISPATCH->HalIoAssignDriveLetters
;#define HalIoReadPartitionTable HALDISPATCH->HalIoReadPartitionTable
;#define HalIoSetPartitionInformation HALDISPATCH->HalIoSetPartitionInformation
;#define HalIoWritePartitionTable HALDISPATCH->HalIoWritePartitionTable
;
;#define HalReferenceHandlerForBus HALDISPATCH->HalReferenceHandlerForBus
;#define HalReferenceBusHandler HALDISPATCH->HalReferenceBusHandler
;#define HalDereferenceBusHandler HALDISPATCH->HalDereferenceBusHandler
;
;#define HalInitPnpDriver HALDISPATCH->HalInitPnpDriver
;#define HalInitPowerManagement HALDISPATCH->HalInitPowerManagement
;
;#define HalGetDmaAdapter HALDISPATCH->HalGetDmaAdapter
;#define HalGetInterruptTranslator HALDISPATCH->HalGetInterruptTranslator
;
;//
;// HAL System Information Structures.
;//
;
;// for the information class "HalInstalledBusInformation"
;typedef struct _HAL_BUS_INFORMATION{
; INTERFACE_TYPE BusType;
; BUS_DATA_TYPE ConfigurationType;
; ULONG BusNumber;
; ULONG Reserved;
;} HAL_BUS_INFORMATION, *PHAL_BUS_INFORMATION;
;
;// for the information class "HalProfileSourceInformation"
;typedef struct _HAL_PROFILE_SOURCE_INFORMATION {
; KPROFILE_SOURCE Source;
; BOOLEAN Supported;
; ULONG Interval;
;} HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION;
;
;// for the information class "HalProfileSourceInterval"
;typedef struct _HAL_PROFILE_SOURCE_INTERVAL {
; KPROFILE_SOURCE Source;
; ULONG_PTR Interval;
;} HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL;
;
;// for the information class "HalDispayBiosInformation"
;typedef enum _HAL_DISPLAY_BIOS_INFORMATION {
; HalDisplayInt10Bios,
; HalDisplayEmulatedBios,
; HalDisplayNoBios
;} HAL_DISPLAY_BIOS_INFORMATION, *PHAL_DISPLAY_BIOS_INFORMATION;
;
;// for the information class "HalPowerInformation"
;typedef struct _HAL_POWER_INFORMATION {
; ULONG TBD;
;} HAL_POWER_INFORMATION, *PHAL_POWER_INFORMATION;
;
;// for the information class "HalProcessorSpeedInformation"
;typedef struct _HAL_PROCESSOR_SPEED_INFO {
; ULONG TBD;
;} HAL_PROCESSOR_SPEED_INFORMATION, *PHAL_PROCESSOR_SPEED_INFORMATION;
;
;// for the information class "HalCallbackInformation"
;typedef struct _HAL_CALLBACKS {
; PCALLBACK_OBJECT SetSystemInformation;
; PCALLBACK_OBJECT BusCheck;
;} HAL_CALLBACKS, *PHAL_CALLBACKS;
;
;// for the information class "HalProcessorFeatureInformation"
;typedef struct _HAL_PROCESSOR_FEATURE {
; ULONG UsableFeatureBits;
;} HAL_PROCESSOR_FEATURE;
;
;#if defined(_X86_) || defined(_IA64_)
;
;// for the information class "HalMcaLogInformation"
;
;//
;// ADDR register for each MCA bank
;//
;
;typedef union _MCI_ADDR{
; struct {
; ULONG Address;
; ULONG Reserved;
; };
;
; ULONGLONG QuadPart;
;} MCI_ADDR, *PMCI_ADDR;
;
;
;typedef enum {
; HAL_MCE_RECORD,
; HAL_MCA_RECORD
;} MCA_EXCEPTION_TYPE;
;
;//
;// MCA exception log entry
;// Defined as a union to contain MCA specific log or Pentium style MCE info.
;//
;
;typedef struct _MCA_EXCEPTION {
;
; ULONG VersionNumber; // Version number of this record type
; MCA_EXCEPTION_TYPE ExceptionType; // MCA or MCE
; LARGE_INTEGER TimeStamp; // exception recording timestamp
; ULONG ProcessorNumber;
;
; union {
; struct {
; UCHAR BankNumber;
; MCI_STATS Status;
; MCI_ADDR Address;
; ULONGLONG Misc;
; } Mca;
;
; struct {
; ULONGLONG Address; // physical addr of cycle causing the error
; ULONGLONG Type; // cycle specification causing the error
; } Mce;
; } u;
;
;} MCA_EXCEPTION, *PMCA_EXCEPTION;
;
;
;// for the information class "HalMcaRegisterDriver"
;
;typedef
;VOID
;(*PDRIVER_EXCPTN_CALLBACK) (
; IN PVOID Context,
; IN PMCA_EXCEPTION BankLog
;);
;
;//
;// Structure to record the callbacks from driver
;//
;typedef struct _MCA_DRIVER_INFO {
; PDRIVER_EXCPTN_CALLBACK ExceptionCallback;
; PKDEFERRED_ROUTINE DpcCallback;
; PVOID DeviceContext;
;} MCA_DRIVER_INFO, *PMCA_DRIVER_INFO;
;
;#endif
;
;// begin_wdm begin_ntndis
;
;typedef struct _SCATTER_GATHER_ELEMENT {
; PHYSICAL_ADDRESS Address;
; ULONG Length;
; ULONG_PTR Reserved;
;} SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
;
;#pragma warning(disable:4200)
;typedef struct _SCATTER_GATHER_LIST {
; ULONG NumberOfElements;
; ULONG_PTR Reserved;
; SCATTER_GATHER_ELEMENT Elements[];
;} SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
;#pragma warning(default:4200)
;
;// end_ntndis
;
;typedef struct _DMA_OPERATIONS *PDMA_OPERATIONS;
;
;typedef struct _DMA_ADAPTER {
; USHORT Version;
; USHORT Size;
; PDMA_OPERATIONS DmaOperations;
; // Private Bus Device Driver data follows,
;} DMA_ADAPTER, *PDMA_ADAPTER;
;
;typedef VOID (*PPUT_DMA_ADAPTER)(
; PDMA_ADAPTER DmaAdapter
; );
;
;typedef PVOID (*PALLOCATE_COMMON_BUFFER)(
; IN PDMA_ADAPTER DmaAdapter,
; IN ULONG Length,
; OUT PPHYSICAL_ADDRESS LogicalAddress,
; IN BOOLEAN CacheEnabled
; );
;
;typedef VOID (*PFREE_COMMON_BUFFER)(
; IN PDMA_ADAPTER DmaAdapter,
; IN ULONG Length,
; IN PHYSICAL_ADDRESS LogicalAddress,
; IN PVOID VirtualAddress,
; IN BOOLEAN CacheEnabled
; );
;
;typedef NTSTATUS (*PALLOCATE_ADAPTER_CHANNEL)(
; IN PDMA_ADAPTER DmaAdapter,
; IN PDEVICE_OBJECT DeviceObject,
; IN ULONG NumberOfMapRegisters,
; IN PDRIVER_CONTROL ExecutionRoutine,
; IN PVOID Context
; );
;
;typedef BOOLEAN (*PFLUSH_ADAPTER_BUFFERS)(
; IN PDMA_ADAPTER DmaAdapter,
; IN PMDL Mdl,
; IN PVOID MapRegisterBase,
; IN PVOID CurrentVa,
; IN ULONG Length,
; IN BOOLEAN WriteToDevice
; );
;
;typedef VOID (*PFREE_ADAPTER_CHANNEL)(
; IN PDMA_ADAPTER DmaAdapter
; );
;
;typedef VOID (*PFREE_MAP_REGISTERS)(
; IN PDMA_ADAPTER DmaAdapter,
; PVOID MapRegisterBase,
; ULONG NumberOfMapRegisters
; );
;
;typedef PHYSICAL_ADDRESS (*PMAP_TRANSFER)(
; IN PDMA_ADAPTER DmaAdapter,
; IN PMDL Mdl,
; IN PVOID MapRegisterBase,
; IN PVOID CurrentVa,
; IN OUT PULONG Length,
; IN BOOLEAN WriteToDevice
; );
;
;typedef ULONG (*PGET_DMA_ALIGNMENT)(
; IN PDMA_ADAPTER DmaAdapter
; );
;
;typedef ULONG (*PREAD_DMA_COUNTER)(
; IN PDMA_ADAPTER DmaAdapter
; );
;
;typedef VOID
;(*PDRIVER_LIST_CONTROL)(
; IN struct _DEVICE_OBJECT *DeviceObject,
; IN struct _IRP *Irp,
; IN PSCATTER_GATHER_LIST ScatterGather,
; IN PVOID Context
; );
;
;typedef NTSTATUS
;(*PGET_SCATTER_GATHER_LIST)(
; IN PDMA_ADAPTER 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
; );
;
;typedef VOID
;(*PPUT_SCATTER_GATHER_LIST)(
; IN PDMA_ADAPTER DmaAdapter,
; IN PSCATTER_GATHER_LIST ScatterGather,
; IN BOOLEAN WriteToDevice
; );
;
;typedef struct _DMA_OPERATIONS {
; ULONG Size;
; PPUT_DMA_ADAPTER PutDmaAdapter;
; PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
; PFREE_COMMON_BUFFER FreeCommonBuffer;
; PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
; PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
; PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
; PFREE_MAP_REGISTERS FreeMapRegisters;
; PMAP_TRANSFER MapTransfer;
; PGET_DMA_ALIGNMENT GetDmaAlignment;
; PREAD_DMA_COUNTER ReadDmaCounter;
; PGET_SCATTER_GATHER_LIST GetScatterGatherList;
; PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
;} DMA_OPERATIONS;
;
;// end_wdm
;
;
;#if defined(_AXP64_)
;
;//
;// Use __inline DMA macros (hal.h)
;//
;#ifndef USE_DMA_MACROS
;#define USE_DMA_MACROS
;#endif
;
;//
;// Only PnP drivers!
;//
;#ifndef NO_LEGACY_DRIVERS
;#define NO_LEGACY_DRIVERS
;#endif
;
;#endif // _AXP64_
;
;
;#if defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_))
;
;// begin_wdm
;
;__inline
;PVOID
;HalAllocateCommonBuffer(
; IN PDMA_ADAPTER DmaAdapter,
; IN ULONG Length,
; OUT PPHYSICAL_ADDRESS LogicalAddress,
; IN BOOLEAN CacheEnabled
; ){
;
; PALLOCATE_COMMON_BUFFER allocateCommonBuffer;
; PVOID commonBuffer;
;
; allocateCommonBuffer = *(DmaAdapter)->DmaOperations->AllocateCommonBuffer;
; ASSERT( allocateCommonBuffer != NULL );
;
; commonBuffer = allocateCommonBuffer( DmaAdapter,
; Length,
; LogicalAddress,
; CacheEnabled );
;
; return commonBuffer;
;}
;
;__inline
;VOID
;HalFreeCommonBuffer(
; IN PDMA_ADAPTER DmaAdapter,
; IN ULONG Length,
; IN PHYSICAL_ADDRESS LogicalAddress,
; IN PVOID VirtualAddress,
; IN BOOLEAN CacheEnabled
; ){
;
; PFREE_COMMON_BUFFER freeCommonBuffer;
;
; freeCommonBuffer = *(DmaAdapter)->DmaOperations->FreeCommonBuffer;
; ASSERT( freeCommonBuffer != NULL );
;
; freeCommonBuffer( DmaAdapter,
; Length,
; LogicalAddress,
; VirtualAddress,
; CacheEnabled );
;}
;
;__inline
;NTSTATUS
;IoAllocateAdapterChannel(
; IN PDMA_ADAPTER DmaAdapter,
; IN PDEVICE_OBJECT DeviceObject,
; IN ULONG NumberOfMapRegisters,
; IN PDRIVER_CONTROL ExecutionRoutine,
; IN PVOID Context
; ){
;
; PALLOCATE_ADAPTER_CHANNEL allocateAdapterChannel;
; NTSTATUS status;
;
; allocateAdapterChannel =
; *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
;
; ASSERT( allocateAdapterChannel != NULL );
;
; status = allocateAdapterChannel( DmaAdapter,
; DeviceObject,
; NumberOfMapRegisters,
; ExecutionRoutine,
; Context );
;
; return status;
;}
;
;__inline
;BOOLEAN
;IoFlushAdapterBuffers(
; IN PDMA_ADAPTER DmaAdapter,
; IN PMDL Mdl,
; IN PVOID MapRegisterBase,
; IN PVOID CurrentVa,
; IN ULONG Length,
; IN BOOLEAN WriteToDevice
; ){
;
; PFLUSH_ADAPTER_BUFFERS flushAdapterBuffers;
; BOOLEAN result;
;
; flushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
; ASSERT( flushAdapterBuffers != NULL );
;
; result = flushAdapterBuffers( DmaAdapter,
; Mdl,
; MapRegisterBase,
; CurrentVa,
; Length,
; WriteToDevice );
; return result;
;}
;
;__inline
;VOID
;IoFreeAdapterChannel(
; IN PDMA_ADAPTER DmaAdapter
; ){
;
; PFREE_ADAPTER_CHANNEL freeAdapterChannel;
;
; freeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
; ASSERT( freeAdapterChannel != NULL );
;
; freeAdapterChannel( DmaAdapter );
;}
;
;__inline
;VOID
;IoFreeMapRegisters(
; IN PDMA_ADAPTER DmaAdapter,
; IN PVOID MapRegisterBase,
; IN ULONG NumberOfMapRegisters
; ){
;
; PFREE_MAP_REGISTERS freeMapRegisters;
;
; freeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
; ASSERT( freeMapRegisters != NULL );
;
; freeMapRegisters( DmaAdapter,
; MapRegisterBase,
; NumberOfMapRegisters );
;}
;
;
;__inline
;PHYSICAL_ADDRESS
;IoMapTransfer(
; IN PDMA_ADAPTER DmaAdapter,
; IN PMDL Mdl,
; IN PVOID MapRegisterBase,
; IN PVOID CurrentVa,
; IN OUT PULONG Length,
; IN BOOLEAN WriteToDevice
; ){
;
; PHYSICAL_ADDRESS physicalAddress;
; PMAP_TRANSFER mapTransfer;
;
; mapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
; ASSERT( mapTransfer != NULL );
;
; physicalAddress = mapTransfer( DmaAdapter,
; Mdl,
; MapRegisterBase,
; CurrentVa,
; Length,
; WriteToDevice );
;
; return physicalAddress;
;}
;
;__inline
;ULONG
;HalGetDmaAlignment(
; IN PDMA_ADAPTER DmaAdapter
; )
;{
; PGET_DMA_ALIGNMENT getDmaAlignment;
; ULONG alignment;
;
; getDmaAlignment = *(DmaAdapter)->DmaOperations->GetDmaAlignment;
; ASSERT( getDmaAlignment != NULL );
;
; alignment = getDmaAlignment( DmaAdapter );
; return alignment;
;}
;
;__inline
;ULONG
;HalReadDmaCounter(
; IN PDMA_ADAPTER DmaAdapter
; )
;{
; PREAD_DMA_COUNTER readDmaCounter;
; ULONG counter;
;
; readDmaCounter = *(DmaAdapter)->DmaOperations->ReadDmaCounter;
; ASSERT( readDmaCounter != NULL );
;
; counter = readDmaCounter( DmaAdapter );
; return counter;
;}
;
;// end_wdm
;
;#else
;
;//
;// DMA adapter object functions.
;//
;NTHALAPI
;NTSTATUS
;HalAllocateAdapterChannel(
; IN PADAPTER_OBJECT AdapterObject,
; IN PWAIT_CONTEXT_BLOCK Wcb,
; IN ULONG NumberOfMapRegisters,
; IN PDRIVER_CONTROL ExecutionRoutine
; );
;
;NTHALAPI
;PVOID
;HalAllocateCommonBuffer(
; IN PADAPTER_OBJECT AdapterObject,
; IN ULONG Length,
; OUT PPHYSICAL_ADDRESS LogicalAddress,
; IN BOOLEAN CacheEnabled
; );
;
;NTHALAPI
;VOID
;HalFreeCommonBuffer(
; IN PADAPTER_OBJECT AdapterObject,
; IN ULONG Length,
; IN PHYSICAL_ADDRESS LogicalAddress,
; IN PVOID VirtualAddress,
; IN BOOLEAN CacheEnabled
; );
;
;NTHALAPI
;ULONG
;HalReadDmaCounter(
; IN PADAPTER_OBJECT AdapterObject
; );
;
;NTHALAPI
;BOOLEAN
;IoFlushAdapterBuffers(
; IN PADAPTER_OBJECT AdapterObject,
; IN PMDL Mdl,
; IN PVOID MapRegisterBase,
; IN PVOID CurrentVa,
; IN ULONG Length,
; IN BOOLEAN WriteToDevice
; );
;
;NTHALAPI
;VOID
;IoFreeAdapterChannel(
; IN PADAPTER_OBJECT AdapterObject
; );
;
;NTHALAPI
;VOID
;IoFreeMapRegisters(
; IN PADAPTER_OBJECT AdapterObject,
; IN PVOID MapRegisterBase,
; IN ULONG NumberOfMapRegisters
; );
;
;NTHALAPI
;PHYSICAL_ADDRESS
;IoMapTransfer(
; IN PADAPTER_OBJECT AdapterObject,
; IN PMDL Mdl,
; IN PVOID MapRegisterBase,
; IN PVOID CurrentVa,
; IN OUT PULONG Length,
; IN BOOLEAN WriteToDevice
; );
;#endif // USE_DMA_MACROS && (_NTDDK_ || _NTDRIVER_)
;
;NTSTATUS
;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
;HalPutScatterGatherList (
; IN PADAPTER_OBJECT DmaAdapter,
; IN PSCATTER_GATHER_LIST ScatterGather,
; IN BOOLEAN WriteToDevice
; );
;
;VOID
;HalPutDmaAdapter(
; IN PADAPTER_OBJECT DmaAdapter
; );
;
;
;NTKERNELAPI
;VOID
;PoSetSystemState (
; IN EXECUTION_STATE Flags
; );
;
;NTKERNELAPI
;PVOID
;PoRegisterSystemState (
; IN PVOID StateHandle,
; IN EXECUTION_STATE Flags
; );
;
;typedef
;VOID
;(*PREQUEST_POWER_COMPLETE) (
; IN PDEVICE_OBJECT DeviceObject,
; IN UCHAR MinorFunction,
; IN POWER_STATE PowerState,
; IN PVOID Context,
; IN PIO_STATUS_BLOCK IoStatus
; );
;
;NTKERNELAPI
;NTSTATUS
;PoRequestPowerIrp (
; IN PDEVICE_OBJECT DeviceObject,
; IN UCHAR MinorFunction,
; IN POWER_STATE PowerState,
; IN PREQUEST_POWER_COMPLETE CompletionFunction,
; IN PVOID Context,
; OUT PIRP *Irp OPTIONAL
; );
;
;NTKERNELAPI
;VOID
;PoUnregisterSystemState (
; IN PVOID StateHandle
; );
;
;
;NTKERNELAPI
;POWER_STATE
;PoSetPowerState (
; IN PDEVICE_OBJECT DeviceObject,
; IN POWER_STATE_TYPE Type,
; IN POWER_STATE State
; );
;
;NTKERNELAPI
;NTSTATUS
;PoCallDriver (
; IN PDEVICE_OBJECT DeviceObject,
; IN OUT PIRP Irp
; );
;
;NTKERNELAPI
;VOID
;PoStartNextPowerIrp(
; IN PIRP Irp
; );
;
;
;NTKERNELAPI
;PULONG
;PoRegisterDeviceForIdleDetection (
; IN PDEVICE_OBJECT DeviceObject,
; IN ULONG ConservationIdleTime,
; IN ULONG PerformanceIdleTime,
; IN DEVICE_POWER_STATE State
; );
;
;#define PoSetDeviceBusy(IdlePointer) \
; *IdlePointer = 0
;
;//
;// \Callback\PowerState values
;//
;
;#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
;
;
;//
;// Determine if there is a complete device failure on an error.
;//
;
;NTKERNELAPI
;BOOLEAN
;FsRtlIsTotalDeviceFailure(
; IN NTSTATUS Status
; );
;
;//
;// Object Manager types
;//
;
;typedef struct _OBJECT_HANDLE_INFORMATION {
; ULONG HandleAttributes;
; ACCESS_MASK GrantedAccess;
;} OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
;
;NTKERNELAPI
;NTSTATUS
;ObReferenceObjectByHandle(
; IN HANDLE Handle,
; IN ACCESS_MASK DesiredAccess,
; IN POBJECT_TYPE ObjectType OPTIONAL,
; IN KPROCESSOR_MODE AccessMode,
; OUT PVOID *Object,
; OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
; );
;
;#define ObDereferenceObject(a) \
; ObfDereferenceObject(a)
;
;#define ObReferenceObject(Object) ObfReferenceObject(Object)
;
;NTKERNELAPI
;VOID
;FASTCALL
;ObfReferenceObject(
; IN PVOID Object
; );
;
;
;NTKERNELAPI
;NTSTATUS
;ObReferenceObjectByPointer(
; IN PVOID Object,
; IN ACCESS_MASK DesiredAccess,
; IN POBJECT_TYPE ObjectType,
; IN KPROCESSOR_MODE AccessMode
; );
;
;NTKERNELAPI
;VOID
;FASTCALL
;ObfDereferenceObject(
; IN PVOID Object
; );
;
;NTSTATUS
;ObGetObjectSecurity(
; IN PVOID Object,
; OUT PSECURITY_DESCRIPTOR *SecurityDescriptor,
; OUT PBOOLEAN MemoryAllocated
; );
;
;VOID
;ObReleaseObjectSecurity(
; IN PSECURITY_DESCRIPTOR SecurityDescriptor,
; IN BOOLEAN MemoryAllocated
; );
;
;//
;// A PCI driver can read the complete 256 bytes of configuration
;// information for any PCI device by calling:
;//
;// ULONG
;// HalGetBusData (
;// IN BUS_DATA_TYPE PCIConfiguration,
;// IN ULONG PciBusNumber,
;// IN PCI_SLOT_NUMBER VirtualSlotNumber,
;// IN PPCI_COMMON_CONFIG &PCIDeviceConfig,
;// IN ULONG sizeof (PCIDeviceConfig)
;// );
;//
;// A return value of 0 means that the specified PCI bus does not exist.
;//
;// A return value of 2, with a VendorID of PCI_INVALID_VENDORID means
;// that the PCI bus does exist, but there is no device at the specified
;// VirtualSlotNumber (PCI Device/Function number).
;//
;//
;
;// begin_wdm begin_ntminiport begin_ntndis
;
;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_CONFIG {
; USHORT VendorID; // (ro)
; USHORT DeviceID; // (ro)
; USHORT Command; // Device control
; USHORT Status;
; UCHAR RevisionID; // (ro)
; UCHAR ProgIf; // (ro)
; UCHAR SubClass; // (ro)
; UCHAR BaseClass; // (ro)
; UCHAR CacheLineSize; // (ro+)
; UCHAR LatencyTimer; // (ro+)
; UCHAR HeaderType; // (ro)
; UCHAR BIST; // Built in self test
;
; union {
; struct _PCI_HEADER_TYPE_0 {
; ULONG BaseAddresses[PCI_TYPE0_ADDRESSES];
; ULONG CIS;
; USHORT SubVendorID;
; USHORT SubSystemID;
; ULONG ROMBaseAddress;
; UCHAR CapabilitiesPtr;
; UCHAR Reserved1[3];
; ULONG Reserved2;
; UCHAR InterruptLine; //
; UCHAR InterruptPin; // (ro)
; UCHAR MinimumGrant; // (ro)
; UCHAR MaximumLatency; // (ro)
; } type0;
;
;// end_wdm end_ntminiport end_ntndis
;
; //
; // PCI to PCI Bridge
; //
;
; struct _PCI_HEADER_TYPE_1 {
; ULONG BaseAddresses[PCI_TYPE1_ADDRESSES];
; UCHAR PrimaryBus;
; UCHAR SecondaryBus;
; UCHAR SubordinateBus;
; UCHAR SecondaryLatency;
; UCHAR IOBase;
; UCHAR IOLimit;
; USHORT SecondaryStatus;
; USHORT MemoryBase;
; USHORT MemoryLimit;
; USHORT PrefetchBase;
; USHORT PrefetchLimit;
; ULONG PrefetchBaseUpper32;
; ULONG PrefetchLimitUpper32;
; USHORT IOBaseUpper16;
; USHORT IOLimitUpper16;
; UCHAR CapabilitiesPtr;
; UCHAR Reserved1[3];
; ULONG ROMBaseAddress;
; UCHAR InterruptLine;
; UCHAR InterruptPin;
; USHORT BridgeControl;
; } type1;
;
; //
; // PCI to CARDBUS Bridge
; //
;
; struct _PCI_HEADER_TYPE_2 {
; ULONG SocketRegistersBaseAddress;
; UCHAR CapabilitiesPtr;
; UCHAR Reserved;
; USHORT SecondaryStatus;
; UCHAR PrimaryBus;
; UCHAR SecondaryBus;
; UCHAR SubordinateBus;
; UCHAR SecondaryLatency;
; struct {
; ULONG Base;
; ULONG Limit;
; } Range[PCI_TYPE2_ADDRESSES-1];
; UCHAR InterruptLine;
; UCHAR InterruptPin;
; USHORT BridgeControl;
; } type2;
;
;// begin_wdm begin_ntminiport begin_ntndis
;
; } u;
;
; UCHAR DeviceSpecific[192];
;
;} PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
;
;
;#define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET (PCI_COMMON_CONFIG, DeviceSpecific))
;
;#define PCI_MAX_DEVICES 32
;#define PCI_MAX_FUNCTION 8
;#define PCI_MAX_BRIDGE_NUMBER 0xFF
;
;#define PCI_INVALID_VENDORID 0xFFFF
;
;//
;// Bit encodings for 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)
;
;//
;// Bit encodings for 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 // (ro+)
;#define PCI_ENABLE_WAIT_CYCLE 0x0080 // (ro+)
;#define PCI_ENABLE_SERR 0x0100 // (ro+)
;#define PCI_ENABLE_FAST_BACK_TO_BACK 0x0200 // (ro)
;
;//
;// Bit encodings for PCI_COMMON_CONFIG.Status
;//
;
;#define PCI_STATUS_CAPABILITIES_LIST 0x0010 // (ro)
;#define PCI_STATUS_66MHZ_CAPABLE 0x0020 // (ro)
;#define PCI_STATUS_UDF_SUPPORTED 0x0040 // (ro)
;#define PCI_STATUS_FAST_BACK_TO_BACK 0x0080 // (ro)
;#define PCI_STATUS_DATA_PARITY_DETECTED 0x0100
;#define PCI_STATUS_DEVSEL 0x0600 // 2 bits wide
;#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
;
;//
;// The NT PCI Driver uses a WhichSpace parameter on its CONFIG_READ/WRITE
;// routines. The following values are defined-
;//
;
;#define PCI_WHICHSPACE_CONFIG 0x0
;#define PCI_WHICHSPACE_ROM 0x52696350
;
;// end_wdm
;//
;// PCI Capability IDs
;//
;
;#define PCI_CAPABILITY_ID_POWER_MANAGEMENT 0x01
;#define PCI_CAPABILITY_ID_AGP 0x02
;#define PCI_CAPABILITY_ID_MSI 0x05
;
;//
;// All PCI Capability structures have the following header.
;//
;// CapabilityID is used to identify the type of the structure (is
;// one of the PCI_CAPABILITY_ID values above.
;//
;// Next is the offset in PCI Configuration space (0x40 - 0xfc) of the
;// next capability structure in the list, or 0x00 if there are no more
;// entries.
;//
;typedef struct _PCI_CAPABILITIES_HEADER {
; UCHAR CapabilityID;
; UCHAR Next;
;} PCI_CAPABILITIES_HEADER, *PPCI_CAPABILITIES_HEADER;
;
;//
;// Power Management Capability
;//
;
;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; // B2_B3#
; UCHAR BusPowerClockControlEnabled:1; // BPCC_EN
;} PCI_PMCSR_BSE, *PPCI_PMCSR_BSE;
;
;
;typedef struct _PCI_PM_CAPABILITY {
;
; PCI_CAPABILITIES_HEADER Header;
;
; //
; // Power Management Capabilities (Offset = 2)
; //
;
; union {
; PCI_PMC Capabilities;
; USHORT AsUSHORT;
; } PMC;
;
; //
; // Power Management Control/Status (Offset = 4)
; //
;
; union {
; PCI_PMCSR ControlStatus;
; USHORT AsUSHORT;
; } PMCSR;
;
; //
; // PMCSR PCI-PCI Bridge Support Extensions
; //
;
; union {
; PCI_PMCSR_BSE BridgeSupport;
; UCHAR AsUCHAR;
; } PMCSR_BSE;
;
; //
; // Optional read only 8 bit Data register. Contents controlled by
; // DataSelect and DataScale in ControlStatus.
; //
;
; UCHAR Data;
;
;} PCI_PM_CAPABILITY, *PPCI_PM_CAPABILITY;
;
;//
;// AGP Capability
;//
;
;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 Rsvd1:1;
; ULONG FastWrite:1;
; ULONG FourGB:1;
; ULONG Rsvd2:3;
; ULONG SideBandAddressing:1; // SBA
; ULONG Rsvd3:14;
; ULONG RequestQueueDepthMaximum:8; // RQ
; } AGPStatus;
;
; struct _PCI_AGP_COMMAND {
; ULONG Rate:3;
; ULONG Rsvd1:1;
; ULONG FastWriteEnable:1;
; ULONG FourGBEnable:1;
; ULONG Rsvd2:2;
; ULONG AGPEnable:1;
; ULONG SBAEnable:1;
; ULONG Rsvd3:14;
; ULONG RequestQueueDepth:8;
; } AGPCommand;
;
;} PCI_AGP_CAPABILITY, *PPCI_AGP_CAPABILITY;
;
;#define PCI_AGP_RATE_1X 0x1
;#define PCI_AGP_RATE_2X 0x2
;#define PCI_AGP_RATE_4X 0x4
;
;//
;// MSI (Message Signalled Interrupts) Capability
;//
;
;typedef struct _PCI_MSI_CAPABILITY {
;
; PCI_CAPABILITIES_HEADER Header;
;
; struct _PCI_MSI_MESSAGE_CONTROL {
; USHORT MSIEnable:1;
; USHORT MultipleMessageCapable:3;
; USHORT MultipleMessageEnable:3;
; USHORT CapableOf64Bits:1;
; USHORT Reserved:8;
; } MessageControl;
;
; union {
; struct _PCI_MSI_MESSAGE_ADDRESS {
; ULONG_PTR Reserved:2; // always zero, DWORD aligned address
; ULONG_PTR Address:30;
; } Register;
; ULONG_PTR Raw;
; } MessageAddress;
;
; //
; // The rest of the Capability structure differs depending on whether
; // 32bit or 64bit addressing is being used.
; //
; // (The CapableOf64Bits bit above determines this)
; //
;
; union {
;
; // For 64 bit devices
;
; struct _PCI_MSI_64BIT_DATA {
; ULONG MessageUpperAddress;
; USHORT MessageData;
; } Bit64;
;
; // For 32 bit devices
;
; struct _PCI_MSI_32BIT_DATA {
; USHORT MessageData;
; ULONG Unused;
; } Bit32;
; } Data;
;
;} PCI_MSI_CAPABILITY, *PPCI_PCI_CAPABILITY;
;
;// begin_wdm
;//
;// Base Class Code encodings for Base Class (from PCI spec rev 2.1).
;//
;
;#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
;
;// 0d thru fe reserved
;
;#define PCI_CLASS_NOT_DEFINED 0xff
;
;//
;// Sub Class Code encodings (PCI rev 2.1).
;//
;
;// Class 00 - PCI_CLASS_PRE_20
;
;#define PCI_SUBCLASS_PRE_20_NON_VGA 0x00
;#define PCI_SUBCLASS_PRE_20_VGA 0x01
;
;// Class 01 - PCI_CLASS_MASS_STORAGE_CTLR
;
;#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
;
;// Class 02 - PCI_CLASS_NETWORK_CTLR
;
;#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_OTHER 0x80
;
;// Class 03 - PCI_CLASS_DISPLAY_CTLR
;
;// N.B. Sub Class 00 could be VGA or 8514 depending on Interface byte
;
;#define PCI_SUBCLASS_VID_VGA_CTLR 0x00
;#define PCI_SUBCLASS_VID_XGA_CTLR 0x01
;#define PCI_SUBCLASS_VID_OTHER 0x80
;
;// Class 04 - PCI_CLASS_MULTIMEDIA_DEV
;
;#define PCI_SUBCLASS_MM_VIDEO_DEV 0x00
;#define PCI_SUBCLASS_MM_AUDIO_DEV 0x01
;#define PCI_SUBCLASS_MM_OTHER 0x80
;
;// Class 05 - PCI_CLASS_MEMORY_CTLR
;
;#define PCI_SUBCLASS_MEM_RAM 0x00
;#define PCI_SUBCLASS_MEM_FLASH 0x01
;#define PCI_SUBCLASS_MEM_OTHER 0x80
;
;// Class 06 - PCI_CLASS_BRIDGE_DEV
;
;#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_OTHER 0x80
;
;// Class 07 - PCI_CLASS_SIMPLE_COMMS_CTLR
;
;// N.B. Sub Class 00 and 01 additional info in Interface byte
;
;#define PCI_SUBCLASS_COM_SERIAL 0x00
;#define PCI_SUBCLASS_COM_PARALLEL 0x01
;#define PCI_SUBCLASS_COM_OTHER 0x80
;
;// Class 08 - PCI_CLASS_BASE_SYSTEM_DEV
;
;// N.B. See Interface byte for additional info.
;
;#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_OTHER 0x80
;
;// Class 09 - PCI_CLASS_INPUT_DEV
;
;#define PCI_SUBCLASS_INP_KEYBOARD 0x00
;#define PCI_SUBCLASS_INP_DIGITIZER 0x01
;#define PCI_SUBCLASS_INP_MOUSE 0x02
;#define PCI_SUBCLASS_INP_OTHER 0x80
;
;// Class 0a - PCI_CLASS_DOCKING_STATION
;
;#define PCI_SUBCLASS_DOC_GENERIC 0x00
;#define PCI_SUBCLASS_DOC_OTHER 0x80
;
;// Class 0b - PCI_CLASS_PROCESSOR
;
;#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
;
;// Class 0c - PCI_CLASS_SERIAL_BUS_CTLR
;
;#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
;
;
;// end_ntndis
;
;//
;// Bit encodes for PCI_COMMON_CONFIG.u.type0.BaseAddresses
;//
;
;#define PCI_ADDRESS_IO_SPACE 0x00000001 // (ro)
;#define PCI_ADDRESS_MEMORY_TYPE_MASK 0x00000006 // (ro)
;#define PCI_ADDRESS_MEMORY_PREFETCHABLE 0x00000008 // (ro)
;
;#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
;
;//
;// Bit encodes for PCI_COMMON_CONFIG.u.type0.ROMBaseAddresses
;//
;
;#define PCI_ROMADDRESS_ENABLED 0x00000001
;
;
;//
;// Reference notes for PCI configuration fields:
;//
;// ro these field are read only. changes to these fields are ignored
;//
;// ro+ these field are intended to be read only and should be initialized
;// by the system to their proper values. However, driver may change
;// these settings.
;//
;// ---
;//
;// All resources comsumed by a PCI device start as unitialized
;// under NT. An uninitialized memory or I/O base address can be
;// determined by checking it's corrisponding enabled bit in the
;// PCI_COMMON_CONFIG.Command value. An InterruptLine is unitialized
;// if it contains the value of -1.
;//
;
;// end_ntminiport
;
;
;//
;// Portable portion of HAL & HAL bus extender definitions for BUSHANDLER
;// BusData for installed PCI buses.
;//
;
;typedef VOID
;(*PciPin2Line) (
; IN struct _BUS_HANDLER *BusHandler,
; IN struct _BUS_HANDLER *RootHandler,
; IN PCI_SLOT_NUMBER SlotNumber,
; IN PPCI_COMMON_CONFIG PciData
; );
;
;typedef VOID
;(*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
;(*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;
;
;typedef ULONG (*PCI_READ_WRITE_CONFIG)(
; IN PVOID Context,
; IN UCHAR BusOffset,
; IN ULONG Slot,
; IN PVOID Buffer,
; IN ULONG Offset,
; IN ULONG Length
; );
;
;typedef VOID (*PCI_PIN_TO_LINE)(
; IN PVOID Context,
; IN PPCI_COMMON_CONFIG PciData
; );
;
;typedef VOID (*PCI_LINE_TO_PIN)(
; IN PVOID Context,
; IN PPCI_COMMON_CONFIG PciNewData,
; IN PPCI_COMMON_CONFIG PciOldData
; );
;
;typedef struct _PCI_BUS_INTERFACE_STANDARD {
; //
; // generic interface header
; //
; USHORT Size;
; USHORT Version;
; PVOID Context;
; PINTERFACE_REFERENCE InterfaceReference;
; PINTERFACE_DEREFERENCE InterfaceDereference;
; //
; // standard PCI bus interfaces
; //
; PCI_READ_WRITE_CONFIG ReadConfig;
; PCI_READ_WRITE_CONFIG WriteConfig;
; PCI_PIN_TO_LINE PinToLine;
; PCI_LINE_TO_PIN LineToPin;
;} PCI_BUS_INTERFACE_STANDARD, *PPCI_BUS_INTERFACE_STANDARD;
;
;#define PCI_BUS_INTERFACE_STANDARD_VERSION 1
;
;#define PCI_DEVICE_PRESENT_INTERFACE_VERSION 1
;
;typedef
;BOOLEAN
;(*PPCI_IS_DEVICE_PRESENT) (
; IN USHORT VendorID,
; IN USHORT DeviceID,
; IN UCHAR RevisionID,
; IN USHORT SubVendorID,
; IN USHORT SubSystemID,
; IN ULONG Flags
;);
;
;#define PCI_USE_SUBSYSTEM_IDS 0x00000001
;#define PCI_USE_REVISION 0x00000002
;
;
;typedef struct _PCI_DEVICE_PRESENT_INTERFACE {
; //
; // generic interface header
; //
; USHORT Size;
; USHORT Version;
; PVOID Context;
; PINTERFACE_REFERENCE InterfaceReference;
; PINTERFACE_DEREFERENCE InterfaceDereference;
; //
; // pci device info
; //
; PPCI_IS_DEVICE_PRESENT IsDevicePresent;
;} PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE;
;
;
;
;
;#ifdef POOL_TAGGING
;#define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,' kdD')
;#define ExAllocatePoolWithQuota(a,b) ExAllocatePoolWithQuotaTag(a,b,' kdD')
;#endif
;
;extern POBJECT_TYPE *IoFileObjectType;
;extern POBJECT_TYPE *ExEventObjectType;
;extern POBJECT_TYPE *ExSemaphoreObjectType;