Определить, запущен ли exe с USB - PullRequest
7 голосов
/ 06 августа 2020

Я пишу приложение с использованием windows API, которое при запуске должно проверять, запущено ли оно с USB-устройства. Чего я достиг до сих пор

  • Список устройств с помощью SetupDiEnumDeviceInfo
  • Определение съемного устройства

Вот мой код для выполнения двух вышеуказанных задач

HDEVINFO hdevinfo = SetupDiGetClassDevs(&GUID_DEVCLASS_DISKDRIVE,NULL, NULL, DIGCF_PRESENT);
if (hdevinfo == INVALID_HANDLE_VALUE) {
    WriteLog(L"hdevinfo is INVALID_HANDLE_VALUE");
    return USB_PROT_ERROR;
}
DWORD MemberIndex = 0;
SP_DEVINFO_DATA sp_devinfo_data;
ZeroMemory(&sp_devinfo_data, sizeof(sp_devinfo_data));
sp_devinfo_data.cbSize = sizeof(sp_devinfo_data);
while (SetupDiEnumDeviceInfo(hdevinfo, MemberIndex, &sp_devinfo_data)) {
    DWORD PropertyRegDataType;
    DWORD RequiredSize;
    TCHAR PropertyBuffer[500];
    //get the name of this device
    if (SetupDiGetDeviceRegistryProperty(hdevinfo, &sp_devinfo_data, SPDRP_PHYSICAL_DEVICE_OBJECT_NAME, &PropertyRegDataType, (PBYTE)&PropertyBuffer, sizeof(PropertyBuffer), &RequiredSize)) {
        WriteLog(L"Device name: %s", PropertyBuffer);
        DWORD PropertyValue;
        //get removal policy for this device
        if (SetupDiGetDeviceRegistryProperty(hdevinfo, &sp_devinfo_data, SPDRP_REMOVAL_POLICY, &PropertyRegDataType, (PBYTE)&PropertyValue, sizeof(PropertyValue), &RequiredSize)) {
            if (PropertyValue == CM_REMOVAL_POLICY_EXPECT_NO_REMOVAL) {
                //not removable
                WriteLog(L"Not Removable");
            }
            else {
                //removable
                WriteLog("Removable");
            }
        }
    }
}

На моем P C с 1 жестким диском и 1 подключенным USB-накопителем я получаю следующий вывод:

Device name: \Device\00000031
Not Removable

Device name: \Device\00000070
Removable

Из вывода видно, что \ Device \ 00000070 - мое USB-устройство. И на моем компьютере я вижу, что мое USB-устройство смонтировано на H диске

Теперь я хочу достичь

  • Узнать, на каком диске буква (в моем случае это H: ), что съемное устройство (в моем случае это \ Device \ 00000070 ) установлено.

ИЛИ

  • Выясните все тома (я могу сказать, подустройства), которые находятся под этим устройством. Например, если я передаю GUID GUID_DEVCLASS_VOLUME в функцию SetupDiGetClassDevs, то мой вывод будет выглядеть следующим образом:

    Имя устройства: \ Device \ HarddiskVolume2 Not Removable

    Имя устройства: \ Device \ HarddiskVolume4 Not Removable

    Имя устройства: \ Device \ HarddiskVolume9 Not Removable

    Имя устройства: \ Device \ HarddiskVolume5 Not Removable

После некоторой отладки я обнаружил, что \ Device \ HarddiskVolume9 - это мой USB-накопитель, но вы можете видеть в выводе, что он всегда отображается «Не снимается» . Итак, если я смогу узнать, что \ Device \ HarddiskVolume9 принадлежит \ Device \ 00000070 , тогда это также сработает для меня, так как я могу легко использовать управление томом функции, чтобы найти букву диска для \ Device \ HarddiskVolume9 и сопоставить с буквой диска исполняемого файла.

Я хочу сделать это с помощью C / C ++ Windows API без использования сторонней библиотеки и кода NET.

1 Ответ

1 голос
/ 06 августа 2020

Windows Функция API GetDriveType возвращает следующее:

DRIVE_UNKNOWN - 0 - тип диска не может быть определен.

DRIVE_NO_ROOT_DIR - 1 - Путь root недействителен; например, по указанному пути не смонтирован том.

DRIVE_REMOVABLE - 2 - На диске есть съемный носитель; например, флоппи-дисковод, флэш-накопитель или картридер fla sh.

DRIVE_FIXED - 3 - Привод имеет фиксированный носитель; например, жесткий диск или флэш-диск sh.

DRIVE_REMOTE - 4 - Диск является удаленным (сетевым) диском.

DRIVE_CDROM - 5 - Привод - это привод CD-ROM.

DRIVE_RAMDISK - 6 - Привод представляет собой RAM-диск.

Поэтому я бы использовал следующее код, проверяющий, равно ли возвращаемое значение (2) - Съемный:

#include <windows.h>
int main()
{
    wchar_t basePath[1024]{ L"" }, volName[1024]{ L"" };
    GetModuleFileName(NULL, basePath, 1024);
    GetVolumePathName(basePath, volName, 1024);

    UINT type = GetDriveType(volName);
    if (type == 2)
    {
        MessageBox(NULL, L"You are running from a flash drive (USB)",L"",MB_OK);
    }
    else
    {
        MessageBox(NULL, L"You are NOT running from a flash drive (USB)",L"", MB_OK);

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