Seite 1 von 1

Unicode Process32First

Verfasst: 16.11.2011 21:34
von _JON_
Hallo, habe im Forum diesen Code zum ermitteln der PID von einem Prozess gefunden:

Code: Alles auswählen

Procedure GetPID(ProcessName.s)
  hSnapShot = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,#Null)

  If hSnapShot
   
    iResult = -1
    pInfo.PROCESSENTRY32
    pInfo\dwsize    = SizeOf(PROCESSENTRY32)
    bProcAvailable  = Process32First_(hSnapShot, @pInfo)
   
    While(bProcAvailable) And (Not iResult = 0)
      bProcAvailable = Process32Next_(hSnapShot, @pInfo)
      iResult = CompareMemoryString(@pInfo\szExeFile,@ProcessName,1) 
    Wend
   
    CloseHandle_(hSnapShot)
   
    ProcedureReturn pInfo\th32ProcessID
   
  EndIf
EndProcedure

Debug GetPID("explorer.exe")
Funktioniert auch unter x86 als Ansi und Unicode. Doch unter PB x64 nur als ANSi.

Hat jemand eine Idee warum Process32First_ in Unicode x64 immer 0 zurück gibt?

Re: Unicode Process32First

Verfasst: 17.11.2011 09:25
von shadow
Versuch es mal mit Process32FirstW_ mit den selben Parametern. Jedenfalls steht es so in der MSDN für den Unicode-Aufruf (http://msdn.microsoft.com/en-us/library ... 85%29.aspx).

Sorry, hab grad keinen PB-Compiler in der Nähe um es zu testen...

Re: Unicode Process32First

Verfasst: 17.11.2011 20:11
von _JON_
Danke hab das mal probiert, funktioniert leider noch nicht. ShowError gibt mir 24
Das Programm hat einen Befehl ausgegeben, aber die Befehlslänge ist falsch.

Oje, was meint er mit Befehlslänge den eigentlich ?

Code: Alles auswählen

Procedure.s ShowError () 
  error = GetLastError_ ()
  Debug error
  If error 
    *MemoryID = AllocateMemory (255)
    length = FormatMessage_ (#FORMAT_MESSAGE_FROM_SYSTEM, #Null, error, 0, *MemoryID, 255, #Null) 
    If length > 1 ; Some error messages are "" + Chr (13) + Chr (10)... stoopid M$... :( 
        e$ = PeekS (*MemoryID, length - 2) 
    Else 
        e$ = "Unknown error!" 
    EndIf 
    ;FreeMemory (0) 
    ProcedureReturn e$ 
  Else 
    ProcedureReturn "No error has occurred!" 
  EndIf 
EndProcedure 




Structure PROCESSENTRY32W
  dwSize.l
  cntUsage.l
  th32ProcessID.l
  *th32DefaultHeapID.l
  th32ModuleID.l
  cntThreads.l
  th32ParentProcessID.l
  pcPriClassBase.l
  dwFlags.l
  szExeFile.c[#MAX_PATH]
EndStructure

Prototype.l Process32FirstW(hSnapshot.l, *PROCESSENTRY32W)

Library = OpenLibrary(0,"kernel32.dll")
Global Process32FirstW.Process32FirstW = GetFunction(0,"Process32FirstW")
CloseLibrary(0) 
 

Procedure GetPID(ProcessName.s)
  hSnapShot = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,#Null)

  If hSnapShot
   
    iResult = -1
    pInfo.PROCESSENTRY32W
    pInfo\dwsize    = SizeOf(PROCESSENTRY32W)
    bProcAvailable  = Process32FirstW(hSnapShot, @pInfo)
    Debug ShowError()
    
    While(bProcAvailable) And (Not iResult = 0)
      bProcAvailable = Process32Next_(hSnapShot, @pInfo)
      iResult = CompareMemoryString(@pInfo\szExeFile,@ProcessName,1) 
    Wend
   
    CloseHandle_(hSnapShot)
   
    ProcedureReturn pInfo\th32ProcessID
   
  EndIf
EndProcedure

Debug GetPID("explorer.exe")



Re: Unicode Process32First

Verfasst: 17.11.2011 21:44
von Danilo
Probier mal mit dieser Strukture:

Code: Alles auswählen

Procedure.s ShowError ()
  error = GetLastError_ ()
  Debug error
  If error
    *MemoryID = AllocateMemory (255)
    length = FormatMessage_ (#FORMAT_MESSAGE_FROM_SYSTEM, #Null, error, 0, *MemoryID, 255, #Null)
    If length > 1 ; Some error messages are "" + Chr (13) + Chr (10)... stoopid M$... :(
        e$ = PeekS (*MemoryID, length - 2)
    Else
        e$ = "Unknown error!"
    EndIf
    ;FreeMemory (0)
    ProcedureReturn e$
  Else
    ProcedureReturn "No error has occurred!"
  EndIf
EndProcedure




Structure PROCESSENTRY32_
  dwSize.l
  cntUsage.l
  th32ProcessID.l
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    fill1.l
  CompilerEndIf
  *th32DefaultHeapID
  th32ModuleID.l
  cntThreads.l
  th32ParentProcessID.l
  pcPriClassBase.l
  dwFlags.l
  szExeFile.c[#MAX_PATH]
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    fill2.l
  CompilerEndIf
EndStructure

;Prototype.l Process32FirstW(hSnapshot.l, *PROCESSENTRY32W)

;Library = OpenLibrary(0,"kernel32.dll")
;Global Process32FirstW.Process32FirstW = GetFunction(0,"Process32FirstW")
;CloseLibrary(0)


Procedure GetPID(ProcessName.s)
  hSnapShot = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,#Null)

  If hSnapShot
   
    iResult = -1
    pInfo.PROCESSENTRY32_
    Debug SizeOf(PROCESSENTRY32_)
    pInfo\dwsize    = SizeOf(PROCESSENTRY32_)
    bProcAvailable  = Process32First_(hSnapShot, @pInfo)
    Debug ShowError()
   
    While(bProcAvailable) And (Not iResult = 0)
      bProcAvailable = Process32Next_(hSnapShot, @pInfo)
      Debug PeekS(@pInfo\szExeFile)
      iResult = CompareMemoryString(@pInfo\szExeFile,@ProcessName,1)
    Wend
   
    CloseHandle_(hSnapShot)
   
    ProcedureReturn pInfo\th32ProcessID
   
  EndIf
EndProcedure

Debug GetPID("explorer.exe")

Re: Unicode Process32First

Verfasst: 18.11.2011 00:54
von NicTheQuick
Danilo,

ist es nicht eher so, dass für die ProcessId dann einfach ein Integer hin sollte?

Code: Alles auswählen

Structure PROCESSENTRY32_
  dwSize.l
  cntUsage.l
  th32ProcessID.i
  *th32DefaultHeapID
  th32ModuleID.l
  cntThreads.l
  th32ParentProcessID.l
  pcPriClassBase.l
  dwFlags.l
  szExeFile.c[#MAX_PATH]
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    fill2.l
  CompilerEndIf
EndStructure

Re: Unicode Process32First

Verfasst: 18.11.2011 08:50
von Danilo
NicTheQuick hat geschrieben:Danilo,

ist es nicht eher so, dass für die ProcessId dann einfach ein Integer hin sollte?
Nein, das Fill1.l ist wegen dem Alignment vom nachfolgenden *th32DefaultHeapID auf x64 da.
Siehe Strukturviewer in PB x64 -> PROCESSENTRY32 -> PB_Alignment.b[4].

Auf x64 müssen Strukturen so Aligned sein:
1.) Die ganze Struktur muß so aligned sein wie der größte Typ in der Struktur. (Hier *th32DefaultHeapID, somit Align 8 )
2.) Jeder Typ innerhalb der Struktur muß laut seiner Größe aligned werden. (deshalb das Fill1 um *th32DefaultHeapID auf Align 8 zu schieben)
3.) Die ganze Struktur muß ein multiples des größten Aligns sein, also hier durch 8 teilbar sein. (deshalb das Fill2 am Ende)

Also auf x64 ein Fehler in der PB-Struktur PROCESSENTRY32.
Gemeldet im englischen Forum: WinAPI structure PROCESSENTRY32 wrong

Re: Unicode Process32First

Verfasst: 18.11.2011 20:51
von _JON_
Wow, danke Danilo funktioniert perfekt.

Und nochmal ein riesen Dank für die Erklärung der Alignment :allright: