Как отдупить HANDLE от FindFirstFile? o_O

Тема в разделе "WASM.WIN32", создана пользователем _DEN_, 16 фев 2009.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    DuplicateHandle не работает, а ооооочень надо :dntknw:
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Это псевдохендл.
    Значение этого "хендла" - это адрес структуры в памяти размером 0x2C.
    В начале лежит реальный хендл директории.
    +0x14 лежит крит секция.
    Тебе нужно скопировать память + сдапить этот хендл.
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    edit: edit :)
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    n0name

    А чем выделять память чтобы FindClose потом сработал нормально?

    И как быть с критической секцией?
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    память в хипе выделяется.
    там структура RTL_CRITICAL_SECTION. Несколько я помню там есть хендл семафора.
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Код (Text):
    1.     struct fhandle
    2.     {
    3.         HANDLE handle;
    4.         char dummy[0x14 - sizeof(HANDLE)];
    5.         CRITICAL_SECTION cs;
    6.     };
    7.  
    8.     fhandle* org = reinterpret_cast<fhandle*>(find_handle); // Живой хендл
    9.     fhandle* dup = reinterpret_cast<fhandle*>(HeapAlloc(GetProcessHeap(), 0, sizeof(fhandle))); // Дуп
    10.     *dup = *org;
    11.  
    12.     DuplicateHandle(GetCurrentProcess(), org->handle, GetCurrentProcess(), &dup->handle, 0, 0, DUPLICATE_SAME_ACCESS);
    13.  
    14.     InitializeCriticalSection(&dup->cs);
    В дебаге работает, но в трейсе FindFirstFile выдает Unhandled exception at 0xfeeefeee in server.exe: 0xC0000005: Access violation reading location 0xfeeefeee.

    o_O

    edit: причем самая жость в том, что в оригинале dummy забит нулями.

    edit2: короче шаманство, есть стойкое ощущение что после критической секции есть еще какие-то данные.
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    n0name

    Вот. Все работает, только под трейсом ексепшен вылетает :dntknw: Есть идеи?

    Код (Text):
    1. HANDLE duplicate_find_handle(HANDLE src)
    2. {
    3.     struct find_handle
    4.     {
    5.         HANDLE directory;
    6.         char dummy[0x14 - sizeof(HANDLE)];
    7.         CRITICAL_SECTION section;
    8.     };
    9.  
    10.     find_handle* target = static_cast<find_handle*>(HeapAlloc(GetProcessHeap(), 0, sizeof(find_handle)));
    11.     find_handle* source = static_cast<find_handle*>(src);
    12.     *target = *source;
    13.     DuplicateHandle(GetCurrentProcess(), source->directory, GetCurrentProcess(), &target->directory, 0, 0, DUPLICATE_SAME_ACCESS);
    14.     InitializeCriticalSection(&target->section);
    15.     return target;
    16. }
     
  8. n0name

    n0name New Member

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

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Реальный размер структуры можно определить через
    HeapSize(GetProcessHeap(),0,(LPCVOID)src);
     
  10. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Mb выравнивание?
     
  11. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    n0name

    Увеличение памяти не помогло :dntknw:


    leo

    HeapSize(GetProcessHeap(),0,(LPCVOID)src) показал, что n0name не ошибся с размерами :dntknw:
     
  12. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    censored

    Видимо тоже нет.
     
  13. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Короче так. Просто запуск и в релиз и в дебаг сборке работает. Если же F5 (Start Debugging) - из FindFirstFile вылетает исключение, и в дебаге и в релизе.
     
  14. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    _DEN_
    find_handle содержит указатели (в области dummy). Нужно глубокое копирование.
    ----
    Код (Text):
    1. struct find_handle
    2. {
    3.     HANDLE directory;
    4.     DWORD_PTR unk1;
    5.  
    6.     void *pBuf;
    7.     DWORD cBuf;
    8.  
    9.     DWORD unk3;
    10.     CRITICAL_SECTION section;
    11. };
     
  15. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    green

    Сделал. Появилась новая проблема)

    Теперь все дорабатывает, падает в конце на FindClose;

    Скорее всего это потому что pBuf выделен не в хипе текущего процесса. Запрос HeapSize к нему оканчивается результатом -1. Как быть?

    edit: Стоп, по-моему - гон. Ща проверю...)
     
  16. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Фффуууххххх)) Заработало)) Щас приведу в порядок и откаменчу))

    n0name, leo, censored, green - спасибо вам, добрые люди :)
     
  17. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Радосте!11

    Код (Text):
    1. HANDLE duplicate_find_handle(HANDLE src)
    2. {
    3.     struct find_handle
    4.     {
    5.         HANDLE directory;
    6.         DWORD_PTR unk1;
    7.         void* pbuf;
    8.         DWORD cbuf;
    9.         DWORD unk3;
    10.         CRITICAL_SECTION section;
    11.     };
    12.    
    13.     find_handle* target = static_cast<find_handle*>(HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(find_handle)));
    14.     find_handle* source = static_cast<find_handle*>(src);
    15.  
    16.     if(source->unk1)
    17.     {
    18.         SIZE_T unk1_size = HeapSize(GetProcessHeap(), 0, reinterpret_cast<LPCVOID>(source->unk1));
    19.         target->unk1 = reinterpret_cast<DWORD_PTR>(HeapAlloc(GetProcessHeap(), 0, unk1_size));
    20.         std::memcpy(reinterpret_cast<void*>(target->unk1), reinterpret_cast<void const*>(source->unk1), unk1_size);
    21.     }
    22.  
    23.     if(source->pbuf)
    24.     {
    25.         target->pbuf = HeapAlloc(GetProcessHeap(), 0, source->cbuf);
    26.         std::memcpy(target->pbuf, source->pbuf, source->cbuf);
    27.     }
    28.  
    29.     target->cbuf = source->cbuf;
    30.     target->unk3 = source->unk3;
    31.     DuplicateHandle(GetCurrentProcess(), source->directory, GetCurrentProcess(), &target->directory, 0, 0, DUPLICATE_SAME_ACCESS);
    32.     InitializeCriticalSection(&target->section);
    33.     return target;
    34. }
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1. FINDFILE_HANDLE struct
    2. DirectoryHandle     HANDLE ?
    3. FindBufferBase      PVOID ?
    4. FindBufferNext      PVOID ?
    5. FindBufferLength    ULONG ?
    6. FindBufferValidLength   BOOLEAN ?
    7. FindBufferLock      RTL_CRITICAL_SECTION <>
    8. FINDFILE_HANDLE ends
    9. PFINDFILE_HANDLE typedef ptr FINDFILE_HANDLE