• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Задача на поиск файлов

  • Автор темы Guest
  • Дата начала
G

Guest

У меня такая проблема. При запуске программы необходимо в определённой папке найти все DLL файлы, после чего загрузить их. Меня интересует только их поиск. Подскажите, пожалуйста, прототип функции, которая перечисляет все файлы одного расширения в одной папке (желательно и в подпапках). Заранее спасибо за ответ.
 
G

Guest

Спасибо за названия. Полные прототипы уже нашёл. Но прошу ответить и на следующие вопросы:
1. Как использовать WIN32_FIND_DATA (имя файла нужно указывать и в вызове функции, и в структуре, для чего?). Чем-то напоминает параметры в поиске, не правда ли?
2. А что за хэндл возвращает функция?
3. И собственно, откуда можно взять полное имя файла уже после поиска?
4. Как определить, когда найдены все файлы?
5. В подкаталогах файлы ищет, если нет, то как это сделать? <_<
Ламером прошу не считать, MSDN нету, на других сайтах ничего не смог найти. ;)
 
V

vital

msdn.microsoft.com
имя файла нужно указывать и в вызове функции, и в структуре, для чего?
В структуре не надо. Там просто поля в которых будет хранится данные о файле.
А что за хэндл возвращает функция?
файндферст возвращает хендл - указатель для двух других ф-й. Что бы они знали с чем работать. Очевидно же.
Как определить, когда найдены все файлы?
Написано в справке. файнднекст вернет фолс.
В подкаталогах файлы ищет, если нет, то как это сделать?
Рекурисей.
И собственно, откуда можно взять полное имя файла уже после поиска?
Путь известен заранее. Имя файла нахоится в структуре. В чем проблема?
Ламером прошу не считать

Считаю не то что Ламером - а тупым школьником. Ничего личного, но вы бы хоть потрудились посмотреть, то, что по по ссылке которую я привел выше.
 
G

Guest

Про школьника Вы правы - я ещё в 6-м классе. А за msdn и вообще за помощь большое спасибо. ;)
 
G

Guest

Извините, просто не заметил ссылку.

Добавлено: Спасибо огромное за ссылку, кое-что нашёл. Больше вопросов нет.
 
D

DarkKnight

При запуске программы необходимо в определённой папке найти все DLL файлы, после чего загрузить их.
А смысл грузить то чего не знаешь????
А если знаешь, то зачем искать тогда, просто подгружай?

Расскажи свою конечную цель то? ;-) Интересно очень :)
 
G

Guest

DLL файлы, которые нужно найти - это дополнения для одной маленькой игры, которую собираюсь написать. Когда найдена DLL, она загружается, после чего необходимо вызвать нечто вроде InitAddin (), и так далее. В гугле нашёл вот такой пример (если кому будет интересно):
C++:
typedef void (*LPSEARCHFUNC) (LPCTSTR lpszFileName);

BOOL SearchFiles (LPCTSTR lpszFileName, LPSEARCHFUNC lpSearchFunc, BOOL bInnerFolders = TRUE)
{
LPTSTR part;
char tmp[MAX_PATH]; // Временный массив
char name[MAX_PATH];
HANDLE hSearch = NULL;
WIN32_FIND_DATA wfd;
memset (&wfd, 0, sizeof (WIN32_FIND_DATA));
// Сначала поиск внутри вложенных папках ...
if (bInnerFolders)
{
if (GetFullPathName (lpszFileName, MAX_PATH, tmp, &part) == 0)
return FALSE;
strcpy (name, part);
strcpy (part, "*.*");
// Если папки существуют, то делаем поиск
wfd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
if (!((hSearch = FindFirstFile (tmp, &wfd)) == INVALID_HANDLE_VALUE))
do
{
// В каждой папке есть две папки с именами "." и ".."
// И эти папки мы не трогаем
// Пропускаем папки "." и ".."
if (!strncmp (wfd.cFileName, ".", 1) || !strncmp (wfd.cFileName, "..", 2))			
continue;		
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // Если мы нашли папку
{
char next[MAX_PATH];
if (GetFullPathName (lpszFileName, MAX_PATH, next, &part) == 0) 
return FALSE;
strcpy (part, wfd.cFileName);
strcat (next, "\\");
strcat (next, name);
SearchFiles (next, lpSearchFunc, TRUE);
}
}
while (FindNextFile (hSearch, &wfd)); // Ищем следующий файл
FindClose (hSearch); // Заканчиваем поиск
}
if ((hSearch = FindFirstFile (lpszFileName, &wfd)) == INVALID_HANDLE_VALUE) 
return TRUE; // В противном случае выходим
do
if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) // Если мы нашли файл
{
char file[MAX_PATH];
if (GetFullPathName (lpszFileName, MAX_PATH, file, &part) == 0) return FALSE;
strcpy (part, wfd.cFileName);
lpSearchFunc (file);
}
while (FindNextFile (hSearch, &wfd)); // ищем следующий файл
FindClose (hSearch); // заканчиваем поиск
return TRUE;
}
Что-то я не нашёл, где именно скачивать. А каков вообще размер MSDN? Больше 100 мб не смогу выкачать.
 
G

Guest

Извините, rrrFer, я не совсем понял следующее:
получается файл примерно такого содержимого:
чтобы отбросить лишнее читай про dir
чтобы получить в result.txt что-то вроде
нужно добавить аж 2 символа в программу ))
Объясните подробнее, пожалуйста.
Программа расширяется с помощью dll, при запуске происходит поиск библиотек в заданном каталоге и все найденные библиотеки загружаются.
Весьма полное определение.
 
G

Guest

А где взять справку windows и какого она размера?
 
G

Guest

Вот, нашёл ответ. Нужно добавить ключ /B после команды dir, вот так:
dir /B | findstr ".dll" > result.txt
У меня всё нормально работает.
 
G

Guest

Опять поднимаю вопрос про MSDN. Я нигде не нашёл кнопки для скачивания на msdn.microsoft.com. Подскажите прямую ссылку, пожалуйста. И ещё, какого размера MSDN для Visual C++ 6.0?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!