Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Офтопик > Работа > Задания за деньги
Перезагрузить страницу BCB6. Перехват обращений к файлу.
Закрытая тема
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Smolnyj Smolnyj вне форума
Member
 
Сообщений: 31
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.11.2005
По умолчанию BCB6. Перехват обращений к файлу. - 22.04.2006, 02:37

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

Проблема в том, что у меня самого нет абсолютно никакого желания изучать системное программирование под Win, все эти хуки, апи и прочий геморрой, проскольку оно мне в общем-то не надо и навряд ли понадобится. А заставить себя прожевать весь этот колоссальный объём информации ради решения одной-единственной небольшой задачки - явно выше моих сил

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

Возможные варианты таковы -
1) Вы предоставляете мне полностью законченный и работающий исходник. Я предоставляю Вам некоторую сумму денег Но ТОЛЬКО после проверки работоспособности кода.
2) Вы предоставляете мне куски нужного кода, потом мы сидим, вместе пьём пиво и пытаемся заставить это работать
3) Вариант 1 плюс вместе пьём пиво и "заставляем это работать"

Итак, собственно задача:
Постараюсь описать максимально подробно.
================================================== ========

Необходимо организовать перехват ВСЕХ обращений операционной системы и любых запущенных программ к одному-единственному файлу. Перехватываться должны любые операции чтения из этого файла и определения его размера. Опционально также перехватывать операции записи в этот файл.
Имя файла, который необходимо перехватывать, известно заранее, пусть это будет "C:the_file.bin". Опционально иметь возможность смены(задания) имени/расположения файла(до момента включения перехвата).

Решение задачи должно быть в виде модуля (исходника) программы, написанного на C для среды Borland C++ Builder 6. Желательно в виде одного .cpp файла. Ну или .cpp и .h Дабы я мог себе это дело воткнуть простым #include.
Втыкаться оно будет в уже существующий проект, посему все перечисленные "обязательные требования" - ОБЯЗАТЕЛЬНЫ.

Допускается(и приветствуется) использование встроенного ассемблера.
Допускается(и приветствуется) использование WinAPI, в том числе недокументированных.
Допускается использование тредов(однако не переборщите - у меня их и так уже шесть).
НО при использовании тредов следует пользоваться ТОЛЬКО функциями WinAPI - CreateThread, WaitForSingleObject и т.п.
Борландовский класс тредов и всё с ним связанное - НЕ ИСПОЛЬЗОВАТЬ!
Весьма желательно использовать в коде комментарии, чем их больше - тем мине приятней
НЕ ДОПУСКАЕТСЯ использование MFC. Ну, или свести использование MFC к МИНИМУМУ.
НЕ ДОПУСКАЕТСЯ использование сторонних компонентов.

Код ДОЛЖЕН компилиться и работать под WinXP SP1. Крайне желательна также работоспособность под Win98.

Код НЕ ДОЛЖЕН быть написан в формате драйвера, т.е. всё должно работать на "чистой" машине без предварительной инсталяции драйвер-фильтра или какой-либо подобной лабуды. Кто считает, что это невозможно - посмотрите к примеру на FileMon какой-нибудь свежей версии - в старых версиях они юзали именно драйвер-фильтр, а потом каким-то образом избавились от этого геморра - теперь там один-единственный екзешник. Вот подобная реализация меня и интересует.


Взаимодействие модуля с внешним миром должно сводиться к следующему:

ВХОД, т.е. команды, которые он должен понимать:
===============================================
Предполагается наличие фунуции-приёмника команд. Пусть это будет BYTE TheModuleInput ( BYTE Command)

Обязательные команды:

StartOperations (возврат скажем 0xA5 при успешном старте, код ошибки или просто false при сбое запуска перехвата)
По этой команде должен начинаться собственно пререхват, т.е. с этого момента начинают отлавливаться и обрабатываться все обращения к указанному файлу.

StopOperations (возврат всё того же 0xA5 при успешном останове, false или код ошибки при сбое, например если команда поступила при выключенном перехвате)
По этой команде перехват прекращаем.

IsStarted (возврат true если перехват уже запущен, false ели не запущен)
Это способ программно проверить, включен перехват или нет.

Необязательные(опциональные) команды:

Добавляем ещё одну функцию-приёмник: BOOL SetNewName ( char* FileName )
Это будет установка имени файла, который надо перехватывать. (имя полное, вместе с путём)

И ещё одну: char GetFileName (void)
Эта функция должна возвращать текущее имя файла, который подлежит перехвату. Точнее - указатель на char с этим именем.


ВЫХОД, т.е. действия, предпринимаемые при попытке доступа ОС к файлу:
================================================== ===================

ОБЯЗАТЕЛЬНО иметь всего две операции :

При попытке ОС ОПРЕДЕЛЕНИЯ РАЗМЕРА файла - модуль должен вызывать функцию, назовём её UINT64 Trick_GetSize (void), которая будет возвращать размер файла в байтах - этот размер модуль должен будет передать операционной системе.

При попытке ЧТЕНИЯ из файла - модуль должен вызывать функцию UINT32 Trick_ReadFile ( UINT64 Offset, UINT32 Len) которая будет возвращать размер фактически прочитанного блока в байтах.
Сам же блок данных будет находится по фиксированному адресу, зараннее объявленному в качестве ГЛОБАЛЬНОЙ переменной, примерно так: char TrickReadBuffer [Trick_ReadBufferSize].
Соответственно, этот прочитанный размер и данные из блока следует передать операционной системе. Можно прередавать по ссылке.
При этом желательно как-то разрулить вопрос с ситуацией, когда ОС просит прочесть за один раз больше байт, чем размер нашего буфера. Хотя вообще я полагаю, что учитываю специфику задачи, можно будет подобрать такой размер буфера, который не будет превышаться запросами ОС, но тем не менее если есть возможность "объяснить" системе, что "этот файл можно читать кусками размером не более XXX мегабайт" - желательно эту возможность использовать. Предполагаемый размер буфера - от 0,5 до 10 мегабайт, над этим я ещё подумаю.

Ещё следует учесть, что хотя обычно Trick_ReadFile будет отрабатывать за миллисекунды, в некоторых случаях её выполнение может занять весьма продолжительное время - до нескольких минут. Так что надо предусмотреть возможные в этом случае "непонятки" со стороны ОС.

Также следует обдумать возможность возникновения ситуации, когда ОС при наличии незавершённой операции чтения из файла(т.е. во время выполнения Trick_ReadFile) попытается почитать его ещё. Лучший вариант - подобное запретить, если это возможно. Можно в принципе поставить запррос в очередь. Ну или Ваш вариант решения этой проблемы.

При попытке ЗАПИСИ в файл - весьма желательно возвращать ОС какую-нибудь понятную для неё ошибку, чтобы она поняла, что это не ошибка, а именно запрет записи. При этом по каждой попытке записи делать WrtAttempsCount++ (це будет тоже глобальная переменная UINT32).

НЕОБЯЗАТЕЛЬНО, опционально иметь ещё и запись в файл:

При попытке ЗАПИСИ в файл - модуль должен вызывать функцию UINT32 Trick_WriteFile ( UINT64 Offset, UINT32 Len) которая будет возвращать размер фактически записанного блока в байтах. Сам блок данных модуль должен опять же положить в буфер, объявленый изначально аналогично буферу чтения char TrickReadBuffer [Trick_ReadBufferSize]. Размер этого буфера будет раз в десять-пятьдесят меньше, чем размер буфера чтения.
Ситуация, когда ОС просит записать больше байтов, чем размер буфера записи, должна разруливаться вашим модулем самостоятельно, путём последовательного копирования кусков данных в буфер записи и нескольких вызовов функции Trick_WriteFile.

При реализации режима записи следует также реализовать программное управление режимом(ReadOnly/Wtitable). Для этого в функцию TheModuleInput добавим ещё две команды:

Команда включения режима доступа на запись GrantWriteAcess (возврат всё того же 0xA5 при успешном включении, false или код ошибки при сбое операции)

Команда включения режима доступа ReadOnly DenyWriteAcess(возврат всё того же 0xA5 при успешном включении, false или код ошибки при сбое операции)

Команда проверки режима доступа GetAcessType (возврат одного из трёх значений - Writeable, ReadOnly, Error)


========================================

Вот, собственно, и вся задачка.
Кстати, сколько ныне может стоить её решение - я не знаю даже примерно. Так что предлагайте ваши цены, звоните, пишите, стучите - думаю так или иначе договоримся...

тел. [+7 9025] 55-18-23 спросить меня.
ICQ 227240918.
Skype - "Smolnyj"
В телефон можно звонить в любое время, даже поздно ночью. Ибо сплю я обычно с утра и до обеда


P/s: Весьма желательно, если "решитель" будет из местных(г.Владивосток или окрестности) - это очень упростит процедуру "товарообмена". Поскольку при удалённом заказе сразу возникает так называемый "вопрос доверия" - во всяком случае, "деньги вперёд" я высылать точно не буду, и честно говоря не знаю, почему тот, кто возьмётся за этот заказ, должен поверить, что я действительно отправлю деньги после его получения...
Как вообще решаются подобные вопросы?
Ads
Закрытая тема

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Где взять NextGrid для BCB6 Fiminka C++ Builder 0 16.01.2007 21:10
Конвертировать код из VBA в код для BCB6.0 андре Visual Basic 0 27.04.2006 13:13
Где найти в интернете bcb6.hlp EUGIX C++ Builder 11 17.03.2006 21:42
MyDAC для BCB6 где найти в интернете sunower C++ Builder 0 29.12.2005 19:07
Как установить количество обращений к серверу через CInternetSession zhekha Visual C++ 0 23.12.2005 14:58
Редактирование файла ресурсов в BCB6 oksman C++ Builder 6 15.11.2005 17:45
Как средствами BCB6 по IP можно узнать URL ARSi C++ Builder 0 04.04.2005 10:05
TSR как сделать подсчет количества обращений Leha-p С/С++ 1 28.03.2005 12:44
Выделение памяти для TADODataSet в BCB6 Philin C++ Builder 2 02.11.2004 10:55
Открытие файлов в формате xls иd bcb6 micle02 C++ Builder 3 02.04.2004 12:39
BCB6 создание нового компонента Anonymous C++ Builder 3 03.12.2003 11:17
BCB6. Как раскрасить содержимое TDBEdit Anonymous C++ Builder 0 01.10.2003 14:51



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов