Windows CE 서비스와 API 라이브러리를 작성 중입니다.이 라이브러리는 라이브러리와 통신하는 데 필요한 호출을 DeviceIoControl으로 래핑합니다. DeviceIoControl 함수에 전달 된 메모리 버퍼의 정렬이 메모리 정렬 데이터를 손상시키지 않는다고 확신 할 수 있습니까?DeviceIoControl 버퍼 매개 변수 마샬링 및 정렬
int32_t value = 5; // properly aligned at 4 bytes
DeviceIoControl(handle, IOCTL_CODE, &value, sizeof(value), NULL, 0, NULL, NULL);
내가 서비스 측에 다음과 같은 방법으로 처리 할 수 있습니다 : 나는 DeviceIoControl을에게 다음과 같은 방법으로 호출하는 경우 예,
윈도우 CE에서BOOL APIENTRY SRV_IOControl(DWORD data, DWORD code, PBYTE inputBuffer, DWORD inputBufferLength, /*other params*/)
{
if ((code == IOCTL_CODE) && (inputBufferLength == sizeof(int32_t)))
{
// if inputBuffer is not aligned to 4 bytes, then this may produce
// unaligned memory access failure on some ARM processors
int32_t value = *(reinterpret_cast<int32_t*>(inputBuffer));
}
//...
}
6.0 각 프로세스가 사용을 그렇게, 자신의 주소 공간의 클라이언트에서 서비스로 전달되는 메모리 버퍼는 어떻게 든 OS에 의해 정렬되어야한다. 메모리 앨리어싱 또는 복사를 통해 (잠재적 인) 문제점은 UNALIGNED (__unaligned) Visual C++ 확장 키워드를 사용하거나 버퍼를 정렬 된 대상에 복사하여 서비스 측면에서 조기에 해결할 수 있습니다. 그러나이 모든 것들이 개발자와 CPU에서 더 많은 작업을 필요로하기 때문에 문제가 전혀 존재하지 않는다고 알려진다면 그것을 피하는 것이 좋습니다.
이것은 실제 문제는 아닙니다. –
@HansPassant, 그리고 이것에 의해 문제가 실제로 존재하지 않는다는 것을 의미합니까? 나는. DeviceIoControl은 전달 된 버퍼의 정렬에 영향을 미치지 않으며 안전하게 내용을 역 참조 할 수 있습니다 (호출자 측에서 올바르게 정렬되어있는 경우). –