C++ DeviceIoControl缓冲区参数编组和对齐

C++ DeviceIoControl缓冲区参数编组和对齐,c++,service,windows-ce,memory-alignment,C++,Service,Windows Ce,Memory Alignment,我正在为它编写一个WindowsCE服务和一个API库,它封装了与库通信所需的调用。 我可以确定,传递给DeviceIoControl函数的内存缓冲区编组不会破坏任何内存对齐的数据吗?例如,如果我按以下方式调用DeviceIoControl: int32_t value = 5; // properly aligned at 4 bytes DeviceIoControl(handle, IOCTL_CODE, &value, sizeof(value), NULL, 0, NULL,

我正在为它编写一个WindowsCE服务和一个API库,它封装了与库通信所需的调用。 我可以确定,传递给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)); 
       }
       //...
    }
我可以通过以下方式在服务端处理它:

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)); 
       }
       //...
    }
BOOL APIENTRY SRV_IOControl(DWORD数据、DWORD代码、PBYTE inputBuffer、DWORD inputBufferLength、/*其他参数*/)
{
if((code==IOCTL_code)&&(inputBufferLength==sizeof(int32_t)))
{
//如果inputBuffer未与4字节对齐,则可能会产生
//某些ARM处理器上的未对齐内存访问失败
int32_t值=*(重新解释强制转换(inputBuffer));
}
//...
}

在Windows CE 6.0中,每个进程都使用自己的地址空间,因此从客户端传递到服务的内存缓冲区需要由操作系统以某种方式进行编组,例如通过内存别名或复制。可以通过使用未对齐的(未对齐的)Visual C++扩展关键字或通过将缓冲区复制到对齐的目的地,在服务端提前解决(潜在)问题。但是,由于所有这些都需要开发人员和CPU做更多的工作,如果知道问题根本不存在,那么最好避免它。

DeviceIoControl调用不会更改它封送的任何数据的对齐方式,因此无论源代码处有什么对齐方式,都将在驱动程序中得到。这并不是说在调用程序中使用
未对齐的
会把事情搞砸,然后驱动程序会崩溃,但如果调用程序正在这样做,它就在它们身上,而且你的驱动程序无论如何也不应该期待未对齐的数据。

这不是一个真正的问题。@HansPassant,你的意思是这个问题不存在吗?也就是说,DeviceIoControl不会影响已传递缓冲区的对齐,我可以安全地取消对其内容的引用(前提是它在调用方端正确对齐)。