如何将DeviceIOControl移植到ioctl?

时间:2013-04-19 20:33:42

标签: c++ c linux windows porting

据我了解,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
}

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

DeviceIoControl_issueCommand中没有很多的内部翻译,您无法提出要求。函数调用完全不同,并期望不同的参数和数据。您可以通过声明IOControl类并为要支持的每种IO功能类型添加成员函数来解决此问题。

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

然后为您需要支持的每个平台提供一个实例。一个用于Windows DeviceIOControl调用,另一个用于支持ioctl

的系统

答案 1 :(得分:0)

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