我正在为它编写一个Windows服务和一个API库,它封装了与库通信所需的DeviceIoControl调用。我可以确定,传递给DeviceIoControl函数的内存缓冲区的编组不会破坏任何内存对齐数据吗?例如,如果我以以下方式调用DeviceIoControl:
int32_t value = 5; // properly aligned at 4 bytes
DeviceIoControl(handle, IOCTL_CODE, &value, sizeof(value), NULL, 0, NULL, NULL);我可以在服务端以下列方式处理它吗?
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));
}
//...
}在WindowsCE6.0中,每个进程都使用自己的地址空间,因此从客户端传递到服务的内存缓冲区需要由操作系统以某种方式封送,例如通过内存混叠或复制。(潜在的)问题可以在服务端通过使用未对齐(__unaligned) C++扩展关键字或通过将缓冲区复制到对齐的目标来过早地解决。但是,由于所有这些都需要开发人员和CPU做更多的工作,如果知道问题根本不存在的话,最好避免使用。
发布于 2014-05-21 15:23:12
DeviceIoControl调用不会改变它所封送的任何数据的对齐方式,所以无论您在源中拥有什么对齐,都将在驱动程序中得到什么。这并不是说您可以在调用方中使用UNALIGNED,然后驱动程序就会中断,但是如果调用者正在这样做,它就在它们上,而且您的驱动程序也不应该期望未对齐的数据。
https://stackoverflow.com/questions/23787061
复制相似问题