общение между процессами

Тема в разделе "WASM.BEGINNERS", создана пользователем el-, 9 окт 2006.

  1. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    есть процесс который получая определенную инфу из нета, должен передать другому процессу свой хенлд и имя окна ...

    думал сразу скопировать хендл главного процесса в процесс-шпион ( DuplicateHandle ) и потом через WriteProcMemory записать имя окна в главный процесс ... но имхо есть же способы проще ...
     
  2. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Проще может быть послать сообщение (SendMessage()), послать APC (QueueUserApc()), создать разделяемую область памяти. Любое из этих решений будет гораздо лучше хотя бы потому, что они официально поддерживаются MS как средства межпроцессного взаимодействия.
    Чтобы передавать строку, имхо, лучше всего использовать разделяемую память + событие для сигнализирования о приходе данных.
     
  3. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    можно небольшой кусочек кода ... который поможет лучше мне разобратся ... т.к. я с разделяемой памятью никогда не работал ...
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. Creating Named Shared Memory
    2. The first process calls the CreateFileMapping function to create a file mapping object and give it the name MyFileMappingObject. By using the PAGE_READWRITE flag, the processes will have read/write permission to the memory through any file views that are created.
    3.  
    4. Note that ErrorHandler is a placeholder for a user-defined function that displays an error message and exits the code.
    5.  
    6.  
    7. HANDLE hMapFile;
    8.  
    9. hMapFile = CreateFileMapping(hFile,    // current file handle
    10.     NULL,                              // default security
    11.     PAGE_READWRITE,                    // read/write permission
    12.     0,                                 // max. object size
    13.     0,                                 // size of hFile
    14.     "MyFileMappingObject");            // name of mapping object
    15.  
    16. if (hMapFile == NULL)
    17. {
    18.     ErrorHandler("Could not create file mapping object.");
    19. }
    20. The process then uses the file mapping object handle returned by CreateFileMapping in the call to MapViewOfFile to create a view of the file in the process's address space. The MapViewOfFile function returns a pointer to the file view.
    21.  
    22. LPVOID lpMapAddress;
    23. lpMapAddress = MapViewOfFile(hMapFile, // handle to mapping object
    24.     FILE_MAP_ALL_ACCESS,               // read/write permission
    25.     0,                                 // max. object size
    26.     0,                                 // size of hFile
    27.     0);                                // map entire file
    28.  
    29. if (lpMapAddress == NULL)
    30. {
    31.     ErrorHandler("Could not map view of file."); }
    32. The second process calls the OpenFileMapping function with the name MyFileMappingObject to use the same file mapping object as the first process. Like the first process, the second process uses the MapViewOfFile function to obtain a pointer to the file view.
    33.  
    34. HANDLE hMapFile;
    35. LPVOID lpMapAddress;
    36.  
    37. hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, // read/write permission
    38.     FALSE,                             // Do not inherit the name
    39.     "MyFileMappingObject");            // of the mapping object.
    40.  
    41. if (hMapFile == NULL)
    42. {
    43.     ErrorHandler("Could not open file mapping object.");
    44. }
    45.  
    46. lpMapAddress = MapViewOfFile(hMapFile, // handle to mapping object
    47.     FILE_MAP_ALL_ACCESS,               // read/write permission
    48.     0,                                 // max. object size
    49.     0,                                 // size of hFile
    50.     0);                                // map entire file
    51.  
    52. if (lpMapAddress == NULL)
    53. {
    54.     ErrorHandler("Could not map view of file.");
    55. }
    В наглую выдрал из MSDN.
     
  5. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Что-то вроде этого.
    Вначале в одном из процессов инициализируется секция и событие:
    Код (Text):
    1. #define MAX_BUF_SIZE 0x1000
    2. #define SECTION_NAME "StringBuffer"
    3. #define EVENT_NAME "SynchEvent"
    4. hMap = CreateFileMapping(INVALID_FILE_HANDLE, NULL, PAGE_READWRITE | SEC_COMMIT, MAX_BUF_SIZE, MAX_BUF_SIZE, SECTION_NAME);
    5. pSection = MapViewOfFile(hMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
    6. hEvent = CreateEvent(NULL, TRUE, FALSE, EVENT_NAME);
    Во втором процессе секция и событие открываются по имени:
    Код (Text):
    1. hEvent = OpenEvent(EVENT_MODIFY_STATE, FALSE, EVENT_NAME);
    2. hMap = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, SECTION_NAME);
    3. pSection = MapViewOfFile(hMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
    Теперь в процессе-шпионе пишем что нужно по адресу pSection, работая как с обычной памятью:
    Код (Text):
    1. *pSection = 0;
    2. ........
    В другом процессе либо создается отдельный поток, если данные надо читать постоянно (как в этом примере), либо просто в нужный момент проверяется состояние мьютекса (создается вместо события таким же образом):
    Код (Text):
    1. int ThreadProc(ULONG Param) {
    2. do {
    3. WaitForSingleObject(hEvent, INFINITE);
    4. // здесь читаем данные
    5. GlobalVar = *pSection;
    6. } while(1)}
     
  6. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    немного подумав пришел к выводу, что мне данный метод не подходит ... прошу подсказать вас какой нить другой вариант ... для этого немного подробнее расскажу о проге ...

    есть главный процесс кейлоггер, он инжектит код во все процессы, который перехватывает gethostbyname, и когда какое либо из приложений зашло на определенный сайт, ( т.е. резольвит его ), я должен передать главному процессу, свой хендл и имя окна, что бы он начал сбор нажатых кнопок, только с этого приложения ...

    при большом количестве приложений, я думаю будет труд или мб невозможно использовать разделенную память ...
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    SendMessage() с сообщением WM_COPYDATA.
     
  8. el-

    el- New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    89
    кусок кода можно ?
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    В MSDN'е есть. "Using Data Copy".
     
  10. Noble Ghost

    Noble Ghost New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2004
    Сообщения:
    204
    Адрес:
    Russia
    а как же пайпы? =)
     
  11. PE_Kill

    PE_Kill New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2006
    Сообщения:
    107
    Для текущей задачи пайпы организовывать нецелесообразно...