1

私のカーネルモードドライバーの中には、次のコードがあります。

PHYSICAL_ADDRESS    physAddr;
PVOID               pvk;
unsigned int        reg_addr; // physical address to write to
unsigned int*       reg_val;  // pointer to value to be written

// assume reg_addr and reg_val are initialized to some values

physAddr.QuadPart = (ULONGLONG)reg_addr;
pvk = MmMapIoSpace(physAddr,sizeof(reg_addr),MmNonCached);
WRITE_REGISTER_ULONG((ULONG*)pvk,(ULONG)&reg_val);

アドレスが書き込まれていません。理由はわかりません。これは正しい手順ですか、それともステップがありませんか?また、私のポインタ演算が間違っている可能性がありますか?私はすべての順列を試しましたが、正しい結果が得られたものはありません。で指定された物理メモリreg_addrを、で指定された値で指定されたもので書き込みたいreg_val

4

1 に答える 1

1

あなたのコードで奇妙/間違っているように見えることがいくつかあります:-

まず、PHYSICAL_ADDRESS.QuadPartは64ビット値ですが、32ビット整数を割り当てています。それがあなたのやりたいことでよろしいですか?

次に、32ビットの「ULONG」レジスタをマップするとします。

pvk = MmMapIoSpace(physAddr,sizeof(reg_addr),MmNonCached); 

それはおそらくうまくいくでしょう、しかし私があなたが意味すると思うのはこれです

pvk = MmMapIoSpace(physAddr, sizeof(ULONG), MmNonCached); 

最後に、ポインタ変数のアドレスreg_valをレジスタに書き込んでいます。あなたのコメントは、?が指す値を書きたいことを意味します。reg_valその場合は、代わりにこれを使用してください。

WRITE_REGISTER_ULONG((ULONG*)pvk, *reg_val);
于 2012-08-03T22:43:05.600 に答える