Здравствуйте. Меня спросили: смогу ли я написать простейший динамический драйвер для чтения физической памяти? Я, имея некий опыт писания на С/С++, естественно ответил да. Потребовалось некоторое кол-во времени, чтобы осознать, что и как надо делать.
Я изучил теорию, почитал некоторую литературу по этой теме и решил перейти к практике. На практике все оказалось на много сложнее. А теперь по порядку:
Во-первых относительно написания самого драйвера, без всяких свистелок переделок.
За основу сначала я взял статью "Драйвер с нуля", потом книгу П. И. Рудаков, К. Г. Финогенов "Язык ассемблера: уроки программирования". Код был "адаптирован" под Вин7
* и в обоих случаях драйвер в WDK 7.6 не копмилится, пишет 5 ворнингов и 2 еррора, что делать не знаю.
Хелп?И собственно первый вопрос, обязательно прописывать строки, в частности последнюю, или хватит только первой или второй.
#define NT_DEVICE_NAME L"\\Device\\DrvrPro"
#define WIN32_DEVICE_NAME L"\\??\\DrvrPro"
#define DOS_DEVICE_NAME L"\DosDevices\DrvrPro"
Ну и следовательно надо ли везде таскать структуры для кажого типа устройства:
UNICODE_STRING unitNtName;
RtlInitUnicodeString(&unitNtName, NT_DEVICE_NAME);
UNICODE_STRING unitWinName;
RtlInitUnicodeString(&unitWinName, WIN32_DEVICE_NAME);
// И делать следующее действие, связывая их
IoCreateSimbolicLink(&unitWinName, &unitNtName);
Так же меня очень удивляет то, что в разных источниках авторы пишут одинаковые по содержанию функции xxxOpen и xxxClose, но разные по назначению, почему так?
* Хотел бы узнать, сильно ли отличается программирование драйверов на Вин7 от ХР, потому как я знаю, что в Висте и в 7 драйвера находятся не на нулевом уровне привилегий и помешает ли мне это сделать чтение памяти? Конечно же я могу ошибаться.
Во-вторых конечно меня интересует чтение, хотя бы чтение
физической памяти, причем любого участка, хотя опять же, прошу вас
не зацикливаться на "любого участка"...
В этом вопросе я хотел бы определиться, какие функции надо использовать для достижения поставнной цели, потому что везде пишут разное. У меня в данный момент написано следующее:
NTSTATUS CtlDispatch(IN PDEVICE_OBJECT pDeviceObject, IN PIRP Irp)
{
PIO_STACK_LOCATION pIrpStack;
PULONG pIOBuffer;
UNICODE_STRING uniMemoryName;
OBJECT_ATTRIBUTES ObjectAttributes;
HANDLE SectionHandle; //Дескрипктор секции памяти
PHYSICAL_ADDRESS PhysicalAddress;
PHYSICAL_ADDRESS SectionBase;
ULONG Length;
PVOID VertialAddress = NULL;
pIrpStack = IoGetCurrentIrpStackLocation(Irp);
pIOBuffer = Irp->AssociatedIrp.SystemBuffer;
switch (pIrpStack->Parameters.DeviceIoControl.IoControlCode)
{
case IOCTL_ADD:
*pIOBuffer = (ULONG)CtlDispatch; //Адрес процедуры
Irp->IoStatus.Information = 4; // Число переслылаемых байтов
break;
case IOCTL_MAP:
PhysicalAddress.LowPart = *pIOBuffer++;
PhysicalAddress.HighPart = 0;
Length = *pIOBuffer--;
RtlInitUnicodeString(&unitMemoryName, L"\\Devise\\PhysicalMemory");
InitializeObjectAttributes(&ObjectAttributes, &uniMemoryName, OBJ_CASE_INSENSITIVE, NULL, NULL);
ZwOpenSection(&SectionHandle, SECTION_ALL_ACCESS, &ObjectAttributes);
SectionBase = PhysicalAddress;
ZwMapViewOfSectoin(SectoinHandle, (HANDLE)-1, &VirtualAddress, 0L, Length, &SectionBase, &Length, ViewShare, 0, PAGE_READWRITE|PAGE_NOCACHE);
(ULONG)VirtualAddress += PhysicalAddress.LowPrat - SectionBase.LowPart;
*pIOBuffer = (ULONG)VirtualAddress;
Irp->IoStatus.Information = 4;
break;
}
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
Собственно когда драйвер получает команду IOCTL_MAP он должен вернуть адрес физического участка памяти и передать его в программу (USER MODE?). Это теоретически, а на практике это как(так)?
Тут использованы команды ZwXXX, описание которых если "пояндексить/гуглить" не найти или найти там где я их взял, и то описанием это сложно называть. Может есть другие функции или подобное что могло бы мне помочь решить задачу? И вообще рад услышать совет в этой области. Опять же повторюсь, мне надо чтение физической памяти, по заданному отрезку.
В третьих, билдер от WDK это не возможно, что можете посоветовать как замену?
Короче помогите, чем можете. Заранее спасибо.
П.С. Видите ли, я не могу скомпилировать драйвер и следовательно проверить его работоспособность, поэтому код драйвера выкладываю во вложении)
Простите, есть странно/не понятно излагаю свой вопрос, но уже шарики за ролики или ролики за шарики заскакивают от этого драйвера.