Поделиться через


Доступ к файловой системе для драйверов WIA

Если драйверу необходимо использовать файлы, отличные от тех, которые предоставляются службой WIA во время передачи файлов, драйвер должен быть осторожным в расположении этих файлов и способах доступа к этим файлам. В частности, средства записи драйверов должны знать о разрешениях доступа к каталогам и файлам, которые они используют. Некоторые примеры того, когда драйверам может потребоваться чтение или запись собственных файлов, включают ведение журнала, калибровку и сохранение конфигурации.

Например, каталог %windir%\System32 доступен только для чтения для учетной записи LocalService , поэтому драйверы WIA обычно не могут открывать файлы для чтения или записи. Большинство каталогов доступны только для чтения для учетных записей LocalService , поэтому редко возникают проблемы, если драйверу требуется только чтение из файла. Однако проблемы с файлами возникают, когда драйверы пытаются создать или записать файлы в каталоги с ограниченным доступом.

Безопасное место для записи файлов, используемых только драйвером, находится в каталоге профиля пользователя. Обратите внимание, что пользователь в этом случае ссылается на учетную запись, под которой выполняется процесс, в котором размещается драйвер. В Windows XP это учетная запись LocalSystem , а в Microsoft Windows Server 2003 и более поздних версиях — учетная запись LocalService . Чтобы драйвер работал хорошо во всех версиях Windows, поддерживающих WIA, драйверы должны создавать личные файлы в каталоге %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). Не забудьте задать соответствующие списки управления доступом в новом подкаталоге.