Linee guida per l'uso di SetupAPI
Di seguito sono riportate le linee guida per l'uso delle funzioni di installazione generali (SetupXxx) e delle funzioni di installazione del dispositivo (SetupDiXxx) fornite da SetupAPI:
Non si supponga mai che il contenuto del file di installazione sia libero dall'errore o che non sia stato modificato in modo dannoso un file di installazione specificato. Di conseguenza, convalidare sempre tutte le informazioni ricevute dalle funzioni SetupAPI. Verificare che le stringhe siano di lunghezza valida, che i buffer siano di dimensioni valide e che i valori di indice si trovino all'interno di un intervallo valido.
Quando si scrivono applicazioni di installazione per le installazioni in Microsoft Windows XP e nei sistemi successivi, è possibile chiamare SetupVerifyInfFile (descritto nella documentazione di Windows SDK), che verifica che non sia stato modificato un file INF con firma digitale.
Testare sempre il valore restituito di ogni funzione SetupAPI. Se la funzione ha esito negativo, il codice deve chiamare GetLastError per ottenere un codice di errore che identifica l'errore. I codici di errore restituiti possono essere definiti in Winerror.h o Setupapi.h. Prima di chiamare FormatMessage con FORMAT_MESSAGE_FROM_SYSTEM per creare una visualizzazione di testo, usare sempre la macro HRESULT_FROM_SETUPAPI (definita in Winerror.h) per convertire il valore restituito in un valore HRESULT. Se una funzione SetupAPI restituisce correttamente, il codice non deve chiamare GetLastError. Le funzioni GetLastError e FormatMessage , insieme ai codici di errore di sistema, sono descritte nella documentazione di Windows SDK.
Se una funzione SetupAPI restituisce un handle, il codice deve verificare la presenza di un valore restituito di INVALID_HANDLE_VALUE. Tali funzioni non restituiscono NULL.
Tenere presente la differenza seguente tra le funzioni SetupDiXxx e SetupXxx che consentono a un chiamante di eseguire query per le dimensioni necessarie di un buffer:
Se il chiamante di una funzione SetupDiXxx esegue una query di questo tipo, GetLastError restituisce sempre ERROR_INSUFFICIENT_BUFFER.
Se il chiamante di una funzione SetupXxx esegue una query di questo tipo, GetLastError restituisce NO_ERROR se non è stata specificata alcuna lunghezza del buffer o ERROR_INSUFFICIENT_BUFFER se è stato specificato un buffer troppo piccolo.