windows-nt/Source/XPSP1/NT/base/fs/utils/sigverif/walkpath.c
2020-09-26 16:20:57 +08:00

170 lines
6 KiB
C

//
// WALKPATH.C
//
#include "sigverif.h"
LPDIRNODE g_lpDirList = NULL;
LPDIRNODE g_lpDirEnd = NULL;
BOOL g_bRecurse = TRUE;
//
// This function takes a directory name and a search pattern and looks for all files mathching the pattern.
// If bRecurse is set, then it will add subdirectories to the end of the g_lpDirList for subsequent traversal.
//
// In this routine we allocate and fill in some of the lpFileNode values that we know about.
//
void FindFile(DIRNODE *lpDir, TCHAR *lpDirName, TCHAR *lpFileName)
{
DWORD dwRet;
BOOL bOk = TRUE;
HANDLE hFind;
LPFILENODE lpFileNode;
LPDIRNODE lpDirNode;
WIN32_FIND_DATA FindFileData;
// If the user clicked STOP, then bail immediately!
// If the directory is bogus, then skip to the next one.
if (!g_App.bStopScan && SetCurrentDirectory(lpDirName)) {
// If the user wants to look in subdirectories, then we need to find everything in the current directory
// and if it's a directory we want to add it to the end of the g_lpDirList.
if (g_bRecurse) {
hFind = FindFirstFile(TEXT("*.*"), &FindFileData);
if (hFind != INVALID_HANDLE_VALUE) {
bOk = TRUE;
while (bOk && !g_App.bStopScan) {
if (lstrcmp(FindFileData.cFileName, TEXT(".")) &&
lstrcmp(FindFileData.cFileName, TEXT("..")) &&
(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
lpDirNode = (LPDIRNODE) MALLOC(sizeof(DIRNODE));
if (lpDirNode) {
dwRet = GetFullPathName(FindFileData.cFileName, MAX_PATH, lpDirNode->DirName, 0);
if (!dwRet || dwRet >= MAX_PATH) {
GetShortPathName(lpDirName, lpDirNode->DirName, MAX_PATH);
GetFullPathName(FindFileData.cFileName, MAX_PATH, lpDirNode->DirName, 0);
SetCurrentDirectory(lpDirName);
}
}
g_lpDirEnd->next = lpDirNode;
g_lpDirEnd = lpDirNode;
}
bOk = FindNextFile(hFind, &FindFileData);
}
FindClose(hFind);
}
}
// We have added any subdirectories to the dir list, so now we can actually look for
// the lpFileName search pattern and start adding to the g_App.lpFileList.
hFind = FindFirstFile(lpFileName, &FindFileData);
if (hFind != INVALID_HANDLE_VALUE) {
bOk = TRUE;
// While there are more files to be found, keep looking in the directory...
while (bOk && !g_App.bStopScan) {
if (lstrcmp(FindFileData.cFileName, TEXT(".")) &&
lstrcmp(FindFileData.cFileName, TEXT("..")) &&
!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
//
// Allocate an lpFileNode, fill it in, and add it to the end of g_App.lpFileList
//
// We need to call CharLowerBuff on the file and dir names because
// the catalog files all contain lower-case names for the files.
//
lpFileNode = CreateFileNode(lpDirName, FindFileData.cFileName);
if (lpFileNode) {
if (!g_App.lpFileList)
g_App.lpFileList = lpFileNode;
else g_App.lpFileLast->next = lpFileNode;
g_App.lpFileLast = lpFileNode;
// Increment the total number of files we've found that meet the search criteria.
g_App.dwFiles++;
}
}
// Get the next file meeting the search pattern.
bOk = FindNextFile(hFind, &FindFileData);
}
FindClose(hFind);
}
}
// Free the memory allocated in the directory node.
lpDir = g_lpDirList;
g_lpDirList = g_lpDirList->next;
FREE(lpDir);
}
//
// Build an g_App.lpFileList given the user settings in the main dialog.
//
void BuildFileList(LPTSTR lpPathName)
{
TCHAR FileName[MAX_PATH];
TCHAR Extension[MAX_PATH];
LPTSTR lpFileName = FileName;
LPTSTR lpExtension = Extension;
LPDIRNODE lpDirNode;
// Check if this is a valid starting directory.
// If not, then pop up an error message.
if (!SetCurrentDirectory(lpPathName)) {
MyErrorBoxId(IDS_BADDIR);
return;
}
// If the "Include Subdirectories" is checked, then bRecurse is TRUE.
if (g_App.bSubFolders)
g_bRecurse = TRUE;
else g_bRecurse = FALSE;
// Get the search pattern from the resource or the user-specified string
if (g_App.bUserScan)
lstrcpy(lpFileName, g_App.szScanPattern);
else MyLoadString(lpFileName, IDS_ALL);
// Allocate the first entry in the g_lpDirList and set it to the
// current directory.
lpDirNode = (LPDIRNODE) MALLOC(sizeof(DIRNODE));
if (lpDirNode) {
lstrcpy(lpDirNode->DirName, lpPathName);
lpDirNode->next = NULL;
}
g_lpDirList = lpDirNode;
g_lpDirEnd = lpDirNode;
// Process the g_lpDirList as long as the user doesn't click STOP!
while (g_lpDirList && !g_App.bStopScan)
FindFile(g_lpDirList, g_lpDirList->DirName, lpFileName);
// Make sure all the memory allocated to the g_lpDirList is freed.
while (g_lpDirList) {
lpDirNode = g_lpDirList->next;
FREE(g_lpDirList);
g_lpDirList = lpDirNode;
}
// If there weren't any files found, then let the user know about it.
if (!g_App.lpFileList)
MyMessageBoxId(IDS_NOFILES);
}