/*++ Copyright (c) 1989 Microsoft Corporation Module Name: Utils.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") #ifndef CSC_RECORDMANAGER_WINNT #define WIN32_APIS #include "cshadow.h" #endif //ifndef CSC_RECORDMANAGER_WINNT #include #include #include // #include "error.h" #include // Must be after error.h #include "vxdwraps.h" #define SIGN_BIT 0x80000000 #define UCHAR_OFFLINE ((USHORT)'_') #define HIGH_ONE_SEC 0x98 #define LOW_ONE_SEC 0x9680 #pragma intrinsic (memcmp, memcpy, memset, strcat, strcmp, strcpy, strlen) #define cBackSlash '\\' #define cNull 0 #ifdef MAYBE ULONG UlGetDefaultShadowStore(LPSTR lpDrive); #endif //MAYBE AssertData AssertError extern char pathbuff[MAX_PATH+1]; extern char vszShadowDir[MAX_SHADOW_DIR_NAME+1]; char vszEnableShadow[]="EnableShadow"; char vszEnableRemoteLog[]="EnableRemoteLog"; char vszEnableDisconnect[]="EnableDisconnect"; char vszMaxShadowStoreHex[]="MaxShadowStoreHex"; char vszMaxLogfileSize[]="MaxLogfileSize"; char vszExcludeList[] = "ExcludeExtensions"; char vszIncludeList[] = "IncludeExtensions"; char vszExclDelim[]=" ;,"; char vszRemoteAccess[]="System\\CurrentControlSet\\Services\\RemoteAccess"; char vszRemoteConnection[]="Remote Connection"; char vszEnableSpeadOpt[]="EnableSpeadOpt"; char vszDefShadowDir[] = "c:\\shadow"; char vszCSCDirName[] = "CSC\\"; USHORT *rgwzHeuristicExtensionTab[] = { L".exe", L".dll" }; #ifndef CSC_RECORDMANAGER_WINNT #pragma VxD_LOCKED_CODE_SEG #endif //ifndef CSC_RECORDMANAGER_WINNT int PUBLIC GetServerPart( LPPE lppeServer, USHORT *lpBuff, int cBuff ) { return(PpeToSvr(lppeServer, (LPSTR)lpBuff, cBuff, UNICODE)); } ULONG PUBLIC GetNextPathElement( LPPP lppp, ULONG indx, USHORT *lpBuff, ULONG cBuff ) { LPPE lppe; #if VERBOSE > 3 KdPrint(("GetNextPathElement: input index=%d \r\n", indx)); #endif //VERBOSE > 3 lppe = (LPPE)&(((LPBYTE)(lppp->pp_elements))[indx]); if (lpBuff) { Assert(cBuff); memset(lpBuff, 0, cBuff); memcpy(lpBuff, lppe->pe_unichars, min(lppe->pe_length-2, (int)cBuff)); // UniToBCS(lpBuff, lppe->pe_unichars, lppe->pe_length-2, cBuff-1, BCS_OEM); } #if VERBOSE > 3 KdPrint(("GetNextPathElement: output index=%d \r\n", indx)); #endif //VERBOSE > 3 indx += lppe->pe_length; return ((indx < IFSPathLength(lppp))?indx:0xffff); } VOID PUBLIC GetLeafPtr ( PIOREQ pir, USHORT *lpBuff, ULONG cBuff ) { LPPE lpLast; Assert(cBuff); lpLast = IFSLastElement((LPPP)(pir->ir_ppath)); memset(lpBuff, 0, cBuff); memcpy(lpBuff, lpLast->pe_unichars, min(lpLast->pe_length-2, (int)cBuff)); } VOID PUBLIC BreakPath( LPPP lppp, ULONG indx, USHORT *pusCookie ) { USHORT u; LPPE lppe; #if VERBOSE > 3 UniToBCSPath(pathbuff, &lppp->pp_elements[0], MAX_PATH, BCS_OEM); KdPrint(("BreakPath In %s \r\n", pathbuff)); #endif //VERBOSE > 3 *pusCookie = lppp->pp_totalLength; *(pusCookie+1) = lppp->pp_prefixLength; *(pusCookie+2) = 0; if (IFSPathLength(lppp) > indx) { if (!indx) { lppp->pp_totalLength = lppp->pp_prefixLength = 4; } else { for (lppe = lppp->pp_elements, u=0;;) { u += lppe->pe_length; // This condition must happen if (u >= indx) { lppp->pp_totalLength = u+4; lppp->pp_prefixLength = u - lppe->pe_length+4; break; } lppe = IFSNextElement(lppe); } } *(pusCookie+2) = *(USHORT *)&(((LPBYTE)(lppp->pp_elements))[indx]); *(USHORT *)&(((LPBYTE)(lppp->pp_elements))[indx]) = 0; } #if VERBOSE > 3 KdPrint(("BreakPath saved=%x \r\n", uSav)); UniToBCSPath(pathbuff, &lppp->pp_elements[0], MAX_PATH, BCS_OEM); KdPrint(("BreakPath out %s \r\n", pathbuff)); #endif //VERBOSE > 3 } VOID PUBLIC MendPath( LPPP lppp, ULONG indx, USHORT *pusCookie ) { lppp->pp_totalLength = *pusCookie ; lppp->pp_prefixLength = *(pusCookie+1); if (indx < IFSPathLength(lppp)) { *(USHORT *)&(((LPBYTE)(lppp->pp_elements))[indx]) = *(pusCookie+2); } #if VERBOSE > 3 UniToBCSPath(pathbuff, &lppp->pp_elements[0], MAX_PATH, BCS_OEM); KdPrint(("MendPath %s \r\n", pathbuff)); #endif //VERBOSE > 3 } int PUBLIC GetPathLevel( LPPP ppath ) { PathElement *ppe; int level = 1; ppe = ppath->pp_elements; while(ppe->pe_length) { ++level; ppe = IFSNextElement(ppe); } return (level); } int PUBLIC HexToA( ULONG ulHex, LPSTR lpName, int count) { int i; LPSTR lp = lpName+count-1; UCHAR uch; for (i=0; i '9') uch += 7; // A becomes '0' + A + 7 which is 'A' *lp = uch; --lp; ulHex >>= 4; } *(lpName+count) = cNull; return 0; } ULONG PUBLIC AtoHex( LPSTR lpStr, int count ) { int i; LPSTR lp = lpStr; UCHAR uch; ULONG ulHex = 0L; for (i=0; i= '0' && uch <= '9') ulHex += (uch - '0'); else if (uch >= 'A' && uch <= 'F') ulHex += (uch - '0' - 7); else break; ++lp; ulHex <<= 4; } return ulHex; } int PpeToSvr( LPPE lppe, LPSTR lpBuff, int cBuff, ULONG type ) { LPSTR lpTmp = lpBuff; memset(lpTmp, 0, cBuff); if (type != UNICODE) { if (cBuff <= (lppe->pe_length+IFSNextElement(lppe)->pe_length)/2) return 0; *lpTmp = '\\'; UniToBCS(lpTmp+1, lppe->pe_unichars, lppe->pe_length-2, cBuff, BCS_OEM); lpTmp += (lppe->pe_length)/2; lppe = IFSNextElement(lppe); *lpTmp = '\\'; UniToBCS(lpTmp+1, lppe->pe_unichars, lppe->pe_length-2, cBuff, BCS_OEM); } else { USHORT *lpUni; lpUni = (USHORT *)lpTmp; if (cBuff < (lppe->pe_length+IFSNextElement(lppe)->pe_length)) return 0; *lpUni = '\\'; memcpy(lpUni+1, lppe->pe_unichars, lppe->pe_length); lpUni = (USHORT *)((LPSTR)lpUni+lppe->pe_length); lppe = IFSNextElement(lppe); *lpUni = '\\'; memcpy(lpUni+1, lppe->pe_unichars, lppe->pe_length); } return (1); } int IPathCompare( LPPP lpppDst, LPPP lpppSrc ) { LPPE lppeDst, lppeSrc; if (lpppDst->pp_totalLength != lpppSrc->pp_totalLength) return -1; if (lpppDst->pp_prefixLength != lpppSrc->pp_prefixLength) return -1; lppeDst = lpppDst->pp_elements; lppeSrc = lpppSrc->pp_elements; for (;;) { if (!lppeDst->pe_length || !lppeSrc->pe_length) break; if (lppeDst->pe_length != lppeSrc->pe_length) return -1; if (wstrnicmp(lppeDst->pe_unichars, lppeSrc->pe_unichars, lppeSrc->pe_length)) return -1; lppeDst = IFSNextElement(lppeDst); lppeSrc = IFSNextElement(lppeSrc); } return 0; } int wstrnicmp( const USHORT *pStr1, const USHORT *pStr2, ULONG count ) { USHORT c1, c2; int iRet; ULONG i=0; for(;;) { c1 = *pStr1++; c2 = *pStr2++; c1 = _wtoupper(c1); c2 = _wtoupper(c2); if (c1!=c2) break; if (!c1) break; i+=2; if (i >= count) break; } iRet = ((c1 > c2)?1:((c1==c2)?0:-1)); return iRet; } #ifndef CSC_RECORDMANAGER_WINNT int mystrnicmp( const char *pStr1, const char *pStr2, unsigned count ) #else _CRTIMP int __cdecl mystrnicmp( const char *pStr1, const char *pStr2, size_t count ) #endif //ifndef CSC_RECORDMANAGER_WINNT { char c1, c2; int iRet; ULONG i=0; for(;;) { c1 = *pStr1++; c2 = *pStr2++; c1 = _mytoupper(c1); c2 = _mytoupper(c2); if (c1!=c2) break; if (!c1) break; if (++i >= count) break; } iRet = ((c1 > c2)?1:((c1==c2)?0:-1)); return iRet; } ULONG strmcpy( LPSTR lpDst, LPSTR lpSrc, ULONG cTchar ) { ULONG i; if (!cTchar) return 0; for(i=cTchar;i;--i) if (!(*lpDst++ = *lpSrc++)) break; lpDst[cTchar-i] ='\0'; return(cTchar-i); } ULONG wstrlen( USHORT *lpuStr ) { ULONG i; for (i=0; *lpuStr; ++lpuStr, ++i); return (i); } int DosToWin32FileSize( ULONG uDosFileSize, int *lpnFileSizeHigh, int *lpnFileSizeLow ) { int iRet; if (uDosFileSize & SIGN_BIT) { *lpnFileSizeHigh = 1; *lpnFileSizeLow = uDosFileSize & SIGN_BIT; iRet = 1; } else { *lpnFileSizeHigh = 0; *lpnFileSizeLow = uDosFileSize; iRet = 0; } return (iRet); } int Win32ToDosFileSize( int nFileSizeHigh, int nFileSizeLow, ULONG *lpuDosFileSize ) { int iRet; *lpuDosFileSize = nFileSizeLow; if (nFileSizeHigh == 1) { *lpuDosFileSize += SIGN_BIT; iRet = 1; } else iRet = 0; return (iRet); } int CompareTimes( _FILETIME ftDst, _FILETIME ftSrc ) { int iRet = 0; if (ftDst.dwHighDateTime > ftSrc.dwHighDateTime) iRet = 1; else if (ftDst.dwHighDateTime == ftSrc.dwHighDateTime) { if (ftDst.dwLowDateTime > ftSrc.dwLowDateTime) iRet = 1; else if (ftDst.dwLowDateTime == ftSrc.dwLowDateTime) iRet = 0; else iRet = -1; } else iRet = -1; return (iRet); } int CompareTimesAtDosTimePrecision( _FILETIME ftDst, _FILETIME ftSrc ) { dos_time dostDst, dostSrc; int diff; dostDst = IFSMgr_Win32ToDosTime(ftDst); dostSrc = IFSMgr_Win32ToDosTime(ftSrc); diff = (int)(*(ULONG *)&dostDst - *(ULONG *)&dostSrc); if (diff > 1) return 1; else if (diff < -1) return -1; else return 0; } int CompareSize( long nHighDst, long nLowDst, long nHighSrc, long nLowSrc ) { int iRet = 0; if (nHighDst > nHighSrc) iRet = 1; else if (nHighDst == nHighSrc) { if (nLowDst > nLowSrc) iRet = 1; else if (nLowDst == nLowSrc) iRet = 0; else iRet = -1; } else iRet = -1; return (iRet); } void InitFind32FromIoreq ( PIOREQ pir, LPFIND32 lpFind32, ULONG uFlags ) { if (uFlags & IF32_LOCAL) { memset(lpFind32, 0, sizeof(WIN32_FIND_DATA)); InitFind32Names(lpFind32, ((pir->ir_attr & FILE_FLAG_KEEP_CASE)&&(uFlags&IF32_LAST_ELEMENT))? pir->ir_uFName: IFSLastElement(pir->ir_ppath)->pe_unichars, (pir->ir_attr & FILE_FLAG_IS_LFN)? NULL:IFSLastElement((LPPP)(pir->ir_ppath))->pe_unichars); } if (!(uFlags & IF32_DIRECTORY)) { lpFind32->dwFileAttributes = ((((pir->ir_attr) & ~FILE_ATTRIBUTE_DIRECTORY) | FILE_ATTRIBUTE_ARCHIVE) & FILE_ATTRIBUTE_EVERYTHING); } else { lpFind32->dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY; } if (uFlags & IF32_LOCAL) { //CODE.IMPROVEMENT very ugly.....define a platform specific macro.... #ifndef CSC_RECORDMANAGER_WINNT lpFind32->ftCreationTime = IFSMgr_NetToWin32Time(IFSMgr_Get_NetTime()); #else //lpFind32->ftCreationTime = IFSMgr_NetToWin32Time(IFSMgr_Get_NetTime()); KeQuerySystemTime(((PLARGE_INTEGER)(&lpFind32->ftCreationTime))); #endif //ifndef CSC_RECORDMANAGER_WINNT lpFind32->ftLastAccessTime = lpFind32->ftLastWriteTime = lpFind32->ftCreationTime; } lpFind32->nFileSizeHigh = lpFind32->nFileSizeLow = 0; } void InitIoreqFromFind32 ( LPFIND32 lpFind32, PIOREQ pir ) { pir->ir_attr = lpFind32->dwFileAttributes; pir->ir_size = lpFind32->nFileSizeLow; } void InitFind32Names( LPFIND32 lpFind32, USHORT *lpcFileName, USHORT *lpcAlternateFileName ) { int len; memset(lpFind32->cFileName, 0, sizeof(lpFind32->cFileName)); memset(lpFind32->cAlternateFileName, 0, sizeof(lpFind32->cAlternateFileName)); len = wstrlen(lpcFileName)*2; len = min(len, (sizeof(lpFind32->cFileName)-2)); memcpy(lpFind32->cFileName, lpcFileName, len); if (lpcAlternateFileName) { len = wstrlen(lpcAlternateFileName)*2; len = min(len, (sizeof(lpFind32->cAlternateFileName)-2)); memset(lpFind32->cAlternateFileName, 0, sizeof(lpFind32->cAlternateFileName)); UniToUpper(lpFind32->cAlternateFileName, lpcAlternateFileName, len); } } void Find32ToSearchEntry(LPFIND32 lpFind32, srch_entry *pse) { dos_time sDosTime; pse->se_attrib = (UCHAR)(lpFind32->dwFileAttributes); sDosTime = IFSMgr_Win32ToDosTime(lpFind32->ftLastWriteTime); pse->se_time = sDosTime.dt_time; pse->se_date = sDosTime.dt_date; Win32ToDosFileSize(lpFind32->nFileSizeHigh , lpFind32->nFileSizeLow , &(pse->se_size)); memset(pse->se_name, 0, sizeof(pse->se_name)); UniToBCS(pse->se_name , lpFind32->cAlternateFileName , wstrlen(lpFind32->cAlternateFileName) * 2 , sizeof(pse->se_name)-1, BCS_OEM); } void PUBLIC Find32AFromFind32( LPFIND32A lpFind32ADst, LPFIND32 lpFind32WSrc, int type ) { // Copy everything except the names, we know the size of that is the // same for both structures memcpy(lpFind32ADst, lpFind32WSrc, sizeof(_WIN32_FIND_DATAA) -sizeof(lpFind32ADst->cFileName) -sizeof(lpFind32ADst->cAlternateFileName)); // Cleanup the destineation names so we don't get into NULL termination problems memset(lpFind32ADst->cFileName, 0, sizeof(lpFind32ADst->cFileName)); memset(lpFind32ADst->cAlternateFileName, 0, sizeof(lpFind32ADst->cAlternateFileName)); UniToBCS(lpFind32ADst->cFileName // Destination ANSI string , lpFind32WSrc->cFileName // Source unicode string , sizeof(lpFind32WSrc->cFileName) // bytes in the source - sizeof(lpFind32WSrc->cFileName[0]) , sizeof(lpFind32ADst->cFileName) // max size of dst string wo NULL -sizeof(lpFind32ADst->cFileName[0]) , type // ANSI or OEM ); UniToBCS(lpFind32ADst->cAlternateFileName , lpFind32WSrc->cAlternateFileName , sizeof(lpFind32WSrc->cAlternateFileName) - sizeof(lpFind32WSrc->cAlternateFileName[0]) , sizeof(lpFind32ADst->cAlternateFileName) -sizeof(lpFind32ADst->cAlternateFileName[0]) , BCS_OEM); } void PUBLIC Find32FromFind32A( LPFIND32 lpFind32WDst, LPFIND32A lpFind32ASrc, int type ) { memcpy(lpFind32WDst, lpFind32ASrc, sizeof(_WIN32_FIND_DATAA) -sizeof(lpFind32ASrc->cFileName) -sizeof(lpFind32ASrc->cAlternateFileName)); memset(lpFind32WDst->cFileName, 0, sizeof(lpFind32WDst->cFileName)); memset(lpFind32WDst->cAlternateFileName, 0, sizeof(lpFind32WDst->cAlternateFileName)); BCSToUni(lpFind32WDst->cFileName , lpFind32ASrc->cFileName , sizeof(lpFind32ASrc->cFileName) - sizeof(lpFind32ASrc->cFileName[0]) , type); BCSToUni(lpFind32WDst->cAlternateFileName , lpFind32ASrc->cAlternateFileName , sizeof(lpFind32ASrc->cAlternateFileName) - sizeof(lpFind32ASrc->cAlternateFileName[0]) , BCS_OEM); } //** AddPathElement // // This routine adds a path element to an existing parsed path structure // // flag = 0 - no mapping // 1 - map from OEM to unicode // void AddPathElement( path_t ppath, string_t pstr, int flag) { PathElement *ppe; int len, unilen; ppe = IFSLastElement(ppath); ppath->pp_prefixLength+=ppe->pe_length; //update the prefix marker ppe = IFSNextElement(ppe); //add the new element if (flag) { //map to unicode len = strlen((char *)pstr); unilen = BCSToUni(ppe->pe_unichars, (char *) pstr, len, BCS_OEM); } else { //already in unicode unilen = wstrlen(pstr)*sizeof(USHORT); memcpy(ppe->pe_unichars, pstr, unilen); } ppe->pe_length = (USHORT)(unilen+sizeof(USHORT)); //include the length word //update the header ppath->pp_totalLength+=ppe->pe_length; //update total length //mark the end ppe = IFSNextElement(ppe); ppe->pe_length = 0; } //** MakePath // // Builds a parsed path from a ASCII string in the format "\\FOO\BAR.." // // ppath - points to a path buffer at least PATH_BUFF_SIZE // ppath - OEM path string // void MakePPath( path_t ppath, LPBYTE ps ) { LPBYTE pc = ps; MakeNullPPath(ppath); //initialize the path while(*pc == '\\') //skip past leading '\' { pc++; } if (ps[0] =='\\') //ps points to first name { ps++; } for (;;) { if (*pc == '\\') { *pc = 0; AddPathElement(ppath, (string_t)ps, 1); *pc = '\\'; ps = ++pc; } else if (*pc == 0) { AddPathElement(ppath, (string_t)ps, 1); break; } pc++; } } //** MakePathW // // Builds a parsed path from a unicode string in the format "\\FOO\BAR.." // // ppath - points to a path buffer at least PATH_BUFF_SIZE // ppath - OEM path string // void MakePPathW( path_t ppath, USHORT *puName ) { USHORT *pu = puName; MakeNullPPath(ppath); //initialize the path while(*pu == L'\\') //skip past leading '\' { pu++; } if (pu[0] == L'\\') //ps points to first name { pu++; } for (;;) { if (*pu == L'\\') { *pu = 0; AddPathElement(ppath, (string_t)puName, 0); *pu = L'\\'; puName = ++pu; } else if (*pu == 0) { AddPathElement(ppath, (string_t)puName, 0); break; } pu++; } } //** DeleteLastElement // // removes the last element from a parsed path // void DeleteLastElement( path_t ppath ) { PathElement *ppe, *ppelast; ppe = IFSLastElement(ppath); ppath->pp_totalLength -= ppe->pe_length; ppe->pe_length = 0; //set the new prefix length ppe = ppath->pp_elements; ppath->pp_prefixLength = 4; while(ppe->pe_length) { ppelast = ppe; ppe = IFSNextElement(ppe); if (ppe) ppath->pp_prefixLength += ppelast->pe_length; } } int ResNameCmp( LPPE lppeSrc, LPPE lppeDst ) { int i; for (i=0; i<2; ++i) { if (lppeSrc->pe_length != lppeDst->pe_length) break; if (wstrnicmp(lppeSrc->pe_unichars , lppeDst->pe_unichars , lppeSrc->pe_length-sizeof(lppeDst->pe_length))) break; lppeSrc = IFSNextElement(lppeSrc); lppeDst = IFSNextElement(lppeDst); } return (!(i==2));//return 0 if equal } int Conv83ToFcb( LPSTR lp83Name, LPSTR lpFcbName ) { int i, j; char ch; memset(lpFcbName, ' ', 11); for(i=0; ((ch=lp83Name[i]) && (i<8)); ++i) { if (ch=='.') break; lpFcbName[i] = ch; } if (lp83Name[i]=='.') { // Step over the dot ++i; // point to the extension area in the FCB format j = 8; for(;((ch=lp83Name[i]) && (j<11)); ++i, ++j) { lpFcbName[j] = ch; } return (i); } else { return (i); } } int Conv83UniToFcbUni( USHORT *lp83Name, USHORT *lpFcbName ) { int i, j; USHORT uch; for (i=0; i<11; ++i) { lpFcbName[i] = (USHORT)' '; } for(i=0; ((uch=lp83Name[i]) && (i<8)); ++i) { if (uch==(USHORT)'.') break; lpFcbName[i] = uch; } if (lp83Name[i]=='.') { // Step over the dot ++i; // point to the extension area in the FCB format j = 8; for(;((uch=lp83Name[i]) && (j<11)); ++i, ++j) { lpFcbName[j] = uch; } return (i); } else { return (i); } } void FillRootInfo( LPFIND32 lpFind32 ) { memset(lpFind32, 0, sizeof(WIN32_FIND_DATA)); lpFind32->dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY; lpFind32->cFileName[0] = lpFind32->cAlternateFileName[0] = '\\'; } int ReadInitValues() { VMMHKEY hKeyShadow; LPSTR lpWindir = NULL; int iSize = sizeof(int), lenWindir=0; DWORD dwType; extern int fLog, fShadow, fDiscon, fSpeadOpt, vlenShadowDir; extern ULONG ulMaxStoreSize, ulMaxLogfileSize; extern LPSTR vlpszShadowDir; if (_RegOpenKey(HKEY_LOCAL_MACHINE, REG_KEY_SHADOW, &hKeyShadow) == ERROR_SUCCESS) { #ifdef CSC_RECORDMANAGER_WINNT memset(vszShadowDir, 0, sizeof(vszShadowDir)); iSize = MAX_SHADOW_DIR_NAME+1; if(_RegQueryValueEx(hKeyShadow, REG_STRING_DATABASE_LOCATION, NULL, &dwType, vszShadowDir, &iSize)!=ERROR_SUCCESS) { Assert(strlen(vszDefShadowDir) <= MAX_SHADOW_DIR_NAME); KdPrint(("ReadInitValues: No vszShadowDb value in registry\r\n")); memcpy(vszShadowDir, vszDefShadowDir, strlen(vszDefShadowDir)); } #else #ifdef OLDCODE lpWindir = (LPSTR)GetConfigDir(); if (!lpWindir) { // VMM promises this to be valid!!! Assert(FALSE); return (0); } lenWindir = strlen(lpWindir); vlpszShadowDir = AllocMem(lenWindir+strlen(vszCSCDirName)+3); if (!vlpszShadowDir) { KdPrint(("ReadInitValues: Failed memroy allocation while\r\n")); return (0); } memcpy(vlpszShadowDir, lpWindir, lenWindir); if ((*(lpWindir+lenWindir-1))!='\\') { *(vlpszShadowDir+lenWindir)='\\'; } // NB vszCSCDirName has a trailing backslash strcat(vlpszShadowDir, vszCSCDirName); vlenShadowDir = strlen(vlpszShadowDir); KdPrint(("ReadInitValues: ShadowDbDir is %s\r\n", vlpszShadowDir)); #endif // OLDCODE #endif // CSC_RECORDMANAGER_WINNT #ifdef MAYBE // we should let the agent decide whether shadowing should be on or off _RegQueryValueEx(hKeyShadow, vszEnableShadow, NULL, &dwType, &fShadow, &iSize); #endif // MAYBE iSize = sizeof(int); _RegQueryValueEx(hKeyShadow, vszEnableRemoteLog, NULL, &dwType, &fLog, &iSize); iSize = sizeof(int); _RegQueryValueEx(hKeyShadow, vszEnableDisconnect, NULL, &dwType, &fDiscon, &iSize); iSize = sizeof(int); _RegQueryValueEx(hKeyShadow, vszEnableSpeadOpt, NULL, &dwType, &fSpeadOpt, &iSize); iSize = sizeof(ULONG); _RegQueryValueEx(hKeyShadow, vszMaxShadowStoreHex, NULL, &dwType, &ulMaxStoreSize, &iSize); iSize = sizeof(ULONG); if(_RegQueryValueEx(hKeyShadow, vszMaxLogfileSize, NULL, &dwType, &ulMaxLogfileSize, &iSize)!=ERROR_SUCCESS) { ulMaxLogfileSize = MAX_LOGFILE_SIZE; } else if (ulMaxLogfileSize < MIN_LOGFILE_SIZE) { ulMaxLogfileSize = MIN_LOGFILE_SIZE; } _RegCloseKey(hKeyShadow); ulMaxStoreSize = 0xffffffff; #ifdef MAYBE ulMaxStoreSize = UlGetDefaultShadowStore(vszShadowDir); #endif //MAYBE return(1); } return (0); } BOOL IsSlowLink() { VMMHKEY hKeyRemote; int iSize = sizeof(int), fRemote=0; DWORD dwType; if (_RegOpenKey(HKEY_LOCAL_MACHINE, vszRemoteAccess, &hKeyRemote) == ERROR_SUCCESS) { _RegQueryValueEx(hKeyRemote, vszRemoteConnection, NULL, &dwType, &fRemote, &iSize); _RegCloseKey(hKeyRemote); } return (fRemote); } BOOL FHasWildcard( USHORT *lpuName, int cMax ) { int i; BOOL fRet = FALSE; USHORT uT; for (i=0; idwHighDateTime += secs*(HIGH_ONE_SEC+1); return(0); //stop complaining about no return value } int FParentMatch( LPPP lpp1, LPPP lpp2 ) { PathElement *ppe1, *ppe2, *ppe1Last, *ppe2Last; int fMatch = FALSE; //If either of them is root then say they have invalid parents if (IFSIsRoot(lpp1) || IFSIsRoot(lpp2)) return 0; ppe1Last = IFSLastElement(lpp1); ppe2Last = IFSLastElement(lpp2); ppe1 = lpp1->pp_elements; ppe2 = lpp2->pp_elements; while((ppe1!=ppe1Last) && (ppe2!= ppe2Last)) { if (ppe1->pe_length!=ppe1->pe_length) return 0; if (wstrnicmp(ppe1->pe_unichars, ppe2->pe_unichars, ppe1->pe_length-2)) return 0; ppe1 = IFSNextElement(ppe1); ppe2 = IFSNextElement(ppe2); } return ((ppe1==ppe1Last) && (ppe2==ppe2Last)); } LPSTR mystrpbrk( LPSTR lpSrc, LPSTR lpDelim ) { char c, c1; LPSTR lpSav; BOOL fBegin = FALSE; for(;c = *lpSrc; ++lpSrc) { // skip leading blanks if (!fBegin) { if (c==' ') continue; else fBegin = TRUE; } lpSav = lpDelim; while (c1 = *lpDelim++) { if (c==c1) return (lpSrc); } lpDelim = lpSav; } return (NULL); } LPWSTR wstrpbrk( LPWSTR lpSrc, LPWSTR lpDelim ) { USHORT c, c1; LPWSTR lpSav; BOOL fBegin = FALSE; for(;c = *lpSrc; ++lpSrc) { // skip leading blanks if (!fBegin) { if (c==L' ') { continue; } else { fBegin = TRUE; } } lpSav = lpDelim; while (c1 = *lpDelim++) { if (c==c1) { return (lpSrc); } } lpDelim = lpSav; } return (NULL); } int OfflineToOnlinePath ( path_t ppath ) { if (!IFSIsRoot(ppath) && IsOfflinePE(ppath->pp_elements)) { OfflineToOnlinePE(ppath->pp_elements); ppath->pp_totalLength -= sizeof(USHORT); ppath->pp_prefixLength-= sizeof(USHORT); } return(0); //stop complaining about no return value } int OnlineToOfflinePath ( path_t ppath ) { // Must have space for one extra character OnlineToOfflinePE(ppath->pp_elements); ppath->pp_totalLength += sizeof(USHORT); ppath->pp_prefixLength += sizeof(USHORT); return(0); //stop complaining about no return value } BOOL IsOfflinePE ( LPPE lppe ) { return(lppe->pe_unichars[1] == UCHAR_OFFLINE); } int OfflineToOnlinePE ( LPPE lppe ) { ULONG size; size = wstrlen(lppe->pe_unichars)*2+2; mymemmove(&(lppe->pe_unichars[1]) ,&(lppe->pe_unichars[2]) ,size-2*sizeof(USHORT)); lppe->pe_length-= sizeof(USHORT); return(0); //stop complaining about no return value } int OnlineToOfflinePE ( LPPE lppe ) { ULONG size; size = wstrlen(lppe->pe_unichars)*2+2; // Must have space for one extra character mymemmove(&(lppe->pe_unichars[2]) ,&(lppe->pe_unichars[1]) ,size-sizeof(USHORT)); lppe->pe_unichars[1] = UCHAR_OFFLINE; lppe->pe_length += sizeof(USHORT); return(0); //stop complaining about no return value } BOOL IsOfflineUni( USHORT *lpuName ) { return(lpuName[2] == UCHAR_OFFLINE); } int OfflineToOnlineUni( USHORT *lpuName, ULONG size) { if (!size) { size = wstrlen(lpuName)*2+2; } mymemmove(&(lpuName[2]) ,&(lpuName[3]) ,size-3*sizeof(short)); return(0); //stop complaining about no return value } int OnlineToOfflineUni( USHORT *lpuName, ULONG size) { if (!size) { size = wstrlen(lpuName)*2+2; } // Must have space for one extra character mymemmove(&(lpuName[3]) ,&(lpuName[2]) ,size-2*sizeof(USHORT)); lpuName[2] = UCHAR_OFFLINE; return(0); //stop complaining about no return value } LPVOID mymemmove( LPVOID lpDst, LPVOID lpSrc, ULONG size ) { int i; if (!size) return (lpDst); // if lpDst does not fall within the source array, just do memcpy if (!( ( lpDst > lpSrc ) && ( ((LPBYTE)lpDst) < ((LPBYTE)lpSrc)+size ) )) { memcpy(lpDst, lpSrc, size); } else { // do reverse copy for (i=size-1;i>=0;--i) { *((LPBYTE)lpDst+i) = *((LPBYTE)lpSrc+i); } } return (lpDst); } #ifdef MAYBE ULONG UlGetDefaultShadowStore(LPSTR lpDrive) { int indx; ULONG ulSize=0; ULONG uSectorsPerCluster, uBytesPerSector, uFreeClusters, uTotalClusters; if (indx = GetDriveIndex(lpDrive)) { if (GetDiskFreeSpace(indx , &uSectorsPerCluster , &uBytesPerSector , &uFreeClusters , &uTotalClusters) >= 0) { ulSize = (uTotalClusters * uSectorsPerCluster * uBytesPerSector * 10)/100; } } return ulSize; } #endif //MAYBE #ifndef CSC_RECORDMANAGER_WINNT int GetDriveIndex(LPSTR lpDrive) { int c; if (*(lpDrive+1)==':') { c = *lpDrive; c = _mytoupper(c); return (c - 'A'+1); } return (0); } #endif BOOL HasHeuristicTypeExtensions( USHORT *lpwzFileName ) { ULONG lenName = wstrlen(lpwzFileName); int i; if (lenName > 4) { for (i=0; i<(sizeof(rgwzHeuristicExtensionTab)/sizeof(USHORT *)); ++i) { if (!wstrnicmp(&lpwzFileName[lenName-4], rgwzHeuristicExtensionTab[i], 4*sizeof(USHORT))) { return (TRUE); } } } return (FALSE); } VOID IncrementFileTime( _FILETIME *lpft ) { DWORD dwTemp = lpft->dwLowDateTime; ++lpft->dwLowDateTime; // if it rolled over, there was a carry if (lpft->dwLowDateTime < dwTemp) lpft->dwHighDateTime++; } BOOL CreateStringArrayFromDelimitedList( IN LPWSTR lpwzDelimitedList, IN LPWSTR lpwzDelimiters, IN LPWSTR *lprgwzStringArray, OUT LPDWORD lpdwCount ) { LPWSTR lpStart, lpEnd, lpTmp; USHORT c; BOOL fRet = FALSE; *lpdwCount = 0; lpStart = lpwzDelimitedList; lpEnd = lpStart + wstrlen(lpwzDelimitedList); // points to null // strip out the trailing spaces for(;(lpStart lpStart)); lpStart = lpTmp+1) { lpTmp = lpStart; c = *lpStart; if (c == L' ') { continue; } Assert(*lpStart != L' '); lpTmp = wstrpbrk(lpStart, lpwzDelimiters); if (lprgwzStringArray) { if (lpTmp) { *lpTmp = 0; // create a string out of it } // plug the start pointer into the array lprgwzStringArray[*lpdwCount] = lpStart; } ++*lpdwCount; } fRet = TRUE; done: return (fRet); } BOOL IsValidName(LPSTR lpName) { int len = strlen(lpName), ch, i=0; if (len != INODE_STRING_LENGTH) { return FALSE; } while (len--) { ++i; ch = *lpName++; if (!(((ch>='0') && (ch <='9'))|| ((ch>='A') && (ch <='F'))|| ((ch>='a') && (ch <='f')))) { return FALSE; } } if (i != INODE_STRING_LENGTH) { return FALSE; } return (TRUE); } BOOL DeleteDirectoryFiles( LPCSTR lpszDir ) { _WIN32_FIND_DATAA sFind32; char buff[MAX_PATH+32]; CSCHFILE hFind; int lenDir; BOOL fOK = TRUE; strcpy(buff, lpszDir); lenDir = strlen(buff); if (!lenDir) { return (FALSE); } if ((hFind = FindFirstFileLocal(buff, &sFind32))) { if (buff[lenDir-1] != '\\') { buff[lenDir++] ='\\'; buff[lenDir]=0; } do { buff[lenDir] = 0; if (!(sFind32.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && IsValidName(sFind32.cFileName)) { strcat(buff, sFind32.cFileName); if(DeleteFileLocal(buff, ATTRIB_DEL_ANY) < 0) { fOK = FALSE; break; } } } while(FindNextFileLocal(hFind, &sFind32) >= 0); FindCloseLocal(hFind); } return (fOK); }