вместо переменной потока передаётся в адрес функции потока, почему?

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 18 окт 2011.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Ребята, в этом процессе я хочу создать отдалённый поток:
    Код (Text):
    1.  #include <windows.h>
    2. #include <stdio.h>
    3.  
    4. //По замыслу именно эта функция должна вызваться
    5. //из другого процесса
    6. void f (void*);
    7.  
    8.  
    9. int main () {
    10.  SetConsoleCP (1251);
    11.  SetConsoleOutputCP (1251);
    12.  
    13.  
    14.  printf ("Адрес функции f равен %x, сейчас жми на ra_p_1.exe и вводи туда этот адрес\n", f);
    15.  getchar ();
    16.  
    17.  //Адрес этой переменной будет передаваться в качестве параметра в функцию f,
    18.  //а внутри её соответственно в MessageBox
    19.  int peremennaya= 0Xcafebabe;
    20.  
    21.  f(&peremennaya);
    22.  getchar ();
    23.  return 0;
    24. }
    25.  
    26. void f (void* per) {
    27.  printf ("Я функция. Если ты увидел меня по нажатию enter в ДРУГОМ окне\
    28.  и если ты увидел переменную per, равную cafebabe значит, всё хорошо!\n");
    29.  
    30.  //Тут почему-то постоянно получается не cafebabe, но адрес f, т. е. 401421
    31.  printf ("per= %x\n", *(int*)per);
    32. }
    вот из этого вот процесса:
    Код (Text):
    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <windows.h>
    4. #include "handle_processa.cpp"
    5.  
    6. int main(int argc, char* argv[]) {
    7.  SetConsoleCP (1251);
    8.  SetConsoleOutputCP (1251);
    9.  
    10.  //Ищем хэндл процесса
    11.  HANDLE hProcess= HandleProcessa ((char*)"messagebox_p_1.exe");
    12.  printf ("хэндл процесса есть %d, теперь вводи адрес функции, который ты получил\
    13.  её мы и будем вызывать\n", hProcess);
    14.  
    15.  int adres;
    16.  scanf ("%x", &adres);
    17.  void* pkode= (void*)adres;
    18.  
    19.  //Сюда мы запихаем TID
    20.  LPDWORD lpThreadId= new DWORD;
    21.  
    22.  //Это вот будет параметры функции потока
    23.  //Если они удачно передались, должо создаться messagebox с тремя кнопками
    24.  //сюда хоть чё пиши, в созданном потоке превращается в переменную adres
    25.  int per= 0Xcafebabe;
    26.  void* _per= &per;
    27.  
    28.  HANDLE p= CreateRemoteThread (hProcess, 0, 0, (LPTHREAD_START_ROUTINE)pkode, _per, 0, lpThreadId);
    29.  
    30.  printf ("Это вот TID отдалённого потока %x\n", *lpThreadId);
    31.  printf ("А это его хэндл %x\n", p);
    32.  printf ("_per= %x\n", *(int*)_per);
    33.  getchar ();
    34.  return 0;
    35. }
    переменная потока передаётся какая хочешь, а на выходе- адрес функции потока
    ...Rel, хоть убей я не вижу чё тут не так:


    int per= 0Xcafebabe;
    void* _per= &per;
    CreateRemoteThread (hProcess, 0, 0, (LPTHREAD_START_ROUTINE)pkode, _per, 0, lpThreadId);
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Опять та же ошибка - в качестве параметра ты передаешь не значение, а адрес переменной &per. В твоем процессе по этому адресу лежит 0xcafebabe, а в другом - х.з. что :)
     
  3. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Так ведь и надо передавать АДРЕС! Надо передавать адрес переменной 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.
    ++++++++++++++++++++++++++++++++++++++++++++++++++
    что я и делаю, передаю УКАЗАТЕЛЬ
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    amvoz
    Читать умеем или как? В другом процессе нету этой переменной.
     
  5. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Так получается, если из процесса X создавать поток в процессе Y, то, передавая указатель, надо ориентироваться исключительно на адреса в процессе Y? Да, ничё не скажешь, очень полезный параметр...

    Так-то прикольно получается. С адресами процесса Y я бы и сам разобрался в процессе Y же, чё надо откуда то и получил. Моя же задача была передать из X в Y ЭКСКЛЮЗИВНУЮ переменную. Похоже, меня обламывают...
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Или передавать по значению, что в данном случае наиболее безгеморно или выделять память в удалённом процессе, писать туда значение и передавать именно этот удалённый адрес. А параметр этот вполне нормальный, адресное пространство ограничено текущим процессом. Ну а если нужно шарить память между процессами, то mmap.
     
  7. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Ужас, сам бы я не разобрался ни за что! Спасибо.
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    amvoz
    Если это твоя собственная функция, то можешь передавать что угодно совместимое по размеру с LPVOID, в частности int или DWORD для 32-битного приложения - передаем (void*)per, а в функции используем как (int)per и усе ;)