Безопасно удалить USB-накопитель с помощью Win32 API?
Как удалить USB-накопитель с помощью Win32 API? Я много работаю над встроенными системами, и на одной из них мне нужно скопировать свои программы на USB-накопитель и вставить его в целевое оборудование.
Поскольку я в основном работаю с консолью, я не люблю использовать мышь и нажимать на маленькую иконку панели задач сто раз в день.
Я бы хотел написать небольшую программу, чтобы сделать именно это, чтобы я мог поместить ее в мои make-файлы, но я не нашел ни одного вызова API, который бы делал то же самое.
Есть идеи?
4 ответа
Вы можете использовать функцию CM_Request_Device_Eject(), а также некоторые другие возможности. Ознакомьтесь со следующими проектами и статьями:
DevEject: просто. http://www.withopf.com/tools/deveject/
Полезная статья CodeProject: http://www.codeproject.com/KB/system/RemoveDriveByLetter.aspx
См. Статью базы знаний Microsoft Q165721: http://support.microsoft.com/kb/165721 - содержит полный исходный код на C
Похоже, Sync позволяет указать -e для извлечения съемных дисков. Хотя это и не Win32 API, вы можете просто позвонить sync -e [drive_letter]
из вашего make-файла.
Вот техническая статья о съемных носителях. Ищу DismountNtmsMedia
,
Эта статья и пример должны помочь: http://support.microsoft.com/default.aspx?scid=kb;en-us;165721
Вот решение в Delphi, которое я модифицировал и включил в сервис для использования на очень крупном предприятии. Перейти к: текст ссылки
Найдите "scapi (Setup & Config Manager API)" и загрузите его. Будет демонстрационная программа USBView, которая поможет вам в этом. Если у вас есть Delphi, это также включает в себя компонент TUSBDeviceTree, который вы можете использовать для сбора информации об устройстве USB, когда.
С уважением
#include<SetupAPI.h>
#include <windows.h>
#include<initguid.h>
#include <newdev.h>
#include <Cfgmgr32.h>
#pragma comment(lib, "Cfgmgr32.lib")
#pragma comment(lib, "Setupapi.lib")
#pragma comment(lib, "Newdev.lib")
int RemoveDevice(const GUID *guid, const wchar_t *hwID) {
HDEVINFO m_hDevInfo;
SP_DEVICE_INTERFACE_DATA spdid;
SP_DEVINFO_DATA spdd;
DWORD dwSize;
BYTE Buf[1024];
PSP_DEVICE_INTERFACE_DETAIL_DATA pspdidd =
(PSP_DEVICE_INTERFACE_DETAIL_DATA)Buf;
printf("try to remove device::%ws\n", hwID);
m_hDevInfo = SetupDiGetClassDevs(guid, NULL, NULL, DIGCF_PRESENT| DIGCF_DEVICEINTERFACE);
if (m_hDevInfo == INVALID_HANDLE_VALUE)
{
printf("GetClassDevs Failed!\n");
return 0;
}
spdid.cbSize = sizeof(spdid);
for (int i = 0; SetupDiEnumDeviceInterfaces(m_hDevInfo, NULL, guid, i, &spdid); i++) {
dwSize = 0;
SetupDiGetDeviceInterfaceDetail(m_hDevInfo,
&spdid, NULL, 0, &dwSize, NULL);
if (dwSize != 0 && dwSize <= sizeof(Buf)) {
pspdidd->cbSize = sizeof(*pspdidd); // 5 Bytes!
ZeroMemory((PVOID)&spdd, sizeof(spdd));
spdd.cbSize = sizeof(spdd);
long res =
SetupDiGetDeviceInterfaceDetail(m_hDevInfo, &
spdid, pspdidd,
dwSize, &dwSize,
&spdd);
if (res) {
OLECHAR* guidString;
OLECHAR* guidString2;
StringFromCLSID(&spdd.ClassGuid, &guidString);
StringFromCLSID(&spdid.InterfaceClassGuid, &guidString2);
printf("%d, %ws, %ws, %ws\n", spdd.DevInst, pspdidd->DevicePath, guidString, guidString2);
CoTaskMemFree(guidString);
CoTaskMemFree(guidString2);
if (!memcmp(pspdidd->DevicePath, hwID, 2 * lstrlenW(hwID))) {
DEVINST DevInstParent = 0;
res = CM_Get_Parent(&DevInstParent, spdd.DevInst, 0);
for (long tries = 0; tries < 10; tries++) {
// sometimes we need some tries...
WCHAR VetoNameW[MAX_PATH];
PNP_VETO_TYPE VetoType = PNP_VetoTypeUnknown;
VetoNameW[0] = 0;
res = CM_Request_Device_EjectW(DevInstParent,
&VetoType, VetoNameW, MAX_PATH, 0);
if ((res == CR_SUCCESS &&
VetoType == PNP_VetoTypeUnknown)) {
printf("remove %ws success!\n", pspdidd->DevicePath);
SetupDiDestroyDeviceInfoList(m_hDevInfo);
return 1;
}
Sleep(500); // required to give the next tries a chance!
}
break;
}
}
}
}
printf("Remove Device Failed!\n");
SetupDiDestroyDeviceInfoList(m_hDevInfo);
return 0;
}
int main(){
GUID GUID_DEVINTERFACE_USB_HUB;
CLSIDFromString(L"F18A0E88-C30C-11D0-8815-00A0C906BED8", &GUID_DEVINTERFACE_USB_HUB);
RemoveDevice(&GUID_DEVINTERFACE_USB_HUB, L"\\\\?\\usb#root_hub30");
return 0;
}
ссылки: