Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > отловить usb-flash


Автор: shara 16.6.2010, 20:16

в драйвер-филтре хочу определения DEVICE_OBJECT флешек
ИЛИ вообще хоть как-то определить наличие подключенный флешки к компу

Код

NTSTATUS
AttachToMountedDevice (
    __in PDEVICE_OBJECT AttachToDeviceObject,
    __in PDEVICE_OBJECT OurDeviceObject
    )
{
 .... 
       ASSERT(IS_MY_DEVICE_OBJECT( OurDeviceObject));
 ....

    if (FlagOn(AttachToDeviceObject->Characteristics, FILE_REMOVABLE_MEDIA)) {
        KdPrint((" **** USB \n"));
    } else {
        KdPrint((" **** NOT USB \n"));
    }
....

 


когда подключаем флешку - упроно пишет "NOT USB"


пробовал для AttachToDeviceObject вызвать функцию IoGetDiskDeviceObject она возвращает STATUS_INVALID_PARAMETER для только что подмонтированного тома (который был перехвачен в при обработке ирпа IRP_MN_MOUNT_VOLUME посланного файловой системе)

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

Автор: bra1ny 16.6.2010, 21:29
мой метод) 
http://www.everfall.com/paste/id.php?5zbl1101qkp3
недокументированно.

 

Автор: shara 16.6.2010, 22:09
bra1ny, 

Код

NTSTATUS  MyAddDevice ( IN PDRIVER_OBJECT DriverObject , IN PDEVICE_OBJECT DeviceObject );

NTSTATUS DriverEntry( ) 
{
...

    RtlInitUnicodeString( &usDriverName , L"\\Driver\\usbstor" );
    ns = ObReferenceObjectByName( &usDriverName ,
                                  OBJ_CASE_INSENSITIVE ,
                                  NULL ,
                                  0 ,
                                  IoDriverObjectType ,
                                  KernelMode ,
                                  0 ,
                                  &pDisk
                                );

    //
    // hook AddDevice routine of \\Driver\\usbstor
    //
    InterlockedExchange( (PLONG)&pDisk->DriverExtension->AddDevice , (LONG)MyAddDevice );
....
}



NTSTATUS MyAddDevice( IN PDRIVER_OBJECT DriverObject , IN PDEVICE_OBJECT DeviceObject )
{
    NTSTATUS ns;
    WCHAR Vendor[1024];
    ULONG Ret;

    RtlZeroMemory( Vendor , 1024 );

    KdPrint(("in my handler!\n"));

    ns = IoGetDeviceProperty( DeviceObject , DevicePropertyHardwareID  , 1024 , &Vendor , &Ret );

    if( !NT_SUCCESS(ns) )
    {
        KdPrint(("IogetDeviceProperty failed with status : %08X\n" , ns ));
        goto __end;
    }

    KdPrint(("Vendor : %ws\n" , Vendor ));

    if( wcscmp( _FLASH_ , Vendor ) )
    {
        MsgBox( L"You have no rights to use this device!" );
        return STATUS_ACCESS_DENIED;
    }
__end:
    return OldAddDevice( DriverObject , DeviceObject );
}


  smile  smile  smile  smile 

можешь объяснить как это работает? точнее по какому принципу оно должно работать
.. я покаместь код боюсь набирать... уж сильно ээ... нереально он выглядит  smile  

Автор: bra1ny 16.6.2010, 22:39
Цитата

ИЛИ вообще хоть как-то определить наличие подключенный флешки к компу

код отлавливает подключение юсб накопителя.Просто я его вырезал из проекта старого , где надо разрешать использование накопителей только с определенными номерами( типа zlock).

Автор: shara 16.6.2010, 22:44
Цитата(bra1ny @  16.6.2010,  21:39 Найти цитируемый пост)
вырезал из проекта старого , где надо разрешать использование накопителей только с определенными номерами

я это понял...  не могу понять по какому принципу оно работает  smile 

Цитата

The InterlockedExchange routine sets an integer variable to a given value as an atomic operation.
  

или там еще чего-то не хватает?

ну не может функция MyAddDevice вызваться при подключении USB-девайсов только потому что ее адрес был передан на пометку как Атомарная Операция  smile 

Автор: bra1ny 16.6.2010, 22:48
Цитата(shara @ 16.6.2010,  22:44)
Цитата(bra1ny @  16.6.2010,  21:39 Найти цитируемый пост)
вырезал из проекта старого , где надо разрешать использование накопителей только с определенными номерами

я это понял...  не могу понять по какому принципу оно работает  smile 

Цитата

The InterlockedExchange routine sets an integer variable to a given value as an atomic operation.


или там еще чего-то не хватает?

ну не может функция MyAddDevice вызваться при подключении USB-девайсов только потому что ее адрес был передан на пометку как Атомарная Операция  smile

так я перехватываю AddDevice usbstor.sys =)) 

Автор: shara 16.6.2010, 22:54
кажися начал въезжать
 
Код

    RtlInitUnicodeString( &usDriverName , L"\\Driver\\usbstor" );
    ns = ObReferenceObjectByName( &usDriverName ,
                                  OBJ_CASE_INSENSITIVE ,
                                  NULL ,
                                  0 ,
                                  IoDriverObjectType ,
                                  KernelMode ,
                                  0 ,
                                  &pDisk
                                );


тоесть это мы называемся его именем и делал как-бы  ссылку на себя..  

надо будет завтра попробовать. а то у меня проц перегрелся уже  smile 

Автор: bra1ny 16.6.2010, 22:59
Цитата(shara @ 16.6.2010,  22:54)
кажися начал въезжать
 
Код

    RtlInitUnicodeString( &usDriverName , L"\\Driver\\usbstor" );
    ns = ObReferenceObjectByName( &usDriverName ,
                                  OBJ_CASE_INSENSITIVE ,
                                  NULL ,
                                  0 ,
                                  IoDriverObjectType ,
                                  KernelMode ,
                                  0 ,
                                  &pDisk
                                );


тоесть это мы называемся его именем и делал как-бы  ссылку на себя..  

надо будет завтра попробовать. а то у меня проц перегрелся уже  smile

просто получаем DRIVER_OBJECT его и меняем адресс AddDevice на наш хэндлер.

для наглядности .
Код

lkd> !drvobj usbstor
Driver object (8a1786a0) is for:
 \Driver\usbstor
Driver Extension List: (id , addr)

Device Object list:
8a07cea0  8a08b030  
lkd> dt _DRIVER_OBJECT 8a1786a0
nt!_DRIVER_OBJECT
   +0x000 Type             : 4
   +0x002 Size             : 168
   +0x004 DeviceObject     : 0x8a07cea0 _DEVICE_OBJECT
   +0x008 Flags            : 0x12
   +0x00c DriverStart      : 0xf77a7000 
   +0x010 DriverSize       : 0x6780
   +0x014 DriverSection    : 0x8a136e90 
   +0x018 DriverExtension  : 0x8a178748 _DRIVER_EXTENSION
   +0x01c DriverName       : _UNICODE_STRING "\Driver\usbstor"
   +0x024 HardwareDatabase : 0x80699210 _UNICODE_STRING "\REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM"
   +0x028 FastIoDispatch   : (null) 
   +0x02c DriverInit       : 0xf77ac805     long  +fffffffff77ac805
   +0x030 DriverStartIo    : 0xf77a8f26     void  +fffffffff77a8f26
   +0x034 DriverUnload     : 0xf751badc     void  +fffffffff751badc
   +0x038 MajorFunction    : [28] 0x8a0861f8     long  +ffffffff8a0861f8
lkd> _DRIVER_EXTENSION 0x8a178748
     ^ Syntax error in '_DRIVER_EXTENSION 0x8a178748'
lkd> dt _DRIVER_EXTENSION 0x8a178748
nt!_DRIVER_EXTENSION
   +0x000 DriverObject     : 0x8a1786a0 _DRIVER_OBJECT
 +0x004 AddDevice        : 0xf77ab16c     long  +fffffffff77ab16c        <=====================
   +0x008 Count            : 0
   +0x00c ServiceKeyName   : _UNICODE_STRING "usbstor"
   +0x014 ClientDriverExtension : (null) 
   +0x018 FsFilterCallbacks : (null) 


Автор: EvilsInterrupt 18.6.2010, 19:40
bra1ny, 
>>lkd> dt _DRIVER_OBJECT 8a1786a0
как вижу это не  i386kd.exe , а тулза Руссиновича livekd.exe. Поясни пожалуйста, как ты умудряешься с помощью нее смотреть реальные данные? А то пока у меня получается смотреть структуру, командой dt , к примеру dt nt!_nt_tib . А для полного анализа юзаю WinDBG\VirtualKD + WMware , однако хотелось бы частности смотреть с помощью livekd

Автор: bra1ny 18.6.2010, 21:43
Код

dt _struct addr

например 
Код

dt _DRIVER_OBJECT 8a1786a0

Автор: EvilsInterrupt 19.6.2010, 12:31
Странно, но у меня не пашуд в livekd команды !object , !driver (

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)