|
|
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "utils.h"
// config.ini file should look like this:
// [sld_info]
// Input_Ini_FileName=test.ini
// Input_GUID={E66B49F6-4A35-4246-87E8-5C1A468315B5}
// Input_BuildTypeMask=819
// Input_Inf_FileName=iis.inf
// Input_Inf_CopySections=iis_doc_install
// Input_Inf_SubstitutionSection=inf_dirid_substitutions
// Output_AnsiFileName=sldinfo.txt
//
//[inf_dirid_substitutions]
//32768=%11%\inetsrv
//
/*
<RESOURCE ResTypeVSGUID="{E66B49F6-4A35-4246-87E8-5C1A468315B5}" BuildTypeMask="819" Name="File(819):"%18%\iisHelp\iis\htm\asp","IIS_aogu2wab.htm""> <PROPERTY Name="SrcName" Format="String">IIS_aogu2wab.htm </PROPERTY> <PROPERTY Name="DstPath" Format="String">%18%\iisHelp\iis\htm\asp </PROPERTY> <PROPERTY Name="DstName" Format="String">IIS_aogu2wab.htm </PROPERTY> <PROPERTY Name="NoExpand" Format="Boolean">0 </PROPERTY> </RESOURCE> */
typedef struct _ProcessSLDinfo { TCHAR Input_Ini_FileName[_MAX_PATH]; TCHAR Input_GUID[_MAX_PATH]; TCHAR Input_BuildTypeMask[_MAX_PATH]; TCHAR Input_Inf_FileName[_MAX_PATH]; TCHAR Input_Inf_CopySections[_MAX_PATH + _MAX_PATH + _MAX_PATH + _MAX_PATH]; TCHAR Input_Inf_SubstitutionSection[_MAX_PATH]; TCHAR Output_AnsiFileName[_MAX_PATH]; HINF hFileInf; HANDLE hFileOutput; } ProcessSLDinfo;
#define INIFILE_SECTION _T("SLD_INFO")
void ShowHelp(void); int ProcessParamFile(TCHAR *szFileName); int FillStructure(ProcessSLDinfo * MyInfo,TCHAR *szFileName); int ParseCommaDelimitedSectionDoSection(ProcessSLDinfo * MyInfo, LPTSTR szLine); int ProcessThisCopyFileSection(ProcessSLDinfo * MyInfo, LPTSTR szLine); int ParseCommaDelimitedSectionAndDoStuff(ProcessSLDinfo * MyInfo,LPTSTR szLine); int DoStuffWithThisSection(ProcessSLDinfo * MyInfo,LPTSTR szLine); int SearchThruKnownSectionForThisSection(ProcessSLDinfo * MyInfo, IN LPTSTR szSectionToMatch,OUT LPTSTR szReturnedDirInfo); int GimmieSubstituteNumber(ProcessSLDinfo * MyInfo, TCHAR * szOldNum, TCHAR * szReturnedString); int AppendToFile(HANDLE hFileOutput, TCHAR * szStringToAppend);
//***************************************************************************
//*
//* purpose: main
//*
//***************************************************************************
int __cdecl main(int argc,char *argv[]) { int iRet = 0; int argno; char * pArg = NULL; char * pCmdStart = NULL; TCHAR szFilePath1[_MAX_PATH]; TCHAR szFilePath2[_MAX_PATH]; TCHAR szParamString_C[_MAX_PATH];
int iDo_A = FALSE; int iDo_B = FALSE; int iDoVersion = FALSE; int iGotParamC = FALSE;
*szFilePath1 = '\0'; *szFilePath2 = '\0'; *szParamString_C = '\0'; _tcscpy(szFilePath1,_T("")); _tcscpy(szFilePath2,_T("")); _tcscpy(szParamString_C,_T("")); for(argno=1; argno<argc; argno++) { if ( argv[argno][0] == '-' || argv[argno][0] == '/' ) { switch (argv[argno][1]) { case 'a': case 'A': iDo_A = TRUE; break; case 'b': case 'B': iDo_B = TRUE; break; case 'v': case 'V': iDoVersion = TRUE; break; case 'c': case 'C': // Get the string for this flag
pArg = CharNextA(argv[argno]); pArg = CharNextA(pArg); if (*pArg == ':') { char szTempString[_MAX_PATH];
pArg = CharNextA(pArg);
// Check if it's quoted
if (*pArg == '\"') { pArg = CharNextA(pArg); pCmdStart = pArg; while ((*pArg) && (*pArg != '\"')){pArg = CharNextA(pArg);} } else { pCmdStart = pArg; while (*pArg){pArg = CharNextA(pArg);} } *pArg = '\0'; lstrcpyA(szTempString, StripWhitespace(pCmdStart));
// Convert to unicode
#if defined(UNICODE) || defined(_UNICODE)
MultiByteToWideChar(CP_ACP, 0, szTempString, -1, (LPWSTR) szParamString_C, _MAX_PATH); #else
_tcscpy(szParamString_C,szTempString); #endif
iGotParamC = TRUE; } break; case '?': goto main_exit_with_help; break; } } else { if (_tcsicmp(szFilePath1, _T("")) == 0) { // if no arguments, then get the filename portion
#if defined(UNICODE) || defined(_UNICODE)
MultiByteToWideChar(CP_ACP, 0, argv[argno], -1, (LPTSTR) szFilePath1, _MAX_PATH); #else
_tcscpy(szFilePath1,argv[argno]); #endif
} else { if (_tcsicmp(szFilePath2, _T("")) == 0) { // if no arguments, then get the filename portion
#if defined(UNICODE) || defined(_UNICODE)
MultiByteToWideChar(CP_ACP, 0, argv[argno], -1, (LPTSTR) szFilePath2, _MAX_PATH); #else
_tcscpy(szFilePath2,argv[argno]); #endif
} } } }
//
// Check what were supposed to do
//
if (TRUE == iDo_A || (FALSE == iDo_A && FALSE == iDo_B) ) { // check for required parameters
if (_tcsicmp(szFilePath1, _T("")) == 0) { _tprintf(_T("[-z] parameter missing filename1 parameter\n")); goto main_exit_with_help; }
// call the function.
iRet = ProcessParamFile(szFilePath1); if (FALSE == iRet) { iRet = 1; } else { iRet = 0; } }
if (iDo_B) { // do stuff
}
if (TRUE == iDoVersion) { // output the version
_tprintf(_T("1\n\n"));
iRet = 10; goto main_exit_gracefully; }
if (_tcsicmp(szFilePath1, _T("")) == 0) { goto main_exit_with_help; }
goto main_exit_gracefully; main_exit_gracefully: exit(iRet);
main_exit_with_help: ShowHelp(); exit(iRet); }
//***************************************************************************
//*
//* purpose: ?
//*
//***************************************************************************
void ShowHelp(void) { TCHAR szModuleName[_MAX_PATH]; TCHAR szFilename_only[_MAX_PATH];
// get the modules full pathed filename
if (0 != GetModuleFileName(NULL,(LPTSTR) szModuleName,_MAX_PATH)) { // Trim off the filename only.
_tsplitpath(szModuleName, NULL, NULL, szFilename_only, NULL); _tprintf(_T("Unicode File Utility\n\n")); _tprintf(_T("%s [-a] [-v] [-c:otherinfo] [drive:][path]filename1 [drive:][path]filename2\n\n"),szFilename_only); _tprintf(_T("[-a] paramter -- do stuff:\n")); _tprintf(_T(" -a required parameter for this functionality\n")); _tprintf(_T(" filename1 .ini file which controls what program should do\n")); _tprintf(_T("\n")); _tprintf(_T("Examples:\n")); _tprintf(_T("%s -a c:\\MyFileAnsi.ini\n"),szFilename_only); } return; }
int FillStructure(ProcessSLDinfo * MyInfo, TCHAR *szFileName) { int iReturn = FALSE; TCHAR buf[_MAX_PATH]; _tcscpy(buf,_T(""));
if (IsFileExist(szFileName) != TRUE) { goto FillStructure_Exit; }
// Input_GUID={E66B49F6-4A35-4246-87E8-5C1A468315B5}
// Input_BuildTypeMask=819
// Input_Inf_FileName=iis.inf
// Input_Inf_CopySections=iis_doc_install
// Input_Inf_SubstitutionSection=inf_dirid_substitutions
// Output_AnsiFileName=sldinfo.txt
_tcscpy(MyInfo->Input_Ini_FileName,szFileName);
GetPrivateProfileString(INIFILE_SECTION, _T("Input_GUID"), _T(""), buf, _MAX_PATH, szFileName); if (NULL == *buf) { _tprintf(_T("Entry missing:Input_GUID\n"),buf); goto FillStructure_Exit; }
_tcscpy(MyInfo->Input_GUID,buf); GetPrivateProfileString(INIFILE_SECTION, _T("Input_BuildTypeMask"), _T(""), buf, _MAX_PATH, szFileName); if (NULL == *buf) { _tprintf(_T("Entry missing:Input_BuildTypeMask\n"),buf); goto FillStructure_Exit; } _tcscpy(MyInfo->Input_BuildTypeMask,buf);
GetPrivateProfileString(INIFILE_SECTION, _T("Input_Inf_FileName"), _T(""), buf, _MAX_PATH, szFileName); if (NULL == *buf) { _tprintf(_T("Entry missing:Input_Inf_FileName\n"),buf); goto FillStructure_Exit; } else { DoExpandEnvironmentStrings(buf); } _tcscpy(MyInfo->Input_Inf_FileName,buf);
GetPrivateProfileString(INIFILE_SECTION, _T("Input_Inf_CopySections"), _T(""), buf, _MAX_PATH, szFileName); if (NULL == *buf) { _tprintf(_T("Entry missing:Input_Inf_CopySections\n"),buf); goto FillStructure_Exit; } _tcscpy(MyInfo->Input_Inf_CopySections,buf);
GetPrivateProfileString(INIFILE_SECTION, _T("Input_Inf_SubstitutionSection"), _T(""), buf, _MAX_PATH, szFileName); if (NULL == *buf) { _tprintf(_T("Entry missing:Input_Inf_SubstitutionSection\n"),buf); goto FillStructure_Exit; } _tcscpy(MyInfo->Input_Inf_SubstitutionSection,buf);
GetPrivateProfileString(INIFILE_SECTION, _T("Output_AnsiFileName"), _T(""), buf, _MAX_PATH, szFileName); if (NULL == *buf) { _tprintf(_T("Entry missing:Output_AnsiFileName\n"),buf); goto FillStructure_Exit; } _tcscpy(MyInfo->Output_AnsiFileName,buf);
iReturn = TRUE;
FillStructure_Exit: return iReturn; }
int ProcessParamFile(TCHAR *szFileName) { int iReturn = FALSE; ProcessSLDinfo MyInfo; LPTSTR pch = NULL; _tprintf(_T("ProcessParamFile:Start\n"));
// Check if there is a "\" in there.(since GetPrivateProfileString needs a fully qualified path)
pch = _tcschr(szFileName, _T('\\')); if (!pch || IsFileExist(szFileName) != TRUE) { TCHAR szCurrentDir[_MAX_PATH]; GetCurrentDirectory( _MAX_PATH, szCurrentDir); SetCurrentDirectory(szCurrentDir); AddPath(szCurrentDir,szFileName);
_tcscpy(szFileName,szCurrentDir); if (IsFileExist(szFileName) != TRUE) { _tprintf(_T("File %s, not found\n"),szFileName); goto ProcessParamFile_Exit; } }
// open the ini file
// and set all the parameters
iReturn = FillStructure(&MyInfo,szFileName); if (FALSE == iReturn) { _tprintf(_T("Missing required parameters from %s file\n"),szFileName); goto ProcessParamFile_Exit; }
// check if the inf filename exists....
if (IsFileExist(MyInfo.Input_Inf_FileName) != TRUE) { _tprintf(_T("File %s, not found\n"),MyInfo.Input_Inf_FileName); goto ProcessParamFile_Exit; }
_tprintf(_T("ProcessParamFile:ini=%s\n"),MyInfo.Input_Ini_FileName); _tprintf(_T("ProcessParamFile:inf=%s\n"),MyInfo.Input_Inf_FileName); _tprintf(_T("ProcessParamFile:output=%s\n"),MyInfo.Output_AnsiFileName);
// Open the .inf file
// and look for the specified section
// Get a handle to it.
MyInfo.hFileInf = SetupOpenInfFile(MyInfo.Input_Inf_FileName, NULL, INF_STYLE_WIN4, NULL); if(MyInfo.hFileInf == INVALID_HANDLE_VALUE) { _tprintf(_T("err opening file %s\n"),MyInfo.Input_Inf_FileName); goto ProcessParamFile_Exit; }
//
// okay now do the work for ONE copyfile section
//
// open the output file
// Create a new unicode file
MyInfo.hFileOutput = INVALID_HANDLE_VALUE; MyInfo.hFileOutput = CreateFile((LPCTSTR) MyInfo.Output_AnsiFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if( MyInfo.hFileOutput == INVALID_HANDLE_VALUE) { _tprintf(_T("Failure to create file %s\n"),MyInfo.Output_AnsiFileName); goto ProcessParamFile_Exit; }
// open list of copyfiles sections to get list of sections that we need to do....
ParseCommaDelimitedSectionDoSection(&MyInfo,MyInfo.Input_Inf_CopySections);
iReturn = TRUE;
ProcessParamFile_Exit:
if (INVALID_HANDLE_VALUE != MyInfo.hFileOutput) {CloseHandle(MyInfo.hFileOutput);MyInfo.hFileOutput = INVALID_HANDLE_VALUE;}
if (INVALID_HANDLE_VALUE != MyInfo.hFileInf) {SetupCloseInfFile(MyInfo.hFileInf);MyInfo.hFileInf = INVALID_HANDLE_VALUE;}
if (TRUE == iReturn) { _tprintf(_T("ProcessParamFile:Success! File=%s\n"),MyInfo.Output_AnsiFileName); } else { _tprintf(_T("ProcessParamFile:End FAILED\n")); }
return iReturn; }
// input is something like this:
// iisdoc_files_common_default,iisdoc_files_common_htmldocs,iisdoc_files_common_admsampdocs,etc...
// so we need to strtok thru this and act on every section that we process...
//
int ParseCommaDelimitedSectionDoSection(ProcessSLDinfo * MyInfo, LPTSTR szLine) { int iReturn = FALSE;
TCHAR *token = NULL; token = _tcstok(szLine, _T(",")); while (token != NULL) { ProcessThisCopyFileSection(MyInfo,token); token = _tcstok(NULL, _T(",")); }
return iReturn; }
int ProcessThisCopyFileSection(ProcessSLDinfo * MyInfo, LPTSTR szTheSection) { int iReturn = FALSE; BOOL bFlag = FALSE; INFCONTEXT Context; DWORD dwRequiredSize = 0; LPTSTR szLine = NULL;
if (FALSE == DoesThisSectionExist(MyInfo->hFileInf,szTheSection)) { _tprintf(_T("section %s, doesn't exist in %s\n"),szTheSection,MyInfo->Input_Inf_FileName); goto ProcessThisCopyFileSection_Exit; }
// go to the beginning of the section in the INF file
bFlag = SetupFindFirstLine(MyInfo->hFileInf,szTheSection, NULL, &Context); if (!bFlag) { goto ProcessThisCopyFileSection_Exit; }
// loop through the items in the section.
while (bFlag) { // get the size of the memory we need for this
bFlag = SetupGetLineText(&Context, NULL, NULL, NULL, NULL, 0, &dwRequiredSize);
// prepare the buffer to receive the line
szLine = (LPTSTR)GlobalAlloc( GPTR, dwRequiredSize * sizeof(TCHAR) ); if ( !szLine ) { _tprintf(_T("Failure to get memory\n")); goto ProcessThisCopyFileSection_Exit; } // get the line from the inf file1
if (SetupGetLineText(&Context, NULL, NULL, NULL, szLine, dwRequiredSize, NULL) == FALSE) { _tprintf(_T("SetupGetLineText Failed\n")); goto ProcessThisCopyFileSection_Exit; }
//print it out.
// should come back as:
// one big line...
//iisdoc_files_common_default,iisdoc_files_common_htmldocs,iisdoc_files_common_admsampdocs,etc...
// For each of these entries
// do something
ParseCommaDelimitedSectionAndDoStuff(MyInfo,szLine);
// find the next line in the section. If there is no next line it should return false
bFlag = SetupFindNextLine(&Context, &Context);
// free the temporary buffer
if (szLine) {GlobalFree(szLine);} szLine = NULL; iReturn = TRUE; }
ProcessThisCopyFileSection_Exit: if (szLine) {GlobalFree(szLine);szLine=NULL;} return iReturn; }
// input is something like this:
// iisdoc_files_common_default,iisdoc_files_common_htmldocs,iisdoc_files_common_admsampdocs,etc...
// so we need to strtok thru this and act on every section that we process...
//
int ParseCommaDelimitedSectionAndDoStuff(ProcessSLDinfo * MyInfo, LPTSTR szLine) { int iReturn = FALSE;
TCHAR *token = NULL; token = _tcstok(szLine, _T(",")); while (token != NULL) { DoStuffWithThisSection(MyInfo,token); token = _tcstok(NULL, _T(",")); }
return iReturn; }
int SearchThruKnownSectionForThisSection(ProcessSLDinfo * MyInfo, IN LPTSTR szSectionToMatch,OUT LPTSTR szReturnedDirInfo) { int iReturn = FALSE; INFCONTEXT Context; BOOL bFlag = FALSE; DWORD dwRequiredSize = 0; TCHAR szTempString1[_MAX_PATH] = _T(""); TCHAR szTempString2[_MAX_PATH] = _T(""); DWORD dwTemp = 0;
//[DestinationDirs]
//iisdoc_files_common = 18, iisHelp\common
//iisdoc_files_fonts = 20
//iisdoc_files_common_default = 18, iisHelp
// go to the beginning of the section in the INF file
bFlag = SetupFindFirstLine(MyInfo->hFileInf,_T("DestinationDirs"), szSectionToMatch, &Context); if (!bFlag) { goto SearchThruKnownSectionForThisSection_Exit; }
if (!SetupGetStringField(&Context, 1, szTempString1, _MAX_PATH, NULL)) { goto SearchThruKnownSectionForThisSection_Exit; }
// This string will come back something like
//-01,0xffff The directory from which the INF was installed.
//01 SourceDrive:\path.
//10 Windows directory.
//11 System directory. (%windir%\system on Windows 95, %windir%\system32 on Windows NT)
//12 Drivers directory.(%windir%\system32\drivers on Windows NT)
//17 INF file directory.
//18 Help directory.
//20 Fonts directory.
//21 Viewers directory.
//24 Applications directory.
//25 Shared directory.
//30 Root directory of the boot drive.
//50 %windir%\system
//51 Spool directory.
//52 Spool drivers directory.
//53 User Profile directory.
//54 Path to ntldr or OSLOADER.EXE
// if it's larger than 100 we probably don't know what it is
// and it's probably been user defined
_tcscpy(szReturnedDirInfo,szTempString1); dwTemp = _ttoi((LPCTSTR) szReturnedDirInfo); if (dwTemp >= 100) { if (FALSE == GimmieSubstituteNumber(MyInfo,szTempString1,szReturnedDirInfo)) { // Failed to lookup number!
_tprintf(_T("Failed find substitute for [%s] in section [%s] in file %s\n"),szTempString1,MyInfo->Input_Inf_SubstitutionSection,MyInfo->Input_Inf_FileName); } } else { _tcscpy(szReturnedDirInfo,_T("%")); _tcscat(szReturnedDirInfo,szTempString1); _tcscat(szReturnedDirInfo,_T("%")); }
if (TRUE == SetupGetStringField(&Context, 2, szTempString2, _MAX_PATH, NULL)) { _tcscat(szReturnedDirInfo,_T("\\")); _tcscat(szReturnedDirInfo,szTempString2); }
iReturn = TRUE;
SearchThruKnownSectionForThisSection_Exit: return iReturn; }
int GimmieSubstituteNumber(ProcessSLDinfo * MyInfo, TCHAR * szOldNum, TCHAR * szReturnedString) { int iReturn = FALSE; BOOL bFlag = FALSE; INFCONTEXT Context; TCHAR szTempString[_MAX_PATH] = _T(""); TCHAR szSectionToMatch[_MAX_PATH]; HINF hFileInfTemporary; _tcscpy(szTempString,_T(""));
_tcscpy(szReturnedString, _T("%")); _tcscat(szReturnedString, szOldNum); _tcscat(szReturnedString, _T("%"));
GetPrivateProfileString(MyInfo->Input_Inf_SubstitutionSection, szOldNum, _T(""), szTempString, _MAX_PATH, MyInfo->Input_Ini_FileName); if (NULL == *szTempString) { iReturn = FALSE; goto GimmieSubstituteNumber_Exit; } else { _tcscpy(szReturnedString, szTempString); } iReturn = TRUE;
GimmieSubstituteNumber_Exit: return iReturn; }
int DoStuffWithThisSection(ProcessSLDinfo * MyInfo, LPTSTR szInputLine) { int iReturn = FALSE; BOOL bFlag = FALSE; TCHAR szReturnedDirInfo[_MAX_PATH]; TCHAR szBigString[1000]; TCHAR szFileName1[_MAX_PATH]; DWORD dwRequiredSize = 0; INFCONTEXT Context; LPTSTR szLine = NULL; TCHAR szFileName[_MAX_PATH] = _T(""); TCHAR szFileNameRename[_MAX_PATH] = _T(""); if (FALSE == SearchThruKnownSectionForThisSection(MyInfo,szInputLine,szReturnedDirInfo)) { goto DoStuffWithThisSection_Exit; }
// Get the filename
// go to the beginning of the section in the INF file
bFlag = SetupFindFirstLine(MyInfo->hFileInf,szInputLine, NULL, &Context); if (!bFlag) { _tprintf(_T("Failed to find section for [%s] in %s\n"),szInputLine,MyInfo->Input_Inf_FileName); goto DoStuffWithThisSection_Exit; } while (bFlag) { if (!SetupGetStringField(&Context, 1, szFileName, _MAX_PATH, NULL)) { break; }
// see if there is a rename to field.
_tcscpy(szFileNameRename, _T("")); _tcscpy(szFileNameRename, szFileName); SetupGetStringField(&Context, 2, szFileNameRename, _MAX_PATH, NULL);
// Output this stuff an ansi file.
/*
<RESOURCE ResTypeVSGUID="{E66B49F6-4A35-4246-87E8-5C1A468315B5}" BuildTypeMask="819" Name="File(819):"%18%\iisHelp\iis\htm\adminsamples","contftp.htm""> <PROPERTY Name="SrcName" Format="String">IIS_contftp.htm</PROPERTY> <PROPERTY Name="DstPath" Format="String">%18%\iisHelp\iis\htm\adminsamples</PROPERTY> <PROPERTY Name="DstName" Format="String">contftp.htm</PROPERTY> <PROPERTY Name="NoExpand" Format="Boolean">0</PROPERTY> </RESOURCE> */
// --------------------
// Do RESOURCE END
// --------------------
_stprintf(szBigString, _T("<RESOURCE ResTypeVSGUID=\"%s\" BuildTypeMask=\"%s\" Name=\"File(%s):"%s","%s"\">"), MyInfo->Input_GUID, MyInfo->Input_BuildTypeMask, MyInfo->Input_BuildTypeMask, szReturnedDirInfo, szFileName); AppendToFile(MyInfo->hFileOutput, szBigString);
// --------------------
// Do SRCNAME PROPERTY
// --------------------
_stprintf(szBigString, _T("<PROPERTY Name=\"SrcName\" Format=\"String\">%s</PROPERTY>"),szFileNameRename); AppendToFile(MyInfo->hFileOutput, szBigString);
// --------------------
// Do DSTPATH PROPERTY
// --------------------
_stprintf(szBigString, _T("<PROPERTY Name=\"DstPath\" Format=\"String\">%s</PROPERTY>"),szReturnedDirInfo); AppendToFile(MyInfo->hFileOutput, szBigString);
// --------------------
// Do DSTNAME PROPERTY
// --------------------
_stprintf(szBigString, _T("<PROPERTY Name=\"DstName\" Format=\"String\">%s</PROPERTY>"),szFileName); AppendToFile(MyInfo->hFileOutput, szBigString);
// --------------------
// Do NOEXPAND PROPERTY
// --------------------
_stprintf(szBigString, _T("<PROPERTY Name=\"NoExpand\" Format=\"Boolean\">0</PROPERTY>")); AppendToFile(MyInfo->hFileOutput, szBigString);
// --------------------
// Do RESOURCE END
// --------------------
_stprintf(szBigString, _T("</RESOURCE>")); AppendToFile(MyInfo->hFileOutput, szBigString);
// find the next line in the section. If there is no next line it should return false
bFlag = SetupFindNextLine(&Context, &Context); }
iReturn = TRUE;
DoStuffWithThisSection_Exit: return iReturn; }
int AppendToFile(HANDLE hFileOutput, TCHAR * szStringToAppend) { int iReturn = FALSE; DWORD dwBytesWritten = 0;
if (hFileOutput) { if (WriteFile(hFileOutput,szStringToAppend,_tcslen(szStringToAppend),&dwBytesWritten,NULL)) { iReturn = TRUE; } else { _tprintf(_T("WriteFile FAILED:err=0x%x\n"),GetLastError()); } }
return iReturn; }
|