Annotation of mstools/samples/sdktools/image/drwatson/log.c, revision 1.1.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.