2014-05-21 1 views
0

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에서 더 많은 작업을 필요로하기 때문에 문제가 전혀 존재하지 않는다고 알려진다면 그것을 피하는 것이 좋습니다.

+0

이것은 실제 문제는 아닙니다. –

+0

@HansPassant, 그리고 이것에 의해 문제가 실제로 존재하지 않는다는 것을 의미합니까? 나는. DeviceIoControl은 전달 된 버퍼의 정렬에 영향을 미치지 않으며 안전하게 내용을 역 참조 할 수 있습니다 (호출자 측에서 올바르게 정렬되어있는 경우). –

답변

1

DeviceIoControl 호출은 정렬하는 데이터의 정렬을 변경하지 않으므로 소스에서 어떤 정렬을해도 드라이버에서 얻을 수있는 것입니다. 호출자가 UNALIGNED을 사용하여 문제를 해결할 수 있다고 말하면 안됩니다. 호출자가 그 일을 수행하면 호출자가 그 일을 수행하는 경우 해당 호출자가 실행 중이며 드라이버는 정렬되지 않은 데이터를 기대해서는 안됩니다.