Udostępnij przez


Nieprzezroczyste struktury jądra systemu Windows

W tym artykule wymieniono i opisano nieprzezroczyste struktury jądra systemu Windows. W przypadku wielu z tych struktur sterowniki nie powinny uzyskiwać dostępu do żadnych członków ani zmieniać ich; zamiast tego powinny używać dostarczonych przez system procedur w celu uzyskania dostępu do informacji. Zobacz każdą strukturę, aby uzyskać szczegółowe informacje.

EPROCESS

Struktura EPROCESS jest nieprzezroczystą strukturą, która służy jako obiekt procesu dla danego procesu.

Niektóre procedury, takie jak PsGetProcessCreateTimeQuadPart, używają EPROCESS do zidentyfikowania procesu, na którym mają działać. Sterowniki mogą używać procedury PsGetCurrentProcess , aby uzyskać wskaźnik do obiektu procesu dla bieżącego procesu i może użyć procedury ObReferenceObjectByHandle , aby uzyskać wskaźnik do obiektu procesu skojarzonego z określonym uchwytem. Zmienna globalna PsInitialSystemProcess wskazuje obiekt procesu dla procesu systemowego.

Obiekt procesu jest obiektem Menedżera obiektów. Sterowniki powinny używać procedur menedżera obiektów, takich jak ObReferenceObject i obDereferenceObject, aby zachować liczbę odwołań obiektu.

Nagłówek: Wdm.h. Uwzględnij: Wdm.h, Ntddk.h, Ntifs.h.

ETHREAD

Struktura ETHREAD jest nieprzezroczystą strukturą, która służy jako obiekt wątku dla wątku.

Niektóre procedury, takie jak PsIsSystemThread, używają ETHREAD, aby zidentyfikować wątek do działania. Sterowniki mogą używać procedury PsGetCurrentThread , aby uzyskać wskaźnik do obiektu wątku dla bieżącego wątku i może użyć procedury ObReferenceObjectByHandle , aby uzyskać wskaźnik do obiektu wątku skojarzonego z określonym uchwytem.

Obiekt wątku jest obiektem Menedżera obiektów. Sterowniki powinny używać procedur menedżera obiektów, takich jak ObReferenceObject i obDereferenceObject, aby zachować liczbę odwołań obiektu.

Nagłówek: Wdm.h. Uwzględnij: Wdm.h, Ntddk.h, Ntifs.h.

EX_RUNDOWN_REF

Struktura EX_RUNDOWN_REF jest nieprzezroczystą strukturą systemową zawierającą informacje o stanie ochrony rundown dla skojarzonego obiektu udostępnionego.

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

Procedury ochrony uruchamiania wymienione na końcu tego artykułu przyjmują wskaźnik do struktury EX_RUNDOWN_REF jako pierwszego parametru.

Aby uzyskać więcej informacji, zobacz Run-Down Ochrona. Nagłówek: Wdm.h. Uwzględnij plik Wdm.h.

EX_TIMER

Struktura EX_TIMER jest nieprzezroczystą strukturą używaną przez system operacyjny do reprezentowania obiektu czasomierza EX_TIMER.

typedef struct _EX_TIMER *PEX_TIMER;

Wszystkie elementy tej struktury są nieprzezroczyste dla sterowników.

Następujące procedury ExXxxTimer wymagają wskaźnika do struktury EX_TIMER przydzielonej przez system jako parametru wejściowego:

System operacyjny tworzy obiekty czasomierza oparte na EX_TIMER. Aby uzyskać taki obiekt czasomierza, sterownik wywołuje procedurę ExAllocateTimer. Gdy ten obiekt nie jest już potrzebny, sterownik jest odpowiedzialny za usunięcie obiektu przez wywołanie ExDeleteTimer.

Więcej informacji można znaleźć w ExXxxRutynach czasomierza oraz obiektach EX_TIMER.

Nagłówek: Wdm.h. Uwzględnij: Wdm.h, Ntddk.h, Ntifs.h.

FAST_MUTEX

Struktura FAST_MUTEX to nieprzezroczysta struktura danych, która reprezentuje szybki mutex. Procedury ExInitializeFastMutex inicjują tę strukturę.

Aby uzyskać więcej informacji na temat szybkich muteksów, zobacz Szybkie Muteksy i Strzeżone Muteksy.

Nagłówek: Wdm.h. Uwzględnij: Wdm.h, Ntddk.h, Ntifs.h.

IO_CSQ

Struktura IO_CSQ jest strukturą nieprzezroczystą, stosowaną do określania bezpiecznych dla anulowania rutyn kolejkowania IRP w sterowniku. Nie ustawiaj bezpośrednio elementów tej struktury. Użyj IoCsqInitialize lub IoCsqInitializeEx, aby zainicjować tę strukturę.

Aby zapoznać się z omówieniem sposobu używania kolejek IRP bezpiecznych przed anulowaniem, zobacz Cancel-Safe kolejki IRP.

Dostępne w systemie Microsoft Windows XP i nowszych wersjach systemu operacyjnego Windows.

Nagłówek: Wdm.h. Uwzględnij: Wdm.h, Ntddk.h, Ntifs.h.

IO_CSQ_IRP_CONTEXT

Struktura IO_CSQ_IRP_CONTEXT to nieprzezroczysta struktura danych używana do określania kontekstu IRP w anulowalnej kolejce IRP sterownika. IoCsqInsertIrp, IoCsqInsertIrpExi IoCsqRemoveIrp używają tej struktury jako klucza do identyfikowania specyficznych IRP w kolejce.

Aby zapoznać się z omówieniem sposobu używania kolejek IRP bezpiecznych przed anulowaniem, zobacz Cancel-Safe kolejki IRP.

Dostępne w systemie Microsoft Windows XP i nowszych wersjach systemu operacyjnego Windows.

Nagłówek: Wdm.h. Uwzględnij: Wdm.h, Ntddk.h, Ntifs.h.

IO_WORKITEM

Struktura IO_WORKITEM jest nieprzezroczystą strukturą opisującą element roboczy dla wątku procesu roboczego systemu.

Sterownik może przydzielić element roboczy, wywołując IoAllocateWorkItem. Alternatywnie sterownik może przydzielić własny bufor, a następnie wywołać IoInitializeWorkItem, aby zainicjować ten bufor jako element roboczy.

Każdy element roboczy przydzielony przez IoAllocateWorkItem musi zostać zwolniony przez IoFreeWorkItem. Każda pamięć zainicjowana przez IoInitializeWorkItem musi być zwolniona przez IoUninitializeWorkItem, zanim będzie można ją zwolnić.

Aby uzyskać więcej informacji na temat zadań roboczych, zobacz Wątki robocze systemu.

Nagłówek: Wdm.h. Uwzględnij: Wdm.h, Ntddk.h, Ntifs.h.

KBUGCHECK_CALLBACK_RECORD

Struktura KBUGCHECK_CALLBACK_RECORD jest nieprzezroczystą strukturą, którą wykorzystują KeRegisterBugCheckCallback i KeDeregisterBugCheckCallback.

Struktura KBUGCHECK_CALLBACK_RECORD jest używana przez funkcje KeRegisterBugCheckReasonCallback i KeDeregisterBugCheckReasonCallback do księgowania.

Struktura musi być przydzielona w pamięci o stałym dostępie, takiej jak pula niestronicowana. Użyj procedury KeInitializeCallbackRecord, aby zainicjować strukturę przed jej użyciem.

Nagłówek: Ntddk.h. Uwzględnij: Ntddk.h.

Rejestr_Powodu_Błędu_Callback

Struktura KBUGCHECK_REASON_CALLBACK_RECORD jest nieprzezroczystą strukturą używaną przez procedury KeRegisterBugCheckReasonCallback i KeDeregisterBugCheckReasonCallback.

Struktura KBUGCHECK_REASON_CALLBACK_RECORD jest używana przez KeRegisterBugCheckReasonCallback i KeDeregisterBugCheckReasonCallback procedur do księgowania.

Struktura musi być przydzielona w pamięci o stałym dostępie, takiej jak pula niestronicowana. Użyj procedury KeInitializeCallbackRecord, aby zainicjować strukturę przed jej użyciem.

Dostępne w systemie Microsoft Windows XP z dodatkiem Service Pack 1 (SP1), Windows Server 2003 i nowszymi wersjami systemu operacyjnego Windows.

Nagłówek: Ntddk.h. Uwzględnij: Ntddk.h.

KDPC

Struktura KDPC jest nieprzezroczystą strukturą reprezentującą obiekt DPC. Nie ustawiaj bezpośrednio elementów tej struktury. Zobacz obiekty DPC i DPC.

Nagłówek: Wdm.h. Uwzględnij: Wdm.h, Ntddk.h, Ntifs.h.

KFLOATING_SAVE

Struktura KFLOATING_SAVE jest nieprzezroczystą strukturą, która opisuje stan zmiennoprzecinkowy zapisany przez procedurę KeSaveFloatingPointState.

Użyj KeRestoreFloatingPointState, aby przywrócić stan zmiennoprzecinkowy.

Nagłówek: Wdm.h. Uwzględnij: Wdm.h, Ntddk.h, Ntifs.h.

KGUARDED_MUTEX

Struktura KGUARDED_MUTEX jest nieprzezroczystą strukturą, która reprezentuje chroniony mutex.

Użyj KeInitializeGuardedMutex, aby zainicjować strukturę KGUARDED_MUTEX jako chroniony mutex.

Chronione mutexy muszą być przydzielone z niestronicowanej puli.

Aby uzyskać więcej informacji na temat chronionych muteksów, zobacz Szybkie muteksy i chronione muteksy.

Nagłówek: Wdm.h. Uwzględnij: Wdm.h, Ntddk.h, Ntifs.h.

KINTERRUPT

Struktura KINTERRUPT jest nieprzezroczystą strukturą, która reprezentuje przerwanie systemu.

IoConnectInterruptEx zapewnia wskaźnik do struktury KINTERRUPT dla przerwania, gdy sterownik rejestruje rutynę InterruptService lub rutynę InterruptMessageService. Kierowca używa tego wskaźnika podczas uzyskiwania lub zwalniania blokady spin przerwania. Sterownik używa również tego wskaźnika podczas wyrejestrowania procedury InterruptService.

Nagłówek: Wdm.h. Uwzględnij: Wdm.h, Ntddk.h, Ntifs.h.

KLOCK_QUEUE_HANDLE

Struktura KLOCK_QUEUE_HANDLE jest nieprzezroczystą strukturą, która opisuje blokadę spinu w kolejce. Sterownik przydziela strukturę KLOCK_QUEUE_HANDLE i przekazuje ją do KeAcquireInStackQueuedSpinLock oraz KeAcquireInStackQueuedSpinLockAtDpcLevel w celu uzyskania kolejkowanej blokady spin. Procedury te inicjują strukturę, która reprezentuje blokadę spinu w kolejce. Sterownik przekazuje strukturę do KeReleaseInStackQueuedSpinLock i KeReleaseInStackQueuedSpinLockFromDpcLevel przy zwalnianiu blokady spin.

Aby uzyskać więcej informacji, zobacz Kolejkowane blokady spin.

Nagłówek: Wdm.h. Uwzględnij: Wdm.h, Ntddk.h, Ntifs.h.

KTIMER

Struktura KTIMER jest nieprzezroczystą strukturą reprezentującą obiekt czasomierza. Nie ustawiaj bezpośrednio elementów tej struktury. Aby uzyskać więcej informacji, zobacz Timer Objects and DPCs.

Nagłówek: Wdm.h. Uwzględnij: Wdm.h, Ntddk.h, Ntifs.h.

LOOKASIDE_LIST_EX

Struktura LOOKASIDE_LIST_EX opisuje listę lookaside.

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

Lookaside list to pula buforów o stałym rozmiarze, którymi sterownik może zarządzać lokalnie w celu zmniejszenia liczby wywołań rutyn alokacji systemowych. Zmniejszenie liczby tych wywołań zwiększa wydajność. Bufory mają jednolity rozmiar i są przechowywane jako wpisy na liście "lookaside".

Sterowniki powinny traktować strukturę LOOKASIDE_LIST_EX jako nieprzezroczystą. Sterowniki, które uzyskują dostęp do elementów członkowskich struktury lub które mają zależności od lokalizacji tych elementów członkowskich, mogą nie pozostać przenośne i współdziałać z innymi sterownikami.

Sekcja artykułów związanych z zawiera listę procedur, które używają tej struktury.

Aby uzyskać więcej informacji na temat list lookaside, zobacz Korzystanie z list lookaside.

Na platformach 64-bitowych ta struktura musi być wyrównana do 16 bajtów.

Nagłówek: Wdm.h. Uwzględnij: Wdm.h, Ntddk.h, Ntifs.h.

NPAGED_LOOKASIDE_LIST

Struktura NPAGED_LOOKASIDE_LIST to niewidoczna struktura opisująca listę buforów o stałym rozmiarze przydzielonych z niestronicowanej puli. System tworzy nowe wpisy i w razie potrzeby niszczy nieużywane wpisy na liście. W przypadku buforów o stałym rozmiarze użycie listy lookaside jest szybsze niż bezpośrednie przydzielanie pamięci.

Użyj ExInitializeNPagedLookasideList, aby zainicjować listę lookaside. Użyj ExAllocateFromNPagedLookasideList, aby przydzielić bufor z listy, a ExFreeToNPagedLookasideList, aby zwrócić bufor do listy.

Sterowniki muszą zawsze jawnie zwolnić wszystkie listy przydziałowe, które tworzą, przed odładowaniem. W przeciwnym razie jest to poważny błąd programowania. Użyj ExDeleteNPagedLookasideList, aby zwolnić listę.

Sterowniki mogą również używać list lookaside dla stronicowanej puli. Struktura PAGED_LOOKASIDE_LIST opisuje listę odnośników zawierającą stronicowane bufory. Struktura LOOKASIDE_LIST_EX może opisywać listę lookaside zawierającą bufory stronicowane lub niestronicowane. Aby uzyskać więcej informacji, zobacz Using Lookaside Lists.

Na platformach 64-bitowych ta struktura musi być wyrównana do granicy 16 bajtów.

Nagłówek: Wdm.h. Uwzględnij: Wdm.h, Ntddk.h, Ntifs.h.

TYP_OBIEKTU

OBJECT_TYPE to nieprzezroczysta struktura określająca typ obiektu uchwytu. Aby uzyskać więcej informacji, zobacz ObReferenceObjectByHandle.

Nagłówek: Wdm.h. Uwzględnij: Wdm.h, Ntddk.h, Ntifs.h.

PAGED_LOOKASIDE_LIST

Struktura PAGED_LOOKASIDE_LIST to nieprzezroczysta struktura, która opisuje listę buforów o stałym rozmiarze przydzielanych ze stronicowanej puli. System tworzy nowe wpisy i w razie potrzeby niszczy nieużywane wpisy na liście. W przypadku buforów o stałym rozmiarze użycie listy lookaside jest szybsze niż bezpośrednie przydzielanie pamięci.

Użyj ExInitializePagedLookasideList, aby zainicjować listę lookaside. Użyj ExAllocateFromPagedLookasideList, aby przydzielić bufor z listy, a ExFreeToPagedLookasideList, aby zwrócić bufor do listy.

Sterowniki muszą zawsze jawnie zwolnić wszystkie listy przydziałowe, które tworzą, przed odładowaniem. W przeciwnym razie jest to poważny błąd programowania. Użyj ExDeletePagedLookasideList, aby zwolnić listę.

Sterowniki mogą również używać list lookaside dla niestronicowanej puli. Struktura NPAGED_LOOKASIDE_LIST opisuje listę lookaside zawierającą niestronicowane bufory. Struktura LOOKASIDE_LIST_EX może opisywać listę lookaside zawierającą bufory stronicowane lub niestronicowane. Aby uzyskać więcej informacji, zobacz Using Lookaside Lists.

Na platformach 64-bitowych ta struktura musi być wyrównana do 16 bajtami.

Nagłówek: Wdm.h. Uwzględnij: Wdm.h, Ntddk.h, Ntifs.h.

RTL_BITMAP

Struktura RTL_BITMAP jest nieprzezroczystą strukturą, która opisuje mapę bitową.

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

Nie należy bezpośrednio uzyskiwać dostępu do składowych tej struktury. Sterowniki, które mają zależności od lokalizacji elementów członkowskich lub które mają bezpośredni dostęp do wartości elementów członkowskich, mogą nie pozostać zgodne z przyszłymi wersjami systemu operacyjnego Windows.

Struktura RTL_BITMAP służy jako nagłówek ogólnego przeznaczenia, jednowymiarowej mapy bitowej o dowolnej długości. Kierowca może użyć takiej mapy bitowej jako ekonomicznego sposobu śledzenia zestawu elementów wielokrotnego użytku. Na przykład system plików może używać map bitowych do śledzenia klastrów i sektorów na dysku twardym, które zostały już przydzielone do przechowywania danych plików.

Aby uzyskać listę procedur RtlXxx korzystających ze struktur RTL_BITMAP, zobacz sekcję Powiązane artykuły. Obiekt wywołujący te procedury RtlXxx jest odpowiedzialny za przydzielanie magazynu dla struktury RTL_BITMAP i buforu zawierającego mapę bitową. Ten bufor musi rozpoczynać się od granicy 4-bajtowej w pamięci i musi mieć wielokrotność 4 bajtów długości. Mapa bitowa rozpoczyna się na początku buforu, ale może zawierać dowolną liczbę bitów pasujących do przydzielonego buforu.

Przed dostarczeniem struktury RTL_BITMAP jako parametru do procedury Rtlxxx wywołaj procedurę RtlInitializeBitMap, aby zainicjować strukturę. Parametry wejściowe tej procedury są wskaźnikiem do buforu, który zawiera mapę bitową i rozmiar w bitach mapy bitowej. RtlInitializeBitMap nie zmienia zawartości tego buforu.

Jeśli dzwoniący przydziela miejsce dla struktury RTL_BITMAP i mapy bitowej w pamięci stronicowanej, musi działać w <IRQL = APC_LEVEL, gdy przekazuje wskaźnik tej struktury jako parametr do dowolnej z RtlXxx procedur z sekcji Powiązane artykuły. Jeśli obiekt wywołujący przydziela magazyn z niestronicowanej pamięci (lub, co równoważne, z zablokowanej pamięci stronicowanej), obiekt wywołujący może być uruchomiony w dowolnym środowisku IRQL, gdy wywołuje procedurę RtlXxx.

Nagłówek: Wdm.h. Uwzględnij: Wdm.h, Ntddk.h, Ntifs.h.

RTL_RUN_ONCE

Struktura RTL_RUN_ONCE jest nieprzezroczystą strukturą, która przechowuje informacje na potrzeby jednorazowej inicjalizacji.

Kierowcy muszą zainicjować tę strukturę, wywołując procedurę RtlRunOnceInitialize przed przekazaniem jej do innych procedur RtlRunOnceXxx.

Nagłówek: Ntddk.h. Uwzględnij: Ntddk.h.

KONTEKST_OBIEKTU_BEZPIECZEŃSTWA

Struktura SECURITY_SUBJECT_CONTEXT jest nieprzezroczystą strukturą reprezentującą kontekst zabezpieczeń, w którym odbywa się określona operacja. Sterowniki nie mogą modyfikować ani próbować bezpośrednio uzyskiwać dostępu do żadnych elementów tej struktury w celu podejmowania decyzji dotyczących zabezpieczeń. Zamiast tego, aby uniknąć problemów z zabezpieczeniami w autoryzacji, przekaż tę nieprzezroczystą strukturę w wywołaniach do SeAccessCheck lub SePrivilegeCheck.

Nagłówek: Wdm.h. Uwzględnij: Wdm.h, Ntddk.h, Ntifs.h.

SLIST_HEADER

Struktura SLIST_HEADER jest nieprzezroczystą strukturą, która służy jako nagłówek sekwencyjnej listy połączonej jednokierunkowo. Aby uzyskać więcej informacji, zobacz Singly i Doubly Linked Lists.

Na 64-bitowych platformach struktury SLIST_HEADER muszą być wyrównane do 16 bajtów.

Nagłówek: Wdm.h. Uwzględnij: Wdm.h, Ntddk.h, Ntifs.h.

XSTATE_SAVE

Struktura XSTATE_SAVE jest nieprzezroczystą strukturą, która opisuje rozszerzone informacje o stanie procesora, które sterownik trybu jądra zapisuje i przywraca.

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

Wszyscy członkowie są nieprzezroczyści.

Procedury KeSaveExtendedProcessorState i KeRestoreExtendedProcessorState używają tej struktury.

Nagłówek: Wdm.h. Uwzględnij: 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

Odczytywanie danych wywołania zwrotnego sprawdzania błędów krytycznych

RtlRunOnceBeginInitialize

RtlRunOnceComplete

RtlRunOnceExecuteOnce

RtlRunOnceInitialize

InicjalizacjaJednorazowa

Run-Down Ochrona

SeAccessCheck

SeAssignSecurity

SeAssignSecurityEx