#ifdef RLWIN32 #include #else #ifdef RLWIN16 #include //#include //#else // DOS BUILD //#include #endif #endif // CRT includes #include #include #include #include #include #include #include //#include //#include #ifdef RLDOS #include "dosdefs.h" #else #include "windefs.h" #endif #include "commbase.h" #include "restok.h" #include "tokenapi.h" extern UCHAR szDHW[]; /** * Function: StripNewLine * Replaces new line characters with nulls * * Arguments: * sz, string to be stripped * * Returns: * nothing * * Error Codes: * none * * History: * 2/92, Implemented SteveBl * 10/92, Simplified to only check last char in non-empty string - DaveWi */ void StripNewLineA( CHAR *sz) { int i; if ( sz && (i = lstrlenA( sz)) > 0 ) { if ( sz[ --i] == '\n' ) { sz[i] = 0; } } } //..................................................... //... //... A Unicode NewLine is TEXT("\r\n") - two separate characters void StripNewLineW( LPWSTR sz) { int i = lstrlenW( sz); if ( i > 0 && sz[ --i] == TEXT('\n') ) { sz[i] = TEXT('\0'); if ( i > 0 && sz[ --i] == TEXT('\r') ) { sz[i] = TEXT('\0'); } } } //+------------------------------------------------------------------------- // // Function: IsExe, Public // // Synopsis: Determines if the specified file is an executable image file // // // Arguments: [szFileName] The name of the file to determine whether it is an exe // // // Effects: // // Returns: -1 Error Condition // NOTEXE File is not an exe // WIN16EXE File is a Win 16 exe // NTEXE File is a win 32 exe // UNKNOWEXE File is not a valid exe // // Modifies: // // History: // 10-Oct-92 Created TerryRu // // // Notes: // //-------------------------------------------------------------------------- int IsExe( CHAR *szFileName ) { static IMAGE_DOS_HEADER DosHeader; static IMAGE_OS2_HEADER ImageNeFileHdr; static IMAGE_FILE_HEADER ImageFileHdr; static IMAGE_OPTIONAL_HEADER ImageOptionalHdr; DWORD neSignature; FILE *fIn = NULL; WORD rc; if ( (fIn = FOPEN( szFileName, "rb")) == NULL ) { return ( -1 ); } if ( ResReadBytes( fIn, (char *)&DosHeader, sizeof( IMAGE_DOS_HEADER), NULL) == FALSE || (DosHeader.e_magic != IMAGE_DOS_SIGNATURE )) { FCLOSE( fIn); return( NOTEXE); } // 1st byte was a valid signature, and we were able to read a DOS Hdr // now seek to address of new exe header if ( fseek( fIn, DosHeader.e_lfanew, SEEK_SET)) { FCLOSE( fIn); return( NOTEXE); } // assume file is a Win 16 file, // Read the NT signature neSignature = (WORD) GetWord( fIn, NULL ); if ( neSignature == IMAGE_OS2_SIGNATURE ) { // return signature into input stream, // and read ne header as a whole UnGetWord( fIn, (WORD) neSignature, NULL ); if ( ResReadBytes( fIn, (char *)&ImageNeFileHdr, sizeof( IMAGE_OS2_HEADER), NULL) == FALSE ) { FCLOSE( fIn); return( NOTEXE); } // determine if file is a WIN 16 Image File if ( ImageNeFileHdr.ne_ver >= 4 && ImageNeFileHdr.ne_exetyp == 2 ) { FCLOSE( fIn); return( WIN16EXE); } } // not a win 16 exe, check for a NT exe. UnGetWord( fIn, (WORD) neSignature, NULL ); neSignature = GetdWord( fIn, NULL ); if ( neSignature == IMAGE_NT_SIGNATURE ) { if ( ResReadBytes( fIn, (char *)&ImageFileHdr, sizeof( IMAGE_FILE_HEADER), NULL) == FALSE ) { FCLOSE( fIn); return( NOTEXE); } if ( ImageFileHdr.SizeOfOptionalHeader ) { // read the optional header only to validate the ImageFileHeader // we currently don\'t use any info in the Optional Header if ( ImageFileHdr.SizeOfOptionalHeader > sizeof( IMAGE_OPTIONAL_HEADER ) ) { FCLOSE( fIn); return( NOTEXE); } if ( ResReadBytes( fIn, (char *)&ImageOptionalHdr, (size_t)min( sizeof( IMAGE_OPTIONAL_HEADER), ImageFileHdr.SizeOfOptionalHeader), NULL) == FALSE ) { FCLOSE( fIn); return( NOTEXE); } } // determine if file is an executable image file if ( (ImageFileHdr.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE) || (ImageFileHdr.Characteristics & IMAGE_FILE_DLL) ) { FCLOSE( fIn); return( NTEXE); } else { FCLOSE( fIn); return( NOTEXE); } } FCLOSE( fIn); // did not regonize signature type return( NOTEXE); } BOOL IsWin32Res( CHAR * szFileName) { BOOL fRC = FALSE; if ( IsRes( szFileName) ) { FILE *pF = fopen( szFileName, "rb"); if ( pF ) { DWORD dwSize = GetdWord( pF, NULL); fclose( pF); fRC = (dwSize == 0L) ? TRUE : FALSE; } else { fRC = FALSE; } } else { fRC = FALSE; } return( fRC); } //+------------------------------------------------------------------------- // // Function: IsRes, Public // // Synopsis: Determines if the specified file has a .RES extention. // // // Arguments: [szFileName] The name of the file to determine whether it is a res // // // Effects: // // Returns: TRUE, File has a .RES extention // FALSE, File does not have a .RES extention // // Modifies: // // History: // 16-Oct-92 Created TerryRu // // // Notes: // //-------------------------------------------------------------------------- BOOL IsRes( CHAR *szFileName) { int i = lstrlenA( szFileName); return( (i > 4 && lstrcmpiA( szFileName + i - 4, ".RES") == 0) ? TRUE : FALSE ); } /** * Function TranslateFileTime * Translates a Win32 filetime structure into a useful string * representation. * * Arguments: * sz, destination buffer (ANSI string) * ft, file time structure * * Returns: * sring representation of date/time in sz * * History: * 7/92 implemented SteveBl */ #ifdef RLWIN32 void TranslateFileTime(CHAR *sz, FILETIME ft) { sprintf(sz,"FILETIME STRUCTURE: %Lu:%Lu",ft.dwHighDateTime,ft.dwLowDateTime); } #endif /** * Function: SzDateFromFileName * Returns a string containing the time and date stamp on a file. * * Arguments: * sz, destination buffer * szFile, path to file * * Returns: * date and time in sz * * Error Codes: * none (but leaves sz empty) * * Comments: * Assumes sz is large enough for date string. * * History: * 2/92, Implemented SteveBl */ void SzDateFromFileName(CHAR *sz,CHAR *szFile) { #ifdef RLWIN32 HANDLE hFile; WCHAR szt[MAXFILENAME]; _MBSTOWCS( szt, szFile, WCHARSIN( sizeof( szt)), ACHARSIN( lstrlenA( szFile) + 1)); hFile = CreateFile( szt, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if ( hFile != (HANDLE)-1 ) { FILETIME ft; GetFileTime( hFile, NULL, NULL, &ft); TranslateFileTime( sz, ft); CloseHandle( hFile); } #else //RLWIN32 struct _stat s; if (!_stat(szFile,&s)) { sprintf(sz,"%s",ctime(&s.st_atime)); StripNewLine(sz); } else { sz[0] = 0; } #endif } //.......................................................................... #ifdef _DEBUG FILE * MyFopen( char * pszFileName, char * pszMode, char * pszFile, int nLine) #else FILE * MyFopen( char * pszFileName, char * pszMode) #endif { FILE *pfRC = NULL; //#ifdef _DEBUG // fprintf( stderr, "fopening \"%s\" at %d in %s", // pszFileName, // nLine, // pszFile); //#endif pfRC = fopen( pszFileName, pszMode); //#ifdef _DEBUG // fprintf( stderr, ": FILE ptr = %p\n", pfRC); //#endif return( pfRC); } //.......................................................................... #ifdef _DEBUG int MyClose( FILE **pf, char * pszFile, int nLine) #else int MyClose( FILE **pf) #endif { int nRC = 0; //#ifdef _DEBUG // fprintf( stderr, "\tclosing %p at %d in %s\n", *pf, nLine, pszFile); //#endif if ( *pf ) { nRC = fclose( *pf); *pf = NULL; } return( nRC); }