Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Programm bei Systemstart ausführen wie chkdsk? (https://www.delphipraxis.net/169637-programm-bei-systemstart-ausfuehren-wie-chkdsk.html)

jus 1. Aug 2012 20:43

Programm bei Systemstart ausführen wie chkdsk?
 
Hallo,

Man kann ja in Windows das Festplattentool chkdsk so einstellen, dass es gestartet wird, bevor überhaupt der Windowsanmeldeschirm kommt. Das Programm scheint auch einen Konsolentext auszugeben.
Ich frage mich wie kann man sowas machen?

Lg,
jus

Dawn87 1. Aug 2012 20:47

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Für solche Anwendungen ist Delphi nicht das Mittel der Wahl.

Du musst auf die Native Api zurückgreifen um solche Programme zu schreiben. Auch einige PE-Flags der EXE sind bei nativen Anwendungen anders gesetzt als bei normalen Windows-Anwendungen.

http://technet.microsoft.com/en-us/s.../bb897447.aspx

Möglicherweise bringt Dich hier Visual C im Zusammenhang mit dem DDK (Driver Developement Kit) weiter.

Grüße
Stefan

p80286 1. Aug 2012 21:40

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Schau doch mal hier herein.

Gruß
K-H

hathor 2. Aug 2012 08:26

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Registry - Runonce

The Runonce key allows you to run an application on the next boot. Once it runs, the Value is removed.

Location:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Curr entVersion\RunOnce

Values: Any name. Data should be the path to application you want to run.

Value Type: String

Dawn87 2. Aug 2012 08:54

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Anwendungen die im RunOnce-Schlüssel stehen werden aber auch erst ausgeführt, nachdem sich ein Benutzer bei Windows angemeldet hat.

Was jus möchte ist eine Anwendung auszuführen bevor die Windows-Oberfläche überhaupt angezeigt wird. Bei Windows XP gab es z.B. eine Konsole mit hellblauem Hintergrund. Die hat man immer dann gesehen wenn chkdsk oder ein Partitionierungsprogramm wie Partition Magic ausgeführt wurde.

Diese Programme sind anders aufgebaut als herkömmliche, da diese sich der Native Api bedienen. Da zu dem Boot-Zeitpunkt noch einiges an Funktionen nicht angesprochen werden kann, wird man auch nichts anderes benutzen können.

JamesTKirk 2. Aug 2012 08:56

AW: Programm bei Systemstart ausführen wie chkdsk?
 
@hathor: Das ist nicht das, wonach jus gefragt hat. Da ist es nämlich schon zu spät.

@jus: Gibt es einen bestimmten Grund, warum du das erfahren möchtest? Dawn87 hat hier aber in großen Teilen Recht: Anwendungen wie chkdsk sind sogennante Native NT Anwendungen, welche nicht die Windows API verwenden, sondern die darunterliegende API des Kernels (für Usermodeanwendungen bereitgestellt durch ntdll.dll). Dort ist es für einen normalen Windows Entwickler sehr ungewohnt, da sich die API doch teilweise stark unterscheidet.
Eine Anwendung, welche derart früh (nach dem Start von smss.exe und vor dem Start der Subsysteme) gestartet werden möchte, muss sich in den passenden Registry-Key eintragen und eben eine native Anwendung sein (sonst könnte es zum Bluescreen kommen ;) ).

@Dawn87: Delphi ist hier nicht geeignet, aber Free Pascal befindet sich dank mir auf gutem Weg dorthin ;)

Gruß,
Sven

jus 6. Aug 2012 00:09

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Vielen Dank für eure antworten!
Zitat:

Zitat von JamesTKirk (Beitrag 1176650)
@hathor: Das ist nicht das, wonach jus gefragt hat. Da ist es nämlich schon zu spät.

@jus: Gibt es einen bestimmten Grund, warum du das erfahren möchtest? Dawn87 hat hier aber in großen Teilen Recht: Anwendungen wie chkdsk sind sogennante Native NT Anwendungen, welche nicht die Windows API verwenden, sondern die darunterliegende API des Kernels (für Usermodeanwendungen bereitgestellt durch ntdll.dll). Dort ist es für einen normalen Windows Entwickler sehr ungewohnt, da sich die API doch teilweise stark unterscheidet.
Eine Anwendung, welche derart früh (nach dem Start von smss.exe und vor dem Start der Subsysteme) gestartet werden möchte, muss sich in den passenden Registry-Key eintragen und eben eine native Anwendung sein (sonst könnte es zum Bluescreen kommen ;) ).

@Dawn87: Delphi ist hier nicht geeignet, aber Free Pascal befindet sich dank mir auf gutem Weg dorthin ;)

Gruß,
Sven

Einen bestimmten Grund gibt es eigentlich nicht, es war einfach interessenshalber wie man sowas machen kann. Das mit native API scheint mir vom Aufwand zu sehr hoch sein. Interessant ist aber der weg mit freepascal schon.

Lg,
Jus

Medium 6. Aug 2012 00:20

AW: Programm bei Systemstart ausführen wie chkdsk?
 
FP wird da auch nicht viel dran drehen können, dass man eine völlig andere Umgebung als gewohnt vor sich hat. Ich denke mal, dass es hier eher darum geht, dass man es überhaupt in einer Pascal-Sprache bewerkstelligen kann. Der Aufwand wird am Ende wohl nahezu der selbe sein. Bei sowas merkt man immer wieder, dass Delphi (bzw. die VCL) ein evtl. doch zu weiches Kissen im Werdegang von manchem ist ;)

JamesTKirk 6. Aug 2012 10:17

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Zitat:

Zitat von Medium (Beitrag 1177003)
FP wird da auch nicht viel dran drehen können, dass man eine völlig andere Umgebung als gewohnt vor sich hat. Ich denke mal, dass es hier eher darum geht, dass man es überhaupt in einer Pascal-Sprache bewerkstelligen kann. Der Aufwand wird am Ende wohl nahezu der selbe sein. Bei sowas merkt man immer wieder, dass Delphi (bzw. die VCL) ein evtl. doch zu weiches Kissen im Werdegang von manchem ist ;)

Vergiss nicht, dass Free Pascal schon zahlreiche Plattformen erfolgreich abstrahiert hat. Unter anderem DOS, Linux, Windows, Mac OS (Classic!), Amiga und OS/2. Diese unterscheiden sich hinsichtlich ihrer API schon immens und die Native NT API ist hier in recht guter Gesellschaft, auch wenn sie zuerst einmal ungewohnt (und auch noch dazu nur spärlich dokumentiert) ist.

Mein Port bettet sich ganz brav in die Abstraktionsschicht von FPC ein und so kannst du zum Beispiel Dateiein-/ausgabe, FindFirst/-Next/-Close und so weiter ohne Probleme bereits verwenden. Die einzigen (großen) Grundfunktionen, die noch fehlen sind Threading und "Anzapfung" des Exceptionhandlings von NT (welches zum Glück von der Win32 API auch einfach nur durchgereicht wird zur NT API ;) ).

Und um den Entwicklern das Schreiben von Startupanwendungen zu erleichtern, möchte ich auch die Units CRT, Video, Keyboard, Mouse und wenn möglich auch Graphics und Sockets implementieren. Da der Native NT Port allerdings nur eines von vielen meiner Projekte ist, geht das aber nur recht gemächlich voran :roll:

Gruß,
Sven

CCRDude 6. Aug 2012 10:24

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Es gibt inzwischen ein NativeNT-Target für FPC? Das ist ja absolut genial :)

Ich erinnere mich noch, wie ich vor einigen Jahren sowas angefangen hatte, dann aber aus Bequemlichkeit doch auf C ausgewichen bin.

Ein megariesengroßes Dankeschön (und ich gehöre nicht zu den Menschen, die zu Superlativen neigen)!

JamesTKirk 6. Aug 2012 11:36

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Bitte sehr, aber beachte bitte, dass es sich noch in der Entwicklung befindet und - wie erwähnt - einige Dinge noch nicht richtig funktionieren. Auch den Kernel Mode (also Treiberentwicklung) habe ich in letzter Zeit sträflich vernachlässigt :oops:

Wenn du den Port mal austesten solltest (er ist bereits in 2.6.0 möglich, aber in 2.7.1 noch ein bisschen mehr verbessert worden), dann bin ich für (konstruktives) Feedback sehr dankbar.

Gruß,
Sven

hathor 6. Aug 2012 15:59

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Mit einem Eintrag in der Registry wird bei WIN 7 auch die Autoexec.bat abgearbeitet.

Code:
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Winlogon]
"ExcludeProfileDirs"="AppData\\Local;AppData\\LocalLow;$Recycle.Bin;AppData\\Local\\Microsoft\\Outlook"
"BuildNumber"=dword:00001db1
"FirstLogon"=dword:00000000
"ParseAutoexec"="1"
"Shell"="explorer.exe"

himitsu 6. Aug 2012 16:23

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Aber da gibt es noch weniger nutzbare WinAPI (garkeine), womit es bestimmt nicht einfacher wird, dafür Programme zu erstellen.

JamesTKirk 7. Aug 2012 11:21

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Zitat:

Zitat von himitsu (Beitrag 1177112)
Aber da gibt es noch weniger nutzbare WinAPI (garkeine), womit es bestimmt nicht einfacher wird, dafür Programme zu erstellen.

Die AutoExec.bat wird von WinLogon oder später ausgeführt (siehe Ort des Registrykeys). Zu diesem Zeitpunkt ist das Win32 Subsystem bereits voll initialisiert (WinLogon ist eine Win32 Anwendung und nutzt die Win32 API entsprechend). Dies ist anders als zum Beispiel chkdsk.exe, welches von SMSS ausgeführt wird. Zu diesem Zeitpunkt sind die Subsysteme noch nicht gestartet und demnach ist auch noch keine WinAPI verfügbar.

Gruß,
Sven

jus 7. Aug 2012 12:01

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Zitat:

Zitat von JamesTKirk (Beitrag 1177057)
Zitat:

Zitat von Medium (Beitrag 1177003)
FP wird da auch nicht viel dran drehen können, dass man eine völlig andere Umgebung als gewohnt vor sich hat. Ich denke mal, dass es hier eher darum geht, dass man es überhaupt in einer Pascal-Sprache bewerkstelligen kann. Der Aufwand wird am Ende wohl nahezu der selbe sein. Bei sowas merkt man immer wieder, dass Delphi (bzw. die VCL) ein evtl. doch zu weiches Kissen im Werdegang von manchem ist ;)

Vergiss nicht, dass Free Pascal schon zahlreiche Plattformen erfolgreich abstrahiert hat. Unter anderem DOS, Linux, Windows, Mac OS (Classic!), Amiga und OS/2. Diese unterscheiden sich hinsichtlich ihrer API schon immens und die Native NT API ist hier in recht guter Gesellschaft, auch wenn sie zuerst einmal ungewohnt (und auch noch dazu nur spärlich dokumentiert) ist.

Mein Port bettet sich ganz brav in die Abstraktionsschicht von FPC ein und so kannst du zum Beispiel Dateiein-/ausgabe, FindFirst/-Next/-Close und so weiter ohne Probleme bereits verwenden. Die einzigen (großen) Grundfunktionen, die noch fehlen sind Threading und "Anzapfung" des Exceptionhandlings von NT (welches zum Glück von der Win32 API auch einfach nur durchgereicht wird zur NT API ;) ).

Und um den Entwicklern das Schreiben von Startupanwendungen zu erleichtern, möchte ich auch die Units CRT, Video, Keyboard, Mouse und wenn möglich auch Graphics und Sockets implementieren. Da der Native NT Port allerdings nur eines von vielen meiner Projekte ist, geht das aber nur recht gemächlich voran :roll:

Gruß,
Sven

Hallo Sven
Auch vielen vielen Dank für den Port!! :thumb: Ehrlich gesagt, brenne ich schon darauf das auszuprobieren. :lol: Muß mal reinlesen, wie man den neuesten Freepascal build auf einen Windows installiert. Habe bisher nur Lazarus auf Mac laufen gehabt.
Man liest ja sogar bei MSDN das die Native API nur sehr spärlich dokumentiert ist. Wo im Netz gibt es überhaupt Doku dazu? Gibt es auch Bücher dazu? :gruebel:

Lg,
jus

JamesTKirk 7. Aug 2012 12:26

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Zitat:

Zitat von jus (Beitrag 1177194)
Hallo Sven
Auch vielen vielen Dank für den Port!! :thumb: Ehrlich gesagt, brenne ich schon darauf das auszuprobieren. :lol: Muß mal reinlesen, wie man den neuesten Freepascal build auf einen Windows installiert. Habe bisher nur Lazarus auf Mac laufen gehabt.

Eine Warnung noch vorweg: Aktuell wird nur 32-Bit Windows unterstützt. Es sollte zwar relativ leicht sein 64-Bit Windows Unterstützung hinzuzufügen, aber dazu bin ich aktuell noch nicht gekommen.

Hier eine einfache Zusammenfassung der nötigen Schritte (die funktionieren sollten, wenn nicht, gib Bescheid):
  • installier FPC 2.6.0 (wichtig: die 32-Bit Version)
  • lade dir den aktuellen Quellcode von FPC 2.7.1 herunter (SVN oder nightly snapshot von den FTP Servern)
  • geh in das Verzeichnis, in dem sich der Quellcode befindet und führe das folgende Kommando aus, um einen Win32 Compiler zu erzeugen und zu installieren (zum Beispiel nach c:\fpc\2.7.1; ich nenne das Verzeichnis einfach mal %DEIN_INSTALL_DIR%):
    Code:
    make all OS_TARGET=win32 CPU_TARGET=i386 INSTALL_PREFIX=%DEIN_INSTALL_DIR%
  • Kopiere aus dem bin/i386-win32-Verzeichnis deiner 2.6.0 Installation die fpc.cfg in das bin/i386-win32-Verzeichnis deiner 2.7.1 Installation und passe die Pfade in dieser an.
  • Nun kannst du einen NativeNT CrossCompiler erzeugen, in dem du im Quelltextverzeichnis das folgende Kommando ausführst:
    Code:
    make all OS_TARGET=nativent CPU_TARGET=i386 FPC=%DEIN_INSTALL_DIR%\bin\i386-win32\ppc386.exe
  • Installiert wird der Compiler folgendermaßen:
    Code:
    make crossinstall OS_TARGET=nativent CPU_TARGET=i386 INSTALL_PREFIX=%DEIN_INSTALL_DIR% FPC=%DEIN_INSTALL_DIR%\bin\i386-win32\ppc386.exe
  • Nun kannst du über
    Code:
    %DEIN_INSTALL_DIR%\bin\i386-win32\fpc.exe -Tnativent quellcode.pas
    für Native NT kompilieren.

Zitat:

Zitat von jus (Beitrag 1177194)
Man liest ja sogar bei MSDN das die Native API nur sehr spärlich dokumentiert ist. Wo im Netz gibt es überhaupt Doku dazu? Gibt es auch Bücher dazu? :gruebel:

Ich habe im Endeffekt drei Quellen dafür genutzt:
  • Das Buch Windows NT/2000 Native API Reference
  • Den Quellcode von ReactOS
  • (in der späteren Phase) Direkt "learning by doing", indem ich ein Programm geschrieben habe, mit dem ich im normalen Betrieb von Windows ein Native NT Programm starten kann

Gruß,
Sven

jus 7. Aug 2012 16:04

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Vielen Dank für die detaillierte Anleitung!
Ich habs bisher nicht hingekriegt, dass das läuft. Ich habe mir mit Tortoise SVN den aktuellen FPC trunk geholt.
Was ich rausgefunden habe ist, dass bei folgenden Befehl:
Code:
make all OS_TARGET=win32 CPU_TARGET=i386 INSTALL_PREFIX=%DEIN_INSTALL_DIR%
vermutlich so besser funktioniert:
Code:
make all install OS_TARGET=win32 CPU_TARGET=i386 INSTALL_PREFIX=%DEIN_INSTALL_DIR%
Doch bei dem nächsten Befehl (bei mir ist %DEIN_INSTALL_DIR%=c:\fpc\trunkbuild):
Code:
make all OS_TARGET=nativent CPU_TARGET=i386 FPC=c:\fpc\trunkbuild\bin\i386-win32\ppc386.exe
bekomme ich zum Schluß folgende Fehlermeldung:
Code:
...
[ 96%] Skipped package x11 which has been disabled for target i386-nativent
[ 97%] Skipped package xforms which has been disabled for target i386-nativent
[ 98%] Skipped package zlib which has been disabled for target i386-nativent
[ 99%] Skipped package zorba which has been disabled for target i386-nativent
make[2]: Leaving directory `C:/FPC/trunk/packages'
make[1]: Leaving directory `C:/FPC/trunk'
make utils_all FPC=C:/FPC/trunk/compiler/ppcross386.exe RELEASE=1
make[1]: Entering directory `C:/FPC/trunk'
make -C utils all
make[2]: Entering directory `C:/FPC/trunk/utils'
C:/FPC/trunk/compiler/ppcross386.exe -Tnativent -XPi386-nativent- -Xr -Ur -Xs -O
2 -n -FuC:/FPC/trunk/rtl/units/i386-nativent -FuC:/FPC/trunk/packages/paszlib -F
uC:/FPC/trunk/packages/fcl-process/units/i386-nativent -FuC:/FPC/trunk/packages/
hash/units/i386-nativent -FuC:/FPC/trunk/packages/fpmkunit -FuC:/FPC/trunk/packa
ges/fcl-base/units/i386-nativent -FE. -FUunits/i386-nativent -di386 -dRELEASE p
pdep.pp
ppdep.pp(18,6) Fatal: Can't find unit Dos used by ppdep
Fatal: Compilation aborted
make[2]: *** [ppdep.exe] Error 1
make[2]: Leaving directory `C:/FPC/trunk/utils'
make[1]: *** [utils_all] Error 2
make[1]: Leaving directory `C:/FPC/trunk'
make: *** [build-stamp.i386-nativent] Error 2

C:\FPC\trunk>_
Ich habe auch vorher die fpc.cfg alle Pfade mit c:\fpc\2.6.0 auf c:\fpc\trunkbuild angepaßt. Ich bin aktuell einbißchen am Ende mit dem Latein. :oops:

Lg,
jus

JamesTKirk 8. Aug 2012 09:55

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Zitat:

Zitat von jus (Beitrag 1177243)
Was ich rausgefunden habe ist, dass bei folgenden Befehl:
Code:
make all OS_TARGET=win32 CPU_TARGET=i386 INSTALL_PREFIX=%DEIN_INSTALL_DIR%
vermutlich so besser funktioniert:
Code:
make all install OS_TARGET=win32 CPU_TARGET=i386 INSTALL_PREFIX=%DEIN_INSTALL_DIR%

Oh, stimmt. Sorry. :oops: Das kommt davon wenn man noch zehntausend mal rumeditiert ;)

Zitat:

Zitat von jus (Beitrag 1177243)
Doch bei dem nächsten Befehl (bei mir ist %DEIN_INSTALL_DIR%=c:\fpc\trunkbuild):
Code:
make all OS_TARGET=nativent CPU_TARGET=i386 FPC=c:\fpc\trunkbuild\bin\i386-win32\ppc386.exe
bekomme ich zum Schluß folgende Fehlermeldung:
Code:
...
[ 96%] Skipped package x11 which has been disabled for target i386-nativent
[ 97%] Skipped package xforms which has been disabled for target i386-nativent
[ 98%] Skipped package zlib which has been disabled for target i386-nativent
[ 99%] Skipped package zorba which has been disabled for target i386-nativent
make[2]: Leaving directory `C:/FPC/trunk/packages'
make[1]: Leaving directory `C:/FPC/trunk'
make utils_all FPC=C:/FPC/trunk/compiler/ppcross386.exe RELEASE=1
make[1]: Entering directory `C:/FPC/trunk'
make -C utils all
make[2]: Entering directory `C:/FPC/trunk/utils'
C:/FPC/trunk/compiler/ppcross386.exe -Tnativent -XPi386-nativent- -Xr -Ur -Xs -O
2 -n -FuC:/FPC/trunk/rtl/units/i386-nativent -FuC:/FPC/trunk/packages/paszlib -F
uC:/FPC/trunk/packages/fcl-process/units/i386-nativent -FuC:/FPC/trunk/packages/
hash/units/i386-nativent -FuC:/FPC/trunk/packages/fpmkunit -FuC:/FPC/trunk/packa
ges/fcl-base/units/i386-nativent -FE. -FUunits/i386-nativent -di386 -dRELEASE p
pdep.pp
ppdep.pp(18,6) Fatal: Can't find unit Dos used by ppdep
Fatal: Compilation aborted
make[2]: *** [ppdep.exe] Error 1
make[2]: Leaving directory `C:/FPC/trunk/utils'
make[1]: *** [utils_all] Error 2
make[1]: Leaving directory `C:/FPC/trunk'
make: *** [build-stamp.i386-nativent] Error 2

C:\FPC\trunk>_

Ich hatte das doch behoben!? :shock: Ach ne... des sind ja die Utils... ich muss echt schauen, dass ich diese verdammte Unit Dos implementiere... :evil: hmmm... Probier mal bitte das Folgende innerhalb deines 2.7.1 Source Verzeichnisses:
Code:
cd rtl
make clean all install OS_TARGET=nativent CPU_TARGET=i386 FPC=%DEIN_INSTALL_DIR%\i386-win32\fpc.exe INSTALL_PREFIX=%DEIN_INSTALL_DIR%
cd ..\packages
make clean all install OS_TARGET=nativent CPU_TARGET=i386 FPC=%DEIN_INSTALL_DIR%\i386-win32\fpc.exe INSTALL_PREFIX=%DEIN_INSTALL_DIR%
Falls das "install" im RTL Verzeichnis scheitert, dann führe bitte das Folgende dort aus (notfalls per Explorer ;) ):
Code:
mkdir %DEIN_INSTALL_DIR%\units\i386-nativent
mkdir %DEIN_INSTALL_DIR%\units\i386-nativent\rtl
copy units\i386-nativent\* %DEIN_INSTALL_DIR%\units\i386-nativent
Wie gesagt: Der Native NT Port ist noch experimentell, das trifft auch noch auf die Buildsequenz zu, auch wenn sie bereits um einiges besser ist, als in 2.6.0 ;)

Gruß,
Sven

jus 8. Aug 2012 14:12

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Zitat:

Zitat von JamesTKirk (Beitrag 1177304)
Ich hatte das doch behoben!? :shock: Ach ne... des sind ja die Utils... ich muss echt schauen, dass ich diese verdammte Unit Dos implementiere... :evil: hmmm... Probier mal bitte das Folgende innerhalb deines 2.7.1 Source Verzeichnisses:
Code:
cd rtl
make clean all install OS_TARGET=nativent CPU_TARGET=i386 FPC=%DEIN_INSTALL_DIR%\i386-win32\fpc.exe INSTALL_PREFIX=%DEIN_INSTALL_DIR%
cd ..\packages
make clean all install OS_TARGET=nativent CPU_TARGET=i386 FPC=%DEIN_INSTALL_DIR%\i386-win32\fpc.exe INSTALL_PREFIX=%DEIN_INSTALL_DIR%
Falls das "install" im RTL Verzeichnis scheitert, dann führe bitte das Folgende dort aus (notfalls per Explorer ;) ):
Code:
mkdir %DEIN_INSTALL_DIR%\units\i386-nativent
mkdir %DEIN_INSTALL_DIR%\units\i386-nativent\rtl
copy units\i386-nativent\* %DEIN_INSTALL_DIR%\units\i386-nativent
Wie gesagt: Der Native NT Port ist noch experimentell, das trifft auch noch auf die Buildsequenz zu, auch wenn sie bereits um einiges besser ist, als in 2.6.0 ;)

Gruß,
Sven

Funktioniert bei mir die rtl build leider auch nicht. Wenn ich den folgenden Befehl im rtl-Verzeichnis ausführe
Code:
make clean all install OS_TARGET=nativent CPU_TARGET=i386 FPC=%DEIN_INSTALL_DIR%\bin\i386-win32\fpc.exe INSTALL_PREFIX=%DEIN_INSTALL_DIR%
so kommt folgende Fehlermeldung:
Code:
make[1]: Leaving directory `C:/FPC/source/rtl/nativent'
C:/FPC/2.6.0/bin/i386-Win32/fpcmake.exe -p -Ti386-nativent Makefile.fpc
Processing Makefile.fpc
 Writing Package.fpc
C:/FPC/2.6.0/bin/i386-Win32/ginstall.exe -m 755 -d c:\fpc\build/units/i386-nativ
ent/rtl
C:/FPC/2.6.0/bin/i386-Win32/cp.exe -fp Package.fpc c:\fpc\build/units/i386-nativ
ent/rtl
make -C nativent install
make[1]: Entering directory `C:/FPC/source/rtl/nativent'
C:/FPC/2.6.0/bin/i386-Win32/ginstall.exe -m 755 -d c:\fpc\build/units/i386-nativ
ent/rtl
C:/FPC/2.6.0/bin/i386-Win32/cp.exe -fp ../../rtl/units/i386-nativent/system.ppu
../../rtl/units/i386-nativent/uuchar.ppu ../../rtl/units/i386-nativent/objpas.pp
u ../../rtl/units/i386-nativent/iso7185.ppu ../../rtl/units/i386-nativent/buildr
tl.ppu ../../rtl/units/i386-nativent/ndk.ppu ../../rtl/units/i386-nativent/ndkut
ils.ppu ../../rtl/units/i386-nativent/ddk.ppu ../../rtl/units/i386-nativent/ctyp
es.ppu ../../rtl/units/i386-nativent/strings.ppu ../../rtl/units/i386-nativent/m
atrix.ppu ../../rtl/units/i386-nativent/rtlconsts.ppu ../../rtl/units/i386-nativ
ent/sysconst.ppu ../../rtl/units/i386-nativent/sysutils.ppu ../../rtl/units/i386
-nativent/math.ppu ../../rtl/units/i386-nativent/types.ppu ../../rtl/units/i386-
nativent/strutils.ppu ../../rtl/units/i386-nativent/dateutils.ppu ../../rtl/unit
s/i386-nativent/varutils.ppu ../../rtl/units/i386-nativent/variants.ppu ../../rt
l/units/i386-nativent/typinfo.ppu ../../rtl/units/i386-nativent/fgl.ppu ../../rt
l/units/i386-nativent/classes.ppu ../../rtl/units/i386-nativent/convutils.ppu ..
/../rtl/units/i386-nativent/stdconvs.ppu ../../rtl/units/i386-nativent/x86.ppu .
./../rtl/units/i386-nativent/cpu.ppu ../../rtl/units/i386-nativent/mmx.ppu ../..
/rtl/units/i386-nativent/charset.ppu ../../rtl/units/i386-nativent/ucomplex.ppu
../../rtl/units/i386-nativent/getopts.ppu ../../rtl/units/i386-nativent/fmtbcd.p
pu c:\fpc\build/units/i386-nativent/rtl
cp.exe: ../../rtl/units/i386-nativent/x86.ppu: No such file or directory
make[1]: *** [fpc_install] Error 1
make[1]: Leaving directory `C:/FPC/source/rtl/nativent'
make: *** [nativent_install] Error 2

C:\FPC\source\rtl>
Lg,
jus

JamesTKirk 9. Aug 2012 07:16

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Zitat:

Zitat von jus (Beitrag 1177365)
Funktioniert bei mir die rtl build leider auch nicht. Wenn ich den folgenden Befehl im rtl-Verzeichnis ausführe
Code:
make clean all install OS_TARGET=nativent CPU_TARGET=i386 FPC=%DEIN_INSTALL_DIR%\bin\i386-win32\fpc.exe INSTALL_PREFIX=%DEIN_INSTALL_DIR%
so kommt folgende Fehlermeldung:
Code:
make[1]: Leaving directory `C:/FPC/source/rtl/nativent'
C:/FPC/2.6.0/bin/i386-Win32/fpcmake.exe -p -Ti386-nativent Makefile.fpc
Processing Makefile.fpc
 Writing Package.fpc
C:/FPC/2.6.0/bin/i386-Win32/ginstall.exe -m 755 -d c:\fpc\build/units/i386-nativ
ent/rtl
C:/FPC/2.6.0/bin/i386-Win32/cp.exe -fp Package.fpc c:\fpc\build/units/i386-nativ
ent/rtl
make -C nativent install
make[1]: Entering directory `C:/FPC/source/rtl/nativent'
C:/FPC/2.6.0/bin/i386-Win32/ginstall.exe -m 755 -d c:\fpc\build/units/i386-nativ
ent/rtl
C:/FPC/2.6.0/bin/i386-Win32/cp.exe -fp ../../rtl/units/i386-nativent/system.ppu
../../rtl/units/i386-nativent/uuchar.ppu ../../rtl/units/i386-nativent/objpas.pp
u ../../rtl/units/i386-nativent/iso7185.ppu ../../rtl/units/i386-nativent/buildr
tl.ppu ../../rtl/units/i386-nativent/ndk.ppu ../../rtl/units/i386-nativent/ndkut
ils.ppu ../../rtl/units/i386-nativent/ddk.ppu ../../rtl/units/i386-nativent/ctyp
es.ppu ../../rtl/units/i386-nativent/strings.ppu ../../rtl/units/i386-nativent/m
atrix.ppu ../../rtl/units/i386-nativent/rtlconsts.ppu ../../rtl/units/i386-nativ
ent/sysconst.ppu ../../rtl/units/i386-nativent/sysutils.ppu ../../rtl/units/i386
-nativent/math.ppu ../../rtl/units/i386-nativent/types.ppu ../../rtl/units/i386-
nativent/strutils.ppu ../../rtl/units/i386-nativent/dateutils.ppu ../../rtl/unit
s/i386-nativent/varutils.ppu ../../rtl/units/i386-nativent/variants.ppu ../../rt
l/units/i386-nativent/typinfo.ppu ../../rtl/units/i386-nativent/fgl.ppu ../../rt
l/units/i386-nativent/classes.ppu ../../rtl/units/i386-nativent/convutils.ppu ..
/../rtl/units/i386-nativent/stdconvs.ppu ../../rtl/units/i386-nativent/x86.ppu .
./../rtl/units/i386-nativent/cpu.ppu ../../rtl/units/i386-nativent/mmx.ppu ../..
/rtl/units/i386-nativent/charset.ppu ../../rtl/units/i386-nativent/ucomplex.ppu
../../rtl/units/i386-nativent/getopts.ppu ../../rtl/units/i386-nativent/fmtbcd.p
pu c:\fpc\build/units/i386-nativent/rtl
cp.exe: ../../rtl/units/i386-nativent/x86.ppu: No such file or directory
make[1]: *** [fpc_install] Error 1
make[1]: Leaving directory `C:/FPC/source/rtl/nativent'
make: *** [nativent_install] Error 2

C:\FPC\source\rtl>

Wenn ich nur wüsste, warum er die x86 Unit (Unix only) mitkopieren möchte... Dann lass das "install" weg und kopier die RTL Units manuell wie oben beschrieben... (die "packages" sollten aber funktionieren ;) ).

Gruß,
Sven

jus 9. Aug 2012 12:45

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Zitat:

Zitat von JamesTKirk (Beitrag 1177433)

Wenn ich nur wüsste, warum er die x86 Unit (Unix only) mitkopieren möchte... Dann lass das "install" weg und kopier die RTL Units manuell wie oben beschrieben... (die "packages" sollten aber funktionieren ;) ).

Gruß,
Sven

Ich habe nun im rtl Verzeichnis den "install"-Parameter weggelassen spricht mit folgenden Befehl den build erzeugt:
Code:
make clean all OS_TARGET=nativent CPU_TARGET=i386 FPC=%DEIN_INSTALL_DIR%\i386-win32\fpc.exe INSTALL_PREFIX=%DEIN_INSTALL_DIR%
Und die units Dateien manuell nach "%DEIN_INSTALL_DIR%\units\i386-nativent\rtl" kopiert.
Danach habe ich folgenden Befehl im Verzeichnis "packages" erfolgreich ausgeführt:
Code:
make clean install all OS_TARGET=nativent CPU_TARGET=i386 FPC=%DEIN_INSTALL_DIR%\i386-win32\fpc.exe INSTALL_PREFIX=%DEIN_INSTALL_DIR%
Ähm.... und was wäre der nächste Schritt? :oops: Ich gebe zu, ich habe keinen Durchblick beim Build-Prozeß. :duck:

Lg,
jus

JamesTKirk 9. Aug 2012 20:34

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Jetzt solltest du im Endeffekt in der Lage sein mit dem FPC in deinem 2.7.1 Installations Verzeichnis Native NT Anwendungen zu erzeugen (wobei du dich für's erste am besten auf primitive Units ala SysUtils und Classes beschränken solltest).

Du musst FPC dabei folgendermaßen aufrufen:

Code:
%DEIN_INSTALL_DIR%\bin\i386-win32\fpc.exe -Tnativent {sonstige optionen} deinsource.pas
Zu den {sonstige optionen} kannst du einfach fpc mit "-h" aufrufen und dir die Ausgabe mal anschauen. Vor allem so Optionen wie "Unit output directory" und "Unit search dir" (falls du mal eine schnuckelige Verzeichnisstruktur anlegst) sind sehr hilfreich.

Als kleiner Tipp noch: Ich empfehle dir (für's erste) eine VM einzurichten (zum Beispiel mit ReactOS), mit der du die Programme dann ohne Gefahr für dein Produktionssystem testen kannst. Für's genaue Einrichten verweise ich dich auf die Native NT Wiki Seite, wobei du natürlich gerne hier Rückfragen stellen kannst ;) (in naher Zukunft möchte ich dann noch mein oben genanntes Tool bei FPC mit integrieren, damit man NT Anwendungen einfach von Win32 aus laufen lassen kann; das brauch ich für die Testsuite von FPC :mrgreen: )
Außerdem solltest du die Unit "ndkutils" einbinden und dann direkt nach dem Haupt-"begin" einmal "AssignDisplayString(Output, False);" aufrufen, damit du mittels Writeln auf's Display schreiben kannst (normalerweise geht das auf StdOut, aber beim ersten Programm, dass gestartet wird, ist dieses noch nicht gesetzt)

Gruß,
Sven

jus 9. Aug 2012 23:37

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Also wenn ich folgenden Befehl starte:
Code:
c:\fpc\build\bin\i386-win32\fpc.exe -Tnativent helloworld.pas
wobei das helloworld.pas genau das demo von der freepascal-wiki mit folgenden Code:
Delphi-Quellcode:
program helloworld;
 
uses
  // as WriteLn is not supported, yet, we need to
  // use the functions provided by the kernel directly
  NDK, NDKUtils;
 
var
  ntstr: TNtUnicodeString;
  interval: TLargeInteger;
begin
  ShortStrToNtStr('Hello World!'#13#10, ntstr);
  NtDisplayString(@ntstr);
  FreeMem(ntstr.buffer);
 
  // wait 3 seconds
  interval.QuadPart := - 3000 * 10000;
  NtDelayExecution(@interval);
end.
So kommt folgende Fehlermeldung :oops: :
Code:
C:\FPC>c:\fpc\build\bin\i386-win32\fpc.exe -Tnativent helloworld.pas
helloworld.pas(10,26) Error: Identifier not found "TLargeInteger"
helloworld.pas(10,26) Error: Error in type definition
helloworld.pas(17,12) Error: Illegal qualifier
helloworld.pas(18,3) Error: Wrong number of parameters specified for call to "Nt
DelayExecution"
helloworld.pas(19,4) Fatal: There were 4 errors compiling module, stopping
Fatal: Compilation aborted
Error: c:\fpc\build\bin\i386-win32\ppc386.exe returned an error exitcode

C:\FPC>
sprich irgendwas funktioniert da nicht... :cry:

lg,
jus

Luckie 10. Aug 2012 01:14

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Hm, frag mal bei Assarbad nach. Hier Olli oder so. Mit dem habe ich mal so was gemacht oder versucht zu machen. Link: http://assarbad.net/

jus 10. Aug 2012 01:15

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Zitat:

Zitat von Luckie (Beitrag 1177609)
Hm, frag mal bei Assarbad nach. Hier Olli oder so. Mit dem habe ich mal so was gemacht oder versucht zu machen. Link: http://assarbad.net/

Vielen Dank Luckie, aber ich habs hingekriegt. Yeahh... :dancer:
Vielen vielen Dank an Sven!
Ich bin wohl von falschen Erwartungen ausgegangen. Ich dachte, dass das helloworld Beispiel auf Anhieb funktionieren sollte. Damit es sich kompilieren ließ, habe ich den Source folgendermaßen verändert:
Delphi-Quellcode:
program helloworld;
 
uses
  // as WriteLn is not supported, yet, we need to
  // use the functions provided by the kernel directly
  NDK, NDKUtils;

type
 TNtUnicodeString = UNICODE_STRING;
 
   // using Int64 is an alternative (QWord might have unintended side effects)
  TLargeInteger = packed record
    case Boolean of
      True:(LowPart: LongWord;
            HighPart: LongInt);
      False:(QuadPart: Int64);
  end;
  PLargeInteger = ^TLargeInteger;

 
var
  ntstr: TNtUnicodeString;
  interval: TLargeInteger;
begin
  ShortStrToNtStr('Hello World!'#13#10, ntstr);
  NtDisplayString(@ntstr);
  FreeMem(ntstr.buffer);
 
  // wait 3 seconds
  interval.QuadPart := - 3000 * 10000;
  NtDelayExecution(FALSE,@interval);
end.
Lg,
jus

JamesTKirk 10. Aug 2012 08:53

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Zitat:

Zitat von jus (Beitrag 1177610)
Ich bin wohl von falschen Erwartungen ausgegangen. Ich dachte, dass das helloworld Beispiel auf Anhieb funktionieren sollte. Damit es sich kompilieren ließ, habe ich den Source folgendermaßen verändert:

Mea culpa! Ich muss echt mal den Wikieintrag aktualisieren... -.-

Der Typ
Delphi-Quellcode:
TLargeInteger
heißt nun wie der entsprechende C-Typ
Delphi-Quellcode:
LARGE_INTEGER
und
Delphi-Quellcode:
TNtUnicodeString
wurde ebenfalls in
Delphi-Quellcode:
UNICODE_STRING
umbenannt. Beide befinden sich in der Unit
Delphi-Quellcode:
ndk
, welche ja bereits eingebunden ist.

Das Programm sollte übrigens äquivalent zu folgendem sein:

Delphi-Quellcode:
program helloworld;

uses
  // für Sleep
  sysutils,
  // für AssignDisplayString
  ndkutils;

begin
  // damit wir einfach Writeln benutzen können
  AssignDisplayString(Output, False);
 
  // kleine Ausgabe
  Writeln('Hello World!');

  // verwendet intern NtDelayExecution
  Sleep(3000);
end.
Gruß,
Sven

jus 23. Apr 2015 02:07

AW: Programm bei Systemstart ausführen wie chkdsk?
 
Hallo Sven,

ich habe mir soeben auf einen neuen PC eine neue FPC 2.6.4 runtergeladen und es scheint, dass die nativent rtl nicht mit folgenden Befehl erstellen läßt.

Code:
make clean all OS_TARGET=nativent CPU_TARGET=i386 FPC=%DEIN_INSTALL_DIR%\i386-win32\fpc.exe INSTALL_PREFIX=%DEIN_INSTALL_DIR%
Wie ist der aktuelle Stand der Entwicklung?

Lg,
jus


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 Uhr.

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