Acceso al sistema de archivos para controladores WIA
Si un controlador necesita usar archivos distintos de los proporcionados por el servicio WIA durante una transferencia de archivos, el controlador debe tener cuidado sobre dónde se encuentran estos archivos y cómo se accede a ellos. En concreto, los escritores de controladores deben tener en cuenta los permisos de acceso de los directorios y los archivos que usan. Algunos ejemplos de cuándo es posible que los controladores necesiten leer o escribir sus propios archivos incluyen el registro, la calibración y la configuración de guardado.
Por ejemplo, el directorio %windir%\System32 es de solo lectura en una cuenta localService , por lo que los controladores WIA normalmente no pueden abrir archivos para acceso de lectura o escritura allí. La mayoría de los directorios son de solo lectura para las cuentas de LocalService , por lo que rara vez hay problemas si un controlador solo necesita leer desde un archivo. Sin embargo, los problemas de archivos se producen cuando los controladores intentan crear o escribir archivos en directorios restringidos.
Un lugar seguro para escribir archivos que solo usa el controlador está en el directorio del perfil de usuario. Tenga en cuenta que el usuario en este caso hace referencia a la cuenta en la que se ejecuta el proceso que hospeda el controlador. En Windows XP, se trata de la cuenta LocalSystem y, en Microsoft Windows Server 2003 y versiones posteriores, es la cuenta LocalService . Para que un controlador funcione bien en todas las versiones de Windows compatibles con WIA, los controladores deben crear sus archivos privados en el % directorio userprofile%.
En el ejemplo de código siguiente se muestra cómo un controlador WIA puede usar el directorio %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...
.
.
.
}
}
Si un controlador necesita escribir en un archivo contenido en un directorio % que no sea userprofile%, debe asegurarse de que se han establecido los permisos correctos para el archivo o directorio. Normalmente, esto significa asegurarse de que se han concedido los permisos adecuados a la cuenta localService . En Windows XP, el servicio WIA se ejecuta en la cuenta LocalSystem , que pertenece al grupo Administradores locales y tiene niveles de acceso considerablemente mayores.
Archivos comunes de la aplicación WIA y del controlador WIA
Si tanto el controlador como una aplicación agrupada necesitan acceso de lectura y escritura a un archivo común, se recomienda que el archivo se coloque en el perfil Todos los usuarios, en un subdirectorio del directorio Application Data (CSIDL_COMMON_APPDATA). Asegúrese de establecer las ACL adecuadas en el nuevo subdirectorio.