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

Discussion in 'WASM.BEGINNERS' started by el-, Oct 9, 2006.

  1. el-

    el- New Member

    Blog Posts:
    0
    Joined:
    Sep 14, 2006
    Messages:
    89
    есть процесс который получая определенную инфу из нета, должен передать другому процессу свой хенлд и имя окна ...

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

    gilg New Member

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

    el- New Member

    Blog Posts:
    0
    Joined:
    Sep 14, 2006
    Messages:
    89
    можно небольшой кусочек кода ... который поможет лучше мне разобратся ... т.к. я с разделяемой памятью никогда не работал ...
     
  4. n0name

    n0name New Member

    Blog Posts:
    0
    Joined:
    Jun 5, 2004
    Messages:
    4,336
    Location:
    Russia
    Code (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

    Blog Posts:
    0
    Joined:
    May 19, 2005
    Messages:
    527
    Что-то вроде этого.
    Вначале в одном из процессов инициализируется секция и событие:
    Code (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);
    Во втором процессе секция и событие открываются по имени:
    Code (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, работая как с обычной памятью:
    Code (Text):
    1. *pSection = 0;
    2. ........
    В другом процессе либо создается отдельный поток, если данные надо читать постоянно (как в этом примере), либо просто в нужный момент проверяется состояние мьютекса (создается вместо события таким же образом):
    Code (Text):
    1. int ThreadProc(ULONG Param) {
    2. do {
    3. WaitForSingleObject(hEvent, INFINITE);
    4. // здесь читаем данные
    5. GlobalVar = *pSection;
    6. } while(1)}
     
  6. el-

    el- New Member

    Blog Posts:
    0
    Joined:
    Sep 14, 2006
    Messages:
    89
    немного подумав пришел к выводу, что мне данный метод не подходит ... прошу подсказать вас какой нить другой вариант ... для этого немного подробнее расскажу о проге ...

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

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

    n0name New Member

    Blog Posts:
    0
    Joined:
    Jun 5, 2004
    Messages:
    4,336
    Location:
    Russia
    SendMessage() с сообщением WM_COPYDATA.
     
  8. el-

    el- New Member

    Blog Posts:
    0
    Joined:
    Sep 14, 2006
    Messages:
    89
    кусок кода можно ?
     
  9. n0name

    n0name New Member

    Blog Posts:
    0
    Joined:
    Jun 5, 2004
    Messages:
    4,336
    Location:
    Russia
    В MSDN'е есть. "Using Data Copy".
     
  10. Noble Ghost

    Noble Ghost New Member

    Blog Posts:
    0
    Joined:
    Apr 28, 2004
    Messages:
    204
    Location:
    Russia
    а как же пайпы? =)
     
  11. PE_Kill

    PE_Kill New Member

    Blog Posts:
    0
    Joined:
    Jan 16, 2006
    Messages:
    107
    Для текущей задачи пайпы организовывать нецелесообразно...