View Full Version : [Win32Api] Creare Unità Disco in Windows
Ciao a tutti,
è da tempo che mi balena per la testa l'idea di far un programmino che crei un'unità disco in windows che si appoggia a un FTP remoto.
Qualcuno di voi ha mai lavorato con le API di windows che consentono di definire unità disco "virtuali"?
Per far questo genere di software ipotizzo sia necessario usare C++ con le API Win32.
Si può usare Visual C++ .net versione Express?
Grazie
con le Win32 non puoi creare un'unità disco virtuale vera e propria (scusa l'ossimoro :D), ma al massimo puoi creare una cartella virtuale nel namespace della shell; ciò significa che in explorer (non il browser) vedrai un'unità disco che però non sarà associata ad una lettera d'unità e gli altri programmi non potranno usare dei normali path per accedere ai files virtuali.
per creare un'unità disco virtuale devi realizzare un driver.
Sì esatto, credo che serva una specie di driver per un "disco".
Cercando su google ho trovato alcuni forum dove si dice che è un lavoro molto ma molto difficile il solo creare una finta unità disco.
ilsensine
13-03-2008, 15:03
Qualcuno di voi ha mai lavorato con le API di windows che consentono di definire unità disco "virtuali"?
Un disco virtuale ha caratteristiche diverse, è uno storage di "blocchi" che possono contenere un file system. A te serve un driver file system.
E' stata proposta più volte una versione di fuse per Windows, che renderebbe disponibili "gratuitamente" i driver fuse già esistenti per Linux e Mac (compreso il fuseftp). Purtroppo però tra il dire e il fare c'è di mezzo il codice, e nessuno ha ancora preso la tastiera in mano per farlo. Vuoi offrirti come volontario? :)
Un disco virtuale ha caratteristiche diverse, è uno storage di "blocchi" che possono contenere un file system. A te serve un driver file system.
E' stata proposta più volte una versione di fuse per Windows, che renderebbe disponibili "gratuitamente" i driver fuse già esistenti per Linux e Mac (compreso il fuseftp). Purtroppo però tra il dire e il fare c'è di mezzo il codice, e nessuno ha ancora preso la tastiera in mano per farlo. Vuoi offrirti come volontario? :)
Per fare un'unità disco che mappa un FTP/SFTP remoto che credo che serva qualcosa per dire a windows che esiste un'unità disco in modo da farla apparire in risorse del computer.
Fatto questo quando uno clicca su quel disco, il nostro codice dovrebbe far un listing dei file remoti e quindi popolare una struttura di oggetti che windows si aspetta di ricevere in prativa file&cartelle.
Il filesystem si ridurrebbe in pratica al mapping tra le risorse che si vedono in questa unità con i vari listing del FTP/SFTP remoto.
Il punto di partenza sarebbe fregarsene del mapping dei file remoti.. e mostrare qualche file/cartella in questo disco virtuale.
Cmq uno che su un Newsgroup aveva chiesto qualcosa di simile per far leggere a windows il ReiserFS è stato caldamente sconsigliato di lanciarsi n questa sfida.
EDIT:
cercando di riassumere.. servirebbe come base di partenza un codice che crea una finta unità disco con dentro finti file/cartelle.
Mi è venuto in mente che truecrypt (che è opensource) fa quello che mi servirebbe, crea un disco virtuale a partire da un file.
sarebbe da vedere se il codice a riguardo è comprensibile o meno per estrarre solo la parte necessaria.
http://www.truecrypt.org/downloads2.php
ilsensine
13-03-2008, 16:00
Per fare un'unità disco che mappa un FTP/SFTP remoto che credo che serva qualcosa per dire a windows che esiste un'unità disco in modo da farla apparire in risorse del computer.
Ah ok intendevi quello per "disco". Io pensavo a un disco classico (anche virtuale), inteso come unità di storage a blocchi.
Quello che vedi in risorse del computer non è un "disco", ma una partizione, un file system virtuale (come una unità subst o il contenuto di un ramdisk), ecc.
Magari tolgo tutto il divertimento, pero' potresti provare a valutare questo
http://www.softpedia.com/get/Internet/Servers/FTP-Servers/FTPDrive.shtml
E' free e dovrebbe funzionare anche sotto Vista.
Ah ok intendevi quello per "disco". Io pensavo a un disco classico (anche virtuale), inteso come unità di storage a blocchi.
Quello che vedi in risorse del computer non è un "disco", ma una partizione, un file system virtuale (come una unità subst o il contenuto di un ramdisk), ecc.
sì ora che ci penso il nome corretto credo sia "unità logica".
insomma, vorrei sapere quali sono le chiamate a funzioni base per far vedere a windows un'unità logica e dei contenuti di prova file/cartelle.
Magari tolgo tutto il divertimento, pero' potresti provare a valutare questo
http://www.softpedia.com/get/Internet/Servers/FTP-Servers/FTPDrive.shtml
E' free e dovrebbe funzionare anche sotto Vista.
Sì è quello che vorrei fare :)
Sì esatto, credo che serva una specie di driver per un "disco".
Cercando su google ho trovato alcuni forum dove si dice che è un lavoro molto ma molto difficile il solo creare una finta unità disco. esattamente, e ora rettifico il mio precedente post: concordo con ilsensine, a te non serve creare una unità disco virtuale (non solo almeno) ma un file system virtuale; però non so se sia possibile realizzare il tutto esclusivamente tramite un FSD (File System Driver), potresti aver bisogno anche di un altro driver che crea il disco virtuale.
su Windows creare file systems è un'impresa a dir poco titanica non solo per la complessità intrinseca della cosa, ma anche e soprattutto per le curve di apprendimento "verticali" tipiche di Microsoft (specialmente in kernel-mode) :D nonché per il fatto che il kit per scrivere file systems, comprensivo di headers, librerie e documentazione, è solo parzialmente gratuito, la parte fondamentale (compreso ciò che penso serva anche a te) si paga e costa pure tanto :mc:
è per quest'ultimo motivo che qui non troverai nessuno che ti possa dare informazioni tecniche precise, e che secondo me faresti bene a rinunciare alla possibilità di creare una lettera d'unità virtuale limitandoti a creare una finta cartella nel namespace della shell.
esattamente, e ora rettifico il mio precedente post: concordo con ilsensine, a te non serve creare una unità disco virtuale (non solo almeno) ma un file system virtuale; però non so se sia possibile realizzare il tutto esclusivamente tramite un FSD (File System Driver), potresti aver bisogno anche di un altro driver che crea il disco virtuale.
su Windows creare file systems è un'impresa a dir poco titanica non solo per la complessità intrinseca della cosa, ma anche e soprattutto per le curve di apprendimento "verticali" tipiche di Microsoft (specialmente in kernel-mode) :D nonché per il fatto che il kit per scrivere file systems, comprensivo di headers, librerie e documentazione, è solo parzialmente gratuito, la parte fondamentale (compreso ciò che penso serva anche a te) si paga e costa pure tanto :mc:
è per quest'ultimo motivo che qui non troverai nessuno che ti possa dare informazioni tecniche precise, e che secondo me faresti bene a rinunciare alla possibilità di creare una lettera d'unità virtuale limitandoti a creare una finta cartella nel namespace della shell.
Sul readme di truecrypt (che implementa una roba simile a quella che ho pensato) come tool per compilarlo segnala:
Requirements for Building TrueCrypt for Windows:
------------------------------------------------
- Microsoft Visual C++ 2005 SP1 (Professional Edition or compatible)
- Microsoft Visual C++ 1.52
- Microsoft Windows Driver Kit for Windows Vista (build 6000)
- Microsoft Windows SDK 6.0 (integrated with Visual Studio)
- NASM 0.99 assembler
- Yasm assembler
- gzip compressor
Cosa tra questi costa tanto?
Magari tolgo tutto il divertimento, pero' potresti provare a valutare questo
http://www.softpedia.com/get/Internet/Servers/FTP-Servers/FTPDrive.shtml
E' free e dovrebbe funzionare anche sotto Vista.
quoto dalla descrizione:
FtpDrive can intercept opening ftp:// links from other applications--simple press Ctrl key while opening ftp:// path and it will be opened on FtpDrive. FTP Drive is compatible with many applications, except those, that use own drivers to access files. tutto ciò mi fa sospettare (sospettare? diciamo che è una confessione palese :)) che abbiano preso la strada "facile", ovvero l'intercettazione delle API native (classica tecnica da sedicenti grandi hackers). non hanno nemmeno lontanamente realizzato un FSD, e se l'avessero fatto non avrebbero dato via gratis un lavoro che gli sarebbe costato MOLTO tempo e molto denaro; a meno che non era un team di decine di persone.
sto programma ha un'aria decisamente schifosa :asd: non lo installerei mai sul mio computer e, BTW, che funzioni su Vista non ci giurerei :)
Sul readme di truecrypt (che implementa una roba simile a quella che ho pensato) come tool per compilarlo segnala:
Requirements for Building TrueCrypt for Windows:
------------------------------------------------
- Microsoft Visual C++ 2005 SP1 (Professional Edition or compatible)
- Microsoft Visual C++ 1.52
- Microsoft Windows Driver Kit for Windows Vista (build 6000)
- Microsoft Windows SDK 6.0 (integrated with Visual Studio)
- NASM 0.99 assembler
- Yasm assembler
- gzip compressor
Cosa tra questi costa tanto? non so se attualmente il WDK (Windows Driver Kit) sia a pagamento o meno (cambia da periodo a periodo), ma non è quello il problema; conosco benissimo TrueCrypt (ottimo prodotto :D) ma non fa esattamente quello che vorresti fare tu. a te il Driver Kit non basta, ti serve anche l'Installable File System Kit, e quello gratis purtroppo non l'ho mai visto :cry:
non so se attualmente il WDK (Windows Driver Kit) sia a pagamento o meno (cambia da periodo a periodo), ma non è quello il problema; conosco benissimo TrueCrypt (ottimo prodotto :D) ma non fa esattamente quello che vorresti fare tu. a te il Driver Kit non basta, ti serve anche l'Installable File System Kit, e quello gratis purtroppo non l'ho mai visto :cry:
Perchè non fa quello che vorrei fare io? che differenza c'è?
Riguardo TrueCrypt il codice fondamentale per creare questa "unità logica" credo sia quello dentro: "TrueCrypt 5.1 Source\Driver"
SOURCES = \
DriveFilter.c \
EncryptedIoQueue.c \
Ntdriver.c \
Ntvol.c \
Driver.rc
ilsensine
13-03-2008, 21:23
esattamente, e ora rettifico il mio precedente post: concordo con ilsensine, a te non serve creare una unità disco virtuale (non solo almeno) ma un file system virtuale; però non so se sia possibile realizzare il tutto esclusivamente tramite un FSD (File System Driver), potresti aver bisogno anche di un altro driver che crea il disco virtuale.
Non necessariamente; almeno su linux un fs deve dichiarare se ha bisogno o meno di un backing dev. Richiedere un disco - virtuale o meno - renderebbe alquanto complicato lo sviluppo di fs che per loro natura non possono usarlo, come i file system di rete. Non vedo perché windows debba fare eccezione.
su Windows creare file systems è un'impresa a dir poco titanica
E' titanica ovunque, per questo sarebbe utile che qualche anima pia prenda coraggio e porti fuse anche su windows (con i python binding, mi immagino il cdimaurofs :asd: )
Non necessariamente; almeno su linux un fs deve dichiarare se ha bisogno o meno di un backing dev. Richiedere un disco - virtuale o meno - renderebbe alquanto complicato lo sviluppo di fs che per loro natura non possono usarlo, come i file system di rete. Non vedo perché windows debba fare eccezione.
E' più o meno quello che mi fa pensare che truecrypt sia simile a un'applicazione che legge il filesystem da web.
In fin dei conti truecrypt (quando la il finto filesystem criptato sta su un file di ntfs) uusa come "sorgente dei dati" chiamate di lettura/scrittura standard di windows, e quindi quella parte viaggia tutta a "ring3".
Anzi truecrypt credo sia molto più potente di quello che ipotizzerei di fare visto che truecrypt è in grado di gestire intere partizioni criptate a modo suo.. e quindi va a definire penso una sua specie di "filesystem".
E addirittura nelle ultime versioni consente di far partire windows stesso da una partizione completamente criptata.
ilsensine
13-03-2008, 21:41
E' più o meno quello che mi fa pensare che truecrypt sia simile a un'applicazione che legge il filesystem da web.
E' interessante notare che TrueCrypt usa fuse sui sistemi che lo supportano (linux/mac/*bsd).
Tutto il necessario per windows, se ti interessa, sta credo nella directory Driver.
Perchè non fa quello che vorrei fare io? che differenza c'è? TrueCrypt non lavora a livello di file system, ma di raw bytes: legge lo stream di bytes e lo cripta; a te non serve di vedere i bytes, a te serve di vedere files, directories, sottodirectories, e contenuti di files.
Non necessariamente; almeno su linux un fs deve dichiarare se ha bisogno o meno di un backing dev. Richiedere un disco - virtuale o meno - renderebbe alquanto complicato lo sviluppo di fs che per loro natura non possono usarlo, come i file system di rete. Non vedo perché windows debba fare eccezione. un file system di rete chiaramente non ha bisogno di mandare richieste di I/O ad una disco, virtuale o meno che sia, perché traduce tutto in comandi da inviare su una connessione di rete o quello che è; però l'unità disco gli serve "dall'altra parte", ovvero Windows deve vedere un'unità logica con una lettera e inviare lì le richieste indirizzate al filesystem :D
per realizzare questa emulazione non so cosa sia necessario fare e forse mai lo saprò visto che la documentazione non è gratuita. su MSDN l'ultima volta che sono andato a guardare queste cose veniva documentato solo come realizzare dei file system filters, cioè dei drivers per filtrare operazioni sui file systems, ma chiaramente non è quello che serve a dupa e comunque temo che quello che vuole fare lui non possa essere realizzato come filtro neanche con degli hack.
E' titanica ovunque, per questo sarebbe utile che qualche anima pia prenda coraggio e porti fuse anche su windows (con i python binding, mi immagino il cdimaurofs :asd: ) io come penso si intuisca (e come anche la maggior parte dei programmatori, penso :D solo che io in misura maggiore forse) ho una marea di progetti accumulati e mai terminati :asd:, tra cui ovviamente anche DC; sono stati tutti molto utili nella mia vita dal punto di vista didattico, ma il problema è che quando se ne accumulano troppi ti passa la voglia di cominciarne altri sapendo che probabilmente li lascerai a metà :D
per quanto riguarda questo specifico progetto, io mi ci metterei seriamente solo sotto alcune condizioni che temo non si verificheranno mai:
1) tempo permettendo, e possibilmente anche "altri progetti permettendo" (nel senso che al di là del trovare il tempo, se riuscissi a concludere almeno uno dei miei N-mila progetti iniziati prima di iniziare questo sarebbe meglio :D)
2) trovare il modo di procurarsi l'IFSK; come dice la mia ragazza, "ciao core" :muro:
3) non essere da solo; se mi ci mettessi vorrei compagnia. e, neanche a dirlo, la prima persona che guarderei saresti tu* :D
* tranquillo, le altre due condizioni non si verificheranno mai :cry:
E' interessante notare che TrueCrypt usa fuse sui sistemi che lo supportano (linux/mac/*bsd).
Tutto il necessario per windows, se ti interessa, sta credo nella directory Driver. ohibò... TrueCrypt ha a che fare coi filesystems...? e che se ne fa?? :wtf:
ilsensine
13-03-2008, 21:57
TrueCrypt non lavora a livello di file system, ma di raw bytes
ohibò... TrueCrypt ha a che fare coi filesystems...? e che se ne fa?? :wtf:
Sei sicuro infatti che lavora a livello di block device? Se così fosse, dovresti essere in grado di "formattare" un device TrueCrypt con il file system che preferisci!
(per fare questa cosa su linux servono driver tipo dm-crypt, che sono assolutamente indipendenti/trasparenti ai file system)
<lunga serie di scuse per non implementare winfuse>
Non intendevo che dovevi farlo te...
però ora che mi ci fai pensare...
Quante ore di sonno ti rimangono al giorno? :asd:
Sei sicuro infatti che lavora a livello di block device? Se così fosse, dovresti essere in grado di "formattare" un device TrueCrypt con il file system che preferisci! infatti dal wizard è possibile formattarli sia con NTFS che con un non meglio specificato FAT; non lo so se TrueCrypt abbia a che fare col file system, però nel file sources postato da dupa in effetti vedo un certo "DriverFilter", anche se non capisco cosa potrebbe mai farci.
Non intendevo che dovevi farlo te... non intendevi, ma l'interesse da parte mia c'è :D
però ora che mi ci fai pensare...
Quante ore di sonno ti rimangono al giorno? :asd: guarda andiamo con ordine... riordino i 3 ostacoli per ordine di insormontabilità: prima il 2, poi l'1, poi il 3. risolvimi il 2 senza intaccare il portafogli e ti faccio sapere per quando potrei aver risolto l'1 :D
PS - non montiamoci la testa comunque eh, purtroppo temo che stavolta l'entusiasmo andrà a farsi friggere :asd:
ilsensine
13-03-2008, 22:18
Se ti viene la voglia, leggi questo paper:
http://pages.cs.wisc.edu/~driscoll/fuse-nt.pdf
Non mi risulta sia stato implementato completamente, però è suggerita una strada molto furba (già utilizzata da un progetto chiamato fifs) che evita completamente di passare per un driver.
per ora gli ho dato solo un'occhiata (poi però lo vedrò meglio perché è interessante); immaginavo che non poteva esserci il miracolo, si tratta di utilizzare qualcosa che non è fatta esattamente per quegli scopi ^^
a dire il vero non avevo mai sentito questo CIFS di cui parla (motivo percui lo leggerò meglio), ma come correttezza tecnica non mi promette molto bene, lo dicono anche loro alla fine del documento.
ilsensine
13-03-2008, 22:44
cifs (ex smb) non è altro che il sistema di condivisione file di windows
ilsensine
13-03-2008, 22:56
infatti dal wizard è possibile formattarli sia con NTFS che con un non meglio specificato FAT
e allora che c'entra fuse?
Oddio, non avranno creato un loopback su un file fuse...in effetti il codice per il loopback c'è...
La cosa è così folle da poter addirittura funzionare...
Credo che per quello che vuoi fare tu, "ti basta" estendere il namespace della shell..
Qui trovi alcuni tutorial: http://www.codeproject.com/KB/shell/ che potrebbero essere utili.
Buona fortuna comunque, ho iniziato a studiare un pò la faccenda un mesetto fa...e venendo da java spesso mi sono chiesto chi cavolo me lo ha fatto fare...mai visto uno schifo simile. Per capire come fare una cosa semplicissima devo spendere ore tra documentazione mal fatta che da per scontato troppe cose e tutorial spesso vecchi ed incompleti. Non riesco ancora a districarmi tra dll, mfc, com e tutto il resto che c'è dietro...
La cosa bella è che quando credo di aver capito il funzionamento mi ritrovo davanti sto codice che sembra criptato...
Anzi già che ci siamo qualcuno ha qualche risorsa da indicare che spighi bene come programmare sotto win32? Magari anche un buon libro...
Aza
cdimauro
14-03-2008, 21:25
E' titanica ovunque, per questo sarebbe utile che qualche anima pia prenda coraggio e porti fuse anche su windows (con i python binding, mi immagino il cdimaurofs :asd: )
Interessante. :)
Magari è la volta buona che Alberto abbandona C e C++ e si mette a sviluppare velocemente codice in Python, visto che ha una cronica carenza di tempo... :p
io come penso si intuisca (e come anche la maggior parte dei programmatori, penso :D solo che io in misura maggiore forse) ho una marea di progetti accumulati e mai terminati :asd:, tra cui ovviamente anche DC; sono stati tutti molto utili nella mia vita dal punto di vista didattico, ma il problema è che quando se ne accumulano troppi ti passa la voglia di cominciarne altri sapendo che probabilmente li lascerai a metà :D
Così giovane e già così impegnato e senza tempo. E quando avrai anche famiglia, che farai? :|
Al momento il tempo se lo spartiscono il lavoro e la mia famiglia (in particolare i figli): per i vecchi progetti che ho in sospeso da EONI ormai ho perso la speranza di rimetterci mano, e per le altre idee che mi frullano per la testa so già che non è il caso nemmeno di scrivere la prima riga codice perché tanto non avrei tempo da dedicarci.
Per fortuna trovo un po' di tempo ogni tanto per staccare la spina e cazzeggiare sul forum. :p
x ilsensine, no fuse non te lo porto in Python. :Prrr: Provaci tu e vedrai quant'è facile e veloce scrivere codice con questo linguaggio. :cool:
ilsensine
14-03-2008, 22:57
x ilsensine, no fuse non te lo porto in Python. :Prrr:
ma già è stato fatto; fuse è disponibile per un lungo elenco di linguaggi (compreso sh!)
http://fuse.sourceforge.net/wiki/index.php/FusePython
C'è un file system notevole scritto in fuse-python: gmailfs
cdimauro
15-03-2008, 12:08
:eek: :eek: :eek:
:ave: :ave: :ave: Python rulez! :p
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.