BOOL TIsVirtualizedDirV(void *path) { if (!IsWinVista()) return FALSE; WCHAR buf[MAX_PATH]; DWORD csidl[] = { CSIDL_WINDOWS, CSIDL_PROGRAM_FILES, CSIDL_PROGRAM_FILESX86, CSIDL_COMMON_APPDATA, 0xffffffff }; for (int i=0; csidl[i] != 0xffffffff; i++) { if (TSHGetSpecialFolderPathV(NULL, buf, csidl[i], FALSE)) { int len = strlenV(buf); if (strnicmpV(buf, path, len) == 0) { WCHAR ch = GetChar(path, len); if (ch == 0 || ch == '\\' || ch == '/') { return TRUE; } } // if (i == 0 && GetChar(buf, 1) == ':') { /* check system root directory */ // if (strnicmpV(path, buf, 3) == 0 && strchrV(MakeAddr(path, 4), '\\') == NULL) { // return TRUE; // } // } } } return FALSE; }
BOOL ConvertToX86Dir(void *target) { WCHAR buf[MAX_PATH]; WCHAR buf86[MAX_PATH]; int len; if (!TSHGetSpecialFolderPathV(NULL, buf, CSIDL_PROGRAM_FILES, FALSE)) return FALSE; len = strlenV(buf); SetChar(buf, len++, '\\'); SetChar(buf, len, 0); if (strnicmpV(buf, target, len)) return FALSE; if (!TSHGetSpecialFolderPathV(NULL, buf86, CSIDL_PROGRAM_FILESX86, FALSE)) return FALSE; MakePathV(buf, buf86, MakeAddr(target, len)); strcpyV(target, buf); return TRUE; }