bumblebee
Гость
|
|
« : 13-10-2004 08:35 » |
|
Ситуация следующая: Я пишу WDM-драйвер PS/CS для ридера смарт-карт. Проблема состоит в том что мне необходима многослойная структура,поэтому выбран WDM-драйвер. Ридер подключается к последовательному порту(COM1 или COM2),но сам ридер не является утройством PnP,поскольку не имеет управляющих сигналов DSR и т.д. Поэтому в функции AddDevice Я пытаюсь PDO проинициализировать в ручную: мне необходимо вручную к объекту PhysicalDeviceObject зацепить коммуникационный порт.
NTSTATUS UNC08RDAddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject ) /*++
Routine Description:
This routine creates an object for the physical device specified and sets up the deviceExtension.
--*/ { PDEVICE_EXTENSION deviceExtension; NTSTATUS status = STATUS_SUCCESS; PREADER_EXTENSION readerExtension; PSMARTCARD_EXTENSION smartcardExtension; ULONG deviceInstance; PDEVICE_OBJECT DeviceObject = NULL; UNICODE_STRING ntDeviceName;
Для этого я вызываю следующий блок:
RtlInitUnicodeString(&ntDeviceName, L"\\Device\\Serial0");
status = IoGetDeviceObjectPointer( &ntDeviceName, FILE_WRITE_DATA, &deviceExtension->fileObject, &PhysicalDeviceObject);
ATTACHED_DEVICE_OBJECT = IoAttachDeviceToDeviceStack( DeviceObject, PhysicalDeviceObject );
Эти две функции нормально все отрабатывают но при вызове функции:
status = IoRegisterDeviceInterface(PhysicalDeviceObject, &SmartCardReaderGuid, NULL, &deviceExtension->PnPDeviceName );
Функция возвращает STATUS_INVALID_DEVICE_REQUEST,что говорит о том что PDO не правильный.
Скажите пожалуйста что я делаю не так? Как мне вручную проинициализировать PDO на коммуникационный порт?
Заранее благодарен.
С Уважением Владислав.
|