WIA 驱动程序的文件系统访问权限
如果驱动程序需要在文件传输过程中使用 WIA 服务提供的文件以外的文件,则驱动程序必须注意这些文件的位置以及访问这些文件的方式。 具体而言,驱动程序编写者应了解其使用的目录和文件的访问权限。 驱动程序可能需要读取或写入其自己的文件的一些示例包括日志记录、校准和保存配置。
例如,%windir%\System32 目录对 LocalService 帐户是只读的,因此 WIA 驱动程序通常无法打开文件进行读取或写入访问。 大多数目录对 LocalService 帐户都是只读的,因此,如果驱动程序只需要从文件中读取,则很少出现问题。 但是,当驱动程序尝试在受限目录中创建或写入文件时,确实会发生文件问题。
用户配置文件目录中有一个安全位置,用于写入只有驱动程序使用的文件。 请注意,在这种情况下,用户指的是托管驱动程序的进程在帐户下运行。 在 Windows XP 中,这是 LocalSystem 帐户,在 Microsoft Windows Server 2003 及更高版本中,它是 LocalService 帐户。 为了使驱动程序在支持 WIA 的所有 Windows 版本中正常工作,驱动程序应在 userprofile% 目录中创建其专用文件%。
以下代码示例演示 WIA 驱动程序如何使用 %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...
.
.
.
}
}
如果驱动程序需要写入除 userprofile 以外的%目录中包含的文件,则应确保已为文件/目录设置正确的权限。 通常,这意味着确保已向 LocalService 帐户授予适当的权限。 在 Windows XP 上,WIA 服务在 LocalSystem 帐户下运行,该帐户属于本地管理员组,具有更高的访问级别。
WIA 应用程序和 WIA 驱动程序通用文件
如果驱动程序和捆绑应用程序都需要对公用文件进行读/写访问,建议将该文件放在“所有用户”配置文件中,位于应用程序数据目录 (CSIDL_COMMON_APPDATA) 的子目录中。 请确保在新子目录上设置适当的 ACL。