Сейчас на форуме: zds, tyns777, JustLife, 2nd, morgot, Rio, CDK123 (+4 невидимых)

 eXeL@B —› Программирование —› Определение буквы диска подключеного USB флеша
Посл.ответ Сообщение


Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 26 сентября 2009 21:36
· Личное сообщение · #1

В общем проблема такова...
Нужно как-то получить битовую маску буквы диска подключенного флеша...
WM_DEVICECHANGE не предлогать... ибо букву диска надо получить при запуске проги и когда флешка уже была воткнута до запуска программы..
Если программа работает и флешка втыкается - здесь проблем нет...
Но если флешка была уже воткнута.. и прога запуженна после того как...
Как в этом случае получить эту битовую маску?
Поделитесь инфой плиз... очень надо ..
Заранее большое спасибо!

-----
aLL rIGHTS rEVERSED!





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 26 сентября 2009 21:43
· Личное сообщение · #2

Собственно привожу код который ищет флешь...
Получает ID и название...

Code:
  1. SearchUSBDevice     proc 
  2.  
  3.                         local BufLen     :dword
  4.                         local hDevInfoSet :dword
  5.                         local dwTmp      :dword
  6.                         local BufStr [260]:byte
  7.                         
  8.                         invoke SetupDiGetClassDevs,addr DISK_GUID,NULL,NULL,DIGCF_PRESENT
  9.                         mov hDevInfoSet,eax
  10.                         
  11.                         mov DevInfoData.cbSize,sizeof DevInfoData
  12.                         xor ecx,ecx
  13.  
  14.                  @@:    push ecx
  15.                         invoke SetupDiEnumDeviceInfo,hDevInfoSet,ecx,addr DevInfoData
  16.                         .if eax == NULL
  17.                         jmp @exit
  18.                         .endif
  19.                         invoke SetupDiGetDeviceRegistryProperty,hDevInfoSet,addr DevInfoData,SPDRP_COMPATIBLEIDS,addr dwTmp,addr BufStr,sizeof BufStr,NULL
  20.                         invoke lstrcmp,addr BufStr,chr$("USBSTOR\Disk")
  21.                               .if eax == NULL
  22.  
  23.                               invoke CM_Get_DevNode_Status,addr Status,addr ProblemNumber,DevInfoData.DevInst,NULL
  24.                               invoke CM_Get_Device_ID_Size,addr Dev_Len,DevInfoData.DevInst,NULL
  25.                               inc Dev_Len
  26.                               invoke CM_Get_Device_ID,DevInfoData.DevInst,addr aDeviceId,Dev_Len,NULL
  27.                               mov BufLen,sizeof aBufNameDevice
  28.                               invoke CM_Get_DevNode_Registry_Property,DevInfoData.DevInst,CM_DRP_FRIENDLYNA ME,NULL,addr  aBufNameDevice,addr BufLen,NULL
  29.                               .if eax != NULL
  30.                               invoke CM_Get_DevNode_Registry_Property,DevInfoData.DevInst,CM_DRP_DEVICEDESC ,NULL,addr  aBufNameDevice,addr BufLen,NULL
  31.                               .endif
  32.                               .if eax != NULL
  33.                               mov byte ptr[aBufNameDevice],0
  34.                               .endif
  35.                               
  36.                               Вот здесь нужен код который получает букву флеш диска...
  37.                               
  38.                               return TRUE
  39.  
  40.                         .endif
  41.                         
  42.                         pop ecx
  43.                         inc ecx
  44.                         jmp @B 
  45.                  @exit:
  46.                         return FALSE 
  47.  
  48. SearchUSBDevice     endp


-----
aLL rIGHTS rEVERSED!




Ранг: 23.2 (новичок), 8thx
Активность: 0.020
Статус: Участник

Создано: 26 сентября 2009 22:01
· Личное сообщение · #3

юзай SetupDiGetDeviceInterfaceDetail
по SP_DEVICE_INTERFACE_DETAIL_DATA.DevicePath найдешь Native-имя диска




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 26 сентября 2009 22:31
· Личное сообщение · #4

Code:
  1. ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« ««««««
  2.     include \masm32\include\masm32rt.inc
  3.     include \masm32\include\setupapi.inc
  4.  
  5.     includelib \masm32\lib\setupapi.lib
  6.  
  7.     DIGCF_PRESENT         equ 00000002h
  8.     DIGCF_ALLCLASSES      equ 00000004h
  9.     DIGCF_PROFILE         equ 00000008h
  10.     DIGCF_DEVICEINTERFACE equ 00000010h
  11.  
  12.     HDEVINFO typedef DWORD
  13.  
  14.     SP_DEVICE_INTERFACE_DATA STRUCT
  15.       cbSize              DWORD ?
  16.       InterfaceClassGuid  GUID  <>
  17.       Flags               DWORD ?
  18.       Reserved            DWORD ?
  19.     SP_DEVICE_INTERFACE_DATA ENDS
  20.  
  21.     ;-------------------------
  22.     ; #define ANYSIZE_ARRAY 1
  23.     ;-------------------------
  24.  
  25.     SP_DEVICE_INTERFACE_DETAIL_DATA STRUCT
  26.       cbSize      DWORD ?
  27.       DevicePath  BYTE  ANYSIZE_ARRAY dup(?)
  28.     SP_DEVICE_INTERFACE_DETAIL_DATA ENDS
  29.  
  30.     ;-------------------------------------------------------
  31.     ; For this I used the w2k version of the import library
  32.     ; from the Microsoft Windows Server 2003 SP1 DDK.
  33.     ;-------------------------------------------------------
  34.  
  35.     includelib hid.lib
  36.  
  37.     LPGUID typedef ptr GUID
  38.  
  39.     HidD_GetHidGuid PROTO HidGuid:LPGUID
  40.  
  41. ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« ««««««
  42.     .data
  43.  
  44.       guid    GUID      <>
  45.       lpsz    LPOLESTR  0
  46.       hdi     HDEVINFO  0
  47.       spdid   SP_DEVICE_INTERFACE_DATA <SIZEOF SP_DEVICE_INTERFACE_DATA>
  48.       SIZEOFSPDIDD = SIZEOF SP_DEVICE_INTERFACE_DETAIL_DATA
  49.       spdidd  SP_DEVICE_INTERFACE_DETAIL_DATA <SIZEOFSPDIDD>
  50.               db 1024 dup(0)
  51.  
  52.     .code
  53. ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« ««««««
  54. start:
  55. ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« ««««««
  56.     print str$(SIZEOFSPDIDD),13,10
  57.  
  58.     invoke HidD_GetHidGuid, ADDR guid
  59.     print str$(eax),13,10
  60.     invoke StringFromIID, ADDR guid, ADDR lpsz
  61.     print str$(eax),13,10,13,10
  62.     invoke crt_printf, chr$("%S%c%c"), lpsz, 10, 10
  63.  
  64.     invoke SetupDiGetClassDevs, ADDR guid, NULL, 0, DIGCF_DEVICEINTERFACE
  65.     mov hdi, eax
  66.     print str$(hdi),13,10,13,10
  67.  
  68.     xor ebx, ebx
  69.  
  70.   @@:
  71.  
  72.     invoke SetupDiEnumDeviceInterfaces, hdi, NULL, ADDR guid, ebx, ADDR spdid
  73.     .IF eax == 0
  74.       invoke GetLastError
  75.       .IF eax != ERROR_NO_MORE_ITEMS
  76.         print "SetupDiEnumDeviceInterfaces unexpected error",13,10
  77.       .ENDIF
  78.       jmp @F
  79.     .ENDIF
  80.     invoke SetupDiGetDeviceInterfaceDetail, hdi, ADDR spdid, ADDR spdidd,
  81.                                             1024, NULL, NULL
  82.     print str$(eax),13,10,13,10
  83.  
  84.     print ADDR spdidd.DevicePath,13,10
  85.  
  86.     inc ebx
  87.     jmp @B
  88.  
  89.   @@:
  90.  
  91.     invoke SetupDiDestroyDeviceInfoList, hdi
  92.     print str$(eax),13,10,13,10
  93.  
  94.     inkey "Press any key to exit..."
  95.     exit
  96. ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« ««««««
  97. end start


-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 27 сентября 2009 08:50
· Личное сообщение · #5

Нифига не выходит...
SetupDiEnumDeviceInterfaces постоянно возвращает ERROR_NO_MORE_ITEMS
Может я не тот GUID использую?
Для получения ID устройства я использую - GUID_DEVCLASS_DISKDRIVE {4D36E967-E325-11CE-BFC1-08002BE10318}
Для получения имя диска нужен этот же GUID или нет?
Подскажите плиз ктонить....

-----
aLL rIGHTS rEVERSED!




Ранг: 23.2 (новичок), 8thx
Активность: 0.020
Статус: Участник

Создано: 27 сентября 2009 09:57
· Личное сообщение · #6

Для SetupDiEnumDeviceInterfaces я использовал
Code:
  1.          GUID_REMOVEABLE  dd 53F56307h 
  2.                                    dw 0B6BFh
  3.                                    dw 11D0h
  4.                                    db 94h, 0F2h, 0, 0A0h, 0C9h, 1Eh, 0FBh, 8Bh

p.s. посмотри исходник на wasm



Ранг: 512.7 (!), 360thx
Активность: 0.270.03
Статус: Модератор

Создано: 27 сентября 2009 12:29
· Личное сообщение · #7

пример отсюда нумерует оК (но код там индуский )

www.codeguru.com/forum/showthread.php?t=331907
см. пост от March 11th, 2005, 12:43 PM




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 27 сентября 2009 14:10
· Личное сообщение · #8

GMax

Ну вроде заработало

Подскажи теперь как из дос имени девайса \?\USBSTOR#Disk&Ven_Kingston&Prod_DataTraveler_2.0&Rev_PMAP#5B6B06809113&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b} получить имя логического диска?
Пожалста...

-----
aLL rIGHTS rEVERSED!




Ранг: 23.2 (новичок), 8thx
Активность: 0.020
Статус: Участник

Создано: 27 сентября 2009 14:26
· Личное сообщение · #9

Думаю есть несколько способов
я юзал довольно корявый:
открывал диск CreateFile
функцией DeviceIoControl и кодом IOCTL_STORAGE_GET_DEVICE_NUMBER получал номер диска
затем открывал каждый диск системы и делал то же самое
как только номера совпадали значит диск найден
если найдешь лучший путь дай знать




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 28 сентября 2009 08:41
· Личное сообщение · #10

GMax пишет:
Думаю есть несколько способов


Буду искать... найду поделюсь обязательно...

У меня такой еще вопрос - как надо преобразовать полученное дос имя, чтобы CreateFile скушал его?
А не матерился что файл не найден...

\?\USBSTOR#Disk&Ven_Kingston&Prod_DataTraveler_2.0&Rev_PMAP#5B6B068091 13&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}
Что здесь надо изменить?

-----
aLL rIGHTS rEVERSED!




Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 28 сентября 2009 09:58 · Поправил: Hexxx
· Личное сообщение · #11

В сорцах винды 2к есть мега функция которая букву для флэшки из имени USB находит. Через функции работы с volume. Естественно как называется я не помню

-----
Реверсивная инженерия - написание кода идентичного натуральному





Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 28 сентября 2009 12:09 · Поправил: DaRKSiDE
· Личное сообщение · #12

Hexxx пишет:
Естественно как называется я не помню


Ну вот... опять облом

-----
aLL rIGHTS rEVERSED!




Ранг: 23.2 (новичок), 8thx
Активность: 0.020
Статус: Участник

Создано: 28 сентября 2009 18:46
· Личное сообщение · #13

DaRKSiDE пишет:
У меня такой еще вопрос - как надо преобразовать полученное дос имя, чтобы CreateFile скушал его?

у меня два обратных слеша вначале имени, кушает и не давится

а что мешает посмотреть отладчиком, например в Dr.USB?




Ранг: 462.8 (мудрец), 468thx
Активность: 0.280
Статус: Участник
Only One!

Создано: 28 сентября 2009 18:53
· Личное сообщение · #14

GMax пишет:
а что мешает посмотреть отладчиком, например в Dr.USB?


Посмотрел
Пипец... старею....старею.... сделать такую опечатку...
Короче в параметрах CreateFile вместо FILE_ATTRIBUTE_NORMAL = 80h, я воткнул NORMAL = 0...
И поэтому не открывался диск...

-----
aLL rIGHTS rEVERSED!



 eXeL@B —› Программирование —› Определение буквы диска подключеного USB флеша
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати