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) 。
如果操作失败,函数将返回 系统错误代码。 下面是可能的错误代码。
返回代码 | 说明 |
---|---|
|
在指定资源的依赖项列表中找不到物理磁盘依赖项。 |
|
无法返回驱动器号。 |
|
传入的缓冲区太小。 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 |
另请参阅
ResUtilGetResourceDependencyByClass
ResUtilGetResourceDependencyByName
ResUtilGetResourceDependentIPAddressProps