986 lines
25 KiB
C++
986 lines
25 KiB
C++
|
//
|
||
|
// This program was created to mirror the functions of the spiisupd.js file,
|
||
|
// but as a standalone EXE, due to problems with AV programs and wscript
|
||
|
// initialization during clean installs.
|
||
|
//
|
||
|
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <io.h>
|
||
|
#include <malloc.h>
|
||
|
#include <windows.h>
|
||
|
|
||
|
#include <ntverp.h>
|
||
|
|
||
|
|
||
|
#define countof( a ) ( sizeof( (a) ) / sizeof( (a)[ 0 ] ) )
|
||
|
|
||
|
CHAR BadString1[] = "\tdocument.write('<A HREF=\"' + urlresult + '\">' + displayresult + \"</a>\");";
|
||
|
/* fixed again to NewString9
|
||
|
CHAR NewString1[] = "\tdocument.write( '<A HREF=\"' + escape(urlresult) + '\">\' + displayresult + \"</a>\");";
|
||
|
*/
|
||
|
|
||
|
CHAR BadString2[] = " Response.Write \"?\" & Left(Request.QueryString, (lngPos - 1))";
|
||
|
CHAR NewString2[] = " Response.Write \"?\" & Server.HTMLEncode(Left(Request.QueryString, (lngPos - 1)))";
|
||
|
|
||
|
CHAR BadString13[] = "<%= Request.ServerVariables(\"HTTP_USER_AGENT\") %>";
|
||
|
CHAR NewString13[] = "<%= Server.HTMLEncode(Request.ServerVariables(\"HTTP_USER_AGENT\")) %>";
|
||
|
|
||
|
// fix query.asp by shipping its new version
|
||
|
// string 4, 5, 6, 7, 8 are from query.asp
|
||
|
/*
|
||
|
|
||
|
CHAR BadString4[] = " No documents matched the query <%=SearchString%>.<br><br>";
|
||
|
CHAR NewString4[] = " No documents matched the query <%=Server.HTMLEncode(SearchString)%>.<br><br>";
|
||
|
|
||
|
CHAR BadString5[] = "*<%=CompSearch%>*";
|
||
|
CHAR NewString5[] = "*<%=Server.HTMLEncode(CompSearch)%>*";
|
||
|
|
||
|
CHAR BadString6[] = " Session(\"SearchStringDisplay\")=SearchString";
|
||
|
CHAR NewString6[] = " Session(\"SearchStringDisplay\")=Server.HTMLEncode(SearchString)";
|
||
|
|
||
|
CHAR BadString7[] = " <INPUT TYPE=\"HIDDEN\" NAME=\"SearchString\" VALUE=\"<%=SearchString%>\">";
|
||
|
CHAR NewString7[] = " <INPUT TYPE=\"HIDDEN\" NAME=\"SearchString\" VALUE=\"<%=Server.HTMLEncode(SearchString)%>\">";
|
||
|
|
||
|
CHAR BadString8[] = "\t<UL><LI>Let us know about this <a href=\"mailto:iisdocs@microsoft.com?subject=<%=SearchString%>-search%20term%20not%20matched&body=The%20term%20'<%=SearchString%>'%20produced%20no%20matches.\">(mailto:iisdocs@microsoft.com)</a> so that we can improve Search in future releases.";
|
||
|
CHAR NewString8[] = "\t<UL><LI>Let us know about this <a href=\"mailto:iisdocs@microsoft.com?subject=<%=Server.HTMLEncode(SearchString)%>-search%20term%20not%20matched&body=The%20term%20'<%=Server.HTMLEncode(SearchString)%>'%20produced%20no%20matches.\">(mailto:iisdocs@microsoft.com)</a> so that we can improve Search in future releases.";
|
||
|
|
||
|
*/
|
||
|
|
||
|
//{ WinSE 26475: CSS bug in custom error pages
|
||
|
|
||
|
CHAR BadString9[] = "\tdocument.write( '<A HREF=\"' + escape(urlresult) + '\">' + displayresult + \"</a>\");";
|
||
|
CHAR NewString9[] = "\tInsertElementAnchor(urlresult, displayresult);";
|
||
|
|
||
|
CHAR InsertCodeBefore1[] = "//-->";
|
||
|
CHAR InsertCodeBefore2[] = "</script>";
|
||
|
|
||
|
CHAR InsertCode9[] =
|
||
|
"\r\n"
|
||
|
"function HtmlEncode(text)\r\n"
|
||
|
"{\r\n"
|
||
|
" return text.replace(/&/g, '&').replace(/'/g, '"').replace(/</g, '<').replace(/>/g, '>');\r\n"
|
||
|
"}\r\n"
|
||
|
"\r\n"
|
||
|
"function TagAttrib(name, value)\r\n"
|
||
|
"{\r\n"
|
||
|
" return ' '+name+'=\"'+HtmlEncode(value)+'\"';\r\n"
|
||
|
"}\r\n"
|
||
|
"\r\n"
|
||
|
"function PrintTag(tagName, needCloseTag, attrib, inner){\r\n"
|
||
|
" document.write( '<' + tagName + attrib + '>' + HtmlEncode(inner) );\r\n"
|
||
|
" if (needCloseTag) document.write( '</' + tagName +'>' );\r\n"
|
||
|
"}\r\n"
|
||
|
"\r\n"
|
||
|
"function URI(href)\r\n"
|
||
|
"{\r\n"
|
||
|
" IEVer = window.navigator.appVersion;\r\n"
|
||
|
" IEVer = IEVer.substr( IEVer.indexOf('MSIE') + 5, 3 );\r\n"
|
||
|
"\r\n"
|
||
|
" return (IEVer.charAt(1)=='.' && IEVer >= '5.5') ?\r\n"
|
||
|
" encodeURI(href) :\r\n"
|
||
|
" escape(href).replace(/%3A/g, ':').replace(/%3B/g, ';');\r\n"
|
||
|
"}\r\n"
|
||
|
"\r\n"
|
||
|
"function InsertElementAnchor(href, text)\r\n"
|
||
|
"{\r\n"
|
||
|
" PrintTag('A', true, TagAttrib('HREF', URI(href)), text);\r\n"
|
||
|
"}\r\n"
|
||
|
"\r\n";
|
||
|
|
||
|
|
||
|
//} WinSE 26475
|
||
|
|
||
|
//{ German fixes
|
||
|
CHAR BadGoto[] = " on error go to 0";
|
||
|
CHAR NewGoto[] = " on error goto 0";
|
||
|
|
||
|
CHAR BadThen[] = " If objASPError.ASPDescription > \"\" Then Response.Write Server.HTMLEncode(objASPError.ASPDescription) & \"<br>\"";
|
||
|
CHAR NewThen[] = " If objASPError.ASPDescription > \"\" Then\r\n\tResponse.Write Server.HTMLEncode(objASPError.ASPDescription) & \"<br>\"";
|
||
|
|
||
|
//}
|
||
|
|
||
|
//{ winse 29084: css fixes for admin/document pages
|
||
|
// these are partial lines
|
||
|
CHAR BadDoc1[] = "= Request(";
|
||
|
CHAR BadDoc2[] = "= Request.Form(";
|
||
|
CHAR BadDoc3[] = "= Request.QueryString(";
|
||
|
CHAR BadDoc4[] = "= Request.Cookies(";
|
||
|
CHAR BadDoc5[] = "=Request(";
|
||
|
CHAR BadDoc6[] = "=Request.Form(";
|
||
|
CHAR BadDoc7[] = "=Request.QueryString(";
|
||
|
CHAR BadDoc8[] = "=Request.Cookies(";
|
||
|
CHAR BadDoc9[] = "= request.QueryString(";
|
||
|
CHAR BadDoc10[] = "& Request.QueryString(";
|
||
|
CHAR BadDoc11[] = "Response.write Request.Querystring";
|
||
|
|
||
|
CHAR FixDocCall1[] = "= NoAngles(Request(";
|
||
|
CHAR FixDocCall2[] = "= NoAngles(Request.Form(";
|
||
|
CHAR FixDocCall3[] = "= NoAngles(Request.QueryString(";
|
||
|
CHAR FixDocCall4[] = "= NoAngles(Request.Cookies(";
|
||
|
#define FixDocCall5 FixDocCall1
|
||
|
#define FixDocCall6 FixDocCall2
|
||
|
#define FixDocCall7 FixDocCall3
|
||
|
#define FixDocCall8 FixDocCall4
|
||
|
#define FixDocCall9 FixDocCall3
|
||
|
CHAR FixDocCall10[] = "& NoAngles(Request.QueryString(";
|
||
|
CHAR FixDocCall11[] = ""; // delete this junk
|
||
|
|
||
|
CHAR FixDocCallEnd[] = ")"; // place it after original ")" after Request call
|
||
|
CHAR FixDocNewFuncName[] = "NoAngles(str)";
|
||
|
CHAR FixDocNewFunc[] = // place it at the end of the file if the above line isn't found in file
|
||
|
"\r\n<%\r\n"
|
||
|
"function NoAngles(str)\r\n"
|
||
|
" NoAngles = replace( replace(str, \"<\", \"\"), \">\", \"\")\r\n"
|
||
|
"end function\r\n"
|
||
|
"%>\r\n";
|
||
|
|
||
|
CHAR * DocFilesToFix[] = {
|
||
|
|
||
|
// file list is different for XP and Win2K, and NTOP
|
||
|
|
||
|
#if (VER_PRODUCTVERSION_W == 0x501)
|
||
|
|
||
|
// list for IIS 5.1 (WinXP)
|
||
|
"system32\\inetsrv\\iisadmpwd\\aexp2.asp",
|
||
|
"system32\\inetsrv\\iisadmpwd\\aexp2b.asp",
|
||
|
"system32\\inetsrv\\iisadmpwd\\aexp4.asp",
|
||
|
|
||
|
#elif (VER_PRODUCTVERSION_W == 0x400)
|
||
|
|
||
|
// list for IIS 4
|
||
|
"Help\\iis\\htm\\asp\\iiatmd1.asp",
|
||
|
"Help\\iis\\htm\\asp\\iiatmd2.asp",
|
||
|
"Help\\iis\\htm\\asp\\iiatmd3.asp",
|
||
|
"Help\\iis\\htm\\asp\\iiselect.asp",
|
||
|
"Help\\iis\\htm\\asp\\script1.asp",
|
||
|
"Help\\iis\\htm\\asp\\script1a.asp",
|
||
|
"Help\\iis\\htm\\tutorial\\script1.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\default.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iiaction.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iicache.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iichkpath.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iihdn.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iipop.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iipophd.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iirename.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iirtels.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iiscript.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iisess.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iiset.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iislider.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iistat.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\jsbrowser\\jsbrwpop.asp",
|
||
|
|
||
|
#else
|
||
|
|
||
|
// list for Win2K
|
||
|
"Help\\iisHelp\\iis\\htm\\asp\\iiatmd1.asp",
|
||
|
"Help\\iisHelp\\iis\\htm\\asp\\iiatmd2.asp",
|
||
|
"Help\\iisHelp\\iis\\htm\\asp\\iiatmd3.asp",
|
||
|
"Help\\iisHelp\\iis\\htm\\asp\\iiselect.asp",
|
||
|
"Help\\iisHelp\\iis\\htm\\tutorial\\script1.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\default.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iiaddnew.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iicache.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iicache2.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iichknname.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iichkpath.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iichkuser.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iihdn.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iipop.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iipophd.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iirename.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iiscript.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iisess.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iiset.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iislider.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\iistat.asp",
|
||
|
"system32\\inetsrv\\iisadmin\\jsbrowser\\jsbrwpop.asp",
|
||
|
|
||
|
#endif
|
||
|
NULL
|
||
|
};
|
||
|
|
||
|
//}
|
||
|
|
||
|
CHAR BadKanaler[] = "<h2><a name=\"H2_37780216\"><a name=\"channels\">Skapa dynamiska analer</a></a></h2>";
|
||
|
CHAR NewKanaler[] = "<h2><a name=\"H2_37780216\"><a name=\"channels\">Skapa dynamiska kanaler</a></a></h2>";
|
||
|
|
||
|
CHAR KanalerPath[ MAX_PATH ] = { '\0' };
|
||
|
|
||
|
|
||
|
void
|
||
|
LogMessage( CHAR *msg, ...)
|
||
|
{
|
||
|
static char buf[200];
|
||
|
va_list args;
|
||
|
va_start(args, msg);
|
||
|
vsprintf(buf, msg, args);
|
||
|
OutputDebugString(buf);
|
||
|
}
|
||
|
|
||
|
class TextFile {
|
||
|
|
||
|
public:
|
||
|
|
||
|
TextFile( void );
|
||
|
BOOL Open( CHAR * pszFileName );
|
||
|
BOOL GetLine( CHAR * pszBuffer, int cchBuffer );
|
||
|
void Close( void );
|
||
|
~TextFile();
|
||
|
|
||
|
private:
|
||
|
|
||
|
FILE * m_File;
|
||
|
BOOL m_fUnicode;
|
||
|
};
|
||
|
|
||
|
|
||
|
TextFile::TextFile( void )
|
||
|
{
|
||
|
m_File = NULL;
|
||
|
}
|
||
|
|
||
|
|
||
|
TextFile::~TextFile()
|
||
|
{
|
||
|
Close();
|
||
|
}
|
||
|
|
||
|
|
||
|
void
|
||
|
TextFile::Close( void )
|
||
|
{
|
||
|
if ( m_File != NULL ) {
|
||
|
|
||
|
fclose( m_File );
|
||
|
m_File = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
TextFile::Open(
|
||
|
CHAR * pszFileName
|
||
|
)
|
||
|
{
|
||
|
Close();
|
||
|
|
||
|
m_File = fopen( pszFileName, "rb" );
|
||
|
|
||
|
if ( m_File == NULL ) {
|
||
|
|
||
|
return( FALSE );
|
||
|
}
|
||
|
|
||
|
if (( fgetc( m_File ) == 0xFF ) &&
|
||
|
( fgetc( m_File ) == 0xFE )) {
|
||
|
|
||
|
m_fUnicode = TRUE;
|
||
|
}
|
||
|
else {
|
||
|
|
||
|
fseek( m_File, 0, SEEK_SET );
|
||
|
m_fUnicode = FALSE;
|
||
|
}
|
||
|
|
||
|
return( TRUE );
|
||
|
}
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
TextFile::GetLine( CHAR * pszBuffer, int cchBuffer )
|
||
|
{
|
||
|
int c = EOF;
|
||
|
int fSomethingRead = FALSE;
|
||
|
|
||
|
if (( m_File == NULL ) ||
|
||
|
( cchBuffer == 0 )) {
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
while ( cchBuffer > 1 ) {
|
||
|
|
||
|
c = fgetc( m_File );
|
||
|
|
||
|
if ( m_fUnicode && ( c != EOF )) {
|
||
|
|
||
|
c += ( fgetc( m_File ) << 8 );
|
||
|
}
|
||
|
|
||
|
if (( c == EOF ) || ( c == '\n' )) {
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if ( c == '\r' ) {
|
||
|
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
*pszBuffer++ = (CHAR) c;
|
||
|
cchBuffer--;
|
||
|
fSomethingRead = TRUE;
|
||
|
}
|
||
|
|
||
|
*pszBuffer = '\0';
|
||
|
|
||
|
if ( c == EOF ) {
|
||
|
|
||
|
return( fSomethingRead );
|
||
|
}
|
||
|
|
||
|
return( TRUE );
|
||
|
}
|
||
|
|
||
|
|
||
|
void
|
||
|
TrimString(
|
||
|
CHAR * StrLine
|
||
|
)
|
||
|
{
|
||
|
CHAR * StrOut = StrLine;
|
||
|
BOOL fQuoted = FALSE;
|
||
|
|
||
|
while ( *StrLine ) {
|
||
|
|
||
|
switch ( *StrLine ) {
|
||
|
|
||
|
case '"':
|
||
|
|
||
|
*StrOut++ = *StrLine++;
|
||
|
fQuoted = !fQuoted;
|
||
|
break;
|
||
|
|
||
|
case ' ':
|
||
|
case '\t':
|
||
|
|
||
|
if ( fQuoted ) {
|
||
|
|
||
|
*StrOut++ = *StrLine++;
|
||
|
}
|
||
|
|
||
|
else {
|
||
|
|
||
|
StrLine++;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case ';':
|
||
|
|
||
|
if ( fQuoted ) {
|
||
|
|
||
|
*StrOut++ = *StrLine++;
|
||
|
}
|
||
|
|
||
|
else {
|
||
|
|
||
|
*StrLine = '\0';
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case '\r':
|
||
|
case '\n':
|
||
|
|
||
|
*StrLine = '\0';
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
|
||
|
*StrOut++ = *StrLine++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*StrOut = '\0';
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
CHAR *
|
||
|
GetErrLocation(
|
||
|
CHAR * WinDir
|
||
|
)
|
||
|
{
|
||
|
CHAR filename[ MAX_PATH ];
|
||
|
|
||
|
strcpy( filename, WinDir );
|
||
|
strcat( filename, "\\inf\\iis.inf" );
|
||
|
|
||
|
CHAR FoundPath[ MAX_PATH ] = { '\0' };
|
||
|
|
||
|
TextFile objFile;
|
||
|
|
||
|
if ( objFile.Open( filename ) ) {
|
||
|
|
||
|
CHAR StrLine[ 3000 ];
|
||
|
BOOL SectionOpened = FALSE;
|
||
|
|
||
|
while ( objFile.GetLine( StrLine, sizeof( StrLine ))) {
|
||
|
|
||
|
TrimString( StrLine );
|
||
|
|
||
|
_strlwr( StrLine );
|
||
|
|
||
|
if ( ! SectionOpened ) {
|
||
|
|
||
|
if ( strcmp( StrLine, "[destinationdirs]" ) == 0 ) {
|
||
|
|
||
|
SectionOpened = TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
else {
|
||
|
|
||
|
if ( StrLine[ 0 ] == '[' ) {
|
||
|
|
||
|
SectionOpened = FALSE;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if ( strncmp( StrLine, "iisdoc_files_common=18,", 23 ) == 0 ) {
|
||
|
|
||
|
strcpy( FoundPath, StrLine + 23 );
|
||
|
}
|
||
|
|
||
|
if ( strncmp( StrLine, "iisdoc_files_asp=18,", 20 ) == 0 ) {
|
||
|
|
||
|
strcpy( KanalerPath, WinDir );
|
||
|
strcat( KanalerPath, "\\help\\" );
|
||
|
strcat( KanalerPath, StrLine + 20 );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
objFile.Close();
|
||
|
}
|
||
|
|
||
|
static CHAR szResult[ MAX_PATH ];
|
||
|
|
||
|
strcpy( szResult, WinDir );
|
||
|
strcat( szResult, "\\help\\" );
|
||
|
strcat( szResult, FoundPath );
|
||
|
|
||
|
return( szResult );
|
||
|
}
|
||
|
|
||
|
|
||
|
CHAR **
|
||
|
GetErrArray(
|
||
|
CHAR * WinDir
|
||
|
)
|
||
|
{
|
||
|
CHAR filename[ MAX_PATH ];
|
||
|
|
||
|
strcpy( filename, WinDir );
|
||
|
strcat( filename, "\\inf\\iis.inf" );
|
||
|
|
||
|
static CHAR * ArrayFiles[ 50 ];
|
||
|
|
||
|
int i = 0;
|
||
|
|
||
|
TextFile objFile;
|
||
|
|
||
|
if ( objFile.Open( filename ) ) {
|
||
|
|
||
|
CHAR StrLine[ 3000 ];
|
||
|
BOOL SectionOpened = FALSE;
|
||
|
|
||
|
while ( objFile.GetLine( StrLine, sizeof( StrLine ))) {
|
||
|
|
||
|
TrimString( StrLine );
|
||
|
|
||
|
_strlwr( StrLine );
|
||
|
|
||
|
if ( ! SectionOpened ) {
|
||
|
|
||
|
if ( strcmp( StrLine, "[iis_www_files_custerr]" ) == 0 ) {
|
||
|
|
||
|
SectionOpened = TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
else {
|
||
|
|
||
|
if ( StrLine[ 0 ] == '[' ) {
|
||
|
|
||
|
SectionOpened = FALSE;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
CHAR * Comma = strchr( StrLine, ',' );
|
||
|
|
||
|
if ( Comma != NULL ) {
|
||
|
|
||
|
*Comma = '\0';
|
||
|
|
||
|
if ( strcmp( StrLine, "htmla.htm" ) != 0 ) {
|
||
|
|
||
|
ArrayFiles[ i++ ] = _strdup( StrLine );
|
||
|
|
||
|
if ( i >= ( countof( ArrayFiles ) - 1 )) {
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
objFile.Close();
|
||
|
}
|
||
|
|
||
|
ArrayFiles[ i ] = NULL;
|
||
|
|
||
|
return ArrayFiles;
|
||
|
}
|
||
|
|
||
|
#define MATCHED( BadText ) \
|
||
|
\
|
||
|
(( LineLength == strlen( BadText )) && \
|
||
|
( strncmp( LineStart, BadText, strlen( BadText )) == 0 )) \
|
||
|
|
||
|
|
||
|
#define REPLACE( BadText, GoodText ) { \
|
||
|
\
|
||
|
int NetChange = int(strlen( GoodText ) - strlen( BadText )); \
|
||
|
int FileRemaining = int(FileEnd - LineEnd); \
|
||
|
\
|
||
|
memmove( LineEnd + NetChange, \
|
||
|
LineEnd, \
|
||
|
FileRemaining + 1 \
|
||
|
); \
|
||
|
\
|
||
|
memmove( LineStart, \
|
||
|
GoodText, \
|
||
|
strlen( GoodText ) \
|
||
|
); \
|
||
|
\
|
||
|
FileSize += NetChange; \
|
||
|
LineEnd += NetChange; \
|
||
|
FileEnd += NetChange; \
|
||
|
}
|
||
|
|
||
|
#define INSERT( NewText ) { \
|
||
|
\
|
||
|
int NetChange = int(strlen( NewText )); \
|
||
|
int FileRemaining = int(FileEnd - LineStart); \
|
||
|
\
|
||
|
memmove( LineStart + NetChange, \
|
||
|
LineStart, \
|
||
|
FileRemaining + 1 \
|
||
|
); \
|
||
|
\
|
||
|
memmove( LineStart, \
|
||
|
NewText, \
|
||
|
strlen( NewText ) \
|
||
|
); \
|
||
|
\
|
||
|
FileSize += NetChange; \
|
||
|
LineEnd += NetChange; \
|
||
|
FileEnd += NetChange; \
|
||
|
}
|
||
|
|
||
|
DWORD
|
||
|
ReadTargetFile(
|
||
|
CHAR * Base,
|
||
|
CHAR * Filename,
|
||
|
CHAR * buffer,
|
||
|
DWORD size)
|
||
|
{
|
||
|
DWORD fileSize=0;
|
||
|
DWORD readSize=0;
|
||
|
|
||
|
CHAR filename[ MAX_PATH ];
|
||
|
|
||
|
strcpy( filename, Base );
|
||
|
strcat( filename, "\\" );
|
||
|
strcat( filename, Filename );
|
||
|
|
||
|
LogMessage( "Reading :%s\n", filename );
|
||
|
|
||
|
FILE * objFile = fopen( filename, "rb" );
|
||
|
|
||
|
if ( objFile != NULL ) {
|
||
|
|
||
|
fileSize = _filelength( _fileno( objFile ));
|
||
|
|
||
|
if (( fileSize > 0 ) &&
|
||
|
( fileSize < size-2000 ) &&
|
||
|
( fileSize != -1L )) {
|
||
|
|
||
|
buffer[ fileSize ] = 0;
|
||
|
|
||
|
if ( fread( buffer, 1, fileSize, objFile ) == fileSize )
|
||
|
{
|
||
|
readSize = fileSize+1; // one byte for null terminator
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fclose(objFile);
|
||
|
}
|
||
|
|
||
|
return readSize;
|
||
|
}
|
||
|
|
||
|
|
||
|
bool
|
||
|
WriteTargetFile(
|
||
|
CHAR * Base,
|
||
|
CHAR * Filename,
|
||
|
CHAR * content,
|
||
|
DWORD size)
|
||
|
{
|
||
|
if (size == 0) return false;
|
||
|
size--; // exclude null terminator
|
||
|
|
||
|
CHAR filename[ MAX_PATH ];
|
||
|
|
||
|
strcpy( filename, Base );
|
||
|
strcat( filename, "\\" );
|
||
|
strcat( filename, Filename );
|
||
|
|
||
|
LogMessage( "Writing :%s\n", filename );
|
||
|
|
||
|
FILE *objFile = fopen( filename, "wb" );
|
||
|
|
||
|
if ( objFile != NULL ) {
|
||
|
|
||
|
fwrite( content, 1, size, objFile );
|
||
|
fclose( objFile );
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
else {
|
||
|
|
||
|
LogMessage( "Unable to open %s\n", filename );
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
bool
|
||
|
PatchFile(
|
||
|
CHAR * Base,
|
||
|
CHAR * Filename,
|
||
|
CHAR * BadStrings[],
|
||
|
CHAR * NewStrings[]
|
||
|
)
|
||
|
{
|
||
|
long FileSize;
|
||
|
CHAR FileBuffer[41000]; // max file to patch: 40K
|
||
|
|
||
|
FileSize = ReadTargetFile(Base, Filename, FileBuffer, sizeof(FileBuffer));
|
||
|
|
||
|
if (FileSize==0) return false;
|
||
|
|
||
|
BOOL FoundBad = FALSE;
|
||
|
int Insert9 = 0;
|
||
|
|
||
|
CHAR * LineStart = FileBuffer;
|
||
|
CHAR * FileEnd = FileBuffer + FileSize;
|
||
|
|
||
|
while ( LineStart < FileEnd )
|
||
|
{
|
||
|
|
||
|
while (( LineStart < FileEnd ) &&
|
||
|
(( *LineStart == '\r' ) || ( *LineStart == '\n' ))) {
|
||
|
|
||
|
LineStart++;
|
||
|
}
|
||
|
|
||
|
CHAR * LineEnd = LineStart;
|
||
|
|
||
|
while (( LineEnd < FileEnd ) &&
|
||
|
( *LineEnd != '\r' ) &&
|
||
|
( *LineEnd != '\n' )) {
|
||
|
|
||
|
LineEnd++;
|
||
|
}
|
||
|
|
||
|
if ( LineEnd < FileEnd )
|
||
|
{
|
||
|
|
||
|
DWORD LineLength = int(LineEnd - LineStart);
|
||
|
|
||
|
CHAR **Bad = BadStrings;
|
||
|
CHAR **New = NewStrings;
|
||
|
|
||
|
while (*Bad)
|
||
|
{
|
||
|
if ( MATCHED( *Bad ))
|
||
|
{
|
||
|
|
||
|
REPLACE( *Bad, *New );
|
||
|
|
||
|
FoundBad = TRUE;
|
||
|
|
||
|
// replacing bad strings #9 require us to insert function
|
||
|
if (*New == NewString9)
|
||
|
{
|
||
|
Insert9 |= 1;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
|
||
|
Bad++;
|
||
|
New++;
|
||
|
|
||
|
}
|
||
|
|
||
|
if (! *Bad)
|
||
|
{
|
||
|
// insert code at the end of script block, if we have code to insert
|
||
|
if (Insert9==1)
|
||
|
{
|
||
|
if ( MATCHED( InsertCodeBefore1 ) || MATCHED( InsertCodeBefore2 ) )
|
||
|
{
|
||
|
INSERT( InsertCode9 );
|
||
|
|
||
|
// flag as inserted
|
||
|
Insert9=2;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
LineStart = LineEnd;
|
||
|
}
|
||
|
|
||
|
if ( FoundBad )
|
||
|
{
|
||
|
return WriteTargetFile(Base, Filename, FileBuffer, FileSize);
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
bool
|
||
|
PatchFile2(
|
||
|
CHAR * Base,
|
||
|
CHAR * Filename,
|
||
|
CHAR * BadStrings[],
|
||
|
CHAR * NewStrings[],
|
||
|
CHAR * newStringAtEndCall,
|
||
|
CHAR * newFunctionName,
|
||
|
CHAR * newFunction
|
||
|
)
|
||
|
{
|
||
|
bool foundBad = false;
|
||
|
|
||
|
CHAR content[41000]; // max file size to patch: 40K
|
||
|
DWORD fileSize = ReadTargetFile(Base, Filename, content, sizeof(content));
|
||
|
|
||
|
if (fileSize==0) return false;
|
||
|
|
||
|
bool newFuncExists = (strstr(content, newFunctionName)!=NULL);
|
||
|
|
||
|
CHAR ** pBad = BadStrings;
|
||
|
CHAR ** pFix = NewStrings;
|
||
|
|
||
|
while (*pBad!=NULL)
|
||
|
{
|
||
|
int sizeOld = strlen( *pBad );
|
||
|
int sizeNew = strlen( *pFix );
|
||
|
int sizeDiff = sizeNew - sizeOld;
|
||
|
|
||
|
// scan through the whole content
|
||
|
char *p = content;
|
||
|
|
||
|
while ( (p=strstr(p, *pBad)) != NULL)
|
||
|
{
|
||
|
foundBad = true;
|
||
|
|
||
|
// replace old string with new string
|
||
|
memmove(p+sizeNew, p+sizeOld, fileSize-(p+sizeOld-content));
|
||
|
memmove(p, *pFix, sizeNew);
|
||
|
fileSize += sizeDiff;
|
||
|
|
||
|
p += sizeNew;
|
||
|
|
||
|
// if we have a newStringAtEndCall
|
||
|
// and we are not deleting this string (*pFix is empty string)
|
||
|
if (newStringAtEndCall && *newStringAtEndCall && **pFix)
|
||
|
{
|
||
|
char *pEndCall = strchr(p, ')');
|
||
|
|
||
|
if ( pEndCall )
|
||
|
{
|
||
|
// insert new string at end of function call
|
||
|
++pEndCall;
|
||
|
int sizeDiff = strlen(newStringAtEndCall);
|
||
|
memmove(pEndCall+sizeDiff, pEndCall, fileSize-(pEndCall-content));
|
||
|
memmove(pEndCall, newStringAtEndCall, sizeDiff);
|
||
|
fileSize += sizeDiff;
|
||
|
|
||
|
p = pEndCall+sizeDiff;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pBad++;
|
||
|
pFix++;
|
||
|
}
|
||
|
|
||
|
if (foundBad)
|
||
|
{
|
||
|
if (! newFuncExists)
|
||
|
{
|
||
|
strcat(content, newFunction);
|
||
|
fileSize += strlen(newFunction);
|
||
|
}
|
||
|
|
||
|
return WriteTargetFile(Base, Filename, content, fileSize);
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
int WINAPI
|
||
|
WinMain(
|
||
|
HINSTANCE hInstance,
|
||
|
HINSTANCE hPrevInstance,
|
||
|
LPSTR lpCmdLine,
|
||
|
int nShowCmd )
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
CHAR StrWINDIR[ MAX_PATH ];
|
||
|
|
||
|
GetEnvironmentVariable( "WINDIR",
|
||
|
StrWINDIR,
|
||
|
sizeof( StrWINDIR )
|
||
|
);
|
||
|
|
||
|
CHAR *BadStrings[20];
|
||
|
CHAR *NewStrings[20];
|
||
|
|
||
|
// == fixing custom error pages ==
|
||
|
#if !(VER_PRODUCTVERSION_W == 0x400)
|
||
|
|
||
|
BadStrings[0] = BadString1;
|
||
|
NewStrings[0] = NewString9;
|
||
|
BadStrings[1] = BadString2;
|
||
|
NewStrings[1] = NewString2;
|
||
|
BadStrings[2] = BadGoto;
|
||
|
NewStrings[2] = NewGoto;
|
||
|
BadStrings[3] = BadString9;
|
||
|
NewStrings[3] = NewString9;
|
||
|
BadStrings[4] = BadString13;
|
||
|
NewStrings[4] = NewString13;
|
||
|
BadStrings[5] = BadThen;
|
||
|
NewStrings[5] = NewThen;
|
||
|
BadStrings[6] = NULL;
|
||
|
|
||
|
CHAR * BasePath = GetErrLocation( StrWINDIR );
|
||
|
CHAR ** ArrayNames = GetErrArray( StrWINDIR );
|
||
|
|
||
|
LogMessage( "Processing %s\n", BasePath );
|
||
|
|
||
|
for ( i = 0; ArrayNames[ i ] != NULL; i++ ) {
|
||
|
|
||
|
__try {
|
||
|
|
||
|
PatchFile( BasePath, ArrayNames[ i ], BadStrings, NewStrings );
|
||
|
}
|
||
|
|
||
|
__except( EXCEPTION_EXECUTE_HANDLER ) {
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( KanalerPath[ 0 ] != '\0' ) {
|
||
|
|
||
|
BadStrings[0] = BadKanaler;
|
||
|
NewStrings[0] = NewKanaler;
|
||
|
BadStrings[1] = BadGoto;
|
||
|
NewStrings[1] = NewGoto;
|
||
|
BadStrings[2] = NULL;
|
||
|
|
||
|
LogMessage( "Processing %s\n", KanalerPath );
|
||
|
|
||
|
__try {
|
||
|
|
||
|
PatchFile( KanalerPath, "iiwacont.htm", BadStrings, NewStrings );
|
||
|
}
|
||
|
|
||
|
__except( EXCEPTION_EXECUTE_HANDLER ) {
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif // !(VER_PRODUCTVERSION_W == 0x400)
|
||
|
|
||
|
// fix query.asp by shipping its new version
|
||
|
/*
|
||
|
BadStrings[0] = BadString4;
|
||
|
NewStrings[0] = NewString4;
|
||
|
BadStrings[1] = BadString5;
|
||
|
NewStrings[1] = NewString5;
|
||
|
BadStrings[2] = BadString6;
|
||
|
NewStrings[2] = NewString6;
|
||
|
BadStrings[3] = BadString7;
|
||
|
NewStrings[3] = NewString7;
|
||
|
BadStrings[4] = BadString8;
|
||
|
NewStrings[4] = NewString8;
|
||
|
BadStrings[5] = NULL;
|
||
|
|
||
|
__try {
|
||
|
|
||
|
PatchFile( BasePath, "..\\iis\\misc\\query.asp", BadStrings, NewStrings );
|
||
|
}
|
||
|
|
||
|
__except( EXCEPTION_EXECUTE_HANDLER ) {
|
||
|
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
// == fixing asp help docs and admin pages ==
|
||
|
|
||
|
BadStrings[0] = BadDoc1;
|
||
|
NewStrings[0] = FixDocCall1;
|
||
|
BadStrings[1] = BadDoc2;
|
||
|
NewStrings[1] = FixDocCall2;
|
||
|
BadStrings[2] = BadDoc3;
|
||
|
NewStrings[2] = FixDocCall3;
|
||
|
BadStrings[3] = BadDoc4;
|
||
|
NewStrings[3] = FixDocCall4;
|
||
|
BadStrings[4] = BadDoc5;
|
||
|
NewStrings[4] = FixDocCall5;
|
||
|
BadStrings[5] = BadDoc6;
|
||
|
NewStrings[5] = FixDocCall6;
|
||
|
BadStrings[6] = BadDoc7;
|
||
|
NewStrings[6] = FixDocCall7;
|
||
|
BadStrings[7] = BadDoc8;
|
||
|
NewStrings[7] = FixDocCall8;
|
||
|
BadStrings[8] = BadDoc9;
|
||
|
NewStrings[8] = FixDocCall9;
|
||
|
BadStrings[9] = BadDoc10;
|
||
|
NewStrings[9] = FixDocCall10;
|
||
|
BadStrings[10] = BadDoc11;
|
||
|
NewStrings[10] = FixDocCall11;
|
||
|
BadStrings[11] = NULL;
|
||
|
|
||
|
for (CHAR **pDocFiles=DocFilesToFix; *pDocFiles; pDocFiles++)
|
||
|
{
|
||
|
__try {
|
||
|
|
||
|
PatchFile2( StrWINDIR, *pDocFiles, BadStrings, NewStrings, FixDocCallEnd, FixDocNewFuncName, FixDocNewFunc );
|
||
|
}
|
||
|
|
||
|
__except( EXCEPTION_EXECUTE_HANDLER ) {
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
LogMessage( "Done" );
|
||
|
|
||
|
return( 0 );
|
||
|
}
|