我正在为它编写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);
我可以通过以下方式在服务端处理它:
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));
}
//...
}
在Windows CE 6.0中,每个进程都使用它自己的地址空间,因此从客户端传递到服务的内存缓冲区需要由OS以某种方式进行编组,例如:通过内存别名或复制。通过使用UNALIGNED(__unaligned)Visual C ++扩展关键字或通过将缓冲区复制到对齐目标,可以在服务端过早地解决(潜在)问题。但是,由于所有这些都需要开发人员和CPU的更多工作,如果知道问题根本不存在,那么避免使用它是件好事。
答案 0 :(得分:1)
DeviceIoControl
调用不会改变它编组的任何数据的对齐方式,因此您在源代码中的任何对齐方式都是您在驱动程序中获得的内容。这并不是说你可以在调用者中使用UNALIGNED
搞砸了,然后驱动程序就会中断,但是如果调用者正在这样做,它就在他们身上,而你的驱动程序也不应该期待未对齐的数据。