7

私はドライバーのソースコードを持っていて、それを理解しています。ユーザーモードでアプリを作成します。ドライバーの関数を呼び出したい。どうすればいいですか?

いくつかのドライバー ヘッダー コード:

...
BYTE ReadRegister(DEVICE_CONTEXT *pDevice, BYTE SlavAddr, BYTE SlavMode, WORD RegAddr, BYTE* pData, BYTE DataCont);

BYTE WriteRegister(DEVICE_CONTEXT *pDevice, BYTE SlavAddr, BYTE SlavMode, WORD RegAddr, BYTE* pData, BYTE DataCont);
...

ドライバーの cpp コード部分:

BYTE ReadRegister(DEVICE_CONTEXT *pDevice, BYTE SlavAddr, BYTE SlavMode, WORD RegAddr, BYTE* pData, BYTE DataCont)
{
.....
}

//-----------------------------------------------------------------------------
BYTE WriteRegister(DEVICE_CONTEXT *pDevice, BYTE SlavAddr, BYTE SlavMode, WORD RegAddr, BYTE* pData, BYTE DataCont)
{
....
}
4

1 に答える 1

9

カーネル モード ドライバー API 関数を直接呼び出すことはできませんでした。代わりにIOCTL APIを使用する必要があります。

通常のワークフロー シナリオは次のようになります

  1. ユーザー モード アプリケーションは、IOCTL 要求をポストし、呼び出される関数に関する情報と、その引数スタックへのポインターを渡します。
  2. カーネル モード ドライバーは、要求をディスパッチし、引数を独自のスタックにコピーし、関数を呼び出し、結果を IOCTL 出力バッファーで呼び出し元に返します。
  3. 呼び出し元は、IOCTL 操作の結果を取得し、通常の DLL 関数呼び出しの後に処理を続行します。
于 2012-09-01T11:43:09.347 に答える