Index: windows-NT/posixdir/cvsflt/cvsflt.cpp =================================================================== RCS file: /cvs/cvsnt/windows-NT/posixdir/cvsflt/cvsflt.cpp,v retrieving revision 1.1.2.5.4.4 diff -c -r1.1.2.5.4.4 cvsflt.cpp *** windows-NT/posixdir/cvsflt/cvsflt.cpp 19 Sep 2012 07:32:59 -0000 1.1.2.5.4.4 --- windows-NT/posixdir/cvsflt/cvsflt.cpp 20 Sep 2012 02:49:15 -0000 *************** *** 124,129 **** --- 124,151 ---- return bRet; } + void DisplayString(LPCTSTR s) + { + HANDLE hFile = GetStdHandle(STD_OUTPUT_HANDLE); + DWORD dwUnused; + + if (GetFileType(hFile) != FILE_TYPE_CHAR) + WriteFile(hFile, s, lstrlen(s) * sizeof (s[0]), & dwUnused, NULL); + else + WriteConsole(hFile, s, lstrlen(s), &dwUnused, NULL); + } + + void DisplayErrString(LPCTSTR s) + { + HANDLE hFile = GetStdHandle(STD_ERROR_HANDLE); + DWORD dwUnused; + + if (GetFileType(hFile) != FILE_TYPE_CHAR) + WriteFile(hFile, s, lstrlen(s) * sizeof (s[0]), & dwUnused, NULL); + else + WriteConsole(hFile, s, lstrlen(s), &dwUnused, NULL); + } + BOOL CvsAddPosixDirectoryA(LPCSTR dir, BOOL temp) { return CvsAddPosixDirectoryW(AtoW(dir), temp); *************** *** 141,152 **** --- 163,181 ---- Dir = (struct _CVSFLT_ADDPOSIXDIRECTORY_IN*)Buf; if(!GetDosDeviceW(Dir->Directory,dir)) + { + //DisplayErrString(L"Get Failed "); DisplayErrString(dir); DisplayErrString(L" ... \n"); bRet = FALSE; + } else { + //DisplayString(L"Adding "); DisplayString(dir); DisplayString(L" ... \n"); Dir->Temporary=temp; if(!DeviceIoControl(g_hCvsFlt,CVSFLT_AddPosixDirectory,Buf,BufLen,Buf,BufLen,&dwRet,NULL)) + { + //DisplayErrString(L"I/O Failed "); DisplayErrString(dir); DisplayErrString(L" ... \n"); bRet = FALSE; + } } GlobalFree((HGLOBAL)Buf); return bRet; *************** *** 154,191 **** BOOL CvsAddPosixDirectoryW(LPCWSTR dir, BOOL temp) { ! BOOL bRetShort = FALSE, bRetLong = FALSE; // create buffers for the short and long version of this name DWORD add_short_len=0, add_long_len=0, add_result; add_result = GetShortPathNameW(dir,NULL,add_short_len); if (add_result>0) { PVOID add_short_str=NULL; ! add_long_len=add_result*sizeof(WCHAR); ! add_short_str = (LPVOID)GlobalAlloc(GPTR,add_result*sizeof(WCHAR)); if (add_short_str) { ! add_result = GetShortPathNameW(dir,(LPWSTR)add_short_str,add_short_len); if (add_result>0) bRetLong=CvsAddPosixDirectoryIntW((LPWSTR)add_short_str,temp); GlobalFree(add_short_str); } } add_result = GetLongPathNameW(dir,NULL,add_long_len); if (add_result>0) { PVOID add_long_str=NULL; add_long_len=add_result*sizeof(WCHAR); add_long_str = (LPVOID)GlobalAlloc(GPTR,add_long_len); if (add_long_str) { ! add_result = GetLongPathNameW(dir,(LPWSTR)add_long_str,add_long_len); if (add_result>0) bRetShort=CvsAddPosixDirectoryIntW((LPWSTR)add_long_str,temp); GlobalFree(add_long_str); } } ! return (bRetLong || bRetShort); } BOOL CvsRemovePosixDirectoryA(LPCSTR dir, BOOL temp) --- 183,267 ---- BOOL CvsAddPosixDirectoryW(LPCWSTR dir, BOOL temp) { ! BOOL bRetShort = FALSE, bRetLong = FALSE, bRetExact=FALSE, bMatchedExact = FALSE; // create buffers for the short and long version of this name DWORD add_short_len=0, add_long_len=0, add_result; + size_t dirlen; + //StringCbLength(dir,STRSAFE_MAX_CCH * sizeof(TCHAR),&dirlen); + try + { + dirlen=lstrlenW(dir); + } + catch (int efree2) + { + return (efree2>0)?FALSE:FALSE; + } + + // put the user supplied version of the path into the posix directory list in the driver + if (!bMatchedExact) + bRetExact=CvsAddPosixDirectoryIntW(dir,temp); + + // put the short version of the path into the posix directory list in the driver + try + { add_result = GetShortPathNameW(dir,NULL,add_short_len); if (add_result>0) { PVOID add_short_str=NULL; ! add_short_len=add_result*sizeof(WCHAR); ! add_short_str = (LPVOID)GlobalAlloc(GPTR,add_short_len); ! ZeroMemory(add_short_str,add_short_len); if (add_short_str) { ! add_result = GetShortPathNameW(dir,(LPWSTR)add_short_str,add_result); if (add_result>0) + { + //if (CompareString(LOCALE_USER_DEFAULT,NORM_IGNORECASE,(LPCWSTR)add_short_str,add_result,dir,dirlen)==CSTR_EQUAL) + if (lstrcmpiW(dir,(LPCWSTR)add_short_str)==0) + bMatchedExact = TRUE; + else bRetLong=CvsAddPosixDirectoryIntW((LPWSTR)add_short_str,temp); + } GlobalFree(add_short_str); } } + } + catch (int efree1) + { + return (efree1>0)?FALSE:FALSE; + } + + // put the long version of the path into the posix directory list in the driver + try + { add_result = GetLongPathNameW(dir,NULL,add_long_len); if (add_result>0) { PVOID add_long_str=NULL; add_long_len=add_result*sizeof(WCHAR); add_long_str = (LPVOID)GlobalAlloc(GPTR,add_long_len); + ZeroMemory(add_long_str,add_long_len); if (add_long_str) { ! add_result = GetLongPathNameW(dir,(LPWSTR)add_long_str,add_result); if (add_result>0) + { + //if (CompareString(LOCALE_USER_DEFAULT,NORM_IGNORECASE,(LPCWSTR)add_short_str,add_result,dir,dirlen)==CSTR_EQUAL) + if (lstrcmpiW(dir,(LPCWSTR)add_long_str)==0) + bMatchedExact = TRUE; + else bRetShort=CvsAddPosixDirectoryIntW((LPWSTR)add_long_str,temp); + } GlobalFree(add_long_str); } } ! } ! catch (int efree2) ! { ! return (efree2>0)?FALSE:FALSE; ! } ! ! return (bRetLong || bRetShort || bMatchedExact); } BOOL CvsRemovePosixDirectoryA(LPCSTR dir, BOOL temp) Index: windows-NT/posixdir/cvsflt/stdafx.h =================================================================== RCS file: /cvs/cvsnt/windows-NT/posixdir/cvsflt/stdafx.h,v retrieving revision 1.1.2.1.4.2 diff -c -r1.1.2.1.4.2 stdafx.h *** windows-NT/posixdir/cvsflt/stdafx.h 11 Sep 2012 06:04:39 -0000 1.1.2.1.4.2 --- windows-NT/posixdir/cvsflt/stdafx.h 20 Sep 2012 01:48:25 -0000 *************** *** 8,10 **** --- 8,11 ---- #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include + //#include Index: windows-NT/posixdir/setci/setci.cpp =================================================================== RCS file: /cvs/cvsnt/windows-NT/posixdir/setci/setci.cpp,v retrieving revision 1.1.2.5.4.1 diff -c -r1.1.2.5.4.1 setci.cpp *** windows-NT/posixdir/setci/setci.cpp 19 Sep 2012 07:32:59 -0000 1.1.2.5.4.1 --- windows-NT/posixdir/setci/setci.cpp 20 Sep 2012 02:05:30 -0000 *************** *** 22,50 **** int _tmain(int argc, _TCHAR* argv[]) { ! PVOID Buf; ! DWORD BufLen; ! ! if(argc<2 || argc>3 || (wcscmp(argv[1],L"-l") && argc<3) || (wcscmp(argv[1],L"-l") && wcscmp(argv[1],L"-a") && wcscmp(argv[1],L"-d"))) { ! fprintf(stderr,"Control directory case insensitivity\n\n"); ! fprintf(stderr,"Usage: setci [-l] [-a dir] [-d dir]\n"); ! fprintf(stderr,"\t-l\tList case insensitive directories\n"); ! fprintf(stderr,"\t-a dir\tAdd to case insensitive directory list\n"); ! fprintf(stderr,"\t-d dir\tRemove from case insensitive directory list\n"); return -1; } if(!CvsOpenFilter()) { ! fprintf(stderr,"Unable to open device driver (%08x)\n",GetLastError()); return -1; } ! BufLen = MAX_PATH*4; ! Buf = malloc(BufLen); ! ! if(!wcscmp(argv[1],L"-a")) { // remove trailing directory separator _TCHAR *dir_add_end, *dir_to_add=argv[2]; --- 22,44 ---- int _tmain(int argc, _TCHAR* argv[]) { ! if(argc<2 || argc>3 || (_tcscmp(argv[1],_T("-l")) && argc<3) || (_tcscmp(argv[1],_T("-l")) && _tcscmp(argv[1],_T("-a")) && _tcscmp(argv[1],_T("-d")))) { ! _ftprintf(stderr,_T("Control directory case insensitivity\n\n")); ! _ftprintf(stderr,_T("Usage: setci [-l] [-a dir] [-d dir]\n")); ! _ftprintf(stderr,_T("\t-l\tList case insensitive directories\n")); ! _ftprintf(stderr,_T("\t-a dir\tAdd to case insensitive directory list\n")); ! _ftprintf(stderr,_T("\t-d dir\tRemove from case insensitive directory list\n")); return -1; } if(!CvsOpenFilter()) { ! _ftprintf(stderr,_T("Unable to open device driver (%08x)\n"),GetLastError()); return -1; } ! if(!_tcscmp(argv[1],_T("-a"))) { // remove trailing directory separator _TCHAR *dir_add_end, *dir_to_add=argv[2]; *************** *** 52,58 **** while ((*dir_add_end==L'\0')||(*dir_add_end==L'\\')||(*dir_add_end==L'/')) dir_add_end--; if (*dir_add_end!=L'\0') ! *dir_add_end=L'\0'; DWORD fa = GetFileAttributes(dir_to_add); if(fa==0xFFFFFFFF || !(fa&FILE_ATTRIBUTE_DIRECTORY)) --- 46,52 ---- while ((*dir_add_end==L'\0')||(*dir_add_end==L'\\')||(*dir_add_end==L'/')) dir_add_end--; if (*dir_add_end!=L'\0') ! *(++dir_add_end)=L'\0'; DWORD fa = GetFileAttributes(dir_to_add); if(fa==0xFFFFFFFF || !(fa&FILE_ATTRIBUTE_DIRECTORY)) *************** *** 61,87 **** return -1; } if(!CvsAddPosixDirectory(dir_to_add,FALSE)) { ! fprintf(stderr,"Call to driver failed (%08x)\n",GetLastError()); return -1; } ! } else if(!wcscmp(argv[1],L"-d")) { // remove trailing directory separator _TCHAR *dir_rm_end, *dir_to_rm=argv[2]; ! dir_to_rm = dir_to_rm+wcslen(dir_to_rm); while ((*dir_rm_end==L'\0')||(*dir_rm_end==L'\\')||(*dir_rm_end==L'/')) dir_rm_end--; if (*dir_rm_end!=L'\0') ! *dir_rm_end=L'\0'; if(!CvsRemovePosixDirectory(dir_to_rm,FALSE)) { ! fprintf(stderr,"Call to driver failed (%08x)\n",GetLastError()); return -1; } ! } else if(!wcscmp(argv[1],L"-l")) { TCHAR dir[MAX_PATH]; unsigned short Count = 0; --- 55,82 ---- return -1; } + //_ftprintf(stderr,_T("Adding %s ... \n"),dir_to_add); if(!CvsAddPosixDirectory(dir_to_add,FALSE)) { ! _ftprintf(stderr,_T("Call to driver failed (%08x)\n"),GetLastError()); return -1; } ! } else if(!_tcscmp(argv[1],_T("-d"))) { // remove trailing directory separator _TCHAR *dir_rm_end, *dir_to_rm=argv[2]; ! dir_rm_end = dir_to_rm+wcslen(dir_to_rm); while ((*dir_rm_end==L'\0')||(*dir_rm_end==L'\\')||(*dir_rm_end==L'/')) dir_rm_end--; if (*dir_rm_end!=L'\0') ! *(++dir_rm_end)=L'\0'; if(!CvsRemovePosixDirectory(dir_to_rm,FALSE)) { ! _ftprintf(stderr,_T("Call to driver failed (%08x)\n"),GetLastError()); return -1; } ! } else if(!_tcscmp(argv[1],_T("-l"))) { TCHAR dir[MAX_PATH]; unsigned short Count = 0; *************** *** 93,99 **** } CvsCloseFilter(); - free(Buf); return 0; } --- 88,93 ---- ? amd64 ? cvsflt ? i386 ? cvsfltlib/Release ? cvsflttest/Release ? inusemonitor/Release ? wix/cvsflt.cat ? wix/cvsflt.wixobj ? wix/cvsflt64.cat ? wix/ui.wixobj Index: cvsfltlib/cvsflt.cpp =================================================================== RCS file: /scotty/cvsflt/cvsfltlib/cvsflt.cpp,v retrieving revision 1.7 diff -c -r1.7 cvsflt.cpp *** cvsfltlib/cvsflt.cpp 19 Sep 2012 06:18:56 -0000 1.7 --- cvsfltlib/cvsflt.cpp 20 Sep 2012 03:15:01 -0000 *************** *** 129,148 **** BOOL CvsAddPosixDirectoryW(LPCWSTR dir, BOOL temp) { ! BOOL bRetShort = FALSE, bRetLong = FALSE; // create buffers for the short and long version of this name DWORD add_short_len=0, add_long_len=0, add_result; add_result = GetShortPathNameW(dir,NULL,add_short_len); if (add_result>0) { LPVOID add_short_str=NULL; ! add_long_len=add_result*sizeof(WCHAR); ! add_short_str = new char[add_long_len]; if (add_short_str) { ! add_result = GetShortPathNameW(dir,(LPWSTR)add_short_str,add_short_len); if (add_result>0) bRetLong=CvsAddPosixDirectoryIntW((LPWSTR)add_short_str,temp); delete[] add_short_str; } } --- 129,158 ---- BOOL CvsAddPosixDirectoryW(LPCWSTR dir, BOOL temp) { ! BOOL bRetShort = FALSE, bRetLong = FALSE, bRetExact=FALSE, bMatchedExact = FALSE; // create buffers for the short and long version of this name DWORD add_short_len=0, add_long_len=0, add_result; + size_t dirlen; + dirlen=wcslen(dir); + if (!bMatchedExact) + bRetExact=CvsAddPosixDirectoryIntW(dir,temp); add_result = GetShortPathNameW(dir,NULL,add_short_len); if (add_result>0) { LPVOID add_short_str=NULL; ! add_short_len=add_result*sizeof(WCHAR); ! add_short_str = new char[add_short_len]; ! ZeroMemory(add_short_str,add_short_len); if (add_short_str) { ! add_result = GetShortPathNameW(dir,(LPWSTR)add_short_str,add_result); if (add_result>0) + { + if (wcscmp(dir,(LPCWSTR)add_short_str)==0) + bMatchedExact = TRUE; + else bRetLong=CvsAddPosixDirectoryIntW((LPWSTR)add_short_str,temp); + } delete[] add_short_str; } } *************** *** 152,166 **** LPVOID add_long_str=NULL; add_long_len=add_result*sizeof(WCHAR); add_long_str = new char [add_long_len]; if (add_long_str) { add_result = GetLongPathNameW(dir,(LPWSTR)add_long_str,add_long_len); if (add_result>0) bRetShort=CvsAddPosixDirectoryIntW((LPWSTR)add_long_str,temp); delete[] add_long_str; } } ! return (bRetLong || bRetShort); } BOOL CvsRemovePosixDirectoryA(LPCSTR dir, BOOL temp) --- 162,182 ---- LPVOID add_long_str=NULL; add_long_len=add_result*sizeof(WCHAR); add_long_str = new char [add_long_len]; + ZeroMemory(add_long_str,add_long_len); if (add_long_str) { add_result = GetLongPathNameW(dir,(LPWSTR)add_long_str,add_long_len); if (add_result>0) + { + if (wcscmp(dir,(LPCWSTR)add_long_str)==0) + bMatchedExact = TRUE; + else bRetShort=CvsAddPosixDirectoryIntW((LPWSTR)add_long_str,temp); + } delete[] add_long_str; } } ! return (bRetLong || bRetShort || bMatchedExact); } BOOL CvsRemovePosixDirectoryA(LPCSTR dir, BOOL temp) Index: cvsflt.c =================================================================== RCS file: /scotty/cvsflt/cvsflt/cvsflt.c,v retrieving revision 1.9 diff -c -r1.9 cvsflt.c *** cvsflt.c 19 Sep 2012 09:08:01 -0000 1.9 --- cvsflt.c 20 Sep 2012 02:38:53 -0000 *************** *** 510,519 **** #define CVSDEBUG_TRACE_IOCTL 0x00000020 //trace ioctl actions #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; --- 510,520 ---- #define CVSDEBUG_TRACE_IOCTL 0x00000020 //trace ioctl actions #define CVSDEBUG_TRACE_EVENTLOG 0x00000040 //trace event actions #define CVSDEBUG_TRACE_ALLPOSIX 0x00000080 //trace all posix filenames ! #define CVSDEBUG_TRACE_UNUSED 0x00000100 // - not currently in use - #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. + #define CVSDEBUG_TRACE_MATCHPOSIX 0x00001000 //trace matching posix filenames. ULONG SfDebug = 0; *************** *** 6931,6938 **** 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); --- 6932,6937 ---- *************** *** 6944,6961 **** --- 6943,6965 ---- /* right here would be a good place to loop through the existing gCvsDirectoryListRoot */ /* and check for a duplicate in the list */ DirLoopTmp = gCvsDirectoryListRoot; + if(Dir) + RtlInitUnicodeString(&strlooptmp,Dir); 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 */ + CVS_LOG_PRINT(CVSDEBUG_TRACE_ESSENTIAL,("CvsFlt!CvsAddPosixDirectory: Ignore %S\n",Dir)); return STATUS_SUCCESS; } else DirLoopTmp = DirLoopTmp->Next; } + CVS_LOG_PRINT(CVSDEBUG_TRACE_ESSENTIAL,("CvsFlt!CvsAddPosixDirectory: Add %S\n",Dir)); + KeAcquireSpinLock( &gCvsDirectoryListLock, &oldIrql ); DirBuf->Next = gCvsDirectoryListRoot; gCvsDirectoryListRoot = DirBuf; *************** *** 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 --- 7543,7549 ---- if(!RtlCompareUnicodeString(&str1,&DirBuf->Directory,TRUE)) { bRet = TRUE; ! CVS_LOG_PRINT(CVSDEBUG_TRACE_MATCHPOSIX,("CvsFlt!CvsIsPosixFileName: %s: %wZ == %wZ\n", bRet?"identical":"similar",FileName,&DirBuf->Directory)); break; } else