Отслеживание подключения и отключения устройств

Тема в разделе "WASM.WIN32", создана пользователем prus, 24 дек 2007.

  1. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    Всем привет!

    Для отслеживания процессов в системе в Ring0 есть PsSetCreateProcessNotifyRoutine.
    А есть ли что-нить похожего для отслеживания подключения/отключения устройств в системе?
    Например USB, диски и прочее.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    IRP_MJ_PNP
     
  3. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    Great

    Это мне нужно будет фильтр реализовывать?
     
  4. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Для ring-3 есть оконное сообщение WM_DEVICECHANGE.
     
  5. prus

    prus New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    92
    diamond

    А если это нужно делсть из-под приложения, которое запускает сервис?
     
  6. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    prus
    Если это обычное приложение, оно может создать невидимое окно и обрабатывать его сообщения (можно заодно и WM_ENDSESSION, если нужно). Из сервиса - не знаю.
     
  7. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    код , как пример =)

    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap :none
    4. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    5. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    6. include        ../include/user32.inc
    7. includelib    ../lib/user32.lib
    8. include        ../include/kernel32.inc
    9. includelib    ../lib/kernel32.lib
    10. include        ../include/windows.inc
    11.  
    12.  
    13. CheckUsbDisk    proto :dword
    14.  
    15. CTL_CODE MACRO DeviceType:=<0>, Function:=<0>, Method:=<0>, Access:=<0>
    16.         EXITM %(((DeviceType) SHL 16) OR ((Access) SHL 14) OR ((Function) SHL 2) OR (Method))
    17. ENDM
    18.  
    19. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    20. ; Equ
    21. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    22. ICO_MAIN    equ    1000
    23. DLG_MAIN    equ    1000
    24. IDC_TEXT    equ    1001
    25.  
    26. DBT_DEVICEARRIVAL equ 8000h
    27. DBT_DEVTYP_VOLUME equ 02h
    28.  
    29. _DEV_BROADCAST_HDR struct
    30. dbch_size       dd ?
    31. dbch_devicetype dd ?
    32. dbch_reserved   dd ?
    33. _DEV_BROADCAST_HDR ends  
    34.  
    35. _DEV_BROADCAST_VOLUME struct
    36. dbcv_size       dd ?
    37. dbcv_devicetype dd ?
    38. dbcv_reserved   dd ?
    39. dbcv_unitmask   dd ?
    40. dbcv_flags      dw ?
    41. _DEV_BROADCAST_VOLUME ends
    42.  
    43. DBTF_MEDIA      equ 01h
    44. DBTF_NET        equ 02h ;subst
    45.  
    46.  
    47. FILE_ANY_ACCESS                        equ 0
    48. METHOD_BUFFERED         equ 0
    49. FILE_DEVICE_MASS_STORAGE        equ 2dh ;from ntddk.inc
    50. IOCTL_STORAGE_BASE equ FILE_DEVICE_MASS_STORAGE ;from ntddstor.inc
    51. IOCTL_STORAGE_QUERY_PROPERTY        equ CTL_CODE(IOCTL_STORAGE_BASE, 500h, METHOD_BUFFERED, FILE_ANY_ACCESS)
    52.  
    53. BusTypeUsb equ 7
    54.  
    55. StorageDeviceProperty equ 0
    56. PropertyStandardQuery equ 0
    57.  
    58. STORAGE_PROPERTY_QUERY struct
    59. PropertyId     dd ?             ;
    60. QueryType      dd ?             ;
    61. AdditionalParameters dd ?       ;
    62. STORAGE_PROPERTY_QUERY ends
    63.  
    64. STORAGE_DEVICE_DESCRIPTOR struct
    65. Version             dd ?        
    66. theSize             dd ?        
    67. DeviceType          db ?        
    68. DeviceTypeModifier  db ?        ; SCSI-2
    69. RemovableMedia      db ?        
    70. CommandQueueing     db ?        
    71. VendorIdOffset      dd ?        
    72. ProductIdOffset     dd ?      
    73. ProductRevisionOffset   dd ?    
    74. SerialNumberOffset      dd ?    
    75. BusType                 dd ?    
    76. RawPropertiesLength     dd ?    
    77. RawDeviceProperties     dd ?    
    78. STORAGE_DEVICE_DESCRIPTOR ends
    79.  
    80.  
    81. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    82. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    83.         .data
    84.         disk3   db '\\.\',0
    85.         mao     db ':',0
    86. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    87. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    88.  
    89.         .code
    90.  
    91. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    92. _ProcDlgMain    proc    uses ebx edi esi hWnd,wMsg,wParam,lParam
    93.                
    94.         mov    eax,wMsg
    95. ;********************************************************************
    96.         .if    eax ==    WM_CLOSE
    97.             invoke    EndDialog,hWnd,NULL
    98. ;********************************************************************
    99.         .elseif    eax ==   WM_DEVICECHANGE  
    100.             mov    eax,wParam
    101.             .if    eax == DBT_DEVICEARRIVAL
    102.                    mov  eax,lParam
    103.                    assume eax:ptr _DEV_BROADCAST_HDR
    104.                    mov  eax,[eax].dbch_devicetype
    105.                    assume eax:nothing
    106.                    .if  eax == DBT_DEVTYP_VOLUME
    107.                         mov eax,lParam
    108.                         assume eax:ptr _DEV_BROADCAST_VOLUME
    109.                         mov edx,[eax].dbcv_unitmask
    110.                         ;mov ecx,[eax].dbcv_flags
    111.                         xor ebx,ebx
    112.                         .while ebx<26
    113.                         mov ecx,edx
    114.                         and edx,01h
    115.                         .if edx==1
    116.                             mov cx,word ptr [eax].dbcv_flags
    117.                             .if cx == 00h (subst net use)
    118.                             add ebx,65d
    119.                             invoke CheckUsbDisk,ebx
    120.                             .endif
    121.                             .break
    122.                         .else
    123.                             mov edx,ecx
    124.                             shr edx,1
    125.                         .endif
    126.                         inc ebx
    127.                         .endw
    128.                         assume eax:nothing      
    129.                    .endif
    130.             .endif      
    131. ;********************************************************************
    132.         .else
    133.             mov    eax,FALSE
    134.             ret
    135.         .endif
    136.         mov    eax,TRUE
    137.         ret
    138.  
    139. _ProcDlgMain    endp
    140.  
    141. CheckUsbDisk        proc uses ebx esi edi disk:dword
    142.                     LOCAL   buffer[128]:byte
    143.                     LOCAL   hDisk:dword
    144.                     LOCAL   notuse:dword
    145.                     LOCAL   Query:STORAGE_PROPERTY_QUERY
    146.                     LOCAL   DevDesc:STORAGE_DEVICE_DESCRIPTOR
    147.                
    148.  
    149.                            invoke   lstrcpy,addr buffer,offset disk3   ;buffer=\\.\
    150.                            invoke   lstrcat,addr buffer,addr   disk    ;buffer=\\.\X
    151.                    invoke   lstrcat,addr buffer,offset mao     ;buffer=\\.\X:
    152.                    invoke   CreateFile,addr buffer, NULL, NULL,NULL, OPEN_EXISTING, NULL,NULL
    153.                    mov      hDisk,eax
    154.                    .if eax !=INVALID_HANDLE_VALUE
    155.                         mov Query.PropertyId,StorageDeviceProperty  
    156.                         mov Query.QueryType,PropertyStandardQuery
    157.                         invoke   DeviceIoControl,hDisk,IOCTL_STORAGE_QUERY_PROPERTY,addr Query, sizeof STORAGE_PROPERTY_QUERY,addr DevDesc,sizeof STORAGE_DEVICE_DESCRIPTOR,addr notuse, NULL
    158.                         .if eax != NULL
    159.                             mov eax,[ DevDesc.BusType]
    160.                             .if eax == BusTypeUsb
    161.                                 invoke  lstrcpy,addr buffer,addr disk  ;buffer=X
    162.                                 invoke  lstrcat,addr buffer,offset mao ;buffer=X:
    163.                                 invoke        GetDriveType,addr buffer
    164.                                 .if eax != DRIVE_CDROM
    165.                                 invoke  MessageBox,0,addr buffer,addr buffer,1
    166.                                 .endif
    167.                             .endif      
    168.                         .endif    
    169.                    .endif    
    170.                    invoke   CloseHandle,hDisk
    171.                     ret
    172. CheckUsbDisk        endp
    173. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    174. start:
    175.         invoke    GetModuleHandle,NULL
    176.         invoke    DialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
    177.         invoke    ExitProcess,NULL
    178. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    179. end    start
     
  8. ant

    ant Member

    Публикаций:
    0
    Регистрация:
    19 мар 2008
    Сообщения:
    118
    Здравствуйте. Тоже пытаюсь отловить момент подлключения USB Flash. Понимаю, что можно зарегистрировать окно и ловить сообщения. Так тоже сделаю, а пока - установил hook на GETMESSAGE в dll. Собственно проблема:
    Этот код

    Код (Text):
    1. FlashEv proc nCode:DWORD,wParam:DWORD,lParam:DWORD
    2.  
    3. invoke CallNextHookEx,hHookF,nCode,wParam,lParam
    4.  
    5. mov edx, lParam
    6. assume edx: PTR MSG
    7.  
    8. .IF [edx].message ==WM_DEVICECHANGE     ; Это работает
    9. .IF[edx].wParam == 8000h                         ;DBT_DEVICEARRIVAL  Это работает, если 8000h поменять на 7
    10. invoke MessageBox, NULL, addr   MsgBoxText, addr MsgBoxCaption, MB_OK
    11.  
    12. .ENDIF
    13.  
    14. .ENDIF
    15.  
    16. assume edx:nothing
    17.  
    18. ret
    19. FlashEv endp
    работает, если wParam сравниваем с 7h, что означает: "A device has been added to or removed from the system." (http://msdn2.microsoft.com/en-us/library/aa363480(VS.85).aspx). Таких сообщений поступает около 7 штук. Когда устройство готово, должно прийти одно сообщение, содержащее в поле wParam структуры MSG 8000h.
    Во всяком случае, Winspector Spy (аналог Spy++) ловит сообщение WM_DEVICECHANGE со значением wParam 0x00008000 всякий раз, когда я подключаю флэшку (как и несколько мессаг с 0х00000007).
    Низкая квалификация не позволила разобраться с помощью OlyDbg. Пытался выводить значения wParam через MsgBoxText. У меня выводился ноль, хотя - мож криво сделал... Если бы не две недели поисков по книгам, форумам и проч, не стал бы постить. Где грабли?