2009-07-16 6 views
-5

ich über ein Gespräch mit einem Kollegen mit, ob die folgenden möglich:Wie kann ich meine Anwendung anstelle der Standard-Windows XP-Shell ausführen?

  1. Installieren Sie eine MFC-Anwendung von einem USB-Laufwerk in Windows XP (diese Installation manuell durch einen Benutzer mit ausreichend Rechten initiiert werden würde Software installieren).
  2. Nach dem Neustart sollte diese Anwendung anstelle der standardmäßigen Windows XP-Shell (explorer.exe) gestartet werden.

Weiß jemand, wie ich das erreichen könnte?

+2

Ich verstehe eine Sache nicht, wie werden Sie eine MFC-Anwendung ohne eine laufende Betriebsplattform ausführen? DLL-Injektion - Sie müssen eine DLL in einen Prozess injizieren, der Prozess, wenn kein Betriebssystem geladen ist? –

+0

Dies würde viel mehr Sinn machen, wenn Sie "Shell" am Ende der "2)" Kugel hinzufügen. Die TSR-Referenz ist verwirrt und irrelevant. – darron

+0

@Josn hat einen Punkt, ich bewundere die Erklärung des Autors der Ausführung der MFC-Anwendung (erster Punkt in Anforderungen). –

Antwort

7

Sie können eine MFC-Anwendung nicht ausführen, bevor Windows gestartet wird, da per Definition MFC von Windows-DLLs ausgeführt wird, die nicht geladen werden, bis Windows selbst ist. Ganz zu schweigen davon, dass Windows dafür verantwortlich ist, eine PE zu laden, so dass Sie nicht einmal in der Lage sind, eine kompilierte EXE oder DLL ohne einen benutzerdefinierten Bootstrapper zu laden.

Um zu tun, was Sie tun möchten, haben Sie ein paar Optionen. Es gibt (einfache) Möglichkeiten, Windows so zu setzen, dass eine Anwendung beim Start geladen wird. Wenn es das ist, was Sie wollen, dann ist das durchaus möglich.

Wenn Sie jedoch Code vor und während Fenster ausführen möchten anläuft, dann müssen Sie zunächst das Bootstrap-Programm überschreiben (mit so etwas wie GRUB), Code auszuführen (auch hier werden Sie keinen Zugang zu Standard haben Bibliothek - Sie müssen direkt mit den Puffern arbeiten, die Ihnen von der CPU zur Verfügung gestellt werden, wenn Sie irgendeine Art von I/O durchführen wollen. Dann starten Sie Windows, indem Sie den Bootstrapper starten. Ich habe keine Ahnung, wie ich das machen soll; aber das ist der allgemeine Überblick darüber, was passieren muss.

Sie erwähnten DLL-Injektion, die eine andere Möglichkeit ist. Ich bin nicht vertraut mit welchen DLLs und in welcher Reihenfolge beim Start von Windows geladen werden. Das wird eine Übung für dich sein. Was Sie beachten müssen, ist, dass die höhere Ebene, auf der Sie existieren möchten (dh welche Bibliotheken Ihnen für die Datei-/Konsolen-I/O zur Verfügung stehen), höher ist, um Ihren Code im Windows-Startprozess auszuführen .

Mein Vorschlag an Sie ist einfach ein Programm schreiben, das als ein Dienst ausgeführt wird, der während der Windows-Initialisierung gestartet wird. Es ist leicht zu machen, und Sie werden die gesamte HAL geladen haben und bereit sein, tatsächlich Aufgaben auszuführen - anstatt dass Sie gerätespezifische Treiber schreiben müssen, um die Hardware zu manipulieren, bevor das Fenster die HAL lädt.

+0

Ich denke, wenn wir rundll injizieren; es sollte gut funktionieren. Es gibt eine reflektive DLL-Injektion, die ich mir auch ansehen werde. Aber können wir das tun: - lässt Windows starten, beendet das Laden aller seiner Sachen, dann zeige ich statt des Windows-Bildschirms meinen Anwendungsbildschirm. Oder muss ich die GINA dll auch ändern. –

+0

Kon-Boot ist ein Beispiel für den harten Weg: Es ersetzt den Bootloader und modifiziert Windows auf seinem Weg nach oben. – ephemient

5

Ändern Sie HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit Registrierungswert mit dem vollständigen Pfad zu Ihrer Anwendung. Dieser Schlüssel gibt an, welches Programm direkt nach der Anmeldung eines Benutzers bei Windows gestartet werden soll. Das Standardprogramm für diesen Schlüssel ist C: \ windows \ system32 \ userinit.exe. Userinit.exe ist ein Programm, das dein Profil, Schriftarten, Farben usw. für deinen Benutzernamen wiederherstellt. Es ist möglich, weitere Programme hinzuzufügen, die von diesem Schlüssel gestartet werden, indem Sie die Programme durch ein Komma trennen.