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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Шаг к WDM  (Прочитано 31745 раз)
0 Пользователей и 1 Гость смотрят эту тему.
WDMclient
Гость
« : 10-10-2009 07:38 » 

Хотелось бы понять, что такое WDM. В общем, восстановил исходник из описания драйвера виртуального диска (чьей-то дипломной работы (в сети нашел)).
Но чуда не случилось.

Я упростил все вплоть до того, что от WDM оставил только строку компиляции в source

TARGETNAME=Empty
TARGETTYPE=DRIVER
DRIVERTYPE=WDM      <<<< во эта строка
TARGETPATH=RUN
SOURCES=Start.cxx


А сам драйвер Empty, из DriverEntry - создать девайс и ссылку UnloadDriver - тут все удалить.

Загружаю через instdrv.exe, а вот выгрузить не получается. Даже программно с другого драйва удаляю этот девайс и аж два раза вызываю Obdereference для драйвера, и снова ничего.

Вот тут и первый вопрос по WDM возник: какая разница между
DRIVERTYPE=WDM
 и
#DRIVERTYPE=WDM?
« Последнее редактирование: 11-10-2009 05:28 от Sel » Записан
Ochkarik
Модератор

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

« Ответ #1 : 10-10-2009 08:33 » 

http://msdn.microsoft.com/en-us/library/ms791615.aspx
# - знак комментирования)
"For a WDM Driver, set DRIVERTYPE=WDM. When you use this value, the compiler warns you when it detects non-WDM elements in the driver."

но самое важное:
http://msdn.microsoft.com/ru-ru/library/43a6z8s4.aspx
"/DRIVER:WDM causes the linker to set the IMAGE_DLLCHARACTERISTICS_WDM_DRIVER bit in the optional header's DllCharacteristics field."
"При использовании /DRIVER:WDM компоновщик устанавливает битовый флаг IMAGE_DLLCHARACTERISTICS_WDM_DRIVER в поле DllCharacteristics дополнительного заголовка."
ЗЫ что этот бит там делает - не знаю))) это надо в формате PE файла копаться. но наверное нужен OC для различения что куда грузить, раз его включили в формат файла
« Последнее редактирование: 10-10-2009 08:41 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
WDMclient
Гость
« Ответ #2 : 10-10-2009 11:17 » 

Дааааа...
Интересно конечно было бы знать что такое non-WDM elements.

А вообще WDM только через инф-файл загружать или программно тоже ?

Записан
Ochkarik
Модератор

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

« Ответ #3 : 10-10-2009 19:30 » 

программно через API SC Manager-а) через CreateService
через inf - PnP драйвера только под конкретное железо ставятся....
ЗЫ еще через inf можно дрйавер-фильтр вписать наверное.
+любой другой PnP драйвер.. как показали дальнейшие разборки.
« Последнее редактирование: 18-10-2009 06:42 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
WDMclient
Гость
« Ответ #4 : 11-10-2009 05:49 » 

оказия...такая
Если компилирую с WDM.h или (проце)дуру AddDevice определяю то ,
потом выгрузить драйвер не могу. Как бороться? (может и не надо)
Записан
Ochkarik
Модератор

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

« Ответ #5 : 11-10-2009 07:08 » 

я пока даже близко не представляю в чем у вас проблема)
тут код надоть смотреть...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
WDMclient
Гость
« Ответ #6 : 11-10-2009 09:46 » 

А проблем много:

    Вирт драйв рухнул через отключение
Первое: через DebugView crash-dump(500mb) скинул в .log
получилось(145 байт) а где остальные?


А второе: тут самый простейший драйвер , но с AddDeviceProc.
          и теперь его нельзя выгрузить (программно(ZwUnloadDriver))

http://dorimecom.narod.ru/simple_driver1.gif
« Последнее редактирование: 12-10-2009 02:58 от Алексей1153++ » Записан
Ochkarik
Модератор

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

« Ответ #7 : 11-10-2009 18:29 » 

это простите ЧТО за картинки)))))))))))Не понял? код то где?)))
ZwUnloadDriver - не надо использовать недокументированные функции там где их не надо использовать)

« Последнее редактирование: 11-10-2009 18:34 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
WDMclient
Гость
« Ответ #8 : 12-10-2009 02:32 » 

Да вот он , ток это  вроде как элементарный пример

//=========================================================
//=  Start.cxx

                
#ifdef __cplusplus
extern "C"
{
#endif
             #include "ntddk.h"
   //#include "wdm.h"
#ifdef __cplusplus
}
#endif
#include <stdio.h>
#include "INCLUDE\MY.h"
#include "INCLUDE\WORK_PROJECT.h"
//=                                                                                                                           PROTO
extern "C" NTSTATUS  DriverEntryProc  ( IN PDRIVER_OBJECT   pDriverObject   ,
                                 IN PUNICODE_STRING RegistryPath ) ;
NTSTATUS    DriverCreateCloseProc   (IN PDEVICE_OBJECT FDO   ,  IN PIRP   IRP  );
NTSTATUS    DriverReadWriteProc     (IN PDEVICE_OBJECT FDO   ,  IN PIRP   IRP  );
NTSTATUS    DriverIOControlProc     (IN PDEVICE_OBJECT FDO   ,  IN PIRP   IRP  );
VOID        DriverUnloadProc    (IN PDRIVER_OBJECT  pDriverObject );

NTSTATUS     AddDeviceProc    (IN PDRIVER_OBJECT    pDriverObject   ,
                               IN  PDEVICE_OBJECT   pDeviceObject );
NTSTATUS CompleteIrp  (PIRP   IRP   ,   NTSTATUS     STATUS  , ULONG INFO );
//=                                                                                        

//r              
//&     ENTRY   proc
//r                                                                                  
#pragma code_seg("INIT")

NTSTATUS  DriverEntryProc  ( IN PDRIVER_OBJECT   pDriverObject   ,
                   IN PUNICODE_STRING RegistryPath )

{      

   NTSTATUS               STATUS =0  ;
   UNICODE_STRING                                                _uniDevName;     
   UNICODE_STRING                                                _uniLinkName;  
   PDEVICE_OBJECT                                                         _FDO   ;
   PDEVICE_EXTENSION                                     _pDevExt ;      
              
  //"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""                
            RtlInitUnicodeString(&_uniDevName  ,   L"\\Device\\EMPTY"  );
            RtlInitUnicodeString( &_uniLinkName   ,    L"\\??\\EMPTY"  );        
            
  //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    pDriverObject ->DriverUnload              =           DriverUnloadProc  ;
    pDriverObject ->MajorFunction   [ IRP_MJ_CREATE ]  =DriverCreateCloseProc;
    pDriverObject ->MajorFunction   [ IRP_MJ_CLOSE ]      =DriverCreateCloseProc;
    pDriverObject->DriverExtension->AddDevice         =  AddDeviceProc ;  
          
  //""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
       STATUS =  IoCreateDevice( pDriverObject ,   sizeof( DEVICE_EXTENSION ), &_uniDevName ,    FILE_DEVICE_UNKNOWN , 0  ,                                                                   FALSE,  & _FDO);                                                                                                      
                    IF ( ! NT_SUCCESS( STATUS ))  
                   {        
                       DbgPrint("=START=   ERROR   ."   );  RETURN   STATUS ;//ERROR
                   }                                                                                                     //"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""                                                                                      
          STATUS =  IoCreateSymbolicLink(& _uniLinkName   , &_uniDevName);
                       IF ( ! NT_SUCCESS( STATUS ))
                      {                                                
                                DbgPrint("create symbolic error\n");
                               IoDeleteDevice( _FDO );    RETURN   STATUS;
                      }    
                    
_pDevExt = (PDEVICE_EXTENSION)_FDO->DeviceExtension;
_pDevExt->SymbolicLink = _uniLinkName;
_pDevExt->DeviceObject=_FDO;
                                            
                       DbgPrint("=Example=  ENTRY  OK  ."   );
                                
RETURN      STATUS ;
}    
//r
//&  Add   Device    proc
//r            
 #pragma code_seg("PAGE")

NTSTATUS     AddDeviceProc    (IN PDRIVER_OBJECT    pDriverObject   ,  
                               IN  PDEVICE_OBJECT   pDeviceObject )
{      
//-                                                                                                  DATA
   NTSTATUS               STATUS =0   ,   status =0;
   UNICODE_STRING                         _uniDevName;     
   UNICODE_STRING                         _uniLinkName;  
   PDEVICE_OBJECT                          _FDO   ;
   PDEVICE_EXTENSION                      _pDevExt ;      
//-                                                                                                  BODY
             DbgPrint("=Example= ADD OK   "  );

RETURN STATUS_SUCCESS;
}    
//r                                                                        
//&CREATE     CLOSE        FILE                   proc
//r                                                                        
 #pragma code_seg()

NTSTATUS DriverCreateCloseProc ( IN PDEVICE_OBJECT FDO   ,   IN PIRP    IRP ){    
//-    DATA  
NTSTATUS                 STATUS = STATUS_SUCCESS ;
PIO_STACK_LOCATION       _pIrpStack   =     IoGetCurrentIrpStackLocation( IRP );
//-    BODY
                   switch (   _pIrpStack ->MajorFunction )
                      {
                                   case IRP_MJ_CREATE:
                                            break;
                                    case IRP_MJ_CLOSE:
                                            break;

                      default:
                                STATUS = STATUS_NOT_IMPLEMENTED;
                                           break;
                     }

RETURN      CompleteIrp (  IRP , STATUS , 0);
}    
//r            
//&   READ    WRITE     FILE    proc
//r                                                                    
 #pragma code_seg()

NTSTATUS DriverReadWriteProc ( IN PDEVICE_OBJECT FDO   ,   IN PIRP    IRP ){      
//-    DATA
PIO_STACK_LOCATION     _pIrpStack   =     IoGetCurrentIrpStackLocation( IRP );
ULONG                    _Length = _pIrpStack->Parameters.Read.Length;
PVOID                      _pBuffer = IRP->UserBuffer;
//-    BODY
    
        DbgPrint("=Example= READ WRITE  %d."  ,   _Length);                          
RETURN    CompleteIrp (  IRP , STATUS_SUCCESS, 0);
}    
//r
//&  UNLOAD      EXIT   proc
//r                                                                        
 #pragma code_seg("PAGE")

VOID     DriverUnloadProc (IN PDRIVER_OBJECT    pDriverObject   ){      
//- INIT
NTSTATUS                          STATUS = STATUS_SUCCESS ;
PDEVICE_EXTENSION  _pDevExt = (PDEVICE_EXTENSION)
                                                                                pDriverObject->DeviceObject->DeviceExtension;  
//- BODY
                 DbgPrint("UNLOAD DRIVER " );

    STATUS =IoDeleteSymbolicLink( &(_pDevExt->SymbolicLink)  );
    
        IF ( ! NT_SUCCESS( STATUS ))  
           DbgPrint( " ERROR EXIT  %ws ",  _pDevExt->SymbolicLink) ;    
                      
                      
       IoDeleteDevice(    _pDevExt->DeviceObject  );                                                        
RETURN;        
}    
//r                                                                        
//&   COMPLETE   proc
//r                                                                        
#pragma code_seg()

NTSTATUS CompleteIrp(PIRP   IRP   ,    NTSTATUS     STATUS  , ULONG INFO ){      
            IRP ->IoStatus.Status = STATUS;
            IRP ->IoStatus.Information  =   INFO ;
            IoCompleteRequest( IRP  ,   IO_NO_INCREMENT );
RETURN        STATUS  ;
}      


//===========================================================================
Код:
//=My.h [/b]

#define  DriverEntryProc   DriverEntry
#define  BOOL   bool
#define  BYTE    unsigned char
#define  WORD      unsigned short
#define  QWORD  LARGE_INTEGER
#define  FOR  for
#define  IF   if
#define  WHILE   while
#define  ELSE  else
#define  False  false
#define  True   true
#define   null    0
//#define  NULL   0
//#define  Null     NULL
//#define  null    NULL
#define  RETURN  return
#define  BREAK break
#define  invoke



//=============================================================
Код:
//= WORK_PROJECT.h[/b]


typedef   struct   tagDEVICE_EXTENSION
{
            PDEVICE_OBJECT DeviceObject;
            PDEVICE_OBJECT LowerDeviceObject;
            DEVICE_STATE     DevState;
            UNICODE_STRING  SymbolicLink;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
//*////////////////////////////////////////////////////////////
« Последнее редактирование: 12-10-2009 07:25 от WDMclient » Записан
Ochkarik
Модератор

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

« Ответ #9 : 12-10-2009 04:18 » 

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

у вас явно не тот случай. вы объект устройства создаете без привязки к железу, сразу в DriverEntry.
так что wdm.h и никаких AddDevice.
а ntddk.h - это по моему из NT осталось...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
RXL
Технический
Администратор

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

WWW
« Ответ #10 : 12-10-2009 06:08 » 

WDMclient, просьба: оборачивай код тегами [code] [/code].
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
WDMclient
Гость
« Ответ #11 : 12-10-2009 07:33 » 

1.Не могу понять , если  в AddDevice  ничего не делаю , то как (AddDevice)   
влияет своим присутствием на драйвер , если выгрузить его уже не могу  обычными средствами.

2. Да тоже самое получается если закомментировать AddDevice в процедуре  Entry.
   и вместо NTDDK.h подключить WDM.h

Вот такая это.....западня для мозга
Записан
Ochkarik
Модератор

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

« Ответ #12 : 12-10-2009 18:51 » 

чтобы понять, почитайте
http://msdn.microsoft.com/en-us/library/ms794996.aspx
и
http://www.osronline.com/DDKx/gstart/gs_design_3euf.htm
http://msdn.microsoft.com/en-us/library/ms791674.aspx
Цитата
Drivers that support WDM, or at least Plug and Play, differ in structure from legacy drivers. For example, while legacy drivers create named device objects and symbolic links in a DriverEntry routine, WDM and Plug and Play function drivers create unnamed device objects in an AddDevice routine, and register and enable a device interface using I/O Manager routines and device installation functions. In addition, WDM and Plug and Play drivers have different requirements for resource allocation, registry usage, and device enumeration, among others.

что кстати, вы называете обычными средствами?

PS
и кстати до кучи можно еще по-гуглить)
кажется тут решалась сходная проблема
http://www.winvistatips.com/problems-unloading-driver-t184404.html
ЗЗЫ ...я подозревал насчет DO_INITIALIZE)
« Последнее редактирование: 12-10-2009 19:12 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
WDMclient
Гость
« Ответ #13 : 13-10-2009 02:35 » 


PS
кажется тут решалась сходная проблема
http://www.winvistatips.com/problems-unloading-driver-t184404.html
ЗЗЫ ...я подозревал насчет DO_INITIALIZE)



Действительно там , таже проблема , но решения там тоже не найдено.

DO_INITIALIZE - не помогла.

Загружаю , выгружаю  утилитой известной - InstDrv.exe

Многие  пишут NT драйвер , WDM драйвер , PnP драйвер. А как это?
Вот NT-драйвер c <ntddk.h> работает как положено , а если подключаю <wdm.h>
то работает как-то не так , это потому что он уже WDM-драйвер?
А тогда вообще чем отличается WDM драйвер от того же PnP-драйвера?

Или допустим как выгрузить обычный WDM.А то девайс убит а драйв висит.
P.S.
MSDN - Видимо сами майкрософтовцы его не читают
« Последнее редактирование: 13-10-2009 02:50 от WDMclient » Записан
sss
Специалист

ru
Offline Offline

« Ответ #14 : 13-10-2009 04:27 » 

WDMclient, интересно что вам надо вообще? Можно пример того,  как "убивается WDM девайс"? А то, извините, пурга какая то... WDM драйвера загружаются и выгружаются не вручную, а протоколом PnP.

Записан

while (8==8)
WDMclient
Гость
« Ответ #15 : 13-10-2009 04:44 » 

Уважаемый SSS , действительно это пурга.
Как и многие обсуждения по свойствам драйверов.
У меня простейший NT-драйвер , только подключил вместо ntddk.h -> wdm.h
из-за этого что то меняется в нем при компиляции и драйвер больше не хочет
выгружаться вручную. Хотелось бы узнать по возможности , что именно меняется.
Но больше всего интересует как выгрузить его , ведь с помощью UnLoadDriver
не удается вызвать процедуру выгрузки.
И если  даже убить этот девайс из другого драйвера , то процедура UnLoad вызывается.
Но драйвер все равно продолжает висеть , до перезагрузки системы.
P.S.
Допускаю что на этот вопрос ответа нет.
Записан
WDMclient
Гость
« Ответ #16 : 13-10-2009 04:49 » 

И вопрос еще такой.
Может вы знаете самый простой пример драйвера в котором реализовывался PnP.
Тока на примеры из DDK и MSDN не ссылаться. На них х..й-че поймешь.
(если бы не примеры  что на wasm.ru , то msdn можно было бы засунуть в п...у)
(хотя и там про PnP на практике ни слова)

P.S.
Возможно таких примеров и нет.
« Последнее редактирование: 13-10-2009 05:08 от WDMclient » Записан
sss
Специалист

ru
Offline Offline

« Ответ #17 : 13-10-2009 06:59 » 

WDMclient, почему примеры из DDK отстой? Почему там об PnP не слова ? Разве драйвер/посредник NDIS не PnP? Как раз яркий пример того, как работает цепочка драйверов в протоколе PnP. Возьмите этот пример и попробуйте понять - где там PnP.... Так же вы можете в принципе взять пример любого драйвера, участвующего в цепочке потоков ядра (kernel streams). Например от звуковой карты. Ещё раз повторю - драйвер WDM не самостоятельная единица, а часть некой последовательности, работающей определенным образом (классовый драйвер).
Записан

while (8==8)
Ochkarik
Модератор

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

« Ответ #18 : 13-10-2009 07:35 » 

sss, да не... насколько я понял речь идет об этаком "отдельно стоящем" драйвере . то есть прописываем драйвер как сервис, и вперед. я такой ни разу не делал, но знаю что в принципе,  это довольно просто. хотя загружать его должна действительно система) обычно. но через SC менеджер можно вроде и в ручную - я не пытался, я обычно пользовался утилитой из DriverStudio.

WDMclient, зря вы на примеры DDK и справку от майкрософта  наезжаете. они действительно непростые, зато их довольно много)
а MSDN - это счастье... по сравнению с тем что бывает.
не раз убеждался что в DDK обо всем написано) просто читать надо внимательно и понимать дословно-буквально)))
 
не нравится DDK - читайте Вальтера Они

PPS а в msdn четко написано. что: WDM ОБЯЗАН иметь AddDevice. далее написано то должен делать AddDevice. не вполне конкретно под ваш случай, но описано.
 
« Последнее редактирование: 13-10-2009 07:55 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sss
Специалист

ru
Offline Offline

« Ответ #19 : 13-10-2009 08:00 » 

Ochkarik, я думаю, что отдельностоящий уже не WDM драйвер... А как раз LEGACY. Как он может отдельно стоять от менеджера управления питанием?  Другой вопрос - а как он может быть завязан с менеджером управления питанием? Я думаю - только если управляется классовым драйвером из модели Windows...

Цитата: У. Они, стр. 36

Драйвером WDM называется драйвер PnP, дополнительно поддерживающий протоколы управления питанием и совместимый...
« Последнее редактирование: 13-10-2009 08:11 от sss » Записан

while (8==8)
WDMclient
Гость
« Ответ #20 : 13-10-2009 10:41 » 

Видимо , дело обстоит так:      
       захотел WDM , подключи wdm.h
       подключил wdm.h будь добр оформи AddDevice
       оформил AddDevice  делай AttachDevice
       cделал АttachDevice  теперь точно без PnP непоедет
       Залил PnP , все включай зажигание - пиши файл.INF
      
      
      
 
« Последнее редактирование: 13-10-2009 12:57 от WDMclient » Записан
Ochkarik
Модератор

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

« Ответ #21 : 13-10-2009 13:20 » 

еще раз внимательно посмотрел на свой DeviceTree... вроде похоже)
насчет загрузки WDM через CreateService я, кажется, погорячился. пардон)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
sss
Специалист

ru
Offline Offline

« Ответ #22 : 14-10-2009 05:41 » 

WDMclient, ага, я тоже думаю примерно так... Захотел написать драйвер WDM - вкупайся во всю технологию цепочки поддержки WDM данного класса устройств + протокол электропитания.
Записан

while (8==8)
WDMclient
Гость
« Ответ #23 : 15-10-2009 03:03 » 

Текущий головняк - драйвер виртуального диска.
Исходников на него я не нашел , коды брал по описанию из курсовой.

файлы проекта:
http://dorimecom.narod.ru/start.cxx
http://dorimecom.narod.ru/DEVICE_CONTROL.cxx
http://dorimecom.narod.ru/WORK_PROJECT.hxx
http://dorimecom.narod.ru/My.hxx
http://dorimecom.narod.ru/VIRTUAL.inf

ОПИСАНИЕ КУРСОВОЙ ТУТ:
http://revolution.allbest.ru/dl/27/00089542.zip


ТАКЖЕ (Всю дополнительную инициализацию для устройства провожу самом драйвере
                                         а не считываю с реестра как в курсовой.)

ПЕРВАЯ ПРОБЛЕМА
 ПОСЛЕ УСТАНОВКИ ДРАЙВЕРА   отключаю в диспетчере оборудования его   ,
потом смотрю WinObj , то бишь кликаю мышью по названию драйвера  и  полный BSOD.

ВТОРАЯ ПРОБЛЕМА:
- WINDOWS не загружается.
« Последнее редактирование: 15-10-2009 03:10 от WDMclient » Записан
sss
Специалист

ru
Offline Offline

« Ответ #24 : 15-10-2009 05:33 » 

WDMclient, а отладку в удаленном/виртуальном режиме не пробовал? Хотя бы для того, что бы посмотреть после какого IRP возникает BSOD. Телепатия не рулит в этих делах... Тем более DBGPRINT во всех щелях этого драйвера применен.
« Последнее редактирование: 15-10-2009 05:37 от sss » Записан

while (8==8)
sss
Специалист

ru
Offline Offline

« Ответ #25 : 15-10-2009 05:42 » 

Интересный пример... Абсолютный LEGACY!

Хотя я уже совсем запутался.

WDMclient, можно вопрос - есть прецендент использования этого виртуального диска?
« Последнее редактирование: 16-10-2009 05:13 от sss » Записан

while (8==8)
WDMclient
Гость
« Ответ #26 : 16-10-2009 02:45 » 

Удаленная отладка ?  А у меня сети нет . (ЁмаЁ)

Вопрос - а DbgPrint не могет вызывать BSOD (IRQL вдруг)?

В том то и дело что эту курсовую какой то русский написал , для студентов
код весьма подозрителен и прост , по сравнению с кодом  известного драйвера DiskInfo.
Там и блокировки , имперсонизация , токены.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #27 : 16-10-2009 05:19 » 

Удаленная отладка ?  А у меня сети нет . (ЁмаЁ)

Причем здесь сеть? Нуль-модемный кабель... Можно использовать виртуальный PC. VMware или Virtual PC. Поищи темы отладки с использованием виртуальных систем...

Цитата: MSDN
DbgPrint and DbgPrintEx can be called at IRQL<=DIRQL. However, Unicode format codes (%wc and %ws) can be used only at IRQL PASSIVE_LEVEL. Also, because the debugger uses interprocess interrupts (IPIs) to communicate with other processors, calling DbgPrint at IRQL>DIRQL can cause deadlocks.

Насчет простоты драйвера - вот, вот. Может обслуживание подхватывает fastfat.sys ? Тупо глядит на геометрию... Блин, если бы не "Зов Припяти" скомпилировал  бы дома... А так пока лень...
« Последнее редактирование: 16-10-2009 05:22 от sss » Записан

while (8==8)
Ochkarik
Модератор

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

« Ответ #28 : 16-10-2009 20:54 » 

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

насчет самого кода - со временем туго сейчас... постараюсь посмотреть при случае)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
WDMclient
Гость
« Ответ #29 : 17-10-2009 04:29 » 

А тут исходники драйвера FileDisk.sys.

http://dorimecom.narod.ru/filedisk-15.zip

http://dorimecom.narod.ru/filedisk_program.c

http://dorimecom.narod.ru/filedisk_driver.c



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

Код:
int main(int argc, char* argv[])
{
char    VolumeName[] = "\\\\.\\V:";
char    DriveName [] = "V:\\";
char   DeviceName [] = "\\Device\\Example";
HANDLE Device;
    if (!DefineDosDevice( DDD_RAW_TARGET_PATH,  &VolumeName[4], DeviceName ))
    {
        cout<<"error "<<endl;
return -1;
    }
    Device = CreateFile(
        VolumeName,
        GENERIC_READ | GENERIC_WRITE,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        FILE_FLAG_NO_BUFFERING,
        NULL
        );

   SHChangeNotify(SHCNE_DRIVEADD, SHCNF_PATH, DriveName, NULL);

getch();
return 0;
}


« Последнее редактирование: 17-10-2009 04:55 от WDMclient » Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines