В этом случае вы можете использовать функцию GetDriveType
:
UINT WINAPI GetDriveType(
_In_opt_ LPCTSTR lpRootPathName
);
Определяет диск является ли съемный, фиксированный, CD-ROM, RAM диск или сетевой диск.
Этого достаточно, если тип привода не имеет для вас никакого значения. Если вы заинтересованы в листинг только флэш-накопители USB, рассмотреть возможность проверить функцию SetupDiGetDeviceRegistryProperty
:
BOOL SetupDiGetDeviceRegistryProperty(
_In_ HDEVINFO DeviceInfoSet,
_In_ PSP_DEVINFO_DATA DeviceInfoData,
_In_ DWORD Property,
_Out_opt_ PDWORD PropertyRegDataType,
_Out_opt_ PBYTE PropertyBuffer,
_In_ DWORD PropertyBufferSize,
_Out_opt_ PDWORD RequiredSize
);
Функция SetupDiGetDeviceRegistryProperty извлекает определенную подключи и играй свойства устройства.
Вот пример:
#include "stdafx.h"
#include <setupapi.h>
#include <devguid.h>
#include <cfgmgr32.h>
...
HDEVINFO hdevinfo = SetupDiGetClassDevs(&GUID_DEVCLASS_USB,
NULL, NULL, DIGCF_PRESENT);
if (hdevinfo == INVALID_HANDLE_VALUE)
return -1;
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;
DWORD PropertyBuffer;
if (SetupDiGetDeviceRegistryProperty(hdevinfo,
&sp_devinfo_data,
SPDRP_CAPABILITIES,
&PropertyRegDataType,
(PBYTE) &PropertyBuffer,
sizeof(PropertyBuffer),
&RequiredSize))
{
if (PropertyBuffer & CM_DEVCAP_REMOVABLE)
{
// Do something, copy your files etc
}
}
MemberIndex++;
}
SetupDiDestroyDeviceInfoList(hdevinfo);
Предполагая, что есть больше чем один флэш-диск, как вы знаете, какой из них «твой»? –
Не важно, я должен скопировать файл на все флешки. – Enes
Создание вируса? :) – Eugene