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


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

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

EPROCESS

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

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

Объект процесса — это объект Object Manager. Драйверы должны использовать подпрограммы Диспетчера объектов, такие как ObReferenceObject и ObDereferenceObject для поддержания количества ссылок объекта.

Заголовок: Wdm.h. Include: Wdm.h, Ntddk.h, Ntifs.h.

ETHREAD

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

Некоторые подпрограммы, такие как PsIsSystemThread, используют ETHREAD для идентификации потока для работы. Драйверы могут использовать подпрограмму PsGetCurrentThread для получения указателя на объект потока для текущего потока и может использовать подпрограмму ObReferenceObjectByHandle для получения указателя на объект потока, связанный с указанным дескриптором.

Объект потока — это объект Object Manager. Драйверы должны использовать подпрограммы Диспетчера объектов, такие как ObReferenceObject и ObDereferenceObject для поддержания количества ссылок объекта.

Заголовок: Wdm.h. Include: 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;

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

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

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

Дополнительные сведения см. в разделе "Подпрограммы таймера ExXxx" и EX_TIMER объектов.

Заголовок: Wdm.h. Include: Wdm.h, Ntddk.h, Ntifs.h.

FAST_MUTEX

Структура FAST_MUTEX — это непрозрачная структура данных, представляющая быстрый мьютекс. Подпрограмма ExInitializeFastMutex инициализирует эту структуру.

Дополнительные сведения о быстрых мьютексах см. в разделе "Быстрые мьютексы" и "Защищенные мьютексы".

Заголовок: Wdm.h. Include: Wdm.h, Ntddk.h, Ntifs.h.

IO_CSQ

Структура IO_CSQ — это непрозрачная структура, используемая для указания подпрограмм очереди IRP для драйвера. Не устанавливайте элементы этой структуры напрямую. Используйте IoCsqInitialize или IoCsqInitializeEx для инициализации этой структуры.

Общие сведения об использовании очередей IRP, безопасных для отмены, см. в разделе "Очереди IRP", безопасные для отмены.

Доступно в Microsoft Windows XP и более поздних версиях операционной системы Windows.

Заголовок: Wdm.h. Include: Wdm.h, Ntddk.h, Ntifs.h.

IO_CSQ_IRP_CONTEXT

Структура IO_CSQ_IRP_CONTEXT — это непрозрачная структура данных, используемая для указания контекста IRP для IRP в очереди IRP драйвера, безопасной для IRP. Подпрограммы IoCsqInsertIrp, IoCsqInsertIrpEx и IoCsqRemoveIrp используют эту структуру в качестве ключа для идентификации конкретных IRP в очереди.

Общие сведения об использовании очередей IRP, безопасных для отмены, см. в разделе "Очереди IRP", безопасные для отмены.

Доступно в Microsoft Windows XP и более поздних версиях операционной системы Windows.

Заголовок: Wdm.h. Include: Wdm.h, Ntddk.h, Ntifs.h.

IO_WORKITEM

Структура IO_WORKITEM — это непрозрачная структура, описывающая рабочий элемент для рабочего потока системы.

Драйвер может выделить рабочий элемент, вызвав IoAllocateWorkItem. Кроме того, драйвер может выделить свой собственный буфер, а затем вызвать IoInitializeWorkItem , чтобы инициализировать этот буфер в качестве рабочего элемента.

Любой рабочий элемент, выделенный IoAllocateWorkItem, должен быть освобожден IoFreeWorkItem. Для освобождения памяти, инициализации IoInitializeWorkItem необходимо неинициализировать с помощью IoUninitializeWorkItem.

Дополнительные сведения о рабочих элементах см. в разделе "Рабочие потоки системы".

Заголовок: Wdm.h. Include: 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" и "DPCs".

Заголовок: Wdm.h. Include: Wdm.h, Ntddk.h, Ntifs.h.

KFLOATING_SAVE

Структура KFLOATING_SAVE — это непрозрачная структура, описывающая состояние с плавающей запятой, сохраненное подпрограммой KeSaveFloatingPointState.

Используйте KeRestoreFloatingPointState для восстановления состояния с плавающей запятой.

Заголовок: Wdm.h. Include: Wdm.h, Ntddk.h, Ntifs.h.

KGUARDED_MUTEX

Структура KGUARDED_MUTEX является непрозрачной структурой, представляющей защищенный мьютекс.

Используйте KeInitializeGuardedMutex для инициализации структуры KGUARDED_MUTEX в качестве защищенного мьютекса.

Защищенные мьютексы должны быть выделены из нестраничного пула.

Дополнительные сведения о защищенных мьютексах см. в разделе Fast Mutexes и Guarded Mutexes.

Заголовок: Wdm.h. Include: Wdm.h, Ntddk.h, Ntifs.h.

KINTERRUPT

Структура KINTERRUPT — это непрозрачная структура, представляющая прерывание системы.

IoConnectInterruptEx предоставляет указатель на структуру KINTERRUPT для прерывания, когда драйвер регистрирует подпрограмму InterruptService или InterruptMessageService. Драйвер использует этот указатель при получении или освобождении блокировки прерывания для прерывания. Драйвер также использует этот указатель при отмене регистрации подпрограммы Прерывания.

Заголовок: Wdm.h. Include: Wdm.h, Ntddk.h, Ntifs.h.

KLOCK_QUEUE_HANDLE

Структура KLOCK_QUEUE_HANDLE — это непрозрачная структура, описывающая блокировку спина в очереди. Драйвер выделяет KLOCK_QUEUE_HANDLE структуру и передает его в KeAcquireInStackQueuedSpinLock и KeAcquireInStackQueuedSpinLockAtDpcLevel, чтобы получить очередь спин-блокировки. Эти подпрограммы инициализируют структуру для представления очереди спин-блокировки. Драйвер передает структуру в KeReleaseInStackQueuedSpinLock и KeReleaseInStackQueuedSpinLockFromDpcLevel при освобождении блокировки спина.

Дополнительные сведения см. в разделе "Блоки спина в очереди".

Заголовок: Wdm.h. Include: Wdm.h, Ntddk.h, Ntifs.h.

KTIMER

Структура KTIMER — это непрозрачная структура, представляющая объект таймера. Не устанавливайте элементы этой структуры напрямую. Дополнительные сведения см. в разделе "Объекты таймера" и "ЦП".

Заголовок: Wdm.h. Include: Wdm.h, Ntddk.h, Ntifs.h.

LOOKASIDE_LIST_EX

Структура LOOKASIDE_LIST_EX описывает список lookaside.

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

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

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

В разделе "Связанные статьи" содержится список подпрограмм, использующих эту структуру.

Дополнительные сведения о списках lookaside см. в разделе Using Lookaside Lists.

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

Заголовок: Wdm.h. Include: Wdm.h, Ntddk.h, Ntifs.h.

NPAGED_LOOKASIDE_LIST

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

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

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

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

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

Заголовок: Wdm.h. Include: Wdm.h, Ntddk.h, Ntifs.h.

OBJECT_TYPE

OBJECT_TYPE — непрозрачная структура, указывающая тип объекта дескриптора. Дополнительные сведения см. в разделе ObReferenceObjectByHandle.

Заголовок: Wdm.h. Include: Wdm.h, Ntddk.h, Ntifs.h.

PAGED_LOOKASIDE_LIST

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

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

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

Драйверы также могут использовать списки lookaside для непагированного пула. Структура NPAGED_LOOKASIDE_LIST описывает список lookaside, содержащий непагированные буферы. Структура LOOKASIDE_LIST_EX может описать список lookaside, содержащий страницы или непагированные буферы. Дополнительные сведения см. в разделе "Использование списков Lookaside".

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

Заголовок: Wdm.h. Include: 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 и буфера, содержащего растровое изображение. Этот буфер должен начинаться с 4 байтовой границы в памяти и должен иметь длину в 4 байта. Растровое изображение начинается в начале буфера, но может содержать любое количество битов, которые помещаются в выделенный буфер.

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

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

Заголовок: Wdm.h. Include: Wdm.h, Ntddk.h, Ntifs.h.

RTL_RUN_ONCE

Структура RTL_RUN_ONCE — это непрозрачная структура, в которой хранятся сведения для однократной инициализации.

Драйверы должны инициализировать эту структуру, вызвав подпрограмму RtlRunOnceInitialize перед передачей в другие подпрограммы RtlRunOnceXxx.

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

SECURITY_SUBJECT_CONTEXT

Структура SECURITY_SUBJECT_CONTEXT — это непрозрачная структура, представляющая контекст безопасности, в котором выполняется определенная операция. Драйверы не должны изменять или пытаться напрямую обращаться к любым членам этой структуры для принятия решений по безопасности. Вместо этого, чтобы избежать проблем с безопасностью в авторизации, передайте эту непрозрачную структуру в вызовах SeAccessCheck или SePrivilegeCheck.

Заголовок: Wdm.h. Include: Wdm.h, Ntddk.h, Ntifs.h.

SLIST_HEADER

Структура SLIST_HEADER — это непрозрачная структура, которая служит заголовком для последовательно связанного списка. Дополнительные сведения см. в разделе "Singly и Doubly Linked Lists".

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

Заголовок: Wdm.h. Include: Wdm.h, Ntddk.h, Ntifs.h.

XSTATE_SAVE

Структура XSTATE_SAVE — это непрозрачная структура, описывающая сведения о состоянии расширенного процессора, которые сохраняет и восстанавливает драйвер в режиме ядра.

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

Все члены непрозрачны.

Подпрограммы KeSaveExtendedProcessorState и KeRestoreExtendedProcessorState используют эту структуру.

Заголовок: Wdm.h. Include: 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