Система и способ передачи перехваченных запросов от драйвера к драйверу в процессе инициализации драйверов
SYSTEM AND METHOD OF TRANSMITTING INTERCEPTED DRIVE TO DRIVER REQUESTS FROM DURING INITIALISATION OF DRIVERS

Область техники
Изобретение относится к исполнению программного кода, а более конкретно к системам и способам передачи перехваченных запросов от драйвера к драйверу в процессе инициализации драйверов.
Уровень техники
На текущий момент подавляющее большинство операционных систем на вычислительных устройствах (серверов, персональных компьютеров, ноутбуков, мобильных устройств и т.п.) работает в многозадачном режиме - режиме, в котором процессы, порожденные в операционных системах, работающих на упомянутых вычислительных устройствах, могут в свою очередь состоять из нескольких потоков, которые также могут выполняться параллельно (многопоточность).
Основная сложность реализации работы в многозадачном режиме заключается в обеспечении синхронизации процессов - приведении двух или нескольких процессов к такому их исполнению, при котором определенные стадии упомянутых процессов совершаются в заранее заданном порядке, либо одновременно.
Обеспечение такого выполнения процессов, при котором определенные стадии упомянутых процессов совершаются в определенном порядке, либо одновременно.
Синхронизация необходима в случаях, когда параллельно выполняющимся процессам необходимо взаимодействовать друг с другом.
Для организации синхронизации процессов применяются методы межпроцессного взаимодействия (англ. 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) после вызова функции KeWaitForSingleObject, отслеживающей состояние объекта KEVENT, управление не возвращается вызвавшему упомянутую функцию драйверу, таким образом ядро операционной системы приостанавливает исполнение драйвера, ожидая пока состояние объекта KEVENT будет изменено, т.е. будет установлен объект KEVENT (англ. set kevent);
установить объект KEVENT (англ. reset kevent),
при этом в установленном состоянии (т.е. в состоянии, в который объект KEVENT был переведен ядром операционной системы после вызова функции установки объекта KEVENT, например KeSetEvent) после вызова функции KeWaitForSingleObject, отслеживающей состояние объекта KEVENT, управление будет возвращено вызвавшему упомянутую функцию драйверу, таким образом драйвер сможет продолжить свою инициализацию.
При этом после инициализации драйвера Б 120 изменяют состояние каждого из объектов ядра операционной системы, содержащихся в каждом объекте синхронизации, созданном соответствующим драйвером А 110 (драйвером А1 110.1 и драйвером А2 110.2) на этапе 230, причем изменение состояния производится таким образом, что каждый драйвер А 110 продолжит инициализацию, приостановленную после создания объекта ядра операционной системы.
В одном из вариантов реализации способа в качестве области памяти адресного пространства драйвера А 110, в которой создают объект синхронизации, выступает по меньшей мере:
стек оперативной памяти драйвера А 110;
область глобальных данных драйвера А 110.
В одном из вариантов реализации способа заранее установленное значение в объекте синхронизации указывает на то, что данный объект синхронизации является последним созданным объектом синхронизации.
На этапе 240 после инициализации драйвера Б 120 (выполненного на этапе 200) объект ядра операционной системы, содержащийся в каждом созданном объекте синхронизации, разрешает продолжить инициализацию соответствующего драйвера А 110 (т.е. операционная система в зависимости от состояния объекта ядра операционной системы приостанавливает или возобновляет выполнение процесса, в котором происходит инициализация драйвера А 110), для чего упомянутый объект ядра операционной системы переводится в такое состояние, для которого операционная система позволяет продолжить выполнение драйвера, выполняющего инициализацию (т.е. продолжить свою инициализацию).
На этапе 250 передают перехваченные запросы от каждого драйвера А 110 драйверу Б 120.
После передачи упомянутого запроса драйвер Б 120 предоставляет затребованные данные драйверу А 110.
Таким образом реализуется синхронизация инициализации драйверов А 110 и драйвера Б 120, т.е. работа драйвера А 110 зависит от состояния, в котором находится драйвер Б 120, и состоит из этапов, на начало, завершение и ход которых влияет состояние драйвера Б 120.
Описанная выше технология может работать не только на уровне драйверов (когда к драйверу Б 120 обращаются несколько драйверов А 110, например драйвер А1 110.1 и драйвер А2 110.2), но и на уровне потоков одного драйвера А 110.
В одном из вариантов реализации способа один из драйверов А 110 создает несколько потоков, каждый из которых обладает своей функциональностью. Например, поток #1 передает драйверу Б 120 данные для шифрования, поток #2 передает драйверу Б 120 данные для проверки на вредоносность. При обращении к драйверу Б 120, в случае, когда упомянутый драйвер еще не инициализирован, выполнение соответствующего потока приостанавливается до тех пор, пока драйвер Б 120 не будет проинициализирован. При этом также возможна и описанная выше ситуация, когда драйвер Б 120 загружен в оперативную память и выполняется к моменту получения запроса от потока #1 драйвера А 110 (поток #1 передает драйверу Б 120 данные для шифрования) и от потока #2 драйвера А 110 (поток #2 передает драйверу Б 120 данные для проверки на вредоносность), кроме того, драйвером Б 120 может уже быть получен приватный ключ {К} для выполнения шифрования данных (например, может быть загружен с жесткого диска), но еще не получены антивирусные базы для проверки данных на вредоносность. В таком состоянии драйвер Б 120 сможет выполнять функционал, запрашиваемый потоком #1 драйвера А 110, и не сможет - запрашиваемый потоком #2 драйвера 110.
Описанная выше технология выполняется:
на стороне соответствующих драйверов А 110 и Б 120,
в этом случае соответствующий функционал добавляется в драйверы на уровне компиляции с помощью отвечающих за реализацию библиотек или уже во время выполнения за счет подключения динамических библиотек с последующим использованием соответствующих функций из них;
на стороне ядра операционной системы,
в этом случае соответствующий функционал реализован на стороне ядра операционной системы, таким образом в самих драйверах А 110 и Б 120 происходят лишь вызовы соответствующих API-функций, вся логика работы находится на стороне ядра операционной системы и полностью непрозрачна для упомянутых драйверов.
Драйвер А 110:
Драйвер Б 120:
Осуществление описанной синхронизации инициализации драйверов в потоке инициализации драйверов позволяет решить несколько фундаментальных проблем:
обеспечить гарантированную инициализацию драйверов, т.е. повысить их работоспособность,
устранить возможность неустранимого сбоя операционной системы, связанного с невозможностью работы одного из инициализируемых драйверов.
Кроме того, используемые ресурсы (такие как объект KEVENT), используемые для описанной синхронизации инициализации драйверов в потоке инициализации драйверов, обеспечивают ряд преимуществ перед существующими решениями в области синхронизации, а именно:
уменьшение используемой оперативной памяти при выполнении синхронизации инициализации драйверов,
поскольку с одной стороны объект KEVENT представляет собой объект, занимающий и использующий мало места в оперативной памяти, без дополнительного функционала, реализованного через многочисленные API-функции, а с другой стороны объекты синхронизации представляют собой также объекты, занимающий и использующий мало места в оперативной памяти, содержащие лишь указатели и занимающие минимальный объем в оперативной памяти;
уменьшение времени, затраченного на выполнение синхронизации инициализации драйверов,
поскольку, как описано выше, объекты синхронизации «компактны», и как следствие на их создание и обработку требуется незначительное время, при этом сама обработка заключается лишь в небольшом количестве операций сравнения.
Рассмотрим работу способа синхронизации инициализации драйверов в потоке инициализации драйверов на примере инициализации драйверов антивирусного программного обеспечения: драйвера klark.sys (далее, драйвер А), предназначенного для блокировки недоверенных потоков операционной системы (т.е. потоков, о которых отсутствует информация о том, что упомянутые потоки не несут прямой или косвенный урон пользователям), и драйвера klif.sys (далее, драйвер Б), предназначенного для определения, является ли исследуемый поток операционной системы доверенным или нет, при этом для работы драйверу klark.sys требуются данные, получаемые и предоставляемые драйвером klif.sys через специализированный API.
Драйвер А обращается к драйверу Б с целью проверить, является ли поток chrome.exe (далее, поток #1) доверенным. Для начала драйвер А проверяет, проинициализирован ли драйвер Б. С этой целью драйвер А получает по адресу 0xE1AD7A8B в области глобальных данных драйвера Б (адрес которой был определен разработчиками программного обеспечения, обеспечивающего синхронизацию в потоке инициализации драйверов) 32-битное численное значение, характеризующее текущее состояние драйвера Б. Поскольку драйвер Б еще не проинициализирован к моменту, когда драйвер А запрашивает данные, а обращение драйвера А к драйверу Б является первым из подобных обращений, то полученное значение равно 0x00000000, что соответствует неинициализированному драйверу Б.
Далее драйвер А:
средствами операционной системы создает объект KEVENT (событие ядра) (далее, kevent #1) и получает указатель на него;
создает в области данные своего стека по адресу 0x803243F6 (определяется средствами операционной системы) объект синхронизации, представляющий собой два 32-битных значения, одно из которых является указателем на созданный ранее объект kevent #1, а другое является пустым указателем (0x00000000);
по адресу 0xE1AD7A8B в области глобальных данных драйвера Б заменяют текущее значение (0x00000000) на адрес созданного объекта синхронизации.
После того как объект синхронизации создан, драйвер А вызывает функцию операционной системы KeWaitForSingleObject для ожидания изменения состояния созданного объекта kevent #1.
Тем временем драйвер Б был успешно запущен и проинициализирован. После завершения инициализации драйвер Б проверяет значение по адресу 0xE1AD7A8B в области глобальных данных драйвера Б.
Драйвер А заново обращается к драйверу Б с целью проверки на недоверенность поток #2. Вначале он проверяет, проинициализирован ли драйвер Б. С этой целью драйвер А получает по адресу в области глобальных данных драйвера Б 0xE1AD7A8B состояние драйвера Б.
Драйвер А заново обращается к драйверу Б с целью проверки на недоверенность поток #3. Вначале он проверяет, проинициализирован ли драйвер Б. С этой целью драйвер А получает по адресу в области глобальных данных драйвера Б 0xE1AD7A8B состояние драйвера Б. Поскольку драйвер Б уже проинициализирован, то полученное состояние имеет значение OxFFFFFFFF (данное значение было выбрано заранее разработчиками для описанного состояния). Определив по упомянутому значению состояния драйвера Б, что драйвер Б уже проинициализирован драйвер А передает запрос драйверу Б на проведение проверки на недоверенность анализируемого потока (т.е. минуя все описанные выше вспомогательные действия, обеспечивающие синхронизацию инициализируемых драйверов).
Фиг. 3 представляет пример компьютерной системы общего назначения, персональный компьютер или сервер 20, содержащий центральный процессор 21, системную память 22 и системную шину 23, которая содержит разные системные компоненты, в том числе память, связанную с центральным процессором 21. Системная шина 23 реализована, как любая известная из уровня техники шинная структура, содержащая в свою очередь память шины или контроллер памяти шины, периферийную шину и локальную шину, которая способна взаимодействовать с любой другой шинной архитектурой. Системная память содержит постоянное запоминающее устройство (ПЗУ) 24, память с произвольным доступом (ОЗУ) 25. Основная система ввода/вывода (BIOS) 26 содержит основные процедуры, которые обеспечивают передачу информации между элементами персонального компьютера 20, например, в момент загрузки операционной системы с использованием ПЗУ 24.
Персональный компьютер 20 в свою очередь содержит жесткий диск 27 для чтения и записи данных, привод магнитных дисков 28 для чтения и записи на сменные магнитные диски 29 и оптический привод 30 для чтения и записи на сменные оптические диски 31, такие как CD-ROM, DVD-ROM и иные оптические носители информации. Жесткий диск 27, привод магнитных дисков 28, оптический привод 30 соединены с системной шиной 23 через интерфейс жесткого диска 32, интерфейс магнитных дисков 33 и интерфейс оптического привода 34 соответственно. Приводы и соответствующие компьютерные носители информации представляют собой энергонезависимые средства хранения компьютерных инструкций, структур данных, программных модулей и прочих данных персонального компьютера 20.
Настоящее описание раскрывает реализацию системы, которая использует жесткий диск 27, сменный магнитный диск 29 и сменный оптический диск 31, но следует понимать, что возможно применение иных типов компьютерных носителей информации 56, которые способны хранить данные в доступной для чтения компьютером форме (твердотельные накопители, флеш карты памяти, цифровые диски, память с произвольным доступом (ОЗУ) и т.п.), которые подключены к системной шине 23 через контроллер 55.
Компьютер 20 имеет файловую систему 36, где хранится записанная операционная система 35, а также дополнительные программные приложения 37, другие программные модули 38 и данные программ 39. Пользователь имеет возможность вводить команды и информацию в персональный компьютер 20 посредством устройств ввода (клавиатуры 40, манипулятора «мышь» 42). Могут использоваться другие устройства ввода (не отображены): микрофон, джойстик, игровая консоль, сканер и т.п. Подобные устройства ввода по своему обычаю подключают к компьютерной системе 20 через последовательный порт 46, который в свою очередь подсоединен к системной шине, но могут быть подключены иным способом, например, при помощи параллельного порта, игрового порта или универсальной последовательной шины (USB). Монитор 47 или иной тип устройства отображения также подсоединен к системной шине 23 через интерфейс, такой как видеоадаптер 48. В дополнение к монитору 47, персональный компьютер может быть оснащен другими периферийными устройствами вывода (не отображены), например колонками, принтером и т.п.
Персональный компьютер 20 способен работать в сетевом окружении, при этом используется сетевое соединение с другим или несколькими удаленными компьютерами 49. Удаленный компьютер (или компьютеры) 49 являются такими же персональными компьютерами или серверами, которые имеют большинство или все упомянутые элементы, отмеченные ранее при описании существа персонального компьютера 20, представленного на Фиг. 3. В вычислительной сети могут присутствовать также и другие устройства, например маршрутизаторы, сетевые станции, пиринговые устройства или иные сетевые узлы.
Сетевые соединения могут образовывать локальную вычислительную сеть (LAN) 50 и глобальную вычислительную сеть (WAN). Такие сети применяются в корпоративных компьютерных сетях, внутренних сетях компаний и, как правило, имеют доступ к сети Интернет. В LAN- или WAN-сетях персональный компьютер 20 подключен к локальной сети 50 через сетевой адаптер или сетевой интерфейс 51. При использовании сетей персональный компьютер 20 может использовать модем 54 или иные средства обеспечения связи с глобальной вычислительной сетью, такой как Интернет. Модем 54, который является внутренним или внешним устройством, подключен к системной шине 23 посредством последовательного порта 46. Следует уточнить, что сетевые соединения являются лишь примерными и не обязаны отображать точную конфигурацию сети, т.е. в действительности существуют иные способы установления соединения техническими средствами связи одного компьютера с другим.
В заключение следует отметить, что приведенные в описании сведения являются примерами, которые не ограничивают объем настоящего изобретения, определенного формулой.