-1

在我的理解中,DeviceIOControl 和 ioctl 是相同的功能。它们都向硬件发送控制代码并返回响应。为了重用代码,我正在尝试创建一个以跨平台方式工作的函数。因此,我决定使用 DeviceIOControl api,因为它是固定且特定的。问题是:我如何将 ioctl 映射到那个?

我目前有:

int DeviceIoControl_issueCommand(DeviceHandle handle, int command, void *input, ssize_t sizeof_input, void *output, ssize_t sizeof_output, uint32_t *bytes_written){
#if SYSTEMINFORMATION_ISWINDOWS
    int result = DeviceIoControl(handle,command,input,sizeof_input,output,sizeof_output,bytes_written,0);
    if (result == 0){
        result = -1; //-1 is the new error return
    }
    return result;
#else
    int result = ioctl(handle, command, input); //this doesnt work!
    return result;
#endif
}

任何帮助是极大的赞赏!

4

2 回答 2

0

如果没有大量的内部翻译,您的要求是不可能的DeviceIoControl_issueCommand。函数调用完全不同,需要不同的参数和数据。您可以通过声明 IOControl 类并为要支持的每种类型的 IO 功能添加成员函数来解决此问题。

class IOControl
{
public:
    void DoIoControlX();
    void DoIoControlY(int param1, int param2);
};

然后为您需要支持的每个平台提供一个实现。一种用于 WindowsDeviceIOControl调用,一种用于支持ioctl

于 2013-04-19T20:40:55.320 回答
0

我实际上发现有一个 IOCTL 可以将原始数据传入和传出驱动程序(至少对于硬盘驱动器):HDIO_DRIVE_TASKFILE(http://www.mjmwired.net/kernel/Documentation/ioctl/hdio.txt

于 2013-05-20T18:25:48.887 回答