home *** CD-ROM | disk | FTP | other *** search
- #include <windows.h>
-
- #define _PROTOTYP( func, parms ) func parms
- #define FILECOUNT 2
-
- CHAR * FileName[FILECOUNT] ;
- HANDLE hFile[FILECOUNT] ;
- HANDLE hFileMapping[FILECOUNT] ;
- CHAR * pView[FILECOUNT] ;
- FILETIME ftLastAccess[FILECOUNT], ftCreation[FILECOUNT], ftLastWrite[FILECOUNT] ;
-
- #ifdef _M_IX86
- #define K95_SIZE 1431552
- #define K95_OFFSET 0x14D4C0
- #define K95_PREBYTE ((CHAR)0x0)
- #define K95_POSTBYTE ((CHAR)0x88)
- #define K95DIAL_SIZE 739840
- #define K95DIAL_OFFSET 0xA0FA8
- #define K95DIAL_PREBYTE ((CHAR)0x0)
- #define K95DIAL_POSTBYTE ((CHAR)0x57)
- #else
- #ifdef _M_MPPC
- #define K95_SIZE 2049536
- #define K95_OFFSET 0x1C2CAB
- #define K95_PREBYTE ((CHAR)0x0)
- #define K95_POSTBYTE ((CHAR)0x0)
- #define K95DIAL_SIZE 1196544
- #define K95DIAL_OFFSET 0xFE280
- #define K95DIAL_PREBYTE ((CHAR)0x0)
- #define K95DIAL_POSTBYTE ((CHAR)0x0)
- #else
- #ifdef _M_ALPHA
- #define K95_SIZE 2371584
- #define K95_OFFSET 0x192C68
- #define K95_PREBYTE ((CHAR)0x46)
- #define K95_POSTBYTE ((CHAR)0x88)
- #define K95DIAL_SIZE 897024
- #define K95DIAL_OFFSET 0xB3CC8
- #define K95DIAL_PREBYTE ((CHAR)0x0)
- #define K95DIAL_POSTBYTE ((CHAR)0x25)
- #else
- PLATFORM NOT SUPPORTED
- #endif
- #endif
- #endif
-
- int FixIt = 0;
-
- char *zinptr=NULL;
- int zincnt=0, zoutcnt=0;
- char *zoutptr=NULL;
- void zdstuff(char c) {};
-
-
- int
- ckOpenFile(int i)
- {
- hFile[i] = CreateFile(
- FileName[i], // address of name of the file
- GENERIC_READ | GENERIC_WRITE,
- 0, // share mode
- NULL,// address of security descriptor
- OPEN_EXISTING, // how to create
- FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, // file attributes
- NULL // handle of file with attributes to copy
- );
-
- if ( !hFile[i] )
- return 0;
-
- GetFileTime( hFile[i], &ftCreation[i], &ftLastAccess[i], &ftLastWrite[i] ) ;
- hFileMapping[i] = CreateFileMapping( hFile[i],
- NULL,
- PAGE_READWRITE,
- 0,
- 0,
- NULL );
-
- pView[i] = (CHAR *) MapViewOfFile( hFileMapping[i],
- FILE_MAP_WRITE,
- 0,0,0);
-
- if ( !pView[i] )
- return 0;
- return 1;
- }
-
- int
- ckCloseFile( int i )
- {
- if (pView[i])
- UnmapViewOfFile( pView[i] ) ;
- if (hFileMapping[i])
- CloseHandle( hFileMapping[i] ) ;
- if (hFile[i])
- {
- SetFileTime( hFile[i], &ftCreation[i], &ftLastAccess[i], &ftLastWrite[i] ) ;
- CloseHandle( hFile[i] ) ;
- }
- return 1;
- }
-
- int
- SearchForRegBlock( int i )
- {
- CHAR * SearchString = "====758914360207174068160528073" ;
- int SearchStringLength = 136 ;
- int SearchLength = strlen(SearchString) ;
- BY_HANDLE_FILE_INFORMATION fileInfo ;
- CHAR * start = NULL, * prebug = NULL, * postbug = NULL ;
- ULONG prebugpos=0, postbugpos=0;
- CHAR * p = NULL ;
- int found = 0 ;
- ULONG k = 0 ;
-
- GetFileInformationByHandle( hFile[i], &fileInfo ) ;
-
- // We only search for the first null terminated portion of the search string
- // because we want to be able to find a pre-registered copy
-
- if ( !pView[i] )
- return 0 ;
-
- /* are the files the correct length? */
- switch ( i ) {
- case 0:
- if ( fileInfo.nFileSizeLow != K95_SIZE ) {
- printf("ERROR: Incorrect version of K95.EXE.\n");
- return(0);
- }
- break;
- case 1:
- if ( fileInfo.nFileSizeLow != K95DIAL_SIZE ) {
- printf("ERROR: Incorrect version of K95DIAL.EXE.\n");
- return(0);
- }
- break;
- }
-
- start = pView[i] ;
- p = pView[i] ;
- found = 0 ;
-
- while ( !found && k < fileInfo.nFileSizeLow )
- {
- LONG j = 0 ;
- if ( p[k] == SearchString[0] )
- {
- start = &p[k] ;
- for ( j = 0 ; j < SearchLength ; j++ )
- {
- if ( start[j] != SearchString[j] )
- break;
- }
- if ( j == SearchLength )
- found = 1 ;
- }
- k++ ;
- }
-
- if ( found )
- {
- prebug = start - 1;
- prebugpos = start - pView[i] - 1;
- postbug = start + SearchStringLength;
- postbugpos = start - pView[i] + SearchStringLength;
-
- printf("\nRegistration Block of %d bytes starts at %d (0x%X)\n",
- SearchStringLength,
- start - pView[i],
- start - pView[i]) ;
- printf(" Pre-Bug position: %d (0x%X) value: 0x%X\n",
- prebugpos,prebugpos,(CHAR)*prebug);
- printf("Post-Bug position: %d (0x%X) value: 0x%X\n",
- postbugpos,postbugpos,(CHAR)*postbug);
-
- switch ( i ) {
- case 0: /* K95 */
- if ( (prebugpos != K95_OFFSET - 1) ||
- (postbugpos != K95_OFFSET + SearchStringLength)) {
- printf("ERROR: Incorrect version of K95.EXE.\n");
- }
- else {
- if (*prebug == K95_PREBYTE && *postbug == K95_POSTBYTE)
- {
- printf("This version of K95.EXE does not contain the Patch bug.\n");
- }
- else {
- printf("This version of K95.EXE contains the Patch bug.");
- if ( FixIt ) {
- *prebug = K95_PREBYTE;
- *postbug = K95_POSTBYTE;
- printf(" REPAIRED");
- }
- else {
- printf("\nRun again with the /F switch to repair the bug.");
- }
- printf("\n");
- }
- }
- break;
- case 1: /* K95DIAL */
- if ( (prebugpos != K95DIAL_OFFSET - 1) ||
- (postbugpos != K95DIAL_OFFSET + SearchStringLength)) {
- printf("ERROR: Incorrect version of K95DIAL.EXE.\n");
- }
- else {
- if (*prebug == K95DIAL_PREBYTE && *postbug == K95DIAL_POSTBYTE)
- {
- printf("This version of K95DIAL.EXE does not contain the Patch bug.\n");
- }
- else {
- printf("This version of K95DIAL.EXE contains the Patch bug.");
- if ( FixIt ) {
- *prebug = K95DIAL_PREBYTE;
- *postbug = K95DIAL_POSTBYTE;
- printf(" REPAIRED");
- }
- else {
- printf("\nRun again with the /F switch to repair the bug.");
- }
- printf("\n");
- }
- }
- break;
- }
- }
- return found;
- }
-
-
- int
- main( int argc, char ** argv )
- {
- int dsn = 0 ;
- int i ;
-
- FileName[0] = "k95.exe" ;
- FileName[1] = "k95dial.exe" ;
-
- printf("This program corrects a bug in Kermit-95 Version 1.1.14\n");
- printf("introduced during the patch procedure from a previous release\n");
-
- if ( argc > 2 ||
- (argc == 2 && ((argv[1][0] != '-' && argv[1][0] != '/') ||
- (argv[1][1] != 'f' && argv[1][1] != 'F')))) {
- printf("ERROR: Usage %s [/F]\n", argv[0]);
- return(2);
- }
- else if ( argc == 2 ) {
- printf("Fix it mode turned on.\n\n");
- FixIt = 1 ;
- }
-
- for ( i=0 ; i < FILECOUNT ; i++ )
- {
- printf("Correcting %s if necessary ...\n",FileName[i]);
-
- hFile[i] = NULL ;
- hFileMapping[i] = NULL ;
- pView[i] = NULL ;
-
- if ( !ckOpenFile(i) )
- {
- printf("ERROR: Unable to open %s\n\n", FileName[i]) ;
- continue ;
- }
-
- if ( !SearchForRegBlock(i) )
- {
- // Registration Block not found.
- printf( "ERROR: %s skipped.\n", FileName[i] ) ;
- }
- else {
- printf("\n");
- }
- ckCloseFile(i) ;
-
- }
- return(0);
- }
-
-