| Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme. |
Diskussion: C++ OpenThread funktioniert nicht im Forum Code Kitchen, in der Kategorie Software Home; Anzeige hallo! ich möchte um einen thread von einem laufenden prozess zu öffnen die OpenThread Funktion benutzen. da meine entwicklungsumgebung ...
![]() |
| | #1 (permalink) |
| Registriert seit: 18.07.05 ![]() Likes: 0 | Anzeige hallo! ich möchte um einen thread von einem laufenden prozess zu öffnen die OpenThread Funktion benutzen. da meine entwicklungsumgebung (ms visual c++ 6.0) diesen befehl nicht kennt, er aber laut online msdn auch bei win xp im kernel vorhanden ist, habe ich ihn folgendermaßen implementiert: Code: typedef HANDLE (*fnOpenThread)(DWORD,BOOL,DWORD);
HANDLE OpenThread(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwThreadId)
{
HINSTANCE Dll_Handle = LoadLibrary("Kernel32.dll");
if (Dll_Handle == NULL) return FALSE;
fnOpenThread Ot = (fnOpenThread)GetProcAddress(Dll_Handle,"OpenThread");
if (Ot == NULL) return FALSE;
HANDLE hThread = Ot(dwDesiredAccess, bInheritHandle , dwThreadId);
FreeLibrary(Dll_Handle);
return hThread;
} Code: unsigned long GetTargetThreadIdFromProcname(char *procName)
{
PROCESSENTRY32 pe;
HANDLE thSnapshot, hProcess;
BOOL retval, ProcFound = false;
unsigned long pTID, threadID;
thSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(thSnapshot == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "Error: unable to create toolhelp snapshot", "Loader", NULL);
return false;
}
pe.dwSize = sizeof(PROCESSENTRY32);
retval = Process32First(thSnapshot, &pe);
while(retval)
{
if(strcmp(pe.szExeFile, procName) == 0)
{
ProcFound = true;
break;
}
retval = Process32Next(thSnapshot,&pe);
pe.dwSize = sizeof(PROCESSENTRY32);
}
CloseHandle(thSnapshot);
_asm {
mov eax, fs:[0x18]
add eax, 36
mov [pTID], eax
}
hProcess = OpenProcess(PROCESS_VM_READ, false, pe.th32ProcessID);
ReadProcessMemory(hProcess, (const void *)pTID, &threadID, 4, NULL);
CloseHandle(hProcess);
return threadID;
} Code: int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{
DWORD procid=GetTargetProcessIdFromProcname("firefox.exe");
DWORD threadid= GetTargetThreadIdFromProcname("firefox.exe");
char prinw[500];
sprintf(prinw,"firefox.exe proc id=%i threadid=%i",procid,threadid);
MessageBox(NULL,prinw,"gugg",MB_OK);
HANDLE hproc = OpenProcess((PROCESS_VM_WRITE | PROCESS_VM_OPERATION), false, procid);
HANDLE hthread = OpenThread((THREAD_GET_CONTEXT | THREAD_SET_CONTEXT | THREAD_SUSPEND_RESUME), false, threadid);
if( hthread == NULL)
{
char erro[500];
sprintf(erro,"hthread error: %i",GetLastError());
MessageBox(NULL,erro,"null",MB_OK);return 0;}
return 0;
} danach kommt aber immer folgender fehler: Unbehandelte Ausnahme in loadbl.exe: 0xC0000005 Access Violation ich weiß nicht wie ich diesen befehler beheben kann. |
| | |
| | #2 (permalink) |
| dass dein vc++ die funktion nicht kennt, is ja schon mal sehr seltsam, aber dein workaround is ja wohl ganz ok ![]() also wenn ich Access Denied höre, denke ich sofort an das NT rechtesystem und wuerde jetzt mal spontan darauf tippen, dass dein prozess einfach nicht genuegend rechte hat. sprich: entweder du fuehrst das ganze als non-admin aus oder du hast ein "Privilege" (in solchen fällen meistens SeDebugPrivilege) fuer den prozess nicht. Probier mal, folgende funktion in dein programm einzubauen und diese in deiner winmain aufzurufen, bevor du OpenProcess benuetzt. Code: bool EnableDebugPriv( void )
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;
if ( ! OpenProcessToken( GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
{
//wcout << L"OPT() failed, gle = " << GetLastError() <<
// L" SeDebugPrivilege is not available." << endl;
return false;
}
if ( ! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue ) )
{
//wcout << L"LPV() failed, gle = " << GetLastError() <<
// L" SeDebugPrivilege is not available." << endl;
CloseHandle( hToken );
return false;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if ( ! AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
//wcout << L"ATP() failed, gle = " << GetLastError() <<
// L" SeDebugPrivilege is not available." << endl;
CloseHandle( hToken );
return true;
} | |
| | |
![]() |
| - Anzeige - | |
| |
| Themen-Optionen | |
| Ansicht | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| computer funktioniert nicht... | crash-override | Die Problemzone | 17 | 08.01.08 20:50 |
| FN - Taste funktioniert nicht :( | NeWcOmEr | Die Problemzone | 4 | 10.08.06 17:59 |
| Ton funktioniert nicht! | TheRealMoon | Die Problemzone | 2 | 19.12.05 20:07 |
| VPN funktioniert, LAN nicht | DocMorbid | Windows | 5 | 28.11.03 01:56 |
| FM114P funktioniert nicht?! | DevilCoder | Network · LAN, WAN, Firewalls | 0 | 28.06.03 15:59 |