Поделиться через


Непрозрачные структуры ядра Windows

В этой статье перечислены и описываются непрозрачные структуры ядра Windows. Для многих из этих структур драйверы не должны получать доступ к каким-либо членам или изменять их, но вместо этого следует использовать системные подпрограммы для доступа к информации. Дополнительные сведения см. в каждой структуре.

EPROCESS

Структура EPROCESS — это непрозрачная структура, которая служит объектом процесса для процесса.

Некоторые подпрограммы, например PsGetProcessCreateTimeQuadPart, используют EPROCESS для определения процесса, с которым нужно работать. Драйверы могут использовать подпрограмму PsGetCurrentProcess для получения указателя на объект процесса для текущего процесса, а подпрограмму ObReferenceObjectByHandle — для получения указателя на объект процесса, связанный с указанным дескриптором. Глобальная переменная PsInitialSystemProcess указывает на объект процесса для системного процесса.

Объект process — это объект диспетчера объектов. Драйверы должны использовать подпрограммы диспетчера объектов, такие как 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 в качестве первого параметра.

Дополнительные сведения см. в разделе Защита от запуска. Заголовок: Wdm.h. Включите Wdm.h.

EX_TIMER

Структура EX_TIMER — это непрозрачная структура, используемая операционной системой для представления объекта таймера EX_TIMER .

typedef struct _EX_TIMER *PEX_TIMER;

Все элементы этой структуры непрозрачны для драйверов.

Для следующих подпрограмм ExXxxTimer требуется указатель на структуру, выделенную системой EX_TIMER в качестве входного параметра:

Операционная система создает объекты таймера на основе EX_TIMER. Чтобы получить такой объект таймера, драйвер вызывает подпрограмму ExAllocateTimer . Если этот объект больше не нужен, драйвер отвечает за удаление объекта путем вызова ExDeleteTimer.

Дополнительные сведения см. в разделе Подпрограммы таймера и объекты 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.

Доступно в 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 , чтобы инициализировать структуру перед ее использованием.

Доступно в Microsoft Windows XP с пакетом обновления 1 (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 предоставляет указатель на структуру KINTERRUPT для прерывания, когда драйвер регистрирует подпрограмму InterruptService или InterruptMessageService . Драйвер использует этот указатель при получении или освобождении блокировки спина прерывания для прерывания. Драйвер также использует этот указатель при отмене регистрации подпрограммы 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 см. в разделе Использование lookaside Списки.

На 64-разрядных платформах эта структура должна быть выровнена по 16 байтам.

Поддерживается начиная с Windows Vista.

Заголовок: Wdm.h. Включить: Wdm.h, Ntddk.h, Ntifs.h.

NPAGED_LOOKASIDE_LIST

Структура NPAGED_LOOKASIDE_LIST — это непрозрачная структура, описывающая список буферов фиксированного размера, выделенных из непагированного пула. Система создает новые записи и при необходимости удаляет неиспользуемые записи в списке. Для буферов фиксированного размера использование списка lookaside быстрее, чем выделение памяти напрямую.

Используйте ExInitializeNPagedLookasideList для инициализации списка lookaside. Используйте ExAllocateFromNPagedLookasideList , чтобы выделить буфер из списка, и ExFreeToNPagedLookasideList , чтобы вернуть буфер в список.

Драйверы всегда должны явным образом освобождать все списки просмотра, которые они создают перед выгрузками. В противном случае это серьезная ошибка программирования. Используйте ExDeleteNPagedLookasideList , чтобы освободить список.

Драйверы также могут использовать списки lookaside для выстраивного пула. Начиная с Windows 2000, структура PAGED_LOOKASIDE_LIST описывает внешний список, содержащий выстраиваемые буферы. Начиная с Windows Vista, структура LOOKASIDE_LIST_EX может описывать список со страницами или буферы без пачки. Дополнительные сведения см. в статье Использование lookaside Списки.

На 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 — это непрозрачная структура, описывающая список буферов фиксированного размера, выделенных из выгружаемого пула. Система создает новые записи и при необходимости удаляет неиспользуемые записи в списке. Для буферов фиксированного размера использование списка lookaside быстрее, чем выделение памяти напрямую.

Используйте ExInitializePagedLookasideList для инициализации списка lookaside. Используйте ExAllocateFromPagedLookasideList , чтобы выделить буфер из списка, и ExFreeToPagedLookasideList , чтобы вернуть буфер в список.

Драйверы всегда должны явным образом освобождать все списки просмотра, которые они создают перед выгрузками. В противном случае это серьезная ошибка программирования. Используйте ExDeletePagedLookasideList , чтобы освободить список.

Драйверы также могут использовать списки lookaside для непагированного пула. Начиная с Windows 2000, структура NPAGED_LOOKASIDE_LIST описывает внешний список, содержащий непагированные буферы. Начиная с Windows Vista, структура LOOKASIDE_LIST_EX может описывать список внешних элементов, содержащий буферы со страницами или буферы без пачки. Дополнительные сведения см. в статье Использование lookaside Списки.

На 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 служит заголовком для одномерного растрового изображения общего назначения произвольной длины. Драйвер может использовать такое растровое изображение как экономичный способ отслеживания набора многократно используемых элементов. Например, файловая система может использовать точечные изображения для отслеживания кластеров и секторов на жестком диске, которые уже были выделены для хранения файловых данных.

Список процедур RtlXxx , использующих RTL_BITMAP структуры, см. в разделе Связанные статьи . Вызывающий объект этих подпрограмм RtlXxx отвечает за выделение хранилища для структуры RTL_BITMAP и буфера, содержащего растровое изображение. Этот буфер должен начинаться с четырехбайтовой границы в памяти и должен иметь длину, кратную четырем байтам. Растровое изображение начинается с начала буфера, но может содержать любое количество битов, помещаемых в выделенный буфер.

Перед предоставлением структуры RTL_BITMAP в качестве параметра подпрограмме RtlXxx вызовите подпрограмму RtlInitializeBitMap для инициализации структуры. Входные параметры этой подпрограммы являются указателем на буфер, содержащий растровое изображение, и размер растрового изображения в битах. RtlInitializeBitMap не изменяет содержимое этого буфера.

Если вызывающий объект выделяет хранилище для структуры RTL_BITMAP и растрового изображения в памяти с разбиением на страницы, вызывающий объект должен выполняться по адресу IRQL <= APC_LEVEL при передачи указателя на эту структуру в качестве параметра любой из подпрограмм RtlXxx , перечисленных в разделе Связанные статьи . Если вызывающий объект выделяет хранилище из невыгружаемой памяти (или, эквивалентно, из заблокированной памяти с разбивкой на страницы), вызывающий объект может выполняться на любом языке IRQL при вызове подпрограммы RtlXxx .

Поддерживается в 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 Списки.

На 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 7 и более поздних версиях операционной системы Windows.

Заголовок: Wdm.h. Включить: Wdm.h, Ntddk.h, Ntifs.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

Чтение данных обратного вызова проверки ошибок

RtlRunOnceBeginInitialize

RtlRunOnceComplete

RtlRunOnceExecuteOnce

RtlRunOnceInitialize

RunOnceInitialization

Защита от запуска

SeAccessCheck

SeAssignSecurity

SeAssignSecurityEx