IVdsLun
COM公式ドキュメント
IVdsLun インターフェイス (vdshwprv.h) は、論理ユニット番号 (LUN) に対するクエリおよび構成操作を実行するためのメソッドを提供します。
メソッド 17
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
IVdsLun::GetProperties (vdshwprv.h) メソッドは、LUN オブジェクトのプロパティを返します。
| pLunProp | VDS_LUN_PROP* | out | 呼び出し元が割り当てて渡す VDS_LUN_PROP 構造体のアドレスです。VDS は pwszFriendlyName、pwszIdentification、pwszUnmaskingList の各メンバー文字列用にメモリを割り当てます。呼び出し元は、CoTaskMemFree 関数を使用してこれらの文字列を解放する必要があります。 |
戻り値
このメソッドは、E_INVALIDARG や E_OUTOFMEMORY などの標準的な HRESULT 値、および VDS 固有の戻り値を返すことがあります。また、HRESULT_FROM_WIN32 マクロを使用して変換された システムエラーコードを返すこともあります。エラーは VDS 自体、または使用中の基盤となる VDS プロバイダーから発生する可能性があります。戻り値には次のものがあります。
| リターンコード/値 | 説明 |
|---|---|
|
一部のプロパティは取得されましたが、すべてではありません。すべてのプロパティの取得に失敗する原因は、デバイスの取り外しなど、多数考えられます。 |
|
この戻り値は、アレイに関する情報をキャッシュするプロバイダー内部のソフトウェアまたは通信の問題を示します。IVdsHwProvider::Reenumerate メソッドを実行し、続けて IVdsHwProvider::Refresh メソッドを実行してキャッシュを復元してください。 |
|
LUN オブジェクトは既に存在しません。 |
IVdsLun::GetSubSystem (vdshwprv.h) メソッドは、LUN を提供するサブシステムを返します。
| ppSubSystem | IVdsSubSystem** | out | IVdsSubSystem インターフェイスポインターのアドレスです。呼び出し元はインターフェイスを解放する必要があります。 |
戻り値
このメソッドは、E_INVALIDARG や E_OUTOFMEMORY などの標準的な HRESULT 値、および VDS 固有の戻り値を返すことがあります。また、HRESULT_FROM_WIN32 マクロを使用して変換された システムエラーコードを返すこともあります。エラーは VDS 自体、または使用中の基盤となる VDS プロバイダーから発生する可能性があります。戻り値には次のものがあります。
| リターンコード/値 | 説明 |
|---|---|
|
この戻り値は、アレイに関する情報をキャッシュするプロバイダー内部のソフトウェアまたは通信の問題を示します。IVdsHwProvider::Reenumerate メソッドを実行し、続けて IVdsHwProvider::Refresh メソッドを実行してキャッシュを復元してください。 |
|
LUN オブジェクトは既に存在しません。 |
IVdsLun::GetIdentificationData (vdshwprv.h) メソッドは、SCSI Inquiry Data および Vital Product Data のページ 0x80 と 0x83 のデータを返します。
| pLunInfo | VDS_LUN_INFORMATION* | out | 呼び出し元が割り当てて渡す VDS_LUN_INFORMATION 構造体のアドレスです。VDS は、m_szVendorId、m_szProductId、m_szProductRevision、m_szSerialNumber の各メンバー文字列、および VDS_INTERCONNECT 構造体の配列の各要素の m_pbPort メンバー文字列と m_pbAddress メンバー文字列用にメモリを割り当てます。呼び出し元は、CoTaskMemFree 関数を使用してこれらの文字列を解放する必要があります。 |
戻り値
このメソッドは、E_INVALIDARG や E_OUTOFMEMORY などの標準的な HRESULT 値、および VDS 固有の戻り値を返すことがあります。また、HRESULT_FROM_WIN32 マクロを使用して変換された システムエラーコードを返すこともあります。エラーは VDS 自体、または使用中の基盤となる VDS プロバイダーから発生する可能性があります。戻り値には次のものがあります。
| リターンコード/値 | 説明 |
|---|---|
|
この戻り値は、アレイに関する情報をキャッシュするプロバイダー内部のソフトウェアまたは通信の問題を示します。IVdsHwProvider::Reenumerate メソッドを実行し、続けて IVdsHwProvider::Refresh メソッドを実行してキャッシュを復元してください。 |
|
LUN オブジェクトは既に存在しません。 |
|
LUN は失敗状態にあり、要求された操作を実行できません。 |
|
別の操作が進行中です。この操作は、先行する 1 つ以上の操作が完了するまで続行できません。 |
IVdsLun::QueryActiveControllers (vdshwprv.h) メソッドは、現在アクティブなコントローラーの列挙を返します。
| ppEnum | IEnumVdsObject** | out | サブシステム内のコントローラーを コントローラーオブジェクトとして列挙するために使用できる IEnumVdsObject インターフェイスポインターのアドレスです。詳細については、列挙オブジェクトの操作を参照してください。呼び出し元は、インターフェイスおよび各コントローラーオブジェクトが不要になったら、IUnknown::Release メソッドを呼び出して解放する必要があります。 |
戻り値
このメソッドは、E_INVALIDARG や E_OUTOFMEMORY などの標準的な HRESULT 値、および VDS 固有の戻り値を返すことがあります。また、HRESULT_FROM_WIN32 マクロを使用して変換された システムエラーコードを返すこともあります。エラーは VDS 自体、または使用中の基盤となる VDS プロバイダーから発生する可能性があります。戻り値には次のものがあります。
| リターンコード/値 | 説明 |
|---|---|
| アクティブなコントローラーの列挙を返します。LUN にアクティブなコントローラーがない場合、列挙は空になります。 | |
|
この戻り値は、アレイに関する情報をキャッシュするプロバイダー内部のソフトウェアまたは通信の問題を示します。IVdsHwProvider::Reenumerate メソッドを実行し、続けて IVdsHwProvider::Refresh メソッドを実行してキャッシュを復元してください。 |
|
LUN オブジェクトは既に存在しません。 |
|
LUN は失敗状態にあり、要求された操作を実行できません。 |
|
別の操作が進行中です。この操作は、先行する 1 つ以上の操作が完了するまで続行できません。 |
解説(Remarks)
コントローラーを設定するには、IVdsLun::AssociateControllers メソッドを使用します。特定のコントローラーに関連付けられた LUN をクエリするには、IVdsController::QueryAssociatedLuns メソッドを使用します。
ほとんどのサブシステムは、LUN に対してアクティブなコントローラーを 1 つだけ提供し、他のコントローラーはスタンバイモードのままにします。ただし、複数のコントローラーを同時にアクティブにすることを許可するサブシステムメーカーもあります。
IVdsLun::Extend (vdshwprv.h) メソッドは、指定されたバイト数だけ LUN を拡張します。
| ullNumberOfBytesToAdd | ULONGLONG | in | LUN を拡張するバイト数です。バイト数はドライブのブロックサイズまたはセクターサイズの整数倍である必要はありません。プロバイダーは、アライメント要件やその他の制約を満たすために、バイト数を切り上げまたは切り捨てることができます。ほとんどの場合、プロバイダーは切り上げを行うため、まれな例外を除き、LUN は少なくとも要求されたバイト数だけ拡張されます。 |
| pDriveIdArray | GUID* | in | ドライブ GUID の配列へのポインターです。プロバイダーはこれらのドライブを使用して LUN を拡張します。ドライブは指定された順序で使用されます。プロバイダーは、あるドライブ上のすべてのエクステントを使用してから次のドライブに移り、LUN が要求されたバイト数だけ拡張された時点で停止します。 あるいは、このパラメーターに NULL を、lNumberOfDrives パラメーターに 0 を渡すことで、プロバイダーにドライブを自動的に選択させることもできます。NULL を渡すことができるのは、lNumberOfDrives パラメーターが 0 の場合のみである点に注意してください。 |
| lNumberOfDrives | INT | in | pDriveIdArray パラメーターで指定されたドライブの数です。呼び出し元が 0 を渡した場合、プロバイダーがドライブを選択します。 |
| ppAsync | IVdsAsync** | out | IVdsAsync インターフェイスポインターのアドレスで、VDS が戻り時に初期化します。呼び出し元はインターフェイスを解放する必要があります。このインターフェイスを使用して、操作のキャンセル、完了の待機、または状態のクエリを行います。 |
戻り値
このメソッドは、E_INVALIDARG や E_OUTOFMEMORY などの標準的な HRESULT 値、および VDS 固有の戻り値を返すことがあります。また、HRESULT_FROM_WIN32 マクロを使用して変換された システムエラーコードを返すこともあります。エラーは VDS 自体、または使用中の基盤となる VDS プロバイダーから発生する可能性があります。戻り値には次のものがあります。
| リターンコード/値 | 説明 |
|---|---|
|
この戻り値は、アレイに関する情報をキャッシュするプロバイダー内部のソフトウェアまたは通信の問題を示します。IVdsHwProvider::Reenumerate メソッドを実行し、続けて IVdsHwProvider::Refresh メソッドを実行してキャッシュを復元してください。 |
|
LUN オブジェクトは既に存在しません。 |
|
LUN は失敗状態にあり、要求された操作を実行できません。 |
|
別の操作が進行中です。この操作は、先行する 1 つ以上の操作が完了するまで続行できません。 |
|
VDS_OBJECT_ID 定数を受け取るすべてのメソッドから返される可能性があります。この戻り値は、識別子が既存のオブジェクトを参照していないことを示します。 |
|
この操作またはパラメーターの組み合わせは、このプロバイダーではサポートされていません。 |
|
この操作に十分な使用可能領域がありません。 |
|
この操作を完了するのに十分な空きドライブがサブシステムにありません。 |
解説(Remarks)
呼び出し元は、LUN の拡張にプロバイダーが使用するドライブのリストを指定するか、プロバイダーにドライブを自動的に選択させることができます。
LUN の拡張後、呼び出し元は IOCTL_DISK_UPDATE_PROPERTIES 制御コードを使用して、LUN のマスクが解除されているコンピューター上で更新後のディスクサイズが見えるようにする必要があります。
実装者は、呼び出しが非同期操作を開始するかどうかにかかわらず、このメソッドに対して IVdsAsync インターフェイスへのポインターを返す必要があります。
ullNumberOfBytesToAdd パラメーターが pDriveIdArray パラメーターで指定されたドライブ上で使用可能なバイト数を超える場合は、指定されたドライブを先に使用し、その後で使用可能な他のドライブから選択します。要求されたバイト数だけ LUN を拡張するのに十分なドライブがない場合は、エラーを返し、LUN を拡張しないでください。
IVdsLun::Shrink (vdshwprv.h) メソッドは、指定されたバイト数だけ LUN を縮小します。
| ullNumberOfBytesToRemove | ULONGLONG | in | LUN を縮小するバイト数です。バイト数はブロックサイズまたはセクターサイズの整数倍である必要はありません。 |
| ppAsync | IVdsAsync** | out | IVdsAsync インターフェイスポインターのアドレスです。呼び出し元はインターフェイスを解放する必要があります。このインターフェイスを使用して、操作のキャンセル、完了の待機、または状態のクエリを行います。 |
戻り値
このメソッドは、E_INVALIDARG や E_OUTOFMEMORY などの標準的な HRESULT 値、および VDS 固有の戻り値を返すことがあります。また、HRESULT_FROM_WIN32 マクロを使用して変換された システムエラーコードを返すこともあります。エラーは VDS 自体、または使用中の基盤となる VDS プロバイダーから発生する可能性があります。戻り値には次のものがあります。
| リターンコード/値 | 説明 |
|---|---|
|
この戻り値は、アレイに関する情報をキャッシュするプロバイダー内部のソフトウェアまたは通信の問題を示します。IVdsHwProvider::Reenumerate メソッドを実行し、続けて IVdsHwProvider::Refresh メソッドを実行してキャッシュを復元してください。 |
|
LUN オブジェクトは既に存在しません。 |
|
LUN は失敗状態にあり、要求された操作を実行できません。 |
|
別の操作が進行中です。この操作は、先行する 1 つ以上の操作が完了するまで続行できません。 |
解説(Remarks)
実装者は、呼び出しが非同期操作を開始するかどうかにかかわらず、このメソッドに対して IVdsAsync インターフェイスへのポインターを返す必要があります。
LUN の縮小後、呼び出し元は IOCTL_DISK_UPDATE_PROPERTIES 制御コードを使用して、LUN のマスクが解除されているコンピューター上で更新後のディスクサイズが見えるようにする必要があります。
実装者は、LUN の末尾からバイトを削除する必要があります。
IVdsLun::QueryPlexes (vdshwprv.h) メソッドは、LUN 内のプレックスの列挙を返します。
| ppEnum | IEnumVdsObject** | out | プレックスを LUN プレックスオブジェクトとして列挙するために使用できる IEnumVdsObject インターフェイスポインターのアドレスです。詳細については、列挙オブジェクトの操作を参照してください。呼び出し元は、インターフェイスおよび各 LUN プレックスオブジェクトが不要になったら、IUnknown::Release メソッドを呼び出して解放する必要があります。 |
戻り値
このメソッドは、E_INVALIDARG や E_OUTOFMEMORY などの標準的な HRESULT 値、および VDS 固有の戻り値を返すことがあります。また、HRESULT_FROM_WIN32 マクロを使用して変換された システムエラーコードを返すこともあります。エラーは VDS 自体、または使用中の基盤となる VDS プロバイダーから発生する可能性があります。戻り値には次のものがあります。
解説(Remarks)
すべての LUN には少なくとも 1 つのプレックスが必要です。ミラー化された LUN には複数のプレックスがあります。
IVdsLun::AddPlex (vdshwprv.h) メソッドは、ターゲット LUN に新しいプレックスとして LUN を追加します。
| lunId | GUID | in | プレックスとして追加する LUN の GUID です。 |
| ppAsync | IVdsAsync** | out | IVdsAsync インターフェイスポインターのアドレスで、VDS が戻り時に初期化します。呼び出し元はインターフェイスを解放する必要があります。このインターフェイスを使用して、操作のキャンセル、完了の待機、または状態のクエリを行います。 |
戻り値
このメソッドは、E_INVALIDARG や E_OUTOFMEMORY などの標準的な HRESULT 値、および VDS 固有の戻り値を返すことがあります。また、HRESULT_FROM_WIN32 マクロを使用して変換された システムエラーコードを返すこともあります。エラーは VDS 自体、または使用中の基盤となる VDS プロバイダーから発生する可能性があります。戻り値には次のものがあります。
| リターンコード/値 | 説明 |
|---|---|
|
この戻り値は、アレイに関する情報をキャッシュするプロバイダー内部のソフトウェアまたは通信の問題を示します。IVdsHwProvider::Reenumerate メソッドを実行し、続けて IVdsHwProvider::Refresh メソッドを実行してキャッシュを復元してください。 |
|
LUN オブジェクトは既に存在しません。 |
|
LUN は失敗状態にあり、要求された操作を実行できません。 |
|
別の操作が進行中です。この操作は、先行する 1 つ以上の操作が完了するまで続行できません。 |
|
VDS_OBJECT_ID 定数を受け取るすべてのメソッドから返される可能性があります。これは、識別子が既存のオブジェクトを参照していないことを示します。 |
|
操作が無効です。または、ソース LUN がターゲット LUN より小さいことを示します。ソース LUN がターゲット LUN より大きい場合は、ターゲット LUN のサイズは変わらず、操作は成功します。 |
解説(Remarks)
呼び出し元が新しい LUN をプレックスとして追加すると、その LUN は LUN として表示されなくなります。呼び出し元がミラー化された LUN を追加した場合、VDS は各プレックスを個別のプレックスとして含めます。追加された LUN 上のすべてのデータは失われます。
実装者は、呼び出しが非同期操作を開始するかどうかにかかわらず、このメソッドに対して IVdsAsync インターフェイスへのポインターを返す必要があります。
IVdsLun::RemovePlex (vdshwprv.h) メソッドは、LUN からプレックスを削除します。
| plexId | GUID | in | 削除する LUN プレックスの GUID です。 |
| ppAsync | IVdsAsync** | out | IVdsAsync インターフェイスポインターのアドレスで、VDS が戻り時に初期化します。呼び出し元はインターフェイスを解放する必要があります。このインターフェイスを使用して、操作のキャンセル、完了の待機、または状態のクエリを行います。 このメソッドに対して IVdsAsync::Wait を呼び出して成功を示す HRESULT 値が返された場合は、各インターフェイスポインターに対して IUnknown::Release メソッドを呼び出して、VDS_ASYNC_OUTPUT 構造体で返されたインターフェイスを解放する必要があります。ただし、Wait が失敗を示す HRESULT 値を返した場合、または Wait の pHrResult パラメーターが失敗を示す HRESULT 値を受け取った場合は、VDS_ASYNC_OUTPUT 構造体内のインターフェイスポインターは NULL であり、解放する必要はありません。HRESULT 値が成功か失敗かは、Winerror.h で定義されている SUCCEEDED マクロと FAILED マクロを使用してテストできます。 |
戻り値
このメソッドは、E_INVALIDARG や E_OUTOFMEMORY などの標準的な HRESULT 値、および VDS 固有の戻り値を返すことがあります。また、HRESULT_FROM_WIN32 マクロを使用して変換された システムエラーコードを返すこともあります。エラーは VDS 自体、または使用中の基盤となる VDS プロバイダーから発生する可能性があります。戻り値には次のものがあります。
| リターンコード/値 | 説明 |
|---|---|
|
この戻り値は、アレイに関する情報をキャッシュするプロバイダー内部のソフトウェアまたは通信の問題を示します。IVdsHwProvider::Reenumerate メソッドを実行し、続けて IVdsHwProvider::Refresh メソッドを実行してキャッシュを復元してください。 |
|
LUN オブジェクトは既に存在しません。 |
|
LUN は失敗状態にあり、要求された操作を実行できません。 |
|
別の操作が進行中です。この操作は、先行する 1 つ以上の操作が完了するまで続行できません。 |
|
VDS_OBJECT_ID 定数を受け取るすべてのメソッドから返される可能性があります。この戻り値は、識別子が既存のオブジェクトを参照していないことを示します。 |
解説(Remarks)
削除されたプレックスは存在しなくなり、VDS はエクステントを解放します。呼び出し元はスタンドアロンの LUN プレックスを削除することはできません。この操作により LUN がフォールトトレランスを失う可能性がある点に注意してください。たとえば、この操作によって LUN がミラーからシンプルに変換される場合、その LUN はフォールトトレラントではなくなります。
実装者は、呼び出しが非同期操作を開始するかどうかにかかわらず、このメソッドに対して IVdsAsync インターフェイスへのポインターを返す必要があります。
呼び出し元が RemovePlex メソッドを、plexId パラメーターに無効な値を設定して呼び出した場合は、VDS_E_OBJECT_NOT_FOUND を返す必要があります。
IVdsLun::Recover (vdshwprv.h) メソッドは、LUN の回復操作を開始します。
| ppAsync | IVdsAsync** | out | IVdsAsync インターフェイスポインターのアドレスです。呼び出し元はインターフェイスを解放する必要があります。このインターフェイスを使用して、操作のキャンセル、完了の待機、または状態のクエリを行います。 |
戻り値
このメソッドは、E_INVALIDARG や E_OUTOFMEMORY などの標準的な HRESULT 値、および VDS 固有の戻り値を返すことがあります。また、HRESULT_FROM_WIN32 マクロを使用して変換された システムエラーコードを返すこともあります。エラーは VDS 自体、または使用中の基盤となる VDS プロバイダーから発生する可能性があります。戻り値には次のものがあります。
| リターンコード/値 | 説明 |
|---|---|
|
この戻り値は、アレイに関する情報をキャッシュするプロバイダー内部のソフトウェアまたは通信の問題を示します。IVdsHwProvider::Reenumerate メソッドを実行し、続けて IVdsHwProvider::Refresh メソッドを実行してキャッシュを復元してください。 |
|
LUN オブジェクトは既に存在しません。 |
|
LUN は失敗状態にあり、要求された操作を実行できません。 |
|
別の操作が進行中です。この操作は、先行する 1 つ以上の操作が完了するまで続行できません。 |
|
この LUN はフォールトトレラントではないため、回復操作を実行できません。 |
解説(Remarks)
回復操作には、ミラーの再同期、パリティの再生成、または障害が発生しつつあるドライブのスペアドライブへの置き換えが含まれます。ほとんどのサブシステムは回復操作を自動的に開始します。ただし、自動的に開始しないサブシステムのために、このメソッドは手動で回復を開始する手段を提供します。
IVdsLun::SetMask (vdshwprv.h) メソッドは、アンマスクリスト、すなわち LUN へのアクセスを許可するコンピューターのリストを指定します。
| pwszUnmaskingList | LPWSTR | in | LUN へのアクセスを許可するコンピューターを指定するリストです。このリストは、セミコロンで区切られた、NULL で終端する、人間が読める形式の文字列です。 値が "" の場合、ストレージサブシステムに接続された HBA ポートを持つすべてのコンピューターに LUN へのアクセスが許可されます。 値が "" の場合、以前に LUN へのアクセスを許可されていたすべてのコンピューターのアクセスが取り消されます。 "*" または "" を指定した場合、他の値は指定できません。 ファイバーチャネルネットワークおよびシリアル接続 SCSI (SAS) ネットワークの場合、各エントリは、LUN のマスクが解除される各ポートの 64 ビットの World-Wide Name (WWN) であり、上位バイトを先頭とする 16 進文字列 (16 文字) として表記されます。たとえば、WWN アドレス 01:23:45:67:89:AB:CD:EF は "0123456789ABCDEF" と表されます。詳細については、ファイバーチャネルおよび SAS の T10 仕様を参照してください。 iSCSI ネットワークの場合、各エントリは、LUN のマスクが解除される各イニシエーターの iSCSI 修飾名 (IQN) です。特定のイニシエーターに対してマスクが解除された LUN は、そのイニシエーターに関連付けられているとみなされます。 注意 アンマスクリストには、同じ WWN または IQN が複数回含まれることがあります。呼び出し元は、リストから重複を削除したり、WWN や iSCSI 名の形式を検証したりする必要はありません。また、アクセスは累積されません。つまり、このメソッドが続けて 2 回呼び出された場合、2 回目の呼び出しで指定されたコンピューターのみにアクセスが許可されます。
|
戻り値
このメソッドは、E_INVALIDARG や E_OUTOFMEMORY などの標準的な HRESULT 値、および VDS 固有の戻り値を返すことがあります。また、HRESULT_FROM_WIN32 マクロを使用して変換された システムエラーコードを返すこともあります。エラーは VDS 自体、または使用中の基盤となる VDS プロバイダーから発生する可能性があります。戻り値には次のものがあります。
| リターンコード/値 | 説明 |
|---|---|
|
この戻り値は、アレイに関する情報をキャッシュするプロバイダー内部のソフトウェアまたは通信の問題を示します。IVdsHwProvider::Reenumerate メソッドを実行し、続けて IVdsHwProvider::Refresh メソッドを実行してキャッシュを復元してください。 |
|
LUN オブジェクトは既に存在しません。 |
|
LUN は失敗状態にあり、要求された操作を実行できません。 |
|
別の操作が進行中です。この操作は、先行する 1 つ以上の操作が完了するまで続行できません。 |
解説(Remarks)
LUN をマスクするために SetMask メソッドを呼び出す前に、呼び出し元は次の手順で対応するディスクをアンインストールする必要があります。まず、IVdsServiceUninstallDisk::GetDiskIdFromLunInfo を呼び出して、マスク対象の LUN に対応するディスクの VDS オブジェクト ID を取得します。次に、そのディスクの VDS オブジェクト ID を指定して IVdsServiceUninstallDisk::UninstallDisks を呼び出します。
Windows Server 2003 および Windows Server 2003 with SP1: 対応するディスクをアンインストールするには、次の手順を実行します。これらの手順は Windows Server 2003 R2 では廃止された点に注意してください。
- 次の手順で、マスク対象のディスク上のボリュームを特定します。
- 各ディスクについて、IVdsDisk::QueryExtents メソッドを呼び出してディスクエクステントを列挙します。このメソッドは VDS_DISK_EXTENT 構造体のリストを返します。この構造体の volumeId メンバーには、ボリューム GUID が含まれます。
- ソフトウェアプロバイダーが管理するボリュームを列挙します。IVdsSwProvider::QueryPacks メソッドを呼び出してパックを列挙し、IVdsPack::QueryVolumes を呼び出して各パック内のボリュームを列挙します。各ボリュームについて IVdsVolume::GetProperties を呼び出して VDS_VOLUME_PROP 構造体を取得します。この構造体の id メンバーにはボリューム GUID が含まれます。pwszName メンバーには、ボリュームハンドルを取得するために CreateFile に渡すボリューム名が含まれます。
- IVdsDisk::QueryExtents を呼び出して取得したボリューム GUID を使用して、列挙されたボリュームのリストの中から必要なボリューム名を判別します。
- FSCTL_LOCK_VOLUME 制御コードを使用して各ボリュームをロックします。LUN が無傷のボリュームとして別のマシンに移動されようとしており、別のアプリケーションがボリュームロックを保持している場合は、可能であれば次の手順に進む前に FSCTL_LOCK_VOLUME 操作を再試行してください。ただし、ボリュームが削除されるためにロックおよびマウント解除されるだけの場合は、FSCTL_LOCK_VOLUME 操作を再試行する必要はありません。
注意 この手順は省略可能です。この手順の目的は、ロックを保持している可能性のある他のアプリケーションにロックを解放させることです。ロック操作が失敗しても、次の手順に進んでください。
- FSCTL_DISMOUNT_VOLUME 制御コードを使用して各ボリュームをマウント解除します。
- ボリュームがベーシックディスク上にある場合は、IOCTL_VOLUME_OFFLINE 制御コードを使用してオフラインにします。
- SetupDiCallClassInstaller 関数を使用し、InstallFunction パラメーターに DIF_REMOVE を渡して各ボリュームをアンインストールします。
- SetupDiCallClassInstaller 関数を使用し、InstallFunction パラメーターに DIF_REMOVE を渡して各ディスクをアンインストールします。
- IVdsService::CleanupObsoleteMountPoints メソッドを呼び出して、マウントされたフォルダーやドライブ文字の割り当てなどのユーザーモードパスをレジストリから削除します。
LUN がターゲットマシンに対してマスク解除された後、またはターゲットマシンからマスクされた後、そのマシン上での LUN の可視性は、バスの再スキャンが実行されるまで変化しないことがあります。ターゲットマシン上の VDS アプリケーションは、IVdsService::Reenumerate を呼び出してバスの再スキャンを開始します。バスの再スキャンの開始は、ハードウェアプロバイダーではなく VDS アプリケーションの責任です。
IVdsLun::Delete (vdshwprv.h) メソッドは、LUN とそのすべてのプレックスを削除します。LUN 上のすべてのデータは失われます。VDS は LUN に割り当てられていたエクステントを解放します。
戻り値
このメソッドは、E_OUTOFMEMORY などの標準的な HRESULT 値、および VDS 固有の戻り値を返すことがあります。また、HRESULT_FROM_WIN32 マクロを使用して変換された システムエラーコードを返すこともあります。エラーは VDS 自体、または使用中の基盤となる VDS プロバイダーから発生する可能性があります。戻り値には次のものがあります。
| リターンコード/値 | 説明 |
|---|---|
|
この戻り値は、アレイに関する情報をキャッシュするプロバイダー内部のソフトウェアまたは通信の問題を示します。IVdsHwProvider::Reenumerate メソッドを実行し、続けて IVdsHwProvider::Refresh メソッドを実行してキャッシュを復元してください。 |
|
LUN オブジェクトは既に存在しません。 |
|
LUN は失敗状態にあり、要求された操作を実行できません。 |
|
別の操作が進行中です。この操作は、先行する 1 つ以上の操作が完了するまで続行できません。 |
解説(Remarks)
アプリケーションが IVdsLun インターフェイスへの参照を保持した状態で IVdsLun::Delete を呼び出した場合、実装者は、そのインターフェイス上の GetProperties などのメソッドが以後呼び出された際に VDS_E_OBJECT_DELETED を返す必要があります。この場合、インターフェイスには未解放の参照が残っており有効ですが、基盤となるオブジェクトは既に存在しません。
ターゲットマシンに対してマスク解除されている LUN が削除された場合、そのマシン上での LUN の可視性は、バスの再スキャンが実行されるまで変化しないことがあります。ターゲットマシン上の VDS アプリケーションは、IVdsService::Reenumerate を呼び出してバスの再スキャンを開始します。バスの再スキャンの開始は、ハードウェアプロバイダーではなく VDS アプリケーションの責任です。
IVdsLun::Delete などのメソッドがあるスレッドで呼び出され、同時に実行されている別のスレッドで IVdsSubSystem::QueryLuns が呼び出された場合、プロバイダーのアクセス違反が発生する可能性があります。ハードウェアプロバイダーは、このような同期の問題を最小限に抑えるために、必要に応じてこれらのメソッドを直列化する責任があります。
ハードウェアプロバイダーは、LUN を再利用できるように LUN のパーティション情報を削除する責任があります。LUN が MBR ディスクの場合、これはディスクの先頭と末尾の 1 MB にゼロを書き込むことで行われます。GPT ディスクの場合は、ディスクの先頭と末尾の 16 KB にゼロを書き込む必要があります。
IVdsLun::AssociateControllers (vdshwprv.h) メソッドは、LUN に対してサブシステムのコントローラーをアクティブまたは非アクティブに設定します。
| pActiveControllerIdArray | GUID* | in | コントローラー GUID の配列へのポインターです。プロバイダーはこれらのコントローラーをアクティブに設定します。この配列には、既にアクティブに設定されていてそのまま維持するコントローラーも含まれます。 |
| lNumberOfActiveControllers | INT | in | pActiveControllerArray パラメーターで指定されたコントローラーの数です。 |
| pInactiveControllerIdArray | GUID* | in | コントローラー GUID の配列へのポインターです。プロバイダーはこれらのコントローラーを非アクティブに設定します。この配列には、既に非アクティブに設定されていてそのまま維持するコントローラーも含まれます。 |
| lNumberOfInactiveControllers | INT | in | pInactiveControllerIdArray パラメーターで指定されたコントローラーの数です。 |
戻り値
このメソッドは、E_INVALIDARG や E_OUTOFMEMORY などの標準的な HRESULT 値、および VDS 固有の戻り値を返すことがあります。また、HRESULT_FROM_WIN32 マクロを使用して変換された システムエラーコードを返すこともあります。エラーは VDS 自体、または使用中の基盤となる VDS プロバイダーから発生する可能性があります。戻り値には次のものがあります。
| リターンコード/値 | 説明 |
|---|---|
|
この戻り値は、アレイに関する情報をキャッシュするプロバイダー内部のソフトウェアまたは通信の問題を示します。IVdsHwProvider::Reenumerate メソッドを実行し、続けて IVdsHwProvider::Refresh メソッドを実行してキャッシュを復元してください。 |
|
LUN オブジェクトは既に存在しません。 |
|
LUN は失敗状態にあり、要求された操作を実行できません。 |
|
別の操作が進行中です。この操作は、先行する 1 つ以上の操作が完了するまで続行できません。 |
|
アクティブまたは非アクティブの配列で指定された GUID のうち 1 つ以上が、既存のオブジェクトを参照していません。 |
|
この操作またはパラメーターの組み合わせは、このプロバイダーではサポートされていません。 |
解説(Remarks)
呼び出し元は、メソッドの各呼び出しにおいて、サブシステムの各コントローラーを pActiveControllerIdArray パラメーターまたは pInactiveControllerIdArray パラメーターのいずれか一方にちょうど 1 回含める必要があります。pActiveControllerIdArray パラメーターと pInactiveControllerIdArray パラメーターの構成は、サブシステムの LUN ごとに異なっていてもかまいません。ほとんどのサブシステムはアクティブなコントローラーを 1 つだけ実装しますが、複数のアクティブなコントローラーを許可するものもあります。
IVdsLun::QueryHints (vdshwprv.h) メソッドは、現在 LUN に適用されているヒントを返します。
| pHints | VDS_HINTS* | out | 返される LUN ヒントへのポインターです。VDS_HINTS 構造体を参照してください。 |
戻り値
このメソッドは、E_INVALIDARG や E_OUTOFMEMORY などの標準的な HRESULT 値、および VDS 固有の戻り値を返すことがあります。また、HRESULT_FROM_WIN32 マクロを使用して変換された システムエラーコードを返すこともあります。エラーは VDS 自体、または使用中の基盤となる VDS プロバイダーから発生する可能性があります。戻り値には次のものがあります。
| リターンコード/値 | 説明 |
|---|---|
|
この戻り値は、アレイに関する情報をキャッシュするプロバイダー内部のソフトウェアまたは通信の問題を示します。IVdsHwProvider::Reenumerate メソッドを実行し、続けて IVdsHwProvider::Refresh メソッドを実行してキャッシュを復元してください。 |
|
LUN オブジェクトは既に存在しません。 |
|
LUN は失敗状態にあり、要求された操作を実行できません。 |
|
別の操作が進行中です。この操作は、先行する 1 つ以上の操作が完了するまで続行できません。 |
|
この操作またはパラメーターの組み合わせは、このプロバイダーではサポートされていません。 |
解説(Remarks)
呼び出し元は、LUN の作成時に IVdsSubSystem::CreateLun メソッドに pHints パラメーターを渡すことでヒントを指定するか、IVdsLun::ApplyHints メソッドを使用して既存の LUN に新しいヒントのセットを適用することができます。
IVdsLun::ApplyHints (vdshwprv.h) メソッドは、新しいヒントのセットを LUN に適用します。LUN に適用されるヒントは、すべてのプレックスに同時に適用されます。
| pHints | VDS_HINTS* | in | LUN に適用する新しいヒントへのポインターです。VDS_HINTS 構造体を参照してください。 |
戻り値
このメソッドは、E_INVALIDARG や E_OUTOFMEMORY などの標準的な HRESULT 値、および VDS 固有の戻り値を返すことがあります。また、HRESULT_FROM_WIN32 マクロを使用して変換された システムエラーコードを返すこともあります。エラーは VDS 自体、または使用中の基盤となる VDS プロバイダーから発生する可能性があります。戻り値には次のものがあります。
| リターンコード/値 | 説明 |
|---|---|
|
この戻り値は、アレイに関する情報をキャッシュするプロバイダー内部のソフトウェアまたは通信の問題を示します。IVdsHwProvider::Reenumerate メソッドを実行し、続けて IVdsHwProvider::Refresh メソッドを実行してキャッシュを復元してください。 |
|
LUN オブジェクトは既に存在しません。 |
|
LUN は失敗状態にあり、要求された操作を実行できません。 |
|
別の操作が進行中です。この操作は、先行する 1 つ以上の操作が完了するまで続行できません。 |
|
この操作またはパラメーターの組み合わせは、このプロバイダーではサポートされていません。 |
解説(Remarks)
このメソッドを使用する代わりに、呼び出し元は、LUN の作成時に IVdsSubSystem::CreateLun メソッドに pHints パラメーターを渡すことでヒントを指定できます。既存のヒントをクエリするには、IVdsLun::QueryHints メソッドを使用します。
IVdsLun::SetStatus (vdshwprv.h) メソッドは、LUN の状態を指定された値に設定します。
| status | VDS_LUN_STATUS | in | VDS_LUN_STATUS によって列挙される値です。呼び出し元は、可能な列挙値のサブセットを渡すことができます。VDS_LS_UNKNOWN を渡すと E_INVALIDARG が返されます。 |
戻り値
このメソッドは、E_INVALIDARG や E_OUTOFMEMORY などの標準的な HRESULT 値、および VDS 固有の戻り値を返すことがあります。また、HRESULT_FROM_WIN32 マクロを使用して変換された システムエラーコードを返すこともあります。エラーは VDS 自体、または使用中の基盤となる VDS プロバイダーから発生する可能性があります。戻り値には次のものがあります。
| リターンコード/値 | 説明 |
|---|---|
|
この戻り値は、アレイに関する情報をキャッシュするプロバイダー内部のソフトウェアまたは通信の問題を示します。IVdsHwProvider::Reenumerate メソッドを実行し、続けて IVdsHwProvider::Refresh メソッドを実行してキャッシュを復元してください。 |
|
LUN オブジェクトは既に存在しません。 |
|
LUN は失敗状態にあり、要求された操作を実行できません。 |
|
別の操作が進行中です。この操作は、先行する 1 つ以上の操作が完了するまで続行できません。 |
解説(Remarks)
実装者は、LUN を指定された状態にするために必要な操作 (たとえばキャッシュのフラッシュなど) を実行する必要があります。
IVdsLun::QueryMaxLunExtendSize (vdshwprv.h) メソッドは、LUN を拡張できる最大サイズを返します。
| pDriveIdArray | GUID* | in | LUN を拡大するために使用するドライブの GUID を格納した配列へのポインターです。lNumberOfDrives が 0 の場合、この引数は NULL にできます。この場合、プロバイダーは最大サイズを得るために可能な限りすべてのドライブを選択することが期待されます。 |
| lNumberOfDrives | INT | in | pDriveIdArray 内のドライブの数です。 |
| pullMaxBytesToBeAdded | ULONGLONG* | out | LUN を拡張できる最大バイト数を格納するバッファーへのポインターです。この引数は NULL 以外である必要があります。 |
戻り値
このメソッドは、E_INVALIDARG や E_OUTOFMEMORY などの標準的な HRESULT 値、および VDS 固有の戻り値を返すことがあります。また、HRESULT_FROM_WIN32 マクロを使用して変換された システムエラーコードを返すこともあります。エラーは VDS 自体、または使用中の基盤となる VDS プロバイダーから発生する可能性があります。戻り値には次のものがあります。
| リターンコード/値 | 説明 |
|---|---|
|
この戻り値は、アレイに関する情報をキャッシュするプロバイダー内部のソフトウェアまたは通信の問題を示します。IVdsHwProvider::Reenumerate メソッドを実行し、続けて IVdsHwProvider::Refresh メソッドを実行してキャッシュを復元してください。 |
|
LUN オブジェクトは既に存在しません。 |
|
LUN は失敗状態にあり、要求された操作を実行できません。 |
|
別の操作が進行中です。この操作は、先行する 1 つ以上の操作が完了するまで続行できません。 |
|
VDS_OBJECT_ID 定数を受け取るすべてのメソッドから返される可能性があります。この戻り値は、識別子が既存のオブジェクトを参照していないことを示します。 |
|
この操作またはパラメーターの組み合わせは、このプロバイダーではサポートされていません。 |
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IVdsLun "{3540A9C7-E60F-4111-A840-8BBA6C2C83D8}" #usecom global IVdsLun IID_IVdsLun "{}" #comfunc global IVdsLun_GetProperties 3 var #comfunc global IVdsLun_GetSubSystem 4 sptr #comfunc global IVdsLun_GetIdentificationData 5 var #comfunc global IVdsLun_QueryActiveControllers 6 sptr #comfunc global IVdsLun_Extend 7 int64,var,int,sptr #comfunc global IVdsLun_Shrink 8 int64,sptr #comfunc global IVdsLun_QueryPlexes 9 sptr #comfunc global IVdsLun_AddPlex 10 int,sptr #comfunc global IVdsLun_RemovePlex 11 int,sptr #comfunc global IVdsLun_Recover 12 sptr #comfunc global IVdsLun_SetMask 13 wstr #comfunc global IVdsLun_Delete 14 #comfunc global IVdsLun_AssociateControllers 15 var,int,var,int #comfunc global IVdsLun_QueryHints 16 var #comfunc global IVdsLun_ApplyHints 17 var #comfunc global IVdsLun_SetStatus 18 int #comfunc global IVdsLun_QueryMaxLunExtendSize 19 var,int,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IVdsLun "{3540A9C7-E60F-4111-A840-8BBA6C2C83D8}" #usecom global IVdsLun IID_IVdsLun "{}" #comfunc global IVdsLun_GetProperties 3 sptr #comfunc global IVdsLun_GetSubSystem 4 sptr #comfunc global IVdsLun_GetIdentificationData 5 sptr #comfunc global IVdsLun_QueryActiveControllers 6 sptr #comfunc global IVdsLun_Extend 7 int64,sptr,int,sptr #comfunc global IVdsLun_Shrink 8 int64,sptr #comfunc global IVdsLun_QueryPlexes 9 sptr #comfunc global IVdsLun_AddPlex 10 int,sptr #comfunc global IVdsLun_RemovePlex 11 int,sptr #comfunc global IVdsLun_Recover 12 sptr #comfunc global IVdsLun_SetMask 13 wstr #comfunc global IVdsLun_Delete 14 #comfunc global IVdsLun_AssociateControllers 15 sptr,int,sptr,int #comfunc global IVdsLun_QueryHints 16 sptr #comfunc global IVdsLun_ApplyHints 17 sptr #comfunc global IVdsLun_SetStatus 18 int #comfunc global IVdsLun_QueryMaxLunExtendSize 19 sptr,int,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。