Acesso ao sistema de arquivos para drivers WIA
Se um driver precisar usar arquivos diferentes dos fornecidos pelo serviço WIA durante uma transferência de arquivo, o driver deverá ter cuidado com o local em que esses arquivos estão localizados e como eles são acessados. Especificamente, os gravadores de driver devem estar cientes das permissões de acesso dos diretórios e arquivos que eles usam. Alguns exemplos de quando os drivers podem precisar ler ou gravar seus próprios arquivos incluem registro em log, calibragem e salvar a configuração.
Por exemplo, o diretório %windir%\System32 é somente leitura para uma conta LocalService , portanto, os drivers WIA normalmente não podem abrir arquivos para acesso de leitura ou gravação lá. A maioria dos diretórios é somente leitura para contas localService , portanto, raramente há problemas se um driver precisa apenas ler de um arquivo. No entanto, problemas de arquivo ocorrem quando os drivers tentam criar ou gravar arquivos em diretórios restritos.
Um local seguro para gravar arquivos que somente o driver usa está no diretório de perfil do usuário. Observe que o usuário nesse caso se refere à conta na qual o processo que hospeda o driver está em execução. No Windows XP, essa é a conta LocalSystem e, no Microsoft Windows Server 2003 e posterior, é a conta LocalService . Para que um driver funcione bem em todas as versões do Windows que dão suporte ao WIA, os drivers devem criar seus arquivos privados no % diretório userprofile%.
O exemplo de código a seguir mostra como um driver WIA pode usar o diretório %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 um driver precisar gravar em um arquivo contido em um diretório diferente de %userprofile, ele deverá garantir que as permissões corretas tenham sido definidas para o arquivo/diretório. Normalmente, isso significa garantir que as permissões apropriadas tenham sido concedidas à conta localService . No Windows XP, o serviço WIA é executado na conta LocalSystem , que pertence ao grupo Administradores Locais e tem níveis de acesso consideravelmente mais altos.
Arquivos comuns do aplicativo WIA e do driver WIA
Se o driver e um aplicativo empacotado precisarem de acesso de leitura/gravação a um arquivo comum, é recomendável que o arquivo seja colocado no perfil Todos os Usuários, em um subdiretório do diretório Dados do Aplicativo (CSIDL_COMMON_APPDATA). Defina as ACLs apropriadas no novo subdiretório.