Как получить список всех разделов в Windows?

140
06 апреля 2021, 01:10

Хочу получить информацию о дисках и разделах в windows. Использовала функцию GetLogicalDrives(), но оттуда я могу взять только именованные разделы. Как получить список всех физических дисков и их разделов, включая неименованные?

Например, на моей локальной машине 1 диск и 4 раздела: раздел 0, С:, D:, раздел 4. С помощью функции GetLogicalDrives() я получаю только C: и D:

Answer 1
#include <windows.h>
#include <stdio.h>
void DisplayVolumePaths(
        __in PWCHAR VolumeName
        )
{
    DWORD  CharCount = MAX_PATH + 1;
    PWCHAR Names     = NULL;
    PWCHAR NameIdx   = NULL;
    BOOL   Success   = FALSE;
    for (;;) 
    {
        Names = (PWCHAR) new BYTE [CharCount * sizeof(WCHAR)];
        if ( !Names ) 
        {
            return;
        }
        Success = GetVolumePathNamesForVolumeNameW(
            VolumeName, Names, CharCount, &CharCount
            );
        if ( Success ) 
        {
            break;
        }
        if ( GetLastError() != ERROR_MORE_DATA ) 
        {
            break;
        }
        delete [] Names;
        Names = NULL;
    }
    if ( Success )
    {
        for ( NameIdx = Names; 
              NameIdx[0] != L'\0'; 
              NameIdx += wcslen(NameIdx) + 1 ) 
        {
            wprintf(L"  %s", NameIdx);
        }
        wprintf(L"\n");
    }
    if ( Names != NULL ) 
    {
        delete [] Names;
        Names = NULL;
    }
    return;
}
void __cdecl wmain(void)
{
    DWORD  CharCount            = 0;
    WCHAR  DeviceName[MAX_PATH] = L"";
    DWORD  Error                = ERROR_SUCCESS;
    HANDLE FindHandle           = INVALID_HANDLE_VALUE;
    BOOL   Found                = FALSE;
    size_t Index                = 0;
    BOOL   Success              = FALSE;
    WCHAR  VolumeName[MAX_PATH] = L"";
    FindHandle = FindFirstVolumeW(VolumeName, ARRAYSIZE(VolumeName));
    if (FindHandle == INVALID_HANDLE_VALUE)
    {
        Error = GetLastError();
        wprintf(L"FindFirstVolumeW failed with error code %d\n", Error);
        return;
    }
    for (;;)
    {
        Index = wcslen(VolumeName) - 1;
        if (VolumeName[0]     != L'\\' ||
            VolumeName[1]     != L'\\' ||
            VolumeName[2]     != L'?'  ||
            VolumeName[3]     != L'\\' ||
            VolumeName[Index] != L'\\') 
        {
            Error = ERROR_BAD_PATHNAME;
            wprintf(L"FindFirstVolumeW/FindNextVolumeW returned a bad path: %s\n", VolumeName);
            break;
        }
        VolumeName[Index] = L'\0';
        CharCount = QueryDosDeviceW(&VolumeName[4], DeviceName, ARRAYSIZE(DeviceName)); 
        VolumeName[Index] = L'\\';
        if ( CharCount == 0 ) 
        {
            Error = GetLastError();
            wprintf(L"QueryDosDeviceW failed with error code %d\n", Error);
            break;
        }
        wprintf(L"\nFound a device:\n %s", DeviceName);
        wprintf(L"\nVolume name: %s", VolumeName);
        wprintf(L"\nPaths:");
        DisplayVolumePaths(VolumeName);
        Success = FindNextVolumeW(FindHandle, VolumeName, ARRAYSIZE(VolumeName));
        if ( !Success ) 
        {
            Error = GetLastError();
            if (Error != ERROR_NO_MORE_FILES) 
            {
                wprintf(L"FindNextVolumeW failed with error code %d\n", Error);
                break;
            }
            Error = ERROR_SUCCESS;
            break;
        }
    }
    FindVolumeClose(FindHandle);
    FindHandle = INVALID_HANDLE_VALUE;
    return;
}
READ ALSO
Как разместить текст по центру на SVG Path

Как разместить текст по центру на SVG Path

Когда я использую SVG, чтобы нарисовать цикл и поместить текст, то как центрировать текст на SVG Path?

98
Как сделать поиски статей на сайте?

Как сделать поиски статей на сайте?

Есть вариант с помощью order_by или filterНужно сортировать данные из базы данных точнее статьи

126
Помощь с CSS выравниванием

Помощь с CSS выравниванием

Встала проблема с выравниванием блоков как на картинкеПомогите пожалуйста с решением, какими способами это можно сделать? Сайт верстаю на Bootstrap4

138
Как сделать чтобы функция не срабатывала во второй раз, если я делаю то же самое

Как сделать чтобы функция не срабатывала во второй раз, если я делаю то же самое

Как сделать чтобы при нажатии на одну и ту же form дважды или больше, функция не работала? Но при нажатии на другие form (Не та что ранее) функция...

116