-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);
};

次に、サポートする必要がある各プラットフォームの実装を提供します。1 つは WindowsDeviceIOControl呼び出し用で、もう 1 つはサポートするシステム用です。ioctl

于 2013-04-19T20:40:55.320 に答える