Seite 1 von 1

Netzwerk-Info älterer Code: X32 ok, X64 Exeption [Gelöst]

Verfasst: 06.05.2022 22:25
von TheCube
Nabend zusammen,
ich habe hier einen älteren Code (hier aus dem Forum, nur um MsgRequester ergänzt) der prima unter PB5.72x32 funktioniert,
aber unter PB5.72x64 in der unten markierten Zeile ( "<== XXXX" ) folgenden Fehler macht:
[ERROR] Invalid memory access. (read error at address 18446744073709551615)

Code: Alles auswählen

Global NewList LocalNetworkClient.s()

Structure LocalNetwork_ServerInfoItem
  PlatformID.l 
  *Name 
  VersionMajor.l 
  VersionMinor.l 
  Type.l 
  *Comment
EndStructure 

Structure LocalNetwork_ServerInfo
  Item.LocalNetwork_ServerInfoItem[0]
EndStructure

Procedure ExamineLocalNetwork()
  Protected *DataBuffer.LocalNetwork_ServerInfo
  Protected *IP.Long, *HostInfo.HOSTENT 
  Protected Index.i, CurrentDataCount.l, DataCount.l, ResumeHandle.l
  ClearList(LocalNetworkClient())
  If Not NetServerEnum_(0, 101, @*DataBuffer, -1, @CurrentDataCount, @DataCount, $FFFFFFFF, 0, @ResumeHandle) 
    For Index = 1 To CurrentDataCount
      AddElement(LocalNetworkClient())
      LocalNetworkClient() = PeekS(*DataBuffer\Item[Index-1]\Name, #PB_Default, #PB_Unicode)   ; <== XXXX
    Next
    NetApiBufferFree_(*DataBuffer) 
  EndIf
  ResetList(LocalNetworkClient())
EndProcedure

Macro NextLocalNetworkClient()
  NextElement(LocalNetworkClient())
EndMacro

InitNetwork()

ExamineLocalNetwork()
While NextLocalNetworkClient()
  lnc$=lnc$+LocalNetworkClient()+#CRLF$
Wend
Debug lnc$
MessageRequester("Info local network clients", lnc$, #PB_MessageRequester_Ok | #PB_MessageRequester_Info)
Kennt jemand hier den Grund, und kann den Beispielcode auch für PBx64 lauffähig bekommen ?

------------
Und wo wir gerade so schön im Bereich "Infos über PCs im lokalen Netzwerk" sind, gleich noch eine Frage hinterher: :oops:
Ich nutze in einem meiner Programme einen Codeteil vom Author: PWS32 um Lan-PCs und deren IPs zu listen.
(Updated in thread viewtopic.php?p=343212&hilit=pws32#p343212)
DAS funktioniert auch allgemein gut (Zuhause Win7_x32 & Win10x64, div. Testrechner mit lokalem Netzwerk, usw.)
Aber: Im Firmen-(Domänen-) Netzwerk meines Arbeitgebers (BüroPC Win10x64) werden nach auffälliger Wartepause (3-4sek.) Null PCs gelistet.
In der Windows-Netzwerkumgebung sehe ich dagegen 10+ andere PCs. Auch als (fast) Administrator gestartet funktioniert es nicht.
Hat jemand hier eine Idee woran das liegen könnte ? Einiger Unterschied den ich sehe ist der Netzwerktyp "Domäne". :?

Grüße.

Re: Netzwerk-Info älterer Code: X32 ok, X64 Exeption

Verfasst: 07.05.2022 01:05
von STARGÅTE
Die Felder der Struktur müssen "aligned" werden, damit Pointer wie *Name und *Comment nicht auf einem "halben Wort" beginnen:

Code: Alles auswählen

Structure LocalNetwork_ServerInfoItem Align #PB_Structure_AlignC 
  PlatformID.l    ; wird durch Align auf 8 Byte aufgefüllt.
  *Name 
  VersionMajor.l 
  VersionMinor.l 
  Type.l          ; wird durch Align auf 8 Byte aufgefüllt.
  *Comment
EndStructure 

Re: Netzwerk-Info älterer Code: X32 ok, X64 Exeption

Verfasst: 07.05.2022 10:11
von TheCube
Oh wie peinlich, besonders weil ich bei meinem zweiten oben geschriebenen Problem genau das bei allen Strukturen
ausprobiert habe, dort allerdings ohne Änderung/Erfolg. Danke ... der Code läuft jetzt ohne Speicherzugriffsfehler. :allright:

Ich setze hier erst in ein paar Tagen auf [Gelöst] ... vielleicht hat ja noch jemand eine Idee zu Problem 2.

Re: Netzwerk-Info älterer Code: X32 ok, X64 Exeption

Verfasst: 07.05.2022 11:37
von TheCube
Hier noch der andere Code von damals, simpel per Compilerdirektive von mir x32/x64 tauglich gemacht.
Wie oben beschrieben: Läuft ansich, nur im Firmennetzwerk wird kein PC im Netzwerk gelistet.

Code: Alles auswählen

; http://www.purebasic.fr/german/archive/viewtopic.php?t=834
; Author: PWS32
; Updated in thread https://www.purebasic.fr/german/viewtopic.php?p=343212&hilit=pws32#p343212
; Added Compilerdirektive for x64

Structure SERVER_INFO_101 ; Align #PB_Structure_AlignC macht keinen Unterschied
   StructureUnion
      PlatformID.l
      _Align1.i
   EndStructureUnion
   *Name
   MajorVersion.l
   MinorVersion.l
   StructureUnion
      Type.l
      _Align2.i
   EndStructureUnion
   *Comment
EndStructure

  CompilerIf #PB_Compiler_Processor = #PB_Processor_x86   ; Sonst falsche IP oder Fehler (xxx)
    #mulfak = 4
  CompilerElse
    #mulfak = 8
  CompilerEndIf

#MAX_PREFERRED_LENGTH = -1
#SV_TYPE_ALL          = $FFFFFFFF
#NERR_SUCCESS         = 0
#ERROR_MORE_DATA      = 234
#MainWindow           = 100
#MMTB                 = 200
Global MMTextBox

Procedure Message (M.s)
  WriteMessage.s
  WriteMessage +Chr(13)+Chr(10)+M
  SetGadgetText(#MMTB,GetGadgetText(#MMTB) + WriteMessage )
  SendMessage_(MMTextBox,$00B6,0,10000)

EndProcedure

Procedure.s GetIPbyName (NameIP.s)
  TheIPAdress.s
  *Ascii = Ascii(NameIP)
  pHostinfo = gethostbyname_(*Ascii) : FreeMemory(*Ascii)
  If pHostinfo = 0
    TheIPAdress = "Unable to resolve domain name"
  Else
    CopyMemory (pHostinfo, hostinfo.HOSTENT, SizeOf(HOSTENT))
    If hostinfo\h_addrtype <> #AF_INET
      MessageRequester("Info","A non-IP address was returned",0)
    Else
      While PeekL(hostinfo\h_addr_list+AdressNumber*#mulfak)             ; (xxx)
        ipAddress = PeekL(hostinfo\h_addr_list+AdressNumber*#mulfak)     ; (xxx)
        TheIPAdress = StrU(PeekB(ipAddress),#PB_Byte)+"."+StrU(PeekB(ipAddress+1),#PB_Byte)+"."+StrU(PeekB(ipAddress+2),#PB_Byte)+"."+StrU(PeekB(ipAddress+3),#PB_Byte)
        AdressNumber+1
      Wend
    EndIf
  EndIf
  ProcedureReturn TheIPAdress
EndProcedure

Procedure GetLANList()
  IPResult.s
  se101.SERVER_INFO_101
  nStructSize = SizeOf(SERVER_INFO_101)
  RetCode = NetServerEnum_(0, 101, @bufptr, #MAX_PREFERRED_LENGTH, @dwEntriesread, @dwTotalentries, #SV_TYPE_ALL, 0, @dwResumehandle)
  If RetCode = #NERR_SUCCESS And RetCode <> #ERROR_MORE_DATA
    If InitNetwork()
      For i = 0 To dwEntriesread - 1
        CopyMemory( bufptr + (nStructSize * i),@se101, nStructSize)
        Buffer.s = PeekS(se101\Name, #PB_Default, #PB_Unicode)
        IPResult = GetIPbyName (Buffer)
        Message ("No : "+ Str(i+1) + "  " + Buffer + " --> " + IPResult)
      Next
    Else
      MessageRequester("Info","Network can't be initialized",0)
    EndIf
  Else
    MessageRequester("Info","Failed",0)
  EndIf
  NetApiBufferFree_(bufptr)
  SendMessage_(MMTextBox,$00B6,0,30)
EndProcedure


hWnd   = OpenWindow(#MainWindow, 100, 150, 300, 250, " Name > IP", #PB_Window_SystemMenu)

ButtonGadget(1, 1, 224,  WindowWidth(#MainWindow)-1,26, "Get Name and IP")
MMTextBox=StringGadget(#MMTB,  0, 2, WindowWidth(#MainWindow)-1,WindowHeight(#MainWindow)-30 ,"Name > IP by P.Spisla 2003 ",#ES_MULTILINE|#ES_AUTOVSCROLL|#WS_VSCROLL|#PB_String_ReadOnly)
Message("--------------------------------------------")

Repeat
  Select WaitWindowEvent()
  Case #PB_Event_Gadget
    Select EventGadget()
    Case 1
      Message ("Examine the Network, please wait !")
      GetLANList()
      Message ("End of List")
    EndSelect
  Case #PB_Event_CloseWindow
    End
  EndSelect
ForEver

Re: Netzwerk-Info älterer Code: X32 ok, X64 Exeption

Verfasst: 10.05.2022 14:45
von RAaBe
Hallo, der Code funktioniert soweit. Was mich wundert, es werden nur 4 von 30 IP-Adressen aufgelistet.
Der Router, der eigene Rechner und 2 * NAS!
Sollten da denn nicht theoretisch alle aufgelistet werden?

Reinhard

Re: Netzwerk-Info älterer Code: X32 ok, X64 Exeption

Verfasst: 10.05.2022 22:39
von TheCube
Eigentich sollten alle PCs etc. - die auch in der Windows-Netzwerkumgebung zu sehen sind - gelistet werden.
So habe ich es zumindest in meiner alten Firma gehabt, da waren dann locker 30 PCs gelistet.
Probiers mal sicherheitshalber mit PBx32, denn dieses hemdsärmelige Compilerif-Konstrukt für x64 war von mir,
zuhause mit nur zwei PCs war es aber immerhin ok.

Nachtrag zum Problem in meinem jetzigen Firmennetzwerk:

Code: Alles auswählen

Procedure GetLANList()
  IPResult.s
  se101.SERVER_INFO_101
  nStructSize = SizeOf(SERVER_INFO_101)
  RetCode = NetServerEnum_(0, 101, @bufptr, #MAX_PREFERRED_LENGTH, @dwEntriesread, @dwTotalentries, #SV_TYPE_ALL, 0, @dwResumehandle)
  If RetCode = #NERR_SUCCESS And RetCode <> #ERROR_MORE_DATA            ; XXXXXXXXXXX
    If InitNetwork()
      For i = 0 To dwEntriesread - 1
        CopyMemory( bufptr + (nStructSize * i),@se101, nStructSize)
        Buffer.s = PeekS(se101\Name, #PB_Default, #PB_Unicode)
        IPResult = GetIPbyName (Buffer)
        Message ("No : "+ Str(i+1) + "  " + Buffer + " --> " + IPResult)
      Next
    Else
      MessageRequester("Info","Network can't be initialized",0)
    EndIf
  Else
    MessageRequester("Info","Failed",0)					; <- XXXXXXXXXXX
  EndIf
  NetApiBufferFree_(bufptr)
  SendMessage_(MMTextBox,$00B6,0,30)
EndProcedure
Habe mal die Stelle markiert (XXXXXXX) die scheinbar im Domänennetzwerk IMMER scheitert.
Vielleicht fällt jemandem ja doch noch eine Erklärung für das Verhalten ein ...

Re: Netzwerk-Info älterer Code: X32 ok, X64 Exeption

Verfasst: 11.05.2022 08:25
von RAaBe
Danke 'TheCube' für die Rückmeldung.

Leider bleibt es bei den 4 Geräten im Netzwerk, egal in welcher Konstellation ich es probiere.

Reinhard