Как узнать адрес LPT-порта в windows

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Как узнать адрес LPT-порта в windows

Post by Lavr »

Как программно узнать адрес LPT-порта в Windows-98, Windows XP, Windows 7?

Подозреваю, что как-то через ключи реестра...
Но обширно погуглив, ответа так и не нашел. :(

Именно базовый адрес адрес LPT-порта, а не принтера по умолчанию.
iLavr
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Я, честно говоря, знаю, где в реестре прописаны свойства LPT-портов на моей машине,
но с этим есть разночтения...

Вот, к примеру, совет на одном из зарубежных сайтов:
paper wrote:why you not reading the parallel port-address from windows registry ?

Code: Select all

 WIN98SE: 
HKLM\System\CurrentControlSet\Services\Class\Ports\               (enumerate all ports on your PC)
and
    HKLM\Enum   (PortName, LogConfig, etc... of ports)
for sample on my PC with W98SE:

Code: Select all

    HKLM\System\CurrentControlSet\Services\Class\Ports\0002          (LPT1 on board)
        InfSection = "LptPort"
        MatchingDeviceId = "*PNP0400"
    HKLM\System\CurrentControlSet\Services\Class\Ports\0005          (LPT2 on PCI card)
        InfSection = "LptPort"
        MatchingDeviceId = "NMMFENUM\PCI9710_LPT"
Address of ports are:

Code: Select all

 
    HKLM\Enum\ACPI\*PNP0400\0\LogConfig = 

    HKLM\Enum\NMMFENUM\PCI9710_LPT\68F000&PORT_0002\LogConfig = 
In LogConfig are (device driver resource list) information of port-address.

Вся засада в том, что на моей машине в этих ключах прописаны вовсе не LPT-порты, а вот как
выяснить - по какому принципу заносятся данные о портах в ключи...

Впрочем, в Windows XP эти ключи вроде как и совсем другие.
iLavr
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

На сайте М$ в ответ на похожий вопрос:"How to find I/O range for given LPT Port programatically?"
разводят очень густой туман... :(
These two WMI classes would be helpful: Win32_PortResource and Win32_ParallelPort, you can also find the C++ WMI samples in that category.
The Win32_PortResource WMI class represents an I/O port on a computer system running Windows.
The Win32_ParallelPort WMI class represents the properties of a parallel port on a computer system running Windows.
Но WMI class похоже, что работает только начиная с Minimum supported client - Windows XP...
iLavr
User avatar
VituZz
God
Posts: 1343
Joined: 13 Nov 2010 04:06

Post by VituZz »

В Linux в процессе загрузки действия протоколируются, после загрузки протокол можно посмотреть командой dmesg. Может, что-то наподобие можно сделать и в Windows?

Вот пример с моего компа. grep позволяет выбрать нужные строки по шаблону из вывода команды dmesg:

Image
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

VituZz wrote:В Linux в процессе загрузки действия протоколируются...
В Linux, как я прочитал роясь в поиске, этот вопрос решается более просто и имеет
конкретное решение.

В принципе - вопрос советуют решать корректно примерно так:

Поскольку параллельные порты имеют известные адреса:
3BCh, 378h, 278h
то чтобы убедиться в наличии порта, по этим адресам записывают число, после чего
считывают его и если записанное = считанному, то есть некая уверенность в наличии
порта.

В принципе - не очень хорошо, если на порте висит принтер...

Но дело в том, что в ноутах сейчас этих портов нет. А есть только УСБ.
Поэтому LPT-порты эмулируются вот такими гаджетами:

Image

Если повезёт при покупке, они могут эмулировать LPT-порт прямо на уровне регистров,
но вся неприятность в том, что по включению базовый адрес такого "LPT-порта" вовсе
не ложится в привычные 3BCh, 378h, 278h... :( ,
а устанавливается в верхние адреса портов, причем в разные.

Вот эту ситуацию я (и многие в сети, как я увидел) пытаюсь разрешить, поскольку
к новому ноутбуку я такую USB2LPT приблуду приобрел...
iLavr
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Как узнать адрес LPT-порта в windows

Post by Lavr »

Lavr wrote:Как программно узнать адрес LPT-порта в Windows-98, Windows XP, Windows 7?
Подозреваю, что как-то через ключи реестра...
Похоже, что именно так, а не иначе... решение вроде как нашел:
Как получить адрес LPT порта в Win2k.
Решение довольно громоздкое - сугубо в стиле М$ - сделать простые вещи сложными... :D
han_malign wrote:Через HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\Ports - находишь где описан Lpt и лезешь скажем в HKEY_LOCAL_MACHINE\Enum\BIOS\*PNP0400\00\LogConfig - вот тебе и порт.
З.Ы. Вообще все это делается через SetupAPI и CfgMgr32, но это надо довольно много ковыряться (выяснить GUID класса портов, проенумить все порты по классу, выбрать нужный, получить Device Node, по DevNode прочитать загруженную логическую конфигурацию)
Как я понял, для Win2k это работает, т.к. есть по ссылке пример. Осталось проверить
этот рецепт для Windows XP, Windows 7...
iLavr
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Lavr wrote:чтобы убедиться в наличии порта, по этим адресам записывают число, после чего
считывают его и если записанное = считанному, то есть некая уверенность в наличии
порта.

В принципе - не очень хорошо, если на порте висит принтер...
Это я так думаю, что "не очень хорошо", вот тут пишут, что Виндавоз XP счтает несколько иначе...
eMitya wrote:Оказывается, XP следит за устройствами, периодически записывая в порт какую-то гадость. Что, конечно, нарушало все наши протоколы взаимодействия. Сие мерзопакостное поведение XP отключается при помощи задания соответствующего параметра в реестре
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Parport\Parameters
Если нет, то нужно прописать DisableWarmPoll REG_DWORD = 1
iLavr
User avatar
VituZz
God
Posts: 1343
Joined: 13 Nov 2010 04:06

Post by VituZz »

А как насчёт прав на запись в порт? Винда Хрр позволит это простому пользователю? :)
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

VituZz wrote:А как насчёт прав на запись в порт? Винда Хрр позволит это простому пользователю? :)
Насколько я всё это прочитал и по своему опыту работы с портами, тут дело даже не в Виндe Хрр,
право на запись в порт регулируется на уровне процесора.

Но не всё так грустно! :D
Для управления портами из программы для Windows NT/XP используется драйвер inpout32.dll.

Сколь он коварный, что обходит все препоны ОС, можно прочитать здесь: How Inpout32.dll works ?

Image
iLavr
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Lavr wrote:Как получить адрес LPT порта в Win2k.
Решение довольно громоздкое - сугубо в стиле М$ - сделать простые вещи сложными...
Что-то мне в первый раз нигде не попался довольно простой пример, как искать порты в Венде.
А между тем у меня на жестком диске такой пример даже в двух вариантах имеется.

В обоих вариантах используется функция из библиотеки winspool.drv:

Function EnumPorts Lib "winspool.drv" Alias "EnumPortsA" (ByVal pName As String, ByVal Level As Long, _
ByVal lpbPorts As Long, ByVal cbBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long


Если кто столкнется с такой же проблемой, пример на VB есть вот здесь:
Получить список доступных портов

Под Вендой_98 похожий вариант программы у меня добросовестно "выкатил" все порты:

--------------Image

Здесь нет адресов портов, но по их именам теперь можно читать соответствующие ключи
реестра, поскольку теперь точно известно, сколько и каких LPT - портов есть в системе.

Я не проверял пока, как это работает под Вендой 7 - там у меня просто нет LPT и СОМ портов... :wink:
iLavr