как изменить настройки у занятого 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;
|