Можно ли из ядра загрузить драйвер (то есть один драйвер загружает другой)? Какие есть способы кроме ZwLoadDriver (не хочу создавать ключ реестра).
Хорошо. есть ещё вопрос. Как я понимаю, ядро всегда загружается по одному и тому же адресу. Могут ли меняться адреса функций ntoskrnl.exe при различных событиях (обновление системы, установка новых драйверов и т.д.). То есть могу ли я, скажем, один раз (во время инсталяции дрова) определить адреса нужных мне фунекций и намертво прошить их в дров. насколько стоит на это надеяться?
хм.. Я имею ввиду на конкретном компьютере. Неужели ntdll и kernel32 загружаеются всегда по одинаковым адресам, а ntoskrnl постоянно по разным? При загрузке: Код (Text): NTSTATUS __stdcall DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath) { SYSTEM_LOAD_AND_CALL_IMAGE ImageInfo = {InitUnicodeString(L"\\??\\c:\\test_driver.sys")}; NTSTATUS status; pDriverObject->DriverUnload = DriverUnload; status = ZwSetSystemInformation(SystemLoadAndCallImage,&ImageInfo,sizeof(SYSTEM_LOAD_AND_CALL_IMAGE)); DbgPrint("%08X",status); return STATUS_SUCCESS; } вылазит ошибка STATUS_NO_MEMORY = 0xC0000017. обычным способом test_driver.sys грузится нормально.
ZwSetSystemInformation нужно использовать с большой осторожностью, только в случае если понимаешь все ее минусы, в свое время убил кучу времени в непонтках, почему падает драйвер на строках по виду на 100 процентов корректных. Для ОФИЦИАЛЬНОГО так сказать софта ее не нужно использовать не вкоем случае. Я ее использовал только для загрузки драйвера, который снимал SSDT хуки, а потом с помощью ZwLoadDriver уже грузил полноценный драйвер.