windows-nt/Source/XPSP1/NT/inetsrv/iis/setup/util/dllhell/main.cpp
2020-09-26 16:20:57 +08:00

335 lines
9.6 KiB
C++

#include "main.h"
#include "depends.h"
#include "resource.h"
//
// Code by AaronL
// copied most of it from the depends source code.
//
//
// prototypes...
//
int __cdecl main(int ,char *argv[]);
void ShowHelp(void);
void ProcessManyFiles(char * szTheDir, char * szTheFileNameOrWildCard);
void ProcessOneFile(LPSTR szTempFileName);
void OutputToScreen(char * szTheString1, char * szTheString2);
//
// Globals
//
int g_Flag_R = FALSE;
HINSTANCE g_hModuleHandle = NULL;
#define ALL_FILES 0xff
//-------------------------------------------------------------------
// purpose: main
//-------------------------------------------------------------------
int __cdecl main(int argc,char *argv[])
{
LPSTR pArg = NULL;
LPSTR pCmdStart = NULL;
int argno;
int nflags=0;
char szTempFileName[MAX_PATH];
char szTempString[MAX_PATH];
szTempFileName[0] = '\0';
g_hModuleHandle = GetModuleHandle(NULL);
// process command line arguments
for(argno=1; argno<argc; argno++)
{
if ( argv[argno][0] == '-' || argv[argno][0] == '/' )
{
nflags++;
switch (argv[argno][1])
{
case 'r':
case 'R':
g_Flag_R = TRUE;
break;
case '?':
goto main_exit_with_help;
break;
}
} // if switch character found
else
{
if ( *szTempFileName == '\0' )
{
// if no arguments, then
strcpy(szTempFileName, argv[argno]);
}
} // non-switch char found
} // for all arguments
char szTheDriveOnly[_MAX_DRIVE];
char szTheDirOnly[_MAX_DIR];
char szTheFileNameOnly[_MAX_FNAME];
char szTheEXTOnly[_MAX_EXT];
char szTheFileNameAndExt[_MAX_FNAME + _MAX_EXT];
char szTheDriveAndDir[_MAX_PATH];
if (strcmp(szTempFileName, "") == 0)
{
goto main_exit_with_help;
}
_splitpath(szTempFileName, szTheDriveOnly, szTheDirOnly, szTheFileNameOnly, szTheEXTOnly);
sprintf(szTheFileNameAndExt, "%s%s", szTheFileNameOnly, szTheEXTOnly);
sprintf(szTheDriveAndDir, "%s%s", szTheDriveOnly, szTheDirOnly);
ProcessManyFiles(szTheDriveAndDir, szTheFileNameAndExt);
goto main_exit_gracefully;
main_exit_gracefully:
return TRUE;
main_exit_with_help:
ShowHelp();
return FALSE;
}
void ShowHelp()
{
char szModuleName[_MAX_PATH];
char szFilename_only[_MAX_FNAME];
char szMyBigString[255];
char szMyPrintString[255 + _MAX_PATH];
GetModuleFileName(NULL, szModuleName, _MAX_PATH);
// Trim off the filename only.
_tsplitpath(szModuleName, NULL, NULL, szFilename_only, NULL);
MyLoadString(IDS_STRING1, szMyBigString);
sprintf(szMyPrintString, szMyBigString, szFilename_only);
printf(szMyPrintString);
MyLoadString(IDS_STRING2, szMyBigString);
printf(szMyBigString);
MyLoadString(IDS_STRING3, szMyBigString);
sprintf(szMyPrintString, szMyBigString, szFilename_only);
printf(szMyPrintString);
MyLoadString(IDS_STRING4, szMyBigString);
sprintf(szMyPrintString, szMyBigString, szFilename_only);
printf(szMyPrintString);
return;
}
void ProcessOneFile(char * szTempFileName)
{
CDepends DependsStuff;
char szMyPrintString[_MAX_PATH + 50];
sprintf(szMyPrintString, "%s\r\n", (LPSTR) szTempFileName);
printf(szMyPrintString);
DependsStuff.SetInitialFilename(szTempFileName);
if (DependsStuff.m_fOutOfMemory)
{
char szMyBigString[_MAX_PATH + 50];
MyLoadString(IDS_STRING5, szMyBigString);
sprintf(szMyPrintString, szMyBigString, (LPSTR) szTempFileName);
printf(szMyPrintString);
}
// Display a message if the module contains a circular dependency error.
if (DependsStuff.m_fCircularError)
{
char szMyBigString[_MAX_PATH + 50];
MyLoadString(IDS_STRING6, szMyBigString);
sprintf(szMyPrintString, szMyBigString, (LPSTR) szTempFileName);
printf(szMyPrintString);
}
// Display a message if the module contains a mixed machine error.
if (DependsStuff.m_fMixedMachineError)
{
//sprintf(szMyPrintString, " MixedMachineError:%s\r\n", (LPSTR) szTempFileName);
//printf(szMyPrintString);
}
DependsStuff.LoopThruAndPrintLosers(DependsStuff.m_pModuleRoot);
DependsStuff.DeleteContents();
}
void ProcessManyFiles(char * szTheDir, char * szTheFileNameOrWildCard)
{
WIN32_FIND_DATA FindFileData;
char szTheFullMonty[_MAX_PATH];
char szTheRealWildcards[_MAX_PATH];
int iFoundWildCard = FALSE;
if (0 == strcmp(szTheDir, ""))
{
// if there is no specified directory
strcpy(szTheFullMonty, szTheFileNameOrWildCard);
}
else
{
// if there is a dir, check if ends with a '\'
// if it does, then kool, if it doesn't then add it.
// then tack them together
char *pTemp = NULL;
pTemp = strrchr(szTheDir, (int) '\\');
if (pTemp != NULL)
{
sprintf(szTheFullMonty, "%s%s", szTheDir, szTheFileNameOrWildCard);
}
else
{
sprintf(szTheFullMonty, "%s\\%s", szTheDir, szTheFileNameOrWildCard);
}
}
//printf(szTheFullMonty);printf("<--\n");
// if the fullmonty is a directory
// then we have a directory.
// get out.
int retCode = GetFileAttributes(szTheFullMonty);
if (retCode == 0xFFFFFFFF || (retCode & FILE_ATTRIBUTE_DIRECTORY))
{
// if there are wildcards in there, then
// let it come thru, if not get out.
char szFileNamePart[_MAX_FNAME];
char *pdest = NULL;
strcpy(szFileNamePart, szTheFileNameOrWildCard);
pdest = strrchr(szFileNamePart, (int) '?');
if (pdest != NULL)
{
iFoundWildCard = TRUE;
}
if (FALSE == iFoundWildCard)
{
pdest = NULL;
pdest = strrchr(szFileNamePart,(int) '*');
if (pdest != NULL)
{
iFoundWildCard = TRUE;
}
}
if (FALSE == iFoundWildCard)
{
return;
}
}
// if we have something which includes wildcards,
// then change it to *.*
if (TRUE == iFoundWildCard)
{
char szTheDriveOnly[_MAX_DRIVE];
char szTheDirOnly[_MAX_DIR];
char szTheFileNameOnly[_MAX_FNAME];
char szTheEXTOnly[_MAX_EXT];
char szTheFileNameAndExt[_MAX_FNAME + _MAX_EXT];
char szTheDriveAndDir[_MAX_PATH];
_splitpath(szTheFullMonty, szTheDriveOnly, szTheDirOnly, szTheFileNameOnly, szTheEXTOnly);
sprintf(szTheFileNameAndExt, "%s%s", szTheFileNameOnly, szTheEXTOnly);
sprintf(szTheDriveAndDir, "%s%s", szTheDriveOnly, szTheDirOnly);
printf(szTheFullMonty);
printf("\n");
printf(szTheFileNameAndExt);
printf("\n");
printf(szTheFileNameAndExt);
printf("\n");
}
HANDLE hFile = FindFirstFile(szTheFullMonty, &FindFileData);
if (hFile != INVALID_HANDLE_VALUE)
{
do {
//printf("=%s\n",FindFileData.cFileName);
if ( _tcsicmp(FindFileData.cFileName, _T(".")) != 0 && _tcsicmp(FindFileData.cFileName, _T("..")) != 0 )
{
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
// this is a directory, so let's skip it
// if it's supposed to recurse thru dirs, then let's go into it.
if (TRUE == g_Flag_R)
{
char szSubDir[_MAX_PATH];
_stprintf(szSubDir, _T("%s"), FindFileData.cFileName);
//printf("found dir=%s,filename=%s\n",szSubDir,szTheFileNameOrWildCard);
ProcessManyFiles(szSubDir, szTheFileNameOrWildCard);
}
}
else
{
// this is a file, so let's do something
char szTempFileName[_MAX_PATH];
if (0 == strcmp(szTheDir, ""))
{
// if there is no specified directory
strcpy(szTempFileName,FindFileData.cFileName);
}
else
{
char *pTemp = NULL;
pTemp = strrchr(szTheDir, (int) '\\');
if (pTemp != NULL)
{
sprintf(szTempFileName, "%s%s", szTheDir, FindFileData.cFileName);
}
else
{
sprintf(szTempFileName, "%s\\%s", szTheDir, FindFileData.cFileName);
}
}
// This is a file so lets act upon it.
ProcessOneFile(szTempFileName);
}
}
// get the next file
if ( !FindNextFile(hFile, &FindFileData) )
{
FindClose(hFile);
break;
}
} while (TRUE);
}
}
void OutputToScreen(char * szTheString1, char * szTheString2)
{
char szMyPrintString[_MAX_PATH + _MAX_PATH];
sprintf(szMyPrintString, szTheString1, szTheString2);
printf(szMyPrintString);
return;
}
void MyLoadString(int nID, char *szResult)
{
char buf[1024];
if (g_hModuleHandle == NULL) {return;}
if (LoadString(g_hModuleHandle, nID, buf, sizeof(buf)))
{strcpy(szResult, buf);}
return;
}