|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
как изменить настройки у занятого 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; |