Подскажите, как обратиться в W2k к LPT порту из драйвера.
В конечном итоге, должно получиться тоже, что получается в коде под ДОС:
outport(0X379,0x02);
...............................
ret=inport(0X379);
Пока дело касалось свободных ресурсоввсё было нормально, как только дело коснулось LPT, который уже занят стандартным драйвером, всё встало.
Не хотелось бы заменять стандартный драйвер, а пользоваться им из своего. Задача критична ко времени (время между опросами 4мкс), не станет ли это основанием всё же заменять стандартный драйвер?
[C++] М ученья продолжаются...15.03.02 20:05 Автор: BOBAH Статус: Незарегистрированный пользователь
Написал я драйверок для LPT, запустил. Перед этим остановил parport (стандартный драйвер LPT) и parallel (драйвер Параллельного класса). Ресурсы зашарились, порты промэпились. Пытаюсь выдать что-нибудь в порт (например, установить высокий уровень на D1) и ничего... Попытался слезть с LPT и залезть по др. адресу (0x320), - всё проходит, битик устанавливается. Так в чём же дело с LPT?
Код в сокращенном виде:
/* create dos device name */
RtlInitUnicodeString(&uni_dosname, DOS_DEVICE_NAME);
status = IoCreateSymbolicLink(&uni_dosname, &uni_ntname);
if( status != STATUS_SUCCESS )
return status;
// Initialize the local driver info for each device object
pDeviceInfo = (DEVICE_INFO*)deviceObject->DeviceExtension;
if(pDeviceInfo == NULL)
return STATUS_DRIVER_INTERNAL_ERROR;
// Clear local device info memory
RtlZeroMemory( pDeviceInfo, sizeof(DEVICE_INFO) );
// Convert the IO port address into a form NT likes.
MemType =1;
if( !HalTranslateBusAddress(
Isa, // interface type
0, // bus number
PortAddress, // bus address
&MemType, // address space
&MappedAddress) ) // translated address
{
return STATUS_NONE_MAPPED;
}
if(!MemType)
{/* if address in memory address space */
..........................................
}
else
{/* if address in io address space */
pDeviceInfo->PortBase = (BYTE*)MappedAddress.LowPart;
pDeviceInfo->fMemoryMapped = FALSE;
}
/* set standard driver routines */
DriverObject->DriverUnload = PrlPrgm_Unload;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = PrlPrgm_Dispatch;
.....................................................................
Спасибо за пример. Весьма интересно. Но проблема в том, что мне нужно работать непосредственно с портом из драйвера, т.к. в моей задаче есть критичность по времени, выполняется всё на DISPATCH_LEVEL.
> По этой ссылке есть описание работы с параллельным портом > (через специальный драйвер) из под NT, но для Дельфи, может > пригодится.
[c++] готово !19.03.02 14:21 Автор: BOBAH Статус: Незарегистрированный пользователь
> Получилось работать с LPT под NT из своего драйвера через > стандартный драйвер. Если кому-то будет необходимо, > обращайтесь. Если не трудно поделитесь.
Размещять на форуме не вижу смысла, не такая уж это невидаль... :о)
Давайте мыло, вышлю. Либо, мыльте сами: myboss@mailru.com
> > Получилось работать с LPT под NT из своего драйвера > через > > стандартный драйвер. Если кому-то будет необходимо, > > обращайтесь. > Если не трудно поделитесь.
Всем откликнувшимся спасибо !19.03.02 14:23 Автор: BOBAH Статус: Незарегистрированный пользователь
Ты хочешь сказать, что если номер порта в in-out-ах не совпадает с LPT, то скорость одна, а для других портов - другая ?
Если так, то, может быть, ты ловишь эксепшен, но обработчик тебя не игнорирует, а все-ж таки выполняет, но тормоза-то остаются...
Может, тебе стоит попробовать свое tss поправить насчет этих портов, чтобы не было эксепшена, да вот только можно ли это в вин 2K ?