? objfre_wnet_amd64 ? objfre_wxp_x86 Index: cvsflt.c =================================================================== RCS file: /scotty/cvsflt/cvsflt/cvsflt.c,v retrieving revision 1.8 diff -c -r1.8 cvsflt.c *** cvsflt.c 18 Sep 2012 11:58:07 -0000 1.8 --- cvsflt.c 19 Sep 2012 09:00:22 -0000 *************** *** 511,516 **** --- 511,519 ---- #define CVSDEBUG_TRACE_EVENTLOG 0x00000040 //trace event actions #define CVSDEBUG_TRACE_ALLPOSIX 0x00000080 //trace all posix filenames #define CVSDEBUG_TRACE_SOMEPOSIX 0x00000100 //trace some posix filenames + #define CVSDEBUG_TRACE_SIMILARPOSIX 0x00000200 //trace similar posix filenames + #define CVSDEBUG_TRACE_TAILPOSIX 0x00000400 //trace similar posix filenames + #define CVSDEBUG_TRACE_ESSENTIAL 0x00000800 //trace essential info add/remove/etc. ULONG SfDebug = 0; *************** *** 6647,6653 **** try { RtlCopyMemory(OutputBuffer, &ver, sizeof(struct _CVSFLT_GETVERSION_OUT)); ! CVS_LOG_PRINT(CVSDEBUG_TRACE_SOMEPOSIX,("CvsFlt!CVSFLT_GetVersion: Returns %x\n",(int)ver.Version)); } except (EXCEPTION_EXECUTE_HANDLER) { --- 6650,6656 ---- try { RtlCopyMemory(OutputBuffer, &ver, sizeof(struct _CVSFLT_GETVERSION_OUT)); ! CVS_LOG_PRINT(CVSDEBUG_TRACE_ESSENTIAL,("CvsFlt!CVSFLT_GetVersion: Returns %x\n",(int)ver.Version)); } except (EXCEPTION_EXECUTE_HANDLER) { *************** *** 6909,6914 **** --- 6912,6919 ---- try { CVSFLT_DIRECTORY *DirBuf; + CVSFLT_DIRECTORY *DirLoopTmp; + UNICODE_STRING strlooptmp; KIRQL oldIrql; size_t Len; *************** *** 6926,6933 **** return STATUS_NO_MEMORY; } ! CVS_LOG_PRINT(CVSDEBUG_TRACE_IOCTL,("CvsFlt!CvsAddPosixDirectory: Add %S\n",Dir)); ! CVS_LOG_PRINT(CVSDEBUG_TRACE_SOMEPOSIX,("CvsFlt!CvsAddPosixDirectory: Add %S\n",Dir)); RtlZeroMemory(DirBuf,Len + sizeof(CVSFLT_DIRECTORY)); RtlStringCbCopyW(DirBuf->wsz,Len,Dir); --- 6931,6937 ---- return STATUS_NO_MEMORY; } ! CVS_LOG_PRINT(CVSDEBUG_TRACE_ESSENTIAL,("CvsFlt!CvsAddPosixDirectory: Add %S\n",Dir)); RtlZeroMemory(DirBuf,Len + sizeof(CVSFLT_DIRECTORY)); RtlStringCbCopyW(DirBuf->wsz,Len,Dir); *************** *** 6936,6941 **** --- 6940,6961 ---- DirBuf->Temporary = Temporary; if(Temporary) DirBuf->FileObject = FileObject; + + /* right here would be a good place to loop through the existing gCvsDirectoryListRoot */ + /* and check for a duplicate in the list */ + DirLoopTmp = gCvsDirectoryListRoot; + while(DirLoopTmp) + { + if(((!Temporary && !DirLoopTmp->Temporary) || (Temporary && DirLoopTmp->Temporary && FileObject==DirLoopTmp->FileObject)) + && (!Dir || !RtlCompareUnicodeString(&strlooptmp,&DirLoopTmp->Directory,TRUE))) + { + /* found a duplicate entry, so ignore this */ + return STATUS_SUCCESS; + } + else + DirLoopTmp = DirLoopTmp->Next; + } + KeAcquireSpinLock( &gCvsDirectoryListLock, &oldIrql ); DirBuf->Next = gCvsDirectoryListRoot; gCvsDirectoryListRoot = DirBuf; *************** *** 6960,6967 **** KIRQL oldIrql; UNICODE_STRING str1; ! CVS_LOG_PRINT(CVSDEBUG_TRACE_IOCTL,("CvsFlt!CvsRemovePosixDirectory: Remove %S\n",Dir?Dir:(Temporary?L"all temporary":L"all global directories"))); ! CVS_LOG_PRINT(CVSDEBUG_TRACE_SOMEPOSIX,("CvsFlt!CvsRemovePosixDirectory: Remove %S\n",Dir?Dir:(Temporary?L"all temporary":L"all global directories"))); KeAcquireSpinLock( &gCvsDirectoryListLock, &oldIrql ); DirBuf = gCvsDirectoryListRoot; --- 6980,6986 ---- KIRQL oldIrql; UNICODE_STRING str1; ! CVS_LOG_PRINT(CVSDEBUG_TRACE_ESSENTIAL,("CvsFlt!CvsRemovePosixDirectory: Remove %S\n",Dir?Dir:(Temporary?L"all temporary":L"all global directories"))); KeAcquireSpinLock( &gCvsDirectoryListLock, &oldIrql ); DirBuf = gCvsDirectoryListRoot; *************** *** 7120,7132 **** { result = RtlStringCbCopyNW(Dir,DirLen,DirBuf->wsz,DirBuf->Directory.Length); *OutLen=DirBuf->Directory.Length; ! CVS_LOG_PRINT(CVSDEBUG_TRACE_IOCTL,("CvsFlt!CvsGetPosixDirectory: Returns %S\n",Dir)); ! CVS_LOG_PRINT(CVSDEBUG_TRACE_SOMEPOSIX,("CvsFlt!CvsGetPosixDirectory: Returns %S\n",Dir)); } else { ! CVS_LOG_PRINT(CVSDEBUG_TRACE_IOCTL,("CvsFlt!CvsGetPosixDirectory: Fails\n")); ! CVS_LOG_PRINT(CVSDEBUG_TRACE_SOMEPOSIX,("CvsFlt!CvsGetPosixDirectory: Fails\n")); result = STATUS_NOT_FOUND; } --- 7139,7149 ---- { result = RtlStringCbCopyNW(Dir,DirLen,DirBuf->wsz,DirBuf->Directory.Length); *OutLen=DirBuf->Directory.Length; ! CVS_LOG_PRINT(CVSDEBUG_TRACE_ESSENTIAL,("CvsFlt!CvsGetPosixDirectory: Returns %S\n",Dir)); } else { ! CVS_LOG_PRINT(CVSDEBUG_TRACE_ESSENTIAL,("CvsFlt!CvsGetPosixDirectory: Fails\n")); result = STATUS_NOT_FOUND; } *************** *** 7205,7212 **** ULONG RetLen; POBJECT_NAME_INFORMATION Info = (POBJECT_NAME_INFORMATION)Buf; ! CVS_LOG_PRINT(CVSDEBUG_TRACE_IOCTL,("CvsFlt!CvsGetKernelName: %S\n",NameIn)); ! CVS_LOG_PRINT(CVSDEBUG_TRACE_SOMEPOSIX,("CvsFlt!CvsGetKernelName: %S\n",NameIn)); RtlInitUnicodeString(&ni,NameIn); --- 7222,7228 ---- ULONG RetLen; POBJECT_NAME_INFORMATION Info = (POBJECT_NAME_INFORMATION)Buf; ! CVS_LOG_PRINT(CVSDEBUG_TRACE_ESSENTIAL,("CvsFlt!CvsGetKernelName: %S\n",NameIn)); RtlInitUnicodeString(&ni,NameIn); *************** *** 7239,7246 **** //memcpy(NameOut,Info->Name.Buffer,Info->Name.Length); *NameOutLen=Info->Name.Length; ! CVS_LOG_PRINT(CVSDEBUG_TRACE_IOCTL,("CvsFlt!CvsGetKernelName: Returns %S\n",NameOut)); ! CVS_LOG_PRINT(CVSDEBUG_TRACE_SOMEPOSIX,("CvsFlt!CvsGetKernelName: Returns %wZ (%S)\n",Info->Name,NameOut)); return status; } except (EXCEPTION_EXECUTE_HANDLER) { --- 7255,7261 ---- //memcpy(NameOut,Info->Name.Buffer,Info->Name.Length); *NameOutLen=Info->Name.Length; ! CVS_LOG_PRINT(CVSDEBUG_TRACE_ESSENTIAL,("CvsFlt!CvsGetKernelName: Returns %S\n",NameOut)); return status; } except (EXCEPTION_EXECUTE_HANDLER) { *************** *** 7329,7339 **** { CVSFLT_DIRECTORY *DirBuf; KIRQL oldIrql; ! BOOLEAN bRet = FALSE, bSimilar = FALSE; PIO_ERROR_LOG_PACKET errlog_pkt; PWSTR myname = L"expired"; PWSTR myrun = L"running"; size_t myrunlen =0, mynamelen = 0, packetlen = 0; /* ULONG */ LARGE_INTEGER CvsCurrentTime; --- 7344,7359 ---- { CVSFLT_DIRECTORY *DirBuf; KIRQL oldIrql; ! BOOLEAN bRet = FALSE, bSimilar = FALSE, bTailMatch = FALSE; PIO_ERROR_LOG_PACKET errlog_pkt; PWSTR myname = L"expired"; PWSTR myrun = L"running"; size_t myrunlen =0, mynamelen = 0, packetlen = 0; /* ULONG */ + WCHAR dirchar; + PWSTR dirptr; + WCHAR str1char; + PWSTR str1ptr; + USHORT kk = 0; LARGE_INTEGER CvsCurrentTime; *************** *** 7487,7492 **** --- 7507,7531 ---- /* Make a copy, truncate it and only compare if the result is equal */ UNICODE_STRING str1; str1 = *FileName; + + /* a little debugging test - see if the final 5 characters are the same + this is a bit like an in built debugging filter - it helps - trust me */ + if((str1.Length>(sizeof(WCHAR)*29))&&(DirBuf->Directory.Length>(sizeof(WCHAR)*29))&&(str1.Length>=DirBuf->Directory.Length)) + { + bTailMatch=TRUE; + dirptr = DirBuf->Directory.Buffer + ( DirBuf->Directory.Length - (sizeof(WCHAR)*6) ); + str1ptr = str1.Buffer + ( DirBuf->Directory.Length - (sizeof(WCHAR)*6) ); + /* compare all except the last character - last character is NULL for at least one of the strings. */ + /*for (USHORT kk = 0; (kkDirBuf->Directory.Length) str1.Length=DirBuf->Directory.Length; if(str1.Length+1==DirBuf->Directory.Length) *************** *** 7500,7507 **** if(!RtlCompareUnicodeString(&str1,&DirBuf->Directory,TRUE)) { bRet = TRUE; ! if (bRet || bSimilar) ! CVS_LOG_PRINT(CVSDEBUG_TRACE_SOMEPOSIX,("CvsFlt!CvsIsPosixFileName: %s: %wZ == %wZ\n", bSimilar?"similar":"identical",FileName,&DirBuf->Directory)); break; } else --- 7539,7545 ---- if(!RtlCompareUnicodeString(&str1,&DirBuf->Directory,TRUE)) { bRet = TRUE; ! CVS_LOG_PRINT(CVSDEBUG_TRACE_SOMEPOSIX,("CvsFlt!CvsIsPosixFileName: %s: %wZ == %wZ\n", bRet?"identical":"similar",FileName,&DirBuf->Directory)); break; } else *************** *** 7510,7518 **** else DirBuf = DirBuf->Next; ! //if(bSimilar && 0) ! // CVS_LOG_PRINT(CVSDEBUG_TRACE_SOMEPOSIX,("CvsFlt!CvsIsPosixFileName: %s: %wZ == %wZ\n", bSimilar?"similar":"identical",FileName,&DirBuf->Directory)); bSimilar = FALSE; } KeReleaseSpinLock( &gCvsDirectoryListLock, oldIrql ); } except (EXCEPTION_EXECUTE_HANDLER) { --- 7548,7559 ---- else DirBuf = DirBuf->Next; ! if(bSimilar) ! CVS_LOG_PRINT(CVSDEBUG_TRACE_SIMILARPOSIX,("CvsFlt!CvsIsPosixFileName: %s: %wZ == %wZ\n", bRet?"identical":"similar",FileName,&DirBuf->Directory)); ! if(bTailMatch) ! CVS_LOG_PRINT(CVSDEBUG_TRACE_TAILPOSIX,("CvsFlt!CvsIsPosixFileName: %s: %wZ == %wZ\n", "tail matches",FileName,&DirBuf->Directory)); bSimilar = FALSE; + bTailMatch = FALSE; } KeReleaseSpinLock( &gCvsDirectoryListLock, oldIrql ); } except (EXCEPTION_EXECUTE_HANDLER) {