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