![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| freezeman |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Уффф... для вас, для кого-нибудь ещё на форуме это, конечно, не сложно... Я программист .NET и с WINAPI не работал, пишу сейчас на С++ и параллельно изучаю особенности языка...
У меня в этом то и дело, что файлов маленьких будет много, а общий размер я буду выделять и, если сумма объёмов этих файлов превышает ограничение, то они просто не учитываются, возвращаются как есть... Перехват у меня есть функции ReadFile, через проекцию сведения о перехваченном файле передаются в мою службу, где там обрабатываются, принимается решение заносить их в ОП или нет, когда занес группу файлов в ОП, я планировал сделать проекцию (для межпроцессного взаимодействия), где хранил сведения о уже занесенных файла в ОП...Когда произошел перехват вновь, открывается эта проекция и проверяет на наличие этого файла в ОП... ну дальше понятно, что я должен считать его с ОП... но как это сделать, как это реализовать....не знаю(( И не совсем подходит описанная схема...Моожет через кучу, заносить туда, а потом, как писал Akira, считать в буффер и все?? |
||||
|
|||||
| Akira |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 26.3.2012 Репутация: нет Всего: нет |
Как читать особой разницы нет, реализация примерно одинакова. Почитай про работу с указателями. Хранить, если много параметров которые надо хранить то можно завести структуру и сделать масив. Например, как то так
struct Save { char name[MAX_PATH]; void* ptr }; А в память грузи так, как тебе нравится. Функция что бы получить из HANDLE имя - NtQueryObject(hFileHandle,ObjectNameInformation,(PVOID)lpBuffer, size, &ret); Это сообщение отредактировал(а) Akira - 28.3.2012, 18:23 |
|||
|
||||
| freezeman |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Получил имя из HANDLE чуть-чуть по другому, и передаю тоже в структуре массив TCHAR, но при передаче, почему-то путь ограничивается 18 символами, хотя в момент преобразования HANDEL в путь к файлу он бывает корректен.
То есть сначала загрузить, а потом просто прочитать из памяти, как вы описывали ранее и вернуть в случае успеха TRUE... буду пробовать, спасибо большое! |
||||
|
|||||
| Akira |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 26.3.2012 Репутация: нет Всего: нет |
но при передаче, почему-то путь ограничивается 18 символами
Мб проблема в типах (WCHAR) покажи код получения имени. Add: freezeman Если не кто не ответит то завтра напишу ибо я уже иду на вторые сутки без сна так что проблема отлечить int от char. Это сообщение отредактировал(а) Akira - 28.3.2012, 22:10 |
|||
|
||||
| freezeman |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
В тестовом примере ставлю точку останова, проверяю и все нормально, но когда передаю через проекцию передает только первые 18 символов... Код получения путь к файлу по его HANDLE:
Скорее всего дело в типе, может получать не в массиве TCHAR, а просто в массиве char? Это сообщение отредактировал(а) freezeman - 28.3.2012, 20:34 |
||||
|
|||||
| freezeman |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
А как узнать какие именно данные будут считываться, какая часть файла?
Можно ли получить из параметров readfile? Я подумал, что при вызове системой функции ReadFile считывается определенный блок из файла, но в параметрах кроме количества толком ничего нет, как узнать что именно читается? Это сообщение отредактировал(а) freezeman - 30.3.2012, 10:03 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Если файл был открыт в OVERLAPPED режиме, то в структуре overlapped (последний параметр) передается смещение, откуда читать. Иначе чтение производится с текущей позиции. Ее можно отслеживать самому, или запросить у системы (через SetFilePointer(handle,0,NULL,FILE_CURRENT) ) |
|||
|
||||
| Akira |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 26.3.2012 Репутация: нет Всего: нет |
freezeman
А зачем ты путь конвертируешь? В этот нет нужды, да и в хукнутой функции это точно не нужно делать. |
|||
|
||||
| freezeman |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
А как я узнаю, какой именно файл читает ReadFile и есть ли он у меня в памяти... ведь HANDLE не будет при следующем обращении совпадать... |
|||
|
||||
| Akira |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 26.3.2012 Репутация: нет Всего: нет |
Я об этом - QueryDosDevice достаточно этого - GetMappedFileName
Конвертирование нужно что бы из этого \Device\HarddiskVolume1\Temp\ сделать C:\Temp в твоем случае это излишне. Это сообщение отредактировал(а) Akira - 30.3.2012, 15:44 |
|||
|
||||
| freezeman |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Проверю... Подскажите как мне заполнить буфер, который указан в перехваченной функции ReadFile... Вот алгоритм: 1 создать однонаправленный динамический список, загрузить туда файлы, отфильтрованные по алгоритму 2 проверить в перехваченной ReadFile на наличие этого файла в моем динамическом списке 3 если файл в памяти, то нужно заполнить буфер со смещением overlapped 4 иначе просто вернуть ReadFile системе. Подскажите, пожалуйста, как реализовать 3 пункт, как заполнить буфер со смещением? Добавлено через 53 секунды
Спасибо, отлично... |
||||
|
|||||
| Akira |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 26.3.2012 Репутация: нет Всего: нет |
Я же говорил, читай про работу с указателями.
Примерно так char* str = "primer"; void* pout = str; void* pin; memcpy(pin, pout, 4); printf("%s", pin); |
|||
|
||||
| freezeman |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 175 Регистрация: 21.1.2011 Репутация: нет Всего: нет |
Спасибо большое! почитаю, разберусь!) |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |