Какие есть "цивильные" способы сделать позднее связывание (идеально, конечно, что то типа dll библиотеки) в ядре?
я не буду спрашивать нафига =) кернелмодный лоадер вполне себе рекурсивный: (sysload.c) MiResolveImageReferences->MmLoadSystemImage то есть возможно и статический и динамический импорт. Но я никогда не пробовал так делать, возможно __declspec нормально обработается. Естественно драйвер-библиотека должен быть уже прописан в реестре.
Это всё понятно, но у автора речь про позднее связывание, т.е. если я правильно понял, таблица импорта отпадает, не?
импорт в любом виде будет поздним связыванием, тк адреса функций в обоих случаях вычисляются на стадии выполнения. Ранее связывание это скорее статическая линковка.
Я извиняюсь, но метод линковки (dll linkage) и связывание (binding) это разные вещи, не надо смешивать. Линковка бывает статической (.lib-файл с кодом) или динамической (.lib-файл без кода или иной способ). Связывание бывает раннее (во время загрузки модуля, но до выполнения его кода) или позднее (после загрузки, во время выполнения). Ещё есть отложенное связывание (delay import), но это автору не нужно, как я понял, да и в ядре оно вроде бы нереализуемо полноценно (хотя тут могу ошибаться). Ну это я так, чтобы прояснить терминологию.
Извиняюсь, нужно было сразу сформулировать задачу. Допустим есть драйвер работающий под раными платформами (от XP до 7). Причем на Vista/Win7 он может использовать функции (например API от WFP) которые не существуют под XР. Идеально бы было вынести платформенно зависемый код в динамическую библиотеку, чтоб не компилировать отдельный драйвер под каждую плафрому.