Всем привет! Для отслеживания процессов в системе в Ring0 есть PsSetCreateProcessNotifyRoutine. А есть ли что-нить похожего для отслеживания подключения/отключения устройств в системе? Например USB, диски и прочее.
prus Если это обычное приложение, оно может создать невидимое окно и обрабатывать его сообщения (можно заодно и WM_ENDSESSION, если нужно). Из сервиса - не знаю.
код , как пример =) Код (Text): .386 .model flat, stdcall option casemap :none ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> include ../include/user32.inc includelib ../lib/user32.lib include ../include/kernel32.inc includelib ../lib/kernel32.lib include ../include/windows.inc CheckUsbDisk proto :dword CTL_CODE MACRO DeviceType:=<0>, Function:=<0>, Method:=<0>, Access:=<0> EXITM %(((DeviceType) SHL 16) OR ((Access) SHL 14) OR ((Function) SHL 2) OR (Method)) ENDM ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; Equ ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ICO_MAIN equ 1000 DLG_MAIN equ 1000 IDC_TEXT equ 1001 DBT_DEVICEARRIVAL equ 8000h DBT_DEVTYP_VOLUME equ 02h _DEV_BROADCAST_HDR struct dbch_size dd ? dbch_devicetype dd ? dbch_reserved dd ? _DEV_BROADCAST_HDR ends _DEV_BROADCAST_VOLUME struct dbcv_size dd ? dbcv_devicetype dd ? dbcv_reserved dd ? dbcv_unitmask dd ? dbcv_flags dw ? _DEV_BROADCAST_VOLUME ends DBTF_MEDIA equ 01h DBTF_NET equ 02h ;subst FILE_ANY_ACCESS equ 0 METHOD_BUFFERED equ 0 FILE_DEVICE_MASS_STORAGE equ 2dh ;from ntddk.inc IOCTL_STORAGE_BASE equ FILE_DEVICE_MASS_STORAGE ;from ntddstor.inc IOCTL_STORAGE_QUERY_PROPERTY equ CTL_CODE(IOCTL_STORAGE_BASE, 500h, METHOD_BUFFERED, FILE_ANY_ACCESS) BusTypeUsb equ 7 StorageDeviceProperty equ 0 PropertyStandardQuery equ 0 STORAGE_PROPERTY_QUERY struct PropertyId dd ? ; QueryType dd ? ; AdditionalParameters dd ? ; STORAGE_PROPERTY_QUERY ends STORAGE_DEVICE_DESCRIPTOR struct Version dd ? theSize dd ? DeviceType db ? DeviceTypeModifier db ? ; SCSI-2 RemovableMedia db ? CommandQueueing db ? VendorIdOffset dd ? ProductIdOffset dd ? ProductRevisionOffset dd ? SerialNumberOffset dd ? BusType dd ? RawPropertiesLength dd ? RawDeviceProperties dd ? STORAGE_DEVICE_DESCRIPTOR ends ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .data disk3 db '\\.\',0 mao db ':',0 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .code ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> _ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam mov eax,wMsg ;******************************************************************** .if eax == WM_CLOSE invoke EndDialog,hWnd,NULL ;******************************************************************** .elseif eax == WM_DEVICECHANGE mov eax,wParam .if eax == DBT_DEVICEARRIVAL mov eax,lParam assume eax:ptr _DEV_BROADCAST_HDR mov eax,[eax].dbch_devicetype assume eax:nothing .if eax == DBT_DEVTYP_VOLUME mov eax,lParam assume eax:ptr _DEV_BROADCAST_VOLUME mov edx,[eax].dbcv_unitmask ;mov ecx,[eax].dbcv_flags xor ebx,ebx .while ebx<26 mov ecx,edx and edx,01h .if edx==1 mov cx,word ptr [eax].dbcv_flags .if cx == 00h (subst net use) add ebx,65d invoke CheckUsbDisk,ebx .endif .break .else mov edx,ecx shr edx,1 .endif inc ebx .endw assume eax:nothing .endif .endif ;******************************************************************** .else mov eax,FALSE ret .endif mov eax,TRUE ret _ProcDlgMain endp CheckUsbDisk proc uses ebx esi edi disk:dword LOCAL buffer[128]:byte LOCAL hDisk:dword LOCAL notuse:dword LOCAL Query:STORAGE_PROPERTY_QUERY LOCAL DevDesc:STORAGE_DEVICE_DESCRIPTOR invoke lstrcpy,addr buffer,offset disk3 ;buffer=\\.\ invoke lstrcat,addr buffer,addr disk ;buffer=\\.\X invoke lstrcat,addr buffer,offset mao ;buffer=\\.\X: invoke CreateFile,addr buffer, NULL, NULL,NULL, OPEN_EXISTING, NULL,NULL mov hDisk,eax .if eax !=INVALID_HANDLE_VALUE mov Query.PropertyId,StorageDeviceProperty mov Query.QueryType,PropertyStandardQuery invoke DeviceIoControl,hDisk,IOCTL_STORAGE_QUERY_PROPERTY,addr Query, sizeof STORAGE_PROPERTY_QUERY,addr DevDesc,sizeof STORAGE_DEVICE_DESCRIPTOR,addr notuse, NULL .if eax != NULL mov eax,[ DevDesc.BusType] .if eax == BusTypeUsb invoke lstrcpy,addr buffer,addr disk ;buffer=X invoke lstrcat,addr buffer,offset mao ;buffer=X: invoke GetDriveType,addr buffer .if eax != DRIVE_CDROM invoke MessageBox,0,addr buffer,addr buffer,1 .endif .endif .endif .endif invoke CloseHandle,hDisk ret CheckUsbDisk endp ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start: invoke GetModuleHandle,NULL invoke DialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,NULL invoke ExitProcess,NULL ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> end start
Здравствуйте. Тоже пытаюсь отловить момент подлключения USB Flash. Понимаю, что можно зарегистрировать окно и ловить сообщения. Так тоже сделаю, а пока - установил hook на GETMESSAGE в dll. Собственно проблема: Этот код Код (Text): FlashEv proc nCode:DWORD,wParam:DWORD,lParam:DWORD invoke CallNextHookEx,hHookF,nCode,wParam,lParam mov edx, lParam assume edx: PTR MSG .IF [edx].message ==WM_DEVICECHANGE ; Это работает .IF[edx].wParam == 8000h ;DBT_DEVICEARRIVAL Это работает, если 8000h поменять на 7 invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK .ENDIF .ENDIF assume edx:nothing ret 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. У меня выводился ноль, хотя - мож криво сделал... Если бы не две недели поисков по книгам, форумам и проч, не стал бы постить. Где грабли?