<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=351430&amp;view=findpost&amp;p=3080603</guid>
        <pubDate>Sun, 19 Feb 2012 10:50:04 +0000</pubDate>
        <title>Определить является ли диск съёмным USB Storage Device</title>
        <link>https://forum.sources.ru/index.php?showtopic=351430&amp;view=findpost&amp;p=3080603</link>
        <description><![CDATA[neokoder: <strong class='tag-b'>Определить является ли диск съёмным USB Storage Device(флеш-диски, телефоны, подключенные как USB Storage, mp3-плееры и т.д.).</strong><br>
Код универсальный, может работать как с UNICODE, так и с обычной 8-ми битовой ANSI-строкой.<br>
<br>
<span class='tag-size' data-value='14' style='font-size:14pt;'>1 Способ</span><br>
Этот способ предпочтительней, так как второй может <span class='tag-u'>иногда</span> внешний жесткий диск также определить как съёмное USB-устройство.<br>
<br>
<strong class='tag-b'>IsFlashDrive</strong><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">//Входные данные: </div><div class="code_line">// drive_letter - буква тетируемого диска</div><div class="code_line">//Коды возврата:</div><div class="code_line">//0 - диск не является флешкой</div><div class="code_line">//1 - диск является флешкой</div><div class="code_line">//2,3 - ошибки</div><div class="code_line">__int8 IsFlashDrive(TCHAR drive_letter)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; UINT drive_type;</div><div class="code_line">&nbsp;&nbsp; STORAGE_PROPERTY_QUERY spq;</div><div class="code_line">&nbsp;&nbsp; STORAGE_DEVICE_DESCRIPTOR sdd;</div><div class="code_line">&nbsp;&nbsp; DWORD BytesReturned;</div><div class="code_line">&nbsp;&nbsp; HANDLE hdrive=INVALID_HANDLE_VALUE;</div><div class="code_line">&nbsp;&nbsp; TCHAR drive_name1[20],drive_name2[20];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; StringCchPrintf(drive_name1,20,_T(&quot;%c:\&quot;),drive_letter);</div><div class="code_line">&nbsp;&nbsp; StringCchPrintf(drive_name2,20,_T(&quot;\\.\%c:&quot;),drive_letter);</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp; drive_type=GetDriveType(drive_name1);</div><div class="code_line">&nbsp;&nbsp; </div><div class="code_line">&nbsp;&nbsp; hdrive = CreateFile(drive_name2,0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);</div><div class="code_line">&nbsp;&nbsp; if (hdrive==INVALID_HANDLE_VALUE)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return 2;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; memset(&amp;spq,0,sizeof(spq));</div><div class="code_line">&nbsp;&nbsp; memset(&amp;sdd,0,sizeof(sdd));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; spq.PropertyId=StorageDeviceProperty;</div><div class="code_line">&nbsp;&nbsp; spq.QueryType=PropertyStandardQuery;</div><div class="code_line">&nbsp;&nbsp; if (!DeviceIoControl(hdrive,IOCTL_STORAGE_QUERY_PROPERTY,&amp;spq,sizeof(spq),&amp;sdd,sizeof(sdd),&amp;BytesReturned,NULL))</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; CloseHandle(hdrive);</div><div class="code_line">&nbsp;&nbsp; &nbsp; return 3;</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; CloseHandle(hdrive);</div><div class="code_line">&nbsp;&nbsp; if ((drive_type==DRIVE_REMOVABLE)&amp;&amp;(sdd.BusType==BusTypeUsb)&amp;&amp;(sdd.RemovableMedia==true))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return 1;</div><div class="code_line">&nbsp;&nbsp; else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
<strong class='tag-b'>Использование:</strong><br>
1) Простое использование<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; __int8 ret_code;</div><div class="code_line">&nbsp;&nbsp; TCHAR test_disk=_T(&#39;H&#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;ret_code=IsFlashDrive(test_disk);</div><div class="code_line">&nbsp;&nbsp; if (ret_code==1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;&nbsp; else if (ret_code==0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: НЕ является флешкой\n&quot;),test_disk);</div></ol></div></div></div></div><br>
<br>
2) Использование с минимальным контролем ошибок<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; __int8 ret_code;</div><div class="code_line">&nbsp;&nbsp; TCHAR test_disk=_T(&#39;H&#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; ret_code=IsFlashDrive(test_disk);</div><div class="code_line">&nbsp;&nbsp; if (ret_code==1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;&nbsp; else if (ret_code==0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: НЕ является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;&nbsp; else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Ошибка IsFlashDrive\n&quot;),test_disk);</div></ol></div></div></div></div><br>
<br>
3)Использование с полным контролем ошибок<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; __int8 ret_code;</div><div class="code_line">&nbsp;&nbsp; TCHAR test_disk=_T(&#39;H&#39;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; ret_code=IsFlashDrive(test_disk);</div><div class="code_line">&nbsp;&nbsp; if (ret_code==1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;&nbsp; else if (ret_code==0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: НЕ является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;&nbsp; else</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (ret_code==2)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Ошибка IsFlashDrive. Ошибка CreateFile: %u\n&quot;),GetLastError());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else if (ret_code==3)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Ошибка IsFlashDrive. Ошибка DeviceIoControl: %u\n&quot;),GetLastError());</div><div class="code_line">&nbsp;&nbsp; }</div></ol></div></div></div></div><br>
<br>
<br>
<br>
<span class='tag-size' data-value='14' style='font-size:14pt;'>2 Способ</span>(спасибо <strong class='tag-b'>ЫукпШ</strong> за наводку)<br>
<strong class='tag-b'>IsFlashDrive2</strong><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">//Входные данные: </div><div class="code_line">// drive_letter - буква тетируемого диска</div><div class="code_line">//Выходные данные: </div><div class="code_line">// sys_err_code - код системной ошибки в случае её возникновения</div><div class="code_line">//Коды возврата:</div><div class="code_line">//0 - диск не является флешкой</div><div class="code_line">//1 - диск является флешкой</div><div class="code_line">//2,3,4,5 - ошибки</div><div class="code_line">__int8 IsFlashDrive2(TCHAR drive_letter, LONG *sys_err_code)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; __int8 ret_code=0;</div><div class="code_line">&nbsp;&nbsp; HKEY hk=NULL;</div><div class="code_line">&nbsp;&nbsp; HANDLE hdrive=INVALID_HANDLE_VALUE;</div><div class="code_line">&nbsp;&nbsp; LONG Ret;</div><div class="code_line">&nbsp;&nbsp; DWORD data_size,dtype;</div><div class="code_line">&nbsp;&nbsp; WCHAR *data=NULL;</div><div class="code_line">&nbsp;&nbsp; TCHAR dos_link[50];</div><div class="code_line">&nbsp;&nbsp; DWORD ld;</div><div class="code_line">&nbsp;&nbsp; TCHAR drive_name2[20];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; //проверяем существует ли диск в системе</div><div class="code_line">&nbsp;&nbsp; StringCchPrintf(drive_name2,20,_T(&quot;\\.\%c:&quot;),drive_letter);</div><div class="code_line">&nbsp;&nbsp; hdrive = CreateFile(drive_name2,0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);</div><div class="code_line">&nbsp;&nbsp; if (hdrive==INVALID_HANDLE_VALUE)</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;*sys_err_code=GetLastError();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ret_code=5;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;goto free_resources;</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">&nbsp;&nbsp; CloseHandle(hdrive);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; Ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T(&quot;SYSTEM\MountedDevices&quot;),0,KEY_READ,&amp;hk);</div><div class="code_line">&nbsp;&nbsp; if (Ret!=ERROR_SUCCESS)</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ret_code=2;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;*sys_err_code=Ret;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;goto free_resources;</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; StringCchPrintf(dos_link,50,_T(&quot;\DosDevices\%c:&quot;),drive_letter);</div><div class="code_line">&nbsp;&nbsp; Ret=RegQueryValueEx(hk,dos_link,NULL,&amp;dtype,NULL,&amp;data_size);</div><div class="code_line">&nbsp;&nbsp; if (Ret==ERROR_SUCCESS)</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;data=(WCHAR *)malloc(data_size+2);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (data==NULL)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; ret_code=3;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; *sys_err_code=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; goto free_resources;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;memset(data,0,data_size+2);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Ret=RegQueryValueEx(hk,dos_link,NULL,&amp;dtype,(LPBYTE)data,&amp;data_size);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (Ret!=ERROR_SUCCESS)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; ret_code=4;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; *sys_err_code=Ret;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; goto free_resources;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if(wcsstr(data,L&quot;USBSTOR&quot;)!=NULL)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; ret_code=1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; ret_code=0;</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">&nbsp;&nbsp; else</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ret_code=4;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;*sys_err_code=Ret;</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">&nbsp;</div><div class="code_line">free_resources:</div><div class="code_line">&nbsp;&nbsp; if (data!=NULL) free(data);</div><div class="code_line">&nbsp;&nbsp; if (hk!=NULL) RegCloseKey(hk);</div><div class="code_line">&nbsp;&nbsp; </div><div class="code_line">&nbsp;&nbsp; return ret_code;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
<strong class='tag-b'>Использование</strong><br>
<br>
1) Простое использование<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; __int8 ret_code;</div><div class="code_line">&nbsp;&nbsp; TCHAR test_disk=_T(&#39;H&#39;);</div><div class="code_line">&nbsp;&nbsp; LONG sec;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; ret_code=IsFlashDrive2(test_disk,&amp;sec);</div><div class="code_line">&nbsp;&nbsp; if (ret_code==1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;&nbsp; else if (ret_code==0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: НЕ является флешкой\n&quot;),test_disk);</div></ol></div></div></div></div>   <br>
<br>
<br>
2) Использование с минимальным контролем ошибок<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; __int8 ret_code;</div><div class="code_line">&nbsp;&nbsp; TCHAR test_disk=_T(&#39;H&#39;);</div><div class="code_line">&nbsp;&nbsp; LONG sec;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; ret_code=IsFlashDrive2(test_disk,&amp;sec);</div><div class="code_line">&nbsp;&nbsp; if (ret_code==1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;&nbsp; else if (ret_code==0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: НЕ является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;&nbsp; else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Ошибка IsFlashDrive2\n&quot;),test_disk);</div></ol></div></div></div></div><br>
<br>
<br>
3) Использование с полным контролем ошибок<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; __int8 ret_code;</div><div class="code_line">&nbsp;&nbsp; TCHAR test_disk=_T(&#39;H&#39;);</div><div class="code_line">&nbsp;&nbsp; LONG sec;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; ret_code=IsFlashDrive2(test_disk,&amp;sec);</div><div class="code_line">&nbsp;&nbsp; if (ret_code==1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;&nbsp; else if (ret_code==0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: НЕ является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;&nbsp; else</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (ret_code==2)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Ошибка IsFlashDrive2. Ошибка RegOpenKeyEx: %u\n&quot;),sec);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else if (ret_code==3)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Ошибка IsFlashDrive2. Ошибка malloc.\n&quot;));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else if (ret_code==4)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Ошибка IsFlashDrive2. Ошибка RegQueryValueEx: %u\n&quot;),sec);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else if (ret_code==5)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Ошибка IsFlashDrive2. Ошибка CreateFile: %u\n&quot;),sec);</div><div class="code_line">&nbsp;&nbsp; }</div></ol></div></div></div></div><br>
<br>
<br>
<strong class='tag-b'>Полный исходный код</strong><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#ifndef UNICODE</div><div class="code_line">#define UNICODE</div><div class="code_line">#endif</div><div class="code_line">#ifndef _UNICODE</div><div class="code_line">#define _UNICODE</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">#include &#60;tchar.h&#62;</div><div class="code_line">#include &#60;windows.h&#62;</div><div class="code_line">#include &#60;stdio.h&#62;</div><div class="code_line">#include &#60;conio.h&#62;</div><div class="code_line">#include &#60;locale.h&#62;</div><div class="code_line">#include &#60;WinIoCtl.h&#62;</div><div class="code_line">#include &#60;StrSafe.h&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">//--------------------------------------------------------------------------------------------------------------------------</div><div class="code_line">//Входные данные: </div><div class="code_line">//IN drive_letter - буква тетируемого диска</div><div class="code_line">//Коды возврата:</div><div class="code_line">//0 - диск не является флешкой</div><div class="code_line">//1 - диск является флешкой</div><div class="code_line">//2,3 - ошибки</div><div class="code_line">__int8 IsFlashDrive(TCHAR drive_letter)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; UINT drive_type;</div><div class="code_line">&nbsp;&nbsp; STORAGE_PROPERTY_QUERY spq;</div><div class="code_line">&nbsp;&nbsp; STORAGE_DEVICE_DESCRIPTOR sdd;</div><div class="code_line">&nbsp;&nbsp; DWORD BytesReturned;</div><div class="code_line">&nbsp;&nbsp; HANDLE hdrive=INVALID_HANDLE_VALUE;</div><div class="code_line">&nbsp;&nbsp; TCHAR drive_name1[20],drive_name2[20];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; StringCchPrintf(drive_name1,20,_T(&quot;%c:\&quot;),drive_letter);</div><div class="code_line">&nbsp;&nbsp; StringCchPrintf(drive_name2,20,_T(&quot;\\.\%c:&quot;),drive_letter);</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">&nbsp;&nbsp; drive_type=GetDriveType(drive_name1);</div><div class="code_line">&nbsp;&nbsp; </div><div class="code_line">&nbsp;&nbsp; hdrive = CreateFile(drive_name2,0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);</div><div class="code_line">&nbsp;&nbsp; if (hdrive==INVALID_HANDLE_VALUE)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return 2;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; memset(&amp;spq,0,sizeof(spq));</div><div class="code_line">&nbsp;&nbsp; memset(&amp;sdd,0,sizeof(sdd));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; spq.PropertyId=StorageDeviceProperty;</div><div class="code_line">&nbsp;&nbsp; spq.QueryType=PropertyStandardQuery;</div><div class="code_line">&nbsp;&nbsp; if (!DeviceIoControl(hdrive,IOCTL_STORAGE_QUERY_PROPERTY,&amp;spq,sizeof(spq),&amp;sdd,sizeof(sdd),&amp;BytesReturned,NULL))</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; CloseHandle(hdrive);</div><div class="code_line">&nbsp;&nbsp; &nbsp; return 3;</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; CloseHandle(hdrive);</div><div class="code_line">&nbsp;&nbsp; if ((drive_type==DRIVE_REMOVABLE)&amp;&amp;(sdd.BusType==BusTypeUsb)&amp;&amp;(sdd.RemovableMedia==true))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return 1;</div><div class="code_line">&nbsp;&nbsp; else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return 0;</div><div class="code_line">}</div><div class="code_line">//--------------------------------------------------------------------------------------------------------------------------</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">//--------------------------------------------------------------------------------------------------------------------------</div><div class="code_line">//Входные данные: </div><div class="code_line">//IN drive_letter - буква тетируемого диска</div><div class="code_line">//OUT sys_err_code - код системной ошибки в случае её возникновения</div><div class="code_line">//Коды возврата:</div><div class="code_line">//0 - диск не является флешкой</div><div class="code_line">//1 - диск является флешкой</div><div class="code_line">//2,3,4,5 - ошибки</div><div class="code_line">__int8 IsFlashDrive2(TCHAR drive_letter, LONG *sys_err_code)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; __int8 ret_code=0;</div><div class="code_line">&nbsp;&nbsp; HKEY hk=NULL;</div><div class="code_line">&nbsp;&nbsp; HANDLE hdrive=INVALID_HANDLE_VALUE;</div><div class="code_line">&nbsp;&nbsp; LONG Ret;</div><div class="code_line">&nbsp;&nbsp; DWORD data_size,dtype;</div><div class="code_line">&nbsp;&nbsp; WCHAR *data=NULL;</div><div class="code_line">&nbsp;&nbsp; TCHAR dos_link[50];</div><div class="code_line">&nbsp;&nbsp; TCHAR drive_name2[20];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; //проверяем существует ли диск в системе</div><div class="code_line">&nbsp;&nbsp; StringCchPrintf(drive_name2,20,_T(&quot;\\.\%c:&quot;),drive_letter);</div><div class="code_line">&nbsp;&nbsp; hdrive = CreateFile(drive_name2,0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);</div><div class="code_line">&nbsp;&nbsp; if (hdrive==INVALID_HANDLE_VALUE)</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;*sys_err_code=GetLastError();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ret_code=5;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;goto free_resources;</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">&nbsp;&nbsp; CloseHandle(hdrive);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; Ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T(&quot;SYSTEM\MountedDevices&quot;),0,KEY_READ,&amp;hk);</div><div class="code_line">&nbsp;&nbsp; if (Ret!=ERROR_SUCCESS)</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ret_code=2;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;*sys_err_code=Ret;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;goto free_resources;</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; StringCchPrintf(dos_link,50,_T(&quot;\DosDevices\%c:&quot;),drive_letter);</div><div class="code_line">&nbsp;&nbsp; Ret=RegQueryValueEx(hk,dos_link,NULL,&amp;dtype,NULL,&amp;data_size);</div><div class="code_line">&nbsp;&nbsp; if (Ret==ERROR_SUCCESS)</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;data=(WCHAR *)malloc(data_size+2);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (data==NULL)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; ret_code=3;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; *sys_err_code=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; goto free_resources;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;memset(data,0,data_size+2);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Ret=RegQueryValueEx(hk,dos_link,NULL,&amp;dtype,(LPBYTE)data,&amp;data_size);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (Ret!=ERROR_SUCCESS)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; ret_code=4;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; *sys_err_code=Ret;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; goto free_resources;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if(wcsstr(data,L&quot;USBSTOR&quot;)!=NULL)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; ret_code=1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; ret_code=0;</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">&nbsp;&nbsp; else</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ret_code=4;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;*sys_err_code=Ret;</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">&nbsp;</div><div class="code_line">free_resources:</div><div class="code_line">&nbsp;&nbsp; if (data!=NULL) free(data);</div><div class="code_line">&nbsp;&nbsp; if (hk!=NULL) RegCloseKey(hk);</div><div class="code_line">&nbsp;&nbsp; </div><div class="code_line">&nbsp;&nbsp; return ret_code;</div><div class="code_line">}</div><div class="code_line">//--------------------------------------------------------------------------------------------------------------------------</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">//--------------------------------------------------------------------------------------------------------------------------</div><div class="code_line">int _tmain(int argc, _TCHAR* argv[])</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; __int8 ret_code;</div><div class="code_line">&nbsp;&nbsp; TCHAR test_disk=_T(&#39;H&#39;);</div><div class="code_line">&nbsp;&nbsp; LONG sec;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; setlocale(LC_ALL,&quot;Russian&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; //IsFlashDrive</div><div class="code_line">&nbsp;&nbsp; //Простое использование</div><div class="code_line">&nbsp;&nbsp; ret_code=IsFlashDrive(test_disk);</div><div class="code_line">&nbsp;&nbsp; if (ret_code==1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;&nbsp; else if (ret_code==0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: НЕ является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;&nbsp; </div><div class="code_line">&nbsp;&nbsp; //Использование с минимальным контролем ошибок</div><div class="code_line">&nbsp;&nbsp; ret_code=IsFlashDrive(test_disk);</div><div class="code_line">&nbsp;&nbsp; if (ret_code==1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;&nbsp; else if (ret_code==0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: НЕ является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;&nbsp; else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Ошибка IsFlashDrive\n&quot;),test_disk);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; //Использование с полным контролем ошибок</div><div class="code_line">&nbsp;&nbsp; ret_code=IsFlashDrive(test_disk);</div><div class="code_line">&nbsp;&nbsp; if (ret_code==1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;&nbsp; else if (ret_code==0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: НЕ является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;&nbsp; else</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (ret_code==2)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Ошибка IsFlashDrive. Ошибка CreateFile: %u\n&quot;),GetLastError());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else if (ret_code==3)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Ошибка IsFlashDrive. Ошибка DeviceIoControl: %u\n&quot;),GetLastError());</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; //IsFlashDrive2</div><div class="code_line">&nbsp;&nbsp; //Простое использование</div><div class="code_line">&nbsp;&nbsp; ret_code=IsFlashDrive2(test_disk,&amp;sec);</div><div class="code_line">&nbsp;&nbsp; if (ret_code==1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;&nbsp; else if (ret_code==0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: НЕ является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; //Использование с минимальным контролем ошибок</div><div class="code_line">&nbsp;&nbsp; ret_code=IsFlashDrive2(test_disk,&amp;sec);</div><div class="code_line">&nbsp;&nbsp; if (ret_code==1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;&nbsp; else if (ret_code==0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: НЕ является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;&nbsp; else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Ошибка IsFlashDrive2\n&quot;),test_disk);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; //Использование с полным контролем ошибок</div><div class="code_line">&nbsp;&nbsp; ret_code=IsFlashDrive2(test_disk,&amp;sec);</div><div class="code_line">&nbsp;&nbsp; if (ret_code==1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;&nbsp; else if (ret_code==0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Диск %c: НЕ является флешкой\n&quot;),test_disk);</div><div class="code_line">&nbsp;&nbsp; else</div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (ret_code==2)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Ошибка IsFlashDrive2. Ошибка RegOpenKeyEx: %u\n&quot;),sec);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else if (ret_code==3)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Ошибка IsFlashDrive2. Ошибка malloc.\n&quot;));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else if (ret_code==4)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Ошибка IsFlashDrive2. Ошибка RegQueryValueEx: %u\n&quot;),sec);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else if (ret_code==5)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_tprintf(_T(&quot;Ошибка IsFlashDrive2. Ошибка CreateFile: %u\n&quot;),sec);</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; _tprintf(_T(&quot;Нажмите любую клавишу...&quot;));</div><div class="code_line">&nbsp;&nbsp; _getch();</div><div class="code_line">&nbsp;&nbsp; return 0;</div><div class="code_line">}</div><div class="code_line">//--------------------------------------------------------------------------------------------------------------------------</div></ol></div></div></div></div>]]></description>
        <author>neokoder</author>
        <category>C/C++ FAQ</category>
      </item>
	
      </channel>
      </rss>
	