#Include "WIN32API.INC"
Function PBMain
Dim Ports(255) As PORT_INFO_1
EnumPorts ByVal %NULL, 1, VarPtr(Ports(0)), SizeOf(Ports(0)) * UBound(Ports(1)), pcbNeeded&, pcReturned&
For x& = 0 To pcReturned& - 1
MsgBox Ports(x&).@pName
Next x&
End Function
FUNCTION WinMain (BYVAL hCurInstance AS INTEGER, _
BYVAL hPrevInstance AS INTEGER, _
lpCmdLine AS ASCIIZ, _
BYVAL nCmdShow AS INTEGER) AS INTEGER
DIM lpCaption AS ASCIIZ * 255
DIM lpText AS ASCIIZ * 255
DIM CrLf AS STRING
DIM PortInfo AS PortInfoType PTR
DIM Address AS DWORD
CrLf = CHR$(13,10)
lpCaption = "BIOS Port Addresses"
Address = (pbv0000h * 65536) + &H0400
PortInfo = Address
lpText = "COM1: " + HEX$(@PortInfo.Com1) + CrLf _
+ "COM2: " + HEX$(@PortInfo.Com2) + CrLf _
+ "COM3: " + HEX$(@PortInfo.Com3) + CrLf _
+ "COM4: " + HEX$(@PortInfo.Com4) + CrLf _
+ "LPT1: " + HEX$(@PortInfo.Lpt1) + CrLf _
+ "LPT2: " + HEX$(@PortInfo.Lpt2) + CrLf _
+ "LPT3: " + HEX$(@PortInfo.Lpt3) + CrLf _
+ "LPT4: " + HEX$(@PortInfo.Lpt4)
MessageBox 0, lpText, lpCaption, 0
END FUNCTION
WMI кое-что тебе покажет...
Естественно код нужно переложить на VB синтаксис
Rojohn писал(а):Что такое WMI? Поиск чтоли? По поиску я что-то не нашел.
Адреса портов, в NT - только через драйвера
Rojohn писал(а):А на чём эти примеры? На VB-NET чтоли? Если так, то я в нём пока не силен...
Private Declare Function EnumPorts Lib "winspool.drv" Alias "EnumPortsA" _
(ByVal pName As String, ByVal nLevel As Long, _
lpbPorts As Any, ByVal cbBuf As Long, _
pcbNeeded As Long, pcReturned As Long) As Long
Private Declare Function lstrlenA Lib "kernel32" (lpString As Any) As Long
Private Declare Function lstrcpyA Lib "kernel32" (lpString1 As Any, lpString2 As Any) As Long
Private Const SIZEOFPORT_INFO_2 = 20
Private Type PORT_INFO_2
pPortName As Long
pMonitorName As Long
pDescription As Long
fPortType As Long
Reserved As Long
End Type
Private Enum PortTypes
PORT_TYPE_WRITE = &H1
PORT_TYPE_READ = &H2
PORT_TYPE_REDIRECTED = &H4
PORT_TYPE_NET_ATTACHED = &H8
End Enum
Private Function GetStrFromPtrA(lpszA As Long) As String
GetStrFromPtrA = String$(lstrlenA(ByVal lpszA), 0)
Call lstrcpyA(ByVal GetStrFromPtrA, ByVal lpszA)
End Function
Public Function GetPorts() As String
Dim pcbNeeded As Long, pcReturned As Long, Boucle As Integer
Dim PortI2() As PORT_INFO_2
Dim StrPortType As String, ret As String
EnumPorts vbNullString, 2, 0, 0, pcbNeeded, pcReturned
If pcbNeeded Then
ReDim PortI2((pcbNeeded / SIZEOFPORT_INFO_2))
If EnumPorts(vbNullString, 2, PortI2(0), pcbNeeded, pcbNeeded, pcReturned) Then
For Boucle = 0 To (pcReturned - 1)
With PortI2(Boucle)
StrPortType = ""
If (.fPortType And PORT_TYPE_WRITE) Then StrPortType = "write "
If (.fPortType And PORT_TYPE_READ) Then StrPortType = StrPortType & "read "
If (.fPortType And PORT_TYPE_REDIRECTED) Then StrPortType = StrPortType & "redirected "
If (.fPortType And PORT_TYPE_NET_ATTACHED) Then StrPortType = StrPortType & "network"
ret = ret & GetStrFromPtrA(.pPortName) & " (" & StrPortType & ")" & "|"
End With
Next
End If
End If
If Len(ret) > 0 Then ret = Left(ret, Len(ret) - 1)
GetPorts = ret
End Function
Вроде работает, но выдает только встроенные порты, а LPT2, установленный на мультипортовой плате на PCI не видит.
К тому же адреса вроде не выдаются, а только название порта и тип. Как выдать адрес порта?
Обращайся к драйверу мультипортовой платы, скорее всего для этого нужен соответствующий SDK от производителя "железа"
Чтобы узнать адреса, нужно обращатся к драйверу через обертку DLL, например поищи в гугле библу WinIo.DLL
А можно как-нибудь прочесть текущий LPT порт и его адрес из настроек BIOSа?
А что такое "текущий порт"?
А зачем адрес-то? Все равно, в NT из Ring3 его нельзя использовать.
Что такое Ring3? Мне адрес нужен, т.к. по нему я шлю данные в порт и читаю с него с помощью DLPortIO. Конечно не лучший способ, но сам написать драйвер общения с LPT я пока не могу
Public Declare Function DlPortReadPortUchar Lib "dlportio.dll" (ByVal Port As Long) As Byte
и
Public Declare Sub DlPortWritePortUchar Lib "dlportio.dll" (ByVal Port As Long, ByVal Value As Byte)
Public Declare Function DlPortReadPortUshort Lib "dlportio.dll" (ByVal Port As Long) As Integer
Public Declare Function DlPortReadPortUlong Lib "dlportio.dll" (ByVal Port As Long) As Long
и
Public Declare Sub DlPortWritePortUshort Lib "dlportio.dll" (ByVal Port As Long, ByVal Value As Integer)
Public Declare Sub DlPortWritePortUlong Lib "dlportio.dll" (ByVal Port As Long, ByVal Value As Long)
Сейчас этот форум просматривают: AhrefsBot и гости: 56