программно отмонтировать USB
\\?\usb#vid_13fe&pid_4100#070c28670e74be11#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
и есть буква этой флешки которую ей назначила система (в моем случае это F). теперь мне нужно получить дескриптор этой флешки и удалить ее, пишу следующий код:
H1 =CreateFile("\\?\usb#vid_13fe&pid_4100#070c28670e74be11#{ a5dcbf10-6530-11d2-901f-00c04fb951ed}",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FI LE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
//H1 =CreateFile("\\.\F:",GENERIC_READ|GENERIC_WRITE,FILE_SHAR E_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
unsigned long ReturnedBytes;
if(DeviceIoControl(H1, FSCTL_DISMOUNT_VOLUME,NULL, 0, NULL, 0, &ReturnedBytes, NULL))
{ShowMessage("USB демонтирован"); }
else
{ShowMessage (SysErrorMessage(GetLastError()));}
так вот, когда я получаю дескриптор моей флешки, подставляя туда букву флешки (закоментированая строчка), то все проходит нормально и флешка демонтируется, а когда в место буквы подставляю строчку -
\\?\usb#vid_13fe&pid_4100#070c28670e74be11#{a5dcbf10-6530-11d2-901f-00c04fb951ed}, то получается ошибка "неправильная функция". обе строчки соответствуют одной и той же флешке. что тут не так?Непонимающий?
Обратные слеши не надо удваивать?
они удвоены, просто здесь не отображается
Код:
H1 = CreateFileA("\\\\?\\Volume{a5dcbf10-6530-11d2-901f-00c04fb951ed}",
GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
в таком случае говорит, что неверный дискриптор.
Делал так: с помощью GetVolumeNameForVolumeMountPointA() получал имя, передав букву флехи. Потом имя без завершающего слеша (так надо для CreateFile) подставлял. Проверьте, что вам выдает GetVolumeNameForVolumeMountPointA().
У меня с вашим кодом несмотря на сообщение об отмонтировании реально флеха не размонтируется (не гаснет в списке дисков).
Volume{a5dcbf10-6530-11d2-901f-00c04fb951ed}
-- не серийный номер флешки. На разных компах он будет разным.
Если мы говорим об одном и том же..
пришли плз фрагмент кода где получалось имя с помощью GetVolumeNameForVolumeMountPointA() .
под серийным номером я имею ввиду то что выделено жирным \?usb#vid_13fe&pid_4100#070c28670e74be11#{a5dcbf10-6530-11d2-901f-00c04fb951ed}.
Код:
char guid_name[51];
if(GetVolumeNameForVolumeMountPointA("I:\\", guid_name, 51))
cout << guid_name << endl;
else...
if(GetVolumeNameForVolumeMountPointA("I:\\", guid_name, 51))
cout << guid_name << endl;
else...
а вообще задача сводится к следующему: по имеющейся букве флешки определить ее серийник (выше описано что я имею ввиду под серийником), либо наоборот, из строки с серийником (см. выше ) получить букув вставленной флешки.
я могу получить отдельно и букву вставленной флешки и серийник, но сопоставить одно другому не получается, т.е. если вставить две флешки, например они определятся как f и g и я определю оба серийника, то какой серийник какой букве принадлежит я определить не могу.
так вот как это сделать..?