Problem unter XP Service Pack 2



  • __fastcall TF_Update::TF_Update(TComponent* Owner)
        : TForm(Owner)
    {
        //Constructor von class TF_Update
        //Dieser Constructor wird unter Service-Pack 2 immer  
        //weiter ausgeführt, obwohl keine Loop definiert ist.
        ... 
        ...
    
        if (!updateCheck())             
        {
            execute(_projectName); //_projectName ist eine ausführbare EXE-Datei, e.g. project.exe
            exit(0);
        }
    }
    
    //---------------------------------------------------------------------------
    void TF_Update::execute(AnsiString ziel)
    {
        long i;
        i=long(ShellExecute(0, "open", ziel.c_str(), 0, 0, SW_SHOWNORMAL));
    
        //Fehlerabfang
        if(i <= 32)
        {
         if ( (i == SE_ERR_ACCESSDENIED) || (i == SE_ERR_SHARE) )
          Application -> MessageBox("Die Datei wird bereits verwendet!",
            "Kommunikation", MB_OK + MB_ICONERROR);
         else if ( (i == SE_ERR_ASSOCINCOMPLETE) || (i == SE_ERR_NOASSOC) )
          Application -> MessageBox("Die Dateiendung ist mit keinem Programm verknüpft!","Kommunikation", MB_OK + MB_ICONERROR);
         else
          Application -> MessageBox("Ein unerwarteter Fehler trat auf!"
            , "Kommunikation",MB_OK + MB_ICONERROR);
        }
    }
    

    Ich benutze 'ShellExecute()', um eine ausführbare EXE-Datei aufzurufen. Das läuft ganz gut außer mit XP Service-Pack 2. Der Constructor wird immer ausgeführt, obwohl es gar keine Loop definiert ist. Die EXE-Datei kann auch nicht ausgeführt werden, obwohl der Zurückwert 'i' in Method 'execute()' immer 42 ist, b.z.w. die Zurückwert mehr als 32 bedeutet ok.

    Das Problem liegt bestimmt von XP Service Pack2, aber ich weiß nicht genau, wie ich es lösen soll. Kann jemand mir helfen?

    Danke!



  • Schon mal die Suche benutzt?

    Ich frag nur mal so, bevor dir Jansen mit ner zusammengerollten Zeitung auf die Birne haut, deine Nase auf den "Suchen"-Button drückt und "PFUI!" brüllt... 😃



  • ich habe das Thema gesucht, und es besteht keine Gleiche schon diskutiert, oder?

    Ich habe den Grund schon gefunden. Es gibt eine neue Feature von Service Pack 2, eine Beschreibung ist wie folgendes:

    Befehlsverweigerung

    Die Execution Protection (NX, no execute) soll die Auswirkungen von
    Angriffen über Buffer Overflows, Integer Overflows, Heap Overflows,
    Format-String-Schwächen und anderen Fehlern minimieren. Ziel solcher
    Angriffe ist es, eigenen Code in das System einzuschleusen und auszuführen
    [3]. Üblicherweise überschreibt man dazu Bereiche in denen Daten abgelegt
    werden, etwa Stacks und Heaps, mit Code und springt ihn durch Manipulation
    des Instruction Pointers an. NX verhindert das Ausführen von Code, der in
    Datenbereichen abgelegt ist, sofern die als "nicht ausführbar"
    gekennzeichnet sind. Ein Angriff des Wurms Lovsan/MSBlaster hätte mit dieser
    Funktion auf Windows XP allenfalls den RPC-Dienst zum Absturz gebracht --
    den Rechner hätte er nicht infizieren können. NX ist standardmäßig aktiviert
    und markiert Datenbereiche wie Stacks und Heaps als nicht-ausführbar.

    Um Execution Protection zu implementieren, greift Microsoft auf die
    Fähigkeiten moderner 64-Bit-Prozesoren zurück, die Funktionen zur
    NX-Kennzeichnung von Speicherbereichen mitbringen. Derzeit stehen dafür der
    Athlon64 von AMD und der Itanium von Intel zur Verfügung. Bislang kann nur
    der Athlon64 mit dem 32-bittigen Windows XP zuammenarbeiten und dies auch
    nur im PAE-Mode (Physical Address Extension). Einige Treiber könnten hier
    zukünftig ihren Dienst versagen, da PAE einen 64-Bit-Adressraum benutzt, den
    32-Bit-Adapter nicht adressieren können. Microsoft hat deshalb auch den
    Hardware Abstraction Layer (HAL) und den Memory Manager modifiziert, um
    weitestgehende Kompatibilität zu älteren 32-Bit-Treibern zu erhalten.

    Ruft eine Applikation eine als NX markierte Speicherseite auf, löst der
    Prozessor eine Exception (STATUS_ACCESS-VIOLATION im User Mode) aus, die in
    den meisten Fällen unbehandelt bleibt und zur Terminierung des auslösenden
    Prozesses führt. Greift der Kernel auf einen geschützten Speicherbereich zu,
    stürzt Windows ab (ATTEMPTED_EXECUTE_OF_NONEXECUTE_MEMORY). Leider schützt
    Execution Protection den Kernel Mode im 32-Bit-Windows-XP nur halb: Einzig
    der Stack wird als NX markiert. Anders beim 64-Bit-Windows-XP: Außer dem
    Stack sind auch die Heaps geschützt.

    Einige Applikationen, die etwa zur Laufzeit neuen Programmcode generieren
    und ausführen wollen, dürften nach der Installation des Service Packs nicht
    mehr funktionieren. Über spezielle Funktionen können neue Anwendungen
    ausführbaren Speicher anfordern, ältere Programme müssen dazu überarbeitet
    werden.

    Unter XP Service Pack 2 darf ein Programm nicht, ein andere Programm aufzurufen. Ich schreibe keine Virus, und ich weiß nicht, wie man unter XP Service Pack 2 andere Programm aufrufen soll?



  • <a href= schrieb:

    Bigwill">Mann muss halt nur dran denken für die BCB.exe die Datenausführungsverhinderung zu deaktivieren.

    Dasselbe sollte wohl für das von dir geschriebene Programm gelten.



  • danke, es ist schon gelöst


Anmelden zum Antworten