Accès au système de fichiers pour les pilotes WIA
Si un pilote doit utiliser des fichiers autres que ceux fournis par le service WIA lors d’un transfert de fichiers, il doit faire attention à l’emplacement de ces fichiers et à la façon dont ils sont accessibles. Plus précisément, les rédacteurs de pilotes doivent connaître les autorisations d’accès des répertoires et fichiers qu’ils utilisent. Parmi les exemples de cas où les pilotes peuvent avoir besoin de lire ou d’écrire leurs propres fichiers, citons la journalisation, l’étalonnage et l’enregistrement de la configuration.
Par exemple, le répertoire %windir%\System32 est en lecture seule sur un compte LocalService . Par conséquent, les pilotes WIA ne peuvent généralement pas ouvrir les fichiers pour y accéder en lecture ou en écriture. La plupart des répertoires sont en lecture seule sur des comptes LocalService . Il existe donc rarement des problèmes si un pilote doit uniquement lire à partir d’un fichier. Toutefois, des problèmes de fichiers se produisent lorsque des pilotes tentent de créer ou d’écrire des fichiers dans des répertoires restreints.
Un emplacement sûr pour écrire des fichiers que seul le pilote utilise se trouve dans le répertoire du profil utilisateur. Notez que l’utilisateur dans ce cas fait référence au compte sous lequel le processus hébergeant le pilote est en cours d’exécution. Dans Windows XP, il s’agit du compte LocalSystem , et dans Microsoft Windows Server 2003 et versions ultérieures, il s’agit du compte LocalService . Pour qu’un pilote fonctionne correctement dans toutes les versions de Windows prenant en charge WIA, les pilotes doivent créer leurs fichiers privés dans le % répertoire userprofile%.
L’exemple de code suivant montre comment un pilote WIA peut utiliser le répertoire %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 pilote doit écrire dans un fichier contenu dans un répertoire autre que %userprofile%, il doit s’assurer que les autorisations appropriées ont été définies pour le fichier/répertoire. Cela signifie généralement que les autorisations appropriées ont été accordées au compte LocalService . Sur Windows XP, le service WIA s’exécute sous le compte LocalSystem , qui appartient au groupe Administrateurs locaux et a des niveaux d’accès considérablement plus élevés.
Fichiers communs de l’application WIA et du pilote WIA
Si le pilote et une application groupée ont besoin d’un accès en lecture/écriture à un fichier commun, il est recommandé de placer le fichier dans le profil Tous les utilisateurs, dans un sous-répertoire du répertoire Des données d’application (CSIDL_COMMON_APPDATA). Veillez à définir les listes de contrôle d’accès appropriées dans le nouveau sous-répertoire.