Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |
??? 11.03.02 14:47 Число просмотров: 1030
Автор: BOBAH Статус: Незарегистрированный пользователь
|
|
|
|
<programming>
|
[C++] LPT DDK 07.03.02 12:11
Автор: BOBAH Статус: Незарегистрированный пользователь
|
Подскажите, как обратиться в 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?
Код в сокращенном виде:
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
..........................................
PortAddress.LowPart = LPT_BASE_ADDR;
PortAddress.HighPart = 0;
// Register resource usage (ports)
RtlZeroMemory( (PVOID)&ResourceList, sizeof( ResourceList ) );
ResourceList.Count = 1;
ResourceList.List[0].InterfaceType = Isa;
// ResourceList.List[0].Busnumber = 0; Already 0
// ResourceList.List[0].PartialResourceList.Version = 0;
// ResourceList.List[0].PartialResourceList.Revision = 0;
ResourceList.List[0].PartialResourceList.Count = 1;
ResourceList.List[0].PartialResourceList.PartialDescriptors[0].Type = CmResourceTypePort;
ResourceList.List[0].PartialResourceList.PartialDescriptors[0].ShareDisposition = CmResourceShareDriverExclusive;
ResourceList.List[0].PartialResourceList.PartialDescriptors[0].Flags = CM_RESOURCE_PORT_IO;
ResourceList.List[0].PartialResourceList.PartialDescriptors[0].u.Port.Start = PortAddress;
ResourceList.List[0].PartialResourceList.PartialDescriptors[0].u.Port.Length = 4;
// Report our resource usage and detect conflicts
status = IoReportResourceUsage(
NULL, // driver class name
DriverObject, // driver object
&ResourceList, // driver resource list
sizeof( ResourceList ), // driver resource list size
NULL, // device object
NULL, // device resource list
0, // device resource list size
FALSE, // override conflict
&ResourceConflict // conflict detected
);
if( ResourceConflict )
return STATUS_DEVICE_CONFIGURATION_ERROR;
/* creating device */
RtlInitUnicodeString(&uni_ntname, NT_DEVICE_NAME);
status = IoCreateDevice(DriverObject,
sizeof(DEVICE_INFO),
&uni_ntname,
FILE_DEVICE_PRLPRGM,
0,
FALSE,
&deviceObject);
if(status != STATUS_SUCCESS)
return status;
/* 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;
.....................................................................
return STATUS_SUCCESS;
}
NTSTATUS PrlPrgm_Dispatch(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
..........................................
WRITE_PORT_UCHAR(pDevInfo->PortBase, 0x02);
..........................................
Irp->IoStatus.Status = status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return status;
}
|
 |  |
[C++] Мученья продолжаются... 18.03.02 05:10
Автор: dsds Статус: Незарегистрированный пользователь
|
По этой ссылке есть описание работы с параллельным портом (через специальный драйвер) из под NT, но для Дельфи, может пригодится.
Вот ссылка
|
 |  |  |
[C++] Мученья продолжаются... 18.03.02 10:48
Автор: BOBAH Статус: Незарегистрированный пользователь
|
Спасибо за пример. Весьма интересно. Но проблема в том, что мне нужно работать непосредственно с портом из драйвера, т.к. в моей задаче есть критичность по времени, выполняется всё на DISPATCH_LEVEL.
> По этой ссылке есть описание работы с параллельным портом > (через специальный драйвер) из под NT, но для Дельфи, может > пригодится.
|
 |  |  |  |
[c++] готово ! 19.03.02 14:21
Автор: BOBAH Статус: Незарегистрированный пользователь
|
|
Получилось работать с LPT под NT из своего драйвера через стандартный драйвер. Если кому-то будет необходимо, обращайтесь.
|
 |  |  |  |  |
[C++] Обращаюсь :-) 20.03.02 06:35
Автор: dsds Статус: Незарегистрированный пользователь
|
> Получилось работать с LPT под NT из своего драйвера через > стандартный драйвер. Если кому-то будет необходимо, > обращайтесь. Если не трудно поделитесь.
|
 |  |  |  |  |  |
[C++] Обращаюсь :-) 20.03.02 11:07
Автор: BOBAH Статус: Незарегистрированный пользователь
|
Размещять на форуме не вижу смысла, не такая уж это невидаль... :о)
Давайте мыло, вышлю. Либо, мыльте сами: myboss@mailru.com
> > Получилось работать с LPT под NT из своего драйвера > через > > стандартный драйвер. Если кому-то будет необходимо, > > обращайтесь. > Если не трудно поделитесь.
|
 |  |  |  |  |
Всем откликнувшимся спасибо ! 19.03.02 14:23
Автор: BOBAH Статус: Незарегистрированный пользователь
|
|
|
 |
[C++] LPT DDK 12.03.02 14:44
Автор: Chingachguk <Chingachguk> Статус: Member
|
Ты хочешь сказать, что если номер порта в in-out-ах не совпадает с LPT, то скорость одна, а для других портов - другая ?
Если так, то, может быть, ты ловишь эксепшен, но обработчик тебя не игнорирует, а все-ж таки выполняет, но тормоза-то остаются...
Может, тебе стоит попробовать свое tss поправить насчет этих портов, чтобы не было эксепшена, да вот только можно ли это в вин 2K ?
|
 |
??? 11.03.02 14:47
Автор: BOBAH Статус: Незарегистрированный пользователь
|
|
|
|
|