次の方法で共有


DrvEscape 関数 (winddi.h)

DrvEscape 関数は、デバイスに依存しないデバイス ドライバー インターフェイスで使用できないデバイスから情報を取得するために使用されます。特定のクエリは、iEsc パラメーターの値によって異なります。

構文

ULONG DrvEscape(
  [in]  SURFOBJ *pso,
  [in]  ULONG   iEsc,
  [in]  ULONG   cjIn,
  [in]  PVOID   pvIn,
  [in]  ULONG   cjOut,
  [out] PVOID   pvOut
);

パラメーター

[in] pso

呼び出しの対象となるサーフェスを記述する SURFOBJ 構造体へのポインター。

[in] iEsc

クエリを指定します。 他のパラメーターの意味は、この値によって異なります。 QUERYESCSUPPORT は、定義済みの唯一の値です。ドライバーが特定のエスケープ関数をサポートしているかどうかを照会します。 この場合、 pvIn は エスケープ関数番号を指します。 cjOutpvOut は無視されます。 指定した関数がサポートされている場合、戻り値は 0 以外です。

[in] cjIn

pvIn が指すバッファーのサイズをバイト単位で指定します。

[in] pvIn

呼び出しの入力データへのポインター。 入力データの形式は、 iEsc パラメーターで指定されたクエリによって異なります。

[in] cjOut

pvOut が指すバッファーのサイズをバイト単位で指定します。

[out] pvOut

出力バッファーへのポインター。 出力データの形式は、 iEsc パラメーターで指定されたクエリによって異なります。

戻り値

戻り値は、 iEsc パラメーターで指定されたクエリに依存します。 クエリで指定された関数がサポートされていない場合、戻り値は 0 になります。

注釈

この関数では、デバイスでの描画は許可されていません。 DrvDrawEscape は、特殊な描画サポートに使用されます。

GDI は、(悪意のある可能性がある) クライアント アプリケーションからドライバーにデータを直接渡します。つまり、 DrvEscape 関数はすべての入力引数を検証する必要があります。 具体的には、この関数は次の操作を行う必要があります。

  • iEsc パラメーターで受け取った値が有効なクエリを表していることを確認します。
  • 指定したクエリに対して入力バッファーのサイズ ( cjIn パラメーターの値) が有効であることを確認します。
  • pvIn パラメーターが指すバッファーの内容が、指定したクエリに対して有効であることを確認します。
  • 指定したクエリに対して、指定した出力バッファーのサイズ ( cjOut パラメーターの値) が有効であることを確認します。
Microsoft は、エスケープ コードの範囲 0 から0X10000を予約します。 サードパーティベンダーは、この範囲を超えて独自に使用するエスケープコードを自由に選択できます。 ドライバー固有のエスケープ コードは他のディスプレイ ドライバーで使用されているものと競合する可能性があるため、ディスプレイ ドライバーはエスケープを処理する前にエスケープ パラメーターを検証することが重要です。 これを行う方法の 1 つは、入力ブロック サイズと出力ブロック サイズと入力ブロック パラメーターを検証することです。 セキュリティを強化するために、ドライバーには、入力ブロックが信頼できるソースからのものであることを確認するために、入力ブロックごとに適切に設定する必要がある "マジック" 値も含める必要があります。

DrvEscape は、すべてのドライバーで省略可能です。

要件

要件
対象プラットフォーム デスクトップ
Header winddi.h (Winddi.h を含む)

こちらもご覧ください

DrvDrawEscape

SURFOBJ