Zoom Icon

Compilare Driver per Windows con VisualStudio

From UIC Archive

Compiliamo i Driver per Windows con VisualStudio

Contents


Compilare Driver per Windows con VisualStudio
Author: Quequero
Email: Que addr.gif
Website: http://quequero.org
Date: 10/02/2008 (dd/mm/yyyy)
Level: Working brain required
Language: Italian Flag Italian.gif
Comments: Col poco fiato che mi resta maledico Zoidbeeeeeeeeeerg!



Introduzione

Fare driver su Windows è sicuramente divertente (se non dovete farlo per lavoro ;p), tuttavia l'interfaccia che Microsoft mette a disposizione degli sviluppatori non è proprio il top della gamma. Fondamentalmente si finisce a codare con qualche editor tipo Notepad++ e a compilare da console, per carità non c'è nulla di male in tutto questo pero'.... Ricordare i membri delle strutture, le definizioni e quant'altro è abbastanza noioso, soprattutto porta via un sacco di tempo perché vuol dire spulciare di continuo la documentazione del WDK. Per fortuna esiste il modo per evitarci un calvario inutile...


Tools


Essay

Per prima cosa dobbiamo installare una qualche versione di Visual Studio, Microsoft è abbastanza cordiale da offrire gratuitamente il download di Visual Studio 2008 in prova per 30 giorni, se poi doveste decidere di comprarlo allora vi invieranno un seriale che potrete inserire in fase di disinstallazione del software, in modo da abilitarlo completamente. Poi dovrete installare il DDK/WDK, quest'ultimo però non è liberamente disponibile a meno che non vi iscriviate al beta testing program. Forse tra un po' sarà disponibile gratuitamente, forse no... Ad ogni modo se dovete fare un driver sicuramente il DDK/WDK già lo avete installato. Ci sarà poi bisogno di DDKWizard, un piccolo programmello che semplicemente aggiunge un template per la creazione di driver all'interno di Visual Studio. Gli ultimi due componenti saranno DDKBuild ed infine Visual Assist X (ma non è necessario), che è un'autentica chicca di programma che porta l'IntelliSense a livelli degni di questo nome! :).

DDKWizard

Come dicevo poco fa, DDKWizard è un programma free che aggiunge un template all'interno di Visual Studio, è decisamente semplice da installare: avanti -> avanti -> avanti :), tuttavia imposterà per voi l'ambiente necessario alla compilazione, perché credetemi sulla parola... Farlo a mano è veramente fuorviante :), quindi installatelo e passate al secondo step.

DDKBuild

DDKBuild è uno script che venne sviluppato in origine per OSR che in seguito ne prese il patrocinio, il suo scopo è più o meno quello di settare le variabili necessarie per utilizzare, all'interno di Visual Studio, i tool di compilazione che vengono forniti col DDK/WDK. Si tratta di un file .cmd, cosa ci dovete fare? Copiatelo in una directory a vostro piacimento, io lo tengo nella dir dove risiede il WDK: C:\WinDDK\. Dopo averlo copiato (la versione che trovate allegata è la 7.0RC3, vi sconsiglio di utilizzare la 6.x con Visual Studio 2008) nella directory che preferite avremo bisogno di settare una variabile d'ambiente, serve a specificare a DDKBuild quale DDK utilizzare per la compilazione. Ci si parano davanti 2 soluzioni:

  1. Settiamo la variabile d'ambiente
  2. Non la settiamo e ne facciamo l'override in fase di creazione del progetto

Tanto per farla semplice, vedremo la prima soluzione subito, e la seconda in fase di creazione del progetto :).

Variabile d'ambiente

Andate nel pannello di controllo, clickate su System -> Advanced -> Environment Variables nel pannello in alto, quello relativo all'utente corrente, dovrete creare una nuova variabile: clickate sul tasto New, il nome lo dovete prendere da questa tabellina:

---------------------------|---------------------------------
 Platform   | DDK   | CPU  | Base directory | Platform alias
------------|-------|------|----------------|----------------
 -W2K       | W2K   | x86  | %W2KBASE%      |
 -W2K64     | W2K   | IA64 | %W2KBASE%      | -W2KI64
 -WXP       | WXP   | x86  | %WXPBASE%      |
 -WXP64     | WXP   | IA64 | %WXPBASE%      | -WXPI64
 -WXP2K     | W2K   | x86  | %WXPBASE%      |
 -WNET      | WNET  | x86  | %WNETBASE%     |
 -WNET64    | WNET  | IA64 | %WNETBASE%     | -WNETI64
 -WNETXP    | WXP   | x86  | %WNETBASE%     |
 -WNETXP64  | WXP   | IA64 | %WNETBASE%     |
 -WNETAMD64 | WNET  | x64  | %WNETBASE%     | -WNETX64
 -WNET2K    | W2K   | x86  | %WNETBASE%     |
 -WLH       | WLH   | x86  | %WLHBASE%      |
 -WLH2K     | W2K   | x86  | %WLHBASE%      |
 -WLHXP     | WXP   | x86  | %WLHBASE%      |
 -WLHNET    | WNET  | x86  | %WLHBASE%      |
 -WLHNETI64 | WNET  | IA64 | %WLHBASE%      |
 -WLHNETX64 | WNET  | x64  | %WLHBASE%      |
 -WLHI64    | WLH   | IA64 | %WLHBASE%      |
 -WLHX64    | WLH   | x64  | %WLHBASE%      |
 -NT4       | NT4   | x86  | %NT4BASE%      |
-------------------------------------------------------------

Se vi trovate su Vista x64 e state utilizzando il WDK, allora la vostra variabile sara': WLHBASE, se siete su Windows XP ed avete il DDK, dovrete impostare il nome a: WXPBASE, il valore della variabile è il path dove si trova il DDK/WDK.

DDKBuild Environment.png

Procediamo con la configurazione dell'ambiente prima di vedere la seconda alternativa.

Creazione del Progetto

Sia che abbiate settato la variabile, sia che no, potrete comunque creare il primo progetto per un driver... Ma manca ancora un setting: aprite Visual Studio senza creare alcun progetto, clickate su Strumenti -> Opzioni -> Progetti e Soluzioni -> Directory di VC++, clickate il pulsante Nuova Riga e nello spazietto vuoto inserite il path dove avete copiato il vostro DDKBuild.cmd.

DDKBuild VS Directory.png

Clickate su OK e create pure il vostro progetto, vedrete che è apparsa una nuova voce nel menu:

DDKBuild Project 1.png

Selezionate DDK Project ed il modello di driver che vi interessa, poi clickate su OK, al secondo step dovrete scegliere i settings per la compilazione, vediamoli nel dettaglio.

DDKBuild Project 2.png

  • Choose the DDKBuild you want to use:, selezionate sempre DDKBUILD.CMD, la versione .bat offre delle features in meno e comunque non si trova nel package allegato a questo tutorial :).
  • Which DDK(s) you want to use:, in questo pannellino selezionate il DDK (o i DDK) che avete installato sulla vostra macchina.
  • Support 64bit builds, come dice il nome abilita il supporto per la compilazione dei driver a 64bit, è chiaro che anche il vostro DDK deve supportare i 64bit altrimenti non ci farete nulla. Se selezionate questa opzione potrete scegliere di supportare solo x86_64 o anche IA64.
  • Create PREfast configuration, questa opzione crea un progetto clone con la configurazione per PREfast già attiva. PREfast è un tool per l'analisi statica del sorgente, è utile se state creando un componente critico perché può trovare errori logici che non vengono identificati in fase di compilazione. Ovviamente dovrete aver installato il framework di PREfast che potete scaricare dal sito di Microsoft.
  • Stricter type checking, abilitatelo perché consente di utilizzare le estensioni del C++ che durante la fase di coding fanno decisamente comodo. Senza compilerete in pieno C.
  • Auto-increment build number, genera uno script che ad ogni build del driver incrementa il build number... Non è particolarmente utile, quindi vedete voi cosa farci :).
  • Create pre/post build scripts, genera degli script che potete customizzare per eseguire le azioni che volete prima e dopo la compilazione. Se abilitate l'autoincremento della build, questa opzione verrà automaticamente attivata e verranno creati degli script per il cambio del build number.
  • Create makefile.inc, crea un makefile.inc e lo inserisce nel file SOURCES, potete abilitarlo se dovete fare dei passi custom di compilazione.
  • Create message file, genera un messaggio (in forma di template) che viene linkato nel binario.
  • Use property sheet, lasciatelo sempre abilitato, crea un foglio di proprietà che imposta automaticamente alcune variabili tra cui il path di ddkbuild.cmd.

Sulla colonna di destra troviamo un sacco di variabili che puntano ad una locazione di default del DDK, questa in effetti è la seconda via per specificarne il path, il primo modo era quello di impostare la variabile d'ambiente, il secondo è quello di clickare su Override e scegliere il path. Lo svantaggio è che dovrete settare l'override ad ogni nuovo progetto, quindi valutate voi qual'e' la situazione più comoda. A questo punto clickate su Finish ed il template genererà per voi un driver scheletro con qualche funzioncina basilare al suo interno, come la creazione del device, di un handler etc.

Compilazione

Ora potete premere F7 e, se avete seguito tutti i passi, vedrete nascere il vostro primo driver su Visual Studio :). Nel box delle builds, in alto al centro, trovate svariate opzioni che terminano con: checked e free, qui la scelta è solo vostra, dipende dal debugging che dovete fare e anche dalla versione di Windows che avete, la versione checked è decisamente comoda per il tracing/debugging, se invece non l'avete installata, allora compilate il driver in modalità free.

Browse Info

Ok, una delle ragioni per cui abbiamo deciso di compilare i driver da Visual Studio è per avere le browse info, ovvero quella simpatica funzionalità che vi porta alla definizione di una struttura/tipo clickando col tasto destro sul nome e scegliendo Vai alla definizione. Ma di default non è impostato, cosa dobbiamo fare? Poco in verita': nella directory del progetto è presente un file chiamato sources, apritelo da dentro Visual Studio e decommentate la seguente riga: BROWSER_INFO=1 Effettuate il rebuild del progetto (Ctrl + Alt + F7), verrà generato un file .bsc dentro la directory di output del driver (dove si trova driver1.sys per intenderci), clickate col tasto destro sulla cartellina Special Files già presente di default nel progetto, e scegliete Aggiungi -> Elemento esistente, scegliete il file: Driver1.bsc ed aggiungetelo, dovreste ritrovarvi con qualcosa del genere:

DDKBuild BrowseInfo.png

Ora ricompilate di nuovo da 0 il progetto (Ctrl + Alt + F7), da questo momento in poi avrete a disposizione le browse info :).

Visual Assist X

Visual Assist X è la chicca finale, si tratta di plugin per Visual Studio (commerciale purtroppo) che prende in input la directory degli include, ovviamente dovrete puntarlo verso la directory del DDK/WDK. Il risultato è un auto-completamento di grande potenza, avrete a disposizione definizioni e suggerimenti per tutte le funzioni/strutture/tipi/variabili definite nel DDK (e in tutte le altre directory che avete scelto di fargli gestire). Devo dire che ci si fa subito l'abitudine, risulta comodissimo quando si scrive codice "normale", ed ancora di più quando si va a scrivere codice per i driver, quindi se avete voglia... Provatelo :). Non mi pagano per dirlo, ma è un prodotto veramente eccellente e snellisce enormemente il lavoro di coding.


Note Finali

Abbiamo visto che è possibile usare Visual Studio per la compilazione dei driver, appena avro' un po' di tempo vedremo come si usa WinDbg per effettuare il debugging del kernel da remoto. Un saluto a tutta la UIC ed uno in particolare ad: Andrea, Naga, cod, recidjvo e Kiodo :).


Disclaimer

I documenti qui pubblicati sono da considerarsi pubblici e liberamente distribuibili, a patto che se ne citi la fonte di provenienza. Tutti i documenti presenti su queste pagine sono stati scritti esclusivamente a scopo di ricerca, nessuna di queste analisi è stata fatta per fini commerciali, o dietro alcun tipo di compenso. I documenti pubblicati presentano delle analisi puramente teoriche della struttura di un programma, in nessun caso il software è stato realmente disassemblato o modificato; ogni corrispondenza presente tra i documenti pubblicati e le istruzioni del software oggetto dell'analisi, è da ritenersi puramente casuale. Tutti i documenti vengono inviati in forma anonima ed automaticamente pubblicati, i diritti di tali opere appartengono esclusivamente al firmatario del documento (se presente), in nessun caso il gestore di questo sito, o del server su cui risiede, può essere ritenuto responsabile dei contenuti qui presenti, oltretutto il gestore del sito non è in grado di risalire all'identità del mittente dei documenti. Tutti i documenti ed i file di questo sito non presentano alcun tipo di garanzia, pertanto ne è sconsigliata a tutti la lettura o l'esecuzione, lo staff non si assume alcuna responsabilità per quanto riguarda l'uso improprio di tali documenti e/o file, è doveroso aggiungere che ogni riferimento a fatti cose o persone è da considerarsi PURAMENTE casuale. Tutti coloro che potrebbero ritenersi moralmente offesi dai contenuti di queste pagine, sono tenuti ad uscire immediatamente da questo sito.

Vogliamo inoltre ricordare che il Reverse Engineering è uno strumento tecnologico di grande potenza ed importanza, senza di esso non sarebbe possibile creare antivirus, scoprire funzioni malevole e non dichiarate all'interno di un programma di pubblico utilizzo. Non sarebbe possibile scoprire, in assenza di un sistema sicuro per il controllo dell'integrità, se il "tal" programma è realmente quello che l'utente ha scelto di installare ed eseguire, né sarebbe possibile continuare lo sviluppo di quei programmi (o l'utilizzo di quelle periferiche) ritenuti obsoleti e non più supportati dalle fonti ufficiali.