これは基本的な質問のように思えるかもしれませんが、どこにも解決策が見つかりません。
カーネル モードから情報を取得する必要があります。したがって、私は IOCTL を使用します。私のユーザーモードアプリケーションは、大量のデータを転送する必要があるため、METHOD_OUT_DIRECT で DeviceIoControl を使用してこの IOCTL を送信します。これにより、char-Pointer がドライバーに送信されます。
ドライバーは IOCTL を取得し、割り込み要求内で応答できます。
コードは次のようになります。
case IOCTL_FILTERIO_REQUEST_DATA:
{
PVOID pInputBuffer;
PVOID pOutputBuffer;
ULONG outputBufferLength;
PCHAR pReturnData = g_pDataPack;
ULONG dwDataSize = 8000;
ULONG dwDataRead = 0, dwDataWritten = 0;
status = STATUS_UNSUCCESSFUL;
pInputBuffer = Irp - > AssociatedIrp.SystemBuffer;
pOutputBuffer = NULL;
if (Irp - > MdlAddress) {
pOutputBuffer = MmGetSystemAddressForMdlSafe(Irp - > MdlAddress, NormalPagePriority);
}
if (pOutputBuffer) {
RtlCopyMemory(pOutputBuffer, pReturnData, dwDataSize);
status = STATUS_SUCCESS; * g_pDataPack = 0;
db_counter = 0;
}
}
break;
しかし、カーネル モードの別の部分から情報をコピーする必要があります。
次のようなグローバル PCHAR を作成しようとしました。
ヘッダー ファイル (宣言) :extern PCHAR g_pDataPack;
ソースファイル (定義) :PCHAR g_pDataPack = "IOCTL DEFINITION";
編集 (その他のソースファイル):*g_pDataPack++ = 'some stuff';
私の問題は、割り込みがグローバル PCHAR をローカル PCHAR にコピーして USER-Mode-Application に送り返す前に、グローバル PCHAR を何度も編集して拡大する必要があることです。5000 エディションごとにグローバル ポインターをリセットしようとしましたが、実際にはうまくいきませんでした。
if (db_counter > 5000)
{
*g_pDataPack = 0;
db_counter = 0;
}
一定時間後にプログラムがクラッシュします。グローバルポインターが多くのスペースを割り当てるためだと思いますか?
CHAR 配列を作成しようとしましたが、まったく機能しませんでした。
特別なサイズのメモリを割り当ててからこれを編集し、必要に応じてローカルの PCHAR pReturnData にコピーする、より良い方法または簡単な方法はありますか、またはこのプロジェクトの DMA の操作方法を学ぶ必要がありますか?