Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi 32bit Service auf 64bit Platform (https://www.delphipraxis.net/155436-32bit-service-auf-64bit-platform.html)

Klaus01 23. Okt 2010 13:49


32bit Service auf 64bit Platform
 
Hallo,

ist das prinzipiel möglich?
Sind Probleme zu erwarten - auf was muss ich besonders achten?
Würde den Service mit TService aufbauen wollen.

Ich frage weil das Zielsystem Windows2008 64bit ist,
ich aber kein 64bit System zum Testen habe.

Grüße
Klaus

Bummi 23. Okt 2010 14:00

AW: 32bit Service auf 64bit Platform
 
Ich hatte mit meinen Diensten bisher weder unter Vista, Windows7 oder Server 2008 (R2) Probleme.
Unter XP 64 habe ich keine Erfahrungen.

Dezipaitor 23. Okt 2010 15:33

AW: 32bit Service auf 64bit Platform
 
Dienste sind normale Programme und 32bit Dienste werden daher auch mit WOW64 ausgeführt, wie jedes normale 32bit Programm.

Bernhard Geyer 23. Okt 2010 17:34

AW: 32bit Service auf 64bit Platform
 
Wenn du nichts falsch machst (Hard Codierte Verzeichnisangaben, ...) dann läuft dein Code problemlos

Klaus01 23. Okt 2010 17:52

AW: 32bit Service auf 64bit Platform
 
Hallo,

danke für die Antworten, dann kann ich es ja angehen.

Grüße
Klaus

Assarbad 23. Okt 2010 20:33

AW: 32bit Service auf 64bit Platform
 
Zitat:

Zitat von Bummi (Beitrag 1057335)
Unter XP 64 habe ich keine Erfahrungen.

XP x64 basiert auf Windows 2003 und hat damit auch keine Probleme.

Delphi-Laie 23. Okt 2010 22:05

AW: 32bit Service auf 64bit Platform
 
Ich bestreite die Ausführungen der Vorredner nicht, habe allerdings bei etwas solch simplem wie dem Modulschnappschuß bereits negative Erfahrungen gesammelt: Bei dem nützten auch Administratorrechte eines 32-Bit-Programmes unter Windows (7) 64 Bit (vermutlich auch bei anderen 64-Bit-Windows) nicht, um vollständige Informationen (d.h., über jeden Prozeß, auch die Systemprozesse) einlesen zu können. Mithin griff ich zu Lazarus, dessen 64-Bit-Compilat die gewünschten Funktionen bot.

Zitat:

Zitat von Klaus01 (Beitrag 1057334)
Ich frage weil das Zielsystem Windows2008 64bit ist,
ich aber kein 64bit System zum Testen habe.

Alternativ könnte man das Programm zunächst unter 32-Bit-Lazarus entwickeln und dann - für denjenigen, dem die 64 Bit zur Verfügung stehen - auf 64 Bit portieren. Mit ein wenig Glück klappt das sogar ohne jede Änderung (so war es bei mir bereits bei 2 Projekten). Zugegeben: Lazarus ist aus der Delphi-Perspektive (noch?) kein Hochgenuß, aber was nicht ist, kann (und wird?) ja noch werden, und letztlich ist das Ergebnis das Wichtigste, dem sich der Weg dorthin unterordnen sollte.

Assarbad 23. Okt 2010 22:44

AW: 32bit Service auf 64bit Platform
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1057458)
Ich bestreite die Ausführungen der Vorredner nicht, habe allerdings bei etwas solch simplem wie dem Modulschnappschuß bereits negative Erfahrungen gesammelt: Bei dem nützten auch Administratorrechte eines 32-Bit-Programmes unter Windows (7) 64 Bit (vermutlich auch bei anderen 64-Bit-Windows) nicht, um vollständige Informationen (d.h., über jeden Prozeß, auch die Systemprozesse) einlesen zu können.

Und was meinst du mit "Systemprozessen"?

Delphi-Laie 24. Okt 2010 13:36

AW: 32bit Service auf 64bit Platform
 
Zitat:

Zitat von Assarbad (Beitrag 1057468)
Zitat:

Zitat von Delphi-Laie (Beitrag 1057458)
Ich bestreite die Ausführungen der Vorredner nicht, habe allerdings bei etwas solch simplem wie dem Modulschnappschuß bereits negative Erfahrungen gesammelt: Bei dem nützten auch Administratorrechte eines 32-Bit-Programmes unter Windows (7) 64 Bit (vermutlich auch bei anderen 64-Bit-Windows) nicht, um vollständige Informationen (d.h., über jeden Prozeß, auch die Systemprozesse) einlesen zu können.

Und was meinst du mit "Systemprozessen"?

Die, die z.B. beim Modulschnappschuß nur dann ein konsistentes (= anzahlig größer als Null) Ergebnis zurückliefern, wenn das Programm zuvor erfolgreich Exklusivrechte ("Privilegien") anforderte. Es sind dies von der Prozeß-ID her die niedrigen Prozesse, sie reichen bei mir namentlich von "System" bis "svchost", während die anderen Prozesse ab "explorer.exe" (in Richtung steigender Prozeß-IDs) auch ohne solche Privileganforderung solche Informationen preisgeben. Desweiteren benötigt man auch diese maximalen bzw. exklusiven Privilegien, um solche Prozesse mit niedrigen IDs "abzuschießen".

Irgendetwas muß an diesen Prozessen anders sein (Ring 0?); ich nenne sie, wohl nicht ganz korrekt, Systemprozesse.

Assarbad 24. Okt 2010 15:05

AW: 32bit Service auf 64bit Platform
 
Alles klar ;)

Zitat:

Zitat von Delphi-Laie (Beitrag 1057544)
Die, die z.B. beim Modulschnappschuß nur dann ein konsistentes (= anzahlig größer als Null) Ergebnis zurückliefern, wenn das Programm zuvor erfolgreich Exklusivrechte ("Privilegien") anforderte. Es sind dies von der Prozeß-ID her die niedrigen Prozesse, sie reichen bei mir namentlich von "System" bis "svchost", während die anderen Prozesse ab "explorer.exe" (in Richtung steigender Prozeß-IDs) auch ohne solche Privileganforderung solche Informationen preisgibt. Desweiteren benötigt man auch diese maximalen bzw. exklusiven Privilegien, um solche Prozesse mit niedrigen IDs "abzuschießen".

Dienste abzuschießen ist ohnehin eine schlechte Idee, es sei denn alles andere schlägt fehl. Zuerst sollte man "net stop" (API-Funktion ControlService) benutzen. Früher konnte man bspw. auch winlogon.exe abschießen, da aber der Session-Manager (smss.exe) ein Handle auf diesen Prozeß hielt, kassierte man dafür innerhalb von Sekunden einen BSOD.

"System" ist kein Prozeß und kann auch nicht abgeschossen werden. Genau wie der "Leerlaufprozeß" (aka "Idle process"), der ebenfalls nur ein Pseudo-Prozeß ist. "System" repäsentiert in gewisser Weise den NT-Kernel und die darin geladenen Treiber. Hat einfach was mit dem Scheduling zu tun.

Zitat:

Zitat von Delphi-Laie (Beitrag 1057544)
Irgendetwas muß an diesen Prozessen anders sein (Ring 0?); ich nenne sie, wohl nicht ganz korrekt, Systemprozesse.

Sie laufen in der Service-Session (üblicherweise 0), welche ab Windows Vista strenger vom Rest des Systems abgetrennt ist. Außerdem laufen sie oft unter anderen Benutzerkonten.

Nachtrag: mit Ring 0, aka Kernelmodus, hat das nicht viel zu tun. Üblicherweise hat fast jeder Thread (außer reine Kernelthreads) etwas sowohl in Ring 0 als auch in Ring 3 zu erledigen. Und da Prozesse im Grunde nur Threads "gruppieren", ist die Aussage auf Prozesse insoweit anwendbar. Es gibt aber auch gewisse Ausnahmen wo die Grenze (insbesondere beim Start) verschwimmt, bspw. smss.exe

Delphi-Laie 24. Okt 2010 15:41

AW: 32bit Service auf 64bit Platform
 
Für diese ausführliche und m.E. auch plausible Antwortmühe gibt es von mir ganz einfach nur ein dickes Dankeschön!

Delphi-Laie 23. Dez 2010 11:54

AW: 32bit Service auf 64bit Platform
 
Hallo Assarbad, entschuldige bitte, daß ich diese angestaubte Diskussion noch einmal aufwärme!

Zitat:

Zitat von Assarbad (Beitrag 1057551)
Zitat:

Zitat von Delphi-Laie (Beitrag 1057544)
Irgendetwas muß an diesen Prozessen anders sein (Ring 0?); ich nenne sie, wohl nicht ganz korrekt, Systemprozesse.

Sie laufen in der Service-Session (üblicherweise 0), welche ab Windows Vista strenger vom Rest des Systems abgetrennt ist. Außerdem laufen sie oft unter anderen Benutzerkonten.

Mir ist etwas erstaunliches aufgefallen: Um in Windows 7 64 Bit (vermutlich auch in anderen 64-Bit-Windows) Prozesse und Threads zu beenden oder deren Priorität zu verändern, benötige ich 64-Bit-Compilate (wofür, wenn man bei Pascal bleibt, z.Z. nur FPC bzw. Lazarus verfügbar sind). Doch jüngst nahm ich zu meiner Verblüffung wahr, daß der Proceßexplorer der Sysinternals, es ist ja ein 32-Bit-Programm, auch unter 64 Bit volle "Schlagkraft" besitzt. Meine einzige Erklärung: Es gibt Codeteile, die 64-Bit besitzen (über bedingte Compilierung in irgendeinem C/C++-Compiler? Ich vermute, daß die Sysinternals damit compiliert wurden).

Oder weißt Du auch hier genaueres?

Gruß

Delphi-Laie

Dezipaitor 23. Dez 2010 12:27

AW: 32bit Service auf 64bit Platform
 
Meist ist es so, dass der Programmierer etwas falsch macht, wenn da was nicht zu gehen scheint. Aber vllt. zeigst du mal, wie du es programmiert hast?

Der ProcessExplorer kommt als 32bit EXE auf die Platte, besitzt aber in der Ressource weitere Dateien, wie einen Treiber und eine 64bit Version, die dann mehr oder weniger transparent gestartet wird. Im ProcExp sieht man selbst, dass da zwei Prozesse gestartet werden und der letzte procexp64.exe heißt.

Delphi-Laie 23. Dez 2010 12:38

AW: 32bit Service auf 64bit Platform
 
Zitat:

Zitat von Dezipaitor (Beitrag 1070147)
Meist ist es so, dass der Programmierer etwas falsch macht, wenn da was nicht zu gehen scheint. Aber vllt. zeigst du mal, wie du es programmiert hast?

Der ProcessExplorer kommt als 32bit EXE auf die Platte, besitzt aber in der Ressource weitere Dateien, wie einen Treiber und eine 64bit Version, die dann mehr oder weniger transparent gestartet wird. Im ProcExp sieht man selbst, dass da zwei Prozesse gestartet werden und der letzte procexp64.exe heißt.

Danke, Dezipiator/Christian!

Ob ich etwas falsch mache? Nun, unter 32 Bit funktioniert alles tadellos, und zwar mit meinem Programm mit dem billigen Namen "Prozesse" (auch hier im Forum zu finden). Aber wenn beim Prozeßexplorer zusätzlich etwas "64-bittiges" gestartet wird, dann ist mir die Ursache schon klar. Ich werde es mal genauer recherchieren, was unter 64 Bit alles im Speicher auftaucht.

Gruß

Delphi-Laie

Assarbad 23. Dez 2010 23:13

AW: 32bit Service auf 64bit Platform
 
Mit vollen Rechten solltest du auch in der Lage sein 64bittige Prozesse abzuschießen. Allerdings wenn deine Methode des Abschusses ist, Code zu injizieren wird es nix, solange du eine DLL benutzt. Dann brauchst du mindestens eine 64bittige DLL.

Ansonsten hat Christian völlig recht. Der ProcExp benutzt mehrere EXE-Dateien (und SYS-Dateien) welche extrahiert werden. BinResTo, meine Funktion von vor ein paar Jahren bildet das nach, aber es gibt auch andere Varianten welche VCL-Klassen benutzen.

Delphi-Laie 24. Dez 2010 09:53

AW: 32bit Service auf 64bit Platform
 
Zitat:

Zitat von Dezipaitor (Beitrag 1070147)
Der ProcessExplorer kommt als 32bit EXE auf die Platte, besitzt aber in der Ressource weitere Dateien, wie einen Treiber und eine 64bit Version, die dann mehr oder weniger transparent gestartet wird. Im ProcExp sieht man selbst, dass da zwei Prozesse gestartet werden und der letzte procexp64.exe heißt.

Hallo Dezipaitor, leider sehe ich in keinem Prozeßanzeiger (Taskmanager, Prozeßexplorer, mein Programm „Prozesse“) einen 64-Bit-Ableger des Prozeßexplorers (unter Windows 7 64 Bit).


Hallo Assarbad, auch Dir vielen Dank!

Zitat:

Zitat von Assarbad (Beitrag 1070252)
Mit vollen Rechten solltest du auch in der Lage sein 64bittige Prozesse abzuschießen.

Volle Rechte verpasse ich dafür unter Windows 7 auch meinem Programm „Prozesse“ (32 Bit), so einfach ist es also nicht. Dennoch benötige ich eine 64-Bit-Version, um auch an die „Systemprozesse“ (wurde von Dir weiter oben korrekter spezifiziert) heranzukommen, deshalb meine Portierung zu Lazarus.

Zitat:

Zitat von Assarbad (Beitrag 1070252)
Allerdings wenn deine Methode des Abschusses ist, Code zu injizieren wird es nix, solange du eine DLL benutzt. Dann brauchst du mindestens eine 64bittige DLL.

Nein, das ist mir viel zu kompliziert (bin froh, daß ich die DLL-Injektion per Hook in einem anderen Programm hinbekam). Es sind einfache TerminateProcess, TerminateThread, SetPriorityClass und SetThreadPriority.

Zitat:

Zitat von Assarbad (Beitrag 1070252)
Der ProcExp benutzt mehrere EXE-Dateien (und SYS-Dateien) welche extrahiert werden. BinResTo, meine Funktion von vor ein paar Jahren bildet das nach, aber es gibt auch andere Varianten welche VCL-Klassen benutzen.

Dann kann er diese aber geschickt verstecken, denn, wie schon gesagt, es taucht nur eine Exe-Datei in den Prozeßlisten auf.

Schöne Weihnachten!

Edit: Kommando zurück. Nach dem Start des Prozeßexplorers (32 Bit) unter 64 Bit gebiert dieser anscheinend ein 64-Bit-Pendant, legt es auf der Platte ab und startet dieses.

Assarbad 24. Dez 2010 20:26

AW: 32bit Service auf 64bit Platform
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Delphi-Laie (Beitrag 1070286)
Hallo Dezipaitor, leider sehe ich in keinem Prozeßanzeiger (Taskmanager, Prozeßexplorer, mein Programm „Prozesse“) einen 64-Bit-Ableger des Prozeßexplorers (unter Windows 7 64 Bit).

Das kann eigentlich nur an mangelnden Rechten liegen. Siehe angehangenes Bild.

Zitat:

Zitat von Delphi-Laie (Beitrag 1070286)
Volle Rechte verpasse ich dafür unter Windows 7 auch meinem Programm „Prozesse“ (32 Bit), so einfach ist es also nicht. Dennoch benötige ich eine 64-Bit-Version, um auch an die „Systemprozesse“ (wurde von Dir weiter oben korrekter spezifiziert) heranzukommen, deshalb meine Portierung zu Lazarus.

Aktivierst du bspw. auch das Debug-Privileg?

Zitat:

Zitat von Delphi-Laie (Beitrag 1070286)
Dann kann er diese aber geschickt verstecken, denn, wie schon gesagt, es taucht nur eine Exe-Datei in den Prozeßlisten auf.

Wie gesagt, entweder ist es eine uralte oder brandneue Version die sich da anders verhält, oder irgendwas anderes stimmt nicht.

Zitat:

Zitat von Delphi-Laie (Beitrag 1070286)
Edit: Kommando zurück. Nach dem Start des Prozeßexplorers (32 Bit) unter 64 Bit gebiert dieser anscheinend ein 64-Bit-Pendant, legt es auf der Platte ab und startet dieses.

Eben. Siehe Anhang :zwinker:


Frohes Fest.

Delphi-Laie 24. Dez 2010 22:14

AW: 32bit Service auf 64bit Platform
 
Zitat:

Zitat von Assarbad (Beitrag 1070370)
Zitat:

Zitat von Delphi-Laie (Beitrag 1070286)
Hallo Dezipaitor, leider sehe ich in keinem Prozeßanzeiger (Taskmanager, Prozeßexplorer, mein Programm „Prozesse“) einen 64-Bit-Ableger des Prozeßexplorers (unter Windows 7 64 Bit).

Das kann eigentlich nur an mangelnden Rechten liegen. Siehe angehangenes Bild.

Jetzt klappt es auf einmal auf wundersame Weise bei mir auch mit dem Starten des untergeordneten Prozesses im Speicher. Die untergeordnete Exe-Datei wird (nur) dann gelöscht, wenn man den Prozeßexplorer korrekt beendet, also nicht abschießt. Ich schoß ihn wohl ab, und so wunderte ich mich, eine 64-Bit-Datei auf dem Datenträger zu haben.

Zitat:

Zitat von Assarbad (Beitrag 1070370)
Zitat:

Zitat von Delphi-Laie (Beitrag 1070286)
Volle Rechte verpasse ich dafür unter Windows 7 auch meinem Programm „Prozesse“ (32 Bit), so einfach ist es also nicht. Dennoch benötige ich eine 64-Bit-Version, um auch an die „Systemprozesse“ (wurde von Dir weiter oben korrekter spezifiziert) heranzukommen, deshalb meine Portierung zu Lazarus.

Aktivierst du bspw. auch das Debug-Privileg?

Ja!

Zitat:

Zitat von Assarbad (Beitrag 1070370)
Zitat:

Zitat von Delphi-Laie (Beitrag 1070286)
Dann kann er diese aber geschickt verstecken, denn, wie schon gesagt, es taucht nur eine Exe-Datei in den Prozeßlisten auf.

Wie gesagt, entweder ist es eine uralte oder brandneue Version die sich da anders verhält, oder irgendwas anderes stimmt nicht.

Nagelneu, nämlich die 14.01-Version. Davor zwei 11er- und noch eine 10er-Version.

Ich war eben nur irritiert, weil es schien, daß ein 32-Bit-Programm maximale bzw. maximal mögliche Rechte unter 64 Bit hatte. Dem ist wohl doch nicht so. Ich bin beruhigt.

Zitat:

Zitat von Assarbad (Beitrag 1070370)
Frohes Fest.

Danke, gleichfalls!


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz