Здравствуйте, 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 уважением,
Геннадий Майко.