![]() |
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 |
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. ![]() Möglicherweise bringt Dich hier Visual C im Zusammenhang mit dem DDK (Driver Developement Kit) weiter. Grüße Stefan |
AW: Programm bei Systemstart ausführen wie chkdsk?
|
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 |
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. |
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 ![]() Gruß, Sven |
AW: Programm bei Systemstart ausführen wie chkdsk?
Vielen Dank für eure antworten!
Zitat:
Lg, Jus |
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 ;)
|
AW: Programm bei Systemstart ausführen wie chkdsk?
Zitat:
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 |
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)! |
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 |
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" |
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.
|
AW: Programm bei Systemstart ausführen wie chkdsk?
Zitat:
Gruß, Sven |
AW: Programm bei Systemstart ausführen wie chkdsk?
Zitat:
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 |
AW: Programm bei Systemstart ausführen wie chkdsk?
Zitat:
Hier eine einfache Zusammenfassung der nötigen Schritte (die funktionieren sollten, wenn nicht, gib Bescheid):
Zitat:
Gruß, Sven |
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:
vermutlich so besser funktioniert:
make all OS_TARGET=win32 CPU_TARGET=i386 INSTALL_PREFIX=%DEIN_INSTALL_DIR%
Code:
Doch bei dem nächsten Befehl (bei mir ist %DEIN_INSTALL_DIR%=c:\fpc\trunkbuild):
make all install OS_TARGET=win32 CPU_TARGET=i386 INSTALL_PREFIX=%DEIN_INSTALL_DIR%
Code:
bekomme ich zum Schluß folgende Fehlermeldung:
make all OS_TARGET=nativent CPU_TARGET=i386 FPC=c:\fpc\trunkbuild\bin\i386-win32\ppc386.exe
Code:
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:
...
[ 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>_ Lg, jus |
AW: Programm bei Systemstart ausführen wie chkdsk?
Zitat:
Zitat:
Code:
Falls das "install" im RTL Verzeichnis scheitert, dann führe bitte das Folgende dort aus (notfalls per Explorer ;) ):
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%
Code:
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 ;)
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 Gruß, Sven |
AW: Programm bei Systemstart ausführen wie chkdsk?
Zitat:
Code:
so kommt folgende Fehlermeldung:
make clean all install OS_TARGET=nativent CPU_TARGET=i386 FPC=%DEIN_INSTALL_DIR%\bin\i386-win32\fpc.exe INSTALL_PREFIX=%DEIN_INSTALL_DIR%
Code:
Lg,
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> jus |
AW: Programm bei Systemstart ausführen wie chkdsk?
Zitat:
Gruß, Sven |
AW: Programm bei Systemstart ausführen wie chkdsk?
Zitat:
Code:
Und die units Dateien manuell nach "%DEIN_INSTALL_DIR%\units\i386-nativent\rtl" kopiert.
make clean all OS_TARGET=nativent CPU_TARGET=i386 FPC=%DEIN_INSTALL_DIR%\i386-win32\fpc.exe INSTALL_PREFIX=%DEIN_INSTALL_DIR%
Danach habe ich folgenden Befehl im Verzeichnis "packages" erfolgreich ausgeführt:
Code:
Ähm.... und was wäre der nächste Schritt? :oops: Ich gebe zu, ich habe keinen Durchblick beim Build-Prozeß. :duck:
make clean install all OS_TARGET=nativent CPU_TARGET=i386 FPC=%DEIN_INSTALL_DIR%\i386-win32\fpc.exe INSTALL_PREFIX=%DEIN_INSTALL_DIR%
Lg, jus |
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:
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.
%DEIN_INSTALL_DIR%\bin\i386-win32\fpc.exe -Tnativent {sonstige optionen} deinsource.pas
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 ![]() 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 |
AW: Programm bei Systemstart ausführen wie chkdsk?
Also wenn ich folgenden Befehl starte:
Code:
wobei das helloworld.pas genau das demo von der
c:\fpc\build\bin\i386-win32\fpc.exe -Tnativent helloworld.pas
![]()
Delphi-Quellcode:
So kommt folgende Fehlermeldung :oops: :
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.
Code:
sprich irgendwas funktioniert da nicht... :cry:
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> lg, jus |
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:
![]() |
AW: Programm bei Systemstart ausführen wie chkdsk?
Zitat:
Vielen vielen Dank an Sven! Ich bin wohl von falschen Erwartungen ausgegangen. Ich dachte, dass das ![]()
Delphi-Quellcode:
Lg,
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. jus |
AW: Programm bei Systemstart ausführen wie chkdsk?
Zitat:
Der Typ
Delphi-Quellcode:
heißt nun wie der entsprechende C-Typ
TLargeInteger
Delphi-Quellcode:
und
LARGE_INTEGER
Delphi-Quellcode:
wurde ebenfalls in
TNtUnicodeString
Delphi-Quellcode:
umbenannt. Beide befinden sich in der Unit
UNICODE_STRING
Delphi-Quellcode:
, welche ja bereits eingebunden ist.
ndk
Das Programm sollte übrigens äquivalent zu folgendem sein:
Delphi-Quellcode:
Gruß,
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. Sven |
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:
Wie ist der aktuelle Stand der Entwicklung?
make clean all OS_TARGET=nativent CPU_TARGET=i386 FPC=%DEIN_INSTALL_DIR%\i386-win32\fpc.exe INSTALL_PREFIX=%DEIN_INSTALL_DIR%
Lg, jus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:45 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