Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перехват SetCommState 
:(
    Опции темы
gud
Дата 15.12.2010, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 23.7.2008

Репутация: нет
Всего: нет



мне нужно изменять скорость и четность у открытого, другой программой, com порта.
Делаю перехват функций CreateFileW и SetCommState,CreateFileW чтобы узнать хендл порта, через SetCommState собираюсь менять DCB.Buadrate, пока хочу просто зафиксировать момент установки параметров. 

Dll перехвата взята из примера с перехватом Messagebox'ов, и она работает с Messagebox и CreateFileW, а с SetCommState в  result:= SetCommState(pPort,DCB), результат false.
Подскажите, пожалуйста, где тут ошибка и как ее исправить? 

Код

//----------------------------------------------------------------------------------
type
 OldCode = packed record
  One: dword;
  two: word;
 end;


far_jmp = packed record
  PuhsOp: byte;
  PushArg: pointer;
  RetOp: byte;
 end;

var
 hhPort:HWND;

 Jmp_CreateFileW, Jmp_SetCommState: far_jmp;
 Old_CreateFileW, Old_SetCommState: OldCode;

 CreateFileW_Adr, SetCommState_Adr: pointer;

//-----------------------------------------------------------------------------
function New_CreateFileW(  lpFileName:LPCWSTR;
                         dwDesiredAccess:DWORD;
                             dwShareMode:DWORD;
                    lpSecurityAttributes:PSecurityAttributes;
                   dwCreationDisposition:DWORD;
                    dwFlagsAndAttributes:DWORD;
                           hTemplateFile:HWND):HWND;stdcall
var
 Written: dword;
begin
  WriteProcessMemory(INVALID_HANDLE_VALUE, CreateFileW_Adr,
                     @Old_CreateFileW, SizeOf(OldCode), Written);
    
  Result := CreateFileW(lpFileName,dwDesiredAccess, dwShareMode,lpSecurityAttributes,
                                                               dwCreationDisposition,
                                                                dwFlagsAndAttributes,
                                                                      hTemplateFile);
 
  if   lpFileName='COM1' then
   begin
      MessageBox(0, 'COM1', '', 0);
      hhPort:=Result;
   end;
   
  WriteProcessMemory(INVALID_HANDLE_VALUE, CreateFileW_Adr,
                     @Jmp_CreateFileW, SizeOf(far_jmp), Written);
//-------------------------------------------------------------------------
function New_SetCommState(pPort:HWND; DCB:_DCB):LongBool; stdcall;
var
 Written: dword;
 wDCB:_DCB;
begin
 WriteProcessMemory(INVALID_HANDLE_VALUE, SetCommState_Adr,
                     @Old_SetCommState, SizeOf(OldCode), Written);

{здесь,pPort =hhPort, DCB.baudrate выдает непонятное число ,а GEtCommState(pPort,wDCB) в wDCB.baudrate установленную скорость 19200
}
  result:= SetCommState(pPort,DCB);

//? здесь result=false

   WriteProcessMemory(INVALID_HANDLE_VALUE, SetCommState_Adr,
                     @Jmp_SetCommState, SizeOf(far_jmp), Written);

end;
//----------------------------------------------------------------------
Procedure SetHook();
var
 hkernel32: dword;
 Bytes: dword;

begin
   hkernel32 := GetModuleHandle('kernel32.dll');

  CreateFileW_Adr  := GetProcAddress(hkernel32, 'CreateFileW');
  SetCommState_Adr  := GetProcAddress(hkernel32, 'SetCommState');

  ReadProcessMemory(INVALID_HANDLE_VALUE, CreateFileW_Adr, @Old_CreateFileW, SizeOf(OldCode), Bytes);
  ReadProcessMemory(INVALID_HANDLE_VALUE, SetCommState_Adr, @Old_SetCommState, SizeOf(OldCode), Bytes);

  Jmp_CreateFileW.PuhsOp  := $68;
  Jmp_CreateFileW.PushArg := @New_CreateFileW ;
  Jmp_CreateFileW.RetOp   := $C3;

  Jmp_SetCommState.PuhsOp  := $68;
  Jmp_SetCommState.PushArg := @New_SetCommState;
  Jmp_SetCommState.RetOp   := $C3;

  WriteProcessMemory(INVALID_HANDLE_VALUE, CreateFileW_Adr, @Jmp_CreateFileW, SizeOf(far_jmp), Bytes);
  WriteProcessMemory(INVALID_HANDLE_VALUE, SetCommState_Adr, @Jmp_SetCommState, SizeOf(far_jmp), Bytes);
end;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0701 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.