OpenThread - działa to ort! chociaż czasem?

0

Czesc!
Mam problem z funkcja OpenThread. Może na początek kawałek kodu:

HANDLE handle=OpenThread(SYNCHRONIZE, false, threadID);
 if (handle) // sprawdzenie czy udalo sie otworzyc watek.....
{
//costam
 } else cout << "Nie udalo sie otworzyc watku, kod bledu: " << GetLastError() << "\n";

Podany kod działa, tyle tylko, że ja potrzebuje praw dostępu THREAD_ALL_ACCESS a nie SYNCHRONIZE a z tym już jest problem :/ Niezależnie od tego jaki wątek próbuje otworzyć - zawsze to samo: błąd nr 5 czyli acces denied :-[ Ma ktoś jakiś pomysł jak to rozwiązać? Siedze nad tym już "dłuższą chwile"..... Na msdn'ie przykładów użycia tego nie znalazłem, w necie też nie.

0

Mozesz rozszerzyc swoja wypowiedź? Opis czytalem juz pare razy juz wczoraj, ale jakos nie udalo mi sie z niego wywnioskować co moze byc źle.....

System: win xp sp2, admin

BTW: Przydałoby się poprawić "rozpoznawanie linków" na 4p(link reichela..)

0

mam na mysli to (np. w delphi dziala ale nie testowalem w visualach)

THREAD_ALL_ACCESS All possible access rights for a thread object.
Windows Server 2003 and Windows XP/2000: The size of the THREAD_ALL_ACCESS flag increased on Windows Server 2008 and Windows Vista. If an application compiled for Windows Server 2008 and Windows Vista is run on Windows Server 2003 or Windows XP/2000, the THREAD_ALL_ACCESS flag is too large and the function specifying this flag fails with ERROR_ACCESS_DENIED. To avoid this problem, specify the minimum set of access rights required for the operation. If THREAD_ALL_ACCESS must be used, set _WIN32_WINNT to the minimum operating system targeted by your application (for example, #define _WIN32_WINNT _WIN32_WINNT_WINXP). For more information, see Using the Windows Headers.

0

Mam taki kawałek kodu:

#define _WIN32_WINNT _WIN32_WINNT_WINXP //próbowałem też dać za includami...
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
using namespace std;
//tutaj rozne smieci - wczytanie threadID...
 HANDLE handle=OpenThread(THREAD_ALL_ACCESS , false, threadID);
 if (handle)
 {
	 if (SuspendThread(handle)==-1) cout << "Nie udalo sie zatrzymac watku, kod bledu:"<< GetLastError();
	 else
	 {
	 if (GetThreadContext(handle, &context))	  cout<< "Udało sie" << "\n";	 
	  else  cout << "Nie udalo sie, kod bledu: " << GetLastError() << "\n";
	 ResumeThread(handle);
	 }
 } else cout << "Nie udalo sie otworzyc watku, kod bledu: " << GetLastError() << "\n";

 return 0;
}

Jeżeli zamiast THREAD_ALL_ACCESS dam (THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT) to moge otworzyć watek, ale zatrzymac go albo pobrac jego kontekst juz nie(chociaz teoretycznie mam do tego prawo...) :/ Ciagle access denied.... Moglbys pokazac swoj kod z delphiego albo(najlepiej) przetestowac na visual'u? Z góry dzięki za pomoc :)

//edit: Jest pewien postęp. Moge otworzyć i zatrzymać(tak przynajmniej mi sie wydaje) wątek, GetThreadContext nie zwraca żadnych błędów, ale wartości, które pokazuje raczej nie są poprawne....(wszędzie 0) :/

0

takie cudo dziala (swoja droga dawaj na przyszlosc cos dzialajacego bo nie zawsze jest czas aby dopisywac reszte nawet z msdn'u).

#define _WIN32_WINNT _WIN32_WINNT_WINXP //próbowałem też dać za includami...
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>
#include <strsafe.h>

DWORD WINAPI MyThreadFunction( LPVOID lpParam );

#define BUF_SIZE 255

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{

    DWORD   dwThreadId;
    HANDLE  hThread; 

  hThread = CreateThread( 
            NULL,                   // default security attributes
            0,                      // use default stack size  
            MyThreadFunction,       // thread function name
            NULL,          // argument to thread function 
            0,                      // use default creation flags 
            &dwThreadId);   // returns the thread identifier 

  Sleep(100);

  //moze sprobuj THREAD_ALL_ACCESS                = STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $03FF;
 HANDLE handle =OpenThread(THREAD_ALL_ACCESS , false, dwThreadId);
 if (handle)
 {
         TerminateThread(handle,0);

 } 
 else 
	 cout << "Nie udalo sie otworzyc watku, kod bledu: " << GetLastError() << "\n";

  int i;
  cin >> i;
 return 0;
}





DWORD WINAPI MyThreadFunction( LPVOID lpParam ) 
{ 
    HANDLE hStdout;

    TCHAR msgBuf[BUF_SIZE];
    size_t cchStringSize;
    DWORD dwChars;

	static int i = 0;



    // Make sure there is a console to receive output results. 

    hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    if( hStdout == INVALID_HANDLE_VALUE )
        return 1;
    // Print the parameter values using thread-safe functions.

	while (1==1)//powinno sie ladniej zakonczyc :)
	{
     StringCchPrintf(msgBuf, BUF_SIZE, TEXT("%d\n"), i); 
     StringCchLength(msgBuf, BUF_SIZE, &cchStringSize);
     WriteConsole(hStdout, msgBuf, (DWORD)cchStringSize, &dwChars, NULL);
 	 i++;
	 
	}

    return 0; 
} 

//---- odlicza do okolo 100-110 :) i pyta sie podaj. VS2005 Win2003

0

Ten przyklad działa, ale problem w tym, że Ty otwierasz watek, ktory sam stworzyles, a ja chce otworzyc watek utworzony przez inny proces.... Ma ktos jakis pomysl co moze byc źle w mojej wersji ?

0

Spodziewalem sie tego ale nigdzie nie napisales.

Co moze byc zle w Twojej wersji ? Nie wiem podaj ja (dzialajacy minimalny kod: watek+otwarcie).

0
cyriel napisał(a)

Ten przyklad działa, ale problem w tym, że Ty otwierasz watek, ktory sam stworzyles, a ja chce otworzyc watek utworzony przez inny proces....?
Prawo do tego będziesz miał wyłącznie jeśli jesteś rodzicem (właścicielem) tego procesu, czyli wtedy gdy sam go utworzysz funkcją CreateProcess z odpowiednimi prawami dostępu. Jeśli proces jest uruchomiony przez użytkownika to nie za wiele zdziałasz.

0

Cos ostatnio na tym forum czesto siegam do ntdll :) Mozliwe, ze ta funkcja pozwoli na takie otwarcie NtOpenThread. Jednak sprawdzilbym ta co masz i znalazl 100% odpowiedz, ze sie nie da bo teoretycznie MSDN zaleca OpenThread. Moze nie masz przywilejow jako proces do otwarcia innego procesu - jego watku ?

0

reichel: Zaraz poczytam o NtOpenThread i zobacze co z tego wyjdzie.

Moj kod:

#include "stdafx.h"
#include <windows.h>

//extern "C" WINBASEAPI HANDLE WINAPI OpenThread(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwThreadId);
//#define _WIN32_WINNT _WIN32_WINNT_WINXP 
//Wynik zawsze ten sam - niezależnie od tego czy poprzednie 2 linijki sa zakomentowane czy nie


int _tmain(int argc, _TCHAR* argv[])
{
	DWORD TID=0;
	printf("%s \n", "Podaj TID:");
	scanf("%x", &TID);
	HANDLE handle=OpenThread(THREAD_ALL_ACCESS, false, TID); //probowalem tez THREAD_SUSPEND_RESUME | THREAD_GET_CONTEXT
	CONTEXT context;
	if (handle) 
	{
		printf("\n%s \n", "OK"); 
		if (SuspendThread(handle)==-1) {printf("Nie udalo sie zatrzymac watku, kod bledu %d", GetLastError());} 
		else
		{
		if (GetThreadContext(handle, &context)) 
		{
			printf("%s \n", "Udalo sie pobrac context watku");
			printf("Wartosci poszczegolnych rejestrow %x %x %x %x %x \n", context.Eax, context.Ebx, context.Ecx, context.ContextFlags, context.Esi);
		}else printf("Kod bledu %d", GetLastError());
		}
		CloseHandle(handle);
	}else printf("Kod bledu %d", GetLastError());

    return 0; 
} 

Jak widzicie na razie nic wielkiego to to nie jest ;-) Wpisuje sobie TID(thread id) jakiegos tam watku(testy wykonuje najczesciej na pajaku) no i wyswietla mi ze wszystko ok, ale wartosci rejestrow raczej nie sa prawidlowe - wszystkie==0, a flagi 0xCCCCCCCC Ma ktos jakis pomysl co moze byc nie tak?
Teoria adfa(wybacz, zle nie wiem ja sie odmienia Twoj nick ;-P ) - Możliwe, chociaż z deugiej strony, nia ma żadnego problemu żeby otworzyć proces, którego się nie utworzyło, więc czemu z wątkami miałoby być inaczej? No i poza tym są programy, które takie rzeczy robią bez problemu(olly), więc to na pewno jest możliwe. Problem w tym JAK to zrobić :)

0

cha nie myslalem o tych strukturach contex, ale dziwilo mnie ze jej nie inicjujesz (to nietypowe w windach). Mi dziala z obcym watkiem

zeruje i
context.ContextFlags = CONTEXT_FULL;

0

Po deklaracji conextu dodałem

context.ContextFlags=CONTEXT_FULL;

i chyba działa(jeszcze sprawdze) :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.