ResUtilFindDependentDiskResourceDriveLetter-Funktion (resapi.h)
Ruft den Laufwerkbuchstaben ab, der einer Physischen Datenträgerabhängigkeit einer Ressource zugeordnet ist. Der PRESUTIL_FIND_DEPENDENT_DISK_RESOURCE_DRIVE_LETTER Typ definiert einen Zeiger auf diese Funktion.
Syntax
DWORD ResUtilFindDependentDiskResourceDriveLetter(
[in] HCLUSTER hCluster,
[in] HRESOURCE hResource,
[out] LPWSTR pszDriveLetter,
[in, out] DWORD *pcchDriveLetter
);
Parameter
[in] hCluster
Clusterhandle.
[in] hResource
Behandeln Sie die Ressource, um Abhängigkeiten abzufragen.
[out] pszDriveLetter
Puffer, in dem der Laufwerkbuchstaben gespeichert werden soll.
[in, out] pcchDriveLetter
Gibt bei der Eingabe die Größe des puffers pszDriveLetter als Anzahl von WCHARs an. Gibt in der Ausgabe die Größe der resultierenden Daten als Anzahl von WCHARs an, die den beendenden NULL-Wert enthält.
Rückgabewert
Wenn die Vorgänge erfolgreich sind, gibt die Funktion ERROR_SUCCESS (0) zurück.
Wenn der Vorgang fehlschlägt, gibt die Funktion einen Systemfehlercode zurück. Im Folgenden sind mögliche Fehlercodes aufgeführt.
Rückgabecode | Beschreibung |
---|---|
|
In der Liste der Abhängigkeiten der angegebenen Ressource wurde keine Physische Datenträgerabhängigkeit gefunden. |
|
Es konnte kein Laufwerkbuchstabe zurückgegeben werden. |
|
Der übergebene Puffer war zu klein. Der parameter pcchDriveLetter gibt die erforderliche Größe an. |
Hinweise
Rufen Sie diese Funktion nicht über eine Ressourcen-DLL auf. Dies führt zu einem Deadlock. Ihre Ressourcenerweiterung sollte diese Funktion aufrufen und die Ergebnisse als private Eigenschaft ausschreiben, die Ihre Ressourcen-DLL dann lesen kann.
Wenn die von hResource identifizierte Ressource von mehr als einer physischen Datenträgerressource abhängt, gibt ResUtilFindDependentDiskResourceDriveLetter den Laufwerkbuchstaben der ersten Physische Datenträgerabhängigkeit zurück, die für die Ressource aufgezählt wird.
Beispiele
Im folgenden Beispiel wird ein Ressourcenname als Befehlszeilenargument verwendet und der Laufwerkbuchstabe angezeigt, der der Abhängigkeit physischer Datenträger der Ressource zugeordnet ist (falls vorhanden). In diesem Beispiel wird die Headerdatei ClusDocEx.h verwendet, die in der Failoverclusterdokumentation definiert ist.
//////////////////////////////////////////////////////////////////////
#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;
}
Wenn die von hResource identifizierte Ressource auf einen Bereitstellungspunktdatenträger verweist, kann es sein, dass der Datenträgerressource ein Laufwerkbuchstabe zugeordnet ist. Wenn der Bereitstellungspunktdatenträger keinen zugeordneten Laufwerkbuchstaben aufweist, hat der von ResUtilFindDependentDiskResourceDriveLetter zurückgegebene Wert das Format DiskXPartitionY, was gültige Daten sind, aber nicht direkt an Dateisystem-APIs wie CreateFile übergeben werden kann.
Im folgenden Beispiel wird die Ausgabezeichenfolge aus ResUtilFindDependentDiskResourceDriveLetter in das Win32-Format transformiert. Die Ausgabezeichenfolge dieser Funktion kann an CreateFile übergeben werden. Wenn die Funktion fehlschlägt, ist der Rückgabewert NULL. rufen Sie GetLastError auf, um erweiterte Fehlerinformationen abzurufen. Wenn die Funktion erfolgreich ist, muss der Benutzer den mit LocalFree zurückgegebenen Puffer freigeben.
#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;
}
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Nicht unterstützt |
Unterstützte Mindestversion (Server) | Windows Server 2008 Enterprise, Windows Server 2008 Datacenter |
Zielplattform | Windows |
Kopfzeile | resapi.h |
Bibliothek | ResUtils.lib |
DLL | ResUtils.dll |
Weitere Informationen
ResUtilGetResourceDependencyByClass
ResUtilGetResourceDependencyByName
ResUtilGetResourceDependentIPAddressProps