nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 16 Apr 2024 08:00



Reply to topic  [ 10 posts ] 
Как узнать адрес LPT-порта в windows 
Author Message
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Как программно узнать адрес LPT-порта в Windows-98, Windows XP, Windows 7?

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

Именно базовый адрес адрес LPT-порта, а не принтера по умолчанию.

_________________
iLavr


03 Jan 2014 15:00
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Я, честно говоря, знаю, где в реестре прописаны свойства LPT-портов на моей машине,
но с этим есть разночтения...

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

Code:
 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:
    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:
 
    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


03 Jan 2014 17:32
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
На сайте М$ в ответ на похожий вопрос:"How to find I/O range for given LPT Port programatically?"
разводят очень густой туман... :(
Quote:
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


03 Jan 2014 17:49
Profile
God
User avatar

Joined: 13 Nov 2010 04:06
Posts: 1345
Reply with quote
Post 
В Linux в процессе загрузки действия протоколируются, после загрузки протокол можно посмотреть командой dmesg. Может, что-то наподобие можно сделать и в Windows?

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

Image


04 Jan 2014 09:03
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
VituZz wrote:
В Linux в процессе загрузки действия протоколируются...

В Linux, как я прочитал роясь в поиске, этот вопрос решается более просто и имеет
конкретное решение.

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

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

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

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

Image

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

Вот эту ситуацию я (и многие в сети, как я увидел) пытаюсь разрешить, поскольку
к новому ноутбуку я такую USB2LPT приблуду приобрел...

_________________
iLavr


04 Jan 2014 09:49
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
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


04 Jan 2014 10:20
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Lavr wrote:
чтобы убедиться в наличии порта, по этим адресам записывают число, после чего
считывают его и если записанное = считанному, то есть некая уверенность в наличии
порта.

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

Это я так думаю, что "не очень хорошо", вот тут пишут, что Виндавоз XP счтает несколько иначе...
eMitya wrote:
Оказывается, XP следит за устройствами, периодически записывая в порт какую-то гадость. Что, конечно, нарушало все наши протоколы взаимодействия. Сие мерзопакостное поведение XP отключается при помощи задания соответствующего параметра в реестре
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Parport\Parameters
Если нет, то нужно прописать DisableWarmPoll REG_DWORD = 1

_________________
iLavr


04 Jan 2014 11:53
Profile
God
User avatar

Joined: 13 Nov 2010 04:06
Posts: 1345
Reply with quote
Post 
А как насчёт прав на запись в порт? Винда Хрр позволит это простому пользователю? :)


04 Jan 2014 13:15
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
VituZz wrote:
А как насчёт прав на запись в порт? Винда Хрр позволит это простому пользователю? :)

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

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

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

Image

_________________
iLavr


04 Jan 2014 15:32
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
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


04 Feb 2014 11:29
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 10 posts ] 

Who is online

Users browsing this forum: No registered users and 22 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.