IWMDMStorageGlobals
COM公式ドキュメント
IWMDMStorageGlobals インターフェースは、デバイス上のストレージメディア (フラッシュ ROM カードなど) に関するグローバルな情報を取得するためのメソッドを提供します。
メソッド 7
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
GetCapabilities メソッドは、ルートストレージメディアの機能を取得します。
| pdwCapabilities | DWORD* | out | 次の値のうち 0 個以上をビットごとの OR で組み合わせた値を格納する DWORD へのポインターです。
|
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェースメソッドは、次の種類のエラーコードを返す可能性があります。
- 標準の COM エラーコード
- HRESULT 値に変換された Windows エラーコード
- Windows Media Device Manager のエラーコード
GetSerialNumber メソッドは、ストレージメディアを一意に識別するシリアル番号を取得します。
| pSerialNum | WMDMID* | out | シリアル番号の情報を指定する WMDMID 構造体へのポインターです。 |
| abMac | BYTE* | inout | このメソッドのパラメーターデータに対するメッセージ認証コードを指定するバイト配列です。このメモリは呼び出し元が割り当てて解放します。 |
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェースメソッドは、次の種類のエラーコードを返す可能性があります。
- 標準の COM エラーコード
- HRESULT 値に変換された Windows エラーコード
- Windows Media Device Manager のエラーコード
解説(Remarks)
すべてのストレージメディアがシリアル番号をサポートしているわけではありませんが、Microsoft のデジタル著作権管理をサポートするにはシリアル番号が必要です。ストレージメディアが一意のシリアル番号を報告できない場合、Microsoft のデジタル著作権管理で保護されたコンテンツをそのストレージメディアに転送することはできません。この機能がサポートされているかどうかを判断するには、戻り値のコードを確認してください。
例
次の C++ のコードは、ルートストレージオブジェクトのシリアル番号を取得し、MAC を検証します。
hr = m_pStorageGlobals->GetSerialNumber(&m_SerialNumber, (BYTE*)abMAC);
if (SUCCEEDED(hr))
{
// CSecureChannelClient のメンバーを使用して MAC を検証します。
m_pSAC->MACInit(&hMAC);
m_pSAC->MACUpdate(hMAC, (BYTE*)(&m_SerialNumber), sizeof(m_SerialNumber));
m_pSAC->MACFinal(hMAC, (BYTE*)abMACVerify);
if (memcmp(abMACVerify, abMAC, sizeof(abMAC)) != 0)
{
hr = E_FAIL;
}
}
GetTotalSize メソッドは、IWMDMStorageGlobals インターフェースに関連付けられたストレージメディアの合計サイズをバイト単位で取得します。
| pdwTotalSizeLow | DWORD* | out | メディアの合計サイズの下位の値を受け取る DWORD へのポインターです。 |
| pdwTotalSizeHigh | DWORD* | out | メディアの合計サイズの上位の値を受け取る DWORD へのポインターです。 |
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェースメソッドは、次の種類のエラーコードを返す可能性があります。
- 標準の COM エラーコード
- HRESULT 値に変換された Windows エラーコード
- Windows Media Device Manager のエラーコード
GetTotalFree メソッドは、ストレージメディア上の空き容量の合計をバイト単位で取得します。
| pdwFreeLow | DWORD* | out | 空き容量の値の下位部分を受け取る DWORD へのポインターです。 |
| pdwFreeHigh | DWORD* | out | 空き容量の値の上位部分を受け取る DWORD へのポインターです。 |
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェースメソッドは、次の種類のエラーコードを返す可能性があります。
- 標準の COM エラーコード
- HRESULT 値に変換された Windows エラーコード
- Windows Media Device Manager のエラーコード
解説(Remarks)
メディアがファイル管理のために使用しているストレージ容量を求めるには、GetTotalFree で取得した空きバイト数から、GetTotalBad で取得した不良バイト数を差し引きます。
GetTotalBad メソッドは、ストレージメディア上の使用できない領域の合計をバイト単位で取得します。(IWMDMStorageGlobals.GetTotalBad)
| pdwBadLow | DWORD* | out | 使用できない領域の下位バイトを受け取る DWORD へのポインターです。 |
| pdwBadHigh | DWORD* | out | 使用できない領域の上位バイトを受け取る DWORD へのポインターです。 |
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェースメソッドは、次の種類のエラーコードを返す可能性があります。
- 標準の COM エラーコード
- HRESULT 値に変換された Windows エラーコード
- Windows Media Device Manager のエラーコード
解説(Remarks)
メディアがファイル管理のために使用しているストレージ容量を求めるには、GetTotalFree で取得した空きバイト数から、GetTotalBad で取得した不良バイト数を差し引きます。
GetStatus メソッドは、ストレージメディアの現在の状態を取得します。
| pdwStatus | DWORD* | out | メソッドから制御が戻るときに状態情報を受け取る DWORD へのポインターです。pdwStatus パラメーターには次の値が返される場合があります。
|
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェースメソッドは、次の種類のエラーコードを返す可能性があります。
- 標準の COM エラーコード
- HRESULT 値に変換された Windows エラーコード
- Windows Media Device Manager のエラーコード
解説(Remarks)
ストレージメディアを操作しようとする前に、必ずこのメソッドを呼び出す必要があります。他のインターフェースが進行中の操作を開始している場合、取得される状態値は WMDM_STATUS_BUSY になります。この呼び出しで取得した値を評価することで、進行中の操作が IWMDMStorageGlobals インターフェースから開始されたものかどうかを判断できます。
Initialize メソッドは、ストレージメディアをフォーマットします。(IWMDMStorageGlobals.Initialize)
| fuMode | DWORD | in | メディアの初期化に使用するモードです。次の 2 つのモードのうち、いずれか 1 つだけを指定します。両方のモードを指定した場合は、ブロックモードが使用されます。
| ||||||
| pProgress | IWMDMProgress* | inoptional | フォーマット操作の進行状況を追跡するためにアプリケーションが実装した IWMDMProgress インターフェースへのポインターです。 |
戻り値
このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェースメソッドは、次の種類のエラーコードを返す可能性があります。
- 標準の COM エラーコード
- HRESULT 値に変換された Windows エラーコード
- Windows Media Device Manager のエラーコード
解説(Remarks)
アプリケーションが WMDM_MODE_THREAD を使用し、pProgress パラメーターに null 以外の値を渡す場合、Windows Media Device Manager がこのオブジェクトに進行状況の通知を送信するため、アプリケーションは読み取り操作が完了するまで pProgress が属するオブジェクトが破棄されないようにする必要があります。このオブジェクトを破棄できるのは、End 通知を受け取った後だけです。これを怠るとアクセス違反が発生します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IWMDMStorageGlobals "{1DCB3A07-33ED-11D3-8470-00C04F79DBC0}" #usecom global IWMDMStorageGlobals IID_IWMDMStorageGlobals "{}" #comfunc global IWMDMStorageGlobals_GetCapabilities 3 var #comfunc global IWMDMStorageGlobals_GetSerialNumber 4 var,var #comfunc global IWMDMStorageGlobals_GetTotalSize 5 var,var #comfunc global IWMDMStorageGlobals_GetTotalFree 6 var,var #comfunc global IWMDMStorageGlobals_GetTotalBad 7 var,var #comfunc global IWMDMStorageGlobals_GetStatus 8 var #comfunc global IWMDMStorageGlobals_Initialize 9 int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IWMDMStorageGlobals "{1DCB3A07-33ED-11D3-8470-00C04F79DBC0}" #usecom global IWMDMStorageGlobals IID_IWMDMStorageGlobals "{}" #comfunc global IWMDMStorageGlobals_GetCapabilities 3 sptr #comfunc global IWMDMStorageGlobals_GetSerialNumber 4 sptr,sptr #comfunc global IWMDMStorageGlobals_GetTotalSize 5 sptr,sptr #comfunc global IWMDMStorageGlobals_GetTotalFree 6 sptr,sptr #comfunc global IWMDMStorageGlobals_GetTotalBad 7 sptr,sptr #comfunc global IWMDMStorageGlobals_GetStatus 8 sptr #comfunc global IWMDMStorageGlobals_Initialize 9 int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。