CopyToUserNonTemporal 함수는 비 임시 명령을 사용하여 커널 메모리에서 사용자 모드 메모리로 데이터를 안전하게 복사합니다.
Syntax
VOID CopyToUserNonTemporal(
volatile VOID *Destination,
const VOID *Source,
SIZE_T Length
);
Parameters
Destination
[out] 데이터를 복사할 사용자 모드 메모리 위치에 대한 포인터입니다.
Source
[in] 데이터를 복사할 커널 메모리 위치에 대한 포인터입니다.
Length
[in] 복사할 바이트 수입니다.
반환 값
None
Remarks
이 함수는 비 임시(스트리밍) 지침을 사용하여 커널 메모리에서 사용자 모드 메모리로 데이터를 복사하는 안전한 방법을 제공합니다. 이렇게 하면 커널 모드 코드가 큰 데이터 전송에 대한 캐시 성능을 최적화하면서 데이터를 사용자 모드 버퍼로 전송해야 하는 경우 유연한 메모리 작업을 수행할 수 있습니다.
함수에는 다음과 같은 속성이 있습니다.
이 함수는 비 임시 명령과 함께 memory_order_relaxed 의미 체계를 사용하여 휘발성 복사를 수행합니다.
함수는 컴파일러 내장 함수로 인식되지 않으므로 컴파일러가 호출을 최적화하지 않습니다(완전히 또는 동일한 명령 시퀀스로 호출 대체).
호출이 반환되면 데이터가 원본 에서 대상으로 복사됩니다. 이 함수의 원본 및 대상 에 대한 메모리 액세스는 함수 내에서만 수행됩니다(예: 컴파일러는 이 함수에서 메모리 액세스를 이동할 수 없음).
플랫폼이 허용하는 경우 함수는 정렬되지 않은 메모리 액세스를 수행할 수 있습니다.
함수는 복사 작업의 일부로 메모리 위치에 두 번 이상 액세스할 수 있습니다.
원본과 대상이 서로 겹치는 경우 함수는 복사 작업을 지원하지 않습니다.
이 함수는 프로세서 캐시를 우회하여 캐시 오염을 줄여 대용량 데이터 전송에 대한 성능을 향상시킬 수 있는 비 임시 명령을 사용합니다.
대상 주소가 유효한 사용자 모드 주소가 아니거나 액세스할 수 없는 경우와 같이 복사 작업이 실패하는 경우 함수는 구조적 예외를 발생합니다.
이 함수는 캐시에서 다른 유용한 데이터를 제거하지 않으므로 곧 다시 액세스할 가능성이 없는 대량의 데이터를 복사할 때 특히 유용합니다.
고정 크기 구조를 복사하는 경우 잘못된 크기를 전달할 위험을 방지하기 위해 WriteStructToUser 를 대신 사용해야 합니다.
이 함수는 컴파일러에서 최적화되지 않으며, 소스 코드가 이러한 액세스를 명시적으로 수행하지 않는 한 함수가 호출되기 전이나 함수가 반환된 후에 컴파일러가 이 메모리 위치에 대한 추가 액세스를 만들지 않습니다.
이 함수는 최신 버전뿐만 아니라 모든 버전의 Windows에서 작동합니다. usermode_accessors.h 헤더에서 함수 선언을 얻으려면 최신 WDK를 사용해야 합니다. 최신 WDK의 라이브러리(umaccess.lib)도 필요합니다. 그러나 결과 드라이버는 이전 버전의 Windows에서 잘 실행됩니다.
Requirements
| Requirement | Value |
|---|---|
| 지원되는 최소 클라이언트 | 설명 참조 |
| Header | usermode_accessors.h |
| Library | umaccess.lib |
| IRQL | APC_LEVEL 작거나 같음 |