PBOSL PB Libraries ab 4.30 nurnoch Includes

Ankündigungen PureBasic oder die Community betreffend.
Benutzeravatar
Rings
Beiträge: 971
Registriert: 29.08.2004 08:48

Beitrag von Rings »

Stand der Dinge:

ich hab heute mal ein paar Stunden damit verbracht
die Process Lib aus dem PBOSL Paket komplett umzuschreiben.

Als Include, lauffähig ab 4.3, ansi/unicode x86 und x64,
bisher unter vista getestet.
Die Ergebnisse beim ExamineProcess() oder ExamineProcessDLL()
habe ich nun in LinkedList gelegt.Macht das bearbeiten später
einfacher.
Die Ergebnisse möchte ich allerdings erst später öffentlich
präsentieren.Denn ganz fertig bin ich noch nicht.
Ein paar gute Beispiele und bessere Kommentare sind nötig.
Sowieso bugfixing.
Wer Interesse hat und unter x64 testen kann, PM schicken. ;)

Die Process-lib war sicherlich die schwierigste .
Wie siehst mit anderen libs aus ?
Kann noch wer ausser mir unter x64 testen und evtl umschreiben ?
(siehe auch den PB-Blog http://www.purebasic.fr/blog/?m=200809 )
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Hallo Rings,

danke für Deine Arbeit! :allright:

Ich persönlich hätte nichts dagegen, wenn meine MSXML-Lib rausgeworfen
wird. Das kann man heutzutage mit dem nativen XML-Parser und / oder mit
COMate besser handhaben.

Grüße ... Kiffi
Hygge
Benutzeravatar
neotoma
Beiträge: 202
Registriert: 13.09.2004 16:16
Kontaktdaten:

Beitrag von neotoma »

ts-soft hat geschrieben:Meine RFile Lib ist OOP, als Include macht die auch keinen Sinn,die Methoden sind nicht mehr gekapselt.
Sorry, wenn es OOP ist, müsstes es doch als Include genau soviel, wenn nicht noch mehr Sinn machen..... OOP ist doch die Mutter aller Kapselungen... ;-)

Mike
Alle Rechtschreibfehler unterliegen der GPL und dürfen frei kopiert und modifiziert werden.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

neotoma hat geschrieben:Sorry, wenn es OOP ist, müsstes es doch als Include genau soviel, wenn nicht noch mehr Sinn machen..... OOP ist doch die Mutter aller Kapselungen... ;-)

Mike
Die Kapselung ist ja nur durch die Lib gegeben, in einer Include gibts keine
privaten Funktionen, keinen privaten globalen Variablenscope usw., macht also
weniger Sinn.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3857
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

Wie steht das hier mit den includes?
gibt's da auch mal downloadbare Ergebnisse ?
‮pb aktuell5.7 - windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Es sollten weiter die LIB´s geliefert werden und es sollten auch die vorherigen Versionen bereit gestellt sein.
Es ist oft ein grosser unterschied zwischen einen LIB-Code und einen Include-Code, da diese unterschiedlich behandelt werden.
Bei der "ExDatabase" liegt eine separate Include-Datei vor. Bei der kann man schon sehen wie groß der unterschied sein kann.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Rings
Beiträge: 971
Registriert: 29.08.2004 08:48

Beitrag von Rings »

mk-soft hat geschrieben:Es sollten weiter die LIB´s geliefert werden und es sollten auch die vorherigen Versionen bereit gestellt sein.
Es ist oft ein grosser unterschied zwischen einen LIB-Code und einen Include-Code, da diese unterschiedlich behandelt werden.
Bei der "ExDatabase" liegt eine separate Include-Datei vor. Bei der kann man schon sehen wie groß der unterschied sein kann.
ja ne, is klar.
Also, sicherlich wird noch alte versionen weiterhingeben.
Da aber die Mithilfe an einer Portierung nach 4.3 so in etwa
gegen NULL geht, ist das PBOSL Projekt meiner Meinung
nach gestorben, Zeitpunkt ist version 4.2
Ich selbst stelle noch ein paar geänderte includes für
4.3 zur verfügung. Nicht Befehlskompatibel zu 4.2 .
Also wer was neues macht, sollte die includes nehmen.
Alle anderen halt auf ihrem 4.2 Stand stehen bleiben.
Mir isses echt wurscht. Die Sachen die ich benötige
hab ich mir konvertiert.
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
Rings
Beiträge: 971
Registriert: 29.08.2004 08:48

Beitrag von Rings »

bobobo hat geschrieben:Wie steht das hier mit den includes?
gibt's da auch mal downloadbare Ergebnisse ?

Code: Alles auswählen

;PBOSSL Process libary 4.3  x Include
;Rework by Siegfried Rings
;Original by Siegfried Rings
;added Functions by Siegfried Rings
; -GetProcessPIDperName
;License: 

;EnableExplicit 






;We Define some Prototypes
Prototype Prototype_PBOSL_EnumProcesses(ProcessesArrayMem.i, NbProcessesMax.i, nProcesses.i) 
Prototype Prototype_PBOSL_EnumProcessModulesEx(hProcess.i, BaseModule.i, Lenghth.i, cbNeeded.l,dwFilterFlag.l)
Prototype Prototype_PBOSL_EnumProcessModules(hProcess.i, BaseModule.i, Lenghth.i, cbNeeded.l)
Prototype Prototype_PBOSL_GetProcessMemoryInfo(hProcess.i,tPMC.l, SizeOf_tPMC.l)
Prototype Prototype_PBOSL_EmptyWorkingSet(hProcess.i)

Prototype Prototype_PBOSL_GetModuleBaseName(hProcess.i, BaseModule.i, Name.i, LenName.i)
Prototype Prototype_PBOSL_GetModuleFileName(hProcess.i, BaseModule.i, Name.i, LenName.i)
Prototype Prototype_PBOSL_GetModuleInformation(hProcess.i,BaseModule.i,lpModuleInfo,dwSize )

Prototype Prototype_PBOSL_GetExtendedTcpTable(MIB_TCPTABLE , dwSize, a,b,c,d)
Prototype Prototype_PBOSL_GetExtendedUdpTable(MIB_TCPTABLE , dwSize, a,b,c,d)


Global PBOSL_Process_Library.i
Global PBOSL_EnumProcesses.Prototype_PBOSL_EnumProcesses 
Global PBOSL_EnumProcessModules.Prototype_PBOSL_EnumProcessModules
Global PBOSL_EnumProcessModulesEx.Prototype_PBOSL_EnumProcessModulesEx
Global PBOSL_GetModuleBaseName.Prototype_PBOSL_GetModuleBaseName
Global PBOSL_GetModuleFileName.Prototype_PBOSL_GetModuleFileName
Global PBOSL_GetProcessMemoryInfo.Prototype_PBOSL_GetProcessMemoryInfo
Global PBOSL_GetModuleInformation.Prototype_PBOSL_GetModuleInformation
Global PBOSL_EmptyWorkingSet.Prototype_PBOSL_EmptyWorkingSet

Global PBOSL_ProcessesArrayMem.i
Global PBOSL_ProcessesArrayModuleMem.i


Prototype Prototype_OpenThread(dwDesiredAccess.l,bInheritHandle.l,dwThreadId.l)
Global OpenThread_.Prototype_OpenThread


Global PBOSL_DriverMem.i
Global PBOSL_DLLMemModule.i
Global PBOSL_nProcessesZeiger.i

#PBOSL_NbProcessesMax=1024

Structure PROCESS_MEMORY_COUNTERS 
   cb.l 
   PageFaultCount.l 
   PeakWorkingSetSize.i 
   WorkingSetSize.i
   QuotaPeakPagedPoolUsage.i 
   QuotaPagedPoolUsage.i
   QuotaPeakNonPagedPoolUsage.i 
   QuotaNonPagedPoolUsage.i
   PageFileUsage.i
   PeakPagefileUsage.i 
EndStructure 


Structure PBOSL_ProcessesStruct
 PID.i
 Name.s
 Filename.s
 Memory.PROCESS_MEMORY_COUNTERS
EndStructure

Structure ModuleInformation ;Api definition
  lpBaseOfDll.i
  SizeOfImage.i;
  EntryPoint.i
EndStructure

Structure PBOSL_ModuleStruct
  FileName.s
  ModuleInformation.ModuleInformation
EndStructure


Structure thread32
 size.l
 use.l
 idth.l
 parentid.l
 base.l
 delta.l
 flags.l
EndStructure
#TH32CS_SNAPTHREAD=4
#THREAD_SUSPEND_RESUME=2

Procedure.s PBOSL_DebugApiError(el.l)
  Protected Nop.s
  Nop=Space(1024)
  FormatMessage_(#FORMAT_MESSAGE_FROM_SYSTEM,0, el,0,@Nop.s,1024,0)
  ProcedureReturn Hex(el)+":"+Nop.s         
EndProcedure

Procedure PBOSL_Process_Init()

CompilerSelect #PB_Compiler_OS
 CompilerCase #PB_OS_Windows
 CompilerDefault
  MessageRequester("Info","Not supported OS for PBOSL_Process_Library",0)
  End
CompilerEndSelect

 
;#PB_Compiler_Processor = #PB_Processor_x86

kernel32dll=OpenLibrary(#PB_Any,"kernel32.dll")
OpenThread_=GetFunction(kernel32dll,"OpenThread") ;Should always work !!

PBOSL_Process_Library=OpenLibrary(#PB_Any,"psapi.dll")

If PBOSL_Process_Library
 PBOSL_EnumProcesses= GetFunction(PBOSL_Process_Library, "EnumProcesses") 
 ;Debug PBOSL_EnumProcesses
 
 PBOSL_EnumProcessModules = GetFunction(PBOSL_Process_Library, "EnumProcessModules") 
 PBOSL_EnumProcessModulesEx = GetFunction(PBOSL_Process_Library, "EnumProcessModulesEx") 
 PBOSL_GetProcessMemoryInfo= GetFunction(PBOSL_Process_Library, "GetProcessMemoryInfo")
 PBOSL_GetModuleInformation=GetFunction(PBOSL_Process_Library, "GetModuleInformation")
 PBOSL_EmptyWorkingSet=GetFunction(PBOSL_Process_Library, "EmptyWorkingSet")
 ;EnumDeviceDrivers= GetProcAddress_(PSAPI, "EnumDeviceDrivers")

 If  #PB_Compiler_Unicode=0
  PBOSL_GetModuleBaseName  = GetFunction(PBOSL_Process_Library, "GetModuleBaseNameA") 
  PBOSL_GetModuleFileName  = GetFunction(PBOSL_Process_Library, "GetModuleFileNameExA")
  ;Debug PBOSL_GetModuleFileName
  ;PBOSL_GetDeviceDriversBaseName= GetProcAddress_(PSAPI, "GetDeviceDriverBaseNameA")
 ; GetDeviceDriversFileName= GetProcAddress_(PSAPI, "GetDeviceDriverFileNameA")
 Else
  ;UniCode Mode
  PBOSL_GetModuleBaseName  = GetFunction(PBOSL_Process_Library, "GetModuleBaseNameW") 
  PBOSL_GetModuleFileName  = GetFunction(PBOSL_Process_Library, "GetModuleFileNameExW")
;   GetDeviceDriversBaseName= GetProcAddress_(PSAPI, "GetDeviceDriverBaseNameW")
;   GetDeviceDriversFileName= GetProcAddress_(PSAPI, "GetDeviceDriverFileNameW")
  EndIf

;GetDeviceDriverBaseName Lib "psapi.dll" Alias "GetDeviceDriverBaseName" (ImageBase As Any, ByVal lpBaseName As String, ByVal nSize As Long ) 
;EnumDeviceDrivers Lib "PSAPI.DLL" (lpImageBase() As Long,ByVal cb As Long , lpcbNeeded As Long

 ;reserve some memory

; PBOSL_DriverMem=GlobalAlloc_(#GMEM_FIXED ,#PBOSL_NbProcessesMax*4)
; PBOSL_DLLMemModule=GlobalAlloc_(#GMEM_FIXED ,#PBOSL_NbProcessesMax*4)
 ;ProcedureReturn PSAPI
 ProcedureReturn PBOSL_Process_Library
Else
 ;Cannot load Library ???
 ProcedureReturn 0
 PBOSL_ProcessesArrayMem=GlobalAlloc_(#GMEM_FIXED ,#PBOSL_NbProcessesMax*4)
 PBOSL_DriverMem=GlobalAlloc_(#GMEM_FIXED ,#PBOSL_NbProcessesMax*4)
 PBOSL_DLLMemModule=GlobalAlloc_(#GMEM_FIXED ,#PBOSL_NbProcessesMax*4)

EndIf
EndProcedure

Procedure PBOSL_Process_End()
If PBOSL_DriverMem
 GlobalFree_(PBOSL_DriverMem)
EndIf 
If PBOSL_DLLMemModule
 GlobalFree_(PBOSL_DLLMemModule)
EndIf
If PBOSL_Process_Library
 FreeLibrary_(PBOSL_Process_Library)
EndIf
EndProcedure

Structure myTOKEN_PRIVILEGES
 PrivilegeCount.l
 TheLuid.LUID
 Attributes.l
EndStructure 

Procedure SetRights(rightsname.s)
 Define tLuid.LUID
 Define tTokenPriv.myTOKEN_PRIVILEGES
 Define tTokenPrivNew.myTOKEN_PRIVILEGES
 Define lBufferNeeded.l

 ;#PROCESS_ALL_ACCESS = $1F0FFF
 #PROCESS_TERMINAT = $1
 #ANYSIZE_ARRAY = 1
 #TOKEN_ADJUST_PRIVILEGES = $20
 #TOKEN_QUERY = $8 
 SE_DEBUG_NAME.s = rightsname.s
 #SE_PRIVILEGE_ENABLED = $2
 lhThisProc = GetCurrentProcess_()
 
 res=OpenProcessToken_(lhThisProc, #TOKEN_ADJUST_PRIVILEGES | #TOKEN_QUERY, @lhTokenHandle)
 res=LookupPrivilegeValue_("", SE_DEBUG_NAME.s, tLuid)

 ;Set the number of privileges to be change
 tTokenPriv\PrivilegeCount = 1
 tTokenPriv\TheLuid\LowPart = tLuid\LowPart
 tTokenPriv\TheLuid\HighPart = tLuid\HighPart

 tTokenPriv\Attributes = #SE_PRIVILEGE_ENABLED

 ;Enable the kill privilege in the access token of this process
 res=AdjustTokenPrivileges_(lhTokenHandle, 0, tTokenPriv, SizeOf(tTokenPrivNew), tTokenPrivNew, @lBufferNeeded)
EndProcedure


ProcedureDLL.i ExamineProcesses(List PBOSL_ProcessList.PBOSL_ProcessesStruct());take a snapshot and examine processes, fill linkedlist
 Protected nProcesses.i
 SetRights("SeDebugPrivilege")
 PBOSL_ProcessesArrayMem=GlobalAlloc_(#GMEM_FIXED ,#PBOSL_NbProcessesMax*4)
 PBOSL_ProcessesArrayModuleMem=GlobalAlloc_(#GMEM_FIXED ,#PBOSL_NbProcessesMax*4)
 
 PBOSL_EnumProcesses(PBOSL_ProcessesArrayMem, #PBOSL_NbProcessesMax, @nProcesses.i) 
 
 ClearList(PBOSL_ProcessList())
 ;Debug "Anzahl Processe ="+Str(nProcesses)
 If nProcesses/4> 0 
  nProcesses=nProcesses/4;SizeOf(Integer)
  Protected iTemp.i
  Protected *L1.LONG
  For iTemp=1 To nProcesses 
   ;now fill the LinkedList
    AddElement(PBOSL_ProcessList())
   
   
   Protected tPID.l
   tPID=PeekL(PBOSL_ProcessesArrayMem+(iTemp-1)*4)
   
   If tPID=0 
    PBOSL_ProcessList()\Name="IDLE"
    PBOSL_ProcessList()\PID=0
    
   Else
    Protected hProcess.i
    PBOSL_ProcessList()\PID=tPID
    ;SetRights("SeDebugPrivilege")
    hProcess = OpenProcess_(#PROCESS_QUERY_INFORMATION | #PROCESS_VM_READ, 0, tPID) 
    If hProcess 
     Protected Result.i
     Protected BaseModule.i
     Protected cbNeeded.i
     #LIST_MODULES_32BIT=$01 ;List the 32-bit modules.
     #LIST_MODULES_64BIT=$02 ;List the 64-bit modules.
     #LIST_MODULES_ALL=$03 ;List all modules.
     #LIST_MODULES_DEFAULT=$0 ;Use the Default behavior.
     
     ;Result=PBOSL_EnumProcessModules(hProcess, @BaseModule, 4, @cbNeeded) 
     Dim BaseModule.i(#PBOSL_NbProcessesMax)
     Result=PBOSL_EnumProcessModulesEx(hProcess, PBOSL_ProcessesArrayModuleMem, #PBOSL_NbProcessesMax*4, @cbNeeded, #LIST_MODULES_ALL) 
     ;Debug "cbNeeded="+Str(cbNeeded)
     If Result<>0
      ;Debug Str(PeekI(PBOSL_ProcessesArrayModuleMem))+"#"+Str(cbNeeded)
      Protected Name$
      Name$ = Space(255) 
      Result=PBOSL_GetModuleBaseName(hProcess, PeekI(PBOSL_ProcessesArrayModuleMem), @Name$, Len(Name$)) 
      If Name$="?"
       PBOSL_ProcessList()\Name="System"
      Else 
       PBOSL_ProcessList()\Name=Name$
      EndIf
      Name$=Space(512)
      Result=PBOSL_GetModuleFileName(hProcess, PeekI(PBOSL_ProcessesArrayModuleMem), @Name$, Len(Name$)) 
      If result=0:Debug "Error GetModuleFileName: " + PBOSL_DebugApiError(GetLastError_()) :EndIf

      PBOSL_ProcessList()\FileName=Name$
      PBOSL_ProcessList()\Memory\cb=SizeOf(PROCESS_MEMORY_COUNTERS )
      Result=PBOSL_GetProcessMemoryInfo(hProcess, PBOSL_ProcessList()\Memory, SizeOf(PROCESS_MEMORY_COUNTERS )) 
      If result=0:Debug "Error memoryInfo: " + PBOSL_DebugApiError(GetLastError_()) :EndIf

      
;       If cbNeeded/4>0 
;         cbNeeded=cbNeeded/4
;         ;Debug "Anzahl Module="+Str(cbNeeded)
;         Define I.i
;         For I=1 To cbneeded
;          Name$ = Space(255) 
;          Result=PBOSL_GetModuleFileName(hProcess, PeekI(PBOSL_ProcessesArrayModuleMem + (I-1)*4), @Name$, Len(Name$)) 
;         ; Debug "innedrin isses=" +name$
;         Next I
;       EndIf
     
     Else
      ;Debug "ResultEnumProcessModules="+Hex(result)
     EndIf    
     CloseHandle_(hProcess)
    Else
     PBOSL_ProcessList()\Name="cannot open Process"
     PBOSL_ProcessList()\FileName=""
    EndIf
   EndIf     
  Next
 EndIf
 
 If PBOSL_ProcessesArrayMem ;release memory
  GlobalFree_(PBOSL_ProcessesArrayMem)
 EndIf
 If PBOSL_ProcessesArrayModuleMem
  GlobalFree_(PBOSL_ProcessesArrayModuleMem)
 EndIf
 
 ProcedureReturn nProcesses
EndProcedure


ProcedureDLL ExamineProcessDLLS(PID,List PBOSL_ModuleList.PBOSL_ModuleStruct());Examine all DLL's of a process
 hProcess = OpenProcess_(#PROCESS_QUERY_INFORMATION | #PROCESS_VM_READ, 0, PID) 
 If hProcess 
     Protected Result.i
     Protected BaseModule.i
     Protected cbNeeded.i
     #LIST_MODULES_32BIT=$01 ;List the 32-bit modules.
     #LIST_MODULES_64BIT=$02 ;List the 64-bit modules.
     #LIST_MODULES_ALL=$03 ;List all modules.
     #LIST_MODULES_DEFAULT=$0 ;Use the Default behavior.
     
     ;ok, below Vista the Ex Function is not there
     If OSVersion()< #PB_OS_Windows_Vista
      Result=PBOSL_EnumProcessModules(hProcess, PBOSL_ProcessesArrayModuleMem, #PBOSL_NbProcessesMax*4, @cbNeeded) 
     Else 
      Result=PBOSL_EnumProcessModulesEx(hProcess, PBOSL_ProcessesArrayModuleMem, #PBOSL_NbProcessesMax*4, @cbNeeded, #LIST_MODULES_ALL) 
     EndIf
     If Result<>0
      If cbNeeded/4>0 
        ClearList( PBOSL_ModuleList())
        MyStep=SizeOf(Integer)
       
        cbNeeded=cbNeeded/MyStep
        Define I.i
        ; CompilerIf #PB_Compiler_Processor =:#PB_Processor_x86 
       
        For I=1 To cbneeded
         Name$ = Space(512) 
         
         Base.i=PeekI(PBOSL_ProcessesArrayModuleMem + (I-1)*MyStep)
         Result=PBOSL_GetModuleFileName(hProcess, Base, @Name$, Len(Name$)) 
         If result=0:Debug "Error ModuleFilename: " + PBOSL_DebugApiError(GetLastError_()) :EndIf
     
         If Trim(Name$)<>""
          AddElement(PBOSL_ModuleList())
          PBOSL_ModuleList()\FileName=Name$
          Result=PBOSL_GetModuleInformation(hProcess, Base,PBOSL_ModuleList()\ModuleInformation,SizeOf(ModuleInformation) ) 
          If result=0:Debug "Error ModuleInformation: " + PBOSL_DebugApiError(GetLastError_()) :EndIf
         EndIf 
        ; Debug "innedrin isses=" +name$
        Next I
      EndIf
     EndIf 
  CloseHandle_(hProcess) 
  ProcedureReturn cbNeeded
 EndIf
EndProcedure


ProcedureDLL ReArrangeMem(PID)
 SetRights("SeDebugPrivilege")
 hProcess = OpenProcess_(#PROCESS_ALL_ACCESS  , 0, PID) 
 If hProcess 
  PBOSL_EmptyWorkingSet(hProcess)
  SetProcessWorkingSetSize_(hProcess, -1, -1)
  CloseHandle_(hProcess) 
 EndIf
EndProcedure

ProcedureDLL RemovePagefaults(PID);remove unneded memory from Process
 hProcess = OpenProcess_(#PROCESS_ALL_ACCESS  , 0, PID) 
 If hProcess 
  Result=CallFunctionFast(EmptyWorkingSet, hProcess)
  CloseHandle_(hProcess) 
  If Result=0:Debug "Error RemovePageFaults: " + PBOSL_DebugApiError(GetLastError_()):EndIf
  ProcedureReturn Result
 Else
  ProcedureReturn -2 
 EndIf
EndProcedure

Procedure GetOwnPID()
 ProcedureReturn GetCurrentProcess_()
EndProcedure

ProcedureDLL GetProcessPIDfromHWND(hwnd);Get a PID from the window handle (hwnd)
 Result=GetWindowThreadProcessId_ (hwnd, @PID) 
 ProcedureReturn PID
EndProcedure


ProcedureDLL KillPID(PID,ExitCode);exit the process with Exitcode
  SetRights("SeDebugPrivilege")
  hProcess = OpenProcess_(#PROCESS_TERMINAT, 0, PID)
  If hProcess
    Result=TerminateProcess_(hProcess,ExitCode)
    CloseHandle_(hProcess)
    ProcedureReturn Result
  EndIf
EndProcedure

ProcedureDLL KillAllProcess(LName.s,ExitCode);exit all processes with Name with Exitcode
 SetRights("SeDebugPrivilege")
 NewList priv_ProcessList.PBOSL_ProcessesStruct()
 Protected c1.l
 Protected c2.l
 c1.l=ExamineProcesses(priv_ProcessList())
 If c1
  ForEach priv_ProcessList()
   If LCase(priv_ProcessList()\Name )=LCase(LName)
    If KillPID(priv_ProcessList()\PID,ExitCode) 
     c2+1
    EndIf 
   EndIf
  Next
 EndIf
ProcedureReturn c2
EndProcedure

ProcedureDLL PauseProcess(PID)
thread.thread32
snap = CreateToolhelp32Snapshot_(#TH32CS_SNAPTHREAD,0)
If snap
 thread\size=SizeOf(thread32)
 Thread32First_(snap,@thread)
 If thread\parentid=PID
  h=OpenThread_(#THREAD_SUSPEND_RESUME,0,thread\idth)
  SuspendThread_(h)
  CloseHandle_(h) 
 EndIf
 While Thread32Next_(snap,@thread)
  If thread\parentid=PID
   h=OpenThread_(#THREAD_SUSPEND_RESUME,0,thread\idth)
   SuspendThread_(h)
   CloseHandle_(h)
   success=1
  EndIf
 Wend
EndIf
ProcedureReturn success
EndProcedure 


ProcedureDLL ResumeProcess(PID)
thread.thread32
snap = CreateToolhelp32Snapshot_(#TH32CS_SNAPTHREAD,0)
If snap
 thread\size=SizeOf(thread32)
 Thread32First_(snap,@thread)
 If thread\parentid=PID
   h=OpenThread_(#THREAD_SUSPEND_RESUME,0,thread\idth)
   ResumeThread_(h)
   CloseHandle_(h)
 EndIf
 While Thread32Next_(snap,@thread)
  If thread\parentid=PID
   h=OpenThread_(#THREAD_SUSPEND_RESUME,0,thread\idth)
   ResumeThread_(h)
   CloseHandle_(h)
   success=1
  EndIf
 Wend
EndIf
ProcedureReturn success
EndProcedure

ProcedureDLL GetProcessPrio(PID);get the priority of the process
 hProcess.i = OpenProcess_(#PROCESS_QUERY_INFORMATION | #PROCESS_VM_READ, 0, PID) 
 If hProcess
  prio=GetPriorityClass_(hProcess) 
  CloseHandle_(hProcess) 
  ProcedureReturn prio
 EndIf
EndProcedure

ProcedureDLL SetProcessPrio(PID,Priority);sets the priority of the process
SetRights("SeIncreaseBasePriorityPrivilege")

 hProcess.i = OpenProcess_(#PROCESS_SET_INFORMATION , 1, PID) 
 If hProcess
  prio=SetPriorityClass_(hProcess,Priority)
  CloseHandle_(hProcess) 
  ProcedureReturn prio
 EndIf
EndProcedure



Structure ConnectionTable
  PID.l
  State.l
  LocalIP.s
  LocalPort.l
  RemoteIP.s
  RemotePort.l
EndStructure


#AF_INET = 2 ;IPV4
#AF_INET6 = 23 ;IPV6

#TCP_TABLE_BASIC_LISTENER = 0
#TCP_TABLE_BASIC_CONNECTIONS = 1
#TCP_TABLE_BASIC_ALL = 2
#TCP_TABLE_OWNER_PID_LISTENER = 3
#TCP_TABLE_OWNER_PID_CONNECTIONS = 4
#TCP_TABLE_OWNER_PID_ALL = 5
#TCP_TABLE_OWNER_MODULE_LISTENER = 6
#TCP_TABLE_OWNER_MODULE_CONNECTIONS = 7
#TCP_TABLE_OWNER_MODULE_ALL = 8

#UDP_TABLE_BASIC = 0
#UDP_TABLE_OWNER_PID = 1
#UDP_TABLE_OWNER_MODULE = 0


Structure MIB_TCPTABLE_OWNER_PID
  dwStats.l
  dwLocalAddr.l
  dwLocalPort.l
  dwRemoteAddr.l
  dwRemotePort.l
  dwOwningPid.l
EndStructure
 Structure MIB_TCPTABLE
  dwNumEntries.l
  table.MIB_TCPTABLE_OWNER_PID[2048]
 EndStructure
 Structure MIB_UDPTABLE_OWNER_PID
  dwLocalAddr.l
  dwLocalPort.l
  dwOwningPid.l
 EndStructure
 Structure MIB_UDPTABLE
  dwNumEntries.l
  table.MIB_UDPTABLE_OWNER_PID[2048]
 EndStructure

Procedure GetConnectionFromPID(PID,List ConnectionTable.ConnectionTable())
Protected cc.l

PBOSL_GetExtendedTcpTable.Prototype_PBOSL_GetExtendedTcpTable
PBOSL_GetExtendedUdpTable.Prototype_PBOSL_GetExtendedUdpTable
iphlpapi.i=OpenLibrary(#PB_Any, "iphlpapi.dll")
If iphlpapi
    PBOSL_GetExtendedTcpTable=GetFunction(iphlpapi,"GetExtendedTcpTable")
    PBOSL_GetExtendedUdpTable=GetFunction(iphlpapi,"GetExtendedUdpTable")

    ClearList(ConnectionTable())
    dwSize = $0
    If PBOSL_GetExtendedTcpTable(@tcpTable.MIB_TCPTABLE , @dwSize, #True,#AF_INET,#TCP_TABLE_OWNER_PID_ALL,0)   
    If PBOSL_GetExtendedTcpTable(@tcpTable.MIB_TCPTABLE , @dwSize, #True,#AF_INET,#TCP_TABLE_OWNER_PID_ALL,0) = #NO_ERROR
        For cnt = 0 To tcpTable\dwNumEntries - 1
         If tcpTable\table[cnt]\dwOwningPid=PID
            cc+1
            AddElement(ConnectionTable())
            ConnectionTable()\State=tcpTable\table[cnt]\dwStats
            ConnectionTable()\LocalIP=IPString(tcpTable\table[cnt]\dwLocalAddr)
            ConnectionTable()\LocalPort=htons_(tcpTable\table[cnt]\dwLocalPort)
            ConnectionTable()\RemoteIP=IPString(tcpTable\table[cnt]\dwRemoteAddr)
            ConnectionTable()\RemotePort=htons_(tcpTable\table[cnt]\dwRemotePort)
         EndIf
        Next
    EndIf
    EndIf
   
     dwSize = $0
     If PBOSL_GetExtendedUdpTable(@udpTable.MIB_UDPTABLE , @dwSize, #True,#AF_INET,#UDP_TABLE_OWNER_PID,0)
     If PBOSL_GetExtendedUdpTable(@udpTable.MIB_UDPTABLE , @dwSize, #True,#AF_INET,#UDP_TABLE_OWNER_PID,0) = #NO_ERROR
         For cnt = 0 To udpTable\dwNumEntries - 1
          If udpTable\table[cnt]\dwOwningPid=PID
            cc+1
            AddElement(ConnectionTable())
            ConnectionTable()\State=t-1
            ConnectionTable()\LocalIP= IPString(udpTable\table[cnt]\dwLocalAddr)
            ConnectionTable()\LocalPort=htons_(udpTable\table[cnt]\dwLocalPort)
          EndIf
         Next
    EndIf
    EndIf
;      
    CloseLibrary(iphlpapi)
EndIf
ProcedureReturn cc
EndProcedure

Procedure GetConnections(List ConnectionTable.ConnectionTable())
Protected cc.l
PBOSL_GetExtendedTcpTable.Prototype_PBOSL_GetExtendedTcpTable
PBOSL_GetExtendedUdpTable.Prototype_PBOSL_GetExtendedUdpTable
iphlpapi.i=OpenLibrary(#PB_Any, "iphlpapi.dll")
If iphlpapi
    PBOSL_GetExtendedTcpTable=GetFunction(iphlpapi,"GetExtendedTcpTable")
    PBOSL_GetExtendedUdpTable=GetFunction(iphlpapi,"GetExtendedUdpTable")

    ClearList(ConnectionTable())
    dwSize = $0
    If PBOSL_GetExtendedTcpTable(@tcpTable.MIB_TCPTABLE , @dwSize, #True,#AF_INET,#TCP_TABLE_OWNER_PID_ALL,0)   
    If PBOSL_GetExtendedTcpTable(@tcpTable.MIB_TCPTABLE , @dwSize, #True,#AF_INET,#TCP_TABLE_OWNER_PID_ALL,0) = #NO_ERROR
        For cnt = 0 To tcpTable\dwNumEntries - 1
            AddElement(ConnectionTable())
            cc+1
            ConnectionTable()\PID=tcpTable\table[cnt]\dwOwningPid
            ConnectionTable()\State=tcpTable\table[cnt]\dwStats
            ConnectionTable()\LocalIP=IPString(tcpTable\table[cnt]\dwLocalAddr)
            ConnectionTable()\LocalPort=htons_(tcpTable\table[cnt]\dwLocalPort)
            ConnectionTable()\RemoteIP=IPString(tcpTable\table[cnt]\dwRemoteAddr)
            ConnectionTable()\RemotePort=htons_(tcpTable\table[cnt]\dwRemotePort)
        Next
    EndIf
    EndIf
   
     dwSize = $0
     If PBOSL_GetExtendedUdpTable(@udpTable.MIB_UDPTABLE , @dwSize, #True,#AF_INET,#UDP_TABLE_OWNER_PID,0)
     If PBOSL_GetExtendedUdpTable(@udpTable.MIB_UDPTABLE , @dwSize, #True,#AF_INET,#UDP_TABLE_OWNER_PID,0) = #NO_ERROR
         For cnt = 0 To udpTable\dwNumEntries - 1
            cc+1
            AddElement(ConnectionTable())
            ConnectionTable()\PID=udpTable\table[cnt]\ dwOwningPid
            ConnectionTable()\State=t-1
            ConnectionTable()\LocalIP= IPString(udpTable\table[cnt]\dwLocalAddr)
            ConnectionTable()\LocalPort=htons_(udpTable\table[cnt]\dwLocalPort)
         Next
    EndIf
    EndIf
;      
    CloseLibrary(iphlpapi)
EndIf
ProcedureReturn cc
EndProcedure

ProcedureDLL pPeekL(handle,addr);get a Long from the process with Offset 
SetRights("SeDebugPrivilege")
 hProcess = OpenProcess_(#PROCESS_VM_READ, 0, handle) 
 If hProcess
  ReadProcessMemory_(hProcess,addr,@res,4,0)
  CloseHandle_(hProcess)
  ProcedureReturn res
 EndIf 
EndProcedure

ProcedureDLL.w pPeekW(handle,addr);get a word from the process with Offset
SetRights("SeDebugPrivilege")
 hProcess = OpenProcess_(#PROCESS_VM_READ, 0, handle) 
 If hProcess
  ReadProcessMemory_(hProcess,addr,@res.w,2,0)
  CloseHandle_(hProcess)
  ProcedureReturn res
 EndIf
EndProcedure

ProcedureDLL.b pPeekB(handle,addr);get a Byte from the process with Offset
SetRights("SeDebugPrivilege")
 hProcess = OpenProcess_(#PROCESS_VM_READ  , 0, handle) 
 If hProcess
  ReadProcessMemory_(hProcess,addr,@res.b,1,0)
  CloseHandle_(hProcess)
  ProcedureReturn res
 EndIf
EndProcedure

ProcedureDLL.s pPeekS(handle,addr);get a String from the process with Offset
SetRights("SeDebugPrivilege")
 hProcess = OpenProcess_(#PROCESS_VM_READ , 0, handle) 
 If hProcess
  res.s=""
  Repeat
    ReadProcessMemory_(hProcess,addr,@res2.b,1,0)
    res+Chr(res2.b & $FF)
    addr+1
  Until byte=0
  CloseHandle_(hProcess)
  ProcedureReturn res
 EndIf
EndProcedure

ProcedureDLL pReadMemory(handle,addr, DestinationMemoryID, Length);copys Data from the process with Offset to own Process Destinationmemory
SetRights("SeDebugPrivilege")
 hProcess = OpenProcess_(#PROCESS_VM_READ, 0, handle) 
 If hProcess
  ReadProcessMemory_(hProcess,addr,DestinationMemoryID,Length,0)
  CloseHandle_(hProcess)
 EndIf
EndProcedure

ProcedureDLL pPokeL(handle,addr,value);Writes a Long to the process with Offset 
 hProcess = OpenProcess_(#PROCESS_ALL_ACCESS , 0, handle) 
 If hProcess  
  OrigMode=1
  Mode=#PAGE_EXECUTE_READWRITE
  VirtualProtectEx_(hProcess,addr,4,Mode,@OrigMode)
  res=WriteProcessMemory_(hProcess,addr,@value,4,0)
  VirtualProtectEx_(hProcess,addr,4,OrigMode,@Mode)
  CloseHandle_(hProcess)
  ProcedureReturn res
 EndIf
EndProcedure

ProcedureDLL pPokeW(handle,addr,value.w);Writes a word to the process with Offset 
 hProcess = OpenProcess_(#PROCESS_ALL_ACCESS , 0, handle) 
 If hProcess
  OrigMode=1
  Mode=#PAGE_EXECUTE_READWRITE
  VirtualProtectEx_(hProcess,addr,2,Mode,@OrigMode)
  res=WriteProcessMemory_(hProcess,addr,@value,2,0)
  VirtualProtectEx_(hProcess,addr,2,OrigMode,@Mode)
  CloseHandle_(hProcess)
  ProcedureReturn res
 EndIf
EndProcedure

ProcedureDLL pPokeB(handle,addr,value.b);Writes a Byte to the process with Offset 
 hProcess = OpenProcess_(#PROCESS_ALL_ACCESS , 0, handle) 
 If hProcess
  OrigMode=1
  Mode=#PAGE_EXECUTE_READWRITE
  VirtualProtectEx_(hProcess,addr,1,Mode,@OrigMode)
  WriteProcessMemory_(hProcess,addr,@value,1,0)
  VirtualProtectEx_(hProcess,addr,1,OrigMode,@Mode)
  CloseHandle_(hProcess)
  ProcedureReturn res
 EndIf
EndProcedure

ProcedureDLL pWriteMemory(handle,addr, SourceMemoryID, Laenge) ;copys Data from Sourcememory(own process) to the process with Offset
 hProcess = OpenProcess_(#PROCESS_ALL_ACCESS , 0, handle) 
 If hProcess
  OrigMode=1
  Mode=#PAGE_EXECUTE_READWRITE
  VirtualProtectEx_(hProcess,addr,Laenge,Mode,@OrigMode)
  res=WriteProcessMemory_(hProcess,addr,SourceMemoryID,Laenge,0)
  VirtualProtectEx_(hProcess,addr,Laenge,OrigMode,@Mode)
  CloseHandle_(hProcess)
  ProcedureReturn res
 EndIf
EndProcedure


Procedure GetProcessPIDperName(Name.s,List PBOSL_ProcessList.PBOSL_ProcessesStruct())
Name2.s=LCase(Name)
ResetList(PBOSL_ProcessList())
ForEach PBOSL_ProcessList()
 Name1.s=PBOSL_ProcessList()\Name
 If LCase(Name1)=LCase(Name2)
  ProcedureReturn PBOSL_ProcessList()\PID
 EndIf
Next
EndProcedure


Enumeration
  #Window_0
  #Button_Refresh
  #Tree_0
  #Button_Kill
  #Text_process
  #Button_PauseResume
  #Button_RArrangeMem
  #Panel_0
  #Listview_IPLIST
EndEnumeration
  If OpenWindow(#Window_0, 10, 10, 600, 600, "PBOSL Process Include Example",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
      ButtonGadget(#Button_Refresh, 10, 10, 70, 30, "Refresh")
      ButtonGadget(#Button_Kill, 90, 10, 90, 30, "Kill Process")
      TextGadget(#Text_process, 10, 510, 480, 20, "Process")
      ButtonGadget(#Button_PauseResume, 190, 10, 90, 30, "Pause/Resume")
      ButtonGadget(#Button_RArrangeMem, 290, 10, 110, 30, "ReArange Memory")
      PanelGadget(#Panel_0, 0, 50, 600, 550)
       AddGadgetItem(#Panel_0, -1, "Processes")
        TreeGadget(#Tree_0, 1, 1, 580, 550)
       AddGadgetItem(#Panel_0, -1, "IP-List")
        ListViewGadget(#Listview_IPLIST, 1, 1, 580, 550)
      CloseGadgetList()
      
       
  EndIf


PBOSL_Process_INIT()
Define ProcessCount.i

NewList priv_ProcessList.PBOSL_ProcessesStruct()
NewList priv_ModuleList.PBOSL_ModuleStruct()


Filename.s="calc.exe"

;RunProgram(Filename)
;RunProgram(Filename)
;RunProgram(Filename)

Repeat ; Start of the event loop
  
  Event = WaitWindowEvent() ; This line waits until an event is received from Windows
  
  WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
  
  GadgetID = EventGadget() ; Is it a gadget event?
  
  EventType = EventType() ; The event type
  
  ;You can place code here, and use the result as parameters for the procedures
  
  If Event = #PB_Event_Gadget
    
    If GadgetID = #Button_Refresh
      ClearGadgetItems(#Tree_0) 
      Processcount=ExamineProcesses(priv_ProcessList())
      Debug "-----------------------"
      Debug "Processcount="+Str(Processcount)
      
      ForEach priv_ProcessList()
       AddGadgetItem(#Tree_0, -1, Str(priv_ProcessList()\PID) +" " + priv_ProcessList()\Name ,0,0)
       AddGadgetItem(#Tree_0, -1, "located at " + GetPathPart(priv_ProcessList()\FileName) ,0,1)
       
       AddGadgetItem(#Tree_0, -1, "Memory Usage " ,0,1)
       AddGadgetItem(#Tree_0, -1, "WorkingSetSize " + Hex(priv_ProcessList()\Memory\WorkingSetSize ) ,0,2)
       AddGadgetItem(#Tree_0, -1, "PageFaultCount " + Hex(priv_ProcessList()\Memory\PageFaultCount ) ,0,2)
       AddGadgetItem(#Tree_0, -1, "PeakWorkingSetSize " + Hex(priv_ProcessList()\Memory\PeakWorkingSetSize ) ,0,2)
       AddGadgetItem(#Tree_0, -1, "QuotaPeakPagedPoolUsage " + Hex(priv_ProcessList()\Memory\QuotaPeakPagedPoolUsage) ,0,2)
       AddGadgetItem(#Tree_0, -1, "QuotaPagedPoolUsage " + Hex(priv_ProcessList()\Memory\QuotaPagedPoolUsage ) ,0,2)
       AddGadgetItem(#Tree_0, -1, "QuotaPeakNonPagedPoolUsage " + Hex(priv_ProcessList()\Memory\QuotaPeakNonPagedPoolUsage ) ,0,2)
       AddGadgetItem(#Tree_0, -1, "QuotaNonPagedPoolUsage " + Hex(priv_ProcessList()\Memory\QuotaNonPagedPoolUsage) ,0,2)
       AddGadgetItem(#Tree_0, -1, "PageFileUsage " + Hex(priv_ProcessList()\Memory\PageFileUsage ) ,0,2)
       AddGadgetItem(#Tree_0, -1, "PeakPagefileUsage " + Hex(priv_ProcessList()\Memory\PeakPagefileUsage) ,0,2)
 
       Modules=ExamineProcessDLLs(priv_ProcessList()\PID, priv_ModuleList())
       If Modules
        AddGadgetItem(#Tree_0, -1, Str(Modules) + " Module" ,0,1)
 
        ForEach priv_ModuleList()
         AddGadgetItem(#Tree_0, -1, GetFilePart(priv_ModuleList()\FileName) ,0,2)
         AddGadgetItem(#Tree_0, -1, "located at " + GetPathPart(priv_ModuleList()\FileName) ,0,3)
         AddGadgetItem(#Tree_0, -1, "Base of Image in Memory= "+Hex(priv_ModuleList()\ModuleInformation\lpBaseOfDll) ,0,3)
         AddGadgetItem(#Tree_0, -1, "EntryPoint of Image in Memory= "+Hex(priv_ModuleList()\ModuleInformation\EntryPoint) ,0,3)
         AddGadgetItem(#Tree_0, -1, "Size of Image in Memory= "+Hex(priv_ModuleList()\ModuleInformation\SizeofImage) ,0,3)
        Next
       EndIf
      
       NewList  ConnectionTable.ConnectionTable()
       Define o.s
       If GetConnectionFromPID(priv_ProcessList()\PID,ConnectionTable())
        AddGadgetItem(#Tree_0, -1, Str(ListSize(ConnectionTable()) )+ "     CONNECTIONS" ,0,1)
        ForEach ConnectionTable()
         If ConnectionTable()\State=-1
          o.s="UDP-Connection on "+ConnectionTable()\LocalIP+" at "+Str(ConnectionTable()\Localport)
         Else
          o="TCP-Connection on "+ConnectionTable()\LocalIP+"/"+Str(ConnectionTable()\Localport)+" from "+ConnectionTable()\RemoteIP+"/"+Str(ConnectionTable()\Remoteport)
          Select ConnectionTable()\State
          Case 1
           o +" Closed"
          Case 2
           o + " Listening"
          Case 3
           o + " SYN Sent"
          Case 4
           o + " SYN Received"
          Case 5
           o + " Established"
          Case 6
           o + " Waiting For FIN"
          Case 7
           o + " Waiting For FIN"
          Case 8
           o + " Waiting For Close"
          Case 9
           o + " Closing"
          Case 10
           o + " Last ACK"
          Case 11
           o + " Time Wait"
          Case 12
           o + " TCB deleted"
          Default
           o + " unknown"
          EndSelect
        EndIf
        AddGadgetItem(#Tree_0, -1, o ,0,2)
        
      Next
     EndIf
    Next  
    
    If GetConnections(ConnectionTable())
        ClearGadgetItems(#Listview_IPLIST)
        ForEach ConnectionTable()
         If ConnectionTable()\State=-1
          o.s="UDP-Connection on "+ConnectionTable()\LocalIP+" at "+Str(ConnectionTable()\Localport)
         Else
          o="TCP-Connection on "+ConnectionTable()\LocalIP+"/"+Str(ConnectionTable()\Localport)+" from "+ConnectionTable()\RemoteIP+"/"+Str(ConnectionTable()\Remoteport)
          Select ConnectionTable()\State
          Case 1
           o +" Closed"
          Case 2
           o + " Listening"
          Case 3
           o + " SYN Sent"
          Case 4
           o + " SYN Received"
          Case 5
           o + " Established"
          Case 6
           o + " Waiting For FIN"
          Case 7
           o + " Waiting For FIN"
          Case 8
           o + " Waiting For Close"
          Case 9
           o + " Closing"
          Case 10
           o + " Last ACK"
          Case 11
           o + " Time Wait"
          Case 12
           o + " TCB deleted"
          Default
           o + " unknown"
          EndSelect
        EndIf
        AddGadgetItem(#Listview_IPLIST, -1, Str(ConnectionTable()\PID) +" : " + o )
        
      Next
     EndIf
 
 
 
    ElseIf GadgetID = #Tree_0
      
    ElseIf GadgetID = #Button_Kill
      
    ElseIf GadgetID = #Button_PauseResume
      
    ElseIf GadgetID = #Button_RArrangeMem
      
    EndIf
    
  EndIf
  
Until Event = #PB_Event_CloseWindow ; End of the event loop
PBOSL_Process_END()
End



; Debug "GetOwnPID()="+Str(GetOwnPID())
; 
; PID=GetProcessPIDperName(Filename,priv_ProcessList())
; Debug PID
; If PID
;  Rearrangemem(PID)
;  PauseProcess(PID)
;  MessageRequester("info","stopping PID " +Str(pid) ,0)
;  ResumeProcess(PID)
;  MessageRequester("info","Killing all " + filename ,0)
;  ;KillPID(PID,0)
;  Debug KillAllProcess("calc.exe",0)
; EndIf

 
Rings hat geschrieben:ziert sich nich beim zitieren
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

@Rings,

kann dich vollkommen verstehen. Hatte immer PBOSL immer so verstanden das der Source vorhanden sein sollte. Somit das man immer auch selber auch die neusten Versionen Updaten kann, beziehungsweise den Code auch selber weiter zu optimieren.
Es gibt leider nur wenige die ihre LIB´s auch pflegen.

Viele Grüsse
Michael
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3857
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

@rings danke .. :mrgreen:

Meine Anfrage bezog sich allerdings mehr auf die offizielle PBOSL-Seite ..
hier wird angekündigt (und auch gemacht) und da ? .. nix zu sehen außer
dem alten Zeug.

Wär schade um den PBOSL-Ansatz, wenn das echt den Bach runterginge.
‮pb aktuell5.7 - windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten