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的计数。 在输出时,将生成的数据的大小指定为包含终止 NULLWCHAR计数。

返回值

如果操作成功,函数将返回 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 的格式,这是有效的数据,但不能直接传递到文件系统 API(如 CreateFile)。

以下示例采用 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 企业版、Windows Server 2008 Datacenter
目标平台 Windows
标头 resapi.h
Library ResUtils.lib
DLL ResUtils.dll

另请参阅

ResUtilGetResourceDependency

ResUtilGetResourceDependencyByClass

ResUtilGetResourceDependencyByName

ResUtilGetResourceDependentIPAddressProps

ResUtilGetResourceNameDependency

资源实用工具函数