次の方法で共有


ResUtilFindDependentDiskResourceDriveLetter 関数 (resapi.h)

リソースの 物理ディスク依存関係 に関連付けられているドライブ文字を取得 しますPRESUTIL_FIND_DEPENDENT_DISK_RESOURCE_DRIVE_LETTER型は、この関数へのポインターを定義します。

構文

DWORD ResUtilFindDependentDiskResourceDriveLetter(
  [in]      HCLUSTER  hCluster,
  [in]      HRESOURCE hResource,
  [out]     LPWSTR    pszDriveLetter,
  [in, out] DWORD     *pcchDriveLetter
);

パラメーター

[in] hCluster

クラスター ハンドル。

[in] hResource

依存関係のクエリを実行するリソースを処理します。

[out] pszDriveLetter

ドライブ文字を格納するバッファー。

[in, out] pcchDriveLetter

入力時に、 pszDriveLetter バッファーのサイズを WCHARの数として指定します。 出力時に、結果のデータのサイズを、終端の NULL を含む WCHARの数として指定 します

戻り値

操作が成功した場合、関数は ERROR_SUCCESS (0) を返します。

操作が失敗した場合、関数は システム エラー コードを返します。 考えられるエラー コードを次に示します。

リターン コード 説明
ERROR_NO_MORE_ITEMS
指定したリソースの依存関係の一覧に物理ディスクの依存関係が見つかりませんでした。
ERROR_RESOURCE_NOT_PRESENT
ドライブ文字は返されません。
ERROR_MORE_DATA
渡されたバッファーが小さすぎます。 pcchDriveLetter パラメーターは、必要なサイズを指定します。

注釈

リソース DLL からこの関数を呼び出さないでください。 デッドロックが発生します。 リソース拡張機能でこの関数を呼び出し、リソース DLL が読み取ることができるプライベート プロパティとして結果を書き込む必要があります。

hResource によって識別されるリソースが複数の物理ディスク リソースに依存している場合、 ResUtilFindDependentDiskResourceDriveLetter は、リソースに列挙された最初の物理ディスク依存関係のドライブ文字を返します。

次の例では、コマンド ライン引数としてリソース名を受け取り、リソースの物理ディスクの依存関係に関連付けられているドライブ文字 (存在する場合) を表示します。 この例では、フェールオーバー クラスターのドキュメントで定義されている ClusDocEx.h ヘッダー ファイルを使用します。

//////////////////////////////////////////////////////////////////////

#include "ClusDocEx.h"

int main( int argc, char argv[] )
 {
  HCLUSTER  hCluster     = NULL;
  HRESOURCE hRes         = NULL;
  DWORD     dw;
  DWORD     cchResDrive  = ClusDocEx_DEFAULT_CCH;
  DWORD     cchResName   = ClusDocEx_DEFAULT_CCH;
  WCHAR     *pszResDrive = new WCHAR[cchResDrive];
  WCHAR     *pszResName  = new WCHAR[cchResName];

  dw = ClusDocEx_ConvertArg( argv[1], pszResName, cchResName );

  if( dw == ERROR_SUCCESS )
   {
    hCluster = ClusDocEx_OpenLocalClusterWithName();
    if( hCluster != NULL )
     {
      hRes = OpenClusterResource( hCluster, pszResName );
      if( hRes != NULL )
       {
        dw = ResUtilFindDependentDiskResourceDriveLetter( hCluster,
                                                          hRes,
                                                          pszResDrive,
                                                          &cchResDrive );

        if( dw == ERROR_MORE_DATA )
         {
          delete [] pszResDrive;
          pszResDrive = new WCHAR[cchResDrive];
          dw = ResUtilFindDependentDiskResourceDriveLetter( hCluster,
                                                            hRes,
                                                            pszResDrive,
                                                            &cchResDrive );
         }

        switch( dw )
         {
          case ERROR_SUCCESS:    
            wprintf( L"%ls depends on drive %ls.\n", pszResName, pszResDrive );
            break;

          case ERROR_NO_MORE_ITEMS:
          case ERROR_RESOURCE_NOT_PRESENT:
            wprintf( L"No Physical Disk dependency found for %ls.\n", pszResName );
            break;

          default:    
            ClusDocEx_DebugPrint( L"Could not obtain drive information", dw );
            break;
         }
        CloseClusterResource( hRes );
       }
      else // if hRes == NULL
       {
        ClusDocEx_DebugPrint( L"Could not open a resource handle", GetLastError() );
       }
      CloseCluster( hCluster );
     }
    else // if hCluster == NULL
     {
      ClusDocEx_DebugPrint( L"Could not open a cluster handle", GetLastError() );
     }

   }
  delete [] pszResName;
  delete [] pszResDrive;
  return 0;
 }

hResource によって識別されるリソースがマウント ポイント ディスクを参照している場合は、ディスク リソースに関連付けられているドライブ文字がある場合とそうでない場合があります。 マウント ポイント ディスクにドライブ文字が関連付けられていない場合、 ResUtilFindDependentDiskResourceDriveLetter によって返される値は DiskXPartitionY の形式になります。これは有効なデータですが、 CreateFile などのファイル システム API に直接渡すことはできません。

次の例では、 ResUtilFindDependentDiskResourceDriveLetter から出力文字列を受け取り、Win32 形式に変換します。 この関数の出力文字列を CreateFile に渡すことができます。 関数が失敗した場合、戻り値は NULL ですGetLastError を 呼び出して、拡張エラー情報を取得します。 関数が成功した場合、ユーザーは LocalFree を使用して返されたバッファーを解放する必要があります。

#define UNICODE 1
#define _UNICODE 1
#pragma comment(lib, "ResUtils.lib")

#include <windows.h>
#include <stdlib.h>
#include <ResApi.h>
#include <strsafe.h>

#define IS_DRIVELETTER(x) ((iswalpha((x)[0])) && ((x)[1] == L':'))
#define IS_NTPATH(x) ((wcsstr((x), L"Disk") != NULL) && (wcsstr((x), L"Partition") != NULL)) 
#define GLOBALROOT_DISK_FORMAT L"\\\\\?\\GLOBALROOT\\Device\\Harddisk%u\\Partition%u"

LPWSTR ConvertNtDiskPathToW32DiskPath( LPCWSTR InputString )
 {
  LPWSTR outputString=NULL;
  DWORD status=ERROR_INVALID_PARAMETER;
  DWORD len;
  DWORD diskNum, partNum;

  if ((InputString == NULL) || (InputString[0] == 0))
   {
    goto Error_exit;
   }

  // Find out the required buffer size.
  len = 0;
  if (IS_DRIVELETTER(InputString))
   {
    len = wcslen(InputString) + 4;
   }
  else if (IS_NTPATH(InputString))
   {
    len = wcslen(GLOBALROOT_DISK_FORMAT) + 16;
   }
  else
   {
    //Malformed string.
    goto Error_exit;
   } 

  if ((outputString = (LPWSTR)LocalAlloc(LPTR, len * sizeof(WCHAR))) == NULL)
   {
    status = GetLastError();
    goto Error_exit;
   }

  if (IS_DRIVELETTER(InputString))
   {
    StringCchCopyW(outputString, len, InputString);
   }
  else
   {
    //Has to be NT path format.
    swscanf_s(InputString, L"Disk%uPartition%u", &diskNum, &partNum);
    StringCchPrintfW(outputString, len, GLOBALROOT_DISK_FORMAT, diskNum, partNum);
   }
    
  status = ERROR_SUCCESS;
    
Error_exit: 

  if (status != ERROR_SUCCESS)
   {
    if (outputString)
     {
      LocalFree(outputString);
     }
    SetLastError(status);
    return NULL;
   }

  return outputString;
 }

要件

要件
サポートされている最小のクライアント サポートなし
サポートされている最小のサーバー Windows Server 2008 Enterprise、Windows Server 2008 Datacenter
対象プラットフォーム Windows
ヘッダー resapi.h
Library ResUtils.lib
[DLL] ResUtils.dll

こちらもご覧ください

ResUtilGetResourceDependency

ResUtilGetResourceDependencyByClass

ResUtilGetResourceDependencyByName

ResUtilGetResourceDependentIPAddressProps

ResUtilGetResourceNameDependency

リソース ユーティリティ関数