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
|
|
« Ответ #1 : 20-01-2010 19:50 » |
|
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
MherX
Гость
|
|
« Ответ #2 : 20-01-2010 20:25 » |
|
Весьма благодарен что откликнулись. Устанавливаю драйвер с помощью утилиты DrvLoader.exe входящий в состав syser дебугер типа DvrIns. Устанавливается драйвер,стартует но не оцтанавливается.Когда в DriverEntry отсутствует DriverObject->DriverExtension->AddDevice = VDskAddDevice или CreateMainDeviceObject(DriverObject) все Ok. С VDskCreateClose и VDskDispatchPnp пака проблем нету. Спасиба!
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #3 : 20-01-2010 20:32 » |
|
DrvLoader скорее всего грузит только legacy драйвера) PnP не грузит. хотя честно говоря legacy не мой конек... покопайте немножко в эту сторону) где то была похожая тема. по моему как раз по этому поводу. поищите на форуме) если не найдете - гляну сам)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Ochkarik
|
|
« Ответ #4 : 20-01-2010 20:33 » |
|
отмониторьте при помощи DbgPrint входы выходы всех процедур, полезно) и общее впечатление составите) о последовательности вызовов
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
MherX
Гость
|
|
« Ответ #5 : 20-01-2010 20:45 » |
|
legacy: это что
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #6 : 20-01-2010 21:06 » |
|
MherX, если коротко: есть драйвера PnP -их грузит менеджер устройств. есть legacy драйвера - их грузят через SCM, как сервис. первые - загружаются автоматически при обнаружении PnP(Plug&Play) оборудования. вторые - необходимо загружать "вручную") ну и некоторые особенности в начинке. обработка PnP IRP, разный механизм создания объекта устройства , и т.д.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Ochkarik
|
|
« Ответ #7 : 20-01-2010 21:11 » |
|
|
|
|
Записан
|
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
|
|
« Ответ #11 : 21-01-2010 22:11 » |
|
это хорошо) PS для цитирования можно использовать BBкоды: [quote]цитата[/quote] будет выглядеть цитата
|
|
« Последнее редактирование: 21-01-2010 22:13 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
MherX
Гость
|
|
« Ответ #12 : 23-01-2010 21:36 » |
|
Привет всем! Вот ещо один вапрос: когда монтируется новый раздел новый объект устройства создается в моей функции так зачем тагда нужен AddDevice(...)
PS: дело идиот о виртуальном диске
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #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 уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
MherX
Гость
|
|
« Ответ #14 : 25-01-2010 09:23 » |
|
Я это читал уже в Уолтер Они "Использование Microsoft Windows Driver Model. 2-е изд. (+CD)". Извините я как-то не корректно выражаюсь.Вот посматрит пожалуйста на код TrueCrypt ( http://www.truecrypt.org/downloads2) в драйвер приходит запрос и он монтирует новый раздел там зачем нужен AddDevice(...) ? может может для фильтра драйвера?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #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 уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
MherX
Гость
|
|
« Ответ #16 : 25-01-2010 19:46 » |
|
Спасиба! и извините за тривиальные вопросы, просто я неделя как этим занимаюсь.
|
|
« Последнее редактирование: 25-01-2010 20:21 от Ochkarik »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #17 : 25-01-2010 20:20 » |
|
MherX, нормальные вопросы)) для первой недели - очень даже хорошие)
|
|
|
Записан
|
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
|
|
« Ответ #19 : 06-02-2010 10:41 » |
|
там еще что-то надо было сделать для отображения, помимо написания драйвера. убей бог уже не помню из какой области.... попробуйте поискать - ссылки точно были. может быть даже у нас на форуме выкладывались. а может где то в гугле я видел)
|
|
|
Записан
|
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
|
|
« Ответ #23 : 06-02-2010 18:06 » |
|
ближе к ночи поищу, скину. уже с работы ухожу)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
MherX
Гость
|
|
« Ответ #24 : 06-02-2010 18:17 » |
|
Искренне благодарен за отзыв Спасиба. Буду ждать.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #25 : 06-02-2010 20:29 » |
|
|
|
« Последнее редактирование: 06-02-2010 22:18 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
|