SysListView32 и потоки

Тема в разделе "WASM.WIN32", создана пользователем 2FED, 24 апр 2008.

  1. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    В программе есть SysListView32, я внедряю в программу свою дллку и пытаюсь прочитать этот ListView, нахожу его хендл, потом читаю следующей процедурой
    Код (Text):
    1. DisplayFileName proc hList:dword
    2. LOCAL    lvi:LV_ITEM
    3. LOCAL    szBuff[256]:BYTE
    4. LOCAL count:dword
    5.     invoke  SendMessage,hList,LVM_GETITEMCOUNT,0,0
    6.     test    eax,eax
    7.     jz      exit
    8.     dec     eax
    9.     mov     count,eax
    10. next:
    11.     push    count
    12.     pop     lvi.iItem
    13.     mov     lvi.iSubItem, 1
    14.     mov     lvi.imask, LVIF_TEXT
    15.     lea     eax, szBuff
    16.     mov     lvi.pszText, eax
    17.     mov     lvi.cchTextMax, 256
    18.     invoke  SendMessage, hList, LVM_GETITEM, 0, addr lvi
    19.     invoke  MessageBox, NULL, addr szBuff,0, MB_OK
    20.     dec     count
    21.     cmp     count,0
    22.     jnz     next
    23. exit:
    24.          ret
    25. DisplayFileName endp
    Проблемма вот в чём, когда эта процедура вызывается из DllEntry она нормально читает список, но стоит вызвать её гдето в другом месте, например в обработчике перехваченой функции она выдаёт пустые масаджбоксы, самое главное количество месаджбоксов соответствует количеству элементов ListView, тоесть процедура выполняется правильно но вот текст почему то не читается, ещё он так же не читается если эту процедуру запустить из DllEntry в потоке(CreateThread) но есть запустить опять же из DllEntry но с использованием CreateRemoteThread,-1,... то будет работать, но если запустить вторым способом(CreateRemoteThread) из обработчика перехвата то опять выдаёт пустые масаджбоксы =(

    Я так понимаю это либо какаято защита либо дело в превилегиях потока, что это может быть?
     
  2. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    что за перехваченная ф-ция?
     
  3. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    та хотябы тот же SetWindowTextA
     
  4. SSS

    SSS New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2003
    Сообщения:
    12
    При использовании LVM_GETITEM, буфер LVITEM должен быть в адресном пространстве того же процесса, которому этот ListView пренадлежит, а LVM_GETITEMCOUNT отрабатывает всегда правильно потому, что результат возвращается в регистре.
     
  5. Novi4ek

    Novi4ek New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    317
    ну у него и в локальном новом потоке не работает вроде..
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    GetLastError?
     
  7. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    да какой эррор? в структуре указатель на текст ноль! выполняется в контексте процесса которому пренадлежит листвиев, яж писал
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    откуда я знаю, какой еррор, вот я и спрашиваю - какой?
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Да и вот это учесть не мешало бы.
     
  10. SSS

    SSS New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2003
    Сообщения:
    12
    А если lvi:LV_ITEM и szBuff[256]:BYTE сделать статическими (т.е. не на стеке). Не пробовал?
     
  11. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    SSS не пробовал, попробую, но наврядли поможет потому что у меня и в стек иногда читалась