You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
282 lines
7.0 KiB
282 lines
7.0 KiB
//
|
|
// FILELIST.C
|
|
//
|
|
#include "sigverif.h"
|
|
|
|
LPTSTR
|
|
MyStrStr(
|
|
LPTSTR lpString,
|
|
LPTSTR lpSubString
|
|
)
|
|
{
|
|
if (!lpString || !lpSubString) {
|
|
return NULL;
|
|
}
|
|
|
|
return (StrStrI(lpString, lpSubString));
|
|
}
|
|
|
|
void
|
|
InsertFileNodeIntoList(
|
|
LPFILENODE lpFileNode
|
|
)
|
|
{
|
|
LPFILENODE lpTempNode = g_App.lpFileList;
|
|
LPFILENODE lpPrevNode = NULL;
|
|
INT iRet;
|
|
|
|
if (!lpFileNode) {
|
|
return;
|
|
}
|
|
|
|
if (!g_App.lpFileList) {
|
|
//
|
|
// Initialize the global file lists
|
|
//
|
|
g_App.lpFileList = lpFileNode;
|
|
g_App.lpFileLast = lpFileNode;
|
|
|
|
} else {
|
|
|
|
for(lpTempNode=g_App.lpFileList;lpTempNode;lpTempNode=lpTempNode->next) {
|
|
//
|
|
// Insert items sorted by directory and then filename
|
|
//
|
|
iRet = lstrcmp(lpTempNode->lpDirName, lpFileNode->lpDirName);
|
|
if (iRet == 0) {
|
|
//
|
|
// If the directory names match, key off the filename
|
|
//
|
|
iRet = lstrcmp(lpTempNode->lpFileName, lpFileNode->lpFileName);
|
|
}
|
|
|
|
if (iRet >= 0) {
|
|
|
|
if (!lpPrevNode) {
|
|
//
|
|
// Insert at the head of the list
|
|
//
|
|
lpFileNode->next = lpTempNode;
|
|
g_App.lpFileList = lpFileNode;
|
|
return;
|
|
|
|
} else {
|
|
//
|
|
// Inserting between lpPrevNode and lpTempNode
|
|
//
|
|
lpFileNode->next = lpTempNode;
|
|
lpPrevNode->next = lpFileNode;
|
|
return;
|
|
}
|
|
}
|
|
|
|
lpPrevNode = lpTempNode;
|
|
}
|
|
|
|
//
|
|
// There were no matches, so insert this item at the end of the list
|
|
//
|
|
g_App.lpFileLast->next = lpFileNode;
|
|
g_App.lpFileLast = lpFileNode;
|
|
}
|
|
}
|
|
|
|
BOOL
|
|
IsFileAlreadyInList(
|
|
LPTSTR lpDirName,
|
|
LPTSTR lpFileName
|
|
)
|
|
{
|
|
LPFILENODE lpFileNode;
|
|
|
|
CharLowerBuff(lpDirName, lstrlen(lpDirName));
|
|
CharLowerBuff(lpFileName, lstrlen(lpFileName));
|
|
|
|
for(lpFileNode=g_App.lpFileList;lpFileNode;lpFileNode=lpFileNode->next) {
|
|
|
|
if (!lstrcmp(lpFileNode->lpFileName, lpFileName) && !lstrcmp(lpFileNode->lpDirName, lpDirName)) {
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Free all the memory allocated in a single File Node.
|
|
//
|
|
void
|
|
DestroyFileNode(
|
|
LPFILENODE lpFileNode
|
|
)
|
|
{
|
|
if (!lpFileNode) {
|
|
return;
|
|
}
|
|
|
|
if (lpFileNode->lpFileName) {
|
|
FREE(lpFileNode->lpFileName);
|
|
}
|
|
|
|
if (lpFileNode->lpDirName) {
|
|
FREE(lpFileNode->lpDirName);
|
|
}
|
|
|
|
if (lpFileNode->lpVersion) {
|
|
FREE(lpFileNode->lpVersion);
|
|
}
|
|
|
|
if (lpFileNode->lpCatalog) {
|
|
FREE(lpFileNode->lpCatalog);
|
|
}
|
|
|
|
if (lpFileNode->lpSignedBy) {
|
|
FREE(lpFileNode->lpSignedBy);
|
|
}
|
|
|
|
if (lpFileNode->lpTypeName) {
|
|
FREE(lpFileNode->lpTypeName);
|
|
}
|
|
|
|
if (lpFileNode) {
|
|
FREE(lpFileNode);
|
|
lpFileNode = NULL;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Free all the memory allocated in the g_App.lpFileList.
|
|
//
|
|
void
|
|
DestroyFileList(
|
|
BOOL bClear
|
|
)
|
|
{
|
|
LPFILENODE lpFileNode;
|
|
|
|
while(g_App.lpFileList) {
|
|
|
|
lpFileNode = g_App.lpFileList->next;
|
|
DestroyFileNode(g_App.lpFileList);
|
|
g_App.lpFileList = lpFileNode;
|
|
}
|
|
|
|
g_App.lpFileLast = NULL;
|
|
|
|
if (bClear) {
|
|
g_App.dwFiles = 0;
|
|
g_App.dwSigned = 0;
|
|
g_App.dwUnsigned = 0;
|
|
}
|
|
}
|
|
|
|
LPFILENODE
|
|
CreateFileNode(
|
|
LPTSTR lpDirectory,
|
|
LPTSTR lpFileName
|
|
)
|
|
{
|
|
DWORD Err = ERROR_SUCCESS;
|
|
LPFILENODE lpFileNode;
|
|
TCHAR szDirName[MAX_PATH];
|
|
TCHAR szFullPathName[MAX_PATH];
|
|
FILETIME ftLocalTime;
|
|
WIN32_FILE_ATTRIBUTE_DATA faData;
|
|
BOOL bRet;
|
|
ULONG BufCbSize;
|
|
|
|
lpFileNode = (LPFILENODE) MALLOC(sizeof(FILENODE));
|
|
|
|
if (!lpFileNode) {
|
|
Err = ERROR_NOT_ENOUGH_MEMORY;
|
|
goto clean0;
|
|
}
|
|
|
|
BufCbSize = (lstrlen(lpFileName) + 1) * sizeof(TCHAR);
|
|
lpFileNode->lpFileName = (LPTSTR)MALLOC(BufCbSize);
|
|
|
|
if (!lpFileNode->lpFileName) {
|
|
Err = ERROR_NOT_ENOUGH_MEMORY;
|
|
goto clean0;
|
|
}
|
|
|
|
StringCbCopy(lpFileNode->lpFileName, BufCbSize, lpFileName);
|
|
CharLowerBuff(lpFileNode->lpFileName, lstrlen(lpFileNode->lpFileName));
|
|
|
|
if (lpDirectory) {
|
|
|
|
BufCbSize = (lstrlen(lpDirectory) + 1) * sizeof(TCHAR);
|
|
lpFileNode->lpDirName = (LPTSTR)MALLOC(BufCbSize);
|
|
|
|
if (!lpFileNode->lpDirName) {
|
|
Err = ERROR_NOT_ENOUGH_MEMORY;
|
|
goto clean0;
|
|
}
|
|
|
|
StringCbCopy(lpFileNode->lpDirName, BufCbSize, lpDirectory);
|
|
CharLowerBuff(lpFileNode->lpDirName, lstrlen(lpFileNode->lpDirName));
|
|
|
|
} else {
|
|
|
|
if (GetCurrentDirectory(cA(szDirName), szDirName) == 0) {
|
|
Err = GetLastError();
|
|
goto clean0;
|
|
}
|
|
|
|
CharLowerBuff(szDirName, lstrlen(szDirName));
|
|
|
|
BufCbSize = (lstrlen(szDirName) + 1) * sizeof(TCHAR);
|
|
lpFileNode->lpDirName = (LPTSTR)MALLOC(BufCbSize);
|
|
|
|
if (!lpFileNode->lpDirName) {
|
|
Err = ERROR_NOT_ENOUGH_MEMORY;
|
|
goto clean0;
|
|
}
|
|
|
|
StringCbCopy(lpFileNode->lpDirName, BufCbSize, szDirName);
|
|
CharLowerBuff(lpFileNode->lpDirName, lstrlen(lpFileNode->lpDirName));
|
|
}
|
|
|
|
//
|
|
// Store away the last access time for logging purposes.
|
|
//
|
|
if (SUCCEEDED(StringCchCopy(szFullPathName, cA(szFullPathName), lpFileNode->lpDirName)) &&
|
|
pSetupConcatenatePaths(szFullPathName, lpFileName, cA(szFullPathName), NULL)) {
|
|
|
|
ZeroMemory(&faData, sizeof(WIN32_FILE_ATTRIBUTE_DATA));
|
|
|
|
bRet = GetFileAttributesEx(szFullPathName, GetFileExInfoStandard, &faData);
|
|
if (bRet) {
|
|
|
|
FileTimeToLocalFileTime(&faData.ftLastWriteTime, &ftLocalTime);
|
|
FileTimeToSystemTime(&ftLocalTime, &lpFileNode->LastModified);
|
|
}
|
|
}
|
|
|
|
clean0:
|
|
|
|
if (Err != ERROR_SUCCESS) {
|
|
//
|
|
// If we get here then we weren't able to allocate all of the memory needed
|
|
// for this structure, so free up any memory we were able to allocate and
|
|
// reutrn NULL.
|
|
//
|
|
if (lpFileNode) {
|
|
|
|
if (lpFileNode->lpFileName) {
|
|
FREE(lpFileNode->lpFileName);
|
|
}
|
|
|
|
if (lpFileNode->lpDirName) {
|
|
FREE(lpFileNode->lpDirName);
|
|
}
|
|
|
|
FREE(lpFileNode);
|
|
}
|
|
|
|
lpFileNode = NULL;
|
|
}
|
|
|
|
SetLastError(Err);
|
|
return lpFileNode;
|
|
}
|