[C/C++] system(bcdedit ...) -> befehl nicht gefunden

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Die_Quelle, 28. August 2011 .

Schlagworte:
  1. 28. August 2011
    system(bcdedit ...) -> befehl nicht gefunden

    Hi Leute,

    Undzwar ich will per c++ (konsolen) Programm.

    Die Data execution Prevention ausschalten, was nicht klappt bzw. nur teils.

    Wenn ich z.b. in die Bat/cmd datei schreibe:

    Code:
    bcdedit /set {current} NX AlwaysOff
    und sie ausführe (als Admin) gehts.

    Wenn ich in den c++ code schreibe

    Code:
    system("bcdedit /set {current} NX AlwaysOff");
    
    Funktioniert es nicht er sagt dann: "Der Befehl konnte nicht gefunden werden...blah"

    Hat jemand ne Idee wie ich das zum laufen bekomme? Mein Programm als Admin ausgeführt funtz auch NICHT.
     
  2. 28. August 2011
    AW: system(bcdedit ...) -> befehl nicht gefunden

    Probier doch mal mit absolutem Pfad. bcdedit.exe ist ein ganz normales Programm, ohne Pfad sieht es da schlecht aus.

    Besser wäre es mit der win api CreateProcess anstatt das schlechte system()
     
  3. 28. August 2011
    AW: system(bcdedit ...) -> befehl nicht gefunden

    Code:
     system("%windir%\\system32\\bcdedit.exe /set {current} NX AlwaysOn");
    So hab ichs grade versucht. Leider ohne Erfolg.

    Vielleicht könnteste mir mal nen Beispiel zeigen für:

    CreateProcess();

    mit diesem Pfad hier:
    Code:
    %windir%\\system32\\bcdedit.exe /set {current} NX AlwaysOn
     
  4. 28. August 2011
    AW: system(bcdedit ...) -> befehl nicht gefunden

    Schau dir mal die MSDN zu CreateProcess an:
    CreateProcess function (Windows)

    Weiter unten findet man sogar Beispiele dazu, wobei ich trotzdem zum (kompletten) lesen der Dokumentation raten würde:
    Spoiler
    Code:
    #include "stdafx.h"
     #include <windows.h>
     #include <strsafe.h>
     #include <direct.h>
     #include <string.h>
    
     void RunTest(TCHAR *AppName, TCHAR *CmdLine)
     {
     wprintf(L"\nTest Running...\n");
     wprintf(L" AppName: %s\n", AppName);
     wprintf(L" CmdLine: %s\n", CmdLine);
    
     PROCESS_INFORMATION processInformation;
     STARTUPINFO startupInfo;
     memset(&processInformation, 0, sizeof(processInformation));
     memset(&startupInfo, 0, sizeof(startupInfo));
     startupInfo.cb = sizeof(startupInfo);
    
     BOOL result;
     TCHAR tempCmdLine[MAX_PATH * 2]; //Needed since CreateProcessW may change the contents of CmdLine
     if (CmdLine != NULL)
     {
     _tcscpy_s(tempCmdLine, MAX_PATH *2, CmdLine);
     result = ::CreateProcess(AppName, tempCmdLine, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &startupInfo, &processInformation);
     }
     else
     {
     result = ::CreateProcess(AppName, CmdLine, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &startupInfo, &processInformation);
     }
    
     if (result == 0)
     {
     wprintf(L"ERROR: CreateProcess failed!");
     }
     else
     {
     WaitForSingleObject( processInformation.hProcess, INFINITE );
     CloseHandle( processInformation.hProcess );
     CloseHandle( processInformation.hThread );
     }
     }
    
     int _tmain(int argc, _TCHAR* argv[])
     {
     //Assumes ParamTest.exe is in the current working directory
     RunTest(L"C:\\CreateProcessBug\\Debug\\ParamTest.exe", NULL);
     RunTest(L"C:\\CreateProcessBug\\Debug\\ParamTest.exe", L"Param1 Param2 Param3");
     RunTest(NULL, L"\"C:\\CreateProcessBug\\Debug\\ParamTest.exe\" Param1 Param2 Param3");
     return 0;
     }
    
     
  5. 29. August 2011
    AW: system(bcdedit ...) -> befehl nicht gefunden

    So kann das auch nicht funktionieren, %windir% ist eine Umgebungsvariable die bei system() nicht aufgelöst wird. Du brauchst den absoluten Pfad.

    vielleicht so, on-the-fly Lösung:

    char pfad[260];
    char * windir = getenv("windir");

    strcpy(pfad, windir);
    strcat(pfad, "\\system32\\bcdedit.exe /set {current} NX AlwaysOn");

    kann auch sein, dass du noch ein cmd.exe /c davor machen musst. Müsste man halt ausprobieren.

    Oder lieber direkt CreateProcess oder ShellExecute
     
  6. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.