Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Некоторые драйверы должны управлять объектами, передаваемыми им вызывающими объектами или обрабатывать два файлового объекта одновременно. Например, драйвер модема может получить дескриптор объекта события, или сетевой драйвер может получать дескриптор для двух разных файловых объектов. Драйвер должен валидировать эти дескрипторы. Так как они передаются вызывающим абонентом, а не через диспетчер ввода-вывода, диспетчер ввода-вывода не может выполнять какие-либо проверки.
Например, в следующем фрагменте кода драйвер был передан дескриптор AscInfo-AddressHandle>, но не проверил его перед вызовом ObReferenceObjectByHandle:
//
// This handle is embedded in a buffered request.
//
status = ObReferenceObjectByHandle(
AscInfo->AddressHandle,
0,
NULL,
KernelMode,
&fileObject,
NULL);
if (NT_SUCCESS(status)) {
if ( (fileObject->DeviceObject == DeviceObject) &&
(fileObject->FsContext2 == TRANSPORT_SOCK) ) {
Несмотря на успешное выполнение вызова ObReferenceObjectByHandle , код не сможет убедиться, что возвращаемый указатель ссылается на объект файла; он доверяет вызывающему объекту передачу правильных сведений.
Даже если все параметры для вызова ObReferenceObjectByHandle верны, и вызов завершается успешно, драйвер по-прежнему может получить непредвиденные результаты, если объект файла не предназначен для его драйвера. В следующем фрагменте кода драйвер предполагает, что успешный вызов возвращает указатель на ожидаемый объект файла:
status = ObReferenceObjectByHandle (
AcpInfo->Handle,
0L,
DesiredAccess,
*IoFileObjectType,
Irp->RequestorMode,
(PVOID *)&AcpEndpointFileObject,
NULL);
if ( !NT_SUCCESS(status) ) {
goto complete;
}
AcpEndpoint = AcpEndpointFileObject->FsContext;
if ( AcpEndpoint->Type != BlockTypeEndpoint )
Хотя ObReferenceObjectByHandle возвращает указатель на объект файла, драйвер не гарантирует, что указатель ссылается на ожидаемый объект файла. В этом случае драйвер должен проверить указатель перед доступом к данным для конкретного драйвера в AcpEndpointFileObject-FsContext>.
Чтобы избежать таких проблем, драйвер должен проверить наличие допустимых данных следующим образом:
Проверьте тип объекта, чтобы убедиться, что драйвер ожидает.
Убедитесь, что запрошенный доступ подходит для типа объекта и необходимых задач. Если драйвер выполняет быструю копию файлов, например, убедитесь, что дескриптор имеет разрешение на чтение.
Обязательно укажите правильный режим доступа (UserMode или KernelMode) и что режим доступа совместим с запрошенным доступом.
Если драйвер ожидает дескриптор для объекта файла, созданного самим драйвером, сверьте этот дескриптор с объектом устройства или драйвером. Однако будьте осторожны, чтобы не нарушать фильтры, отправляющие запросы ввода-вывода для странных устройств.
Если драйвер поддерживает несколько типов файловых объектов (таких как каналы управления, адресные объекты и подключения драйверов TDI или томов, каталогов и файловых систем), убедитесь, что у вас есть способ отличить их.