Найти все логические диски из unitmask - PullRequest
1 голос
/ 05 августа 2020

Я написал программу для обнаружения USB-накопителя всякий раз, когда он вставлен. Хочу узнать все разделы на usb. Если на моем диске один раздел (пример E:/), то программа обнаруживает успешно. Но если USB-накопитель имеет два раздела (например: E:, F:), то обнаруживается только первый раздел E:, но я не знаю, как определить F: или другие разделы USB. При вставке USB-накопителя срабатывает DBT_DEVICEARRIVAL.

case DBT_DEVICEARRIVAL:
            
            if (b->dbcc_devicetype == DBT_DEVTYP_VOLUME)
            {
                
                PDEV_BROADCAST_HDR lpdbh = (PDEV_BROADCAST_HDR)lParam;
                PDEV_BROADCAST_VOLUME vol = (PDEV_BROADCAST_VOLUME)lParam;
                char drive = FirstDriveFromMask(vol->dbcv_unitmask);                
            }

Функция FirstDriveFromMask () может определить первый обнаруженный раздел по маске. Как определить другие разделы на USB-накопителе.

char FirstDriveFromMask(ULONG unitmask)// (usb has drive e:, f: )unitmask I receive is 48. Output is E
{
    for (char i = 0; i < 26; ++i, unitmask >>= 1)
        if (unitmask & 0x1)
            return i + 'A';
    return 0;
}

1 Ответ

0 голосов
/ 05 августа 2020

Следующая функция может оказаться полезной:

std::string DrivesFromMask(ULONG unitmask)
{
    char i;
    std::string drv = "";
    for (i = 0; i < 26 && unitmask; ++i)
    {
        if (unitmask & 0x1)
        {
            drv += i + 'A';
        }
        unitmask = unitmask >> 1;
    }
    return drv;
}

И затем прочитать каждую букву диска в std::string.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...