Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Injecting library [D7, WinXP]


Wiz@rd ©   (2004-03-21 18:29:00) 

Есть длл которую inject'или в процесс как туда (етой длл) передать данные (в виде структуры) - в котрой обязательно будут строки - пробовал через CreateFileMapping - но работаент только с dll загруженной нормальным способом - чувствую надо как-то через
VirtualAllocEx и WriteProcessMemory в чужом процессе - но как это потом найти эти данные этой dll в процессе, может ещё какие способы приемлемы типа DDE - у кого есть рабочий пример поделитесь - срочно нужно. Огромное спасибо!


Wiz@rd   (2004-03-22 17:20:00) [1]

Thx, щас попробую


BiN   (2004-03-22 17:18:00) [2]

как это применить для CreateFileMapping... Догадываюсь что ReadFile, WriteFile... Так?

нет. достаточно Move
типа

P:=CommonArea;
Move(DataSize, P^, sizeof(Datasize);
Inc(PByte(P), SizeOf(DataSize));
Move(Data, P^, DataSize);
Inc(PByte(P), DataSize);
и т.д.


Wiz@rd   (2004-03-22 17:12:00) [3]

Относительно [4] - как это применить для CreateFileMapping... Догадываюсь что ReadFile, WriteFile... Так?


BiN   (2004-03-22 11:27:00) [4]

Как ты думаешь, чему у тебя равен  SizeOf(CommonArea).

Ты, кстати, можешь решить свою проблему, используя ShortString,
если длина Subject у тебя не привышает 256 байт.
А пример записи данных произвольного размера я тебе в общих чертах дал в [4].

Да, и воизбежание конфликта имен используй разные значения в  CreateFileMapping и RegisterWindowMessage (пусть меня поправят, если я не прав).


Wiz@rd   (2004-03-22 10:30:00) [5]

P.P.S. Это модуль обмена - который компилится и в лоадере и в dll...


Wiz@rd   (2004-03-22 10:29:00) [6]

packed record - это я в натуре погорячился... Может кто писал Inject library - с которой происходил обмен данными, а то во всех подобных пример есть только сам процесс injectin'га. Если у кого есть рабочий пример поделитесь... И такой вопрос CreateFileMapping может записывать записи с динамичискими структурами или нет?
Вот пример может так понятней (прога лоадер - инициализирует структуру (FillChar например), а dll просто читает):

 type
   PHookInfo = ^THookInfo;
   THookInfo = record
     i: Integer;
     Subject: String;
   end;

 var
   WMHook: Integer = 0;
   CommonArea: PHookInfo = NIL;

implementation

var
  Mapping: THandle = 0;

const
  UniqueId = '{4FFDE751-D5A2-4D26-AE17-B3795854817F}';

initialization
  Mapping := CreateFileMapping(DWORD (-1), NIL, PAGE_READWRITE, 0, SizeOf(CommonArea), UniqueId);
  CommonArea := MapViewOfFile(Mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  WMHook := RegisterWindowMessage(UniqueId);

finalization
  if Assigned(CommonArea) then
    UnmapViewOfFile(CommonArea);
  if Mapping <> 0 then
    CloseHandle(Mapping);
end.

P.S. Может есть ещё подобные способы обмена данными?


BiN   (2004-03-22 09:47:00) [7]

Во-первых, директива packedrecord теряет смысл при использовании динамических строк.
Во-вторых, чтобы записать данные произвольной длины (конечно же меньшей чем размер созданного тобой MMF) лучше всего использовать такую схему записи
write DataSize
write Data //символы, цифры, разная лабуда.. :)
write I и т.д.
случае же с sharemem (см. [2]) придется за собой таскать BORLANDMM.DLL


Wiz@rd   (2004-03-22 01:10:00) [8]

Если пишу GetMem (Struct, ...) и ZeroMemory (Stcruct, ...) все без ошибок - но в полях нули, если без GetMem - то поля например типа Integer нормально работают, а String & Pointer'ы с ошибками
(String'и инициализирую SetLength'ом)...


Cobalt   (2004-03-22 00:24:00) [9]

> но работаент только с dll загруженной нормальным способом

Имхо, это у васм где-то ошибка в использовании строк (?)
Попробуйте прописать в Library  uses sharemem;


Wiz@rd   (2004-03-21 18:30:00) [10]

т.е. структура типа

Struct = packed record
 S1: String;
 I: Integer;
end;

Как ее передать и считать


Наверх

Титульная страница Поиск, карта сайта Написать письмо