Новичок
Профиль
Группа: Участник
Сообщений: 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;
|
|