Newsgroup: it.comp.programmare.win32
Titolo: Come si cattura una linea seriale?

ciao a tutti, sono nuovo o quasi del NG
vorrei realizzare un programma che filtri quello che un altro programma
trasmette o riceve dalla linea seriale.
mi serve per modificare i dati scambiati tra una utility e un telefono
cellulare.
in pratica dovrebbe mettersi in mezzo tra utility e porta seriale come fanno
i programmi di monitor per linee seriali (tipo SerialMonitor della
HHDsoftware)
le mie conoscenze di windows sono molto scarse, e come compilatore uso
VC++5.0, non ho il DDK, e spero non serva.
da dove si comincia?
ciao
ilmira

 da dove si comincia?
giusto da quello che non hai.. dal ddk :)
buon download
antonio

 cellulare.
Metti fra PC e telefono un terzo PC con due porte seriali. Scrivi un
semplice programma che tutto cio' che riceve da una seriale lo manda
all'altra e viceversa. Chiaramente il programma fa anche un log su file.
Ti basta sapere i settagi della seriale: baud-rate, bit di stop, parita',
ecc...
In bocca al lupo!
Federico.

 Metti fra PC e telefono un terzo PC con due porte seriali.
ci avevo pensato, anzi dal momento che cio' che dovrei filtrare e' in una
sola direzione (da cellulare a PC), avevo pensato di usare l'altra porta com
del PC. Il problema e' che l'utility in questione cambia velocita' di
trasferimento durante lo scambio dati, e mi sa tanto che lo fa proprio per
autoprotezione. Quindi l'uso di un'altra com lo avevo escluso per
l'impossibilita' di sapere come e quando avviene il cambio di baudrate.
dal momento che non devo fare nulla di particolare, siamo sicuri che c'e'
proprio bisogno del DDK per farlo?
ciao
ilmira

 proprio bisogno del DDK per farlo?
Beh se preferisci puoi sempre fare uno sniffer seriale..
in modo abbastanza semplice.
compri uno spinotto femmina seriale, uno spinotto maschio e un cavetto 
seriale null modem.
Tagli il cavetto seriale (da una parte), prendi i fili e li saldi ai 
corrispettivi poli dello spinotto femmina, poi fai il collegamento con 
lo spinotto maschio.. e così con un semplice hyper terminal dovresti 
aver risolto con lo sniffer (ovviamente magari ti servirà qualcos'altro 
per evitare di perdere il segnale nel collegamento.. non è che io sia 
molto pratico di elettronica).
Apparte questo, per quale motivo i 2 dispositivi (PC e MODEM) dovrebbero 
cambiare la velocità del protocollo di comunicazione? Entrambi i 
dispositivi hanno interesse a comunicare alla massima velocità 
possibile.. magari il modem gsm potrebbe abbassare la propria velocità 
in fase di uscita ... solitamente magari con un messaggio informativo 
del genere +CONNECT 19200 o +CONNECT 9600 (che essendo un gsm non 
dovrebbe cmq mai superare i 9600 in fase di dialogo vero e proprio...).
saluti
antonio

 cellulare.
Se ti serve perchè ti serve come applicazione, ne trovi tanti di già fatti.
Cerca serial monitor su google.
Il loro funzionamento si basa su un driver che installa un hook per 
intercettare ciò che passa sulla seriale.
Alcuni usano due seriali ma ovviamente è alquanto scomodo.
-- 
Raffaele Rialdi
Roadshow developer security ... adesso si va a Udine e poi Palermo
http://www.microsoft.com/italy/msdn/eventi/developer/securitytour.mspx
Microsoft .NET MVP 
http://mvp.support.microsoft.com
 -
http://italy.mvps.org
 UGIdotNET - User Group Italiano .NET
http://www.ugidotnet.org
 Weblog: 
http://blogs.ugidotnet.org/raffaele

 intercettare ciò che passa sulla seriale.
bravo, e' proprio questa la parte che vorrei spiegata con maggiore
dettaglio.
ciao
ilmira

 cambiare la velocità del protocollo di comunicazione?
il motivo credo sia proprio eludere "sniffer seriali" come quello che mi hai
proposto.
l'utility in questione serve per aggiornare il firmware di un telefono
cellulare, solo che nelle fasi iniziali fa un controllo sul numero di
versione del firmware esistente sul telefono e non prosegue se non e' quello
giusto, il che sarebbe corretto se io stessi cercando si aggiornarlo con un
firmware di un altro modello, ma non e' corretto se invece il firmware
esistente ha un altro numero di versione solamente perche' la TIM lo ha
personalizzato.
ciao
ilmira

 
Normalmente questo avviene per garantire la compatibilità retroattiva 
tra diversi tipi di device.
Il programma parte con la velocità più bassa (compatibile con tutti i 
device) e la alza dopo aver riconosciuto il dispositivo collegato.
Per capire la velocità puoi usare un oscilloscopio e vedere quanto dura 
un singolo bit.
-- 
Valter Minute
vmi...@inwind.it
 (the reply address of this message is invalid)

 
http://www.sysinternals.com/Utilities/Portmon.html
forse questo ti può bastare ?

 forse questo ti può bastare ?
mi fa solo capire, che anche se mi scarico il DDK non ci arrivero' mai,
perche' non credo che basti leggersi come si usan le funzioni ZwCreateFile e
IoAttachDeviceByPointer (obsoleta) per realizzare il programma. :-)
tu hai installato il DDK? mi sai dire se c'e' un esempio che faccia cio' che
mi serve?
oppure non e' che saresti in grado di fare/recuperare lo scheletro di un
programma simile?
sai, la mia conoscenza di windows non e' elevata, non vorrei scaricarmi
centinaia di MByte per fare un buco nell'acqua.
ciao
ilmira


la velocita' la vedo dai programmi di monitor (tipo portmon che mi hanno
consigliato in un altro post).
in questo caso specifico e' proprio una protezione.
la velocita' viene impostata a 115200 all'inizio poi abbassata a 57600
(nota: tra un blocco di dati ricevuto e il seguente senza trasmettere nulla
nel mentre)
e poi rialzata a 115200 dopo un pochi blocchi di dati.
ciao
ilmira

 
Se il numero di blocchi trasmessi a velocità inferiore è costante, non 
vedo il problema.
Non capisco perchè basare un meccanismo di protezione sulla velocità di 
trasmissione. Se non si trasmette nulla la commutazione deve essere 
calcolabile sia da chi trasmette che da chi riceve e quindi deve essere 
basata su qualche dato noto a entrambi.
Se cambia a ogni tentativo e tutti i dati precedenti sono identici, 
allora deve essere basato su data/ora o qualcosa di simile.



e' solo una mia supposizione, non ho informazioni sicure che sia veramente
cosi'.
Questo e' quello che si vede usando SerialMonitor della HHDsoftware (chiedo
scusa per la lunghezza del post):
**********************************
IO Control: 13/06/2005 21.13.13.328125064 (+1.3906250000 seconds)
DOWN (0x00000000): IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate
  Baud Rate=115200
Richiesta:13/06/2005 21.13.13.343750064 (+0.0156250000 seconds)
 02 04 D2 05 00 4A 9B 03 02 04 D2 05 00 4A 9B 03   ..Ò..J>...Ò..J>.
 41 54 0D 0A                                       AT..
Risposta:13/06/2005 21.13.14.140625064 (+0.0000000000 seconds)
 0D 0A 4F 4B 0D 0A                                 ..OK..
Richiesta:13/06/2005 21.13.14.140625064 (+0.0000000000 seconds)
 41 54 2B 4B 49 50 52 3D 31 31 35 32 30 30 0D 0A   AT+KIPR=115200..
Risposta:13/06/2005 21.13.14.156250064 (+0.0156250000 seconds)
 0D 0A 4F 4B 0D 0A                                 ..OK..
Richiesta:13/06/2005 21.13.14.156250064 (+0.0000000000 seconds)
 41 54 0D 0A                                       AT..
Risposta:13/06/2005 21.13.14.156250064 (+0.0000000000 seconds)
 0D 0A 4F 4B 0D 0A                                 ..OK..
Richiesta:13/06/2005 21.13.14.156250064 (+0.0000000000 seconds)
 02 04 D2 05 00 4A 9B 03                           ..Ò..J>.
Risposta:13/06/2005 21.13.14.171875064 (+0.0156250000 seconds)
 02 06 D2 05 01 3E 0F 6C 8F 03                     ..Ò..>.l .
Richiesta:13/06/2005 21.13.14.171875064 (+0.0000000000 seconds)
 02 04 D2 05 00 BF 6E 03                           ..Ò..¿n.
Risposta:13/06/2005 21.13.14.171875064 (+0.0000000000 seconds)
 02 04 D2 05 01 B9 69 03                           ..Ò..¹i.
IO Control: 13/06/2005 21.13.14.171875064 (+0.0000000000 seconds)
DOWN (0x00000000): IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate
  Baud Rate=57600
 02 8A 00 08 80 00 00 00 00 00 00 00               .S..?.......
Richiesta:13/06/2005 21.13.14.343750064 (+0.0000000000 seconds)
 02 04 00 04 00 00 03 01                           ........
Risposta:13/06/2005 21.13.14.343750064 (+0.0000000000 seconds)
 02 DD 00 08 80 00 03 01 56 01 01 03 02 8A 00 08   .Ý..?...V....S..
 80 00 00 00 00 00 00 00                           ?.......
Richiesta:13/06/2005 21.13.14.343750064 (+0.0000000000 seconds)
 02 B4 00 18 00 00 02 00 00 01 C2 00 00 01 C2 00   .´........Â...Â.
 00 00 00 03 00 00 00 00 00 00 0F A0               ...........
IO Control: 13/06/2005 21.13.14.359375064 (+0.0156250000 seconds)
DOWN (0x00000000): IOCTL_SERIAL_SET_BAUD_RATE: Set baud rate
  Baud Rate=115200
Risposta:13/06/2005 21.13.14.359375064 (+0.0000000000 seconds)
 02 8A 00 08 80 00 00 00 00 00 00 00               .S..?.......
Richiesta:13/06/2005 21.13.14.359375064 (+0.0000000000 seconds)
 02 07 00 04 00 00 03 02                           ........
Risposta:13/06/2005 21.13.14.359375064 (+0.0000000000 seconds)
 02 8F 00 0C 80 00 03 02 FF FF FF FF FF FF FF FF   . ..?...ÿÿÿÿÿÿÿÿ
 02 8A 00 08 80 00 00 00 00 00 00 00               .S..?.......
**********************************
si nota che:
- quando cambia da 115200 a 57600 la risposta viene letta meta' ad una
velocita e meta' nell'altra
- quando ritorna a 115200 la richiesta viene fatta a 57600 la risposta viene
letta a 115200
il blocco di dati a velocita' ridotta e' in effetti sempre lo stesso, ma piu
in la' con la trasmissione potrebbero essercene degli altri, infatti come ho
scritto per ora l'utility arriva a controllare la versione del firmware e
non essendo quella giusta si blocca, chissa cosa fa quando invece il check
va a buon esito.
Io non vorrei preoccuparmi di interpretare cio' che utility e telefono si
dicono, allo scopo di capire quando la trasmissione cambia velocita', ecco
perche' pensavo ad un programma filtro, messo in catena via software sulla
stessa linea seriale dell'utility e non uno sniffer collegato in hardware
tra PC e telefono.
ciao
ilmira