Форум по 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.

Подскажите, пожалуйста что не так в коде, может быть надо делать както подругому.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
//----------------------------------------------------------------------------------
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, время: 00:13.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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