据我了解,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
}
非常感谢任何帮助!
答案 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)