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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: SCM и IoRegisterDeviceInterface  (Прочитано 10085 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mayor
Специалист

ru
Offline Offline

« : 28-02-2004 22:37 » 

Как  при загрузке драйвера  через scum сформировать интерфейс устройства?
я пытался вначале сделать AddDevice но SCM выдает ошибку
потом в DriverEntry создал DeviceObject проверил SoftICE -объект создан
вызвал IoRegisterDeviceInterface он выдает  ошибку -похоже чем-то не нравится объект
Записан

1n c0de we trust
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #1 : 29-02-2004 12:00 » 

Цитата

 SCM выдает ошибку


А при чем здесь SCM?

Цитата

потом в DriverEntry создал DeviceObject проверил SoftICE -объект создан
вызвал IoRegisterDeviceInterface он выдает ошибку -похоже чем-то не нравится объект


На ошибку посмотри- может поймешь что неправильно.
Первый параметр у IoRegisterDeviceInterface- указатель на нижележащий PDO, а ты ему свой FDO подсунул, у настоящего PDO от Microsoft указатель PhysicalDeviceObject->DeviceObjectExtension->DeviceNode!=NULL и имеет определенную структуру.
Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #2 : 29-02-2004 16:03 » 

Цитата

ты ему свой FDO подсунул

я pdo взял через IoCreateDevice

оказывается IoRegisterDeviceinterface выдает :
The specified request is not a valid operation for the target device.
в связи с этим возник вопрос чем созданный мной DeviceObject
отличается от передаваемого в AddDevice ?

и еще:
SlavaI может быть посоветуеш как перехватить SoftICE
AddDevice Enum драйвера при загрузке OS
(было бы полезно в плане сравнения, если бы еще SoftICE
при этом загрузил debug symbols)

Цитата

PhysicalDeviceObject->DeviceObjectExtension->DeviceNode!=NULL и имеет определенную структуру.


Какую???



Цитата

А при чем здесь SCM?

 

а ты видел scm driver с AddDevice ?
Записан

1n c0de we trust
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #3 : 01-03-2004 06:23 » 

Цитата

я pdo взял через IoCreateDevice


Про это я тебе и сказал- неправильно. Это FDO а не PDO.

Цитата

The specified request is not a valid operation for the target device.


Вот именно.

Цитата

SlavaI может быть посоветуеш как перехватить SoftICE
AddDevice Enum драйвера при загрузке OS


_asm int 3;
перед любой интересной точкой в ф-ции и SoftIce всплывет, если конечно загружен уже, если нет- BSOD.

Цитата

Цитата:

PhysicalDeviceObject->DeviceObjectExtension->DeviceNode!=NULL и имеет определенную структуру.



Какую???


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

Цитата

а ты видел scm driver с AddDevice ?


SCM- Service Control Manager. Так что продолжаю непонимать о чем ты говоришь. Вероятно это какой-то девайс.


P.S. Вот тебе вид структур(в DDK вместо них- обрубки), но это для общего развития- правильно проинициализировать эти структуры ты скорее всего не сможешь
Код:

typedef struct _DEVICE_NODE |

    //
    // Pointer to another DEVICE_NODE with the same parent as this one.
    //

    PDEVICE_NODE Sibling;

    //
    // Pointer to the first child of this DEVICE_NODE.
    //

    PDEVICE_NODE Child;

    //
    // Pointer to this DEVICE_NODE's parent.
    //

    PDEVICE_NODE Parent;

    //
    // Pointer to the last child of the device node
    //

    PDEVICE_NODE LastChild;

    //
    // Depth of DEVICE_NODE in the tree, root is 0
    //

    ULONG Level;

    //
    // Power notification order list entry for this device node
    //

    PPO_DEVICE_NOTIFY Notify;

    //
    // General flags.
    //

    ULONG Flags;

    //
    // Flags used by user-mode for volatile state which should go away on a
    // reboot or when the device is removed.
    //

    ULONG UserFlags;

    //
    // Problem.  This is set if DNF_HAS_PROBLEM is set in Flags.  Indicates
    // which problem exists and uses the same values as the config manager
    // CM_PROB_*
    //

    ULONG Problem;

    //
    // Pointer to the physical device object that this DEVICE_NODE is associated
    // with.
    //

    PDEVICE_OBJECT PhysicalDeviceObject;

    //
    // Pointer to the list of resources assigned to the PhysicalDeviceObject.
    // This is the Resource list which is passed to driver's start routine.
    // Note, PDO contains ListOfAssignedResources which described the resources
    // owned by the PDO. But, it is not in the format we will pass to driver or
    // write to registry.
    //

    PCM_RESOURCE_LIST ResourceList;

    PCM_RESOURCE_LIST ResourceListTranslated;

    //
    // EnumerationMutex ensures that a given DEVICE_NODE doesn't get enumerated
    // on multiple threads at the same time.
    //

    KEVENT EnumerationMutex;

    //
    // InstancePath is the path of the instance node in the registry,
    // i.e. <EnumBus>\<DeviceId>\<uniqueid>
    //

    UNICODE_STRING InstancePath;

    //
    // ServiceName is the name of the driver who controls the device. )Not the
    // driver who enumerates/creates the PDO.:  This field is mainly for
    // convenience.
    //

    UNICODE_STRING ServiceName;

    //
    // DuplicatePDO - if the flags have DNF_DUPLICATE set then this fields indicates
    // the duplicate PDO which is enumerated by a bus driver.  N.B. It is possible
    // that DNF_DUPLICATE is set but this field is NULL.  In this case, it means that
    // we know the device is a duplicate of another device and we have not enumerated
    // the DuplicatePDO yet.
    //

    PDEVICE_OBJECT DuplicatePDO;

    //
    // ResourceRequirements
    //

    PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements;

    //
    // Information queried from the LEGACY_BUS_INFORMATION irp.
    //

    INTERFACE_TYPE InterfaceType;
    ULONG BusNumber;

    //
    // Information queried from the BUS_INFORMATION irp.
    //

    INTERFACE_TYPE ChildInterfaceType;
    ULONG ChildBusNumber;
    USHORT ChildBusTypeIndex;

    //
    // Information queried from the PNP_BUS_INFORMATION irp. The BusTypeIndex
    // value is actually an index into a global table of known bus type guids.
    //

    USHORT Reserved;        // padding, someone else can use this field

    //
    // Linked list of entries that represent each driver that has registered
    // for notification on this devnode. Note{ drivers )and user-mode: actually
    // register based on a FILE_OBJECT handle, which is translated into a PDO
    // by sending an IRP_MN_QUERY_DEVICE_RELATIONS for TargetDeviceRelation.
    //

    LIST_ENTRY TargetDeviceNotify;

    //
    // DeviceArbiterList - A list of arbiters registered for this physical device object
    // Note{ The Arbiters must be dereferenced when the device node is going away.
    //

    LIST_ENTRY DeviceArbiterList;

    //
    // DeviceTranslatorList - A list of translator for this physical device object
    // NOTE{ the Translator must be dereferenced when the devic node is going away.
    //

    LIST_ENTRY DeviceTranslatorList;

    //
    // NoTranslatorMask - the bit position corresponds to resource type
    //   if bit is set, there is no translator for the resource type in this devnode
    //

    USHORT NoTranslatorMask;

    //
    // QueryTranslatorMask - The bit position corresponds to resource type.
    //   if bit is set, the translator for the resource type is queried.
    //

    USHORT QueryTranslatorMask;

    //
    // NoArbiterMask - the bit position corresponds to resource type
    //   if bit is set, there is no arbiter for the resource type in this devnode
    //

    USHORT NoArbiterMask;

    //
    // QueryArbiterMask - The bit position corresponds to resource type.
    //   if bit is set, the arbiter for the resource type is queried.
    //

    USHORT QueryArbiterMask;

    //
    // The following fields are used to track  legacy resource allocation
    // LegacyDeviceNode - The real legacy device node.
    // NextResourceDeviceNode - link all the made-up device nodes which own part of
    //   the resources from LegacyDeviceNode.
    //

    union |
        PDEVICE_NODE LegacyDeviceNode;
        PDEVICE_RELATIONS PendingDeviceRelations;
    " OverUsed1;

    union |
        PDEVICE_NODE NextResourceDeviceNode;
    " OverUsed2;

    //
    // Remember the BootResources for the device
    //

    PCM_RESOURCE_LIST BootResources;

    //
    // Lock Count used to keep track of multiple ejects
    //
    ULONG LockCount;

    //
    // If this devnode has been QueryRemoved but the original target of the
    // QueryRemove is still physically present then this will point to the
    // relation list used to process the original QueryRemove.
    //
    PRELATION_LIST RelationList;

    //
    // When Capabilities have been queried for a device )twice, once before
    // start and once after start: the flags are stored here in the same format
    // as the query capabilities IRP - use IopDeviceNodeFlagsToCapabilities to
    // access.
    //
    ULONG CapabilityFlags;

    //
    // Maintain a list of current dock devices and their SerialNumbers
    //
    struct |
        PROFILE_STATUS  DockStatus;
        LIST_ENTRY      ListEntry;
        PWCHAR          SerialNumber;
    " DockInfo;

    //
    // Maintain a count to determine if either ourselves or any of
    // our children are stopping us from being disableable
    // count = myself )DNUF_NOT_DISABLEABLE: + 1 for each immediate
    // child that has DisableableDepends > 0
    //
    ULONG DisableableDepends;

    //
    // List of pended IoSetDeviceInterfaceState calls.
    // IoSetDeviceInterfaceState adds an entry to this list whenever it is
    // called and we haven't been started yet.  Once we do the start we'll
    // run down the list.
    //
    LIST_ENTRY PendedSetInterfaceState;

#if DBG_SCOPE
    ULONG FailureStatus;
    PCM_RESOURCE_LIST PreviousResourceList;
    PIO_RESOURCE_REQUIREMENTS_LIST PreviousResourceRequirements;
#endif

" DEVICE_NODE;


typedef struct _DEVOBJ_EXTENSION |

    CSHORT          Type;
    USHORT          Size;

    //
    // Public part of the DeviceObjectExtension structure
    //

    PDEVICE_OBJECT  DeviceObject;               // owning device object

// end_ntddk end_nthal end_ntifs end_wdm

    //
    // Universal Power Data - all device objects must have this
    //

    ULONG           PowerFlags;             // see ntos\po\pop.h
                                            // WARNING{ Access via PO macros
                                            // and with PO locking rules ONLY.

    //
    // Pointer to the non-universal power data
    //  Power data that only some device objects need is stored in the
    //  device object power extension -> DOPE
    //  see po.h
    //

    struct          _DEVICE_OBJECT_POWER_EXTENSION  *Dope;

    //
    // power state information
    //

    //
    // Device object extension flags.  Protected by the IopDatabaseLock.
    //

    ULONG ExtensionFlags;

    //
    // PnP manager fields
    //

    PVOID           DeviceNode;

    //
    // AttachedTo is a pointer to the device object that this device
    // object is attached to.  The attachment chain is now doubly
    // linked{ this pointer and DeviceObject->AttachedDevice provide the
    // linkage.
    //

    PDEVICE_OBJECT  AttachedTo;

    //
    // Doubly-linked list of file objects
    //

    LIST_ENTRY      FileObjectList;

// begin_ntddk begin_wdm begin_nthal begin_ntifs

" DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;

Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #4 : 01-03-2004 20:55 » 

весь день провозился с драйвером
самое забавное оказалось что  я
обратился к локальному параметру уже после выхода из
функции поэтому может быть что-то забыл удалить из памяти
но работоспособность как ни странно не повлияло:
как не работал так и не работает
и я его раз 40 загружал выгружал а BSOD так и не увидел --- новичкам везет Улыбаюсь

Цитата

Цитата:
а ты видел scm driver с AddDevice ?
 SCM- Service Control Manager. Так что продолжаю непонимать о чем ты говоришь. Вероятно это какой-то девайс.

 


неа это Service Control Manager просто я незнаю как класифицируется
драйвер загружаемый через него , а не через перечисление или
электронное уведомленние вот и обзываю все такое  scum driver




Цитата

_asm int 3;
перед любой интересной точкой в ф-ции и SoftIce всплывет, если конечно загружен уже, если нет- BSOD.

 

эээ мне как-то больше нравится остановка им
загрузки OS при ntice boot start вот только
с реализацией возникли проблеммы -
 - он что ли не видит еще свой конфиг ?


Цитата

P.S. Вот тебе вид структур(в DDK вместо них- обрубки), но это для общего развития- правильно проинициализировать эти структуры ты скорее всего не сможешь

 
ничего я в этом не понял,
 общим развитием я завтра займусь,
  а IoRegisterDeviceInterface возвращает мне STATUS_INVALID_DEVICE_REQUEST из-за того что в pDeviceObject->DeviceObjectExtension[14h] находится 0


есть какая-нибудь другая возможность приложению получить дескриптор устройства через GUID ?
или мне придется создавать символьную ссылку ?
Записан

1n c0de we trust
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #5 : 02-03-2004 06:18 » 

Цитата

есть какая-нибудь другая возможность приложению получить дескриптор устройства через GUID ?


При регистрации интерфейса на девайс создается подключ в HKLM\System\CurrentControlSet\Control\DeviceClasses с GUID а под этим ключом прописывают инфу об устройствах с этим интерфейсом в виде #Enumerator#Pid_Vid, то есть для Device object'a не являющегося созданным каким то шиным драйвером или самой системой, вероятно не предусмотрено создание подключа.
Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #6 : 03-03-2004 02:59 » 

Как я понял IoRegisterDeviceInterface  создает на устройство символьную ссылку при этом проверяя чтобы к DevObj был подключен еще один DevObj - тогда почему MS запрещают просто использовать Named DeviceObject ?
Записан

1n c0de we trust
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #7 : 03-03-2004 07:39 » 

Цитата

Как я понял IoRegisterDeviceInterface создает на устройство символьную ссылку при этом проверяя чтобы к DevObj был подключен еще один DevObj - тогда почему MS запрещают просто использовать Named DeviceObject ?


А я откуда знаю почему, сделали так и все. Ему нужен PDO с правильными структурами и все. Необходимость подключения FDO по моему не обязательна.
Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #8 : 06-03-2004 02:56 » 

га теперь вроде понял :

IoRegisterDeviceInterface предназначен для WDM драйверов , так что пока я вожусь с унаследованными мне он вроде как не к чему .
Записан

1n c0de we trust
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines