Windows 커널 불투명 구조체
이 문서에서는 Windows 커널 불투명 구조를 나열하고 설명합니다. 이러한 구조의 대부분에서 드라이버는 멤버에 액세스하거나 변경해서는 안 되며 대신 시스템 제공 루틴을 사용하여 정보에 액세스해야 합니다. 자세한 내용은 각 구조를 참조하세요.
EPROCESS
EPROCESS 구조체는 프로세스의 프로세스 개체 역할을 하는 불투명 구조체입니다.
PsGetProcessCreateTimeQuadPart와 같은 일부 루틴은 EPROCESS를 사용하여 작동할 프로세스를 식별합니다. 드라이버는 PsGetCurrentProcess 루틴을 사용하여 현재 프로세스의 프로세스 개체에 대한 포인터를 가져올 수 있으며 ObReferenceObjectByHandle 루틴을 사용하여 지정된 핸들과 연결된 프로세스 개체에 대한 포인터를 가져올 수 있습니다. PsInitialSystemProcess 전역 변수는 시스템 프로세스의 프로세스 개체를 가리킵니다.
프로세스 개체는 Object Manager 개체입니다. 드라이버는 개체의 참조 수를 유지하려면 ObReferenceObject 및 ObDereferenceObject와 같은 개체 관리자 루틴을 사용해야 합니다.
헤더: Wdm.h. 포함: Wdm.h, Ntddk.h, Ntifs.h.
ETHREAD
ETHREAD 구조체는 스레드의 스레드 개체 역할을 하는 불투명 구조체입니다.
PsIsSystemThread와 같은 일부 루틴은 ETHREAD를 사용하여 작동할 스레드를 식별합니다. 드라이버는 PsGetCurrentThread 루틴을 사용하여 현재 스레드에 대한 스레드 개체에 대한 포인터를 가져올 수 있으며 ObReferenceObjectByHandle 루틴을 사용하여 지정된 핸들과 연결된 스레드 개체에 대한 포인터를 가져올 수 있습니다.
스레드 개체는 Object Manager 개체입니다. 드라이버는 개체의 참조 수를 유지하려면 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 큐를 사용하는 방법에 대한 개요는 Cancel-Safe 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 큐를 사용하는 방법에 대한 개요는 Cancel-Safe 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 SP1(서비스 팩 1), 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 구조체는 lookaside 목록을 설명합니다.
typedef struct _LOOKASIDE_LIST_EX {
... // opaque
} LOOKASIDE_LIST_EX, *PLOOKASIDE_LIST_EX;
lookaside 목록은 드라이버가 로컬로 관리할 수 있는 고정 크기 버퍼 풀로, 시스템 할당 루틴에 대한 호출 수를 줄여 성능을 향상시킵니다. 버퍼는 균일한 크기이며 lookaside 목록에 항목으로 저장됩니다.
드라이버는 LOOKASIDE_LIST_EX 구조를 불투명한 것으로 처리해야 합니다. 구조체 멤버에 액세스하거나 이러한 멤버의 위치에 종속된 드라이버는 이식 가능하지 않고 다른 드라이버와 상호 운용할 수 없습니다.
관련 문서 섹션에는 이 구조를 사용하는 루틴 목록이 포함되어 있습니다.
lookaside 목록에 대한 자세한 내용은 Lookaside 목록 사용을 참조 하세요.
64비트 플랫폼에서 이 구조체는 16 바이트 정렬되어야 합니다.
헤더: Wdm.h. 포함: Wdm.h, Ntddk.h, Ntifs.h.
NPAGED_LOOKASIDE_LIST
NPAGED_LOOKASIDE_LIST 구조체는 비페이지 풀에서 할당된 고정 크기 버퍼의 lookaside 목록을 설명하는 불투명 구조체입니다. 시스템은 새 항목을 만들고 필요에 따라 목록에 사용되지 않는 항목을 삭제합니다. 고정 크기 버퍼의 경우 lookaside 목록을 사용하는 것이 메모리를 직접 할당하는 것보다 빠릅니다.
ExInitializeNPagedLookasideList를 사용하여 lookaside 목록을 초기화합니다. ExAllocateFromNPagedLookasideList를 사용하여 목록에서 버퍼를 할당하고 ExFreeToNPagedLookasideList를 사용하여 버퍼를 목록으로 반환합니다.
드라이버는 언로드하기 전에 만든 모든 lookaside 목록을 항상 명시적으로 해제해야 합니다. 그렇지 않으면 심각한 프로그래밍 오류입니다. ExDeleteNPagedLookasideList를 사용하여 목록을 해제합니다.
드라이버는 페이징 풀에 lookaside 목록을 사용할 수도 있습니다. PAGED_LOOKASIDE_LIST 구조체는 페이징된 버퍼를 포함하는 lookaside 목록을 설명합니다. LOOKASIDE_LIST_EX 구조체는 페이징된 버퍼 또는 페이징되지 않은 버퍼를 포함하는 lookaside 목록을 설명할 수 있습니다. 자세한 내용은 Lookaside 목록 사용을 참조 하세요.
64비트 플랫폼에서 이 구조체는 16 바이트 정렬되어야 합니다.
헤더: 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 목록을 설명하는 불투명 구조체입니다. 시스템은 새 항목을 만들고 필요에 따라 목록에 사용되지 않는 항목을 삭제합니다. 고정 크기 버퍼의 경우 lookaside 목록을 사용하는 것이 메모리를 직접 할당하는 것보다 빠릅니다.
ExInitializePagedLookasideList를 사용하여 lookaside 목록을 초기화합니다. ExAllocateFromPagedLookasideList를 사용하여 목록에서 버퍼를 할당하고 ExFreeToPagedLookasideList를 사용하여 버퍼를 목록으로 반환합니다.
드라이버는 언로드하기 전에 만든 모든 lookaside 목록을 항상 명시적으로 해제해야 합니다. 그렇지 않으면 심각한 프로그래밍 오류입니다. ExDeletePagedLookasideList를 사용하여 목록을 해제합니다.
드라이버는 비페이지 풀에 lookaside 목록을 사용할 수도 있습니다. NPAGED_LOOKASIDE_LIST 구조체는 페이지가 없는 버퍼를 포함하는 lookaside 목록을 설명합니다. LOOKASIDE_LIST_EX 구조체는 페이징된 버퍼 또는 페이징되지 않은 버퍼를 포함하는 lookaside 목록을 설명할 수 있습니다. 자세한 내용은 Lookaside 목록 사용을 참조 하세요.
64비트 플랫폼에서 이 구조체는 16 바이트 정렬되어야 합니다.
헤더: Wdm.h. 포함: Wdm.h, Ntddk.h, Ntifs.h.
RTL_BITMAP
RTL_BITMAP 구조체는 비트맵을 설명하는 불투명 구조체입니다.
typedef struct _RTL_BITMAP {
// opaque
} RTL_BITMAP, *PRTL_BITMAP;
이 구조체의 멤버에 직접 액세스하지 마세요. 멤버 위치에 대한 종속성이 있거나 멤버 값에 직접 액세스하는 드라이버는 이후 버전의 Windows 운영 체제와 호환되지 않을 수 있습니다.
RTL_BITMAP 구조체는 임의 길이의 범용 1차원 비트맵에 대한 헤더 역할을 합니다. 드라이버는 이러한 비트맵을 경제적인 방법으로 사용하여 재사용 가능한 항목 집합을 추적할 수 있습니다. 예를 들어 파일 시스템은 비트맵을 사용하여 파일 데이터를 보관하기 위해 이미 할당된 하드 디스크의 클러스터 및 섹터를 추적할 수 있습니다.
RTL_BITMAP 구조를 사용하는 RtlXxx 루틴 목록은 관련 문서 섹션을 참조하세요. 이러한 RtlXxx 루틴의 호출자는 RTL_BITMAP 구조 및 비트맵이 포함된 버퍼에 대한 스토리지를 할당합니다. 이 버퍼는 메모리의 4바이트 경계에서 시작해야 하며 4바이트 길이의 배수여야 합니다. 비트맵은 버퍼 시작 시 시작되지만 할당된 버퍼에 맞는 비트 수를 포함할 수 있습니다.
rtl Xxx 루틴에 매개 변수로 RTL_BITMAP 구조를 제공하려면 먼저 RtlInitializeBitMap 루틴을 호출하여 구조를 초기화합니다. 이 루틴에 대한 입력 매개 변수는 비트맵과 비트맵의 크기(비트)를 포함하는 버퍼에 대한 포인터입니다. RtlInitializeBitMap 은 이 버퍼의 내용을 변경하지 않습니다.
호출자가 페이징된 메모리의 RTL_BITMAP 구조 및 비트맵에 대한 스토리지를 할당하는 경우 호출자는 관련 문서 섹션에 나열된 Rtl Xxx 루틴에 매개 변수로 이 구조에 대한 포인터를 전달하면 IRQL <= APC_LEVEL 실행되어야 합니다. 호출자가 페이지가 없는 메모리(또는 잠긴 페이징 메모리에서)에서 스토리지를 할당하는 경우, 호출자는 Rtl Xxx 루틴을 호출할 때 모든 IRQL에서 실행될 수 있습니다.
헤더: Wdm.h. 포함: Wdm.h, Ntddk.h, Ntifs.h.
RTL_RUN_ONCE
RTL_RUN_ONCE 구조체는 일회성 초기화에 대한 정보를 저장하는 불투명 구조체입니다.
드라이버는 다른 RtlRunOnceXxx 루틴에 전달하기 전에 RtlRunOnceInitialize 루틴을 호출하여 이 구조를 초기화해야 합니다.
헤더: 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 및 두 배로 연결된 목록을 참조 하세요.
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 루틴은 이 구조를 사용합니다.
헤더: Wdm.h. 포함: Wdm.h, Ntddk.h, Ntifs.h.
관련된 문서
ExAllocateFromNPagedLookasideList
ExAllocateFromPagedLookasideList
ExInitializePagedLookasideList
ExInitializeNPagedLookasideList
KeAcquireInStackQueuedSpinLock
KeAcquireInStackQueuedSpinLockAtDpcLevel
KeRestoreExtendedProcessorState
KeDeregisterBugCheckReasonCallback
KeRegisterBugCheckReasonCallback
KeReleaseInStackQueuedSpinLock
KeReleaseInStackQueuedSpinLockFromDpcLevel