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.
-
Verwende für detailiertere
GetLastErrorAngabenFormatMessage.Grüssli
-
Dravere schrieb:
Verwende für detailiertere
GetLastErrorAngabenFormatMessage.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...
-
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.