BOOLEAN CreateDirectoryPath(_In_ PWSTR DirPath) { BOOLEAN success = FALSE; PPH_STRING dirPathString = NULL; PWSTR dirPathDup = NULL; if (RtlDoesFileExists_U(DirPath)) return TRUE; if ((dirPathDup = PhDuplicateStringZ(DirPath)) == NULL) goto CleanupExit; for (PWSTR path = _wcstok(dirPathDup, L"\\"); path; path = _wcstok(NULL, L"\\")) { if (!dirPathString) dirPathString = PhCreateString(path); else { PPH_STRING tempPathString; tempPathString = PhConcatStrings( 3, dirPathString->Buffer, L"\\", path ); if (!RtlDoesFileExists_U(PhGetString(tempPathString))) { if (!CreateDirectory(PhGetString(tempPathString), NULL)) { PhDereferenceObject(tempPathString); goto CleanupExit; } } PhSwapReference(&dirPathString, tempPathString); PhDereferenceObject(tempPathString); } } success = TRUE; CleanupExit: if (dirPathString) { PhDereferenceObject(dirPathString); } if (dirPathDup) { PhFree(dirPathDup); } return success; }
/////////////////////////////////////////////////////////////////////////////// /// \brief /// Parses the filter into an MgStringCollection /// void MgUnmanagedDataManager::ParseFilter(CREFSTRING filter, MgStringCollection* filters) { if (!filter.empty()) { wchar_t* token = const_cast<wchar_t*>(filter.c_str()); const wchar_t* delimit = L";, \t\r\n\v\f"; wchar_t* state = NULL; for (token = _wcstok(token, delimit, &state); token != NULL; token = _wcstok(NULL, delimit, &state)) { filters->Add(token); } } }
KShieldDirectory* KShieldDirectoryTree::FindMatchFrom(KShieldDirectory* pRoot, PWSTR pwszFullPath, KShieldDirectory** ppParentDir) { KLocker locker(&m_KSynchroObject); if (pRoot == NULL) pRoot = m_pRoot; if (pRoot == NULL || pwszFullPath == NULL) return NULL; int nPathLen = wcslen(pwszFullPath); PWSTR pwszFullPathSave = new WCHAR[nPathLen + sizeof(WCHAR)]; if (pwszFullPathSave == NULL) return NULL; wcscpy(pwszFullPathSave, pwszFullPath); KShieldDirectory* pItem = pRoot; PWSTR pwszLast; PWSTR pwszToken = _wcstok(pwszFullPathSave, L"\\/", &pwszLast); while (pwszToken != NULL) { pItem = pItem->FindMatch(pwszToken); if (pItem == NULL) break; pwszToken = _wcstok(NULL, L"\\/", &pwszLast); } if (ppParentDir != NULL) { *ppParentDir = NULL; if (pItem != NULL) *ppParentDir = pItem->m_pParentDirectory; } delete[] pwszFullPathSave; return pItem; }
BOOLEAN KShieldDirectoryTree::Add(PWSTR pwszFullPath, PVOID pUserContext) { KLocker locker(&m_KSynchroObject); if (pwszFullPath == NULL) return FALSE; int nPathLen = wcslen(pwszFullPath); int nSizeToken; PWSTR pwszFullPathSave = new WCHAR[nPathLen + sizeof(WCHAR)]; if (pwszFullPathSave == NULL) return FALSE; wcscpy(pwszFullPathSave, pwszFullPath); PWSTR pwszEndPath = pwszFullPathSave + nPathLen; BOOLEAN bRes = FALSE; PWSTR pwszLast; //PWSTR pwszToken = _wcstok(pwszFullPathSave, L"\\/"); PWSTR pwszToken = _wcstok(pwszFullPathSave, L"\\/", &pwszLast); if (pwszToken != NULL && m_pRoot == NULL) { m_pRoot = new KShieldDirectory(NULL); if (m_pRoot != NULL) { if (m_pRoot->Open(L"Root", NULL) != TRUE) { pwszToken = NULL; delete m_pRoot; m_pRoot = NULL; } } else { pwszToken = NULL; } } KShieldDirectory* pCurrentDir = m_pRoot; KShieldDirectory* pItem; PVOID pUserContextTmp; while (pwszToken != NULL) { pItem = pCurrentDir->Find(pwszToken); if (pItem == NULL) { pItem = pCurrentDir->Add(pwszToken, NULL); if (pItem == NULL) break; } nSizeToken = wcslen(pwszToken); if ((pwszToken+nSizeToken) != pwszEndPath) pUserContextTmp = NULL; else pUserContextTmp = pUserContext; if (pItem->m_pDirectoryInfo != NULL && pItem->m_pDirectoryInfo->m_pUserContext == NULL) { pItem->m_pDirectoryInfo->m_pUserContext = pUserContextTmp; if ((pwszToken+nSizeToken) == pwszEndPath) { if (pCurrentDir->m_pDirectoryInfo != NULL && pUserContextTmp != NULL) ++(pCurrentDir->m_pDirectoryInfo->m_dwUserCount); bRes = TRUE; } } pCurrentDir = pItem; pwszToken = _wcstok(NULL, L"\\/", &pwszLast); } delete[] pwszFullPathSave; return bRes; }