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。