Annotation of mstools/samples/sdktools/image/drwatson/log.c, revision 1.1

1.1     ! root        1: /*++
        !             2: 
        !             3: Copyright (c) 1993  Microsoft Corporation
        !             4: 
        !             5: Module Name:
        !             6: 
        !             7:     log.c
        !             8: 
        !             9: Abstract:
        !            10: 
        !            11:     This file implements the access to the postmortem log file.
        !            12: 
        !            13: Author:
        !            14: 
        !            15:     Wesley Witt (wesw) 1-May-1993
        !            16: 
        !            17: Environment:
        !            18: 
        !            19:     User Mode
        !            20: 
        !            21: --*/
        !            22: 
        !            23: #include <windows.h>
        !            24: #include <stdlib.h>
        !            25: #include <stdio.h>
        !            26: #include <string.h>
        !            27: #include <stdarg.h>
        !            28: #include <commdlg.h>
        !            29: #include <direct.h>
        !            30: 
        !            31: #include "drwatson.h"
        !            32: #include "proto.h"
        !            33: #include "messages.h"
        !            34: #include "resource.h"
        !            35: 
        !            36: //
        !            37: // global variables for this module
        !            38: //
        !            39: static HANDLE  hFile = NULL;
        !            40: static HANDLE  hLogProtect = NULL;
        !            41: static DWORD   dwStartingPos = 0;
        !            42: 
        !            43: 
        !            44: void
        !            45: lprintf(DWORD dwFormatId, ...)
        !            46: 
        !            47: /*++
        !            48: 
        !            49: Routine Description:
        !            50: 
        !            51:     This is function is a printf style function for printing messages
        !            52:     in a message file.
        !            53: 
        !            54: Arguments:
        !            55: 
        !            56:     dwFormatId    - format id in the message file
        !            57:     ...           - var args
        !            58: 
        !            59: Return Value:
        !            60: 
        !            61:     None.
        !            62: 
        !            63: --*/
        !            64: 
        !            65: {
        !            66:     char        buf[1024];
        !            67:     DWORD       dwCount;
        !            68:     va_list     args;
        !            69: 
        !            70:     va_start( args, dwFormatId );
        !            71: 
        !            72:     dwCount = FormatMessage(
        !            73:                 FORMAT_MESSAGE_FROM_HMODULE,
        !            74:                 NULL,
        !            75:                 dwFormatId,
        !            76:                 0, // GetUserDefaultLangID(),
        !            77:                 buf,
        !            78:                 sizeof(buf),
        !            79:                 &args
        !            80:                 );
        !            81: 
        !            82:     Assert( dwCount != 0 );
        !            83: 
        !            84:     WriteFile( hFile, buf, dwCount, &dwCount, NULL );
        !            85: 
        !            86:     return;
        !            87: }
        !            88: 
        !            89: void
        !            90: lprintfs(char *format, ...)
        !            91: 
        !            92: /*++
        !            93: 
        !            94: Routine Description:
        !            95: 
        !            96:     This is function is a printf replacement that writes the output to
        !            97:     the DrWatson log file.
        !            98: 
        !            99: Arguments:
        !           100: 
        !           101:     format        - print format
        !           102:     ...           - var args
        !           103: 
        !           104: Return Value:
        !           105: 
        !           106:     None.
        !           107: 
        !           108: --*/
        !           109: 
        !           110: {
        !           111:     char    buf[1024];
        !           112:     DWORD   cb;
        !           113: 
        !           114:     va_list arg_ptr;
        !           115:     va_start(arg_ptr, format);
        !           116:     cb = _vsnprintf(buf, sizeof(buf), format, arg_ptr);
        !           117:     Assert( hFile != NULL );
        !           118:     WriteFile( hFile, buf, cb, &cb, NULL );
        !           119:     return;
        !           120: }
        !           121: 
        !           122: void
        !           123: OpenLogFile( char *szFileName, BOOL fAppend, BOOL fVisual )
        !           124: 
        !           125: /*++
        !           126: 
        !           127: Routine Description:
        !           128: 
        !           129:     Opens the DrWatson logfile for reading & writting.
        !           130: 
        !           131: Arguments:
        !           132: 
        !           133:     szFileName    - logfile name
        !           134:     fAppend       - append the new data to the end of the file or
        !           135:                     create a new file
        !           136:     fVisual       - visual notification
        !           137: 
        !           138: Return Value:
        !           139: 
        !           140:     None.
        !           141: 
        !           142: --*/
        !           143: 
        !           144: {
        !           145:     char   szName[1024];
        !           146: 
        !           147:     GetAppName( szName, sizeof(szName) );
        !           148:     strcat( szName, "LogProtect" );
        !           149: 
        !           150:     hLogProtect = OpenSemaphore( SEMAPHORE_MODIFY_STATE | SYNCHRONIZE, FALSE, szName);
        !           151:     if (hLogProtect == NULL) {
        !           152:         hLogProtect = CreateSemaphore( NULL, 0, 1, szName );
        !           153:         Assert( hLogProtect != NULL );
        !           154:     }
        !           155:     else {
        !           156:         WaitForSingleObject( hLogProtect, INFINITE );
        !           157:     }
        !           158: 
        !           159: openagain:
        !           160:     hFile = CreateFile( szFileName,
        !           161:                         GENERIC_WRITE | GENERIC_READ,
        !           162:                         FILE_SHARE_READ,
        !           163:                         NULL,
        !           164:                         fAppend ? OPEN_EXISTING : CREATE_ALWAYS,
        !           165:                         FILE_ATTRIBUTE_ATOMIC_WRITE,
        !           166:                         NULL
        !           167:                       );
        !           168: 
        !           169:     if (fAppend) {
        !           170:         if (hFile == INVALID_HANDLE_VALUE) {
        !           171:             //
        !           172:             // file does not exist, so lets create a new file
        !           173:             //
        !           174:             hFile = CreateFile( szFileName,
        !           175:                                 GENERIC_WRITE | GENERIC_READ,
        !           176:                                 FILE_SHARE_READ,
        !           177:                                 NULL,
        !           178:                                 CREATE_NEW,
        !           179:                                 FILE_ATTRIBUTE_ATOMIC_WRITE,
        !           180:                                 NULL
        !           181:                               );
        !           182:             if (hFile == INVALID_HANDLE_VALUE) {
        !           183:                 if (fVisual) {
        !           184:                     NonFatalError( LoadRcString(IDS_INVALID_LOGFILE) );
        !           185:                     _getcwd( szFileName, MAX_PATH );
        !           186:                     if (!BrowseForDirectory( szFileName )) {
        !           187:                         FatalError( LoadRcString(IDS_CANT_OPEN_LOGFILE) );
        !           188:                     }
        !           189:                     MakeLogFileName( szFileName );
        !           190:                     goto openagain;
        !           191:                 }
        !           192:                 else {
        !           193:                     ExitProcess( 1 );
        !           194:                 }
        !           195:             }
        !           196: 
        !           197:             //
        !           198:             // write the file banner
        !           199:             //
        !           200:             lprintfs( "\r\n" );
        !           201:             lprintf( MSG_BANNER );
        !           202:             lprintfs( "\r\n" );
        !           203:         }
        !           204: 
        !           205:         SetFilePointer( hFile, 0, 0, FILE_END );
        !           206:     }
        !           207:     else {
        !           208:         //
        !           209:         // write the file banner
        !           210:         //
        !           211:         lprintfs( "\r\n" );
        !           212:         lprintf( MSG_BANNER );
        !           213:         lprintfs( "\r\n" );
        !           214:     }
        !           215: 
        !           216:     Assert( hFile != INVALID_HANDLE_VALUE );
        !           217: 
        !           218:     dwStartingPos = SetFilePointer( hFile, 0, NULL, FILE_CURRENT );
        !           219: 
        !           220:     return;
        !           221: }
        !           222: 
        !           223: void
        !           224: CloseLogFile( void )
        !           225: 
        !           226: /*++
        !           227: 
        !           228: Routine Description:
        !           229: 
        !           230:     Closes the DrWatson logfile & releases the semaphore that
        !           231:     protects it.
        !           232: 
        !           233: Arguments:
        !           234: 
        !           235:     None.
        !           236: 
        !           237: Return Value:
        !           238: 
        !           239:     None.
        !           240: 
        !           241: --*/
        !           242: 
        !           243: {
        !           244:     CloseHandle( hFile );
        !           245:     ReleaseSemaphore( hLogProtect, 1, NULL );
        !           246:     CloseHandle( hLogProtect );
        !           247: }
        !           248: 
        !           249: char *
        !           250: GetLogFileData( PDWORD pdwLogFileDataSize )
        !           251: 
        !           252: /*++
        !           253: 
        !           254: Routine Description:
        !           255: 
        !           256:     Reads in all of the logfile data that has been written since it was
        !           257:     opened.  The data is placed into a buffer allocated by this function.
        !           258:     The caller is responsible for freeing the memory.
        !           259: 
        !           260: Arguments:
        !           261: 
        !           262:     pdwLogFileDataSize     -  pointer to a dword that contains the size
        !           263:                               in bytes of the data that is read.
        !           264: 
        !           265: Return Value:
        !           266: 
        !           267:     Valid character pointer to the logfile data
        !           268: 
        !           269:     NULL - could not read the data.
        !           270: 
        !           271: --*/
        !           272: 
        !           273: {
        !           274:     DWORD   dwCurrPos;
        !           275:     char    *p;
        !           276:     DWORD   size;
        !           277: 
        !           278: 
        !           279:     dwCurrPos = SetFilePointer( hFile, 0, NULL, FILE_CURRENT );
        !           280: 
        !           281:     *pdwLogFileDataSize = 0;
        !           282:     size = dwCurrPos - dwStartingPos;
        !           283: 
        !           284:     p = (char *) malloc( size );
        !           285:     if (p == NULL) {
        !           286:         return NULL;
        !           287:     }
        !           288: 
        !           289:     SetFilePointer( hFile, dwStartingPos, NULL, FILE_BEGIN );
        !           290: 
        !           291:     if (!ReadFile( hFile, p, size, &size, NULL )) {
        !           292:         free( p );
        !           293:         p = NULL;
        !           294:         size = 0;
        !           295:     }
        !           296: 
        !           297:     SetFilePointer( hFile, dwCurrPos, NULL, FILE_BEGIN );
        !           298: 
        !           299:     *pdwLogFileDataSize = size;
        !           300: 
        !           301:     return p;
        !           302: }
        !           303: 
        !           304: void
        !           305: MakeLogFileName( char *szName )
        !           306: 
        !           307: /*++
        !           308: 
        !           309: Routine Description:
        !           310: 
        !           311:     Concatinates the base logfile name on to the string passed in.
        !           312: 
        !           313: Arguments:
        !           314: 
        !           315:     szName                 -  buffer for the logfile name.
        !           316: 
        !           317: Return Value:
        !           318: 
        !           319:     None.
        !           320: 
        !           321: --*/
        !           322: 
        !           323: {
        !           324:     strcat( szName, "\\drwtsn32.log" );
        !           325: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.