Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

FileMapping

5.2K
06 декабря 2006 года
SerMax
96 / / 04.11.2006
Имею понятие о том, как работает FileMapping, но всю специфику значений, принимаемых функциями CreateFileMapping и MapViewOfFile не очень знаю. Прошу у вас помощи. Написал программу. При загрузке формы создаётся библиотека (содержит глобал хук для перехвата сообщений с клавиатуры), в библиотеке создаётся объект файлового отображения (вроде так называется), который будет содержать хэндл главной формы (нужно мне).

В библиотеке при загрузке оной :
 
Код:
begin
 {назначим процедуру переменной DLLProc}
  DLLProc:= @DLLEntryPoint;
  {вызываем назначенную процедуру для отражения факта присоединения данной
   библиотеки к процессу}
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.


Ну объявлены ест-но глобально там же:
Код:
const
  MMFName: PChar = 'HandleMMF';

type
  PGlobalDLLData = ^TGlobalDLLData;
  TGlobalDLLData = packed record
    MyAppWnd: HWND; // дескриптор нашего приложения
  end;

var
….
GlobalData: PGlobalDLLData;
MMFHandle: THandle;



Идём дальше по ходу выполнения :
Код:
procedure OpenGlobalData();
begin
  {получаем объект файлового отображения}
  MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName); //для 64-ричных систем
  if MMFHandle = 0 then
    begin
      MessageBox(0, 'Can''t create FileMapping', 'Message from keyhook.dll', 0);
      Exit;
    end;

  {отображаем глобальные данные на АП вызывающего процесса и получаем указатель
   на начало выделенного пространства}
  GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));  // FILE_MAP_WRITE как вариант…тоже не катит
  if GlobalData = nil then
    begin
      CloseHandle(MMFHandle);
      MessageBox(0, 'Can''t make MapViewOfFile', 'Message from keyhook.dll', 0);
      Exit;
    end;
end;

procedure CloseGlobalData();
begin
  UnmapViewOfFile(GlobalData);
  CloseHandle(MMFHandle);
end;


 procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin
  case dwReason of
    DLL_PROCESS_ATTACH: OpenGlobalData;
    DLL_PROCESS_DETACH: CloseGlobalData;
  end;
end;


Так…с этим вроде разобрались…передаю из главной формы хэндл окна, принимаю в библиотеке :
 
Код:
Procedure Appl(FH:HWND); stdcall;  //это точно работает
begin
 GlobalData^.MyAppWnd:= FH;
end;


По идее потом как-нить жму клавишу и показывается окно :
 
Код:
procedure ShowForm; stdcall;
 begin
  PostMessage(GlobalData^.MyAppWnd, MY_MESSAGE, 0,0);
end;


Но это уже не играет роли.

Итак, ПРОБЛЕМА ! Прога пускается…висит в рабочем режиме ,вроде всё ок, НО как только я пытаюсь запустить игру или мне приходит сообщение в аську, агента или ещё куда-нибудь, вылетают две ошибки…обе связаны с памятью. В одной прямо говорится, что в моей dll-ке произошёл Fatall Error.

Проблема именно в том, как реализован FileMapping. Т.к. если его убрать, то программа висит и на приходящие сообщения никак не реагирует.

Вообще не понимаю, как это взаимосвязано ?? Глобальный хук описан на сигналы с клавиатуры, но никак не на перехват сообщений. ….
У кого какие идеи ??
261
06 декабря 2006 года
ahilles
1.5K / / 03.11.2005
пример клавиатурного шпиона есть в книге "програмирование в дельфи глазами хакера"
ещё раз расскажи для чего нужен хук
5.2K
06 декабря 2006 года
SerMax
96 / / 04.11.2006
хук WH_KEYBOARD
 
Код:
function Key_Hook(Code: integer; wParam: word; lParam: DWord): Longint;stdcall; export;

Программно изменяет громкость в системе при нажатии на опр-е клавиши.

Сам хук работает корректно.
Просто у меня была проблема с посланием сообщения через PostMessage главной формt из библиотеки, и для того, чтобы каждый процесс (куда подгружается моя библиотека при загрузке) знал Handle главной формы, я использовал FileMapping, храня в страничном файле Handle главной формы
 
Код:
Procedure Appl(FH:HWND); stdcall;
begin
 GlobalData^.MyAppWnd:= FH;  //при создании главная форма передаёт сюда свой Handle
end;


Теперь я знаю Handle формы и могу послать ему сообщение
 
Код:
PostMessage(GlobalData^.MyAppWnd, MY_MESSAGE, 0,0);


Хотя сейчас проверил - даже без отправки сообщения в главное меню вылазят ошибки. Т.е. ошибка где-то в создании страничного файла и хранении там хэндла главной формы.

Работает....дык всё же есть проблема, описанная выше
Одна из ошибок содержит текст :
"Exception EAccessViolation in module dll_change.dll ......."
вот описаные этого исключения :
"Приложение осуществило доступ к неверному адресу в памяти. Обычно это означает, что программа обратилась за данными по неинициализированному указателю."

Вот и ищу....где ж оно и куда неверно могло обратиться
261
07 декабря 2006 года
ahilles
1.5K / / 03.11.2005
могу ошибаться но
это наверное потому что аськин клиент думает что твоя дллка в которой находится обработчик и которая загружена в её адресное пространство это какой нибудь троян который следит за клавой и выгружает это дллку, а хук то остаётся и при ображению к обработчику на его месте пустота потому что он выгружен и отсуда ошибка
а игра выгружает дллку потому что игра для экономия памяти выгружает из себя всё что можно
но это только моё мнение.........
5.2K
07 декабря 2006 года
SerMax
96 / / 04.11.2006
!!!!! Ты случайно на другом форуме то же самое не писал ?? А то слово в слово твой ответ совпадает с ответом на другом форуме :) !!!!!.

Без FileMapping игра не выгружала мою dll-ку, и она вполне корректно работала в процессе игры...тут что-то другое.
Предполагаю (на основе "метода проб и ошибок"), что при приходе сообщения в аську в первый раз (т.е. я пустил прогу..и жду ,пока придёт мессага), длл-ка, загруженная в АП аськи, пытается выполнить код procedure OpenGlobalData(), где при попытке вызова

MMFHandle:= OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,MMFName) ;
//это я уже через Open работаю в длл-ке, а Create делаю в основной форме....но это всё равно не помогло.

вылазит ошибка. К сожалению, пошагово всё это отследить не могу, и соотв-но, не утверждаю на верность всего этого.....сижу, уже 3-й день, ломаю голову над этой проблемой...
257
07 декабря 2006 года
kosfiz
1.6K / / 18.09.2005
а SysUtils используешь?
5.2K
07 декабря 2006 года
SerMax
96 / / 04.11.2006
Модуль ? Да....

вот...нашёл, чтобы понять, в чём же, собственно, проблема:

http://www.gamedev.ru/download/?id=4663 (сорри, чо-то файл сюда незагрузился сам..привожу ссылку на него).

Чтобы понять мою проблему. Там две АБСОЛЮТНО одинаковые программы, работающие с хуком WH_GETMESSAGE и используют FileMapping. Кому не лень, пробегитесь глазами по коду программ (он короткий). Если пустить обе программы, то они работают...до N-го времени...а потом вылетает та же ошибка, что и у меня.
257
07 декабря 2006 года
kosfiz
1.6K / / 18.09.2005
из-за SysUtils может глючить. его лучше не использовать при написании длл, которые предназначены для внедрения в другой процесс.
5.2K
07 декабря 2006 года
SerMax
96 / / 04.11.2006
Убрал SysUtils....не помогло
257
07 декабря 2006 года
kosfiz
1.6K / / 18.09.2005
так давай сразу определимся. я внедряю hook_dll1.dll в qip.exe у меня вылетает ошибка:
"Инструкция по адресу ... обратилась к памяти по адресу ... . Память не может быть written".
Длл выгружается, а qip продолжает работать. У тебя такая ошибка?
5.2K
07 декабря 2006 года
SerMax
96 / / 04.11.2006
с аськой и игрой - да, они продолжает работать... НО если это вылетает в Delphi7 или в MailAgent (или ещё где-нибудь, наверное ), то они ваще выгружаются (закрываются аварийно).
257
07 декабря 2006 года
kosfiz
1.6K / / 18.09.2005
у тебя модуль Forms или какой-нибудь другой, использующий SysUtils используется? если используется, вот ошибку и выдает. на форуме тема была по поводу такой ошибки мы там с Borland_prog'ом разбирались в чем дело. я просто стал писать без SysUtils, а он дальше вроде ковырял, но результатов не знаю.
5.2K
07 декабря 2006 года
SerMax
96 / / 04.11.2006
В библиотеке используются :
Windows,
MMSystem,
Messages;

Они не содержат SysUtils, насколько я знаю (ну и смотрел сам их код).

В главной форме в uses я не объявляю SysUtils, но через другие модули он подключается...без этого там никак уж.
5.2K
08 декабря 2006 года
SerMax
96 / / 04.11.2006
хммм..что же всё-таки делать ?? SysUtils из библиотеки убрал...может попробовать вызывать окно не из главной формы, а из самой библиотеки ?? Подключить к ней модуль формы....

Я уж и OllyDbg достал...правда мало пока с ним разобрался ..
5
09 декабря 2006 года
hardcase
4.5K / / 09.08.2005
Извините, что встреваю в дискуссию.
Как я понял из разговора, проблема находится в Forms и следовательно в самой VCL.
Полагаю, если использовать KOL или вообще писать код на win32 API, можно обойти ошибку.
5.2K
09 декабря 2006 года
SerMax
96 / / 04.11.2006
!! Я как раз сейчас пытаюсь через CreateWindowEx создать окно Static Controls. Как я понял, оно не раегирует на события мышки иклавиатуры....и просто содержит какой-то текст. Это ИМЕННО то ,что мне нужно. На данный мометн разбираюсь с процессом создания.
Код:
CreateWindowEx(
  WS_EX_TOPMOST,
  STATIC,
  WinName,    // const   WinName = 'MainWClass'; //да не суть важно
  SS_Center,
  // стандартные горизонтальное, вертикальное положение, ширина и высота
  Integer(CW_USEDEFAULT),
  Integer(CW_USEDEFAULT),
  Integer(CW_USEDEFAULT),
  Integer(CW_USEDEFAULT),
  0,//нет родительского окна
  0,//нет меню
  hInstance, // handle to application instance
  nil); // no window-creation data


Ошибка с STATIC....разбираюсь, как же создать.
Но если кто-то поможет, буду очень благодарен.
257
09 декабря 2006 года
kosfiz
1.6K / / 18.09.2005
в архиве примерчик как из длл создать диалог со Static только там использовано создание диалога из ресурса с помощью DialogBoxParam. там же готовая длл a.dll вызови из неё процедуру ShowDialog и увидишь диалог. есстественно без SysUtils.
5.2K
09 декабря 2006 года
SerMax
96 / / 04.11.2006
спасибо, посмотрел. Но мне желательно сделать без использования ресурсов. Тем более, что я не знаю, как из создавать и как с ними работать :(. Создаю новую ветку по новой теме, дабы не оффтопить
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог