Часть 1.
И снова здравствуйте, пришло время продолжить работу над нашим драйвером.
На данный момент мы:
Так как наш драйвер пока что не сделал ничего, чтобы потребовало дополнительных действий перед его выгрузкой, наша функция будет выглядеть крайне просто.
В коде DriverEntry также передадим указатель на
Теперь пересобираем наш драйвер, и проверим, работает ли выгрузка. На тестовой машине вызываем службу запуска драйвера.
Теперь вызовем службу остановки драйвера.
Отлично! функция
Наш драйвер большой молодец: умеет загружаться и выгружаться! Однако, все понимают, да и он сам понимает, что он бесполезен.
Давайте научим его делать что-нибудь. Я бы хотел, чтобы он собирал информацию о системе, на которой он запущен.
Для этого надо проштудировать
Например, давайте определим какая версия Windows установлена на нашей машине.
Для этого нам пригодятся структура
Инициализируем новую структуру info в которой будут записаны данные
Далее передадим функции RtlGetVersion адрес нашей структуры.
Теперь, все что нам надо - это вывести необходимую информацию.
Пересобираем драйвер и проверяем результат.
Все отработало отлично, и теперь наш драйвер стал чуточку полезнее.
На этом вторая часть закончена. Я решил не писать полотна текста, а поставлять информацию небольшими частями. Причин на это несколько:
Всем спасибо!
ПС: Как выяснилось книгу "Windows Kernel Programming" перевели на
Как выгрузить драйвер и первый функционал.
И снова здравствуйте, пришло время продолжить работу над нашим драйвером.
На данный момент мы:
- Настроили рабочее окружение
- Настроили тестовую машину
- Написали, скомпилировали и даже запустили наш первый драйвер
Ссылка скрыта от гостей
, которая принимает в себя указатель на DriverObject и возвращает void.Так как наш драйвер пока что не сделал ничего, чтобы потребовало дополнительных действий перед его выгрузкой, наша функция будет выглядеть крайне просто.
C++:
void CodebyDriverUnload(_In_ PDRIVER_OBJECT DriverObject) {
UNREFERENCED_PARAMETER(DriverObject);
KdPrint(("CodebyDriverUnload called.\n"));
}
В коде DriverEntry также передадим указатель на
DriverObject
.DriverObject->DriverUnload = CodebyDriverUnload;
Теперь пересобираем наш драйвер, и проверим, работает ли выгрузка. На тестовой машине вызываем службу запуска драйвера.
sc start CodebyDriver
Теперь вызовем службу остановки драйвера.
sc stop CodebyDriver
Отлично! функция
CodebyDriverUnload
отработала.Наш драйвер большой молодец: умеет загружаться и выгружаться! Однако, все понимают, да и он сам понимает, что он бесполезен.
Давайте научим его делать что-нибудь. Я бы хотел, чтобы он собирал информацию о системе, на которой он запущен.
Для этого надо проштудировать
Ссылка скрыта от гостей
. Например, давайте определим какая версия Windows установлена на нашей машине.
Для этого нам пригодятся структура
Ссылка скрыта от гостей
и функция
Ссылка скрыта от гостей
.Инициализируем новую структуру info в которой будут записаны данные
OSVERISONINFOW
.
C++:
RTL_OSVERSIONINFOW info = { sizeof(info) };
Далее передадим функции RtlGetVersion адрес нашей структуры.
C++:
RtlGetVersion(&info);
Теперь, все что нам надо - это вывести необходимую информацию.
C++:
KdPrint(("Windows Version: %d.%d.%d PlatformID: %d\n", info.dwMajorVersion, info.dwMinorVersion, info.dwBuildNumber, info.dwPlatformId ));
Пересобираем драйвер и проверяем результат.
C++:
#include <ntddk.h>
void CodebyDriverUnload(_In_ PDRIVER_OBJECT DriverObject) {
UNREFERENCED_PARAMETER(DriverObject);
KdPrint(("CodebyDriverUnload called.\n"));
}
extern "C"
NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath)
{
UNREFERENCED_PARAMETER(DriverObject);
UNREFERENCED_PARAMETER(RegistryPath);
KdPrint(("Hi Codeby, this is our first driver! Yuhu!\n"));
RTL_OSVERSIONINFOW info = { sizeof(info) };
RtlGetVersion(&info);
KdPrint(("Windows Version: %d.%d.%d PlatformID: %d\n", info.dwMajorVersion, info.dwMinorVersion, info.dwBuildNumber, info.dwPlatformId ));
DriverObject->DriverUnload = CodebyDriverUnload;
return STATUS_SUCCESS;
}
На этом вторая часть закончена. Я решил не писать полотна текста, а поставлять информацию небольшими частями. Причин на это несколько:
- Материал не из легких и усвоить все сразу в больших количествах будет сложно, что может отбить интерес.
- Писать небольшие статьи проще и менее ресурсозатратно лично для меня.
Всем спасибо!
ПС: Как выяснилось книгу "Windows Kernel Programming" перевели на
Ссылка скрыта от гостей
. Спасибо M0r7iF3r за наводку.