DeviceIoControl缓冲区参数编组和对齐

时间:2014-05-21 15:04:25

标签: c++ service windows-ce memory-alignment

我正在为它编写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的更多工作,如果知道问题根本不存在,那么避免使用它是件好事。

1 个答案:

答案 0 :(得分:1)

DeviceIoControl调用不会改变它编组的任何数据的对齐方式,因此您在源代码中的任何对齐方式都是您在驱动程序中获得的内容。这并不是说你可以在调用者中使用UNALIGNED搞砸了,然后驱动程序就会中断,但是如果调用者正在这样做,它就在他们身上,而你的驱动程序也不应该期待未对齐的数据。