gpt4 book ai didi

c++ - DeviceIoControl 缓冲区参数编码和对齐

转载 作者:行者123 更新时间:2023-11-28 06:52:02 25 4
gpt4 key购买 nike

我正在为它写一个 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 中,每个进程都使用它自己的地址空间,因此从客户端传递到服务的内存缓冲区需要由操作系统以某种方式编码,例如通过内存别名或复制。通过使用 UNALIGNED (__unaligned) Visual C++ 扩展关键字,或通过将缓冲区复制到对齐的目标,可以在服务端过早地解决(潜在的)问题。但是由于所有这些都需要开发人员和 CPU 做更多的工作,所以如果知道问题根本不存在,最好避免它。

最佳答案

DeviceIoControl 调用不会更改它编码(marshal)的任何数据的对齐方式,因此无论您在源中采用何种对齐方式,您都将在驱动程序中获得这种对齐方式。这并不是说您可以在调用者中使用 UNALIGNED 搞砸事情,然后驱动程序会中断,但如果调用者这样做,它就在他们身上,并且您的驱动程序不应该期望未对齐无论如何数据。

关于c++ - DeviceIoControl 缓冲区参数编码和对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23787061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com