Проблема с чтение ListView чужого процесса

Тема в разделе "WASM.WIN32", создана пользователем ReMaker, 28 дек 2004.

  1. ReMaker

    ReMaker New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2004
    Сообщения:
    5
    Адрес:
    Russia
    Помогите плиз.

    Создаю область памяти.
    Код (Text):
    1. =====================================================================
    2. run CreateFileMappingA, 0FFFFFFFFh, 0, PAGE_READWRITE, 0, 256, 0
    3. mov [hMemory],eax
    4. run MapViewOfFile, hMemory, FILE_MAP_ALL_ACCESS, 0, 0, 0
    5. mov [pMemory],eax
    6. =====================================================================
    Заполняю структуру. LV_ITEM
    Код (Text):
    1.  
    2. =====================================================================
    3.  
    4.     mov eax, [pMemory]
    5.     add eax,8
    6.     mov dword ptr [eax],00h ;iSubItem
    7.     add eax,12
    8.     mov edx, [pMemory]
    9.     mov dword ptr [eax],edx ;pszText
    10.     add eax,4
    11.     mov dword ptr [eax],255 ;cchTextMax
    12. =====================================================================
    И посылаю сообщение процессу.
    Код (Text):
    1.  
    2. =====================================================================
    3. run SendMessageA, [desktop], LVM_GETITEMTEXT, 00h, [pMemory]
    4. =====================================================================
    Но почему-то он упорно возвращает только первые 20 символов, а где остальные непонятно.

    В чем фишка.
     
  2. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    я что-то не пойму, ты что, в саму структуру и получаешь текст?
     
  3. ReMaker

    ReMaker New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2004
    Сообщения:
    5
    Адрес:
    Russia
    В данном случии это неважно, эфект один и тот же если я передам в структуру другую область памяти. Я не могу понять почему в память передается только 20 символов.
     
  4. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    не знаю - попробовал быстренько - процесс с листбоксом вообще рушится... так ты пробовал писать не затирая структуру? может, функция пользуется ей в процессе? сделай файл длиннее, а в офсет запиши адрес сразу за структурой.
     
  5. ReMaker

    ReMaker New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2004
    Сообщения:
    5
    Адрес:
    Russia
    Все это уже пробовал непомогает. Здесь что-то другое.

    Проблема вроде в LVM_GETITEMTEXT, но что конкретно незнаю. Все отрабатывает без ошибок, но если текст длинее 20 символов SendMessageA возвращает, что передано 20 и в буфере строка в 20 символов и все. Может это вообще тупиковый вариант.
     
  6. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    система? у меня - 2к. я раньше только из текстовых боксов писал/читал и кнопки нажимал на чужих окнах :) и чето читал про невозможность получения данных из некоторых контролов других процессов... может, с этим связано? я запускаю LIstView из примеров масма, беру хэндл окна hList, посылаю ему сообщение из другого процесса, и оно валится. (хотя тоже непонятно - если это защита, то валиться должен как минимум вызывающий процесс, или получать отказ...)
     
  7. ReMaker

    ReMaker New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2004
    Сообщения:
    5
    Адрес:
    Russia
    Валится из за разности адресов в процессах. Но я передаю глобальный адрес и ничего невалится.

    Есть метод решение данной задачи через хук, но я бы хотел обойтись без него.
     
  8. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
  9. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    shoo

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



    И будет валиться! Во-первых, структура, в которой ты пишешь, что хочешь получить, должна жить в контексте того процесса, из которого ты хочешь забрать данные. Во-вторых, буфер, куда ты будешь читать текст, тоже должен жить в контексте того процесса, где твой ListView (это тебе не WM_GETTEXT, хотя я лично не догоняю, за каким факом MS не сделала _такими_ все сообщения). А в-третьих, маленькая, но очень волосатая 屁股 начнется тогда, когда ты попытаешься определить, сколько в ListView колонок. Большинство ListView'ов - контролы как контролы, но тот, который валяется на десктопе и показывает иконки, какой-то долбанутый. И которые в диалогах открытия и записи - тоже долбанутые (в XP, по крайней мере). Ну не умеют в Microsoft, чтобы ни разу не выдрючиться!
     
  10. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine


    да вот об этом я и думал - как быть с глобальностью адреса: если это MMF, то его нужно тоже открыть в "том" процессе. вобщем, нужно, наверное, там поток создать, и через него связь держать. а GlobalAlloc/GlobalLock не подойдет, интересно?



    попробовал GlobalAlloc - ниче пока не считал, но и не завалил, но сегодня уже все ;)
     
  11. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Не завалил видимо потому, что в чужом процессе хип тоже есть :)
     
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    shoo

    Внедряешься через RemoteThread или подгужая DLL в нужный процесс и вперёд
     
  13. ReMaker

    ReMaker New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2004
    Сообщения:
    5
    Адрес:
    Russia
    Через внедрение это просто. А вот как через Map.

    Нашел почему возвращает 20 символов. Все дело в Map'е, почемуто распределяется только 20 байт.

    Какие вообще есть подводные камни при работе с Map'ом
     
  14. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    через Мар нужно в "том" процессе открыть этот же Мар, видимо, дополнительным потоком...

    кстати, провел лаб работу по GlobalAlloc - все вроде бы и глобал, и фиксед - а болт! из разных процессов друг друга не видят - значит, нужно либо Мар, либо Пип ;)



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

    [​IMG] _1633940080__intercom.zip