共用方式為


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。