다음을 통해 공유


CopyFromUserAligned 매크로(usermode_accessors.h)

CopyFromUserAligned 매크로는 맞춤 검사를 통해 사용자 모드 메모리에서 커널 메모리로 데이터를 안전하게 복사합니다.

Syntax

#define CopyFromUserAligned(Destination, Source, Length, Alignment)                                 \
            do {                                                                                    \
                ExProbeAlignment((Source), (Length), (Alignment));                                  \
                CopyFromUser((Destination), (Source), (Length));                                    \
            } while (0)

Parameters

Destination

[out] 데이터가 복사될 커널 메모리 위치에 대한 포인터입니다.

Source

[in] 데이터를 복사할 사용자 모드 메모리 위치에 대한 포인터입니다.

Length

[in] 복사할 바이트 수입니다.

Alignment

[in] 원본 포인터가 충족해야 하는 맞춤 경계입니다.

반환 값

None

Remarks

이 매크로는 맞춤 확인을 사용하여 사용자 모드 메모리에서 커널 메모리로 데이터를 복사하는 안전한 방법을 제공합니다. 따라서 커널 모드 코드가 특정 맞춤 요구 사항이 있는 사용자 모드 버퍼에서 데이터를 검색해야 하는 경우 유연한 메모리 작업을 수행할 수 있습니다.

매크로에는 다음과 같은 속성이 있습니다.

  • 매크로는 memory_order_relaxed 의미 체계를 사용하여 휘발성 복사를 수행합니다.

  • 매크로는 컴파일러 내장 함수로 인식되지 않으므로 컴파일러가 호출을 최적화하지 않습니다(완전히 또는 동일한 명령 시퀀스로 호출 대체).

  • 호출이 반환되면 데이터가 원본 에서 대상으로 복사됩니다. 원본 대상 에 대한 이 매크로의 메모리 액세스는 매크로 내에서만 수행됩니다(예: 컴파일러는 이 매크로에서 메모리 액세스를 이동할 수 없습니다).

  • 매크로는 복사 작업의 일부로 메모리 위치에 두 번 이상 액세스할 수 있습니다.

  • 원본대상이 서로 겹치는 경우 매크로는 복사 작업을 지원하지 않습니다.

원본 주소가 유효한 사용자 모드 주소가 아니거나 Alignment 매개 변수에 따라 제대로 정렬되지 않았거나 액세스할 수 없는 경우와 같이 복사 작업이 실패하면 매크로에서 구조적 예외가 발생합니다.

고정 크기 구조체에서 복사하는 경우 잘못된 크기를 전달할 위험을 방지하기 위해 ReadStructFromUserAligned 를 대신 사용해야 합니다.

이 매크로는 컴파일러에서 최적화되지 않으며, 소스 코드가 명시적으로 이러한 액세스를 수행하지 않는 한 매크로가 호출되기 전이나 매크로가 반환된 후에 컴파일러가 이 메모리 위치에 대한 추가 액세스를 만들지 않습니다.

이 매크로는 최신 버전뿐만 아니라 모든 버전의 Windows에서 작동합니다. usermode_accessors.h 헤더에서 매크로 선언을 얻으려면 최신 WDK를 사용해야 합니다. 최신 WDK의 라이브러리(umaccess.lib)도 필요합니다. 그러나 결과 드라이버는 이전 버전의 Windows에서 잘 실행됩니다.

Requirements

Requirement Value
지원되는 최소 클라이언트 설명 참조
Header usermode_accessors.h
Library umaccess.lib
IRQL APC_LEVEL 작거나 같음

참고하십시오

CopyFromUser

CopyFromUserNonTemporal

CopyFromMode

CopyFromModeAligned

CopyToUser