0

Windows のユーザー モード アプリケーションから、いくつかの異なる情報をカーネル モード ドライバーに渡そうとしています。自分が何をしているのかを完全に知っているふりをするつもりはないので、基本的な誤解がある場合は、明確にしていただければ幸いです。

ユーザー モード アプリケーション (ドライバーに IOCTL を送信):

typedef struct {
    unsigned int write;
    ULONG reg_addr;
    ULONG reg_val;
} reg_parameters;

...

reg_parameters regvals;
regvals.write = 0;
regvals.reg_addr = 0xDEADBEEF;
regvals.reg_val = 0XBBBBBBBB;
ULONG value;

...

DeviceIoControl(driver,(ULONG)IOCTL_OMAPCONF_REG, &regvals, sizeof(regvals),
                     &value, sizeof(ULONG), &size, NULL);

カーネル モード ドライバー (reg_addr でメモリを読み取り、reg_val で指定された場所に値を格納):

NTSTATUS OmapConfDrvDispatch(IN PDEVICE_OBJECT DeviceObject,
                    IN PIRP           Irp)
{
    PVOID               ioBuffer;

    ....

    ioBuffer  = Irp->AssociatedIrp.SystemBuffer;

    ....

ioBufferさて、質問:ドライバーから個々の構造体メンバーにアクセスするにはどうすればよいですか?

たとえば、なぜそれほど単純ではないのioBuffer.reg_addrでしょうか?

考え?

4

1 に答える 1

3

をポインターIrp->AssociatedIrp.SystemBufferとしてキャストします。reg_parameters

reg_parameters* regvals = (reg_parameters*)Irp->AssociatedIrp.SystemBuffer;
if (regvals->reg_addr == 0xDEADBEEF) {
   // mmmm - beef
}

reg_parametersこれは、ドライバー コードで が定義されていることを前提としています。

于 2012-08-02T18:59:21.823 に答える