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

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

Добрый день.

Хочу научиться собирать VXD-драйвер. За исходник взял Filemon434 с Wasm`a (http://www.wasm.ru/baixado.php?mode=tool&id=283).

1) ПО и исходники.
Пользуюсь VC7 под WindowsXP SP2. На руках есть WDK от Vist`ы. Что ещё следует установить/найти и какой версии доступно_в_сети/стоит_использовать ?

2) Мои действия.
Запустил стандартный батник, с прописными путями
"C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\vsvars32.bat"
Перешел в директорию ...\filemon434\vxd
Набираю nmake и в ответ получаю
makefile(14) : fatal error U1052: file '\include\vtoolsd.mak' not found Stop.

Заглянул в Makefile
Код:
# FILEMON.mak - makefile for VxD FILEMON

PATH=d:\driverstudio\vtoolsd\bin;$(PATH)
DEVICENAME = FILEVXD
DYNAMIC = 1
FRAMEWORK = C
DEBUG = 0
OBJECTS = filemon.OBJ

all: $(DEVICENAME).vxd
         copy    *.vxd ..\exe\release\.
         copy    *.vxd ..\exe\debug\.

!include $(VTOOLSD)\include\vtoolsd.mak
!include $(VTOOLSD)\include\vxdtarg.mak

filemon.OBJ: filemon.c filemon.h
Прикинул, что на диске D нет driverstudio. Её стоит устанавливать ?
Вообще, как должен выглядеть мой Makefile ? Объясните, за что отвечают строчки.
Моя последовательность действий при сборке VXD ?



==============================
P.S. Для чего всё это затеял.

Есть программа, которая пишет логи. Каждый день в определенной папке создается файл с именем YYYY-MM-DD.txt текущей даты.
Требуется перехватывать данные и писать их в другой файл, возможно, на другом сервере.
Перехват должен осуществляться только для данных соответствующих следующим критериям:
1) записываемые файлы расположены в специальной директории (настраиваемый параметр)
2) файл должен записываться определенным процессом, имя которого так же является настраиваемым параметром.

Проверьте мои рассуждения:
Просмотрел исходники Filemon. Как оказалось данные на ListView передаются в текстовом виде через глобальный буфер. По таймеру буфер обновляется. Данные поступают через функцию DeviceIoControl, параметрами которой являются: буфер с длиной и хендл на устройство "\\.\FILEVXD.VXD"
Полез в исходники  FILEVXD.VXD. Значит, там есть небольшой стек страниц, которые используются для логирования. По команде IOCTL_FILEMON_GETSTATS через функцию OnW32Deviceiocontrol() вытаскивается последняя страница и передается вверх в  программу Filemon. Сами страницы создаются и наполняются в хуке FilemonHookProc(). Последний параметр переданый в хук - указатель на структуры IOREQ. В этой структуре есть:
- флаги указывающие на запись в файл (ir_flags),  идентификатор процесса(ir_pid), хендл записываемого файла(ir_fh) - то есть всё что нужно для моей фильтрации.
- указатель на буфер (ir_data) и длина буфера (ir_length).
Хочу модифицировать vxd так, чтоб он отфильтровывал данные и передовал их наверх в прогу. Там уже буду думать куда и как сохранять backup.
Но сейчас надо разобраться с компиляцией самого FILEVXD.VXD Улыбаюсь
Записан
Ochkarik
Модератор

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

« Ответ #1 : 18-09-2008 16:21 » 

эээ... уточню: вы в курсе, что драйвера VxD ТОЛЬКО для Win 95/98/ME подходят. да?
теперь по пунктам:
WDK от Vista вам не пойдет. прокатит любой до билда 2600.1106 включительно(это XP) - в последнем есть инклуды от ME. с натяжкой. возможно в DDK 2000 должны быть - уже не помню к сожалению. давно с 95 дела не имел...

судя по обрывкам что вы показываете - драйвера были сделаны с DriverStudio. видимо тоже потребуется древняя версия типа 2.6... а возможно и более ранняя.
впрочем нет. ссылок на DS Там не видно на первый взгляд....

а вот теперь насчет всего остального.
посмотрите в DDK. старом. там должны быть примеры и make. и описание как его компилить.
сделайтел по образу и подобию - насколько помню, это было не сложно.

хм... может вы все таки SYS-драйвер сделаете?))






Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
neosapient
Гость
« Ответ #2 : 20-09-2008 15:38 » 

эээ... уточню: вы в курсе, что драйвера VxD ТОЛЬКО для Win 95/98/ME подходят. да?
может вы все таки SYS-драйвер сделаете?))
Может всё таки и SYS-драйвер Ж:)

Проверил две ловушки.
1) Первая ловушка находилась на "метке" IRP_MJ_WRITE в функции FilemonHookRoutine().
Предполагал, что интересующие меня данные могут лежать в одном из буферов. Либо currentIrpStack->Flags равен DO_BUFFERED_IO, тогда данные надо искать в Irp->AssociatedIrp.SystemBuffer. Либо currentIrpStack->Flags равен DO_DIRECT_IO, тогда данные надо искать в Irp->MdlAddress. К сожалению, либо указатель на буффер был нулевой, либо флаг currentIrpStack->Flags не родственен флагам, указаным в документации.
Почему не поймал данные в этом хуке ?

2) Вторая ловушка находилась на "метке" FASTIO_WRITE в функции FilemonFastIoWrite().
Код выглядит так

...
CHAR                 localbuf[500]={0};
int                  copylen;
...
copylen = sizeof(localbuf);
localbuf[0]=0;
if(Buffer!=NULL && Length>0){
   if(copylen>Length)copylen = Length;
   strncpy(localbuf,Buffer,copylen-1);
   localbuf[copylen-1]=0;
}
LogRecord( TRUE, NULL,
            &dateTime, &timeResult,
            "%s\tFASTIO_WRITE\t%s\tOffset: %d Length: %d %s\t%s",
            FilemonGetProcess( name ), fullPathName,
            FileOffset->LowPart, Length, localbuf,
            retval?ErrorString( IoStatus->Status, errorBuf ):"FAILURE" );
...

Ура, данные передаются ввиде указателя, через один из параметров функции.
Вот только не могу понять, почему драйвер убивает операционку (и уводит компьютер на перезагрузку), если буфер localbuf увеличить до значени 1000?
Предполагаю, что это както связано с размером страницы.

3) Как тестят драйвера их профессиональные разработчики. Есть какие-нибудь статьи?
Записан
Ochkarik
Модератор

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

« Ответ #3 : 21-09-2008 18:06 » 

1. хм. не знаю)
2. если нет других ошибок... то при сборке драйвера каким то ключем указывается размер стека. проверьте величину по умолчанию и что там стоит.
3 утилиты тестирования есть в DDK. но этого мало. а в остальном - так же как и обычные программы.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

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

« Ответ #4 : 22-09-2008 07:37 » 

по поводу первого вы перепутали
флаг DO_BUFFERED_IOсодержится в поле DeviceObject->Flags а не в IRP->flags

и второе - вы не приложение пишете. забудте об strncpy и прочего из функций Си.
RtlStringCbCopyNW and RtlStringCbCopyNA should be used instead of strncpy!
« Последнее редактирование: 22-09-2008 07:42 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

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

« Ответ #5 : 04-11-2008 15:59 » new

neosapient,
Вот только не могу понять, почему драйвер убивает операционку (и уводит компьютер на перезагрузку), если буфер localbuf увеличить до значени 1000?
Предполагаю, что это както связано с размером страницы.
недавно выяснил:
размер стека в kernel-mode:
при вызове процедур в драйвере для стека выделяется
Цитата
1. On x86 machines to 12 kb
2. On x64 machines to 24 kb
3. On Itaium machines to 32 kb
эта память расходуется на все вызовы, таким образом - на ваши нужды остается лишь часть стека. видимо в данном случае вы его переполняете.
точнее - поиском в нете по "kernel-mode stack size"
Записан

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines