
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.173] |
![]() |
|
Сообщ.
#1
,
|
|
|
Определить является ли диск съёмным USB Storage Device(флеш-диски, телефоны, подключенные как USB Storage, mp3-плееры и т.д.).
Код универсальный, может работать как с UNICODE, так и с обычной 8-ми битовой ANSI-строкой. 1 Способ Этот способ предпочтительней, так как второй может иногда внешний жесткий диск также определить как съёмное USB-устройство. IsFlashDrive ![]() ![]() //Входные данные: // drive_letter - буква тетируемого диска //Коды возврата: //0 - диск не является флешкой //1 - диск является флешкой //2,3 - ошибки __int8 IsFlashDrive(TCHAR drive_letter) { UINT drive_type; STORAGE_PROPERTY_QUERY spq; STORAGE_DEVICE_DESCRIPTOR sdd; DWORD BytesReturned; HANDLE hdrive=INVALID_HANDLE_VALUE; TCHAR drive_name1[20],drive_name2[20]; StringCchPrintf(drive_name1,20,_T("%c:\\"),drive_letter); StringCchPrintf(drive_name2,20,_T("\\\\.\\%c:"),drive_letter); drive_type=GetDriveType(drive_name1); hdrive = CreateFile(drive_name2,0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hdrive==INVALID_HANDLE_VALUE) return 2; memset(&spq,0,sizeof(spq)); memset(&sdd,0,sizeof(sdd)); spq.PropertyId=StorageDeviceProperty; spq.QueryType=PropertyStandardQuery; if (!DeviceIoControl(hdrive,IOCTL_STORAGE_QUERY_PROPERTY,&spq,sizeof(spq),&sdd,sizeof(sdd),&BytesReturned,NULL)) { CloseHandle(hdrive); return 3; } CloseHandle(hdrive); if ((drive_type==DRIVE_REMOVABLE)&&(sdd.BusType==BusTypeUsb)&&(sdd.RemovableMedia==true)) return 1; else return 0; } Использование: 1) Простое использование ![]() ![]() __int8 ret_code; TCHAR test_disk=_T('H'); ret_code=IsFlashDrive(test_disk); if (ret_code==1) _tprintf(_T("Диск %c: является флешкой\n"),test_disk); else if (ret_code==0) _tprintf(_T("Диск %c: НЕ является флешкой\n"),test_disk); 2) Использование с минимальным контролем ошибок ![]() ![]() __int8 ret_code; TCHAR test_disk=_T('H'); ret_code=IsFlashDrive(test_disk); if (ret_code==1) _tprintf(_T("Диск %c: является флешкой\n"),test_disk); else if (ret_code==0) _tprintf(_T("Диск %c: НЕ является флешкой\n"),test_disk); else _tprintf(_T("Ошибка IsFlashDrive\n"),test_disk); 3)Использование с полным контролем ошибок ![]() ![]() __int8 ret_code; TCHAR test_disk=_T('H'); ret_code=IsFlashDrive(test_disk); if (ret_code==1) _tprintf(_T("Диск %c: является флешкой\n"),test_disk); else if (ret_code==0) _tprintf(_T("Диск %c: НЕ является флешкой\n"),test_disk); else { if (ret_code==2) _tprintf(_T("Ошибка IsFlashDrive. Ошибка CreateFile: %u\n"),GetLastError()); else if (ret_code==3) _tprintf(_T("Ошибка IsFlashDrive. Ошибка DeviceIoControl: %u\n"),GetLastError()); } 2 Способ(спасибо ЫукпШ за наводку) IsFlashDrive2 ![]() ![]() //Входные данные: // drive_letter - буква тетируемого диска //Выходные данные: // sys_err_code - код системной ошибки в случае её возникновения //Коды возврата: //0 - диск не является флешкой //1 - диск является флешкой //2,3,4,5 - ошибки __int8 IsFlashDrive2(TCHAR drive_letter, LONG *sys_err_code) { __int8 ret_code=0; HKEY hk=NULL; HANDLE hdrive=INVALID_HANDLE_VALUE; LONG Ret; DWORD data_size,dtype; WCHAR *data=NULL; TCHAR dos_link[50]; DWORD ld; TCHAR drive_name2[20]; //проверяем существует ли диск в системе StringCchPrintf(drive_name2,20,_T("\\\\.\\%c:"),drive_letter); hdrive = CreateFile(drive_name2,0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hdrive==INVALID_HANDLE_VALUE) { *sys_err_code=GetLastError(); ret_code=5; goto free_resources; } CloseHandle(hdrive); Ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SYSTEM\\MountedDevices"),0,KEY_READ,&hk); if (Ret!=ERROR_SUCCESS) { ret_code=2; *sys_err_code=Ret; goto free_resources; } StringCchPrintf(dos_link,50,_T("\\DosDevices\\%c:"),drive_letter); Ret=RegQueryValueEx(hk,dos_link,NULL,&dtype,NULL,&data_size); if (Ret==ERROR_SUCCESS) { data=(WCHAR *)malloc(data_size+2); if (data==NULL) { ret_code=3; *sys_err_code=0; goto free_resources; } memset(data,0,data_size+2); Ret=RegQueryValueEx(hk,dos_link,NULL,&dtype,(LPBYTE)data,&data_size); if (Ret!=ERROR_SUCCESS) { ret_code=4; *sys_err_code=Ret; goto free_resources; } if(wcsstr(data,L"USBSTOR")!=NULL) ret_code=1; else ret_code=0; } else { ret_code=4; *sys_err_code=Ret; } free_resources: if (data!=NULL) free(data); if (hk!=NULL) RegCloseKey(hk); return ret_code; } Использование 1) Простое использование ![]() ![]() __int8 ret_code; TCHAR test_disk=_T('H'); LONG sec; ret_code=IsFlashDrive2(test_disk,&sec); if (ret_code==1) _tprintf(_T("Диск %c: является флешкой\n"),test_disk); else if (ret_code==0) _tprintf(_T("Диск %c: НЕ является флешкой\n"),test_disk); 2) Использование с минимальным контролем ошибок ![]() ![]() __int8 ret_code; TCHAR test_disk=_T('H'); LONG sec; ret_code=IsFlashDrive2(test_disk,&sec); if (ret_code==1) _tprintf(_T("Диск %c: является флешкой\n"),test_disk); else if (ret_code==0) _tprintf(_T("Диск %c: НЕ является флешкой\n"),test_disk); else _tprintf(_T("Ошибка IsFlashDrive2\n"),test_disk); 3) Использование с полным контролем ошибок ![]() ![]() __int8 ret_code; TCHAR test_disk=_T('H'); LONG sec; ret_code=IsFlashDrive2(test_disk,&sec); if (ret_code==1) _tprintf(_T("Диск %c: является флешкой\n"),test_disk); else if (ret_code==0) _tprintf(_T("Диск %c: НЕ является флешкой\n"),test_disk); else { if (ret_code==2) _tprintf(_T("Ошибка IsFlashDrive2. Ошибка RegOpenKeyEx: %u\n"),sec); else if (ret_code==3) _tprintf(_T("Ошибка IsFlashDrive2. Ошибка malloc.\n")); else if (ret_code==4) _tprintf(_T("Ошибка IsFlashDrive2. Ошибка RegQueryValueEx: %u\n"),sec); else if (ret_code==5) _tprintf(_T("Ошибка IsFlashDrive2. Ошибка CreateFile: %u\n"),sec); } Полный исходный код ![]() ![]() #ifndef UNICODE #define UNICODE #endif #ifndef _UNICODE #define _UNICODE #endif #include <tchar.h> #include <windows.h> #include <stdio.h> #include <conio.h> #include <locale.h> #include <WinIoCtl.h> #include <StrSafe.h> //-------------------------------------------------------------------------------------------------------------------------- //Входные данные: //IN drive_letter - буква тетируемого диска //Коды возврата: //0 - диск не является флешкой //1 - диск является флешкой //2,3 - ошибки __int8 IsFlashDrive(TCHAR drive_letter) { UINT drive_type; STORAGE_PROPERTY_QUERY spq; STORAGE_DEVICE_DESCRIPTOR sdd; DWORD BytesReturned; HANDLE hdrive=INVALID_HANDLE_VALUE; TCHAR drive_name1[20],drive_name2[20]; StringCchPrintf(drive_name1,20,_T("%c:\\"),drive_letter); StringCchPrintf(drive_name2,20,_T("\\\\.\\%c:"),drive_letter); drive_type=GetDriveType(drive_name1); hdrive = CreateFile(drive_name2,0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hdrive==INVALID_HANDLE_VALUE) return 2; memset(&spq,0,sizeof(spq)); memset(&sdd,0,sizeof(sdd)); spq.PropertyId=StorageDeviceProperty; spq.QueryType=PropertyStandardQuery; if (!DeviceIoControl(hdrive,IOCTL_STORAGE_QUERY_PROPERTY,&spq,sizeof(spq),&sdd,sizeof(sdd),&BytesReturned,NULL)) { CloseHandle(hdrive); return 3; } CloseHandle(hdrive); if ((drive_type==DRIVE_REMOVABLE)&&(sdd.BusType==BusTypeUsb)&&(sdd.RemovableMedia==true)) return 1; else return 0; } //-------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------- //Входные данные: //IN drive_letter - буква тетируемого диска //OUT sys_err_code - код системной ошибки в случае её возникновения //Коды возврата: //0 - диск не является флешкой //1 - диск является флешкой //2,3,4,5 - ошибки __int8 IsFlashDrive2(TCHAR drive_letter, LONG *sys_err_code) { __int8 ret_code=0; HKEY hk=NULL; HANDLE hdrive=INVALID_HANDLE_VALUE; LONG Ret; DWORD data_size,dtype; WCHAR *data=NULL; TCHAR dos_link[50]; TCHAR drive_name2[20]; //проверяем существует ли диск в системе StringCchPrintf(drive_name2,20,_T("\\\\.\\%c:"),drive_letter); hdrive = CreateFile(drive_name2,0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hdrive==INVALID_HANDLE_VALUE) { *sys_err_code=GetLastError(); ret_code=5; goto free_resources; } CloseHandle(hdrive); Ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SYSTEM\\MountedDevices"),0,KEY_READ,&hk); if (Ret!=ERROR_SUCCESS) { ret_code=2; *sys_err_code=Ret; goto free_resources; } StringCchPrintf(dos_link,50,_T("\\DosDevices\\%c:"),drive_letter); Ret=RegQueryValueEx(hk,dos_link,NULL,&dtype,NULL,&data_size); if (Ret==ERROR_SUCCESS) { data=(WCHAR *)malloc(data_size+2); if (data==NULL) { ret_code=3; *sys_err_code=0; goto free_resources; } memset(data,0,data_size+2); Ret=RegQueryValueEx(hk,dos_link,NULL,&dtype,(LPBYTE)data,&data_size); if (Ret!=ERROR_SUCCESS) { ret_code=4; *sys_err_code=Ret; goto free_resources; } if(wcsstr(data,L"USBSTOR")!=NULL) ret_code=1; else ret_code=0; } else { ret_code=4; *sys_err_code=Ret; } free_resources: if (data!=NULL) free(data); if (hk!=NULL) RegCloseKey(hk); return ret_code; } //-------------------------------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------------------------------- int _tmain(int argc, _TCHAR* argv[]) { __int8 ret_code; TCHAR test_disk=_T('H'); LONG sec; setlocale(LC_ALL,"Russian"); //IsFlashDrive //Простое использование ret_code=IsFlashDrive(test_disk); if (ret_code==1) _tprintf(_T("Диск %c: является флешкой\n"),test_disk); else if (ret_code==0) _tprintf(_T("Диск %c: НЕ является флешкой\n"),test_disk); //Использование с минимальным контролем ошибок ret_code=IsFlashDrive(test_disk); if (ret_code==1) _tprintf(_T("Диск %c: является флешкой\n"),test_disk); else if (ret_code==0) _tprintf(_T("Диск %c: НЕ является флешкой\n"),test_disk); else _tprintf(_T("Ошибка IsFlashDrive\n"),test_disk); //Использование с полным контролем ошибок ret_code=IsFlashDrive(test_disk); if (ret_code==1) _tprintf(_T("Диск %c: является флешкой\n"),test_disk); else if (ret_code==0) _tprintf(_T("Диск %c: НЕ является флешкой\n"),test_disk); else { if (ret_code==2) _tprintf(_T("Ошибка IsFlashDrive. Ошибка CreateFile: %u\n"),GetLastError()); else if (ret_code==3) _tprintf(_T("Ошибка IsFlashDrive. Ошибка DeviceIoControl: %u\n"),GetLastError()); } //IsFlashDrive2 //Простое использование ret_code=IsFlashDrive2(test_disk,&sec); if (ret_code==1) _tprintf(_T("Диск %c: является флешкой\n"),test_disk); else if (ret_code==0) _tprintf(_T("Диск %c: НЕ является флешкой\n"),test_disk); //Использование с минимальным контролем ошибок ret_code=IsFlashDrive2(test_disk,&sec); if (ret_code==1) _tprintf(_T("Диск %c: является флешкой\n"),test_disk); else if (ret_code==0) _tprintf(_T("Диск %c: НЕ является флешкой\n"),test_disk); else _tprintf(_T("Ошибка IsFlashDrive2\n"),test_disk); //Использование с полным контролем ошибок ret_code=IsFlashDrive2(test_disk,&sec); if (ret_code==1) _tprintf(_T("Диск %c: является флешкой\n"),test_disk); else if (ret_code==0) _tprintf(_T("Диск %c: НЕ является флешкой\n"),test_disk); else { if (ret_code==2) _tprintf(_T("Ошибка IsFlashDrive2. Ошибка RegOpenKeyEx: %u\n"),sec); else if (ret_code==3) _tprintf(_T("Ошибка IsFlashDrive2. Ошибка malloc.\n")); else if (ret_code==4) _tprintf(_T("Ошибка IsFlashDrive2. Ошибка RegQueryValueEx: %u\n"),sec); else if (ret_code==5) _tprintf(_T("Ошибка IsFlashDrive2. Ошибка CreateFile: %u\n"),sec); } _tprintf(_T("Нажмите любую клавишу...")); _getch(); return 0; } //-------------------------------------------------------------------------------------------------------------------------- |