1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2003-2008 - Stefan Kueng
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 #include "GitAdminDir.h"
25 #define REGISTRYTIMEOUT 2000
26 #define EXCLUDELISTTIMEOUT 5000
27 #define ADMINDIRTIMEOUT 10000
28 #define DRIVETYPETIMEOUT 300000 // 5 min
29 #define NUMBERFMTTIMEOUT 300000
30 #define MENUTIMEOUT 100
32 typedef CComCritSecLock
<CComCriticalSection
> Locker
;
35 * \ingroup TortoiseShell
36 * Helper class which caches access to the registry. Also provides helper methods
37 * for checks against the settings stored in the registry.
47 dllFull
,// same as dll except it uses commandline git tool with all status modes supported
51 cachetype
= CRegStdDWORD(_T("Software\\TortoiseGit\\CacheType"), GetSystemMetrics(SM_REMOTESESSION
) ? dll
: exe
);
52 showrecursive
= CRegStdDWORD(_T("Software\\TortoiseGit\\RecursiveOverlay"), TRUE
);
53 folderoverlay
= CRegStdDWORD(_T("Software\\TortoiseGit\\FolderOverlay"), TRUE
);
54 driveremote
= CRegStdDWORD(_T("Software\\TortoiseGit\\DriveMaskRemote"));
55 drivefixed
= CRegStdDWORD(_T("Software\\TortoiseGit\\DriveMaskFixed"), TRUE
);
56 drivecdrom
= CRegStdDWORD(_T("Software\\TortoiseGit\\DriveMaskCDROM"));
57 driveremove
= CRegStdDWORD(_T("Software\\TortoiseGit\\DriveMaskRemovable"));
58 drivefloppy
= CRegStdDWORD(_T("Software\\TortoiseGit\\DriveMaskFloppy"));
59 driveram
= CRegStdDWORD(_T("Software\\TortoiseGit\\DriveMaskRAM"));
60 driveunknown
= CRegStdDWORD(_T("Software\\TortoiseGit\\DriveMaskUnknown"));
61 excludelist
= CRegStdString(_T("Software\\TortoiseGit\\OverlayExcludeList"));
62 includelist
= CRegStdString(_T("Software\\TortoiseGit\\OverlayIncludeList"));
63 simplecontext
= CRegStdDWORD(_T("Software\\TortoiseGit\\SimpleContext"), FALSE
);
64 unversionedasmodified
= CRegStdDWORD(_T("Software\\TortoiseGit\\UnversionedAsModified"), FALSE
);
65 hidemenusforunversioneditems
= CRegStdDWORD(_T("Software\\TortoiseGit\\HideMenusForUnversionedItems"), FALSE
);
66 showunversionedoverlay
= CRegStdDWORD(_T("Software\\TortoiseGit\\ShowUnversionedOverlay"), TRUE
);
67 showignoredoverlay
= CRegStdDWORD(_T("Software\\TortoiseGit\\ShowIgnoredOverlay"), TRUE
);
68 getlocktop
= CRegStdDWORD(_T("Software\\TortoiseGit\\GetLockTop"), TRUE
);
69 excludedasnormal
= CRegStdDWORD(_T("Software\\TortoiseGit\\ShowExcludedAsNormal"), TRUE
);
70 cachetypeticker
= GetTickCount();
71 recursiveticker
= cachetypeticker
;
72 folderoverlayticker
= cachetypeticker
;
73 driveticker
= cachetypeticker
;
74 drivetypeticker
= cachetypeticker
;
75 langticker
= cachetypeticker
;
76 columnrevformatticker
= cachetypeticker
;
77 excludelistticker
= cachetypeticker
;
78 includelistticker
= cachetypeticker
;
79 simplecontextticker
= cachetypeticker
;
80 unversionedasmodifiedticker
= cachetypeticker
;
81 showunversionedoverlayticker
= cachetypeticker
;
82 showignoredoverlayticker
= cachetypeticker
;
83 admindirticker
= cachetypeticker
;
84 columnseverywhereticker
= cachetypeticker
;
85 getlocktopticker
= cachetypeticker
;
86 excludedasnormalticker
= cachetypeticker
;
87 hidemenusforunversioneditemsticker
= cachetypeticker
;
88 excontextticker
= cachetypeticker
;
90 unsigned __int64 entries
= MENUSYNC
|MENUCREATEREPOS
|MENUCLONE
|MENUCOMMIT
;
91 menulayoutlow
= CRegStdDWORD(_T("Software\\TortoiseGit\\ContextMenuEntries"), entries
&0xFFFFFFFF);
92 menulayouthigh
= CRegStdDWORD(_T("Software\\TortoiseGit\\ContextMenuEntrieshigh"), entries
>>32);
94 unsigned __int64 ext
=(MENUSVNIGNORE
|MENUREFLOG
|MENUREFBROWSE
|MENUSTASHAPPLY
|MENUSUBSYNC
);
95 menuextlow
= CRegStdDWORD(_T("Software\\TortoiseGit\\ContextMenuExtEntriesLow"), ext
&0xFFFFFFFF );
96 menuexthigh
= CRegStdDWORD(_T("Software\\TortoiseGit\\ContextMenuExtEntriesHigh"), ext
>>32 );
98 menumasklow_lm
= CRegStdDWORD(_T("Software\\TortoiseGit\\ContextMenuEntriesMaskLow"), 0, FALSE
, HKEY_LOCAL_MACHINE
);
99 menumaskhigh_lm
= CRegStdDWORD(_T("Software\\TortoiseGit\\ContextMenuEntriesMaskHigh"), 0, FALSE
, HKEY_LOCAL_MACHINE
);
100 menumasklow_cu
= CRegStdDWORD(_T("Software\\TortoiseGit\\ContextMenuEntriesMaskLow"), 0);
101 menumaskhigh_cu
= CRegStdDWORD(_T("Software\\TortoiseGit\\ContextMenuEntriesMaskHigh"), 0);
102 langid
= CRegStdDWORD(_T("Software\\TortoiseGit\\LanguageID"), 1033);
103 blockstatus
= CRegStdDWORD(_T("Software\\TortoiseGit\\BlockStatus"), 0);
104 columnseverywhere
= CRegStdDWORD(_T("Software\\TortoiseGit\\ColumnsEveryWhere"), FALSE
);
105 for (int i
=0; i
<27; i
++)
107 drivetypecache
[i
] = (UINT
)-1;
109 // A: and B: are floppy disks
110 drivetypecache
[0] = DRIVE_REMOVABLE
;
111 drivetypecache
[1] = DRIVE_REMOVABLE
;
113 columnrevformatticker
= GetTickCount();
114 SecureZeroMemory(&columnrevformat
, sizeof(NUMBERFMT
));
115 GetLocaleInfo(LOCALE_USER_DEFAULT
, LOCALE_SDECIMAL
, &szDecSep
[0], _countof(szDecSep
));
116 GetLocaleInfo(LOCALE_USER_DEFAULT
, LOCALE_STHOUSAND
, &szThousandsSep
[0], _countof(szThousandsSep
));
117 columnrevformat
.lpDecimalSep
= szDecSep
;
118 columnrevformat
.lpThousandSep
= szThousandsSep
;
119 GetLocaleInfo(LOCALE_USER_DEFAULT
, LOCALE_SGROUPING
, &szBuffer
[0], _countof(szBuffer
));
120 columnrevformat
.Grouping
= _ttoi(szBuffer
);
121 GetLocaleInfo(LOCALE_USER_DEFAULT
, LOCALE_INEGNUMBER
, &szBuffer
[0], _countof(szBuffer
));
122 columnrevformat
.NegativeOrder
= _ttoi(szBuffer
);
123 sAdminDirCacheKey
.reserve(MAX_PATH
); // MAX_PATH as buffer reservation ok.
124 nocontextpaths
= CRegStdString(_T("Software\\TortoiseGit\\NoContextPaths"), _T(""));
130 showrecursive
.read();
131 folderoverlay
.read();
141 simplecontext
.read();
142 unversionedasmodified
.read();
143 showunversionedoverlay
.read();
144 showignoredoverlay
.read();
145 excludedasnormal
.read();
146 hidemenusforunversioneditems
.read();
147 menulayoutlow
.read();
148 menulayouthigh
.read();
151 columnseverywhere
.read();
153 menumasklow_lm
.read();
154 menumaskhigh_lm
.read();
155 menumasklow_cu
.read();
156 menumaskhigh_cu
.read();
157 nocontextpaths
.read();
159 CacheType
GetCacheType()
161 if ((GetTickCount() - REGISTRYTIMEOUT
) > cachetypeticker
)
163 cachetypeticker
= GetTickCount();
166 return CacheType(DWORD((cachetype
)));
170 if ((GetTickCount() - REGISTRYTIMEOUT
) > blockstatusticker
)
172 blockstatusticker
= GetTickCount();
175 return (blockstatus
);
177 unsigned __int64
GetMenuLayout()
179 if ((GetTickCount() - REGISTRYTIMEOUT
) > layoutticker
)
181 layoutticker
= GetTickCount();
182 menulayoutlow
.read();
183 menulayouthigh
.read();
185 unsigned __int64 temp
= unsigned __int64(DWORD(menulayouthigh
))<<32;
186 temp
|= unsigned __int64(DWORD(menulayoutlow
));
190 unsigned __int64
GetMenuExt()
192 if ((GetTickCount() - REGISTRYTIMEOUT
) > exticker
)
194 exticker
= GetTickCount();
198 unsigned __int64 temp
= unsigned __int64(DWORD(menuexthigh
))<<32;
199 temp
|= unsigned __int64(DWORD(menuextlow
));
203 unsigned __int64
GetMenuMask()
205 if ((GetTickCount() - REGISTRYTIMEOUT
) > menumaskticker
)
207 menumaskticker
= GetTickCount();
208 menumasklow_lm
.read();
209 menumaskhigh_lm
.read();
210 menumasklow_cu
.read();
211 menumaskhigh_cu
.read();
213 DWORD low
= (DWORD
)menumasklow_lm
| (DWORD
)menumasklow_cu
;
214 DWORD high
= (DWORD
)menumaskhigh_lm
| (DWORD
)menumaskhigh_cu
;
215 unsigned __int64 temp
= unsigned __int64(high
)<<32;
216 temp
|= unsigned __int64(low
);
221 if ((GetTickCount() - REGISTRYTIMEOUT
)>recursiveticker
)
223 recursiveticker
= GetTickCount();
224 showrecursive
.read();
226 return (showrecursive
);
228 BOOL
IsFolderOverlay()
230 if ((GetTickCount() - REGISTRYTIMEOUT
)>folderoverlayticker
)
232 folderoverlayticker
= GetTickCount();
233 folderoverlay
.read();
235 return (folderoverlay
);
237 BOOL
IsSimpleContext()
239 if ((GetTickCount() - REGISTRYTIMEOUT
)>simplecontextticker
)
241 simplecontextticker
= GetTickCount();
242 simplecontext
.read();
244 return (simplecontext
!=0);
246 BOOL
IsUnversionedAsModified()
248 if ((GetTickCount() - REGISTRYTIMEOUT
)>unversionedasmodifiedticker
)
250 unversionedasmodifiedticker
= GetTickCount();
251 unversionedasmodified
.read();
253 return (unversionedasmodified
);
255 BOOL
ShowUnversionedOverlay()
257 if ((GetTickCount() - REGISTRYTIMEOUT
)>showunversionedoverlayticker
)
259 showunversionedoverlayticker
= GetTickCount();
260 showunversionedoverlay
.read();
262 return (showunversionedoverlay
);
264 BOOL
ShowIgnoredOverlay()
266 if ((GetTickCount() - REGISTRYTIMEOUT
)>showignoredoverlayticker
)
268 showignoredoverlayticker
= GetTickCount();
269 showignoredoverlay
.read();
271 return (showignoredoverlay
);
275 if ((GetTickCount() - REGISTRYTIMEOUT
)>getlocktopticker
)
277 getlocktopticker
= GetTickCount();
282 BOOL
ShowExcludedAsNormal()
284 if ((GetTickCount() - REGISTRYTIMEOUT
)>excludedasnormalticker
)
286 excludedasnormalticker
= GetTickCount();
287 excludedasnormal
.read();
289 return (excludedasnormal
);
291 BOOL
ShellCache::HideMenusForUnversionedItems()
293 if ((GetTickCount() - hidemenusforunversioneditemsticker
)>REGISTRYTIMEOUT
)
295 hidemenusforunversioneditemsticker
= GetTickCount();
296 hidemenusforunversioneditems
.read();
298 return (hidemenusforunversioneditems
);
303 return (driveremote
);
318 return (driveremove
);
328 return (driveunknown
);
330 BOOL
IsContextPathAllowed(LPCTSTR path
)
332 Locker
lock(m_critSec
);
333 ExcludeContextValid();
334 for (std::vector
<stdstring
>::iterator I
= excontextvector
.begin(); I
!= excontextvector
.end(); ++I
)
338 if (I
->size() && I
->at(I
->size()-1)=='*')
340 stdstring str
= I
->substr(0, I
->size()-1);
341 if (_tcsnicmp(str
.c_str(), path
, str
.size())==0)
344 else if (_tcsicmp(I
->c_str(), path
)==0)
349 BOOL
IsPathAllowed(LPCTSTR path
)
351 Locker
lock(m_critSec
);
353 for (std::vector
<stdstring
>::iterator I
= invector
.begin(); I
!= invector
.end(); ++I
)
357 if (I
->at(I
->size()-1)=='*')
359 stdstring str
= I
->substr(0, I
->size()-1);
360 if (_tcsnicmp(str
.c_str(), path
, str
.size())==0)
362 if (str
.size() && (str
.at(str
.size()-1) == '\\') && (_tcsnicmp(str
.c_str(), path
, str
.size()-1)==0))
365 else if (_tcsicmp(I
->c_str(), path
)==0)
367 else if ((I
->at(I
->size()-1) == '\\') &&
368 ((_tcsnicmp(I
->c_str(), path
, I
->size())==0) || (_tcsicmp(I
->c_str(), path
)==0)) )
373 int drivenumber
= PathGetDriveNumber(path
);
374 if ((drivenumber
>=0)&&(drivenumber
< 25))
376 drivetype
= drivetypecache
[drivenumber
];
377 if ((drivetype
== -1)||((GetTickCount() - DRIVETYPETIMEOUT
)>drivetypeticker
))
379 if ((drivenumber
== 0)||(drivenumber
== 1))
380 drivetypecache
[drivenumber
] = DRIVE_REMOVABLE
;
383 drivetypeticker
= GetTickCount();
384 TCHAR pathbuf
[MAX_PATH
+4]; // MAX_PATH ok here. PathStripToRoot works with partial paths too.
385 _tcsncpy_s(pathbuf
, MAX_PATH
+4, path
, MAX_PATH
+3);
386 PathStripToRoot(pathbuf
);
387 PathAddBackslash(pathbuf
);
388 ATLTRACE2(_T("GetDriveType for %s, Drive %d\n"), pathbuf
, drivenumber
);
389 drivetype
= GetDriveType(pathbuf
);
390 drivetypecache
[drivenumber
] = drivetype
;
396 TCHAR pathbuf
[MAX_PATH
+4]; // MAX_PATH ok here. PathIsUNCServer works with partial paths too.
397 _tcsncpy_s(pathbuf
, MAX_PATH
+4, path
, MAX_PATH
+3);
398 if (PathIsUNCServer(pathbuf
))
399 drivetype
= DRIVE_REMOTE
;
402 PathStripToRoot(pathbuf
);
403 PathAddBackslash(pathbuf
);
404 if (_tcsncmp(pathbuf
, drivetypepathcache
, MAX_PATH
-1)==0) // MAX_PATH ok.
405 drivetype
= drivetypecache
[26];
408 ATLTRACE2(_T("GetDriveType for %s\n"), pathbuf
);
409 drivetype
= GetDriveType(pathbuf
);
410 drivetypecache
[26] = drivetype
;
411 _tcsncpy_s(drivetypepathcache
, MAX_PATH
, pathbuf
, MAX_PATH
); // MAX_PATH ok.
415 if ((drivetype
== DRIVE_REMOVABLE
)&&(!IsRemovable()))
417 if ((drivetype
== DRIVE_REMOVABLE
)&&(drivefloppy
== 0)&&((drivenumber
==0)||(drivenumber
==1)))
419 if ((drivetype
== DRIVE_FIXED
)&&(!IsFixed()))
421 if (((drivetype
== DRIVE_REMOTE
)||(drivetype
== DRIVE_NO_ROOT_DIR
))&&(!IsRemote()))
423 if ((drivetype
== DRIVE_CDROM
)&&(!IsCDRom()))
425 if ((drivetype
== DRIVE_RAMDISK
)&&(!IsRAM()))
427 if ((drivetype
== DRIVE_UNKNOWN
)&&(IsUnknown()))
431 for (std::vector
<stdstring
>::iterator I
= exvector
.begin(); I
!= exvector
.end(); ++I
)
435 if (I
->size() && I
->at(I
->size()-1)=='*')
437 stdstring str
= I
->substr(0, I
->size()-1);
438 if (_tcsnicmp(str
.c_str(), path
, str
.size())==0)
441 else if (_tcsicmp(I
->c_str(), path
)==0)
448 if ((GetTickCount() - REGISTRYTIMEOUT
) > langticker
)
450 langticker
= GetTickCount();
455 NUMBERFMT
* GetNumberFmt()
457 if ((GetTickCount() - NUMBERFMTTIMEOUT
) > columnrevformatticker
)
460 columnrevformatticker
= GetTickCount();
461 SecureZeroMemory(&columnrevformat
, sizeof(NUMBERFMT
));
462 GetLocaleInfo(LOCALE_USER_DEFAULT
, LOCALE_SDECIMAL
, &szDecSep
[0], _countof(szDecSep
));
463 GetLocaleInfo(LOCALE_USER_DEFAULT
, LOCALE_STHOUSAND
, &szThousandsSep
[0], _countof(szThousandsSep
));
464 columnrevformat
.lpDecimalSep
= szDecSep
;
465 columnrevformat
.lpThousandSep
= szThousandsSep
;
466 GetLocaleInfo(LOCALE_USER_DEFAULT
, LOCALE_SGROUPING
, &szBuffer
[0], _countof(szBuffer
));
467 columnrevformat
.Grouping
= _ttoi(szBuffer
);
468 GetLocaleInfo(LOCALE_USER_DEFAULT
, LOCALE_INEGNUMBER
, &szBuffer
[0], _countof(szBuffer
));
469 columnrevformat
.NegativeOrder
= _ttoi(szBuffer
);
471 return &columnrevformat
;
473 BOOL
HasGITAdminDir(LPCTSTR path
, BOOL bIsDir
, CString
*ProjectTopDir
= NULL
)
475 size_t len
= _tcslen(path
);
476 TCHAR
* buf
= new TCHAR
[len
+1];
477 _tcscpy_s(buf
, len
+1, path
);
480 TCHAR
* ptr
= _tcsrchr(buf
, '\\');
486 if ((GetTickCount() - ADMINDIRTIMEOUT
) < admindirticker
)
488 std::map
<stdstring
, AdminDir_s
>::iterator iter
;
489 sAdminDirCacheKey
.assign(buf
);
490 if ((iter
= admindircache
.find(sAdminDirCacheKey
)) != admindircache
.end())
493 if (ProjectTopDir
&& iter
->second
.bHasAdminDir
)
494 *ProjectTopDir
= iter
->second
.sProjectRoot
.c_str();
495 return iter
->second
.bHasAdminDir
;
498 CString sProjectRoot
;
499 BOOL hasAdminDir
= g_GitAdminDir
.HasAdminDir(buf
, true, &sProjectRoot
);
500 admindirticker
= GetTickCount();
501 Locker
lock(m_critSec
);
503 AdminDir_s
&ad
= admindircache
[buf
];
504 ad
.bHasAdminDir
= hasAdminDir
;
507 ad
.sProjectRoot
.assign(sProjectRoot
);
510 *ProjectTopDir
= sProjectRoot
;
516 bool IsColumnsEveryWhere()
518 if ((GetTickCount() - REGISTRYTIMEOUT
) > columnseverywhereticker
)
520 columnseverywhereticker
= GetTickCount();
521 columnseverywhere
.read();
523 return !!(DWORD
)columnseverywhere
;
528 if ((GetTickCount() - REGISTRYTIMEOUT
)>driveticker
)
530 driveticker
= GetTickCount();
538 void ExcludeContextValid()
540 if ((GetTickCount() - EXCLUDELISTTIMEOUT
)>excontextticker
)
542 Locker
lock(m_critSec
);
543 excontextticker
= GetTickCount();
544 nocontextpaths
.read();
545 if (excludecontextstr
.compare((stdstring
)nocontextpaths
)==0)
547 excludecontextstr
= (stdstring
)nocontextpaths
;
548 excontextvector
.clear();
549 size_t pos
= 0, pos_ant
= 0;
550 pos
= excludecontextstr
.find(_T("\n"), pos_ant
);
551 while (pos
!= stdstring::npos
)
553 stdstring token
= excludecontextstr
.substr(pos_ant
, pos
-pos_ant
);
554 excontextvector
.push_back(token
);
556 pos
= excludecontextstr
.find(_T("\n"), pos_ant
);
558 if (!excludecontextstr
.empty())
560 excontextvector
.push_back(excludecontextstr
.substr(pos_ant
, excludecontextstr
.size()-1));
562 excludecontextstr
= (stdstring
)nocontextpaths
;
565 void ExcludeListValid()
567 if ((GetTickCount() - EXCLUDELISTTIMEOUT
)>excludelistticker
)
569 Locker
lock(m_critSec
);
570 excludelistticker
= GetTickCount();
572 if (excludeliststr
.compare((stdstring
)excludelist
)==0)
574 excludeliststr
= (stdstring
)excludelist
;
576 size_t pos
= 0, pos_ant
= 0;
577 pos
= excludeliststr
.find(_T("\n"), pos_ant
);
578 while (pos
!= stdstring::npos
)
580 stdstring token
= excludeliststr
.substr(pos_ant
, pos
-pos_ant
);
581 exvector
.push_back(token
);
583 pos
= excludeliststr
.find(_T("\n"), pos_ant
);
585 if (!excludeliststr
.empty())
587 exvector
.push_back(excludeliststr
.substr(pos_ant
, excludeliststr
.size()-1));
589 excludeliststr
= (stdstring
)excludelist
;
592 void IncludeListValid()
594 if ((GetTickCount() - EXCLUDELISTTIMEOUT
)>includelistticker
)
596 Locker
lock(m_critSec
);
597 includelistticker
= GetTickCount();
599 if (includeliststr
.compare((stdstring
)includelist
)==0)
601 includeliststr
= (stdstring
)includelist
;
603 size_t pos
= 0, pos_ant
= 0;
604 pos
= includeliststr
.find(_T("\n"), pos_ant
);
605 while (pos
!= stdstring::npos
)
607 stdstring token
= includeliststr
.substr(pos_ant
, pos
-pos_ant
);
608 invector
.push_back(token
);
610 pos
= includeliststr
.find(_T("\n"), pos_ant
);
612 if (!includeliststr
.empty())
614 invector
.push_back(includeliststr
.substr(pos_ant
, includeliststr
.size()-1));
616 includeliststr
= (stdstring
)includelist
;
623 stdstring sProjectRoot
;
626 CRegStdDWORD cachetype
;
627 CRegStdDWORD blockstatus
;
629 CRegStdDWORD showrecursive
;
630 CRegStdDWORD folderoverlay
;
631 CRegStdDWORD getlocktop
;
632 CRegStdDWORD driveremote
;
633 CRegStdDWORD drivefixed
;
634 CRegStdDWORD drivecdrom
;
635 CRegStdDWORD driveremove
;
636 CRegStdDWORD drivefloppy
;
637 CRegStdDWORD driveram
;
638 CRegStdDWORD driveunknown
;
639 CRegStdDWORD menulayoutlow
; /* Fist level mask */
640 CRegStdDWORD menulayouthigh
;
641 CRegStdDWORD menuextlow
; /* ext menu mask */
642 CRegStdDWORD menuexthigh
;
643 CRegStdDWORD simplecontext
;
644 CRegStdDWORD menumasklow_lm
;
645 CRegStdDWORD menumaskhigh_lm
;
646 CRegStdDWORD menumasklow_cu
;
647 CRegStdDWORD menumaskhigh_cu
;
648 CRegStdDWORD unversionedasmodified
;
649 CRegStdDWORD showunversionedoverlay
;
650 CRegStdDWORD showignoredoverlay
;
651 CRegStdDWORD excludedasnormal
;
652 CRegStdString excludelist
;
653 CRegStdDWORD hidemenusforunversioneditems
;
654 CRegStdDWORD columnseverywhere
;
655 stdstring excludeliststr
;
656 std::vector
<stdstring
> exvector
;
657 CRegStdString includelist
;
658 stdstring includeliststr
;
659 std::vector
<stdstring
> invector
;
660 DWORD cachetypeticker
;
661 DWORD recursiveticker
;
662 DWORD folderoverlayticker
;
663 DWORD getlocktopticker
;
665 DWORD drivetypeticker
;
668 DWORD menumaskticker
;
670 DWORD blockstatusticker
;
671 DWORD columnrevformatticker
;
672 DWORD excludelistticker
;
673 DWORD includelistticker
;
674 DWORD simplecontextticker
;
675 DWORD unversionedasmodifiedticker
;
676 DWORD showunversionedoverlayticker
;
677 DWORD showignoredoverlayticker
;
678 DWORD excludedasnormalticker
;
679 DWORD hidemenusforunversioneditemsticker
;
680 DWORD columnseverywhereticker
;
681 UINT drivetypecache
[27];
682 TCHAR drivetypepathcache
[MAX_PATH
]; // MAX_PATH ok.
683 NUMBERFMT columnrevformat
;
685 TCHAR szThousandsSep
[5];
686 std::map
<stdstring
, AdminDir_s
> admindircache
;
687 stdstring sAdminDirCacheKey
;
688 CRegStdString nocontextpaths
;
689 stdstring excludecontextstr
;
690 std::vector
<stdstring
> excontextvector
;
691 DWORD excontextticker
;
692 DWORD admindirticker
;
693 CComCriticalSection m_critSec
;