NuMega 2.7 KDevice exposing
От: Antei США  
Дата: 09.12.03 12:34
Оценка:
Есть intermedia filter driver. Для коннекта с Application сделал exposing WDM Device, взял из примера:

NDIS_STATUS Testdrv0Adapter::OnInitialize
    (const KNdisMedium& Medium, KNdisConfig& Config)
{
...
    static PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
    NdisZeroMemory(MajorFunction, sizeof(MajorFunction));
    MajorFunction[IRP_MJ_CREATE] = 
        MajorFunction[IRP_MJ_CLOSE] = 
        MajorFunction[IRP_MJ_CLEANUP] = 
        MajorFunction[IRP_MJ_READ] = 
        MajorFunction[IRP_MJ_WRITE] = 
        MajorFunction[IRP_MJ_DEVICE_CONTROL] = IoDispatch;

    Status = 
        NdisMRegisterDevice(
            *KNdisMiniDriver::DriverInstance(),
            KNDIS_STRING_CONST("\\Device\\MyNdisDevice"),
            KNDIS_STRING_CONST("\\DosDevices\\MyNdisDevice"),
            MajorFunction,
            &m_pDeviceObject,
            &m_DeviceHandle
        );
...
}



Соответственно, обработка обращений из приложения в

NTSTATUS Testdrv0Adapter::IoDispatch (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
...
}


Пример — NuMeg'овский. Все работает.
А вопрос такой: можно ли в качестве девайса для связи с Application использовать класс KDevice?
(у него есть предопределенные обработчики KDevice::Read, KDevice::DeviceControl, да и при работе с NuMega такой подход (если это возможно) будет корректней)
Заранее благодарен за совет.
Re: NuMega 2.7 KDevice exposing
От: Геннадий Майко США  
Дата: 09.12.03 16:07
Оценка:
Здравствуйте, Antei, Вы писали:

A>Есть intermedia filter driver. Для коннекта с Application сделал exposing WDM Device, взял из примера:


A>
A>NDIS_STATUS Testdrv0Adapter::OnInitialize
A>    (const KNdisMedium& Medium, KNdisConfig& Config)
A>{
A>...
A>    static PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
A>    NdisZeroMemory(MajorFunction, sizeof(MajorFunction));
A>    MajorFunction[IRP_MJ_CREATE] = 
A>        MajorFunction[IRP_MJ_CLOSE] = 
A>        MajorFunction[IRP_MJ_CLEANUP] = 
A>        MajorFunction[IRP_MJ_READ] = 
A>        MajorFunction[IRP_MJ_WRITE] = 
A>        MajorFunction[IRP_MJ_DEVICE_CONTROL] = IoDispatch;

A>    Status = 
A>        NdisMRegisterDevice(
A>            *KNdisMiniDriver::DriverInstance(),
A>            KNDIS_STRING_CONST("\\Device\\MyNdisDevice"),
A>            KNDIS_STRING_CONST("\\DosDevices\\MyNdisDevice"),
A>            MajorFunction,
A>            &m_pDeviceObject,
A>            &m_DeviceHandle
A>        );
A>...
A>}
A>



A>Соответственно, обработка обращений из приложения в


A>
A>NTSTATUS Testdrv0Adapter::IoDispatch (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
A>{
A>...
A>}
A>


A>Пример — NuMeg'овский. Все работает.

A>А вопрос такой: можно ли в качестве девайса для связи с Application использовать класс KDevice?
A>(у него есть предопределенные обработчики KDevice::Read, KDevice::DeviceControl, да и при работе с NuMega такой подход (если это возможно) будет корректней)
--
Я думаю, здесь можно использовать макрос KDevicePTR, который из системного DeviceObject может получить указатель на KDevice; затем с помощью этого указателя можно будет уже вызвать соответствующий метод класса KDevice. Однако в этом случае для каждой нужной функции в массиве MajorFunction необходимо будет задать свою функцию, аналогичную IoDispatch. Или делать корректный вызов методов динамически, исходя из полей Irp.

C уважением,
Геннадий Майко.
Re[2]: NuMega 2.7 KDevice exposing
От: Antei США  
Дата: 09.12.03 18:22
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>--

ГМ>Я думаю, здесь можно использовать макрос KDevicePTR, который из системного DeviceObject может получить указатель на KDevice; затем с помощью этого указателя можно будет уже вызвать соответствующий метод класса KDevice. Однако в этом случае для каждой нужной функции в массиве MajorFunction необходимо будет задать свою функцию, аналогичную IoDispatch. Или делать корректный вызов методов динамически, исходя из полей Irp.

Не знал что так можно (KDevicePTR), спасибо за инфу . Моя идея была несколько иной. Я написал свой объект, производный от KDevice с обработчиками. Насколько я понял, при создании этого класса он сам подцепляет свои обрабочики.

Вожусь с компиляцией. Пока компилирую Device отдельно, все ок, как только хедер девайса включаю в хедер драйвера, все перестает компилироваться, куча ошибок.
Re[2]: Вопрос по NdisMRegisterDevice и IoCreateDevice
От: Antei США  
Дата: 11.12.03 07:40
Оценка:
    Status = 
        NdisMRegisterDevice(
            *KNdisMiniDriver::DriverInstance(),
            KNDIS_STRING_CONST("\\Device\\MyNdisDevice"),
            KNDIS_STRING_CONST("\\DosDevices\\MyNdisDevice"),
            MajorFunction,
            &m_pDeviceObject,
            &m_DeviceHandle
        );


В DDK по поводу NdisMRegisterDevice написано:

...An intermediate driver or miniport driver creates a device object by calling NdisMRegisterDevice from its DriverEntry function after...
... The device extension for an object created with NdisMRegisterDevice is reserved for use by NDIS and cannot be used by the driver.
...NDIS drivers should never call IoCreateDevice or IoCreateSymbolicLink. Instead, if an NDIS driver must create a device object, it should call NdisMRegisterDevice.


Вопросы:
1. Я рассчитывал хранить данные в DeviceExtention, т.к. читал что все драйвера хранят свои данные там. Но (см. выше) написано что для IM NDIS драйверов DeviceExtention использовать нельзя. Если не в DeviceExtention, то где же правильно их хранить?
2. Можно ли все-таки из IM драйвера использовать IoCreateDevice? Чем это может грозить?

С уважением, Antei.
Re[3]: Вопрос по NdisMRegisterDevice и IoCreateDevice
От: Геннадий Майко США  
Дата: 11.12.03 09:31
Оценка:
Здравствуйте, Antei, Вы писали:

A>Вопросы:

A>1. Я рассчитывал хранить данные в DeviceExtention, т.к. читал что все драйвера хранят свои данные там. Но (см. выше) написано что для IM NDIS драйверов DeviceExtention использовать нельзя. Если не в DeviceExtention, то где же правильно их хранить?
--
Например, хранить указатель на эти данные как глобальные (в смысле С/С++) данные (если конечно, miniport driver и "именованный" driver компилируются в одном проекте).
Можно сделать какой-нибудь map между значением указателя на "именнованный" драйвер (который вернет NdisMRegisterDevice) и значением указателя на выделенную область памяти (из non-paged pool'a) для данных этого "именнованного" драйвера. Это позволит в функциях "именнованного" драйвера получить свои данные.

С уважением,
Геннадий Майко.
Re[4]: Вопрос по NdisMRegisterDevice и IoCreateDevice
От: Antei США  
Дата: 15.12.03 09:49
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

Я хочу использовать KNdisHeap под свои структуры данных DATA_STRUCT. Весь код написал аналогично примерам из NuMega. Все компилируется, но драйвер не устанавливается — выскакивает ошибка что entry point не найдена:

"The \SystemRoot\System32\DRIVERS\testdrv0.sys device driver could not locate the entry point InterlockedPushEntrySList in driver ntoskrnl.exe."

Подскажите, в чем ошибка?

class Testdrv0Adapter : public KNdisFilterAdapter {
...
    struct DATA_STRUCT : public KNdisHeapClient<DATA_STRUCT> {
        UCHAR m_buf[50];
        UCHAR m_cFlag;
        ...
        DATA_STRUCT(UCHAR cFlag):m_cFlag(cFlag){}
    }
...
    KNdisHeap<DATA_STRUCT>    m_structHeap;
...
    static NTSTATUS IoDispatch (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
      static Testdrv0Adapter* m_pSelf    ;

...
}

NDIS_STATUS Testdrv0Adapter::OnInitialize(const KNdisMedium& Medium, KNdisConfig& Config){
...
    m_structHeap.Initialize((short)2);
}

NTSTATUS Testdrv0Adapter::IoDispatch (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp){
...
    DATA_STRUCT* pStruct1 = new (&m_pSelf->m_structHeap) DATA_STRUCT(cVar);
}




С уважением, Antei
Re[5]: Вопрос по NdisMRegisterDevice и IoCreateDevice
От: Геннадий Майко США  
Дата: 15.12.03 10:32
Оценка:
Здравствуйте, Antei, Вы писали:

A>Здравствуйте, Геннадий Майко, Вы писали:


A>Я хочу использовать KNdisHeap под свои структуры данных DATA_STRUCT. Весь код написал аналогично примерам из NuMega. Все компилируется, но драйвер не устанавливается — выскакивает ошибка что entry point не найдена:


A>"The \SystemRoot\System32\DRIVERS\testdrv0.sys device driver could not locate the entry point InterlockedPushEntrySList in driver ntoskrnl.exe."


A>Подскажите, в чем ошибка? :???:

--
Вы случайно не запускаете Ваш драйвер под Windows 2K? Если это так, то, насколько я знаю, там этой функции InterlockedPushEntrySList нет, она появилась только для XP/S2003.

С уважением,
Геннадий Майко.
Re[6]: Вопрос по NdisMRegisterDevice и IoCreateDevice
От: Antei США  
Дата: 15.12.03 12:13
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>Вы случайно не запускаете Ваш драйвер под Windows 2K? Если это так, то, насколько я знаю, там этой функции InterlockedPushEntrySList нет, она появилась только для XP/S2003.


Да, точно, компилирую и запускаю под 2K. С уважением, Antei
Re[7]: Вопрос по NdisMRegisterDevice и IoCreateDevice
От: Antei США  
Дата: 15.12.03 13:18
Оценка:
Я думал что в таком случае получу ошибки при компиляции или линковке.
Вообще-то драйвер убивал систему строкой


NTSTATUS Testdrv0Adapter::IoDispatch (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp){
...
    DATA_STRUCT* pStruct1 = new (&m_pSelf->m_structHeap) DATA_STRUCT(cVar);


Т.е. если строку закомментировать, то драйвер устанавливался и
грузился нормально. Тем не менее, в драйвере присутствовала строка:


NDIS_STATUS Testdrv0Adapter::OnInitialize(const KNdisMedium& Medium, KNdisConfig& Config){
...
    m_structHeap.Initialize((short)2);


отсюда делаю вывод, что хип все-таки инициализировался. Как это
объяснить?
Re[8]: Вопрос по NdisMRegisterDevice и IoCreateDevice
От: Геннадий Майко США  
Дата: 15.12.03 13:45
Оценка:
Здравствуйте, Antei, Вы писали:

A>Я думал что в таком случае получу ошибки при компиляции или линковке.

--
Вы, наверное, пользуетесь *.lib файлами для XP или S2003, поэтому ошибок компоновки не было.


A>Вообще-то драйвер убивал систему строкой

A>
A>NTSTATUS Testdrv0Adapter::IoDispatch (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp){
A>...
A>    DATA_STRUCT* pStruct1 = new (&m_pSelf->m_structHeap) DATA_STRUCT(cVar);
A>


A>Т.е. если строку закомментировать, то драйвер устанавливался и

A>грузился нормально. Тем не менее, в драйвере присутствовала строка:

A>
A>NDIS_STATUS Testdrv0Adapter::OnInitialize(const KNdisMedium& Medium, KNdisConfig& Config){
A>...
A>    m_structHeap.Initialize((short)2);
A>


A>отсюда делаю вывод, что хип все-таки инициализировался. Как это

A>объяснить?
--
Какой тип имеет m_structHeap?
Что делает функция Initialize — выделяет ли она место в памяти, в котором (при вызове функции placement new в первом фрагменте кода) и будет располагаться DATA_STRUCT? Если выделяет, то какого размера этот буфер (неуж-то 2 байта)?

Судя по первому фрагменту кода, адрес переменной m_pSelf->m_structHeap будет являться адресом для размещения DATA_STRUCT, так и было задумано?

С уважением,
Геннадий Майко.
Re[9]: Вопрос по NdisMRegisterDevice и IoCreateDevice
От: Antei США  
Дата: 15.12.03 14:11
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>--

ГМ>Вы, наверное, пользуетесь *.lib файлами для XP или S2003, поэтому ошибок компоновки не было.
проверю.

ГМ>Какой тип имеет m_structHeap?

KNdisHeap<DATA_STRUCT> m_structHeap

ГМ>Что делает функция Initialize — выделяет ли она место в памяти, в котором (при вызове функции placement new в первом фрагменте кода) и будет располагаться DATA_STRUCT? Если выделяет, то какого размера этот буфер (неуж-то 2 байта)?

2 структуры DATA_STRUCT (для эксперимента)

ГМ>Судя по первому фрагменту кода, адрес переменной m_pSelf->m_structHeap будет являться адресом для размещения DATA_STRUCT, так и было задумано?

переданное значение m_pSelf->m_structHeap — это указатель на хип (см. ниже). Так требует KNdisHeapClient.

KNdisHeapClient::operator new
PVOID operator new(
unsigned int nSize,
KNdisHeap<T>* pList
);


Allocates a block of storage for type T, and invokes a constructor of T

Parameters
nSize
Ignored; allocated size is always sizeof(T).

pList
Pointer to the heap from which to allocate the storage for the new instance

Re[10]: Вопрос по NdisMRegisterDevice и IoCreateDevice
От: Геннадий Майко США  
Дата: 15.12.03 14:23
Оценка:
Здравствуйте, Antei, Вы писали:

ГМ>>Судя по первому фрагменту кода, адрес переменной m_pSelf->m_structHeap будет являться адресом для размещения DATA_STRUCT, так и было задумано?

A>переданное значение m_pSelf->m_structHeap — это указатель на хип (см. ниже). Так требует KNdisHeapClient.
--
Если m_pSelf->m_structHeap — это указатель на хип, то передавайте для placement new именно m_pSelf->m_structHeap, а не адрес m_pSelf->m_structHeap:
DATA_STRUCT* pStruct1 = new (/*&*/m_pSelf->m_structHeap) DATA_STRUCT(cVar);

C уважением,
Геннадий Майко.
Re[11]: Вопрос по NdisMRegisterDevice и IoCreateDevice
От: Antei США  
Дата: 15.12.03 15:15
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>Здравствуйте, Antei, Вы писали:


ГМ>>>Судя по первому фрагменту кода, адрес переменной m_pSelf->m_structHeap будет являться адресом для размещения DATA_STRUCT, так и было задумано?

A>>переданное значение m_pSelf->m_structHeap — это указатель на хип (см. ниже). Так требует KNdisHeapClient.
ГМ>--
ГМ>Если m_pSelf->m_structHeap — это указатель на хип, то передавайте для placement new именно m_pSelf->m_structHeap, а не адрес m_pSelf->m_structHeap:
ГМ>
ГМ>DATA_STRUCT* pStruct1 = new (/*&*/m_pSelf->m_structHeap) DATA_STRUCT(cVar);
ГМ>

ГМ>C уважением,
ГМ>Геннадий Майко.

Указатель на хип — именно это: &m_pSelf->m_structHeap
в пред. посте я просто недописал &, так что тут ошибки не было. Ее бы не допустил компилер.

Да ладно, бог с этим классом хипа, если это под 2К не работает.
Re[6]: Вопрос по NdisMRegisterDevice и IoCreateDevice
От: Antei США  
Дата: 17.12.03 19:34
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>Вы случайно не запускаете Ваш драйвер под Windows 2K? Если это так, то, насколько я знаю, там этой функции InterlockedPushEntrySList нет, она появилась только для XP/S2003.


Действительно, Я использовал не те библиотеки. Я перекомпилировал библиотеки NuMega под 2К и классы KNdisHeap и KNdisHeapClient заработали как миленькие. А функции Lookaside List есть в 2K.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.