Wieso bekomme ich ERROR_NOACCESS?



  • OpenProcessToken(pProcess,TOKEN_ALL_ACCESS,ppToken)
    die funktion gibt immer error: 998 zurück. warum?

    bool STARTCMD(char *pszApplicationName)
    {
    	char bla[60] = "winsta0\default";
    	PROCESS_INFORMATION ProcessInformation	= { 0 };
    	SECURITY_ATTRIBUTES SecurityAttributes	= { 0 };
    	STARTUPINFO			StartupInformation	= { 0 };
    	bool 			bReturn			= 0;
    	unsigned long	ulNotepadPID	= 0;
    	void** ppUserTokenDup = 0, **ppToken = 0, *pProcess	= 0;
    	__try
    	{
    		SecurityAttributes.nLength		= sizeof(SECURITY_ATTRIBUTES);
    		StartupInformation.cb			= sizeof(STARTUPINFO);
    		StartupInformation.lpDesktop = bla;
    
    		ulNotepadPID = GetPID("notepad.exe");
    		if(!ulNotepadPID) __leave;
    		pProcess = OpenProcess(MAXIMUM_ALLOWED,false,ulNotepadPID);
    
    		if(!pProcess) __leave;
    		if(!OpenProcessToken(pProcess,TOKEN_ALL_ACCESS,ppToken))
    		cout << GetLastError();
    		if(!DuplicateTokenEx(ppToken, MAXIMUM_ALLOWED,&SecurityAttributes,SecurityIdentification,TokenPrimary,ppUserTokenDup)) __leave;
    		if(!CreateProcessAsUser(ppUserTokenDup,0,pszApplicationName,&SecurityAttributes,&SecurityAttributes,0,NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE,0,0,&StartupInformation,&ProcessInformation)) __leave;
    		bReturn = true;
    	}
    	__finally
    	{
    		if(pProcess) CloseHandle(pProcess);
    		if(ppToken) CloseHandle(ppToken);
    		if(ppUserTokenDup) CloseHandle(ppUserTokenDup);
    	}
    	return bReturn;
    }
    

    ERROR_NOACCESS
    998 (0x3E6) Invalid access to memory location.


  • Administrator

    Verwende für detailiertere GetLastError Angaben FormatMessage .

    Grüssli



  • Dravere schrieb:

    Verwende für detailiertere GetLastError Angaben FormatMessage .

    Grüssli

    Ist das detailliert genug?



  • Oh Scully, da fehlt's an den Grundlagen...
    Probiers mal so 😉

    HANDLE token = 0;
    if(!OpenProcessToken(pProcess,TOKEN_ALL_ACCESS,&token))
        cout << GetLastError();
    HANDLE tokenDuplicate = 0;
    if(!DuplicateTokenEx(token,MAXIMUM_ALLOWED,&SecurityAttributes,SecurityIdentification,TokenPrimary,&tokenDuplicate))
        __leave;
    if(!CreateProcessAsUser(tokenDuplicate,0,pszApplicationName,&SecurityAttributes,&SecurityAttributes,0,NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE,0,0,&StartupInformation,&ProcessInformation))
        __leave;
    

    p.S.: void* statt HANDLE schreiben ist unkuhl.



  • Hi gruss dich,

    noch ne dumme Frage warum: TOKEN_ALL_ACCESS wenn: TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE auch langt?

    The lord gave us our lives threat it with respect C0de4Fun



  • C0de4Fun schrieb:

    Hi gruss dich,

    noch ne dumme Frage warum: TOKEN_ALL_ACCESS wenn: TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE auch langt?

    The lord gave us our lives threat it with respect C0de4Fun

    Weniger Tipparbeit 😃
    Scherz Beiseite:

    Hat das Nachteile? Wenn ja, bin ich nicht aufgeklärt...



  • hustbaer schrieb:

    Oh Scully, da fehlt's an den Grundlagen...
    Probiers mal so 😉

    HANDLE token = 0;
    if(!OpenProcessToken(pProcess,TOKEN_ALL_ACCESS,&token))
        cout << GetLastError();
    HANDLE tokenDuplicate = 0;
    if(!DuplicateTokenEx(token,MAXIMUM_ALLOWED,&SecurityAttributes,SecurityIdentification,TokenPrimary,&tokenDuplicate))
        __leave;
    if(!CreateProcessAsUser(tokenDuplicate,0,pszApplicationName,&SecurityAttributes,&SecurityAttributes,0,NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE,0,0,&StartupInformation,&ProcessInformation))
        __leave;
    

    p.S.: void* statt HANDLE schreiben ist unkuhl.

    Jetzt bekomme ich Error 5:
    ERROR_ACCESS_DENIED
    5 (0x5) Access is denied.

    bool STARTCMD(char *pszApplicationName)
    {
    	char bla[60] = "winsta0\default";
    	PROCESS_INFORMATION ProcessInformation	= { 0 };
    	SECURITY_ATTRIBUTES SecurityAttributes	= { 0 };
    	STARTUPINFO			StartupInformation	= { 0 };
    	bool 			bReturn			= 0;
    	unsigned long	ulNotepadPID	= 0;
    	HANDLE pProcess	= 0, token = 0, tokenDuplicate = 0;
    	__try
    	{
    		SecurityAttributes.nLength		= sizeof(SECURITY_ATTRIBUTES);
    		StartupInformation.cb			= sizeof(STARTUPINFO);
    		StartupInformation.lpDesktop = bla;
    
    		ulNotepadPID = GetPID("notepad.exe");
    		if(!ulNotepadPID) __leave;
    		pProcess = OpenProcess(MAXIMUM_ALLOWED,false,ulNotepadPID);
    
    		if(!pProcess) __leave;
    		if(!OpenProcessToken(pProcess,TOKEN_ALL_ACCESS,&token))
    			cout << GetLastError();
    		if(!DuplicateTokenEx(token,MAXIMUM_ALLOWED,&SecurityAttributes,SecurityIdentification,TokenPrimary,&tokenDuplicate))
    			__leave;
    		if(!CreateProcessAsUser(tokenDuplicate,0,pszApplicationName,&SecurityAttributes,&SecurityAttributes,0,NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE,0,0,&StartupInformation,&ProcessInformation))
    			__leave;
    		bReturn = true;
    	}
    	__finally
    	{
    		if(pProcess) CloseHandle(pProcess);
    		if(token) CloseHandle(token);
    		if(tokenDuplicate) CloseHandle(tokenDuplicate);
    	}
    	return bReturn;
    }
    

    Kleine Frage: Warum HANDLE bei z.b. OpenProcessToken()? in der MSDN steht, dass man beim 3. Parameter PHANDLE benutzen soll.



  • hustbaer schrieb:

    p.S.: void* statt HANDLE schreiben ist unkuhl.

    Nö, das ist HoPro!



  • Will mir keiner helfen?



  • Ich verstehe es immer noch nicht...


  • Mod

    skullyan schrieb:

    Kleine Frage: Warum HANDLE bei z.b. OpenProcessToken()? in der MSDN steht, dass man beim 3. Parameter PHANDLE benutzen soll.

    Dann schau Dir die Typen doch an PHANDLE ist ein Zeiger auf ein HANDLE!
    OpenProcessToken will ein Handle zurückgeben und das gehtin C eben nur über einen Zeiger.

    Dieses Forum ist keine Schule für Basics. Lerne aus Büchern und Tutorials.


Anmelden zum Antworten