Возник такой вопрос, пишу драйвер для USB устройства с помощью книги Агурова. Требуется несколько Device Object, чтобы читать с разных конечных точек, но не знаю, как это сделать. Пробовал так в методе NTSTATUS DV2::AddDevice(PDEVICE_OBJECT Pdo) класса KDriver создаю два экземпляра объекта KPnpDevice:
DV2Device * pDevice = new ( static_cast<PCWSTR>(KUnitizedName(L"DV2Device", m_Unit)), FILE_DEVICE_UNKNOWN, static_cast<PCWSTR>(KUnitizedName(L"DV2Device", m_Unit)), 0, DO_BUFFERED_IO ) DV2Device(Pdo, m_Unit,1);
if (pDevice == NULL) { return STATUS_INSUFFICIENT_RESOURCES; }
NTSTATUS status = pDevice->ConstructorStatus();
if ( !NT_SUCCESS(status) ) { delete pDevice; } else { m_Unit++; DbgPrint("Unit Number is %d",m_Unit); }
DV2Device * pDeviceEP = new ( static_cast<PCWSTR>(KUnitizedName(L"DV2DeviceT", m_UnitEP)), FILE_DEVICE_UNKNOWN, static_cast<PCWSTR>(KUnitizedName(L"DV2DeviceT", m_UnitEP)), 0, DO_BUFFERED_IO ) CandDV2Device(Pdo, m_UnitEP,2);
if (pDeviceEP == NULL) { return STATUS_INSUFFICIENT_RESOURCES; }
status = pDeviceEP->ConstructorStatus();
if ( !NT_SUCCESS(status) ) { delete pDeviceEP; } else { m_UnitEP++; DbgPrint("Unit EP Number is %d",m_UnitEP); }
В конструкторе класса kPNPDevice есть строки status = m_Lower.Initialize(this, Pdo);
if (status == STATUS_SUCCESS){ DbgPrint("m_Lower.Initialize OK"); } else { DbgPrint("ERROR: m_Lower.Initialize"); } Для DV2Device все нормально, а для DV2DeviceT - ERROR: m_Lower.Initialize
И ещё, метод OnStartDevice вызывается только для DV2Device, а для DV2DeviceT - т.е. он видимо не инициализируется, так?
|