Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Выгрузка драйвера  (Прочитано 22181 раз)
0 Пользователей и 1 Гость смотрят эту тему.
MherX
Гость
« : 20-01-2010 15:28 » 

Привет всем, я новичок в этой области, и вот у меня возникли такие вопросы:
Я должен симулировать виртуальный HDD типа TrueCrypt : вот фрагмент из кода

Код:
#include <ntddk.h>

NTSTATUS DriverEntry  (IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING UniRegistryPath);
NTSTATUS VDskAddDevice(IN PDRIVER_OBJECT DriverObject,IN PDEVICE_OBJECT PhysicalDeviceObject);
VOID     VDskUnload   (IN PDRIVER_OBJECT DriverObject);

NTSTATUS VDskCreateCreate  (IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp);
NTSTATUS VDskCreateClose  (IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp);
NTSTATUS VDskReadWrite  (IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp);
NTSTATUS VDskDispatchPnp  (IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp);
NTSTATUS VDskDispatchPower  (IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp);
NTSTATUS VDskIOCtl  (IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp);
NTSTATUS VDskDispatchSystemControl  (IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp);

NTSTATUS CreateMainDeviceObject (PDRIVER_OBJECT DriverObject);

const WCHAR NT_DEVICE_NAME   [] = L"\\Device\\VDevice";
const WCHAR DOS_DEVICE_NAME[] = L"\\DosDevices\\VDeviceLink";

PDRIVER_OBJECT gDriverObject;

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING UniRegistryPath)
{
NTSTATUS  Status = STATUS_SUCCESS;

DbgPrint("Driver is loaded\nDriverEntry\n");

DriverObject->MajorFunction[IRP_MJ_CREATE] = VDskCreateCreate;
DriverObject->MajorFunction[IRP_MJ_CLOSE  ] = VDskCreateClose;
DriverObject->MajorFunction[IRP_MJ_READ    ] = VDskReadWrite;
DriverObject->MajorFunction[IRP_MJ_WRITE  ] = VDskReadWrite;
DriverObject->MajorFunction[IRP_MJ_PNP ] = VDskDispatchPnp;
DriverObject->MajorFunction[IRP_MJ_POWER ] = VDskDispatchPower;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = VDskIOCtl;
DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = VDskDispatchSystemControl;

DriverObject->DriverExtension->AddDevice = VDskAddDevice;
DriverObject->DriverUnload = VDskUnload;

return CreateMainDeviceObject(DriverObject);
}


NTSTATUS VDskAddDevice(IN PDRIVER_OBJECT DriverObject,IN PDEVICE_OBJECT PhysicalDeviceObject)
{
NTSTATUS   Status = STATUS_SUCCESS;
UNICODE_STRING uniNtNameString, uniWin32NameString;

DbgPrint("VDskAddDevice\n");

RtlInitUnicodeString(&uniNtNameString, NT_DEVICE_NAME );

Status = IoCreateDevice (
DriverObject,
0,
&uniNtNameString,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&PhysicalDeviceObject
);
if( !NT_SUCCESS(Status) ){
DbgPrint("Can't create device\n");
return Status;
}

RtlInitUnicodeString(&uniWin32NameString, DOS_DEVICE_NAME);
Status = IoCreateSymbolicLink(&uniWin32NameString, &uniNtNameString);
if (!NT_SUCCESS(Status))
{
DbgPrint("Can't create symbol link\n");
IoDeleteDevice( DriverObject->DeviceObject );
}

DbgPrint("Device created success\n");
return Status;
}

NTSTATUS CreateMainDeviceObject (PDRIVER_OBJECT DriverObject)
{
UNICODE_STRING Win32NameString, ntUnicodeString;

PDEVICE_OBJECT DeviceObject;
NTSTATUS ntStatus;

RtlInitUnicodeString (&ntUnicodeString, NT_DEVICE_NAME);
RtlInitUnicodeString (&Win32NameString, DOS_DEVICE_NAME);

ntStatus = IoCreateDevice (
DriverObject,
0,
&ntUnicodeString,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&DeviceObject);

if (!NT_SUCCESS (ntStatus))
{

return ntStatus;/* Failed to create DeviceObject */
}

ntStatus = IoCreateSymbolicLink (&Win32NameString, &ntUnicodeString);

if (!NT_SUCCESS (ntStatus))
{
IoDeleteDevice (DeviceObject);
return ntStatus;
}

IoRegisterShutdownNotification (DeviceObject);

return STATUS_SUCCESS;
}

VOID VDskUnload(IN PDRIVER_OBJECT DriverObject)
{
            PDEVICE_OBJECT pDeviceObject;
UNICODE_STRING uniWin32NameString;

DbgPrint("VDskUnload\n");

pDeviceObject = pDriverObject->DeviceObject;

RtlInitUnicodeString( &uniWin32NameString, DOS_DEVICE_NAME );
IoDeleteDevice( pDriverObject->DeviceObject );

DbgPrint("Unload is success\n");
}
Драйвер динамически не выгружается.
Заранее благодарен.
« Последнее редактирование: 20-01-2010 17:53 от Sel » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 20-01-2010 19:50 » 

где сама процедура VDskCreateClose?
что в  VDskDispatchPnp?
что значит не выгружается? как вы его грузите, как выгружаете?
и кстати поищите в нете - подобные простейшие примеры на эту тему в сети были.
http://www.google.ru/search?hl=ru&lr=&newwindow=1&ei=FV5XS_vCOsGg_gao85zzAw&sa=X&oi=spell&resnum=0&ct=result&cd=1&ved=0CA0QBSgA&q=%D0%B2%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9+%D0%B4%D0%B8%D1%81%D0%BA+DriverEntry&spell=1
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
MherX
Гость
« Ответ #2 : 20-01-2010 20:25 » 

Весьма благодарен что откликнулись.
Устанавливаю драйвер с помощью утилиты  DrvLoader.exe входящий в состав syser дебугер типа DvrIns.
Устанавливается драйвер,стартует но не оцтанавливается.Когда в DriverEntry отсутствует
DriverObject->DriverExtension->AddDevice = VDskAddDevice или CreateMainDeviceObject(DriverObject) все Ok.
С  VDskCreateClose и  VDskDispatchPnp пака проблем нету.
Спасиба! 
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 20-01-2010 20:32 » 

DrvLoader скорее всего грузит только legacy драйвера) PnP не грузит. хотя честно говоря legacy не мой конек... покопайте немножко в эту сторону)
где то была похожая тема. по моему как раз по этому поводу. поищите на форуме) если не найдете - гляну сам)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 20-01-2010 20:33 » 

отмониторьте при помощи DbgPrint входы выходы всех процедур, полезно) и общее впечатление составите) о последовательности вызовов
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
MherX
Гость
« Ответ #5 : 20-01-2010 20:45 » 

legacy: это что
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 20-01-2010 21:06 » 

MherX, если коротко:
есть драйвера PnP  -их грузит менеджер устройств. есть legacy драйвера - их грузят через SCM, как сервис.
первые - загружаются автоматически при обнаружении PnP(Plug&Play) оборудования. вторые - необходимо загружать "вручную")
ну и некоторые особенности в начинке. обработка PnP IRP, разный механизм создания объекта устройства , и т.д.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 20-01-2010 21:11 » 

почитайте например тут http://www.wasm.ru/article.php?article=drvw2k15
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
MherX
Гость
« Ответ #8 : 20-01-2010 21:33 » 

Спасиба!
Записан
MherX
Гость
« Ответ #9 : 21-01-2010 21:01 » 

DrvLoader PnP драйвер грузит дела в коде DriverEntry.
Если не найдете - гляну сам. если нетрудно; я не нашол
Заранее спасиба!
Записан
MherX
Гость
« Ответ #10 : 21-01-2010 21:08 » 

Нашол!
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 21-01-2010 22:11 » 

это хорошо)
PS для цитирования можно использовать BBкоды:
[quote]цитата[/quote]
будет выглядеть
Цитата
цитата
« Последнее редактирование: 21-01-2010 22:13 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
MherX
Гость
« Ответ #12 : 23-01-2010 21:36 » 

Привет всем! Вот ещо один вапрос: когда монтируется новый раздел новый объект устройства  создается в моей функции так зачем тагда нужен AddDevice(...)

PS: дело идиот о виртуальном диске
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 24-01-2010 16:06 » 

В случае PnP устройства, драйвер - загружает менеджер устройств PnP при обнаружении оборудования сопоставленного драйверу(описывается в inf файле).
Он же(менеджер), и создает физические_объекты_устройств (PDO).
для каждого физического объекта он вызывает AddDevice() соответствующего драйвера.
если обнаружено два одинаковых физических устройства - менеджер вызовет AddDevice - дважды, с разными указателями PhysicalDeviceObject.
и уже в AddDevice (для PnP устройств) драйверу полагается делать  IoCreateDevice() для создани объекта устройства.
таким образом один и тот же код драйвера(правильно написанного) обслуживает несколько идентичных устройств на шине. две флешки например. или две мышки)

Legacy драйвера загружет не менеджер устройств а менежер сервисов (SCM -Service Control Manager). он к устройствам отношения не имеет, поэтому подход несколько иной: SCM не привязан к физическому устройству. и у него нет повода вызывать AddDevice.
поэтому создавать свой объект(а без его создания функции драйвера вызываться не будут) приходится сразу при загрузке драйвера в DriverEntry.
(но вы меня проверяйте - могу соврать, с legacy не работал Ага)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
MherX
Гость
« Ответ #14 : 25-01-2010 09:23 » 

Я это читал уже в Уолтер Они "Использование Microsoft Windows Driver Model. 2-е изд. (+CD)".
Извините я как-то не  корректно выражаюсь.Вот посматрит пожалуйста на код TrueCrypt (http://www.truecrypt.org/downloads2) в драйвер приходит запрос и он монтирует новый раздел там зачем нужен AddDevice(...) ? может может для фильтра драйвера?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 25-01-2010 18:30 » 

если внимательно посмотрите то видно, что AddDevice они в DriverEntry объявляют только если
Код:
if (NT_SUCCESS (TCReadRegistryKey (RegistryPath, L"Start", &startKeyValue)))
{
if (startKeyValue->Type == REG_DWORD && *((uint32 *) startKeyValue->Data) == SERVICE_BOOT_START)
{
if (!SelfTestsPassed)
TC_BUG_CHECK (STATUS_INVALID_PARAMETER);

LoadBootArguments();
VolumeClassFilterRegistered = IsVolumeClassFilterRegistered();

DriverObject->DriverExtension->AddDevice = DriverAddDevice;
}

TCfree (startKeyValue);
}
где в функции IsVolumeClassFilterRegistered(); прописано что это случай драйвера верхнего фильтра.
обработка IRP у них различна для случаев драйвера фильтра и второго варианта загрузки (функция TCDispatchQueueIRP()- там много условий на проверку )
Код:
// Drive filter IRP
if (Extension->IsDriveFilterDevice)
return DriveFilterDispatchIrp (DeviceObject, Irp);

// Volume filter IRP
if (Extension->IsVolumeFilterDevice)
return VolumeFilterDispatchIrp (DeviceObject, Irp);
смотрел правда мельком)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
MherX
Гость
« Ответ #16 : 25-01-2010 19:46 » 

Спасиба! и извините за тривиальные вопросы, просто я неделя как этим занимаюсь.
« Последнее редактирование: 25-01-2010 20:21 от Ochkarik » Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 25-01-2010 20:20 » 

MherX, нормальные вопросы)) для первой недели - очень даже хорошие)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
MherX
Гость
« Ответ #18 : 06-02-2010 09:12 » 

Привет всем! Я снова наше время чтобы записать драйвер.
И вот вопрос : почему в NT драйвере после IoCreateDevice  устройство не появляется в  My Computer

ntStatus = IoCreateDevice (
               pDriverObject,
               0,   
                                        &uniNtNameString,
                                        FILE_DEVICE_DISK,   
                                        0,   
                                        FALSE,   
                                        &pDeviceObject
                                      );
Но когда в win32 вызываю например  DskWrite (MajorFunction[IRP_MJ_WRITE] = DskWrite) через SymbolicLink функция работает.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 06-02-2010 10:41 » 

там еще что-то надо было сделать для отображения, помимо написания драйвера.
 убей бог уже не помню из какой области....
попробуйте поискать - ссылки точно были. может быть даже у нас на форуме выкладывались.  а может где то в гугле я видел)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
MherX
Гость
« Ответ #20 : 06-02-2010 14:15 » 

ссылку скинешь???
Записан
MherX
Гость
« Ответ #21 : 06-02-2010 15:08 » 

 Скромно так... Скромно так...
Записан
MherX
Гость
« Ответ #22 : 06-02-2010 17:11 » 

HELP!!!!!!!!! не могу найти
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 06-02-2010 18:06 » 

ближе к ночи поищу, скину.
уже с работы ухожу)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
MherX
Гость
« Ответ #24 : 06-02-2010 18:17 » 

 Искренне благодарен за отзыв Спасиба. Буду ждать.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 06-02-2010 20:29 » 

https://forum.shelek.ru/index.php/topic,22062.msg216721.html#msg216721

PS а вообще могли бы сами сами зайти -> и нажать поиск попробовать Ага
« Последнее редактирование: 06-02-2010 22:18 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines