0

これは基本的な質問のように思えるかもしれませんが、どこにも解決策が見つかりません。

カーネル モードから情報を取得する必要があります。したがって、私は 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 の操作方法を学ぶ必要がありますか?

4

1 に答える 1

0

モジュールに対してグローバルにするには、次のように宣言します。

module.c:

#include <windows.h>

#define GLOBALBUFFERMAX (1024)

CHAR dataPack[GLOBALBUFFERMAX] = "";
PCHAR g_pDataPack = dataPack;

...そして、プログラムに対してグローバルにする次の方法(#include module.hアクセスできるすべてのモジュールに対してpglobal_buffer):

module.h:

#include <windows.h>

#define GLOBALBUFFERMAX (1024)

extern PCHAR g_pDataPack;

module.c

#include <windows.h>

#include "module.h"

CHAR dataPack[GLOBALBUFFERMAX] = "";
PCHAR g_pDataPack = dataPack;
于 2013-11-18T13:50:15.150 に答える