次の方法で共有


WdfDeviceSetAlignmentRequirement 関数 (wdfdevice.h)

[KMDF にのみ適用]

WdfDeviceSetAlignmentRequirement メソッドは、メモリ転送操作中にデバイスが使用するデータ バッファーのドライバーの優先アドレスの配置を登録します。

構文

void WdfDeviceSetAlignmentRequirement(
  [in] WDFDEVICE Device,
  [in] ULONG     AlignmentRequirement
);

パラメーター

[in] Device

フレームワーク デバイス オブジェクトへのハンドル。

[in] AlignmentRequirement

データ バッファーのハードウェアに依存するアラインメント要件。 この値は、配置境界より 1 小さい値である必要があります。 たとえば、16 バイトのアラインメント境界には 15、32 バイトのアラインメント境界には 31 を指定できます。 Wdm.h で定義されているFILE_Xxxx_ALIGNMENT定数のいずれかを使用することもできます。次に例を示します。

//
// Define alignment requirement values
//
#define FILE_BYTE_ALIGNMENT             0x00000000
#define FILE_WORD_ALIGNMENT             0x00000001
#define FILE_LONG_ALIGNMENT             0x00000003
#define FILE_QUAD_ALIGNMENT             0x00000007
#define FILE_OCTA_ALIGNMENT             0x0000000f
#define FILE_32_BYTE_ALIGNMENT          0x0000001f
#define FILE_64_BYTE_ALIGNMENT          0x0000003f
#define FILE_128_BYTE_ALIGNMENT         0x0000007f
#define FILE_256_BYTE_ALIGNMENT         0x000000ff
#define FILE_512_BYTE_ALIGNMENT         0x000001ff

戻り値

なし

解説

ドライバーが無効なオブジェクト ハンドルを提供すると、バグ チェックが発生します。

ダイレクト I/O を使用するドライバーは 、WdfDeviceSetAlignmentRequirement を呼び出して、優先する配置要件を登録できます。 配置は、I/O マネージャーを経由する I/O 要求に適用され、 IoCallDriver を呼び出す別のドライバーからドライバーに送信される要求には適用されません。

I/O マネージャーでは要求されたアラインメントが常に使用されるとは限らないため、ドライバーは配置されていないバッファー用に準備する必要があります。

ドライバーは WdfDeviceGetAlignmentRequirement を呼び出して、デバイスの配置要件の現在の値を取得できます。

I/O マネージャーは、ドライバーが WdfDeviceCreate を呼び出すときに、デバイスの配置要件の値を設定します。 デバイスのアラインメント要件の値と、ドライバーが値を変更する必要がある場合の詳細については、WDM ドキュメントの 「デバイス オブジェクトの初期化 」を参照してください。

ドライバーがコンピューターのページ サイズ (PAGE_SIZE) を超える配置要件を指定している場合、 WdfCommonBufferGetAlignedLogicalAddress メソッドが返す論理アドレスは常に指定された配置要件に合わせて調整されますが、 WdfCommonBufferGetAlignedVirtualAddress メソッドが返す仮想アドレスは配置要件に合わせられない可能性があります。

ドライバーで、コンピューターのページ サイズより小さい配置要件が指定されている場合、すべての論理アドレスと仮想アドレスは、指定した配置要件に合わせて配置されます。

WdfDeviceSetAlignmentRequirement の呼び出しの詳細については、「DMA トランザクションの有効化」および「共通バッファーの使用」を参照してください。

次のコード例は、 AMCC5933 サンプル ドライバーのコード例です。 次の使用例は、デバイスの現在のアラインメント要件を確認し、必要に応じてアラインメント要件を新しい値に設定します。 正確なアラインメント値はハードウェアによって異なります。

ULONG alignReq;

alignReq = WdfDeviceGetAlignmentRequirement(device);
if (alignReq < AMCC5933_ALIGNMENT__32BITS) {
//
// Set the S5933 alignment requirement to a new value.
//
WdfDeviceSetAlignmentRequirement(
                                 device,
                                 AMCC5933_ALIGNMENT__32BITS
                                 );
}

要件

要件
対象プラットフォーム ユニバーサル
最小 KMDF バージョン 1.0
Header wdfdevice.h (Wdf.h を含む)
Library Wdf01000.sys (「Framework ライブラリのバージョン管理」を参照)。
IRQL <= DISPATCH_LEVEL
DDI コンプライアンス規則 DriverCreate(kmdf)KmdfIrql(kmdf)KmdfIrql2(kmdf)、KmdfIrqlExplicit(kmdf)

こちらもご覧ください

WdfCommonBufferGetAlignedLogicalAddress

WdfCommonBufferGetAlignedVirtualAddress

WdfDeviceGetAlignmentRequirement