/*++ Copyright (c) 1989 Microsoft Corporation Module Name: Log.c Abstract: none. Author: Shishir Pardikar [Shishirp] 01-jan-1995 Revision History: Joe Linn [JoeLinn] 23-jan-97 Ported for use on NT --*/ #include "precomp.h" #pragma hdrstop #pragma code_seg("PAGE") /********************************************************************/ /** Copyright(c) Microsoft Corp., 1990-1991 **/ /********************************************************************/ // Hook Processing /******************************* Include Files ******************************/ #ifndef CSC_RECORDMANAGER_WINNT #define WIN32_APIS #include "cshadow.h" #endif //ifndef CSC_RECORDMANAGER_WINNT #include #include #include // #include "error.h" #include "vxdwraps.h" #include "logdat.h" /******************************* defines/typedefs ***************************/ #define MAX_SHADOW_LOG_ENTRY 512 #define MAX_LOG_SIZE 100000 #ifdef DEBUG #define SHADOW_TIMER_INTERVAL 30000 #define STATS_FLUSH_COUNT 10 #endif //DEBUG #define ENTERCRIT_LOG { if (!fLogInit) InitShadowLog();\ if (fLogInit==-1) return; \ Wait_Semaphore(semLog, BLOCK_SVC_INTS);} #define LEAVECRIT_LOG Signal_Semaphore(semLog); #ifdef CSC_RECORDMANAGER_WINNT //ntdef has already define TIME differently....fortuntely by macros.... //so we undo this for the remainder of this file. the RIGHT solution is //to use a name like CSC_LOG_TIME. #undef _TIME #undef TIME #undef PTIME #endif //ifdef CSC_RECORDMANAGER_WINNT typedef struct tagTIME { WORD seconds; WORD minutes; WORD hours; WORD day; WORD month; WORD year; } TIME, FAR *LPTIME; #pragma intrinsic (memcmp, memcpy, memset, strcat, strcmp, strcpy, strlen) /******************************* Function Prototypes ************************/ int vxd_vsprintf(char * lpOut, char * lpFmt, CONST VOID * lpParms); int PrintLog( LPSTR lpFmt, ...); void PrintNetTime(LONG ltime); void PrintNetShortTime(LONG ltime); void ExplodeTime( ULONG time, LPTIME lpTime ); void LogPreamble(int, LPSTR, int, LPSTR); int WriteStats(BOOL); //need this for NT int WriteLog(void); /******************************** Static/Global data ************************/ #ifdef CSC_RECORDMANAGER_WINNT #define UniToBCSPath(a,b,c,d) #define IFSMgr_DosToNetTime(a) ((0)) #endif //ifdef CSC_RECORDMANAGER_WINNT AssertData; AssertError; char logpathbuff[MAX_PATH+1], rgchLogFileName[MAX_PATH]; char chLogginBuffer[COPY_BUFF_SIZE]; extern int fLog; extern LPSTR vlpszShadowDir; int fLogInit = FALSE; LPSTR lpLogBuff = chLogginBuffer; int cBuffSize = COPY_BUFF_SIZE; int indxCur = 0; VMM_SEMAPHORE semLog = 0L; #define FOURYEARS (3*365+366) ULONG ulMaxLogSize=0x00020000; // 128K log filesize by default #ifndef CSC_RECORDMANAGER_WINNT BOOL fPersistLog = TRUE; #else BOOL fPersistLog = FALSE; #endif #define DAYSECONDS (60L*60L*24L) // number of seconds in a day #define BIAS_70_TO_80 0x12CEA600L // days in a month int MonTab[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; /* structure stores intl settings for datetime format */ char szCSCLog[] = "\\csc.log"; // keep this size below 8 char szCRLF[] = "\r\n"; char szBegin[] = "Begin"; char szEnd[] = "End"; char szContinue[] = "Continue"; char szEndMarker[] = "END\n"; ULONG ulMaxLogfileSize; DWORD dwDebugLogVector = DEBUG_LOG_BIT_RECORD|DEBUG_LOG_BIT_CSHADOW; // by default record manager logging is on #ifdef DEBUG ULONG cntVfnDelete=0, cntVfnCreateDir=0, cntVfnDeleteDir=0, cntVfnCheckDir=0, cntVfnGetAttrib=0; ULONG cntVfnSetAttrib=0, cntVfnFlush=0, cntVfnGetDiskInfo=0, cntVfnOpen=0; ULONG cntVfnRename=0, cntVfnSearchFirst=0, cntVfnSearchNext=0; ULONG cntVfnQuery=0, cntVfnDisconnect=0, cntVfnUncPipereq=0, cntVfnIoctl16Drive=0; ULONG cntVfnGetDiskParms=0, cntVfnFindOpen=0, cntVfnDasdIO=0; ULONG cntHfnFindNext=0, cntHfnFindClose=0; ULONG cntHfnRead=0, cntHfnWrite=0, cntHfnSeek=0, cntHfnClose=0, cntHfnCommit=0; ULONG cntHfnSetFileLocks=0, cntHfnRelFileLocks=0, cntHfnGetFileTimes=0, cntHfnSetFileTimes=0; ULONG cntHfnPipeRequest=0, cntHfnHandleInfo=0, cntHfnEnumHandle=0; ULONG cbReadLow=0, cbReadHigh=0, cbWriteLow=0, cbWriteHigh=0; ULONG cntVfnConnect=0; ULONG cntLastTotal=0; #endif //DEBUG /****************************************************************************/ #ifndef CSC_RECORDMANAGER_WINNT #pragma VxD_LOCKED_CODE_SEG #endif //ifndef CSC_RECORDMANAGER_WINNT int InitShadowLog( ) { int iRet = -1, lenT; if (fLog && !fLogInit && vlpszShadowDir) { if (!(semLog = Create_Semaphore(1))) goto bailout; strcpy(rgchLogFileName, (LPSTR)vlpszShadowDir); strcat(rgchLogFileName, szCSCLog); PrintLog(szCRLF); PrintNetTime(IFSMgr_Get_NetTime()); PrintLog(szCRLF); fLogInit = 1; iRet = 0; } else { iRet = 0; } bailout: if (iRet) { if (semLog) Destroy_Semaphore(semLog); semLog = 0L; } return iRet; } int ShadowLog( LPSTR lpFmt, ... ) { int pos, iRet = -1; if (!fLogInit) { InitShadowLog(); } if (fLogInit) { if ((cBuffSize-indxCur+sizeof(szEndMarker)) < MAX_SHADOW_LOG_ENTRY) { iRet = WriteLog(); #if 0 PrintLog(szCRLF); PrintNetTime(IFSMgr_Get_NetTime()); PrintLog(szCRLF); #endif } else { indxCur += vxd_vsprintf(lpLogBuff+indxCur, lpFmt, (LPSTR)&lpFmt+sizeof(lpFmt)); // deliberately don't move the index pointer after writing the end marker // so when the next real log entry is written, the endmarker will be overwritten memcpy(lpLogBuff+indxCur, szEndMarker, sizeof(szEndMarker)-1); iRet = 0; } } else { iRet = 0; } return (iRet); } int TerminateShadowLog( ) { int iRet = -1; if (fLogInit) { iRet = WriteLog(); Destroy_Semaphore(semLog); semLog = 0L; fLogInit = 0; } else { iRet = 0; } return (iRet); } int FlushLog( ) { int iRet = 0; if (!fLogInit) { InitShadowLog(); } if (fLogInit==1) { Wait_Semaphore(semLog, BLOCK_SVC_INTS); iRet = WriteLog(); Signal_Semaphore(semLog); } else { iRet = -1; } return (iRet); } #ifdef DEBUG int WriteLog( ) { int iRet = -1; CSCHFILE hfShadowLog = CSCHFILE_NULL; ULONG pos; if (fLogInit && vlpszShadowDir) { if (fPersistLog) { if (!(hfShadowLog = CreateFileLocal(rgchLogFileName))) { KdPrint(("WriteLog: Couldn't open log file\r\n")); goto bailout; } if(GetFileSizeLocal(hfShadowLog, &pos)) { KdPrint(("ShadowLog: log file error\r\n")); goto bailout; } if ((pos+indxCur) > ulMaxLogSize) { #if 0 CloseFileLocal(hfShadowLog); DeleteFileLocal(lpszLogAlt, ATTRIB_DEL_ANY); RenameFileLocal(szLog, szLogAlt); if (!(hfShadowLog = CreateFileLocal(szLog))) { KdPrint(("WriteLog: Couldn't open shadow file\r\n")); goto bailout; } #endif pos=0; // wraparound the logfile } if (WriteFileLocal(hfShadowLog, pos, lpLogBuff, indxCur) != indxCur) { KdPrint(("ShadowLog: error writing the log at position %x \r\n", pos)); goto bailout; } } iRet = 0; } bailout: if (hfShadowLog) { CloseFileLocal(hfShadowLog); } // no matter what happens, reset the index to 0 indxCur = 0; return iRet; } #else int WriteLog( VOID ) { // no matter what happens, reset the index to 0 indxCur = 0; return 1; } #endif //DEBUG void EnterLogCrit(void) { ENTERCRIT_LOG; } void LeaveLogCrit(void) { LEAVECRIT_LOG; } /* * PrintNetTime * * Adds a time and a date to the end of a string. * Time is seconds since 1/1/70. * */ void PrintNetTime(LONG ltime) { TIME tm; int d1, d2, d3; ExplodeTime( ltime, &tm ); d1 = tm.month; d2 = tm.day; d3 = tm.year%100; PrintLog(szTimeDateFormat, tm.hours, tm.minutes, tm.seconds, d1, d2, d3); } /* * PrintNetTime * * Adds a time and a date to the end of a string. * Time is seconds since 1/1/70. * */ void PrintNetShortTime( LONG ltime ) { TIME tm; ExplodeTime( ltime, &tm ); PrintLog(szTimeFormat, tm.hours, tm.minutes, tm.seconds); } int PrintLog( LPSTR lpFmt, ... ) { indxCur += vxd_vsprintf(lpLogBuff+indxCur, lpFmt, (LPSTR)&lpFmt+sizeof(lpFmt)); return(0); } VOID _cdecl DbgPrintLog( LPSTR lpFmt, ... ) { ENTERCRIT_LOG; indxCur += vxd_vsprintf(lpLogBuff+indxCur, lpFmt, (LPSTR)&lpFmt+sizeof(lpFmt)); LEAVECRIT_LOG; } void ExplodeTime( ULONG time, LPTIME lpTime ) { ULONG date; WORD cLeaps; LONG days; WORD dpy; int i; time -= BIAS_70_TO_80; date = time / DAYSECONDS; time %= DAYSECONDS; lpTime->seconds = (WORD)(time % 60L); time /= 60L; lpTime->minutes = (WORD)(time % 60L); lpTime->hours = (WORD)(time / 60L); cLeaps = (WORD)(date / FOURYEARS); // # of full leap years days = date % FOURYEARS; // remaining days lpTime->year = cLeaps * 4 + 1980; // correct year MonTab[1] = 29; // set # days in Feb for leap years dpy = 366; days -= dpy; if (days >= 0) { // this is not a leap year dpy--; while (days >= 0) { lpTime->year++; days -= dpy; } MonTab[1] = 28; // set # days in Feb for non-leap years } days += dpy; // days = # days left in this year for (i=0; days >= MonTab[i]; i++) days -= MonTab[i]; lpTime->month = (WORD)i + 1; // calculate 1-based month lpTime->day = (WORD)days + 1; // calculate 1-based day } void LogVfnDelete( PIOREQ pir ) { TIME tm; #ifdef DEBUG ++cntVfnDelete; #endif //DEBUG if (fLog) { ENTERCRIT_LOG; memset(logpathbuff, 0, sizeof(logpathbuff)); UniToBCSPath(logpathbuff, &pir->ir_ppath->pp_elements[0], MAX_PATH, BCS_OEM); logpathbuff[MAX_PATH]=0; LogPreamble(VFNLOG_DELETE, logpathbuff, pir->ir_error, szCR); LEAVECRIT_LOG; } } void LogVfnDir( PIOREQ pir ) { #ifdef DEBUG if (pir->ir_flags == CREATE_DIR) ++cntVfnCreateDir; else if (pir->ir_flags == DELETE_DIR) ++cntVfnDeleteDir; else ++cntVfnCheckDir; #endif //DEBUG if (fLog) { ENTERCRIT_LOG; UniToBCSPath(logpathbuff, &pir->ir_ppath->pp_elements[0], MAX_PATH, BCS_OEM); logpathbuff[MAX_PATH]=0; if (pir->ir_flags==CREATE_DIR) LogPreamble(VFNLOG_CREATE_DIR, logpathbuff, pir->ir_error, szCR); else if (pir->ir_flags==DELETE_DIR) LogPreamble(VFNLOG_DELETE_DIR, logpathbuff, pir->ir_error, szCR); else if (pir->ir_flags==CHECK_DIR) LogPreamble(VFNLOG_CHECK_DIR, logpathbuff, pir->ir_error, szCR); else if (pir->ir_flags==QUERY83_DIR) { LogPreamble(VFNLOG_QUERY83_DIR, logpathbuff, pir->ir_error, NULL); UniToBCSPath(logpathbuff, &pir->ir_ppath2->pp_elements[0], MAX_PATH, BCS_OEM); ShadowLog(" %s\r\n", logpathbuff); } else { LogPreamble(VFNLOG_QUERYLONG_DIR, logpathbuff, pir->ir_error, NULL); UniToBCSPath(logpathbuff, &pir->ir_ppath2->pp_elements[0], MAX_PATH, BCS_OEM); ShadowLog(" %s\r\n", logpathbuff); } LEAVECRIT_LOG; } } void LogVfnFileAttrib( PIOREQ pir ) { #ifdef DEBUG if (pir->ir_flags == GET_ATTRIBUTES) ++cntVfnGetAttrib; else ++cntVfnSetAttrib; #endif //DEBUG if (fLog) { ENTERCRIT_LOG; memset(logpathbuff, 0, sizeof(logpathbuff)); UniToBCSPath(logpathbuff, &pir->ir_ppath->pp_elements[0], MAX_PATH, BCS_OEM); if (pir->ir_flags == GET_ATTRIBUTES) { LogPreamble(VFNLOG_GET_ATTRB, logpathbuff, pir->ir_error, NULL); ShadowLog(rgsLogCmd[VFNLOG_GET_ATTRB].lpFmt, pir->ir_attr); } else { LogPreamble(VFNLOG_SET_ATTRB, logpathbuff, pir->ir_error, NULL); ShadowLog(rgsLogCmd[VFNLOG_SET_ATTRB].lpFmt, pir->ir_attr); } LEAVECRIT_LOG; } } void LogVfnFlush( PIOREQ pir ) { #ifdef DEBUG ++cntVfnFlush; #endif //DEBUG if (fLog) { ENTERCRIT_LOG; PpeToSvr(((PRESOURCE)(pir->ir_rh))->pp_elements, logpathbuff, sizeof(logpathbuff), BCS_OEM); LogPreamble(VFNLOG_FLUSH, logpathbuff, pir->ir_error, szCR); LEAVECRIT_LOG; } } void LogVfnGetDiskInfo( PIOREQ pir ) { if (fLog) { ENTERCRIT_LOG; PpeToSvr(((PRESOURCE)(pir->ir_rh))->pp_elements, logpathbuff, sizeof(logpathbuff), BCS_OEM); LogPreamble(VFNLOG_GETDISKINFO, logpathbuff, pir->ir_error, szCR); LEAVECRIT_LOG; } } void LogVfnGetDiskParms( PIOREQ pir ) { #ifdef DEBUG ++cntVfnGetDiskParms; #endif //DEBUG if (fLog) { ENTERCRIT_LOG; PpeToSvr(((PRESOURCE)(pir->ir_rh))->pp_elements, logpathbuff, sizeof(logpathbuff), BCS_OEM); LogPreamble(VFNLOG_GETDISKPARAMS, logpathbuff, pir->ir_error, szCR); LEAVECRIT_LOG; } } void LogVfnOpen( PIOREQ pir ) { #ifdef DEBUG ++cntVfnOpen; #endif //DEBUG if (fLog) { ENTERCRIT_LOG; memset(logpathbuff, 0, sizeof(logpathbuff)); UniToBCSPath(logpathbuff, &pir->ir_ppath->pp_elements[0], MAX_PATH, BCS_OEM); logpathbuff[MAX_PATH]=0; LogPreamble(VFNLOG_OPEN, logpathbuff, pir->ir_error, NULL); ShadowLog(rgsLogCmd[VFNLOG_OPEN].lpFmt,(ULONG)(pir->ir_flags), (ULONG)(pir->ir_options) , (ULONG)(pir->ir_attr), (ULONG)(pir->ir_size)); PrintNetTime(IFSMgr_DosToNetTime(pir->ir_dostime)); ShadowLog(szCR); LEAVECRIT_LOG; } } void LogVfnRename( PIOREQ pir ) { #ifdef DEBUG ++cntVfnRename; #endif //DEBUG if (fLog) { ENTERCRIT_LOG; memset(logpathbuff, 0, sizeof(logpathbuff)); UniToBCSPath(logpathbuff, &pir->ir_ppath->pp_elements[0], MAX_PATH, BCS_OEM); logpathbuff[MAX_PATH]=0; LogPreamble(VFNLOG_RENAME, logpathbuff, pir->ir_error, NULL); UniToBCSPath(logpathbuff, &pir->ir_ppath2->pp_elements[0], MAX_PATH, BCS_OEM); logpathbuff[MAX_PATH]=0; ShadowLog(rgsLogCmd[VFNLOG_RENAME].lpFmt, logpathbuff); LEAVECRIT_LOG; } } void LogVfnSearch( PIOREQ pir ) { srch_entry *pse = (srch_entry *)(pir->ir_data); char szName[sizeof(pse->se_name)+1]; #ifdef DEBUG if (pir->ir_flags == SEARCH_FIRST) ++cntVfnSearchFirst; else ++cntVfnSearchNext; #endif //DEBUG if (fLog) { ENTERCRIT_LOG; // BUGBUG expand this memset(szName, 0, sizeof(szName)); memcpy(logpathbuff, pse->se_name, sizeof(pse->se_name)); if (pir->ir_flags == SEARCH_FIRST) { memset(logpathbuff, 0, sizeof(logpathbuff)); UniToBCSPath(logpathbuff, &pir->ir_ppath->pp_elements[0], MAX_PATH, BCS_OEM); LogPreamble(VFNLOG_SRCHFRST, logpathbuff, pir->ir_error, NULL); ShadowLog(rgsLogCmd[VFNLOG_SRCHFRST].lpFmt, pir->ir_attr, szName); } else { LogPreamble(VFNLOG_SRCHNEXT, szDummy, pir->ir_error, NULL); ShadowLog(rgsLogCmd[VFNLOG_SRCHNEXT].lpFmt, szName); } LEAVECRIT_LOG; } } void LogVfnQuery( PIOREQ pir, USHORT options ) { #ifdef DEBUG ++cntVfnQuery; #endif //DEBUG if (fLog) { ENTERCRIT_LOG; memset(logpathbuff, 0, sizeof(logpathbuff)); PpeToSvr(((PRESOURCE)(pir->ir_rh))->pp_elements, logpathbuff, sizeof(logpathbuff), BCS_OEM); if (options==0) { LogPreamble(VFNLOG_QUERY0, logpathbuff, pir->ir_error, szCR); } if (options==1) { LogPreamble(VFNLOG_QUERY0, logpathbuff, pir->ir_error, NULL); ShadowLog(rgsLogCmd[VFNLOG_QUERY1].lpFmt, (ULONG)(pir->ir_options)); } else if (options==2) { LogPreamble(VFNLOG_QUERY0, logpathbuff, pir->ir_error, NULL); ShadowLog(rgsLogCmd[VFNLOG_QUERY2].lpFmt, (ULONG)(pir->ir_options), (ULONG)(pir->ir_length >> 16), (ULONG)(pir->ir_length & 0xffff)); } LEAVECRIT_LOG; } } void LogVfnConnect( PIOREQ pir ) { #ifdef DEBUG ++cntVfnConnect; #endif //DEBUG if (fLog) { ENTERCRIT_LOG; memset(logpathbuff, 0, sizeof(logpathbuff)); UniToBCSPath(logpathbuff, &pir->ir_ppath->pp_elements[0], MAX_PATH, BCS_OEM); LogPreamble(VFNLOG_CONNECT, logpathbuff, pir->ir_error, NULL); ShadowLog(rgsLogCmd[VFNLOG_CONNECT].lpFmt, pir->ir_flags); LEAVECRIT_LOG; } } void LogVfnDisconnect( PIOREQ pir ) { #ifdef DEBUG ++cntVfnDisconnect; #endif //DEBUG if (fLog) { ENTERCRIT_LOG; PpeToSvr(((PRESOURCE)(pir->ir_rh))->pp_elements, logpathbuff, sizeof(logpathbuff), BCS_OEM); LogPreamble(VFNLOG_DISCONNECT, logpathbuff, pir->ir_error, szCR); WriteLog(); // TerminateShadowLog(); LEAVECRIT_LOG; } } void LogVfnUncPipereq( PIOREQ pir ) { #ifdef DEBUG ++cntVfnUncPipereq; #endif //DEBUG } void LogVfnIoctl16Drive ( PIOREQ pir ) { #ifdef DEBUG ++cntVfnIoctl16Drive ; #endif //DEBUG } void LogVfnDasdIO( PIOREQ pir ) { #ifdef DEBUG ++cntVfnDasdIO; #endif //DEBUG } void LogVfnFindOpen( PIOREQ pir ) { #ifdef DEBUG ++cntVfnFindOpen; #endif //DEBUG if (fLog) { ENTERCRIT_LOG; memset(logpathbuff, 0, sizeof(logpathbuff)); UniToBCSPath(logpathbuff, &pir->ir_ppath->pp_elements[0], MAX_PATH, BCS_OEM); logpathbuff[MAX_PATH]=0; LogPreamble(VFNLOG_FINDOPEN, logpathbuff, pir->ir_error, NULL); if (!pir->ir_error) { memset(logpathbuff, 0, sizeof(logpathbuff)); UniToBCS(logpathbuff, ((LPFIND32)(pir->ir_data))->cFileName, sizeof(((LPFIND32)(pir->ir_data))->cFileName) , sizeof(logpathbuff)-1, BCS_OEM); ShadowLog(rgsLogCmd[VFNLOG_FINDOPEN].lpFmt, pir->ir_attr, logpathbuff); } else { ShadowLog(szCR); } LEAVECRIT_LOG; } } void LogHfnFindNext( PIOREQ pir ) { #ifdef DEBUG ++cntHfnFindNext; #endif //DEBUG if (fLog) { ENTERCRIT_LOG; LogPreamble(HFNLOG_FINDNEXT, szDummy, pir->ir_error, NULL); if (!pir->ir_error) { memset(logpathbuff, 0, sizeof(logpathbuff)); UniToBCS(logpathbuff, ((LPFIND32)(pir->ir_data))->cFileName, sizeof(((LPFIND32)(pir->ir_data))->cFileName) , sizeof(logpathbuff)-1, BCS_OEM); ShadowLog(rgsLogCmd[HFNLOG_FINDNEXT].lpFmt, logpathbuff); } else { ShadowLog(szCR); } LEAVECRIT_LOG; } } void LogHfnFindClose( PIOREQ pir ) { #ifdef DEBUG ++cntHfnFindClose; #endif //DEBUG if (fLog) { ENTERCRIT_LOG; LogPreamble(HFNLOG_FINDCLOSE, szDummy, pir->ir_error, szCR); LEAVECRIT_LOG; } } void LogHfnRead ( PIOREQ pir ) { #ifdef DEBUG ++cntHfnRead; #endif //DEBUG #ifdef MAYBE Incr64Bit(cbReadHigh, cbReadLow, (ULONG)(pir->ir_length)); #endif //MAYBE if (fLog) { PFILEINFO pFileInfo = (PFILEINFO)(pir->ir_fh); ENTERCRIT_LOG; memset(logpathbuff, 0, sizeof(logpathbuff)); UniToBCSPath(logpathbuff, &(pFileInfo->pFdb->sppathRemoteFile.pp_elements[0]), MAX_PATH, BCS_OEM); LogPreamble(HFNLOG_READ, logpathbuff, pir->ir_error, NULL); ShadowLog(rgsLogCmd[HFNLOG_READ].lpFmt, (ULONG)(pir->ir_pos)-(ULONG)(pir->ir_length), (ULONG)(pir->ir_length)); LEAVECRIT_LOG; } } void LogHfnWrite ( PIOREQ pir ) { #ifdef DEBUG ++cntHfnWrite; #endif //DEBUG #ifdef MAYBE Incr64Bit(cbWriteHigh, cbWriteLow, (ULONG)(pir->ir_length)); #endif //MAYBE if (fLog) { PFILEINFO pFileInfo = (PFILEINFO)(pir->ir_fh); ENTERCRIT_LOG; memset(logpathbuff, 0, sizeof(logpathbuff)); UniToBCSPath(logpathbuff, &(pFileInfo->pFdb->sppathRemoteFile.pp_elements[0]), MAX_PATH, BCS_OEM); LogPreamble(HFNLOG_WRITE, logpathbuff, pir->ir_error, NULL); ShadowLog(rgsLogCmd[HFNLOG_WRITE].lpFmt, (ULONG)(pir->ir_pos)-(ULONG)(pir->ir_length), (ULONG)(pir->ir_length)); LEAVECRIT_LOG; } } void LogHfnClose ( PIOREQ pir, int closetype ) { #ifdef DEBUG ++cntHfnClose; #endif //DEBUG if (fLog) { PFILEINFO pFileInfo = (PFILEINFO)(pir->ir_fh); ENTERCRIT_LOG; memset(logpathbuff, 0, sizeof(logpathbuff)); UniToBCSPath(logpathbuff, &(pFileInfo->pFdb->sppathRemoteFile.pp_elements[0]), MAX_PATH, BCS_OEM); LogPreamble(HFNLOG_CLOSE, logpathbuff, pir->ir_error, NULL); ShadowLog(rgsLogCmd[HFNLOG_CLOSE].lpFmt, closetype); LEAVECRIT_LOG; } } void LogHfnSeek ( PIOREQ pir ) { #ifdef DEBUG ++cntHfnSeek; #endif //DEBUG if (fLog) { PFILEINFO pFileInfo = (PFILEINFO)(pir->ir_fh); ENTERCRIT_LOG; memset(logpathbuff, 0, sizeof(logpathbuff)); UniToBCSPath(logpathbuff, &(pFileInfo->pFdb->sppathRemoteFile.pp_elements[0]), MAX_PATH, BCS_OEM); LogPreamble(HFNLOG_SEEK, logpathbuff, pir->ir_error, NULL); ShadowLog(rgsLogCmd[HFNLOG_SEEK].lpFmt, (ULONG)(pir->ir_pos), pir->ir_flags); LEAVECRIT_LOG; } } void LogHfnCommit ( PIOREQ pir ) { #ifdef DEBUG ++cntHfnCommit; #endif //DEBUG if (fLog) { PFILEINFO pFileInfo = (PFILEINFO)(pir->ir_fh); ENTERCRIT_LOG; memset(logpathbuff, 0, sizeof(logpathbuff)); UniToBCSPath(logpathbuff, &(pFileInfo->pFdb->sppathRemoteFile.pp_elements[0]), MAX_PATH, BCS_OEM); LogPreamble(HFNLOG_COMMIT, logpathbuff, pir->ir_error, szCR); LEAVECRIT_LOG; } } void LogHfnFileLocks ( PIOREQ pir ) { #ifdef DEBUG if (pir->ir_flags == LOCK_REGION) ++cntHfnSetFileLocks; else ++cntHfnRelFileLocks; #endif //DEBUG if (fLog) { PFILEINFO pFileInfo = (PFILEINFO)(pir->ir_fh); ENTERCRIT_LOG; memset(logpathbuff, 0, sizeof(logpathbuff)); UniToBCSPath(logpathbuff, &(pFileInfo->pFdb->sppathRemoteFile.pp_elements[0]), MAX_PATH, BCS_OEM); LogPreamble((pir->ir_flags==LOCK_REGION)?HFNLOG_FLOCK:HFNLOG_FUNLOCK, logpathbuff, pir->ir_error, NULL); if (!pir->ir_error) { ShadowLog(rgsLogCmd[HFNLOG_FLOCK].lpFmt , pir->ir_pos , pir->ir_locklen); } else { ShadowLog(szCR); } LEAVECRIT_LOG; } } void LogHfnFileTimes ( PIOREQ pir ) { #ifdef DEBUG if ((pir->ir_flags == GET_MODIFY_DATETIME)||(pir->ir_flags == GET_LAST_ACCESS_DATETIME)) ++cntHfnGetFileTimes; else ++cntHfnSetFileTimes; #endif //DEBUG if (fLog) { PFILEINFO pFileInfo = (PFILEINFO)(pir->ir_fh); int indxFn = pir->ir_flags; if (indxFn==GET_MODIFY_DATETIME) { indxFn = HFNLOG_GET_TIME; } else if (indxFn==SET_MODIFY_DATETIME) { indxFn = HFNLOG_SET_TIME; } else if (indxFn==GET_LAST_ACCESS_DATETIME) { indxFn = HFNLOG_GET_LATIME; } else { indxFn = HFNLOG_SET_LATIME; } ENTERCRIT_LOG; memset(logpathbuff, 0, sizeof(logpathbuff)); UniToBCSPath(logpathbuff, &(pFileInfo->pFdb->sppathRemoteFile.pp_elements[0]), MAX_PATH, BCS_OEM); LogPreamble(indxFn, logpathbuff, pir->ir_error, NULL); if (!pir->ir_error) { PrintNetTime(IFSMgr_DosToNetTime(pir->ir_dostime)); } ShadowLog(szCR); LEAVECRIT_LOG; } } void LogHfnPipeRequest ( PIOREQ pir ) { } void LogHfnHandleInfo( PIOREQ pir ) { if (fLog) { PFILEINFO pFileInfo = (PFILEINFO)(pir->ir_fh); ENTERCRIT_LOG; memset(logpathbuff, 0, sizeof(logpathbuff)); UniToBCSPath(logpathbuff, &(pFileInfo->pFdb->sppathRemoteFile.pp_elements[0]), MAX_PATH, BCS_OEM); LogPreamble(HFNLOG_ENUMHANDLE, logpathbuff, pir->ir_error, NULL); ShadowLog(szCR); LEAVECRIT_LOG; } } void LogHfnEnumHandle( PIOREQ pir ) { if (fLog) { PFILEINFO pFileInfo = (PFILEINFO)(pir->ir_fh); ENTERCRIT_LOG; memset(logpathbuff, 0, sizeof(logpathbuff)); UniToBCSPath(logpathbuff, &(pFileInfo->pFdb->sppathRemoteFile.pp_elements[0]), MAX_PATH, BCS_OEM); LogPreamble(HFNLOG_ENUMHANDLE, logpathbuff, pir->ir_error, NULL); ShadowLog(rgsLogCmd[HFNLOG_ENUMHANDLE].lpFmt, pir->ir_flags); LEAVECRIT_LOG; } } void LogTiming( int verbosity, int stage ) { if (fLog >= verbosity) { ShadowLog("%s: ", (stage==STAGE_BEGIN) ?szBegin:((stage==STAGE_END)?szEnd:szContinue)); PrintNetShortTime(IFSMgr_Get_NetTime()); ShadowLog(szCR); } } void LogPreamble( int indxFn, LPSTR lpSubject, int errCode, LPSTR lpPreTerm ) { TIME tm; ExplodeTime(IFSMgr_Get_NetTime(), &tm); ShadowLog(szPreFmt , rgsLogCmd[indxFn].lpCmd , tm.hours, tm.minutes, tm.seconds , errCode , lpSubject); if (lpPreTerm) { ShadowLog(lpPreTerm); } } #ifdef MAYBE int Incr64Bit( ULONG uHigh, ULONG uLow, ULONG uIncr ) { ULONG uTemp = uLow; uLow += uIncr; if (uLow < uTemp) ++uHigh; return 1; } #endif //MAYBE #ifdef DEBUG int WriteStats( BOOL fForce) { ULONG cntTotal; SHADOWSTORE sSS; cntTotal = cntVfnDelete+ cntVfnCreateDir+ cntVfnDeleteDir+ cntVfnCheckDir+ cntVfnGetAttrib+ cntVfnSetAttrib+ cntVfnFlush+ cntVfnGetDiskInfo+ cntVfnOpen+ cntVfnRename+ cntVfnSearchFirst+ cntVfnSearchNext+ cntVfnQuery+ cntVfnDisconnect+ cntVfnUncPipereq+ cntVfnIoctl16Drive+ cntVfnGetDiskParms+ cntVfnFindOpen+ cntVfnDasdIO+ cntHfnFindNext+ cntHfnFindClose+ cntHfnRead+ cntHfnWrite+ cntHfnSeek+ cntHfnClose+ cntHfnCommit+ cntHfnSetFileLocks+ cntHfnRelFileLocks+ cntHfnGetFileTimes+ cntHfnSetFileTimes+ cntHfnPipeRequest+ cntHfnHandleInfo+ cntHfnEnumHandle; ShadowLog("\r!***** Stats Begin *******\r"); PrintNetTime(IFSMgr_Get_NetTime()); ShadowLog("\r"); if (!fForce && (cntTotal == cntLastTotal)) { KdPrint(("No new network activity \r")); goto bailout; } cntLastTotal = cntTotal; if (!cntTotal) { cntTotal = 1; } ShadowLog("Total remote operations=%d \r", cntTotal); GetShadowSpaceInfo(&sSS); ShadowLog("Space used=%d, Files=%d, Dirs=%d\r", sSS.sCur.ulSize, sSS.sCur.ucntFiles, sSS.sCur.ucntDirs); ShadowLog("\rFile Operations:\r"); ShadowLog("Open=%d%%, Close=%d%% \r", (cntVfnOpen * 100/cntTotal), (cntHfnClose * 100/cntTotal)); ShadowLog("Read=%d%%, Write=%d%%, Seek=%d%%\r", (cntHfnRead * 100/cntTotal), (cntHfnWrite * 100/cntTotal), (cntHfnSeek * 100/cntTotal)); if (!cntHfnRead) { cntHfnRead = 1; } ShadowLog("ReadHits=%d%% of total reads\r", (cntReadHits*100)/cntHfnRead); ShadowLog("GetFileTime=%d%% SetFileTime=%d%%\r", (cntHfnGetFileTimes * 100/cntTotal), (cntHfnSetFileTimes * 100/cntTotal)); ShadowLog("SetLock=%d%%, ReleaseLock=%d%% \r", (cntHfnSetFileLocks * 100/cntTotal), (cntHfnRelFileLocks * 100/cntTotal)); ShadowLog("Directory Operations: "); ShadowLog("CreateDir=%d%%, DeleteDir=%d%%, CheckDir=%d%% \r", (cntVfnCreateDir*100/cntTotal), (cntVfnDeleteDir*100/cntTotal), (cntVfnCheckDir*100/cntTotal)); ShadowLog("Find/Search Operations:\r"); ShadowLog("FindOpen=%d%%, FindNext=%d%%, FindClose=%d%% \r", (cntVfnFindOpen * 100/cntTotal), (cntHfnFindNext * 100/cntTotal), (cntHfnFindClose * 100/cntTotal)); ShadowLog("SearchFirst=%d%%, SearchNext=%d%%\r", (cntVfnSearchFirst * 100/cntTotal), (cntVfnSearchNext * 100/cntTotal)); ShadowLog("Attributes: "); ShadowLog("SetAttributes=%d%%, GetAttributes=%d%%\r", (cntVfnSetAttrib * 100/cntTotal), (cntVfnGetAttrib * 100/cntTotal)); ShadowLog("Name Mutations: "); ShadowLog("Rename=%d%%, Delete=%d%% \r", (cntVfnRename * 100/cntTotal), (cntVfnDelete * 100/cntTotal)); bailout: ShadowLog("\r***** Stats End ******* \r"); return 1; } void ShadowRestrictedEventCallback ( ) { FlushLog(); ENTERCRIT_LOG; WriteStats(0); // Don't force him to write LEAVECRIT_LOG; FlushLog(); } #endif //DEBUG