Система и способ передачи перехваченных запросов от драйвера к драйверу в процессе инициализации драйверов

Иллюстрации

Показать все

Изобретение относится к области передачи перехваченных запросов от драйвера к драйверу в процессе инициализации драйверов. Техническим результатом является обеспечение надежной гарантированной передачи запроса от драйвера А на доступ к данным, предоставляемым драйвером Б, за счет обеспечения передачи упомянутого запроса драйверу Б не ранее момента завершения инициализации драйвера Б, и повышение производительности передачи запроса от драйвера А на доступ к данным, предоставляемым драйвером Б. Раскрыт реализуемый компьютером способ передачи перехваченных запросов от драйвера к драйверу в процессе инициализации упомянутых драйверов, при этом ни один из упомянутых драйверов на момент перехвата запросов еще не был проинициализирован, содержащий этапы, на которых: а) перехватывают запросы драйвера А1 и драйвера А2, при этом запрос от драйвера А1 перехватывают раньше запроса от драйвера А2, на доступ к данным, предоставляемым драйвером Б, который на момент перехвата запроса еще не инициализирован, при этом драйверам А1 и А2 для инициализации необходимы данные, предоставляемые проинициализированным драйвером Б; б) формируют связный список, элементами которого являются объекты синхронизации, каждый из которых представляет собой данные, содержащие: объект ядра операционной системы, который приостанавливает инициализацию создавшего объект синхронизации драйвера до тех пор, пока драйвер Б не выполнит инициализацию, и указатель, содержащий в случае, если связный список содержит более одного элемента, адрес объекта синхронизации, добавленного в связный список ранее; для чего: создают объект синхронизации в адресном пространстве драйвера А1, размещают в области глобальных данных драйвера Б адрес, указывающий на созданный объект синхронизации в драйвере А1; в) дополняют упомянутый связный список, для чего: создают объект синхронизации в адресном пространстве драйвера А2, устанавливают адрес, размещенный в области глобальных данных Б и указывающий на объект синхронизации, созданный ранее, как указатель в упомянутый объект синхронизации, созданный драйвером А2, размещают в области глобальных данных драйвера Б адрес, указывающий на созданный объект синхронизации в драйвере А2; г) после инициализации драйвера Б объект ядра операционной системы, содержащийся в каждом созданном объекте синхронизации из связного списка, средствами операционной системы разрешает продолжить инициализацию драйвера, создавшего соответствующий объект синхронизации; д) передают перехваченные на этапе а) запросы драйверу Б. 7 з.п. ф-лы, 3 ил.

Реферат

Область техники

Изобретение относится к исполнению программного кода, а более конкретно к системам и способам передачи перехваченных запросов от драйвера к драйверу в процессе инициализации драйверов.

Уровень техники

На текущий момент подавляющее большинство операционных систем на вычислительных устройствах (серверов, персональных компьютеров, ноутбуков, мобильных устройств и т.п.) работает в многозадачном режиме - режиме, в котором процессы, порожденные в операционных системах, работающих на упомянутых вычислительных устройствах, могут в свою очередь состоять из нескольких потоков, которые также могут выполняться параллельно (многопоточность).

Основная сложность реализации работы в многозадачном режиме заключается в обеспечении синхронизации процессов - приведении двух или нескольких процессов к такому их исполнению, при котором определенные стадии упомянутых процессов совершаются в заранее заданном порядке, либо одновременно.

Обеспечение такого выполнения процессов, при котором определенные стадии упомянутых процессов совершаются в определенном порядке, либо одновременно.

Синхронизация необходима в случаях, когда параллельно выполняющимся процессам необходимо взаимодействовать друг с другом.

Для организации синхронизации процессов применяются методы межпроцессного взаимодействия (англ. inter-process communication, IPC), такие как сигналы (англ. signal), семафоры (англ. semaphore), каналы (англ. pipe), и т.д. Каждый метод межпроцессного взаимодействия обладает своими плюсами и минусами. Например, метод совместного использования памяти (англ. shared memory) предъявляет низкие требования к используемым вычислительным ресурсам, но в случае, если при реализации синхронизации процессов были допущены ошибки, они скорее всего приведут к некорректной работе (зависаниям, падению производительности, неверным результатам и т.д.) сразу всех процессов, использующих общую память, а мьютексы (англ. mutex) в свою очередь просты в использовании, ошибки работы одного процесса практически не влияют на работу других процессов, но требовательны к вычислительным ресурсам. Кроме того, часть методов межпроцессного взаимодействия способна работать только в режиме пользователя, часть - более универсальна и способна работать в режиме ядра.

Зачастую требуются более сложные, чем описанные выше, методы синхронизации. В качестве примера, когда требуются методы синхронизации, стандартно не предоставляемые операционной системой, можно привести инициализацию драйверов – процесса, во время которого происходит выделение оперативной памяти, создание данных, используемых драйверами впоследствии для своей работы и т.д. В случае, когда для успешной инициализации одного драйвера требуются данные, предоставляемые другим драйвером (например, драйвер антивируса, анализируемый поведение файла, и драйвер антивируса, перехватываемый выполнение файла), необходима синхронизация работы упомянутых драйверов (т.е. необходима синхронизация инициализации драйверов) для того, чтобы избежать ситуации, когда запрашиваемые данные получить невозможно, поскольку соответствующий драйвер еще не был запущен или проинициализирован, в противном случае работоспособность как драйверов, участвующих в обмене данными, так и операционной системы в целом может быть нарушена. Основная сложность заключается в том, что работа драйвера в режиме ядра ограничена как со стороны программного обеспечения, так и со стороны аппаратной части: от невозможности доступа к некоторым функциям API операционной системы до обработки данных и взаимодействия с пользователями.

Например, в патентной публикации US 8434098 B2 описана технология работы драйвера, содержащего в себе элементы, работающие в режиме ядра, и элементы, работающие в пользовательском режиме. Драйвер загружается в пользовательском режиме и связывается с другими драйверами (которые также загружаются в пользовательском режиме) с помощью отложенного вызова процедур (англ. Deferred procedure call, DPC). Кроме того, упомянутый драйвер отслеживает поведение других драйверов для корректного выполнения своего функционала и предотвращения коллизий с последними. Хотя описанная технология хорошо справляется с задачами синхронизации обмена данными между драйверами, уже работающими в операционной системе и имеющими модули, работающие в режиме пользователя, она не справляется с синхронизацией драйверов в случае работы в режиме ядра, не может отслеживать очередность вызова.

Хотя описанные выше способы работы хорошо справляются с задачами синхронизации приложений и моделей драйверов, работающих в режиме пользователя, они зачастую не помогают решать проблемы синхронизации инициализации драйверов, работающих в режиме ядра.

Настоящее изобретение позволяет решать задачу синхронизации инициализации драйверов.

Раскрытие изобретения

Изобретение предназначено для передачи перехваченных запросов от драйвера к драйверу в процессе инициализации драйверов.

Технический результат настоящего изобретения заключается в гарантированной передаче запроса от драйвера А на доступ к данным, предоставляемым драйвером Б за счет обеспечения передачи упомянутого запроса драйверу Б не ранее момента завершения инициализации драйвера Б.

Еще один технический результат настоящего изобретения заключается в надежности передачи запроса от драйвера А на доступ к данным, предоставляемым драйвером Б за счет обеспечения передачи упомянутого запроса драйверу Б не ранее момента завершения инициализации драйвера Б.

Еще один технический результат настоящего изобретения заключается в повышении производительности передачи запроса от драйвера А на доступ к данным, предоставляемым драйвером Б.

Данные результаты достигаются с помощью использования реализуемого компьютером способа передачи перехваченных запросов от драйвера к драйверу в процессе инициализации упомянутых драйверов, при этом ни один из упомянутых драйверов на момент перехвата запросов еще не был проинициализирован, содержащий этапы, на которых: перехватывают запросы драйвера А1 и драйвера А2, при этом запрос от драйвера А1 перехватывают раньше запроса от драйвера А2, на доступ к данным, предоставляемым драйвером Б, который на момент перехвата запроса еще не инициализирован, при этом драйверам А1 и А2 для инициализации необходимы данные, предоставляемые проинициализированным драйвером Б; формируют связный список, элементами которого являются объекты синхронизации, каждый из которых представляет собой данные, содержащие: объект ядра операционной системы, который приостанавливает инициализацию создавшего объект синхронизации драйвера до тех пор, пока драйвер Б не выполнит инициализацию, и указатель, содержащий в случае, если связный список содержит более одного элемента, адрес объекта синхронизации, добавленного в связный список ранее; для чего: создают объект синхронизации в адресном пространстве драйвера А1, размещают в области глобальных данных драйвера Б адрес, указывающий на созданный объект синхронизации в драйвере А1; дополняют упомянутый связный список, для чего: создают объект синхронизации в адресном пространстве драйвера А2, устанавливают адрес, размещенный в области глобальных данных Б и указывающий на объект синхронизации, созданный ранее, как указатель в упомянутый объект синхронизации, созданный драйвером А2, размещают в области глобальных данных драйвера Б адрес, указывающий на созданный объект синхронизации в драйвере А2; после инициализации драйвера Б объект ядра операционной системы, содержащийся в каждом созданном объекте синхронизации из связного списка, средствами операционной системы разрешает продолжить инициализацию драйвера, создавшего соответствующий объект синхронизации; передают перехваченные на предыдущем этапе запросы драйверу Б.

В другом частном случае реализации способа в качестве данных, предоставляемых драйвером Б, выступают по меньшей мере: API функции; исполняемый код; входные параметры для драйверов А1 и А2.

Еще в одном частном случае реализации способа определение значения в области глобальных данных драйвера Б производится по заранее заданному адресу области глобальных данных.

В другом частном случае реализации способа в качестве объекта ядра операционной системы выступает объект KEVENT.

Еще в одном частном случае реализации способа объект ядра операционной системы находится в одном из двух состояний, определяемых тем, в каком этапе инициализации находится драйвер Б, при этом в одном состоянии объект ядра запрещает создавшему указанный объект ядра драйверам А1 и А2 продолжать инициализацию, а в другом состоянии разрешает драйверам А1 и А2 продолжать инициализацию.

В другом частном случае реализации способа после инициализации драйвера Б изменяют состояние каждого объекта ядра операционной системы, содержащихся в каждом объекте синхронизации, созданном соответствующими драйверами А1 и А2, причем изменение состояния производится таким образом, что каждый драйвер А1 и А2 продолжит инициализацию, приостановленную после создания объекта ядра операционной системы.

Еще в одном частном случае реализации способа в качестве области памяти драйверов А1 и А2, в которой создают объект синхронизации, выступает по меньшей мере: стек оперативной памяти драйверов А1 и А2; область глобальных данных драйверов А1 и А2.

В другом частном случае реализации способа заранее установленное значение в объекте синхронизации указывает на то, что данный объект синхронизации является последним созданным объектом синхронизации.

Краткое описание чертежей

Фиг. 1 иллюстрирует систему передачи перехваченных запросов от драйвера к драйверу в процессе инициализации драйверов.

Фиг. 2 иллюстрирует способ передачи перехваченных запросов от драйвера к драйверу в процессе инициализации драйверов.

Фиг. 3 представляет пример компьютерной системы общего назначения, персональный компьютер или сервер.

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

Описание вариантов осуществления изобретения

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

Введем ряд определений и понятий, которые будут использованы при описании вариантов осуществления изобретения.

Инициализация - задание начальных значений программных переменных (адресов, счетчиков, переключателей, указателей и т.п.) перед выполнением программы (например, приложения, драйвера, ядра операционной системы) с целью обеспечения работоспособности упомянутой программы.

Инициализация драйвера – процесс, во время которого происходит инициализация, приводящая к выделению оперативной памяти, созданию данных, используемых драйвером впоследствии для своей работы. Успешной инициализация драйвера является в случае, когда после ее завершения проинициализированный драйвер способен корректно выполнять весь предоставляемый им функционал.

Синхронизация процессов - приведение двух или нескольких процессов к такому их исполнению, при котором определенные стадии упомянутых процессов совершаются в заранее заданном порядке, либо одновременно.

Синхронизация инициализации драйверов - приведение двух или нескольких драйверов к такому их исполнению, при котором в ситуации, когда для успешной инициализации одного драйвера требуются данные, предоставляемые другим драйвером, не допускается ситуация, когда запрашиваемые первым драйвером данные получить невозможно, поскольку второй драйвер еще не был запущен (т.е. не был загружен в память и драйверу не было передано управление операционной системой) или проинициализирован (в противном случае работоспособность как драйверов, участвующих в обмене данными, так и операционной системы в целом может быть нарушена).

Фиг. 1 иллюстрирует систему передачи перехваченных запросов от драйвера к драйверу в процессе инициализации драйверов.

Структурная схема системы передачи перехваченных запросов от драйвера к драйверу в процессе инициализации драйверов содержит драйверы А 110, драйвер Б 120, средство перехвата 130, средство контроля 140, средство инициализации 150 и средство формирования связных списков 160.

Драйверы А 110 представляют собой драйверы, которым для инициализации необходимы данные, предоставляемые другим драйвером (драйвером Б 120), при этом для получения упомянутых данных драйвер А 110 формирует и передает запрос драйверу Б 120 на предоставление необходимых данных.

В одном из вариантов реализации системы запрос представляет собой команду, включающую в себя по меньшей мере:

тип запрашиваемых у драйвера Б 120 данных;

объем запрашиваемых данных;

входные параметры используемых в подготовке драйвером Б 120 данных;

адреса оперативной памяти, куда требуется передать запрашиваемые данные.

В одном из вариантов реализации системы в качестве данных, предоставляемых драйвером Б 120 драйверу А 110, выступают по меньшей мере:

интерфейс API-функций, содержащий адреса API-функций, типы входных параметров для упомянутых API функций;

исполняемый код;

входные параметры для драйверов А 110.

Например, драйвер А 110 производит проверку перехваченного файла на вредоносность, при этом одним из элементов проверки является проверка файла на доверенность, которую выполняет драйвер Б 120. Драйвер Б 120 предоставляет драйверу А 110 для упомянутой проверки специализированный API. Использование соответствующего API является использованием функционала драйвера Б 120 драйвером А 110.

В одном из вариантов реализации системы один из драйверов А 110 в процессе инициализации может создавать несколько потоков, каждый из которых посылает сформированный запрос к драйверу Б 120, обращается за данными к драйверу Б 120, а для успешной инициализации драйвера А 110 необходима корректная обработка данных, полученных от драйвера Б 120 каждым из упомянутых потоков.

Драйвер Б 120 представляет собой драйвер, который после своей инициализации предоставляет по запросу данные драйверам А 110.

В одном из вариантов реализации системы драйвер Б 120 может быть загружен в оперативную память и выполняться к моменту получения запроса от драйверов А 110 на предоставления данных, но все еще не может корректно обрабатывать запрос, получаемые от драйвера А 110 (например, для обработки полученного от А 110 запроса на шифрование данных, переданных в упомянутом запросе, драйверу Б 120 необходимо предварительно загрузить ключи шифрования, если упомянутые ключи на момент получения запроса от драйвера А 110 загружены еще не были, то шифрование данных осуществить невозможно). В таком состоянии драйвер Б 120 считается непроинициализированным.

Средство перехвата 130 предназначено для перехвата запросов по меньшей мере двух драйверов А 110 (драйвера А1 110.1 и драйвера А2 110.2) на предоставление данных драйвером Б 120 (т.е. на доступ драйверов А 110 к данным, предоставляемым драйвером Б 120), который на момент перехвата запросов еще не инициализирован, при этом драйверам А1 110.1 и А2 110.2 для инициализации необходимы данные, предоставляемые проинициализированным драйвером Б 120.

В одном из вариантов реализации системы средство перехвата 130 может осуществлять перехват запросов от драйверов А 110 с помощью работающего в операционной системе драйвера (например, драйвера, встраиваемого в обработчик вызова WinAPI функций, который при обнаружении вызова функций и т.д. передает перехваченные запросы средству перехвата 130) или средствами самой операционной системы (не отображены на Фиг. 1) (аналогично описанному выше примеру со специализированным драйвером, только в данном случае сам обработчик вызова WinAPI функций при обнаружении вызова функций и т.д. передает обрабатываемые запросы средству перехвата 130).

Средство контроля 140 предназначено для выявления состояния инициализации драйвера Б 120 с помощью определения значения в области глобальных данных драйвера Б 120 (область памяти драйвера Б 120, область видимости которой такова, что данные в упомянутой области памяти драйвера Б 120 доступны всем драйверам, работающие в операционной системе), при этом в качестве состояния инициализации драйвера выступают по меньшей мере:

драйвер еще не запущен;

драйвер запущен, но инициализацию еще не начал;

драйвер запущен, инициализацию начал, но еще не завершил;

драйвер запущен и успешно проинициализирован;

при этом в качестве определяемого значения выступает:

адрес, который указывает на объект синхронизации, созданный ранее одним из драйверов А 110 (драйвером А1 110.1), при этом объект синхронизации представляет собой совокупность данных, содержащих:

объект ядра операционной системы, в зависимости от состояния которого операционная система приостанавливает (до тех пор, пока драйвер Б 120 не завершит инициализацию) или возобновляет (после того как драйвер Б 120 не завершит инициализацию) инициализацию создавшего объект синхронизации драйвера А 110, и

указатель на другой объект синхронизации, который равен по меньшей мере одному из значений:

заранее установленному значению (например, если указатель не указывает ни на какой объект, то такой указатель называется нулевым, равным address = null = 0x000000, в другом примере любой указатель на объект всегда выравнен по 4, т.е. кратен 4 address = 4 * index, поэтому любое значение указателя, не кратное 4, может использоваться для хранения дополнительной информации, например, состояния объекта: 0x10000000 - указатель на объект, 0x10000001 - означает, что по адресу 0x10000000 существует объект и в текущий момент находится в состоянии #1 и т.д.);

адресу, указывающему на другой объект синхронизации, созданный ранее другим драйвером А 110;

начальное значение (заранее установленное разработчиками рассматриваемой системы), которое указывает на отсутствие объекта синхронизации (т.е. что ни один драйвер А 110 не создал еще объекта синхронизации, и тем самым указатель на объект синхронизации отсутствует).

Средство инициализации 150 предназначено для инициализации драйвера 120, при этом инициализация драйвера Б 120 включает в себя выполнение, в результате которого драйвер Б 120 получает возможность обрабатывать запросы от драйверов А 110 и предоставлять по упомянутым запросам драйверам А 110 данные.

Средство формирования связных списков 160 предназначено для формирования связного списка, элементами которого являются объекты синхронизации, каждый из которых представляет собой данные, содержащие:

объект ядра операционной системы (сам объект ядра операционной системы или указатель на упомянутый объект ядра операционный системы), который приостанавливает инициализацию создавшего объект синхронизации драйвера А 110 до тех пор, пока драйвер Б 120 не выполнит инициализацию, и

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

для чего упомянутое средство 160:

создает объект синхронизации и размещает в адресном пространстве драйвера А1 110.1,

размещает в области глобальных данных драйвера Б 120 адрес, указывающий на созданный объект синхронизации в драйвере А1 110.1,

а также для дополнения упомянутого связного списка, для чего упомянутое средство 160

создает объект синхронизации и размещает в адресном пространстве драйвера А2 110.2,

устанавливает адрес, размещенный в области глобальных данных драйвера Б 120 и указывающий на объект синхронизации, созданный ранее, как указатель в упомянутый объект синхронизации, созданный драйвером А2 110.2,

размещает в области глобальных данных драйвера Б 120 адрес, указывающий на созданный объект синхронизации в драйвере А2 110.2.

Фиг. 2 иллюстрирует способ передачи перехваченных запросов от драйвера к драйверу в процессе инициализации драйверов.

Структурная схема способа передачи перехваченных запросов от драйвера к драйверу в процессе инициализации драйверов содержит следующие этапы: этап 200, на котором выполняют инициализацию драйвера Б 120, этап 210, на котором перехватывают запросы драйверов А 110 к драйверу Б 120, этап 220, на котором выявляют состояние инициализации драйвера Б 120, этап 230, на котором формируют связные списки, этап 240, на котором средствами операционной системы возобновляют инициализацию драйверов А 110, этапа 250, на котором передают перехваченные запросы от драйверов А 110 драйверу Б 120.

На этапе 200 инициализируют драйвер Б 120, при этом инициализация драйвера Б 120 может не быть завершена к моменту, когда драйверы А 110 передадут свои запросы драйверу Б 120 на доступ к данным, предоставляемым драйвером Б 120.

При этом инициализация заключается в выполнении действий драйвером Б 120, в результате которых драйвер Б 120 получает возможность предоставлять по запросу данные драйверам А 110.

В одном из вариантов реализации способа драйвер Б 120 может быть загружен в оперативную память и выполняться к моменту получения запроса от драйверов А 110 на предоставления данных, но все еще не обладает функционалом для корректной обработки запроса, получаемые от драйвера А 110 (например, для обработки полученного от А 110 запроса на шифрование данных, переданных в упомянутом запросе, драйверу Б 120 необходимо предварительно загрузить ключи шифрования, если упомянутые ключи на момент получения запроса от драйвера А 110 загружены не были, то шифрование данных осуществить невозможно). В таком состоянии драйвер Б 120 считается непроинициализированным, в противном случае драйвер Б 120 считается проинициализированным и получает возможность предоставлять данные по запросу драйвера А 110.

В одном из вариантов реализации способа драйвер Б 120 не только не будет инициализирован, но даже не будет запущен до момента, когда драйверы А 110 передадут запросы драйверу Б 120 на доступ к данным, предоставляемым драйвером Б 120 (т.е. возможна ситуация, когда драйверы А 110 будут запущены раньше драйвера Б 120).

В одном из вариантов реализации способа драйвер Б 120 инициализируется средствами операционной системы (например, с помощью API, предоставляемой операционной системой).

Например, драйвер Б 120 способен шифровать приватным ключом {K} данные, получаемые от драйверов А 110, и передать их обратно драйверам А 110 для последующего использования. Хотя драйвер Б 120 может быть загружен в оперативную память и выполняться к моменту получения данных от драйверов А 110, до тех пор, пока он не получит приватный ключ {K} (например, загрузить с жесткого диска), он не сможет выполнять функционал, запрашиваемый драйверами А 110, таким образом, для драйверов А 110, драйвер Б 120 не будет инициализирован (до тех пор, пока не загрузит приватный ключ {K} в оперативную память).

При этом драйвер Б 120 может предоставлять разные данные по запросам разных драйверов А 110 (выполнять разный функционал). Что в свою очередь означает, что драйвер Б 120 может быть в определенный момент времени инициализирован для предоставления одних данных и не инициализирован для предоставления других данных, что в свою очередь может привести к тому, что один из драйверов А 110 (драйвер А1 110.1) сможет продолжить свою инициализацию, а другой (драйвер А2 110.2) - нет (не смог получить требуемые данные от драйвера Б 120).

Например, драйвер Б 120 способен:

шифровать приватным ключом {K} данные, получаемые от драйверов А 110, и передать их обратно драйверам А 110 для последующего использования,

проверять на вредоносность данные, получаемые от драйверов А 110, и передавать обратно драйверам А 110 результаты упомянутой проверки.

Драйвер Б 120 может быть загружен в оперативную память и выполняться к моменту получения данных от драйверов А 110 (драйвера А1 110.1, передающего драйверу Б 120 данные для шифрования и драйвера А2 110.2, передающего драйверу Б 120 данные для проверки на вредоносность), кроме того, драйвером Б 120 может уже быть получен приватный ключ {K} для выполнения шифрования данных (например, может быть загружен с жесткого диска), но еще не получены антивирусные базы для проверки данных на вредоносность. В таком состоянии драйвер Б 120 сможет выполнять функционал, запрашиваемый драйверами А1 110.1, и не сможет - запрашиваемый драйвером А2 110.2.

На этапе 210 перехватывают запросы по меньшей мере двух драйверов А 110 (драйвера А1 110.1 и драйвера А2 110.2) на доступ к данным, предоставляемым драйвером Б 120, который на момент перехвата запросов еще не инициализирован, при этом драйверам А1 110.1 и А2 110.2 для инициализации необходимы данные, предоставляемые проинициализированным драйвером Б 120.

Таким образом:

драйвера А 110 представляют собой драйвера, которым для инициализации необходимы данные, предоставляемые другим драйвером (драйвером Б 120),

драйвер Б 120 представляет собой драйвер, который после своей инициализации предоставляет по запросу данные драйверам А 110.

В одном из вариантов реализации способа в качестве данных, предоставляемых драйвером Б 120, выступают по меньшей мере:

интерфейс API-функций, содержащий адреса API-функций, типы входных параметров для упомянутых API функций;

исполняемый код;

входные параметры для драйверов А 110.

Например, драйвер Б 120 может предоставлять интерфейс, т.е. адрес, по которому один из драйверов А 110 должен передавать данные, формат передаваемых данных и адрес, по которому еще один из драйверов А 110 сможет получать обработанные данные (по аналогии с тем, как работают DLL библиотеки).

Упомянутый пример можно представить в виде псевдокода:

В другом случае, драйвер Б 120 может предоставлять данные, которые один из драйверов А 110 будет обрабатывать как исполняемый код (т.е. данные будут содержать наборы команд, понятные операционной системе или процессору, на котором работает один из драйверов А 110), и после получения данных от драйвера Б 120 один из драйверов А 110 сможет передать на упомянутые данные управление.

Упомянутый пример можно представить в виде псевдокода:

Еще в одном случае драйвер Б 120 может предоставлять «голые данные» (англ. raw data), которые один из драйверов А 110 будет использовать для дальнейшей обработки.

Упомянутый пример можно представить в виде псевдокода:

На этапе 220 выявляют состояние инициализации драйвера Б 120 с помощью определения значения в области глобальных данных драйвера Б 120, при этом в качестве состояния инициализации драйвера выступают по меньшей мере:

драйвер еще не запущен;

драйвер запущен, но инициализацию еще не начал;

драйвер запущен, инициализацию начал, но еще не завершил;

драйвер запущен и успешно проинициализирован;

при этом в качестве определяемого значения выступает:

адрес, который указывает на объект синхронизации, созданный ранее одним из драйверов А 110 (драйвером А1 110.1), при этом объект синхронизации представляет собой совокупность данных, содержащих:

объект ядра операционной системы, в зависимости от состояния которого операционная система приостанавливает (до тех пор, пока драйвер Б 120 не завершит инициализацию) или возобновляет (после того как драйвер Б 120 не завершит инициализацию) инициализацию создавшего объект синхронизации драйвера А 110, и

указатель на другой объект синхронизации, который равен по меньшей мере одному из значений:

заранее установленному значению (например, если указатель не указывает ни на какой объект, то такой указатель называется нулевым, равным address = null = 0x000000, в другом примере любой указатель на объект всегда выравнен по 4, т.е. кратен 4 address = 4 * index, поэтому любое значение указателя, не кратное 4, может использоваться для хранения дополнительной информации, например состояния объекта: 0x10000000 - указатель на объект, 0x10000001 - означает, что по адресу 0x10000000 существует объект и в текущий момент находится в состоянии #1 и т.д.),

адресу, указывающему на другой объект синхронизации, созданный ранее другим драйвером А 110;

начальное значение (заранее установленное разработчиками рассматриваемой системы), которое указывает на отсутствие объекта синхронизации (т.е. что ни один драйвер А 110 не создал еще объекта синхронизации и тем самым указатель на объект синхронизации отсутствует). В одном из вариантов реализации способа на этапе 220 определение значения в области глобальных данных драйвера Б 120 производится по заранее заданному адресу области глобальных данных драйвера Б 120.

Например, при реализации синхронизации инициализации драйверов разработчиком упомянутой реализации может быть задан конкретный адрес в области глобальных данных драйвера Б 120 (например, 0х802В7Е15), значения по которому используются при дальнейшей обработке. В другом варианте реализации способа адрес в области глобальных данных может отличаться (например, 0x803243F6).

Еще в одной реализации способа на этапе 220 определение значения в области глобальных данных драйвера Б 120 производится по адресу глобальной области данных, вычисляемому на основании значений внутренних статических переменных упомянутого драйвера Б 120, заданных разработчиками драйвера Б 120.

Например, упомянутый адрес в области глобальных данных драйвера Б 120 может вычисляться как контрольная сумма (к примеру, CRC32) от пути, по которому расположен драйвер Б 120 на запоминающем устройстве:

Т.е. адрес в области глобальных данных драйвера Б 120 может задаваться таким образом, чтобы любой драйвер А 110 однозначно мог его вычислить вне зависимости от условий работы (время и порядок запуска драйверов и других приложений операционной системы, доступные вычислительные ресурсы, например объем оперативной памяти, действия пользователя и т.д.) драйвера А 110, драйвера Б 120 и операционной системы в целом.

На этапе 230 формируют связный список, элементами которого являются объекты синхронизации, каждый из которых представляет собой данные, содержащие:

объект ядра операционной системы, который приостанавливает инициализацию создавшего объект синхронизации драйвера до тех пор, пока драйвер Б 120 не выполнит инициализацию, и

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

для чего:

создают объект синхронизации в адресном пространстве драйвера А1 110.1,

размещают в области глобальных данных драйвера Б 120 адрес, указывающий на созданный объект синхронизации в драйвере А1 110.1.

Также формируют еще один связный список для чего:

создают объект синхронизации в адресном пространстве драйвера А2 110.2,

устанавливают адрес, размещенный в области глобальных данных Б и указывающий на объект синхронизации, созданный ранее, как указатель в упомянутый объект синхронизации, созданный драйвером А2 110.2,

размещают в области глобальных данных драйвера Б 120 адрес, указывающий на созданный объект синхронизации в драйвере А2 110.2.

В одном из вариантов реализации способа в качестве объекта ядра операционной системы выступает объект KEVENT.

При работе с объектом KEVENT может использоваться функция операционной системы KeWaitForSingleObject для отслеживания состояний объекта KEVENT, таким образом вызвавший упомянутую функцию драйвер может определять текущее состояние объекта KEVENT.

В одном из вариантов реализации способа объект ядра операционной системы находится в одном из двух состояний, определяемых тем, на каком этапе инициализации находится драйвер Б 120, при этом в одном состоянии объект ядра запрещает создавшим указанный объект ядра драйверам А 110 (драйверу А1 110.1 и драйверу А2 110.2) продолжать инициализацию, а в другом состоянии разрешает драйверам А 110 продолжать инициализацию.

В одном из вариантов реализации способа запрет драйверу продолжить инициализацию реализуется средствами операционной системы - в зависимости от состояния объекта ядра операционной системы операционная система приостанавливает выполнение потока, в котором происходит инициализация упомянутого драйвера, или выполнение упомянутого потока возобновляет (в случае, если оно было остановлено ранее).

Например, над объектом KEVENT можно выполнить два действия:

сбросить объект KEVENT (англ. reset kevent), при этом в сброшенном состоянии (т.е. в состоянии, в который объект KEVENT был переведен ядром операционной системы после вызова функции сброса объекта KEVENT, например KeResetEvent) после вызова функции