Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Пример из DDK, драйвера-фильтра флешки  (Прочитано 29684 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Евгений
Гость
« : 02-04-2008 06:32 » 

Какой именно пример из DDK, пойдет для основы драйвер-фильтра флешки.  что там их по моемму немало
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 02-04-2008 08:00 » 

Евгений, а список описаний примеров DDK3790.1830\srcindex.htm - прочитать не судьба?
src\storage\filters - для любого устройства
« Последнее редактирование: 02-04-2008 08:02 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Евгений
Гость
« Ответ #2 : 07-04-2008 20:28 » 

Подскажите. Реально ли перехватывать запросы на запись файла, кодировать его(неважно как), а при чтении декодировать. теретически это реально? то есть что бы на флешке хранились закодированые данные, и только.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 08-04-2008 08:46 » 

реально) тем более теоретически. да и практически не должно быть больших сложностей.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Евгений
Гость
« Ответ #4 : 08-04-2008 09:23 » 

То есть как я понял вставить мне го нужно между usbhub.sys и под usbstore.sys перхватывать только IRP на чтение и запись, остальные я пропускаю...?   
Записан
Евгений
Гость
« Ответ #5 : 08-04-2008 09:39 » 

И еше вопрос, что бы сделать это под висту.....   Это вообще можно реализовать?   что юля этого нужно?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 08-04-2008 10:56 » 

у меня KMDF 1.0 включающий DDK 3790.1830. вроде под вистой работает... хотя сам KMDF не использую.
новее наверное есть, но искать надо..
посмотрите на майкрософте, может они выложили. если нет - из ослика качать... а может на форуме была ссылка - не помню точно.

http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx
« Последнее редактирование: 08-04-2008 11:00 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Евгений
Гость
« Ответ #7 : 13-04-2008 13:34 » 

В примере фильтра ДДК есть пример сомого фильтра и приложения для его добавления...   этот addfilter  для всх одиноковый? или как?  еще подскажите где именно указывать, где этот фильтр должен расположится?  где это все почитать на русском? ато в коментариях сложно разобратся.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 14-04-2008 12:15 » 

1. все таки слово "самого" - пишется через а....
а так же "одинАковый"... и "комМентариях"... и "разобратЬся"...

2. DDK3790.1830\src\storage\filters\addfilter\addfiltr.htm пункт 2.
3  поиск по этому разделу. на слово "книги".
« Последнее редактирование: 14-04-2008 12:17 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Евгений
Гость
« Ответ #9 : 30-04-2008 10:47 » 

Правильно ли будет, если установить фильтр  с помощью только инф файла,  при этом только поменять в нем
[Version]
Signature = "$Windows NT$"
Class     = DiskDrive

поменять на
Class     = USB

я так сделал, установил, система работает, должен ли я его видеть Диспетчер устройств - свойства USB - Сведения -  фильтры устройства(шины)....

Без отладчика я как могу посмотреть что он работает?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 30-04-2008 10:55 » 

Евгений, конечно правильно!

а что за файл, откуда взялся... - совершенно не важно)
берете inf от танка и прописываете слово самолет! - должен взлететь)


PS какой вопрос - такой ответ)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Евгений
Гость
« Ответ #11 : 30-04-2008 11:01 » 

Ну мы же разговориваем про пример драйвера фильтра  filters\diskperf от DDK  и там есть инф файл...

PS: Прошу не издевайтесь с меня, просто очень нужно разобратся...  Очень нужна помошь
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 30-04-2008 13:27 » 

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

Далее... этот пример драйвера-фильтр, как я говорил подходит для любого дискового устройства. не только для USB.

вопрос... а вы вообще разобрались как этот драйвер работает?

PS что вы! я с вас не издеваюсь...

Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Евгений
Гость
« Ответ #13 : 03-05-2008 13:46 » 

Ну как я понял, фильтр вешается на любое дисковое устройство, и фиксирует обращения к нему. То есть то, что мне нужно. Как я говорил,  я  поставил его без  AddFilter,  а просто через inf файл.  В  w2k_svc  показывает что в системе он  есть.   
Но где именно?   
И для чего тогда нужна  AddFilter?
Можно ли переписать инф. Что б он ставился туда куда нужно? То есть вешался на флешку.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 04-05-2008 09:32 » 

1. DDK3790.1830\tools\devicetree\x86\devicetree.exe
2. DDK3790.1830\src\storage\filters\addfilter\addfiltr.htm
3. наверное... покопаться надо...навскидку - не скажу.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Евгений
Гость
« Ответ #15 : 04-05-2008 11:06 » 

1. да спасибо помогло.
3. как я пнонял инфом одним неотделаешся,  вот тут нашел
 
PDEVICE_OBJECT pdDevObjTarg; - глобальная переменная для хранения указателя на устройство находящееся ниже фильтра.

PFILE_OBJECT      FileObj = NULL; - переменная для хранения указателя на объект-файл, для выгрузки нижележащего драйвера.

То есть это описивается в драйвере.

Вот как это делается для бипера  RtlInitUnicodeString(&devName,L"\\Device\\Beep"); а если флешка, то что нужно usbhub или usbstore....  что идет зачем?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #16 : 04-05-2008 11:54 » 

вопрос не понял)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Евгений
Гость
« Ответ #17 : 05-05-2008 08:50 » 

ПОлучилось подключить его к флешке после запуска лоадера в devicetree показывает что он приконектился к устройству.  Но DebugView молчит(может я с ним что то не так делаю?)  Когда лоадер заканчивает работу по идеи его выгружает фильтр. Но когда я его запускаю еше раз то пишет что такая служба уже есть.

Фрагмент
 
Код:
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath) 
{
NTSTATUS          status;
UNICODE_STRING    devName;
PDEVICE_OBJECT    fdo;
int i;

DbgPrint("DriverEntry...");

for(i=0; i<IRP_MJ_MAXIMUM_FUNCTION; i++)
{
DriverObject->MajorFunction[i] = DispatchPass;
}

DriverObject->DriverUnload = FilterDriverUnload;

status = IoCreateDevice(DriverObject,sizeof(PDEVICE_OBJECT),NULL,FILE_DEVICE_MASS_STORAGE,0,FALSE,&fdo);
if(!NT_SUCCESS(status))return status;
fdo->Flags |= 0x3040;

RtlInitUnicodeString(&devName,L"\\Device\\USBPDO-2");

status = IoGetDeviceObjectPointer(&devName,STANDARD_RIGHTS_ALL,&FileObj,&pdDevObjTarg);
if(!NT_SUCCESS(status))return status;

DbgPrint("IoGetDeviceObjectPointer -ok-");

IoAttachDeviceToDeviceStack(fdo,pdDevObjTarg);
if(!NT_SUCCESS(status))return status;

DbgPrint("IoAttachDeviceToDeviceStack -ok-");


return STATUS_SUCCESS;
}

VOID FilterDriverUnload(IN PDRIVER_OBJECT fdo)
{
IoDetachDevice(pdDevObjTarg);
ObDereferenceObject(FileObj);
IoDeleteDevice(fdo->DeviceObject);

DbgPrint("FilterDriverUnload");

}

лоадер
Код:
#include <windows.h>
#include <iostream>
#include <conio.h>

using namespace std;
void ErrorView();

int main()
{
cout<<" ------------------- "<<endl;
cout<<"| Loader is running |"<<endl;
cout<<" ------------------- "<<endl;

SC_HANDLE sch = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); 
if(sch)
{
SC_HANDLE schServiceUSB = CreateService(sch,"FilterDriver","FilterDriver",SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,
"C:\\FilterDriver\\sys\\objchk\\i386\\FilterDriver.sys",NULL,NULL,NULL,NULL,NULL);
if(schService)
{
if(StartService(schService,NULL,NULL))
{
cout<<"PAUSE: Press any key to exit pause..."<<endl;
while(!getch());

SERVICE_STATUS ServiceStatus;
if(ControlService(schService,SERVICE_CONTROL_STOP,&ServiceStatus))
{cout<<"ControlService - status ok"<<endl;}
else{cout<<"Error ControlService..."<<endl;ErrorView();}

if(DeleteService(schService))
{cout<<"DeleteService - status ok"<<endl;}
else{cout<<"Error DeleteService..."<<endl;ErrorView();}/**/

if(CloseServiceHandle(schService))
{cout<<"CloseServiceHandle - status ok"<<endl;}
else{cout<<"Error CloseServiceHandle..."<<endl;ErrorView();}/**/

if(CloseServiceHandle(sch))
{cout<<"CloseServiceHandle - status ok"<<endl;}
else{cout<<"Error CloseServiceHandle..."<<endl;ErrorView();}/**/
/*---------------------------------------------------------------------------------------------------------*/
}else{cout<<"Error StartService..."<<endl;ErrorView();}
}else{cout<<"Error CreateService..."<<endl;ErrorView();}
  }else{cout<<"Error OpenSCManager..."<<endl;ErrorView();}

cout<<" ------------------- "<<endl;
cout<<"| Loader is stopped |"<<endl;
cout<<" ------------------- "<<endl;
cout<<"Press any key to exit"<<endl;
while(!getch());
return 0;
}

void ErrorView()/*Функция вывода сообщений об ошибках...*/
{
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(),
    MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&lpMsgBuf,0,NULL);CharToOem((LPTSTR)lpMsgBuf,(LPTSTR)lpMsgBuf);
cout<<(LPCTSTR)lpMsgBuf<<endl;
LocalFree(lpMsgBuf);
}
« Последнее редактирование: 05-05-2008 14:59 от Евгений » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 05-05-2008 15:57 » 

DebugView показывает отладочные собщения только для debug версии драйвера - проверьте как вы его собирали.
кроме того при компиляции надо дефенишены соответствующие определить - типа _DBG, _DEBUG может еще какие, не помню на вскидку.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Евгений
Гость
« Ответ #19 : 05-05-2008 20:50 » 

ТАк вот после того как повторно гружу лоадер то пишет что служба уже запущена(ребут не помагает), А в DviceTree  фильтра возле флешки нет...... что делать? что это может быть?

ЗЫ: Если нужно могу прикрепить файлы.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #20 : 06-05-2008 08:07 » 

fdo->Flags |= 0x3040;
что за флаги?
IoCreateDevice - проходит?
IoGetDeviceObjectPointer - выполняется?
IoAttachDeviceToDeviceStack - где проверка статуса? какой результат?
вы уверены что сервис должен быть SERVICE_AUTO_START а не "по требованию"?

в main - не вижу обработки ошибок - вообще. опять же, это не есть хорошо. после ошибки в вызове любой функции всетаки сделайте все положенные обратные процедуры. вывод сообщения об ошибке - это не обработка.

по поводу загрузки - покажите список сообщений от драйвера и от приложения. желательно вперемешку. что за чем следует.


да не уверен что надо атачится к \\Device\\USBPDO-2...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Евгений
Гость
« Ответ #21 : 08-05-2008 11:21 » 

Мне тут подсказали что лучше взять за основу WDM фильтр, а не легаси.

WDM филтр не загружается по команде StartServer — т.к. он WDM — он автоматически будет включен в USB stack и загружен в момент подключения физического USB устройства.

То есть лоадер ненужен?

Для того чтобы перехватывать все данные с флешки нужен не upper фильтр для usb-hub, а lower-filter для ubsstor.sys

Что то я никак непойму как они вооше расположены, где находится   ЮСБхаб, где ЮСБстор.......  Не понял
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #22 : 12-05-2008 08:32 » 

DeviceTree.exe посмотрите ветку ( Driver\USBSTOR.
или там же по устройствам (PDO - кнопка P)
Root\ACPI_HAL\PNP0000\ и т.д.

по поводу стeка у Они можно почитать или в Соломоне-Руссиновиче, там  в общем виде все есть. на сайте тут тоже наверняка выложено.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Евгений
Гость
« Ответ #23 : 15-05-2008 08:56 » 

Наконец то разобрался с примером из DDK, получилось его установить. Но установился он на все дисковые устройства, то есть и на винт, и на USB(когда он есть).

функця DiskPerfReadWrite срабатывает... 
Но я недолжен перехватывать ReadWrite от винчестера, или перехватывать и отпускать дальше. Как я могу понять от чего пришло это IRP?

Что я вооше могу вытянуть и IRP  READ и WRITE?



И еще вопрос.  в  IRP   READ , WRITE  в буфере передается только данные? или бывает и служебная информация?  Кодировать можно все READ   WRITE? или какие-то отсекать?
« Последнее редактирование: 16-05-2008 11:25 от Евгений » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #24 : 16-05-2008 12:58 » new

не помню точно, кто то уже задавался здесь таким вопросом.... в итоге имя файла в IRP нашел. насколько я помню)
остальное - не знаю) надо доку читать...
« Последнее редактирование: 16-05-2008 13:00 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines