Freigeben über


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
ERROR_NO_MORE_ITEMS
In der Liste der Abhängigkeiten der angegebenen Ressource wurde keine Physische Datenträgerabhängigkeit gefunden.
ERROR_RESOURCE_NOT_PRESENT
Es konnte kein Laufwerkbuchstabe zurückgegeben werden.
ERROR_MORE_DATA
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

ResUtilGetResourceDependency

ResUtilGetResourceDependencyByClass

ResUtilGetResourceDependencyByName

ResUtilGetResourceDependentIPAddressProps

ResUtilGetResourceNameDependency

Ressourcenhilfsprogrammfunktionen