IWMDRMTranscryptor
COM公式ドキュメント
IWMDRMTranscryptor インターフェイスは、DRM で保護された ASF ファイルを、Windows Media DRM 10 for Network Devices プロトコルに準拠したセキュアなデータストリームに変換します。
解説(Remarks)
DRM トランスクリプター(transcryptor)は、デバイスからポリシー要求メッセージが送信された後に初期化されます。IWMDRMMessageParser::ParseLicenseRequestMsg を呼び出すことで、ライセンス要求を解析し、デバイス証明書、デバイスのシリアル番号、および要求されたアクションを取得できます。
IWMDRMTranscryptor インターフェイスのメソッドは、IWMStatusCallback::OnStatus コールバックメソッドを使用して、進行状況をアプリケーションに通知します。詳細については、Using the Callback Methods を参照してください。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
Initialize メソッドは、ファイルを DRM トランスクリプターに読み込みます。トランスクリプターがデータを処理するには、事前にファイルを読み込んでおく必要があります。
| bstrFileName | LPWSTR | in | 読み込むファイルの名前。DRM で暗号化された ASF ファイルを指定してください。 |
| pbLicenseRequestMsg | BYTE* | inout | メモリ内のライセンス要求メッセージのアドレス。このメッセージはデバイスからアプリケーションに送信されます。 |
| cbLicenseRequestMsg | DWORD | in | ライセンス要求メッセージのサイズ(バイト単位)。 |
| ppLicenseResponseMsg | INSSBuffer** | out | ライセンス応答メッセージのアドレスを受け取る変数のアドレス。アプリケーションは、暗号化されたデータを送信する前に、このメッセージをデバイスに送信する必要があります。 |
| pCallback | IWMStatusCallback* | in | トランスクリプターからステータスメッセージを受け取る IWMStatusCallback 実装のアドレス。 |
| pvContext | void* | in | アプリケーションが使用する汎用ポインター。これは IWMStatusCallback::OnStatus コールバックの呼び出し時にアプリケーションへ渡されます。単一のステータスコールバックを共有する場合、このパラメーターを使用して異なるオブジェクトからのメッセージを区別できます。このパラメーターには NULL を指定できます。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 | |
|
1 つ以上のポインターパラメーターが NULL です。
または cbPolicyRequestMsg パラメーターが 0 です。 |
|
| 別のトランスクリプション(transcription)が進行中です。 | |
| 内部オブジェクト用のメモリを割り当てられませんでした。 |
解説(Remarks)
このメソッドは非同期です。ただちに戻りますが、WMT_TRANSCRYPTOR_INIT メッセージが IWMStatusCallback::OnStatus コールバックメソッドに送信されるまで処理は完了しません。このメッセージとともに送信される HRESULT には、初期化の戻り値が格納されます。
Seek メソッドは、読み込んだファイルのデータストリーム内の指定した位置から読み取るように DRM トランスクリプターを設定します。以降の Read 呼び出しは、その位置からデータを生成します。
| hnsTime | ULONGLONG | in | シーク時間(100 ナノ秒単位)。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 | |
| トランスクリプターに読み込まれているファイルがありません。 |
解説(Remarks)
このメソッドは非同期です。ただちに戻りますが、WMT_TRANSCRYPTOR_SEEKED メッセージが IWMStatusCallback::OnStatus コールバックメソッドに送信されるまで処理は完了しません。
シーク操作が失敗した場合、メッセージは送信されません。
Seek の最初の呼び出しが成功すると、トランスクリプターはコンテンツの ASF ヘッダーを読み取ります。以降の Seek 呼び出しはデータセクション内の読み取り位置を変更しますが、ヘッダーや ASF Data Object(データセクションに関する最上位情報を含む ASF オブジェクト)は生成しません。
ファイル全体を変換するには、プレゼンテーション時間 0 を指定して Seek を呼び出します。
Read メソッドは、トランスクリプターに読み込まれたファイルからデータを読み取り、Windows Media DRM 10 for Network Devices をサポートするデバイスへのストリーミング用に暗号化します。
| pbData | BYTE* | in | データを受け取るバッファーのアドレス。 |
| pcbData | DWORD* | in | pbData が指すデータバッファーのサイズを格納する変数のアドレス。入力時にはバッファーのサイズを設定します。出力時には、実際に読み取られたバイト数に値が変更されます。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 | |
|
トランスクリプターは読み取りの準備ができていません。
または 別の読み取りが進行中です。 |
解説(Remarks)
このメソッドは非同期です。ただちに戻りますが、WMT_TRANSCRYPTOR_READ メッセージが IWMStatusCallback::OnStatus コールバックメソッドに送信されるまで処理は完了しません。pbData が参照するバッファーも、pcbData が参照するバッファー長も、WMT_TRANSCRYPTOR_READ メッセージが送信されるまで更新されません。
WMT_TRANSCRYPTOR_READ メッセージとともに送信される HRESULT には、読み取り操作の戻り値が格納されます。この読み取り操作のデータにファイルの終端が含まれることを示すために、特別な成功コード NS_S_TRANSCRYPTOR_EOF が送信されます。
Close メソッドは、DRM トランスクリプターからファイルをアンロードし、関連するすべてのリソースを解放します。
戻り値
このメソッドは HRESULT を返します。取り得る値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値コード | 説明 |
|---|---|
| メソッドは成功しました。 |
解説(Remarks)
このメソッドは非同期です。ただちに戻りますが、WMT_TRANSCRYPTOR_CLOSED メッセージが IWMStatusCallback::OnStatus コールバックメソッドに送信されるまで処理は完了しません。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IWMDRMTranscryptor "{69059850-6E6F-4BB2-806F-71863DDFC471}" #usecom global IWMDRMTranscryptor IID_IWMDRMTranscryptor "{}" #comfunc global IWMDRMTranscryptor_Initialize 3 wstr,var,int,sptr,sptr,sptr #comfunc global IWMDRMTranscryptor_Seek 4 int64 #comfunc global IWMDRMTranscryptor_Read 5 var,var #comfunc global IWMDRMTranscryptor_Close 6 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IWMDRMTranscryptor "{69059850-6E6F-4BB2-806F-71863DDFC471}" #usecom global IWMDRMTranscryptor IID_IWMDRMTranscryptor "{}" #comfunc global IWMDRMTranscryptor_Initialize 3 wstr,sptr,int,sptr,sptr,sptr #comfunc global IWMDRMTranscryptor_Seek 4 int64 #comfunc global IWMDRMTranscryptor_Read 5 sptr,sptr #comfunc global IWMDRMTranscryptor_Close 6 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。