Возник такой вопрос, пишу драйвер для 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 - т.е. он видимо не инициализируется, так?