From 7b4cfbbb67d628f95bf4d82ffc0bff2338476617 Mon Sep 17 00:00:00 2001 From: vxunderground <57078196+vxunderground@users.noreply.github.com> Date: Sun, 17 Jul 2022 22:41:22 -0500 Subject: [PATCH] Create RecursiveFindFile.cpp --- Windows API/RecursiveFindFile.cpp | 224 ++++++++++++++++++++++++++++++ 1 file changed, 224 insertions(+) create mode 100644 Windows API/RecursiveFindFile.cpp diff --git a/Windows API/RecursiveFindFile.cpp b/Windows API/RecursiveFindFile.cpp new file mode 100644 index 0000000..7dc6ac6 --- /dev/null +++ b/Windows API/RecursiveFindFile.cpp @@ -0,0 +1,224 @@ +PVOID UserDefinedCallbackRoutineA(LPCSTR Path) +{ + return 0; +} + +BOOL UnusedSubroutineRecursiveFindFileMainA(LPCSTR Path, LPCSTR Pattern, PVOID pfnPathCombineW) +{ + typedef LPWSTR(WINAPI* PATHCOMBINEA)(LPCSTR, LPCSTR, LPCSTR); + PATHCOMBINEA PathCombineA = (PATHCOMBINEA)pfnPathCombineW; + + HANDLE HeapHandle = RfGetProcessHeap(); + 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; + + RfZeroMemory(szFullPattern, MAX_PATH); + if (PathCombineA(szFullPattern, Path, FindData.cFileName) == NULL) + goto EXIT_ROUTINE; + + UnusedSubroutineRecursiveFindFileMainA(szFullPattern, Pattern, PathCombineA); + } + + } 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 + { + RfZeroMemory(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(LPCSTR Path, LPCSTR Pattern) +{ + typedef LPWSTR(WINAPI* PATHCOMBINEA)(LPCSTR, LPCSTR, LPCSTR); + PATHCOMBINEA PathCombineA = NULL; + HMODULE hShlwapi = NULL; + BOOL bIsNewlyLoaded = FALSE; + BOOL bFlag = FALSE; + + hShlwapi = RfGetModuleHandleW(L"Shlwapi.dll"); + if (hShlwapi == NULL) + { + bIsNewlyLoaded = TRUE; + hShlwapi = LoadLibraryW(L"Shlwapi.dll"); + if (hShlwapi == NULL) + goto EXIT_ROUTINE; + } + + PathCombineA = (PATHCOMBINEA)RfGetProcAddressA((DWORD64)hShlwapi, "PathCombineW"); + if (PathCombineA == NULL) + goto EXIT_ROUTINE; + + bFlag = UnusedSubroutineRecursiveFindFileMainA(Path, Pattern, PathCombineA); + +EXIT_ROUTINE: + + if (hShlwapi != NULL) + FreeLibrary(hShlwapi); + + return bFlag; +} + +PVOID UserDefinedCallbackRoutineW(LPCWSTR Path) +{ + return 0; +} + +BOOL UnusedSubroutineRecursiveFindFileMainW(LPCWSTR Path, LPCWSTR Pattern, PVOID pfnPathCombineW) +{ + typedef LPWSTR(WINAPI* PATHCOMBINEW)(LPCWSTR, LPCWSTR, LPCWSTR); + PATHCOMBINEW PathCombineW = (PATHCOMBINEW)pfnPathCombineW; + + HANDLE HeapHandle = RfGetProcessHeap(); + 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; + + RfZeroMemory(szFullPattern, MAX_PATH); + if (PathCombineW(szFullPattern, Path, FindData.cFileName) == NULL) + goto EXIT_ROUTINE; + + UnusedSubroutineRecursiveFindFileMainW(szFullPattern, Pattern, PathCombineW); + } + + } 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 + { + RfZeroMemory(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(LPCWSTR Path, LPCWSTR Pattern) +{ + typedef LPWSTR(WINAPI* PATHCOMBINEW)(LPCWSTR, LPCWSTR, LPCWSTR); + PATHCOMBINEW PathCombineW = NULL; + HMODULE hShlwapi = NULL; + BOOL bIsNewlyLoaded = FALSE; + BOOL bFlag = FALSE; + + hShlwapi = RfGetModuleHandleW(L"Shlwapi.dll"); + if (hShlwapi == NULL) + { + bIsNewlyLoaded = TRUE; + hShlwapi = LoadLibraryW(L"Shlwapi.dll"); + if (hShlwapi == NULL) + goto EXIT_ROUTINE; + } + + PathCombineW = (PATHCOMBINEW)RfGetProcAddressA((DWORD64)hShlwapi, "PathCombineW"); + if (PathCombineW == NULL) + goto EXIT_ROUTINE; + + bFlag = UnusedSubroutineRecursiveFindFileMainW(Path, Pattern, PathCombineW); + +EXIT_ROUTINE: + + if (hShlwapi != NULL) + FreeLibrary(hShlwapi); + + return bFlag; +}