Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-10-2006, 15:04   #1
uReverendo
Member
 
L'Avatar di uReverendo
 
Iscritto dal: May 2006
Messaggi: 69
[C] Trovare il nome del file dal puntatore FILE

Ciao, avendo un puntatore ad una struttura FILE come è possibile recuperare il nome del file?
Ovviamente il file lo apre un'altro programma con la funzione fopen.
uReverendo è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2006, 15:17   #2
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Fammi capire...il programma A apre un file, e il programma B deve capire (dal puntatore FILE * di A) di che file si tratta?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2006, 15:17   #3
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da uReverendo
Ciao, avendo un puntatore ad una struttura FILE come è possibile recuperare il nome del file?
Ovviamente il file lo apre un'altro programma con la funzione fopen.
No, non è possibile. La struttura FILE è una struttura "opaca" (cioè il programmatore non dovrebbe ficcarci dentro il naso ) il cui contenuto, in termini di campi, può variare da piattaforma a piattaforma e -ciliegina sulla torta- non contiene alcuna informazione sul nome del file aperto.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2006, 15:21   #4
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da uReverendo
Ciao, avendo un puntatore ad una struttura FILE come è possibile recuperare il nome del file?
Ovviamente il file lo apre un'altro programma con la funzione fopen.
Ti conviene che l'altro programma apra il file usando una struct ad hoc, in questo modo:

Codice:
#define STRING_LENGHT 256

typedef struct FileStruct_t {
   char filename[STRING_LENGTH];
   FILE *fp;
} FileStruct;

...

FileStruct file;
strncpy(file.filename, "nome_del_file.ext", STRING_LENGTH);
file.fp = fopen(...);
In questomodo hai sia il puntatore che il nome del file. Non è possibile, se non erro, conoscere il nome del file dal puntatore restituito dalla fopen, per come è implementato il tutto.
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson

Ultima modifica di -fidel- : 24-10-2006 alle 15:23.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2006, 15:22   #5
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da andbin
No, non è possibile. La struttura FILE è una struttura "opaca" (cioè il programmatore non dovrebbe ficcarci dentro il naso ) il cui contenuto, in termini di campi, può variare da piattaforma a piattaforma e -ciliegina sulla torta- non contiene alcuna informazione sul nome del file aperto.
No, ma si può ottenere in maniera indiretta. Purtroppo questo non è portabile e dipende dal s/o (ho una idea di come farlo su linux, ad esempio).

Se non ho capito male però, uReverendo parla di "un'altro programma", il che complica le cose...
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2006, 15:25   #6
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da uReverendo
Ciao, avendo un puntatore ad una struttura FILE come è possibile recuperare il nome del file?
Ovviamente il file lo apre un'altro programma con la funzione fopen.

Sotto UNIX:
Utilizzando la fileno () ti puoi far ritornare il descrittore (come se avessi aperto il file con la open()). Dopo di che puoi usare la fstat() per ottenere l'i-node.

Il passaggio da i-node a nome file non dovrebbe essere difficile. E' piu' facile se conosci la directory in cui il file risiede, ovviamente.

Sotto Windows:
Mi piacerebbe proprio saperlo. Il processo di cui sopra non e' applicabile

Spero in nell'intervento di qualcuno piu' preparato, visto che e' un problema interessante (soprattutto in caso di debug di codice altrui che si dimentica di chiudere una risma di file...)
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2006, 15:27   #7
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da sottovento
Sotto UNIX:
Utilizzando la fileno () ti puoi far ritornare il descrittore (come se avessi aperto il file con la open()). Dopo di che puoi usare la fstat() per ottenere l'i-node.
Passare dall'inode al filename non è possibile, in quanto un inode può essere collegato a più filename (hard link) o a nessuno (unlink-after-open).
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12

Ultima modifica di ilsensine : 24-10-2006 alle 15:29.
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2006, 15:29   #8
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
In windows ci sarebbe la GetModuleFilename, credo funzioni anche con i file, ma comunque vuole un HANDLE come paramentro, non un puntatore di tipo FILE, per questo non l'ho proposta.

Per linux anch'io conosco un metodo, ma si basa appunto sulle tabelle del SO, quindi non è portabile...
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2006, 15:30   #9
uReverendo
Member
 
L'Avatar di uReverendo
 
Iscritto dal: May 2006
Messaggi: 69
Quote:
Originariamente inviato da ilsensine
Fammi capire...il programma A apre un file, e il programma B deve capire (dal puntatore FILE * di A) di che file si tratta?
Esatto...
Quote:
Originariamente inviato da andbin
No, non è possibile. La struttura FILE è una struttura "opaca" (cioè il programmatore non dovrebbe ficcarci dentro il naso ) il cui contenuto, in termini di campi, può variare da piattaforma a piattaforma e -ciliegina sulla torta- non contiene alcuna informazione sul nome del file aperto.
Grazie x la risposta. Ma passando il puntatore FILE a fread lui si che lo trova il file Inoltre c'è un'utility "handle" di Mark Russinovich che fa un lavoro simile (restituisce gli handle (con i rispettivi nomi) dei file aperti)
uReverendo è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2006, 15:33   #10
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da uReverendo
Esatto...
Grazie x la risposta. Ma passando il puntatore FILE a fread lui si che lo trova il file
No, trova l'handle del file, scritto in maniera opaca nella struct FILE.
E comunque, in generale, un programma non ci fa niente con il puntatore FILE * di un altro programma. Si può tentare di aggirare anche questo ostacolo, ma si entra ancor più nel complicato e s/o-dipendente.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2006, 15:35   #11
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da ilsensine
No, ma si può ottenere in maniera indiretta. Purtroppo questo non è portabile e dipende dal s/o (ho una idea di come farlo su linux, ad esempio).
Se parli del descrittore del file, è probabile che sia fattibile ma è da vedere come e su quale S.O. (non c'ho mai provato ).
Su linux anche io avrei una idea, magari stupida: dato il descrittore e il PID, andare in /proc/<num PID>/fd e vedere a cosa corrisponde il link che ha il numero del descrittore.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2006, 15:36   #12
uReverendo
Member
 
L'Avatar di uReverendo
 
Iscritto dal: May 2006
Messaggi: 69
Per chiarirci l'applicazione che apre il file non l'ho scritta io (le sto facendo un debug). Inoltre lavoro su win2000.
uReverendo è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2006, 15:37   #13
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da andbin
Se parli del descrittore del file, è probabile che sia fattibile ma è da vedere come e su quale S.O. (non c'ho mai provato ).
Su linux anche io avrei una idea, magari stupida: dato il descrittore e il PID, andare in /proc/<num PID>/fd e vedere a cosa corrisponde il link che ha il numero del descrittore.
Esattamente. Un veloce readlink e hai fatto.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2006, 15:40   #14
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da uReverendo
Per chiarirci l'applicazione che apre il file non l'ho scritta io (le sto facendo un debug). Inoltre lavoro su win2000.
Spero ti rendi conto che è una impresa titanica, se non hai i sorgenti del programma.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2006, 15:48   #15
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da ilsensine
Passare dall'inode al filename non è possibile, in quanto un inode può essere collegato a più filename (hard link) o a nessuno (unlink-after-open).
E' infatti questo la potenza degli i-node, no? Lo stesso file riferito da piu' filename. Volendo li si puo' trovare tutti

Purtroppo il problema e' da risolvere su win 2000, e su questa piattaforma mi sembra un problemone.

Buona notte a tutti
High Flying
Sottovento
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2006, 15:53   #16
uReverendo
Member
 
L'Avatar di uReverendo
 
Iscritto dal: May 2006
Messaggi: 69
Quote:
Originariamente inviato da ilsensine
Spero ti rendi conto che è una impresa titanica, se non hai i sorgenti del programma.
Certo che lo so e collegare le strutture FILE ai nomi mi agevolerebbe parecchio. Ho provato ad aprire un paio di file e ad analizzare la struttura FILE di ognuno e ho notato che l'unico membro a variare è _file che dovrebbe identificare il file univocamente.
uReverendo è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2006, 16:01   #17
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Forse puoi ricavarti gli HANDLE aperti dal processo...fidel?
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2006, 16:12   #18
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da ilsensine
Forse puoi ricavarti gli HANDLE aperti dal processo...fidel?
Se hai l'Handle al processo, basta usare la EnumProcesModules() di psapi.h (psapi.dll).
L'Handle al processo la si ricava facilmente, ad esempio con una EnumProcesses(), seguita da una OpenProcess()

EDIT: ancora meglio!! C'è una bella funzione che si chiama GetMappedFileName(). Basta passare come parametro l'Handle al processo in questione e l'indirizzo da verificare, e se questo si riferisce ad un file caricato dal processo (quindi già aperto), copia in un buffer (passato sempre come parametro) il nome del file.
La descrizione completa è qui ad esempio:
http://msdn.microsoft.com/library/de...edfilename.asp
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson

Ultima modifica di -fidel- : 24-10-2006 alle 16:17.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2006, 16:17   #19
ilsensine
Senior Member
 
L'Avatar di ilsensine
 
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
Quote:
Originariamente inviato da -fidel-
EDIT: ancora meglio!! C'è una bella funzione che si chiama GetMappedFileName(). Basta passare come parametro l'Handle al processo in questione e l'indirizzo da verificare, e se questo si riferisce ad un file caricato dal processo (quindi già aperto), copia in un buffer (passato sempre come parametro) il nome del file.
La descrizione completa è qui ad esempio:
http://msdn.microsoft.com/library/de...edfilename.asp
No funziona solo con i file in mmap...
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al
andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12
ilsensine è offline   Rispondi citando il messaggio o parte di esso
Old 24-10-2006, 16:57   #20
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da ilsensine
No funziona solo con i file in mmap...
...e comunque serve a poco, per un problema di fondo. Ho appena provato, ma la EnumProcessModules elenca, come sospettavo, solo le DLL caricate...
Purtroppo non elenca alcun handle riferito ad un file aperto...

Stavo pensando di usare i performance object, ma psapi fornisce le stesse funzionalità (per questo non li uso da secoli). Magari in quel modo si ricava qualcosa, ma dubito.

E' un grosso problema questo...
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson
-fidel- è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Airbus realizzerà altri 229 satel...
Arianespace lancerà altri satelli...
Eutelsat ha annunciato di aver affidato ...
PLD Space ha annunciato il nuovo razzo s...
CMF Clip Pro, tanta autonomia e design u...
Tre leggende del rally sbarcano in Asset...
iPhone 18 Pro Max, il chip A20 Pro mostr...
Samsung porterà il Privacy Displa...
WINDTRE BUSINESS trasforma la rete mobil...
Anthropic ammette un quarto caso di acce...
Mazda CX-6e, il primo test drive: quando...
La serie HONOR Magic 9 arriva a fine set...
Anker MagGo Power Bank 2 Pro arriva in I...
iRobot rilancia con Roomba Duo, il proto...
#linux su IRC è tornato dopo anni di sil...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 05:32.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v