Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.12.2010, 09:01
Gudini Gudini вне форума
Прохожий
 
Регистрация: 16.12.2010
Сообщения: 1
Репутация: 10
Восклицание как изменить настройки у занятого com порта

в программе которая опрашивает устройства на com порте, нет возможности изменять настройки порта, в устройстве тоже нет такой возможности
а нужно сделать опрос, т.е. мне нужно изменять скорость и четность у открытого, другой программой, 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;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:52.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter