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