Как найти размер сектора диска диска, который находится на UNC-пути

#winapi

#winapi

Вопрос:

У меня есть следующий код, чтобы получить размер сектора диска локального или подключенного диска:

 #include <Windows.h>
#include <stdexcept>
#include <sstream>
#include <string>
#include "xhandle.h"
#include "DiskSectorSize.h"

DiskSectorSize getDiskSectorSize( char const *filename )
{
    using namespace std;
    DWORD dwFfnLength;
    if( (dwFfnLength = GetFullPathNameA( filename, 0, nullptr, nullptr )) == 0 )
        throw system_error( error_code( (int)GetLastError(), system_category() ),
                           (stringstream() << "can't get full path for path "" << filename << """).str().c_str() );
    string fullFileName( (size_t)dwFfnLength, 0 );
    if( GetFullPathNameA( filename, dwFfnLength, amp;fullFileName[0], nullptr ) == 0 )
        throw system_error( error_code( (int)GetLastError(), system_category() ),
                           (stringstream() << "can't get full path for path" << filename).str().c_str() );
    if( dwFfnLength < 2 || toupper( fullFileName[0] ) < 'A' || toupper( fullFileName[0] ) > 'Z' || fullFileName[1] != ':' )
        throw exception( "no drive letter in absolute path" );
    string logicalDrive = "\\.\  ";
    logicalDrive.replace( logicalDrive.begin()   4, logicalDrive.begin()   6, fullFileName.begin(), fullFileName.begin()   2 );
    XHANDLE xhDevice( CreateFileA( logicalDrive.c_str(), 0, 0, NULL, OPEN_EXISTING, 0, NULL ), true,
                      "can't create device handle for disk" );
    DWORD                  dwOutSize;
    STORAGE_PROPERTY_QUERY spq;
    memset( amp;spq, 0, sizeof spq);
    spq.PropertyId = StorageAccessAlignmentProperty;
    spq.QueryType  = PropertyStandardQuery;
    STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR saad;
    memset( amp;saad, 0, sizeof saad );
    if( !DeviceIoControl( xhDevice, IOCTL_STORAGE_QUERY_PROPERTY, amp;spq, sizeof spq, amp;saad, sizeof saad, amp;dwOutSize, NULL ) ||
        dwOutSize != sizeof saad )
        throw system_error( error_code( (int)GetLastError(), system_category() ),
                           (stringstream() << "can't detemine disk sector size for device" << fullFileName).str().c_str() );
    DiskSectorSize dss;
    dss.dwPhysical = saad.BytesPerPhysicalSector;
    dss.dwLogical  = saad.BytesPerLogicalSector;
    return dss;
}
 

Но я не могу получить размер сектора диска UNC-файла с помощью at. Когда я писал приведенный выше код, я также нашел способ сделать это. Но сегодня я не могу вспомнить это точно.

Комментарии:

1. Вы можете попытаться получить Win32_MappedLogicalDisk для подключенного диска и получить все доступные элементы, содержащиеся в классе.

2. Итак, реальный вопрос заключается в том, как найти том с учетом UNC-пути?

3. Я хочу получить размер сектора диска без подключенного логического диска, просто используя UNC-path @DrakeWu-MSFT / IInspectable.

4. Я полагаю, вы могли бы попробовать GetVolumePathNameW , за которым следует GetVolumeNameForVolumeMountPointW , чтобы получить путь GUID тома.