Windows 内核不透明结构

本文列出并介绍了 Windows 内核不透明结构。 对于其中的许多结构,驱动程序不应访问或更改任何成员,而是应改用系统提供的例程来访问信息。 有关详细信息,请参阅每个结构。

EPROCESS

EPROCESS 结构是一种不透明结构,用作进程的进程对象。

某些例程(如 PsGetProcessCreateTimeQuadPart)使用 EPROCESS 来标识要运行的进程。 驱动程序可以使用 PsGetCurrentProcess 例程获取指向当前进程的进程对象的指针,并且可以使用 ObReferenceObjectByHandle 例程获取指向与指定句柄关联的进程对象的指针。 PsInitialSystemProcess 全局变量指向系统进程的进程对象。

进程对象是对象管理器对象。 驱动程序应使用对象管理器例程(如 ObReferenceObjectObDereferenceObject )来维护对象的引用计数。

标头: Wdm.h。 包括: Wdm.hNtddk.hNtifs.h

ETHREAD

ETHREAD 结构是一种不透明结构,用作线程的线程对象。

某些例程(如 PsIsSystemThread)使用 ETHREAD 来标识要操作的线程。 驱动程序可以使用 PsGetCurrentThread 例程获取指向当前线程的线程对象的指针,并且可以使用 ObReferenceObjectByHandle 例程获取指向与指定句柄关联的线程对象的指针。

线程对象是对象管理器对象。 驱动程序应使用对象管理器例程(如 ObReferenceObjectObDereferenceObject )来维护对象的引用计数。

标头: Wdm.h。 包括: Wdm.hNtddk.hNtifs.h

EX_RUNDOWN_REF

EX_RUNDOWN_REF结构是一个不透明的系统结构,其中包含有关关联共享对象的运行保护状态的信息。

typedef struct _EX_RUNDOWN_REF {
  
  ...  // opaque
  
} EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;

此页面底部列出的运行保护例程都以指向EX_RUNDOWN_REF结构的指针作为其第一个参数。

有关详细信息,请参阅 “运行保护”。 标头: 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.hNtddk.hNtifs.h

FAST_MUTEX

FAST_MUTEX结构是表示快速互斥体的不透明数据结构。 ExInitializeFastMutex 例程初始化此结构。

有关快速互斥体的详细信息,请参阅 快速互斥体和受保护的互斥体

标头: Wdm.h。 包括: Wdm.hNtddk.hNtifs.h

IO_CSQ

IO_CSQ结构是一种不透明结构,用于指定驱动程序的取消安全的 IRP 队列例程。 不要直接设置此结构的成员。 使用 IoCsqInitializeIoCsqInitializeEx 初始化此结构。

有关如何使用取消安全的 IRP 队列的概述,请参阅 “取消安全 IRP 队列”。

Microsoft Windows XP 及更高版本的 Windows 操作系统上可用。

标头: Wdm.h。 包括: Wdm.hNtddk.hNtifs.h

IO_CSQ_IRP_CONTEXT

IO_CSQ_IRP_CONTEXT结构是一种不透明的数据结构,用于在驱动程序的取消安全 IRP 队列中为 IRP 指定 IRP 上下文。 IoCsqInsertIrpIoCsqInsertIrpExIoCsqRemoveIrp 例程使用此结构作为密钥来标识队列中的特定 IRP。

有关如何使用取消安全的 IRP 队列的概述,请参阅 “取消安全 IRP 队列”。

Microsoft Windows XP 及更高版本的 Windows 操作系统上可用。

标头: Wdm.h。 包括: Wdm.hNtddk.hNtifs.h

IO_WORKITEM

IO_WORKITEM结构是描述系统工作线程的工作项的不透明结构。

驱动程序可以通过调用 IoAllocateWorkItem 来分配工作项。 或者,驱动程序可以分配自己的缓冲区,然后调用 IoInitializeWorkItem 以将该缓冲区初始化为工作项。

IoAllocateWorkItem 分配的任何工作项必须由 IoFreeWorkItem 释放 IoInitializeWorkItem 初始化的任何内存都必须未经 IoUninitializeWorkItem 初始化,然后才能释放它。

有关工作项的详细信息,请参阅 系统工作线程

标头: Wdm.h。 包括: Wdm.hNtddk.hNtifs.h

KBUGCHECK_CALLBACK_RECORD

KBUGCHECK_CALLBACK_RECORD结构是 KeRegisterBugCheckCallbackKeDeregisterBugCheckCallback 例程使用的不透明结构。

KBUGCHECK_CALLBACK_RECORD结构由 KeRegisterBugCheckReasonCallback KeDeregisterBugCheckReasonCallback 例程用于记账。

必须在驻留内存中分配结构,例如非分页池。 使用 KeInitializeCallbackRecord 例程在使用它之前初始化结构。

标头: Ntddk.h。 包括: Ntddk.h

KBUGCHECK_REASON_CALLBACK_RECORD

KBUGCHECK_REASON_CALLBACK_RECORD结构是 KeRegisterBugCheckReasonCallbackKeDeregisterBugCheckReasonCallback 例程使用的不透明结构。

KBUGCHECK_REASON_CALLBACK_RECORD结构由 KeRegisterBugCheckReasonCallbackKeDeregisterBugCheckReasonCallback 例程用于记帐。

必须在驻留内存中分配结构,例如非分页池。 使用 KeInitializeCallbackRecord 例程在使用它之前初始化结构。

在 Microsoft具有 Service Pack 1(SP1)、Windows Server 2003 及更高版本的 Windows 操作系统的 Windows XP 上提供。

标头: Ntddk.h。 包括: Ntddk.h

KDPC

KDPC 结构是表示 DPC 对象的不透明结构。 不要直接设置此结构的成员。 请参阅 DPC 对象和 DPC

标头: Wdm.h。 包括: Wdm.hNtddk.hNtifs.h

KFLOATING_SAVE

KFLOATING_SAVE结构是一种不透明结构,描述 KeSaveFloatingPointState 例程保存的浮点状态。

使用 KeRestoreFloatingPointState 还原浮点状态。

标头: Wdm.h。 包括: Wdm.hNtddk.hNtifs.h

KGUARDED_MUTEX

KGUARDED_MUTEX结构是表示受保护的互斥体不透明结构。

使用 KeInitializeGuardedMutex 将KGUARDED_MUTEX结构初始化为受保护的互斥体。

必须从非分页池分配受保护的互斥体。

有关受保护的互斥体的详细信息,请参阅 快速互斥体和受保护的互斥体

标头: Wdm.h。 包括: Wdm.hNtddk.hNtifs.h

KINTERRUPT

KINTERRUPT 结构是表示系统中断的不透明结构。

当驱动程序注册 InterruptService InterruptMessageService 例程时,IoConnectInterruptEx 提供指向中断的 KINTERRUPT 结构的指针。 驱动程序在获取或释放中断旋转锁时使用此指针来获取中断。 驱动程序在注销 InterruptService 例程时也使用此指针。

标头: Wdm.h。 包括: Wdm.hNtddk.hNtifs.h

KLOCK_QUEUE_HANDLE

KLOCK_QUEUE_HANDLE结构是描述排队旋转锁的不透明结构。 驱动程序分配KLOCK_QUEUE_HANDLE结构,并将其传递给 KeAcquireInStackQueuedSpinLockKeAcquireInStackQueuedSpinLockAtDpcLevel 以获取排队的旋转锁。 这些例程初始化结构以表示排队旋转锁。 驱动程序在释放旋转锁时将结构传递给 KeReleaseInStackQueuedSpinLockKeReleaseInStackQueuedSpinLockFromDpcLevel

有关详细信息,请参阅 排队旋转锁

标头: Wdm.h。 包括: Wdm.hNtddk.hNtifs.h

KTIMER

KTIMER 结构是表示计时器对象的不透明结构。 不要直接设置此结构的成员。 有关详细信息,请参阅 计时器对象和 DPC

标头: Wdm.h。 包括: Wdm.hNtddk.hNtifs.h

LOOKASIDE_LIST_EX

LOOKASIDE_LIST_EX结构描述外观列表。

typedef struct _LOOKASIDE_LIST_EX {
  ...  // opaque
} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;

外观列表是固定大小的缓冲区池,驱动程序可以在本地管理,以减少对系统分配例程的调用数,从而提高性能。 缓冲区的大小统一,并作为条目存储在外观列表中。

驱动程序应将 LOOKASIDE_LIST_EX 结构视为不透明。 访问结构成员或依赖于这些成员位置的驱动程序可能无法保持可移植性并与其他驱动程序互操作。

相关文章 ”部分包含使用此结构的例程的列表。

有关外观列表的详细信息,请参阅 使用 Lookaside 列表

在 64 位平台上,此结构必须对齐 16 字节。

标头: Wdm.h。 包括: Wdm.hNtddk.hNtifs.h

NPAGED_LOOKASIDE_LIST

NPAGED_LOOKASIDE_LIST结构是一种不透明结构,用于描述从非分页池分配的固定大小的缓冲区的外观列表。 系统会创建新的条目,并根据需要销毁列表中未使用的条目。 对于固定大小的缓冲区,使用外观列表比直接分配内存更快。

使用 ExInitializeNPagedLookasideList 初始化 lookaside 列表。 使用 ExAllocateFromNPagedLookasideList 从列表中分配缓冲区,并使用 ExFreeToNPagedLookasideList 将缓冲区返回到列表。

驱动程序在卸载之前必须始终显式释放他们创建的任何外观列表。 否则,这是一个严重的编程错误。 使用 ExDeleteNPagedLookasideList 释放列表。

驱动程序还可以对分页池使用外观列表。 PAGED_LOOKASIDE_LIST结构描述包含分页缓冲区的望边列表。 LOOKASIDE_LIST_EX结构可以描述包含分页缓冲区或非分页缓冲区的看边列表。 有关详细信息,请参阅 使用 Lookaside 列表

在 64 位平台上,此结构必须对齐 16 字节。

标头: Wdm.h。 包括: Wdm.hNtddk.hNtifs.h

Object_Type

OBJECT_TYPE 是一种不透明结构,用于指定句柄的对象类型。 有关详细信息,请参阅 ObReferenceObjectByHandle

标头: Wdm.h。 包括: Wdm.hNtddk.hNtifs.h

PAGED_LOOKASIDE_LIST

PAGED_LOOKASIDE_LIST结构是一种不透明结构,用于描述从分页池分配的固定大小的缓冲区的外观列表。 系统会创建新的条目,并根据需要销毁列表中未使用的条目。 对于固定大小的缓冲区,使用外观列表比直接分配内存更快。

使用 ExInitializePagedLookasideList 初始化 lookaside 列表。 使用 ExAllocateFromPagedLookasideList 从列表中分配缓冲区,并使用 ExFreeToPagedLookasideList 将缓冲区返回到列表。

驱动程序在卸载之前必须始终显式释放他们创建的任何外观列表。 否则,这是一个严重的编程错误。 使用 ExDeletePagedLookasideList 释放列表。

驱动程序还可以将查找列表用于非分页池。 NPAGED_LOOKASIDE_LIST结构描述包含非分页缓冲区的看边列表。 LOOKASIDE_LIST_EX结构可以描述包含分页缓冲区或非分页缓冲区的看边列表。 有关详细信息,请参阅 使用 Lookaside 列表

在 64 位平台上,此结构必须对齐 16 字节。

标头: Wdm.h。 包括: Wdm.hNtddk.hNtifs.h

RTL_BITMAP

RTL_BITMAP结构是描述位图的不透明结构。

typedef struct _RTL_BITMAP {
  // opaque
} RTL_BITMAP, *PRTL_BITMAP;

不要直接访问此结构的成员。 依赖于成员位置或直接访问成员值的驱动程序可能无法与 Windows 操作系统的未来版本保持兼容。

RTL_BITMAP结构用作具有任意长度的常规用途一维位图的标头。 驱动程序可以使用这样的位图作为一种经济方式来跟踪一组可重用项。 例如,文件系统可以使用位图来跟踪硬盘上哪些群集和扇区已分配用于保存文件数据。

有关使用RTL_BITMAP结构的 RtlXxx 例程的列表,请参阅“相关文章”部分。 这些 RtlXxx 例程的调用方负责分配RTL_BITMAP结构的存储以及包含位图的缓冲区。 此缓冲区必须以内存中的 4 字节边界开始,并且长度必须为 4 字节的倍数。 位图从缓冲区的开头开始,但可以包含任意数量的位,这些位可以容纳在分配的缓冲区中。

在向 RtlXxx 例程提供RTL_BITMAP结构作为参数之前,请调用 RtlInitializeBitMap 例程来初始化结构。 此例程的输入参数是指向包含位图的缓冲区的指针,以及位图的大小(以位为单位)。 RtlInitializeBitMap 不会更改此缓冲区的内容。

如果调用方为分页内存中的RTL_BITMAP结构和位图分配存储,则调用方必须在 IRQL <= APC_LEVEL运行时,它将指向此结构的指针作为参数传递给“相关文章”部分中列出的任何 RtlXxx 例程。 如果调用方从非分页内存(或者等效地从锁定的分页内存分配存储),则调用方可以在调用 RtlXxx 例程时在任何 IRQL 上运行。

标头: Wdm.h。 包括: Wdm.hNtddk.hNtifs.h

RTL_RUN_ONCE

RTL_RUN_ONCE结构是一种不透明结构,用于存储一次性初始化的信息。

驱动程序必须通过调用 RtlRunOnceInitialize 例程来初始化此结构,然后再将其传递给任何其他 RtlRunOnceXxx 例程。

标头:Ntddk.h。 包括:Ntddk.h。

SECURITY_SUBJECT_CONTEXT

SECURITY_SUBJECT_CONTEXT结构是一种不透明结构,表示发生特定操作的安全上下文。 驱动程序不得修改或尝试直接访问此结构的任何成员以做出安全决策。 相反,为了避免授权中的安全问题,请将此不透明结构传递给 SeAccessCheck SePrivilegeCheck 的调用。

标头: Wdm.h。 包括: Wdm.hNtddk.hNtifs.h

SLIST_HEADER

SLIST_HEADER结构是一种不透明结构,用作按顺序排列的链接列表的标头。 有关详细信息,请参阅 Singly 和 Doubly 链接列表

在 64 位平台上, SLIST_HEADER 结构必须对齐 16 字节。

标头: Wdm.h。 包括: Wdm.hNtddk.hNtifs.h

XSTATE_SAVE

XSTATE_SAVE结构是一种不透明结构,描述内核模式驱动程序保存和还原的扩展处理器状态信息。

typedef struct _XSTATE_SAVE {
  ...  // opaque
} XSTATE_SAVE, *PXSTATE_SAVE;

所有成员都是不透明的。

KeSaveExtendedProcessorStateKeRestoreExtendedProcessorState 例程使用此结构。

标头: Wdm.h。 包括: Wdm.hNtddk.hNtifs.h

ExAcquireFastMutex

ExAcquireFastMutexUnsafe

ExAllocateFromLookasideListEx

ExAllocateFromNPagedLookasideList

ExAllocateFromPagedLookasideList

ExAllocateTimer

ExDeletePagedLookasideList

ExFreeToPagedLookasideList

ExInitializePagedLookasideList

ExCancelTimer

ExDeleteLookasideListEx

ExDeleteNPagedLookasideList

ExDeleteTimer

ExFlushLookasideListEx

ExFreeToLookasideListEx

ExFreeToNPagedLookasideList

ExInitializeLookasideListEx

ExInitializeNPagedLookasideList

ExInitializeSListHead

ExInterlockedFlushSList

ExInterlockedPopEntrySList

ExInterlockedPushEntrySList

ExQueryDepthSList

ExReleaseFastMutex

ExReleaseFastMutexUnsafe

ExSetTimer

ExTryToAcquireFastMutex

ExTimerCallback

IoAllocateWorkItem

IoConnectInterruptEx

IoCsqInitialize

IoCsqInitializeEx

IoCsqInsertIrp

IoCsqInsertIrpEx

IoCsqRemoveIrp

IoDisconnectInterruptEx

IoFreeWorkItem

IoInitializeWorkItem

IoRequestDpc

IoUninitializeWorkItem

KeAcquireGuardedMutex

KeAcquireGuardedMutexUnsafe

KeAcquireInStackQueuedSpinLock

KeAcquireInStackQueuedSpinLockAtDpcLevel

KeAcquireInterruptSpinLock

KeCancelTimer

KeInitializeCallbackRecord

KeInitializeGuardedMutex

KeInitializeTimer

KeInitializeTimerEx

KeReadStateTimer

KeRestoreExtendedProcessorState

KeSaveExtendedProcessorState

KeSetTimer

KeSetTimerEx

KeDeregisterBugCheckCallback

KeDeregisterBugCheckReasonCallback

KeInsertQueueDpc

KeRegisterBugCheckCallback

KeRegisterBugCheckReasonCallback

KeReleaseGuardedMutexUnsafe

KeReleaseInStackQueuedSpinLock

KeReleaseInStackQueuedSpinLockFromDpcLevel

KeReleaseInterruptSpinLock

KeRestoreFloatingPointState

KeSaveFloatingPointState

KeSynchronizeExecution

LookasideListAllocateEx

LookasideListFreeEx

ObReferenceObjectByHandle

PsGetCurrentProcess

PsGetProcessCreateTimeQuadPart

PsInitialSystemProcess

PsIsSystemThread

读取 Bug 检查回调数据

RtlRunOnceBeginInitialize

RtlRunOnceComplete

RtlRunOnceExecuteOnce

RtlRunOnceInitialize

RunOnceInitialization

运行保护

SeAccessCheck

SeAssignSecurity

SeAssignSecurityEx