Windows 内核不透明结构
本文列出并介绍了 Windows 内核不透明结构。 对于其中许多结构,驱动程序不应访问或更改任何成员,而应改用系统提供的例程来访问信息。 有关详细信息,请参阅每个结构。
EPROCESS
EPROCESS 结构是一种不透明结构,用作进程的进程对象。
某些例程(如 PsGetProcessCreateTimeQuadPart)使用 EPROCESS 来标识要操作的进程。 驱动程序可以使用 PsGetCurrentProcess 例程获取指向当前进程的进程对象的指针,并使用 ObReferenceObjectByHandle 例程获取指向与指定句柄关联的进程对象的指针。 PsInitialSystemProcess 全局变量指向系统进程的进程对象。
进程对象是对象管理器对象。 驱动程序应使用对象管理器例程(如 ObReferenceObject 和 ObDereferenceObject )来维护对象的引用计数。
标头: Wdm.h。 包括: Wdm.h、 Ntddk.h、 Ntifs.h。
ETHREAD
ETHREAD 结构是一个不透明的结构,用作线程的线程对象。
某些例程(如 PsIsSystemThread)使用 ETHREAD 来标识要操作的线程。 驱动程序可以使用 PsGetCurrentThread 例程获取指向当前线程的线程对象的指针,并使用 ObReferenceObjectByHandle 例程获取指向与指定句柄关联的线程对象的指针。
线程对象是对象管理器对象。 驱动程序应使用对象管理器例程(如 ObReferenceObject 和 ObDereferenceObject )来维护对象的引用计数。
标头: Wdm.h。 包括: Wdm.h、 Ntddk.h、 Ntifs.h。
EX_RUNDOWN_REF
EX_RUNDOWN_REF 结构是一个不透明的系统结构,其中包含有关关联共享对象的运行保护状态的信息。
typedef struct _EX_RUNDOWN_REF {
... // opaque
} EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
本页底部列出的保护例程都使用指向 EX_RUNDOWN_REF 结构的指针作为其第一个参数。
有关详细信息,请参阅 Run-Down Protection。 标头: Wdm.h。 包括 Wdm.h。
EX_TIMER
EX_TIMER 结构是操作系统用来表示EX_TIMER计时器对象的不透明结构。
typedef struct _EX_TIMER *PEX_TIMER;
此结构的所有成员对驱动程序是不透明的。
以下 ExXxx计时器 例程需要指向系统分配 的EX_TIMER 结构的指针作为输入参数:
操作系统创建基于 EX_TIMER的计时器对象。 若要获取此类计时器对象,驱动程序会调用 ExAllocateTimer 例程。 当不再需要此对象时,驱动程序负责通过调用 ExDeleteTimer 删除该对象。
有关详细信息,请参阅 ExXxx计时器例程和EX_TIMER对象。
标头: Wdm.h。 包括: Wdm.h、 Ntddk.h、 Ntifs.h。
FAST_MUTEX
FAST_MUTEX结构是表示快速互斥体的不透明数据结构。 ExInitializeFastMutex 例程初始化此结构。
有关快速互斥的详细信息,请参阅 快速互斥体和受保护的互斥体。
标头: Wdm.h。 包括: Wdm.h、 Ntddk.h、 Ntifs.h。
IO_CSQ
IO_CSQ 结构是不透明的结构,用于指定驱动程序的取消安全 IRP 队列例程。 不要直接设置此结构的成员。 使用 IoCsqInitialize 或 IoCsqInitializeEx 初始化此结构。
有关如何使用取消安全 IRP 队列的概述,请参阅 取消安全 IRP 队列。
在 Microsoft Windows XP 和更高版本的 Windows 操作系统上可用。
标头: Wdm.h。 包括: Wdm.h、 Ntddk.h、 Ntifs.h。
IO_CSQ_IRP_CONTEXT
IO_CSQ_IRP_CONTEXT结构是一种不透明数据结构,用于在驱动程序的取消安全 IRP 队列中指定 IRP 的 IRP 上下文。 IoCsqInsertIrp、IoCsqInsertIrpEx 和 IoCsqRemoveIrp 例程使用此结构作为键来标识队列中的特定 IRP。
有关如何使用取消安全 IRP 队列的概述,请参阅 取消安全 IRP 队列。
在 Microsoft Windows XP 和更高版本的 Windows 操作系统上可用。
标头: Wdm.h。 包括: Wdm.h、 Ntddk.h、 Ntifs.h。
IO_WORKITEM
IO_WORKITEM 结构是描述系统工作线程的工作项的不透明结构。
驱动程序可以通过调用 IoAllocateWorkItem 来分配工作项。 或者,驱动程序可以分配自己的缓冲区,然后调用 IoInitializeWorkItem 以将缓冲区初始化为工作项。
IoAllocateWorkItem 分配的任何工作项都必须由 IoFreeWorkItem 释放。 IoInitializeWorkItem 初始化的任何内存都必须由 IoUninitializeWorkItem 取消初始化,然后才能释放它。
有关工作项的详细信息,请参阅 系统工作线程。
标头: Wdm.h。 包括: Wdm.h、 Ntddk.h、 Ntifs.h。
KBUGCHECK_CALLBACK_RECORD
KBUGCHECK_CALLBACK_RECORD结构是 KeRegisterBugCheckCallback 和 KeDeregisterBugCheckCallback 例程使用的不透明结构。
KBUGCHECK_CALLBACK_RECORD结构由 KeRegisterBugCheckReasonCallback 和 KeDeregisterBugCheckReasonCallback 例程用于记账。
结构必须在常驻内存中分配,例如非分页池。 使用 KeInitializeCallbackRecord 例程在使用该结构之前对其进行初始化。
标头: Ntddk.h。 包括: Ntddk.h。
KBUGCHECK_REASON_CALLBACK_RECORD
KBUGCHECK_REASON_CALLBACK_RECORD 结构是 KeRegisterBugCheckReasonCallback 和 KeDeregisterBugCheckReasonCallback 例程使用的不透明结构。
KBUGCHECK_REASON_CALLBACK_RECORD结构由 KeRegisterBugCheckReasonCallback 和 KeDeregisterBugCheckReasonCallback 例程用于簿记。
结构必须在常驻内存中分配,例如非分页池。 使用 KeInitializeCallbackRecord 例程在使用该结构之前对其进行初始化。
适用于具有 Service Pack 1 的 Microsoft Windows XP (SP1) 、Windows Server 2003 及更高版本的 Windows 操作系统。
标头: Ntddk.h。 包括: Ntddk.h。
KDPC
KDPC 结构是表示 DPC 对象的不透明结构。 不要直接设置此结构的成员。 请参阅 DPC 对象和 DPC。
标头: Wdm.h。 包括: Wdm.h、 Ntddk.h、 Ntifs.h。
KFLOATING_SAVE
KFLOATING_SAVE 结构是一个不透明的结构,用于描述 KeSaveFloatingPointState 例程保存的浮点状态。
使用 KeRestoreFloatingPointState 还原浮点状态。
标头: Wdm.h。 包括: Wdm.h、 Ntddk.h、 Ntifs.h。
KGUARDED_MUTEX
KGUARDED_MUTEX结构是表示受保护的互斥体的不透明结构。
使用 KeInitializeGuardedMutex 将 KGUARDED_MUTEX 结构初始化为受保护的互斥体。
必须从非分页池中分配受保护的互斥体。
有关受保护的互斥体的详细信息,请参阅 快速互斥体和受保护的互斥体。
标头: Wdm.h。 包括: Wdm.h、 Ntddk.h、 Ntifs.h。
KINTERRUPT
KINTERRUPT 结构是表示系统中断的不透明结构。
IoConnectInterruptEx 在驱动程序注册 InterruptService 或 InterruptMessageService 例程时提供指向中断的 KINTERRUPT 结构的指针。 驱动程序在获取或释放中断的中断旋转锁时使用此指针。 驱动程序在注销 InterruptService 例程时也使用此指针。
标头: Wdm.h。 包括: Wdm.h、 Ntddk.h、 Ntifs.h。
KLOCK_QUEUE_HANDLE
KLOCK_QUEUE_HANDLE结构是描述排队旋转锁的不透明结构。 驱动程序分配 KLOCK_QUEUE_HANDLE 结构,并将其传递给 KeAcquireInStackQueuedSpinLock 和 KeAcquireInStackQueuedSpinLockAtDpcLevel 以获取排队的旋转锁。 这些例程初始化结构以表示排队的旋转锁。 释放旋转锁时,驱动程序会将结构传递给 KeReleaseInStackQueuedSpinLock 和 KeReleaseInStackQueuedSpinLockFromDpcLevel 。
有关详细信息,请参阅 排队的旋转锁。
标头: Wdm.h。 包括: Wdm.h、 Ntddk.h、 Ntifs.h。
KTIMER
KTIMER 结构是表示计时器对象的不透明结构。 不要直接设置此结构的成员。 有关详细信息,请参阅 计时器对象和 DPC。
标头: Wdm.h。 包括: Wdm.h、 Ntddk.h、 Ntifs.h。
LOOKASIDE_LIST_EX
LOOKASIDE_LIST_EX结构描述旁观列表。
typedef struct _LOOKASIDE_LIST_EX {
... // opaque
} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
旁观列表是一个固定大小的缓冲区池,驱动程序可以在本地管理这些缓冲区,以减少对系统分配例程的调用数,从而提高性能。 缓冲区的大小统一,作为条目存储在 lookaside 列表中。
驱动程序应将 LOOKASIDE_LIST_EX 结构视为不透明。 访问结构成员或依赖于这些成员位置的驱动程序可能无法保持可移植性并与其他驱动程序互操作。
“相关文章”部分包含使用此结构的例程的列表。
有关 lookaside 列表的详细信息,请参阅 Using Lookaside Lists。
在 64 位平台上,此结构必须对齐 16 字节。
从 Windows Vista 开始支持。
标头: Wdm.h。 包括: Wdm.h、 Ntddk.h、 Ntifs.h。
NPAGED_LOOKASIDE_LIST
NPAGED_LOOKASIDE_LIST 结构是一种不透明的结构,用于描述从非分页池分配的固定大小缓冲区的旁观列表。 系统会创建新条目,并在必要时销毁列表中未使用的条目。 对于固定大小的缓冲区,使用查看列表比直接分配内存更快。
使用 ExInitializeNPagedLookasideList 初始化 lookaside 列表。 使用 ExAllocateFromNPagedLookasideList 从列表中分配缓冲区,使用 ExFreeToNPagedLookasideList 将缓冲区返回到列表。
在卸载之前,驱动程序必须始终显式释放其创建的任何旁观列表。 否则,这是一个严重的编程错误。 使用 ExDeleteNPagedLookasideList 释放列表。
驱动程序还可以使用分页池的旁观列表。 从 Windows 2000 开始, PAGED_LOOKASIDE_LIST 结构描述包含分页缓冲区的旁观列表。 从 Windows Vista 开始, LOOKASIDE_LIST_EX 结构可以描述包含分页缓冲区或非分页缓冲区的旁观列表。 有关详细信息,请参阅使用 Lookaside Lists。
在 64 位平台上,此结构必须对齐 16 字节。
从 Windows 2000 开始受支持。
标头: Wdm.h。 包括: Wdm.h、 Ntddk.h、 Ntifs.h。
Object_Type
OBJECT_TYPE 是一个不透明结构,用于指定句柄的对象类型。 有关详细信息,请参阅 ObReferenceObjectByHandle。
标头: Wdm.h。 包括: Wdm.h、 Ntddk.h、 Ntifs.h。
PAGED_LOOKASIDE_LIST
PAGED_LOOKASIDE_LIST 结构是一种不透明结构,用于描述从分页池分配的固定大小缓冲区的旁观列表。 系统会创建新条目,并在必要时销毁列表中未使用的条目。 对于固定大小的缓冲区,使用查看列表比直接分配内存更快。
使用 ExInitializePagedLookasideList 初始化 lookaside 列表。 使用 ExAllocateFromPagedLookasideList 从列表中分配缓冲区,使用 ExFreeToPagedLookasideList 将缓冲区返回到列表。
在卸载之前,驱动程序必须始终显式释放其创建的任何旁观列表。 否则,这是一个严重的编程错误。 使用 ExDeletePagedLookasideList 释放列表。
驱动程序还可以对非分页池使用查看列表。 从 Windows 2000 开始, NPAGED_LOOKASIDE_LIST 结构描述包含非分页缓冲区的旁观列表。 从 Windows Vista 开始, LOOKASIDE_LIST_EX 结构可以描述包含分页缓冲区或非分页缓冲区的旁观列表。 有关详细信息,请参阅使用 Lookaside Lists。
在 64 位平台上,此结构必须对齐 16 字节。
从 Windows 2000 开始受支持。
标头: Wdm.h。 包括: Wdm.h、 Ntddk.h、 Ntifs.h。
RTL_BITMAP
RTL_BITMAP结构是描述位图的不透明结构。
typedef struct _RTL_BITMAP {
// opaque
} RTL_BITMAP, *PRTL_BITMAP;
不要直接访问此结构的成员。 依赖于成员位置或直接访问成员值的驱动程序可能与 Windows 操作系统的未来版本不兼容。
RTL_BITMAP结构用作任意长度的常规用途一维位图的标头。 驱动程序可以使用此类位图作为一种经济方式来跟踪一组可重用项。 例如,文件系统可以使用位图来跟踪已分配硬盘上的哪些群集和扇区来保存文件数据。
有关使用RTL_BITMAP结构的 RtlXxx 例程的列表,请参阅相关文章部分。 这些 RtlXxx 例程的调用方负责为 RTL_BITMAP 结构和包含位图的缓冲区分配存储。 此缓冲区必须从内存中的四字节边界开始,并且长度必须为四个字节的倍数。 位图从缓冲区的开头开始,但可以包含分配的缓冲区中容纳的任意数量的位。
在将 RTL_BITMAP 结构作为参数提供给 RtlXxx 例程之前,请调用 RtlInitializeBitMap 例程来初始化结构。 此例程的输入参数是指向缓冲区的指针,该缓冲区包含位图和位图的大小(以位为单位)。 RtlInitializeBitMap 不会更改此缓冲区的内容。
如果调用方为分页内存中的RTL_BITMAP结构和位图分配存储,则调用方必须将指向此结构的指针作为参数传递给“相关文章”部分中列出的任何 RtlXxx 例程时,必须在 IRQL <= APC_LEVEL 运行。 如果调用方从非分页内存 (分配存储,或者从锁定的分页内存) 分配存储,则在调用 RtlXxx 例程时,调用方可以在任何 IRQL 中运行。
在 Windows 2000 及更高版本的 Windows 中受支持。
标头: Wdm.h。 包括: Wdm.h、 Ntddk.h、 Ntifs.h。
RTL_RUN_ONCE
RTL_RUN_ONCE 结构是一种不透明的结构,用于存储一次性初始化的信息。
驱动程序必须先通过调用 RtlRunOnceInitialize 例程来初始化此结构,然后再将其传递给任何其他 RtlRunOnceXxx 例程。
适用于 Windows Vista 和更高版本的 Windows 操作系统。
标头:Ntddk.h。 包括:Ntddk.h。
SECURITY_SUBJECT_CONTEXT
SECURITY_SUBJECT_CONTEXT结构是一个不透明的结构,表示在其中执行特定操作的安全上下文。 驱动程序不得修改或尝试直接访问此结构的任何成员以做出安全决策。 相反,为了避免授权中的安全问题,请在调用 SeAccessCheck 或 SePrivilegeCheck 时传递此不透明结构。
标头: Wdm.h。 包括: Wdm.h、 Ntddk.h、 Ntifs.h。
SLIST_HEADER
SLIST_HEADER结构是一种不透明的结构,用作序列单向链接列表的标头。 有关详细信息,请参阅 Singly 和 Doubly Linked Lists。
在 64 位平台上, SLIST_HEADER 结构必须对齐 16 字节。
标头: Wdm.h。 包括: Wdm.h、 Ntddk.h、 Ntifs.h。
XSTATE_SAVE
XSTATE_SAVE 结构是一种不透明结构,用于描述内核模式驱动程序保存和还原的扩展处理器状态信息。
typedef struct _XSTATE_SAVE {
... // opaque
} XSTATE_SAVE, *PXSTATE_SAVE;
所有成员都是不透明的。
KeSaveExtendedProcessorState 和 KeRestoreExtendedProcessorState 例程使用此结构。
在 Windows 操作系统的 Windows 7 及更高版本中受支持。
标头: Wdm.h。 包括: Wdm.h、 Ntddk.h、 Ntifs.h。
相关文章
ExAllocateFromNPagedLookasideList
ExAllocateFromPagedLookasideList
ExInitializePagedLookasideList
ExInitializeNPagedLookasideList
KeAcquireInStackQueuedSpinLock
KeAcquireInStackQueuedSpinLockAtDpcLevel
KeRestoreExtendedProcessorState
KeDeregisterBugCheckReasonCallback
KeRegisterBugCheckReasonCallback
KeReleaseInStackQueuedSpinLock
KeReleaseInStackQueuedSpinLockFromDpcLevel