Grusha
							
								Новенький 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 «  : 16-12-2010 08:29 »   | 
								
								 | 
							  
							 
							мне нужно изменять скорость и четность у открытого, другой программой, 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;
 
   
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							zubr
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #1 : 16-12-2010 09:11 »   | 
								
								 | 
							  
							 
							А почему ты считаешь, что функция SetCommState не может выдавать False? Сделай вывод в лог-файл и смотри что и в каких процессах выдает данная функция. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Grusha
							
								Новенький 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #2 : 16-12-2010 09:45 »   | 
								
								 | 
							  
							 
							я же прописываю, pPort:HWND; DCB:_DCB,  те же параметры что у исходной функции, ничего не меняю, вот и не понимаю почему false, мне кажется что в таком виде, перехвата вообще недолжно быть заметно, хендл принадлежит нужному com порту,  и еще если сделать замену, вот так, как я предполагал меня подменять скорость // в функции New_SetCommState после WriteProcessMemory(....
  GetCommState(pPort,wDCB);
  wDCB.BaudRate:= 19200; wDCB.ByteSize:= 8; wDCB.Parity:=NOPARITY; wDCB.StopBits := ONESTOPBIT;
 
  result:= SetCommState(pPort,wDCB);
 
  то результат true, но программа которая открывает com порт, просто закрывается с ошибкой "Access violation at address 0048B482 in module 'Com.exe'. Read of address 48B600F2" Com.exe эта та программа которая открывает и опрашивает com порт. "Сделай вывод в лог-файл и смотри что и в каких процессах выдает данная функция." как это сделать и что это даст объясните пожалуйста  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							zubr
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #3 : 16-12-2010 10:44 »   | 
								
								 | 
							  
							 
							Честно говоря я вообще ничего не понял. Ты перехват делаешь в своем процессе или чужом? В какой системе сие действо происходит? Если ты рабоатешь с чужим процессом, то как ты можешь определить что выдает перехватываемая функция, не используя лог-файл? Использовать для этой цели MessageBox - это очень кривое решение. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Grusha
							
								Новенький 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #4 : 16-12-2010 11:59 »   | 
								
								 | 
							  
							 
							приведу весь код, может так будет понятней  AdvBox32.dll //---------------------------------------------------------------------------------- library AdvBox32;
  uses   Windows,SysUtils;
  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; //******************************************************************************* Procedure Unhook(); var  Bytes: dword; begin   WriteProcessMemory(INVALID_HANDLE_VALUE, SetCommState_Adr, @Old_SetCommState, SizeOf(OldCode), Bytes);   WriteProcessMemory(INVALID_HANDLE_VALUE, CreateFileW_Adr, @Old_CreateFileW, SizeOf(OldCode), Bytes); end;
 
  //******************************************************************************* Function MessageProc(code : integer; wParam : word;                     lParam : longint) : longint; stdcall; begin  CallNextHookEx(0, Code, wParam, lparam);  Result := 0; end; //******************************************************************************* Procedure SetGlobalHookProc(); begin  SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0);  Sleep(INFINITE); end; //*******************************************************************************
  Procedure SetGlobalHook(); var  hMutex: dword;  TrId: dword; begin  hMutex := CreateMutex(nil, false, 'AdvareHook');  if GetLastError = 0 then  CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId) else  CloseHandle(hMutex); end;
  //******************************************************************************* procedure DLLEntryPoint(dwReason: DWord); begin   case dwReason of     DLL_PROCESS_ATTACH: begin                           SetGlobalHook();                           ii:=0;                           Randomize();                           SetHook()                         end;     DLL_PROCESS_DETACH: UnHook();   end; end;
  //******************************************************************************* begin  DllProc := @DLLEntryPoint;  DLLEntryPoint(DLL_PROCESS_ATTACH); end.
  и exe файл AdvBox.exe program AdwareBox;
  uses   Windows;
  begin  LoadLibrary('AdvBox32.dll');  SLEEP(INFINITE); end.
 
 
  перехват в чужом процессе "com.exe", в windows xp, про лог вы имеете ввиду, что нужно после снятия перехвата, сделать создание файла и запись туда значения pPort и DCB? , не особо понимю что это даст, и чем плох message box, но попробую сделать, других вариантов просто нет, спасибо  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 16-12-2010 12:36 от Джон »
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							zubr
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #5 : 16-12-2010 13:34 »   | 
								
								 | 
							  
							 
							Судя по всему прототип функции SetCommState не правильный. Я понимаю, что ты его взял из Borlandского модуля Windows, но к сожалению, я уже неоднократно замечал ошибки в прототипах функций.  Если верить MSDN, то прототип данной функции должен быть: function SetCommState(hFile: THandle; lpDCB: PDCB): BOOL; stdcall; 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Grusha
							
								Новенький 
								
								 
								  Offline
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									«  Ответ #6 : 20-12-2010 06:13 »    | 
								
								 | 
							  
							 
							все работает, спасибо вот в таком виде  function New_SetCommState(pPort:THandle;                           p_DCB:PDCB):BOOL; stdcall;
  var   Written: dword;    n_PDCB: _DCB;  adr_PDCB: PDCB;   begin  WriteProcessMemory(INVALID_HANDLE_VALUE, SetCommState_Adr,                      @Old_SetCommState, SizeOf(OldCode), Written);  //---------------------------------------------------------------
    adr_PDCB:=p_DCB;   n_PDCB:= adr_PDCB^;
    if hhPort= pPort then     begin        n_PDCB.BaudRate :=9600;        n_PDCB.Parity :=1;     end;
     Result:= SetCommState(pPort,n_PDCB);
    //---------------------------------------------------------------    WriteProcessMemory(INVALID_HANDLE_VALUE, SetCommState_Adr,                      @Jmp_SetCommState, SizeOf(far_jmp), Written);   //--------------------------------------------------------------- end;
 
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	 |