Accesso al file system per i driver WIA
Se un driver deve usare file diversi da quelli forniti dal servizio WIA durante un trasferimento di file, il driver deve prestare attenzione alla posizione in cui si trovano questi file e alla modalità di accesso. In particolare, i writer driver devono essere consapevoli delle autorizzazioni di accesso delle directory e dei file usati. Alcuni esempi di quando i driver potrebbero dover leggere o scrivere i propri file includono registrazione, calibrazione e salvataggio della configurazione.
Ad esempio, la directory %windir%\System32 è di sola lettura a un account LocalService , quindi i driver WIA in genere non possono aprire file per l'accesso in lettura o scrittura. La maggior parte delle directory è di sola lettura agli account LocalService , pertanto si verificano problemi raramente se un driver deve solo leggere da un file. Tuttavia, i problemi di file si verificano quando i driver tentano di creare o scrivere file in directory limitate.
Un luogo sicuro per scrivere file che utilizzano solo il driver è nella directory del profilo utente. Si noti che l'utente in questo caso fa riferimento all'account in cui è in esecuzione il processo che ospita il driver. In Windows XP si tratta dell'account LocalSystem e in Microsoft Windows Server 2003 e versioni successive, si tratta dell'account LocalService . Per consentire a un driver di funzionare correttamente in tutte le versioni di Windows che supportano WIA, i driver devono creare i file privati nella % directory userprofile%.
Nell'esempio di codice seguente viene illustrato come un driver WIA può usare la directory %userprofile%.
#define MY_DRIVER_FILE_NAME_W L"%userprofile%\\MyDriverFile.ext";
HANDLE hMyDriverFile = INVALID_HANDLE_VALUE;
WCHAR wszFileName[MAX_PATH] = {L'\0'};
DWORD dwMaxChars = sizeof(wszExpandedName) /
sizeof(wszExpandedName[0]);
if (ExpandEnvironmentStringsW(MY_DRIVER_FILE_NAME_W,
wszFileName,
dwMaxChars))
{
//
// The %userprofile% environment variable is expanded, if
// there was an error and the variable is not found.
// In this case an error would be returned before creating the
// file. If the file is created blindly with the name
// L"%userprofile\\MyDriverFile.ext"
// a possibility exists that the file will be created in a
// different directory, e.g. the root.
//
hMyDriverFile =
CreateFileW(
wszFileName, // Contains file name and path
dwDesiredAccess, // E.g. GENERIC_WRITE
dwShareMode, // E.g. FILE_SHARE_WRITE
lpSecurityAttributes, // Don't forget to ACL your file
// appropriately!
dwCreationDisposition, // E.g. CREATE_ALWAYS
dwFlagsAndAttributes, // E.g. FILE_ATTRIBUTE_NORMAL
NULL); // Template file
if (hMyDriverFile != INVALID_HANDLE_VALUE)
{
// Success!
}
else
{
// Failed. Do error cleanup...
.
.
.
}
}
Se un driver deve scrivere in un file contenuto in una directory diversa % da userprofile%, deve assicurarsi che le autorizzazioni corrette siano state impostate per il file/directory. In genere ciò significa garantire che le autorizzazioni appropriate siano state concesse all'account LocalService . In Windows XP il servizio WIA viene eseguito con l'account LocalSystem , che appartiene al gruppo Amministratori locali e ha livelli di accesso notevolmente superiori.
File comuni dell'applicazione WIA e del driver WIA
Se sia il driver che un'applicazione in bundle richiedono l'accesso in lettura/scrittura a un file comune, è consigliabile inserire il file nel profilo Tutti gli utenti, in una sottodirectory della directory Dati applicazione (CSIDL_COMMON_APPDATA). Assicurarsi di impostare gli elenchi di controllo di accesso appropriati nella nuova sottodirectory.