Программирование драйверов Windows


Функции для работы со ссылками на объекты - часть 2


/p>

Следует отметить, что в результате выполнения системного вызова ObReferenceObjectByHandle, увеличивается на единицу счетчик ссылок на этот объект, который поддерживается операционной системой.

Общим правилом операционной системы является то, что счетчик ссылок поддерживается для каждого объекта режима ядра, и когда он уменьшается до нуля, происходит уничтожение объекта. В некоторых ситуациях, как раз необходимо произвести увеличение счетчика ссылок на объект, чтобы продлить ему жизнь. В режиме ядра более распространен способ работы с объектами через указатели на них. Поэтому, если необходимо увеличить счетчик ссылок на объект, но в распоряжении имеется только указатель на него &#8212 не беда. На этот случай существует системный вызов ObReferenceObjectByPointer, который увеличивает ссылку на объект, используя в качестве исходных данных указатель, а не дескриптор.

Таблица 7.42. Прототип вызова ObReferenceObjectByPointer

NTSTATUS ObReferenceObjectByPointer IRQL == PASSIVE_LEVEL
Параметры Предоставляет указатель на объект режима ядра по открытому дескриптору
IN PVOID pObject Указатель на объект
IN ACCESS_MASK DesiredAccess Маска доступа, интерпретация которой зависит от типа рассматриваемого объекта
IN POBJECT_TYPE ObjectType

OPTIONAL

Можно установить NULL (если параметр AccessMode равен KernelMode) или одно из значений IoFileObjectType

or ExEventObjectType

IN KPROCESSOR_MODE AccessMode KernelMode &#8212 для работы в режиме ядра

UserMode

Возвращаемое значение • STATUS_SUCCESS

• STATUS_OBJECT_TYPE_MISMATCH

Вернемся к случаю с ожиданием, организованным по объекту программного потока одним из вызовов KeWaitForXxx. Когда поток завершился, ожидание прекращено. При этом объект потока еще не уничтожен, поскольку в результате вызова ObReferenceObjectByHandle получилось так, что число ссылок на него не равно нулю. Это положение можно изменить, если уменьшить число ссылок при помощи вызова ObDereferenceObject, что, вероятно, приведет и к удалению объекта потока из системы.




Начало  Назад  Вперед