Это псевдохендл. Значение этого "хендла" - это адрес структуры в памяти размером 0x2C. В начале лежит реальный хендл директории. +0x14 лежит крит секция. Тебе нужно скопировать память + сдапить этот хендл.
n0name А чем выделять память чтобы FindClose потом сработал нормально? И как быть с критической секцией?
память в хипе выделяется. там структура RTL_CRITICAL_SECTION. Несколько я помню там есть хендл семафора.
Код (Text): struct fhandle { HANDLE handle; char dummy[0x14 - sizeof(HANDLE)]; CRITICAL_SECTION cs; }; fhandle* org = reinterpret_cast<fhandle*>(find_handle); // Живой хендл fhandle* dup = reinterpret_cast<fhandle*>(HeapAlloc(GetProcessHeap(), 0, sizeof(fhandle))); // Дуп *dup = *org; DuplicateHandle(GetCurrentProcess(), org->handle, GetCurrentProcess(), &dup->handle, 0, 0, DUPLICATE_SAME_ACCESS); InitializeCriticalSection(&dup->cs); В дебаге работает, но в трейсе FindFirstFile выдает Unhandled exception at 0xfeeefeee in server.exe: 0xC0000005: Access violation reading location 0xfeeefeee. o_O edit: причем самая жость в том, что в оригинале dummy забит нулями. edit2: короче шаманство, есть стойкое ощущение что после критической секции есть еще какие-то данные.
n0name Вот. Все работает, только под трейсом ексепшен вылетает Есть идеи? Код (Text): HANDLE duplicate_find_handle(HANDLE src) { struct find_handle { HANDLE directory; char dummy[0x14 - sizeof(HANDLE)]; CRITICAL_SECTION section; }; find_handle* target = static_cast<find_handle*>(HeapAlloc(GetProcessHeap(), 0, sizeof(find_handle))); find_handle* source = static_cast<find_handle*>(src); *target = *source; DuplicateHandle(GetCurrentProcess(), source->directory, GetCurrentProcess(), &target->directory, 0, 0, DUPLICATE_SAME_ACCESS); InitializeCriticalSection(&target->section); return target; }
n0name Увеличение памяти не помогло leo HeapSize(GetProcessHeap(),0,(LPCVOID)src) показал, что n0name не ошибся с размерами
Короче так. Просто запуск и в релиз и в дебаг сборке работает. Если же F5 (Start Debugging) - из FindFirstFile вылетает исключение, и в дебаге и в релизе.
_DEN_ find_handle содержит указатели (в области dummy). Нужно глубокое копирование. ---- Код (Text): struct find_handle { HANDLE directory; DWORD_PTR unk1; void *pBuf; DWORD cBuf; DWORD unk3; CRITICAL_SECTION section; };
green Сделал. Появилась новая проблема) Теперь все дорабатывает, падает в конце на FindClose; Скорее всего это потому что pBuf выделен не в хипе текущего процесса. Запрос HeapSize к нему оканчивается результатом -1. Как быть? edit: Стоп, по-моему - гон. Ща проверю...)
Фффуууххххх)) Заработало)) Щас приведу в порядок и откаменчу)) n0name, leo, censored, green - спасибо вам, добрые люди
Радосте!11 Код (Text): HANDLE duplicate_find_handle(HANDLE src) { struct find_handle { HANDLE directory; DWORD_PTR unk1; void* pbuf; DWORD cbuf; DWORD unk3; CRITICAL_SECTION section; }; find_handle* target = static_cast<find_handle*>(HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(find_handle))); find_handle* source = static_cast<find_handle*>(src); if(source->unk1) { SIZE_T unk1_size = HeapSize(GetProcessHeap(), 0, reinterpret_cast<LPCVOID>(source->unk1)); target->unk1 = reinterpret_cast<DWORD_PTR>(HeapAlloc(GetProcessHeap(), 0, unk1_size)); std::memcpy(reinterpret_cast<void*>(target->unk1), reinterpret_cast<void const*>(source->unk1), unk1_size); } if(source->pbuf) { target->pbuf = HeapAlloc(GetProcessHeap(), 0, source->cbuf); std::memcpy(target->pbuf, source->pbuf, source->cbuf); } target->cbuf = source->cbuf; target->unk3 = source->unk3; DuplicateHandle(GetCurrentProcess(), source->directory, GetCurrentProcess(), &target->directory, 0, 0, DUPLICATE_SAME_ACCESS); InitializeCriticalSection(&target->section); return target; }
Код (Text): FINDFILE_HANDLE struct DirectoryHandle HANDLE ? FindBufferBase PVOID ? FindBufferNext PVOID ? FindBufferLength ULONG ? FindBufferValidLength BOOLEAN ? FindBufferLock RTL_CRITICAL_SECTION <> FINDFILE_HANDLE ends PFINDFILE_HANDLE typedef ptr FINDFILE_HANDLE