Win32 API 日本語リファレンス
ホームMedia.DeviceManager › IWMDMStorage

IWMDMStorage

COM
IID1dcb3a06-33ed-11d3-8470-00c04f79dbc0継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

IWMDMStorage インターフェイスのインスタンスは、デバイス上のストレージ(ファイル、フォルダー、プレイリストなど、データオブジェクトやコレクションオブジェクトの総称)を調査および探索するためのメソッドを提供します。

メソッド 9

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT SetAttributes(DWORD dwAttributes, WAVEFORMATEX* pFormat)

SetAttributes メソッドは、ストレージの属性を設定します。

dwAttributesDWORDin

設定する属性を指定する DWORD。次の表に、このパラメーターで設定できる属性を示します。

属性 説明
WMDM_FILE_ATTR_AUDIO このファイルにはオーディオデータが含まれます。
WMDM_FILE_ATTR_DATA このファイルにはオーディオ以外のデータが含まれます。
WMDM_FILE_ATTR_CANPLAY このオーディオファイルはデバイスで再生できます。
WMDM_FILE_ATTR_CANDELETE このファイルは削除できます。
WMDM_FILE_ATTR_CANMOVE このファイルまたはフォルダーは、ストレージメディア上で移動できます。
WMDM_FILE_ATTR_CANRENAME このファイルまたはフォルダーは名前を変更できます。
WMDM_FILE_ATTR_CANREAD このファイルはホストコンピューターから読み取ることができます。
WMDM_FILE_ATTR_MUSIC このオーディオファイルには音楽が含まれます。
WMDM_FILE_ATTR_AUDIOBOOK これはオーディオブックファイルです。
WMDM_FILE_ATTR_HIDDEN このファイルはファイルシステム上で隠しファイルです
WMDM_FILE_ATTR_SYSTEM これはシステムファイルです
WMDM_FILE_ATTR_READONLY これは読み取り専用ファイルです。
pFormatWAVEFORMATEX*inoptionalオブジェクトのオーディオ情報を指定する _WAVEFORMATEX 構造体への省略可能なポインター。

戻り値

このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェイスメソッドは、次の種類のエラーコードのいずれかを返す可能性があります。

発生しうるエラーコードの詳細な一覧については、Error Codes を参照してください。

解説(Remarks)

GetAttributes に記載されている属性の多くは設定できないため、SetAttributes の属性表には記載されていません。

vtbl 4 HRESULT GetStorageGlobals(IWMDMStorageGlobals** ppStorageGlobals)

GetStorageGlobals メソッドは、このストレージのルートストレージの IWMDMStorageGlobals インターフェイスを取得します。

ppStorageGlobalsIWMDMStorageGlobals**outシリアル番号や機能などのデバイス情報を提供する IWMDMStorageGlobals インターフェイスへのポインター。呼び出し元は、使用が終わったらこのインターフェイスを解放する必要があります。

戻り値

このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェイスメソッドは、次の種類のエラーコードのいずれかを返す可能性があります。

発生しうるエラーコードの詳細な一覧については、Error Codes を参照してください。

解説(Remarks)

返される IWMDMStorageGlobals インターフェイスは、現在のストレージのルートストレージに関するグローバル情報へアクセスするためのメソッドを提供します。このインターフェイスはデバイスのグローバル情報を公開するため、アプリケーションは 1 つのメモリコンテナー内のいずれかのストレージに対して、このメソッドを一度呼び出すだけで済みます。

vtbl 5 HRESULT GetAttributes(DWORD* pdwAttributes, WAVEFORMATEX* pFormat)

GetAttributes メソッドは、ストレージの属性を取得します。

pdwAttributesDWORD*out

次の属性のうち 1 つ以上をビットごとの OR で組み合わせて指定する DWORD へのポインター。

属性 説明
WMDM_STORAGE_ATTR_FILESYSTEM このオブジェクトは最上位のストレージメディアです(ストレージカードやその他のオンボードストレージなど)。
WMDM_STORAGE_ATTR_REMOVABLE グローバルストレージメディアはリムーバブルです。
WMDM_STORAGE_ATTR_NONREMOVABLE グローバルストレージメディアはリムーバブルではありません。
WMDM_STORAGE_ATTR_FOLDERS グローバルストレージメディアはフォルダーとファイル階層をサポートします。
WMDM_STORAGE_ATTR_HAS_FILES このストレージオブジェクトは、直下の子として少なくとも 1 つのファイルを含んでいます。
WMDM_STORAGE_ATTR_HAS_FOLDERS このストレージオブジェクトは、直下の子として少なくとも 1 つのフォルダーを含んでいます。
WMDM_STORAGE_ATTR_CANEDITMETADATA このストレージはメタデータを編集できます。
WMDM_FILE_ATTR_FILE これはストレージメディア上のファイルです。
WMDM_FILE_ATTR_FOLDER これはストレージメディア上のフォルダーです。
WMDM_FILE_ATTR_LINK これは複数のファイル間の関連付けを作成するリンクです。
WMDM_FILE_ATTR_AUDIO このファイルにはオーディオデータが含まれます。
WMDM_FILE_ATTR_DATA このファイルにはオーディオ以外のデータが含まれます。
WMDM_FILE_ATTR_CANPLAY このオーディオファイルはデバイスで再生できます。
WMDM_FILE_ATTR_CANDELETE このファイルは削除できます。
WMDM_FILE_ATTR_CANMOVE このファイルまたはフォルダーは、ストレージメディア上で移動できます。
WMDM_FILE_ATTR_CANRENAME このファイルまたはフォルダーは名前を変更できます。
WMDM_FILE_ATTR_CANREAD このファイルはホストコンピューターから読み取ることができます。
WMDM_FILE_ATTR_MUSIC このオーディオファイルには音楽が含まれます。
WMDM_FILE_ATTR_AUDIOBOOK これはオーディオブックファイルです。
WMDM_FILE_ATTR_VIDEO このファイルにはビデオデータが含まれます。
WMDM_FILE_ATTR_HIDDEN このファイルはファイルシステム上で隠しファイルです
WMDM_FILE_ATTR_SYSTEM これはシステムファイルです
WMDM_FILE_ATTR_READONLY これは読み取り専用ファイルです。
WMDM_STORAGE_ATTR_VIRTUAL このストレージは仮想的なものであり、デバイスのファイルシステム上の実際のストレージには対応しません。(メタデータに基づいて作成されるフォルダーは、仮想ストレージの一例です。)
WMDM_STORAGE_IS_DEFAULT このストレージは、デバイス上で新しいデジタルメディアを配置する既定の場所です。
WMDM_STORAGE_CONTAINS_DEFAULT このストレージは、新しいデジタルメディアを配置すべき既定のストレージを含んでいます。
pFormatWAVEFORMATEX*inoutoptionalオブジェクトのオーディオ属性を指定する _WAVEFORMATEX 構造体への省略可能なポインター。

戻り値

このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェイスメソッドは、次の種類のエラーコードのいずれかを返す可能性があります。

発生しうるエラーコードの詳細な一覧については、Error Codes を参照してください。
vtbl 6 HRESULT GetName(LPWSTR pwszName, DWORD nMaxChars)

GetName メソッドは、ストレージの表示名を取得します。

pwszNameLPWSTRoutストレージ名を格納する、null で終わるワイド文字文字列へのポインター。オブジェクトの表示名は、パス情報を含まないファイル名です。このバッファーの割り当てと解放は呼び出し元が行います。
nMaxCharsDWORDin名前文字列にコピーできる最大文字数を示す整数。

戻り値

このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェイスメソッドは、次の種類のエラーコードのいずれかを返す可能性があります。

発生しうるエラーコードの詳細な一覧については、Error Codes を参照してください。
vtbl 7 HRESULT GetDate(WMDMDATETIME* pDateTimeUTC)

GetDate メソッドは、ストレージが最後に変更された日付を取得します。

pDateTimeUTCWMDMDATETIME*outストレージオブジェクト(ファイルまたはフォルダー)が最後に変更された日付を指定する WMDMDATETIME 構造体へのポインター。

戻り値

このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェイスメソッドは、次の種類のエラーコードのいずれかを返す可能性があります。

発生しうるエラーコードの詳細な一覧については、Error Codes を参照してください。

解説(Remarks)

時刻は協定世界時 (UTC) で指定されます。

次の C++ コードは、渡されたストレージから「最終更新日時」の値を取得します。


// 「最終更新日時」を取得します。
WMDMDATETIME lastModified;
hr = pStorage->GetDate(&lastModified);
// TODO: 最終更新の年月日を表示します。
vtbl 8 HRESULT GetSize(DWORD* pdwSizeLow, DWORD* pdwSizeHigh)

GetSize メソッドは、ストレージのサイズをバイト単位で取得します。

pdwSizeLowDWORD*outストレージオブジェクトのサイズ(バイト単位)の下位部分を指定する DWORD へのポインター。
pdwSizeHighDWORD*outストレージオブジェクトのサイズ(バイト単位)の上位部分を指定する DWORD へのポインター。

戻り値

このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェイスメソッドは、次の種類のエラーコードのいずれかを返す可能性があります。

発生しうるエラーコードの詳細な一覧については、Error Codes を参照してください。

解説(Remarks)

フォルダーや抽象オブジェクト(抽象プレイリストなど)の場合、サイズは 0 です。

次の C++ コードは、ファイルのサイズをキロバイト単位で取得します。


// ファイルのサイズをキロバイト単位で取得します。
DWORD lowSize = 0;
DWORD highSize = 0;
hr = pStorage->GetSize(&lowSize, &highSize);
//TODO: ファイルサイズを表示します。
vtbl 9 HRESULT GetRights(WMDMRIGHTS** ppRights, DWORD* pnRightsCount, BYTE* abMac)

GetRights メソッドは、ライセンスされたストレージの権利情報を取得します。

ppRightsWMDMRIGHTS**outストレージの権利を格納する WMDMRIGHTS 構造体の配列へのポインター。このパラメーターはメッセージ認証コードに含まれます。このメモリは Windows Media Device Manager が割り当てるため、アプリケーションは CoTaskMemFree で解放する必要があります。
pnRightsCountDWORD*outppRights 配列に含まれる WMDMRIGHTS 構造体の数へのポインター。このパラメーターはメッセージ認証コードに含まれます。
abMacBYTE*inoutこのメソッドのパラメーターデータに対するメッセージ認証コード (MAC) を格納するバイト配列。

戻り値

このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェイスメソッドは、次の種類のエラーコードのいずれかを返す可能性があります。

発生しうるエラーコードの詳細な一覧については、Error Codes を参照してください。

解説(Remarks)

オブジェクトの権利は、デジタルメディアコンテンツの使用許諾を表します。たとえば、WMDMRIGHTS 構造体には、ファイルを再生できる回数や再生できるユーザーに関する情報を格納できます。ライセンスされたファイルでない場合、このメソッドは失敗します。

ppRights 配列はこのメソッドによって割り当てられるため、アプリケーションは標準の Win32 関数である CoTaskMemFree を使用して解放する必要があります。

この呼び出しの進行状況イベントを受け取るには、IWMDMStorage4::GetRightsWithProgress を使用します。

このメソッドを呼び出した後、アプリケーションはパラメーターのメッセージ認証コード (MAC) 値を計算し、出力された MAC 値と比較することで、パラメーターが改ざんされていないことを確認できます。次のサンプルコードは、その一例を示しています。


CSecureChannelClient  *pSCClient;
IWMDMStorage  *pStorgae;

HMAC  hMAC;
BYTE  abMAC[WMDM_MAC_LENGTH];
BYTE  abMACVerify[WMDM_MAC_LENGTH];

hr = pStorage->GetRights(&pRights, &nRightsCount, abMAC);
if (SUCCEEDED(hr))
{
    //
    // まず、取得した権利の整合性を検証します。
    //
    pSCClient->MACInit(&hMAC);
    pSCClient->MACUpdate(hMAC, (BYTE*)(pRights), 
                    sizeof(WMDMRIGHTS) * nRightsCount);
    pSCClient->MACUpdate(hMAC, (BYTE*)(&nRightsCount), 
                                 sizeof(nRightsCount));
    pSCClient->MACFinal(hMAC, (BYTE*)abMACVerify);
    if (memcmp(abMACVerify, abMAC, sizeof(abMAC)) != 0)
    {
        hr = WMDM_E_MAC_CHECK_FAILED;
    }
}

vtbl 10 HRESULT EnumStorage(IWMDMEnumStorage** pEnumStorage)

EnumStorage メソッドは、現在のストレージの直下の子ストレージを列挙するために IWMDMEnumStorage インターフェイスを取得します。

pEnumStorageIWMDMEnumStorage**outIWMDMEnumStorage インターフェイスへのポインター。呼び出し元は、使用が終わったらこのインターフェイスを解放する必要があります。

戻り値

このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェイスメソッドは、次の種類のエラーコードのいずれかを返す可能性があります。

発生しうるエラーコードの詳細な一覧については、Error Codes を参照してください。

解説(Remarks)

取得される IWMDMEnumStorage インターフェイスは、このオブジェクトの直下の子を列挙します。このメソッドにより、アプリケーションはデバイスの内容を再帰的にたどることができます。

vtbl 11 HRESULT SendOpaqueCommand(OPAQUECOMMAND* pCommand)

SendOpaqueCommand メソッドは、Windows Media Device Manager を介して、コマンドを処理せずにストレージへ送信します。

pCommandOPAQUECOMMAND*inout実行するコマンドを格納する OPAQUECOMMAND 構造体へのポインター。データは、アプリケーションからデバイスへ、および呼び出しの完了時にデバイスからアプリケーションへという 2 つの方向で受け渡しできます。

戻り値

このメソッドは HRESULT を返します。Windows Media Device Manager のすべてのインターフェイスメソッドは、次の種類のエラーコードのいずれかを返す可能性があります。

発生しうるエラーコードの詳細な一覧については、Error Codes を参照してください。

解説(Remarks)

このメソッドは、Windows Media Device Manager の動作に影響を与えず、変更せずにそのまま渡すべきストレージメディアコマンドを対象としています。

次の C++ コードは、SendOpaqueCommand を呼び出して、デバイスとの簡単なカスタム認証手順を実行します。呼び出し元は自身の証明書と MAC をデバイスに送信し、デバイスは自身の証明書と MAC を返します。アプリケーションは、取得した証明書を保持している証明書と比較し、一致した場合(かつ MAC が正しい場合)に bExtraCertified を TRUE に設定します。


    // SendOpaqueCommand を呼び出して、拡張認証情報を交換します。
    {
        HMAC           hMAC;
        OPAQUECOMMAND  Command;
        CERTINFOEX    *pCertInfoEx;
        DWORD          cbData_App   = sizeof(bCertInfoEx_App)/sizeof(bCertInfoEx_App[0]);
        DWORD          cbData_SP    = sizeof(bCertInfoEx_SP)/sizeof(bCertInfoEx_SP[0]);
        DWORD          cbData_Send  = sizeof(CERTINFOEX) + cbData_App;

        // 不透明コマンド構造体にアプリケーションの証明書を設定します。
        memcpy(&(Command.guidCommand), &guidCertInfoEx, sizeof(GUID));

        Command.pData = (BYTE *)CoTaskMemAlloc(cbData_Send);
        if (!Command.pData)
        {
            ExitOnFail(hr = E_OUTOFMEMORY);
        }
        Command.dwDataLen = cbData_Send;

        // 不透明コマンド内のデータを CERTINFOEX 構造体にマップし、
        // 送信する証明書情報を設定します。
        pCertInfoEx = (CERTINFOEX *)Command.pData;
        pCertInfoEx->hr     = S_OK;
        pCertInfoEx->cbCert = cbData_App;
        memcpy(pCertInfoEx->pbCert, bCertInfoEx_App, cbData_App);

        // データの MAC を計算し、OPAQUECOMMAND 構造体に追加します。
        g_cWmdm.m_pSAC->MACInit(&hMAC);
        g_cWmdm.m_pSAC->MACUpdate(hMAC, (BYTE*)(&(Command.guidCommand)), sizeof(GUID));
        g_cWmdm.m_pSAC->MACUpdate(hMAC, (BYTE*)(&(Command.dwDataLen)), sizeof(Command.dwDataLen));
        if (Command.pData)
        {
            g_cWmdm.m_pSAC->MACUpdate(hMAC, Command.pData, Command.dwDataLen);
        }
        g_cWmdm.m_pSAC->MACFinal(hMAC, Command.abMAC);

        // 不透明コマンドを送信します。
        hr = pDevice->SendOpaqueCommand(&Command);
        if (SUCCEEDED(hr))
        {
            // 次に、取得した MAC を検証します。
            BYTE abMACVerify2[ WMDM_MAC_LENGTH ];
            g_cWmdm.m_pSAC->MACInit(&hMAC);
            g_cWmdm.m_pSAC->MACUpdate(hMAC, (BYTE*)(&(Command.guidCommand)), sizeof(GUID));
            g_cWmdm.m_pSAC->MACUpdate(hMAC, (BYTE*)(&(Command.dwDataLen)), sizeof(Command.dwDataLen));
            if (Command.pData)
            {
                g_cWmdm.m_pSAC->MACUpdate(hMAC, Command.pData, Command.dwDataLen);
            }
            g_cWmdm.m_pSAC->MACFinal(hMAC, abMACVerify2);

            // MAC が一致するか確認します。
            if (memcmp(abMACVerify2, Command.abMAC, WMDM_MAC_LENGTH) == 0)
            {
                 // 一致した場合は、取得した証明書を検証します。
                // 不透明コマンド内のデータを CERTINFOEX 構造体にマップします。
                //
                pCertInfoEx = (CERTINFOEX *)Command.pData;

                // この単純な拡張認証方式では、呼び出される側が
                // 完全に一致する証明書情報を提供する必要があります。
                //
                if ((pCertInfoEx->cbCert != cbData_SP) &&
                    (memcmp(pCertInfoEx->pbCert, bCertInfoEx_SP, cbData_SP) == 0))
                {
                    bExtraCertified = TRUE;
                }
            }
        }

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

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_IWMDMStorage "{1DCB3A06-33ED-11D3-8470-00C04F79DBC0}"
#usecom global IWMDMStorage IID_IWMDMStorage "{807B3CE0-357A-11D3-8471-00C04F79DBC0}"
#comfunc global IWMDMStorage_SetAttributes      3 int,var
#comfunc global IWMDMStorage_GetStorageGlobals  4 sptr
#comfunc global IWMDMStorage_GetAttributes      5 var,var
#comfunc global IWMDMStorage_GetName            6 var,int
#comfunc global IWMDMStorage_GetDate            7 var
#comfunc global IWMDMStorage_GetSize            8 var,var
#comfunc global IWMDMStorage_GetRights          9 var,var,var
#comfunc global IWMDMStorage_EnumStorage        10 sptr
#comfunc global IWMDMStorage_SendOpaqueCommand  11 var
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※#usecom 末尾は CoCreateInstance 用のクラスID(コクラスCLSID, SDKから自動取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。