Есть драйвер - c:\driver1.sys После того как он загружается - нужно загрузить другой драйвер, но по конкретно этому пути. Вопрос: возможно ли такое? Фишка в том что путь менять нельзя. Нужно подчистить какой-то список в ядре, чтобы драйвер там не святился? (типа уже загружен - STATUS_IMAGE_ALREADY_LOADED) ??
1) Открываешь исходники ядра WinXP 2) поиском находишь где используется константа STATUS_IMAGE_ALREADY_LOADED 3) Это будет функция MmLoadSystemImage и IopLoadDriver 4) Для примера возьмём IopLoadDriver т.к. код проверки почти такой же как и в MmLoadSystemImage 5) Далее видим код Код (Text): ExAcquireResourceSharedLite( &PsLoadedModuleResource, TRUE ); nextEntry = PsLoadedModuleList.Flink; while (nextEntry != &PsLoadedModuleList) { // // Look at the next boot driver in the list. // driverEntry = CONTAINING_RECORD( nextEntry, KLDR_DATA_TABLE_ENTRY, InLoadOrderLinks ); // // If this is not the kernel image (ntoskrnl) and not the HAL (hal), // then this is a driver, so initialize it. // if (RtlEqualUnicodeString( &baseName, &driverEntry->FullDllName, TRUE )) { status = STATUS_IMAGE_ALREADY_LOADED; ExReleaseResourceLite( &PsLoadedModuleResource ); IopBootLog(&baseName, TRUE); baseName.Buffer = NULL; goto IopLoadExit; } nextEntry = nextEntry->Flink; } ExReleaseResourceLite( &PsLoadedModuleResource ); т.е. как видно проверяется driverEntry->FullDllName Так что из первого драйвера подчищай этой значение и будет тебе счастье.
krol Можно, но тогда тебе надо выделить память в ядре неподкачиваемую, и тело функции потока туда записать, и функция должно быть базонезависима.
покажи код целиком который выделяет память и переносит код. И сделай DbgPrint с размером копируемых данных. т.к. очень часто при включенной оптимизации, функции перестанавливающий местами. т.е. код Код (Text): DWORD Proc1(PStr1 Param) { *** } void EndProc1() { } ***** Size = (ULONG_PTR)EndProc1 - (ULONG_PTR)Proc1; Size может быть вообще отрицательным или ооочень большим (в зависимости от типа)
Проблема решена. Наверный указатель на DbgPrint. Там еще кампилятор при call _DbgPrint вставлял jmp ds:__imp__DbgPrint Оттого и не откуда было "прыгать"