ZwOpenKeyTransacted 함수(wdm.h)
ZwOpenKeyTransacted 루틴은 기존 레지스트리 키를 열고 키를 트랜잭션에 연결합니다.
구문
NTSYSAPI NTSTATUS ZwOpenKeyTransacted(
[out] PHANDLE KeyHandle,
[in] ACCESS_MASK DesiredAccess,
[in] POBJECT_ATTRIBUTES ObjectAttributes,
[in] HANDLE TransactionHandle
);
매개 변수
[out] KeyHandle
루틴이 키에 핸들을 쓰는 HANDLE 변수에 대한 포인터입니다.
[in] DesiredAccess
호출자가 요청하는 키에 대한 액세스 유형을 지정합니다. 이 매개 변수는 ACCESS_MASK 값입니다. 자세한 내용은 ZwCreateKey 루틴의 DesiredAccess 매개 변수에 대한 설명을 참조하세요.
[in] ObjectAttributes
열려는 키의 개체 특성에 대한 포인터입니다. 이 매개 변수는 InitializeObjectAttributes 루틴에서 이전에 초기화해야 하는 OBJECT_ATTRIBUTES 구조를 가리킵니다. 호출자는 InitializeObjectAttributes 호출에서 레지스트리 키의 이름을 ObjectName 매개 변수로 지정해야 합니다. 호출자가 시스템 스레드 컨텍스트에서 실행되고 있지 않으면 InitializeObjectAttributes를 호출할 때 OBJ_KERNEL_HANDLE 특성을 설정해야 합니다.
[in] TransactionHandle
트랜잭션 개체에 대한 핸들입니다. 이 핸들을 가져오려면 ZwCreateTransaction 루틴을 호출할 수 있습니다. 또는 트랜잭션 개체에 대한 포인터가 있는 경우 ObOpenObjectByPointer 루틴에 대한 포인터를 제공하여 해당 트랜잭션 핸들을 가져올 수 있습니다.
반환 값
ZwOpenKeyTransacted는 호출이 키를 성공적으로 열면 STATUS_SUCCESS 반환합니다. 가능한 오류 반환 값에는 다음이 포함됩니다.
반환 코드 | 설명 |
---|---|
|
ObjectAttributes 매개 변수는 NULL이거나 잘못된 정보를 가리킵니다. |
|
개체 특성의 레지스트리 경로가 잘못되었습니다. |
|
개체 특성의 레지스트리 경로를 찾을 수 없습니다. |
|
호출자에게 명명된 레지스트리 키에 대한 핸들을 여는 데 필요한 액세스 권한이 없습니다. |
|
메모리 할당 작업이 실패했습니다. |
설명
이 루틴은 호출자가 레지스트리 키에 액세스할 수 있는 핸들을 제공합니다. 또한 이 루틴은 키를 활성 트랜잭션과 연결합니다.
KeyHandle에서 가리키는 핸들이 더 이상 사용되지 않으면 드라이버는 ZwClose 루틴을 호출하여 닫아야 합니다.
지정된 키가 레지스트리에 없는 경우 ZwOpenKeyTransacted는 오류 상태 값을 반환하고 키 핸들을 제공하지 않습니다. ZwCreateKeyTransacted 루틴과 달리 ZwOpenKeyTransacted 루틴은 키가 없는 경우 지정된 키를 만들지 않습니다. ZwCreateKeyTransacted 및 ZwOpenKeyTransacted는 모두 레지스트리 키를 트랜잭션과 연결합니다.
ZwOpenKey 루틴은 ZwOpenKeyTransacted와 유사하지만 키를 트랜잭션과 연결하지는 않습니다.
커널 모드 드라이버가 트랜잭션에 대한 핸들을 가져온 후(예: ZwCreateTransaction 호출) 드라이버는 이 트랜잭션의 일부인 일련의 레지스트리 작업을 수행할 수 있습니다. 드라이버는 트랜잭션에서 변경된 내용을 커밋하거나 트랜잭션을 롤백하여 트랜잭션을 닫을 수 있습니다.
드라이버가 트랜잭션의 일부인 모든 레지스트리 작업을 성공적으로 완료한 후 ZwCommitTransaction 루틴을 호출하여 변경 내용을 커밋할 수 있습니다. 드라이버는 ZwRollbackTransaction 루틴을 호출하여 트랜잭션을 롤백할 수 있습니다.
트랜잭션 중에 작업을 수행하는 시스템 호출이 다음 조건 중 하나를 충족하는 경우 레지스트리 작업은 트랜잭션의 일부입니다.
- 호출은 트랜잭션 핸들을 입력 매개 변수로 지정합니다. 예를 들어 ZwCreateKeyTransacted 및 ZwOpenKeyTransacted에 대한 호출은 하나 이상의 키를 트랜잭션과 연결할 수 있습니다.
- 호출은 입력 매개 변수로, 트랜잭션 핸들이 제공된 ZwCreateKeyTransacted 또는 ZwOpenKeyTransacted 호출로 얻은 레지스트리 키 핸들을 지정합니다. 예를 들어 ZwSetValueKey 루틴에 대한 호출은 이러한 방식으로 가져온 키 핸들을 사용하여 레지스트리 키의 값을 트랜잭션의 일부로 설정할 수 있습니다.
ZwOpenKeyTransacted 는 ObjectAttributes 매개 변수가 가리키는 구조의 보안 정보를 무시합니다.
커널 모드 호출자가 시스템 스레드 컨텍스트에서 실행되고 있지 않은 경우 커널 핸들을 만드는 핸들이 있는지 확인해야 합니다. 그렇지 않으면 드라이버가 실행 중인 컨텍스트의 프로세스에서 핸들에 액세스할 수 있습니다. 자세한 내용은 개체 핸들을 참조하세요.
커널 모드에서 레지스트리 키를 사용하는 방법에 대한 자세한 내용은 드라이버에서 레지스트리 사용을 참조하세요.
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows Vista 이상 버전의 Windows 운영 체제에서 사용할 수 있습니다. |
대상 플랫폼 | 유니버설 |
헤더 | wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함) |
라이브러리 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI 규정 준수 규칙 | HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm) |