vxug-VXAPI/VX-API/RecursiveFindFile.cpp

182 lines
3.8 KiB
C++

#include "Win32Helper.h"
PVOID UserDefinedCallbackRoutineA(LPCSTR Path)
{
return 0;
}
BOOL UnusedSubroutineRecursiveFindFileMainA(LPCSTR Path, LPCSTR Pattern)
{
HANDLE HeapHandle = GetProcessHeapFromTeb();
CHAR szFullPattern[MAX_PATH] = { 0 };
WIN32_FIND_DATAA FindData = { 0 };
HANDLE FindHandle = INVALID_HANDLE_VALUE;
if (PathCombineA(szFullPattern, Path, "*") == NULL)
goto EXIT_ROUTINE;
FindHandle = FindFirstFileA(szFullPattern, &FindData);
if (FindHandle == INVALID_HANDLE_VALUE)
goto EXIT_ROUTINE;
do
{
if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (FindData.cFileName[0] == '.')
continue;
if (FindData.cFileName[0] == '$')
continue;
ZeroMemoryEx(szFullPattern, MAX_PATH);
if (PathCombineA(szFullPattern, Path, FindData.cFileName) == NULL)
goto EXIT_ROUTINE;
UnusedSubroutineRecursiveFindFileMainA(szFullPattern, Pattern);
}
} while (FindNextFileA(FindHandle, &FindData));
if (FindHandle)
FindClose(FindHandle);
if (PathCombineA(szFullPattern, Path, Pattern) == NULL)
goto EXIT_ROUTINE;
FindHandle = FindFirstFileA(szFullPattern, &FindData);
if (FindHandle == INVALID_HANDLE_VALUE)
goto EXIT_ROUTINE;
do
{
ZeroMemoryEx(szFullPattern, MAX_PATH);
if (!(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
if (PathCombineA(szFullPattern, Path, FindData.cFileName) == NULL)
goto EXIT_ROUTINE;
if (IsPathValidA(szFullPattern))
{
UserDefinedCallbackRoutineA(szFullPattern);
}
}
} while (FindNextFileA(FindHandle, &FindData));
if (FindHandle)
FindClose(FindHandle);
return TRUE;
EXIT_ROUTINE:
if (FindHandle)
FindClose(FindHandle);
return FALSE;
}
BOOL RecursiveFindFileA(_In_ LPCSTR Path, _In_ LPCSTR Pattern)
{
return UnusedSubroutineRecursiveFindFileMainA(Path, Pattern);
}
PVOID UserDefinedCallbackRoutineW(LPCWSTR Path)
{
return 0;
}
BOOL UnusedSubroutineRecursiveFindFileMainW(LPCWSTR Path, LPCWSTR Pattern)
{
HANDLE HeapHandle = GetProcessHeapFromTeb();
WCHAR szFullPattern[MAX_PATH] = { 0 };
WIN32_FIND_DATAW FindData = { 0 };
HANDLE FindHandle = INVALID_HANDLE_VALUE;
if (PathCombineW(szFullPattern, Path, L"*") == NULL)
goto EXIT_ROUTINE;
FindHandle = FindFirstFileW(szFullPattern, &FindData);
if (FindHandle == INVALID_HANDLE_VALUE)
goto EXIT_ROUTINE;
do
{
if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (FindData.cFileName[0] == '.')
continue;
if (FindData.cFileName[0] == '$')
continue;
ZeroMemoryEx(szFullPattern, MAX_PATH);
if (PathCombineW(szFullPattern, Path, FindData.cFileName) == NULL)
goto EXIT_ROUTINE;
UnusedSubroutineRecursiveFindFileMainW(szFullPattern, Pattern);
}
} while (FindNextFileW(FindHandle, &FindData));
if (FindHandle)
FindClose(FindHandle);
if (PathCombineW(szFullPattern, Path, Pattern) == NULL)
goto EXIT_ROUTINE;
FindHandle = FindFirstFileW(szFullPattern, &FindData);
if (FindHandle == INVALID_HANDLE_VALUE)
goto EXIT_ROUTINE;
do
{
ZeroMemoryEx(szFullPattern, MAX_PATH);
if (!(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
if (PathCombineW(szFullPattern, Path, FindData.cFileName) == NULL)
goto EXIT_ROUTINE;
if (IsPathValidW(szFullPattern))
{
UserDefinedCallbackRoutineW(szFullPattern);
}
}
} while (FindNextFileW(FindHandle, &FindData));
if (FindHandle)
FindClose(FindHandle);
return TRUE;
EXIT_ROUTINE:
if (FindHandle)
FindClose(FindHandle);
return FALSE;
}
BOOL RecursiveFindFileW(_In_ LPCWSTR Path, _In_ LPCWSTR Pattern)
{
HMODULE hShlwapi = NULL;
BOOL bIsNewlyLoaded = FALSE;
BOOL bFlag = FALSE;
hShlwapi = TryLoadDllMultiMethodW((PWCHAR)L"Shlwapi.dll");
if (hShlwapi == NULL)
goto EXIT_ROUTINE;
bFlag = UnusedSubroutineRecursiveFindFileMainW(Path, Pattern);
EXIT_ROUTINE:
if (hShlwapi != NULL)
FreeLibrary(hShlwapi);
return bFlag;
}