Ребята, в этом процессе я хочу создать отдалённый поток: Код (Text): #include <windows.h> #include <stdio.h> //По замыслу именно эта функция должна вызваться //из другого процесса void f (void*); int main () { SetConsoleCP (1251); SetConsoleOutputCP (1251); printf ("Адрес функции f равен %x, сейчас жми на ra_p_1.exe и вводи туда этот адрес\n", f); getchar (); //Адрес этой переменной будет передаваться в качестве параметра в функцию f, //а внутри её соответственно в MessageBox int peremennaya= 0Xcafebabe; f(&peremennaya); getchar (); return 0; } void f (void* per) { printf ("Я функция. Если ты увидел меня по нажатию enter в ДРУГОМ окне\ и если ты увидел переменную per, равную cafebabe значит, всё хорошо!\n"); //Тут почему-то постоянно получается не cafebabe, но адрес f, т. е. 401421 printf ("per= %x\n", *(int*)per); } вот из этого вот процесса: Код (Text): #include <stdio.h> #include <string.h> #include <windows.h> #include "handle_processa.cpp" int main(int argc, char* argv[]) { SetConsoleCP (1251); SetConsoleOutputCP (1251); //Ищем хэндл процесса HANDLE hProcess= HandleProcessa ((char*)"messagebox_p_1.exe"); printf ("хэндл процесса есть %d, теперь вводи адрес функции, который ты получил\ её мы и будем вызывать\n", hProcess); int adres; scanf ("%x", &adres); void* pkode= (void*)adres; //Сюда мы запихаем TID LPDWORD lpThreadId= new DWORD; //Это вот будет параметры функции потока //Если они удачно передались, должо создаться messagebox с тремя кнопками //сюда хоть чё пиши, в созданном потоке превращается в переменную adres int per= 0Xcafebabe; void* _per= &per; HANDLE p= CreateRemoteThread (hProcess, 0, 0, (LPTHREAD_START_ROUTINE)pkode, _per, 0, lpThreadId); printf ("Это вот TID отдалённого потока %x\n", *lpThreadId); printf ("А это его хэндл %x\n", p); printf ("_per= %x\n", *(int*)_per); getchar (); return 0; } переменная потока передаётся какая хочешь, а на выходе- адрес функции потока ...Rel, хоть убей я не вижу чё тут не так: int per= 0Xcafebabe; void* _per= &per; CreateRemoteThread (hProcess, 0, 0, (LPTHREAD_START_ROUTINE)pkode, _per, 0, lpThreadId);
Опять та же ошибка - в качестве параметра ты передаешь не значение, а адрес переменной &per. В твоем процессе по этому адресу лежит 0xcafebabe, а в другом - х.з. что
Так ведь и надо передавать АДРЕС! Надо передавать адрес переменной per! То есть &per или _per, что одно и то же! Вот http://msdn.microsoft.com/en-us/library/windows/desktop/ms682437(v=vs.85).aspx, цитата: ++++++++++++++++++++++++++++++++++++++++++++++++++ lpParameter [in] A pointer to a variable to be passed to the thread function. ++++++++++++++++++++++++++++++++++++++++++++++++++ что я и делаю, передаю УКАЗАТЕЛЬ
Так получается, если из процесса X создавать поток в процессе Y, то, передавая указатель, надо ориентироваться исключительно на адреса в процессе Y? Да, ничё не скажешь, очень полезный параметр... Так-то прикольно получается. С адресами процесса Y я бы и сам разобрался в процессе Y же, чё надо откуда то и получил. Моя же задача была передать из X в Y ЭКСКЛЮЗИВНУЮ переменную. Похоже, меня обламывают...
Или передавать по значению, что в данном случае наиболее безгеморно или выделять память в удалённом процессе, писать туда значение и передавать именно этот удалённый адрес. А параметр этот вполне нормальный, адресное пространство ограничено текущим процессом. Ну а если нужно шарить память между процессами, то mmap.
amvoz Если это твоя собственная функция, то можешь передавать что угодно совместимое по размеру с LPVOID, в частности int или DWORD для 32-битного приложения - передаем (void*)per, а в функции используем как (int)per и усе