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

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
TheCube
Beiträge: 154
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

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

Beitrag 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.
Zuletzt geändert von TheCube am 17.05.2022 21:09, insgesamt 1-mal geändert.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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 
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
TheCube
Beiträge: 154
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

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

Beitrag 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.
Benutzeravatar
TheCube
Beiträge: 154
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

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

Beitrag 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
Benutzeravatar
RAaBe
Beiträge: 79
Registriert: 07.09.2004 12:52
Wohnort: Münsterland
Kontaktdaten:

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

Beitrag 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
Benutzeravatar
TheCube
Beiträge: 154
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

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

Beitrag 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 ...
Benutzeravatar
RAaBe
Beiträge: 79
Registriert: 07.09.2004 12:52
Wohnort: Münsterland
Kontaktdaten:

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

Beitrag 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
Antworten