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) のサブディレクトリの All Users プロファイルに配置することを推奨します。 新しいサブディレクトリに適切な ACL を設定してください。