Newsgroup: it.comp.programmare.win32
Titolo: Leggere ad un determinato indirizzo di memoria.

Ho la necessità di leggere il contenuto di un determinato indirizzo di
memoria (in particolare 0000:0408 che contiene l'indirizzo di LPT1).
Sotto DOS avrei scritto una cosa simile:
...
unsigned int far *ptraddr;  
ptraddr=(unsigned int far *)0x00000408;
...
eccetera.
Utilizzando lo stesso codice sotto windows 95 (utilizzando il VC++ 5)
il programma abortisce. Immagino il problema stia nel fatto che
windows usa la modalità protetta, ma io non so come funziona.
Qualcuno mi può aiutare?
GRAZIE
Daniele

Sotto DOS avrei scritto una cosa simile:
Vuoi poter leggere ad un qualsiasi indirizzo di memoria (quasi impossibile) o
parlare con la parallela?
_mirko_
PS: Se volete contattarmi in privato, NON ciucciatevi il calzino :).

parlare con la parallela?
Beh, vorrei prima conoscere l'indirizzo a cui sta la parallela (non su
tutte le macchine è lo stesso) e per fare questo dovrei andare a dare
un'occhiata all'indirizzo specificato nel primo messaggio. Una volta
che conosco l'indirizzo dovrei poi mandare/ricevere dati dalla porta. 
Il problema è che mentre il DOS mi permetteva di andare a curiosare
nella memoria (magari anche utilizzando porzioni di codice assembly),
sembra che windows non voglia. Non c'è modo di andare a sbirciare la
memoria di windows95 col VC++5 , senza dover tirare in ballo i VxD
(spero di non sbagliare: li ho sentiti solo nominare...)?
In alternativa: esiste una funzione windows che mi dice a quale
indirizzo sta la LPT1?


Scordati di poter accedere a un indirizzo di memoria fisica
semplicemente giocando con i puntatori, la gestione della memoria e'
fatta in modo completamente diverso dal dos.
Per il dos: mem_fis=sel_seg*16+offset. 
In Win32 c'e' la segmentazione e la paginazione, e' tutto molto piu'
complicato.
Se vuoi accedere ai registri della porta parallela e pilotarla
direttamente ti serve un VXD. 
Se lavori sotto NT prova a scaricare dalla rete all'idirizzo:
http://www.einev.ch/references/mondada/mmp/
un driver generico per l'accesso all'I/O.
Ma sei sicuro che questo ti serva sul serio oppure non ti basta aprire
il device come un file per poi scriverci/leggerci i byte che ti pare?
Ciao.
-- 
     (ZZZ)       Filippo Salotti, Bagni di Lucca, Lucca, Italy.
    //   \\  _                 E-mail : 
fil...@humnet.unipi.it
   /Y\    ZD<_o===============================================o
 .oZZZZZo.     | Studente Ingegneria Informatica Automatica  |
<OXXXXXXXO>    | Dip. Sistemi Elettrici Universita' di Pisa. |

indirizzo sta la LPT1?
* Hai solo voglia di "cazzeggiare" o devi risolvere un problema specifico?
* Qual'e` la domanda? Usare la parallela o razzolare in memoria?
Se vuoi leggere e scrivere sulla parallela usa la CreateFile(_T("LPT1"), ... etc
etc, se vuoi stampare usa un driver di stampa, se vuoi razzolare nel torbido
della RAM scriviti qualcosa che giri a ring0.
Il tuo problema e` l'approccio DOS :) in windows 95 o peggio NT (comunque direi
in +o- tutti i SO a 32 bit) scordati le scorribande tra irq registry porte etc
(a meno che tu non debba scrivere un driver).
Se sei a digiuno di Windows (come sembra) lascia perdere per un momento i vxd e
le scorribande in memoria e passa un po' di tempo ad ambientarti e a cercare di
capire la "logica" del SO.


capire la "logica" del SO.
Guarda che io l'avevo detto fin dal primo post che i VxD li volevo
evitare!
Ciao
Daniele.

evitare!
oooops.
ciao, Mirko
ps: spero di essere stato di aiuto, almeno un po'. E di non aver mischiato
troppi argomenti in maniera confusionaria @:)


 evitare!
La possibilta' di utilizzare le risorse al livello che vuoi c'e': ti
scivi un VxD in C/C++ a ASM e sei a posto. 
Se vuoi utilizzare risorse a basso livello non puoi certo pensare di
lavorare ad un alto livello di astrazione (perche' e' un controsenzo).
Come si dice dalle mie parti: non si possono fare le nozze coi fichi
secchi...


troppi argomenti in maniera confusionaria @:)
GRAZIE mille...
Daniele.

tasche da studente non mi consentono l'abbonamento...
Ne esiste una versione per studenti a prezzo "ridotto".
ciao


Ne esiste una versione per studenti a prezzo "ridotto".
Se posso ne faccio senza... 
Comunque toglimi una curiosità: mi sembra di aver capito che mentre
una volta (in DOS) io potevo linkare codice oggetto compilato magari
in parte con C++ e in parte con l'assembler, in windows95 questo non è
più possibile. Per utilizzare moduli compilati in assembler, devo per
forza usare il DDK (e creare quindi un VxD)?
GRAZIE
Daniele.

forza usare il DDK (e creare quindi un VxD)?
L'asm inline lo puoi sempre usare con _asm { } dentro il codice c/c++; avendo
masm invece si possono linkare obj con "provenienze" diverse (vero?).
Sei/siamo arrivati al punto finalmente :)
A presto.


Era una tranquilla notte di regime, ma _mirko_ disse:
Aridaje, ma che continui a parlare da solo?
Comunque altro modo (pulito e comp con NT, credo) è quello di aprire la porta
con CreateFile, come sospettavo dall'inizio, e usare quindi DeviceIoControl per
impostare la porta ed altri parametri. 
Vi scrivo nuovamente perche` me ne ha dato la sicurezza il sito MS
(
ftp.microsoft.com/softlib/mslfiles/portio.exe
) 
Le funzioni _inp e _outp sono chiaramente li` solo per compatibilita` ed offrono
un supporto parziale.
_mirko_
--
Knowledge is power.
"ciucciati.il.calzino" is antispam.