다음을 통해 공유


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을 설정해야 합니다.