Win32 API 日本語リファレンス
ホーム › Graphics.DirectDraw › PDX_TRANSFER

PDX_TRANSFER

コールバック

シグネチャ

DWORD PDX_TRANSFER(
    void* param0,
    DDTRANSFERININFO* param1,
    DDTRANSFEROUTINFO* param2
);

パラメーター

フィールド型説明
param0void*ミニポートドライバーのデバイス拡張へのポインターです。
param1DDTRANSFERININFO*サーフェスの転送情報が格納された DDTRANSFERININFO 構造体へのポインターです。
param2DDTRANSFEROUTINFO*キャプチャされるフィールドの極性が格納された DDTRANSFEROUTINFO 構造体へのポインターです。

公式ドキュメント

DxTransfer コールバック関数は、サーフェスからメモリ記述子リスト (MDL) で指定されたバッファーへ、データをバスマスター転送するようドライバーに通知します。

戻り値

DxTransfer は、成功した場合に DX_OK を返します。失敗した場合は、次のいずれかのエラー値を返します:

解説(Remarks)

MDL は WDM のドキュメントで定義されています。

次のコード例に示すように、ビデオミニポートドライバーは、TransferInInfo パラメーターで渡される DDTRANSFERININFO 構造体の lpDestMDL メンバーにある MDL へのポインターを使用して、分散バッファーを構成する物理メモリページへデータをバスマスター転送できます:

DWORD 
DxTransfer(
    DEVICE_EXT *pDeviceExt, 
    PDDTRANSFERININFO pTransferInInfo, 
    PDDTRANSFEROUTINFO pTransferOutInfo
    )
{
    PMDL pMdl;
    UINT uiNbPages;
    PPFN_NUMBER pPages;
    PVOID MappedSystemVa;
    ULONG ByteCount;

    pMdl = pTransferInInfo->lpDestMDL;
    MappedSystemVa = MmGetMdlVirtualAddress(pMdl);
    ByteCount = MmGetMdlByteCount(pMdl);
    uiNbPages = ADDRESS_AND_SIZE_TO_SPAN_PAGES(MappedSystemVa,
                                               ByteCount);
    pPages = MmGetMdlPfnArray(pMdl)
    for (i=0; i<uiNbPages; i++) {
        //
        // Transfer to page[i]
        //
        pPages[i];
    }
}

詳細については、カーネルモードマクロの ADDRESS_AND_SIZE_TO_SPAN_PAGES、MmGetMdlByteCount、MmGetMdlPfnArray、MmGetMdlVirtualAddress を参照してください。

DxTransfer はハードウェア割り込み時に呼び出されます。そのため、ドライバーは直前のバスマスター転送の完了を待つことができず、割り込み時に呼び出しても安全でない関数 (つまりほとんどの関数) を呼び出すこともできません。

さらに、ハードウェアが現在ビジーであるという理由だけで、ドライバーがこの呼び出しを失敗させるべきではありません。代わりに、ドライバーは内部キューを管理する必要があります。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)