BOOL WINAPI DeleteGroupW(LPCWSTR lpGroupName, BOOL bCommonGroup) { WCHAR szGroupPath[MAX_PATH]; DPRINT("DeleteGroupW() called\n"); if (lpGroupName == NULL || *lpGroupName == 0) return TRUE; if (!GetProgramsPath(bCommonGroup, szGroupPath)) { DPRINT1("GetProgramsPath() failed\n"); return FALSE; } DPRINT("Programs path: '%S'\n", szGroupPath); wcscat(szGroupPath, L"\\"); wcscat(szGroupPath, lpGroupName); DPRINT("Group path: '%S'\n", szGroupPath); /* Remove directory path */ if (!RemoveDirectoryPath (szGroupPath)) return FALSE; /* FIXME: Notify the shell */ DPRINT("DeleteGroupW() done\n"); return TRUE; }
BOOLEAN RemoveDirectoryPath(_In_ PWSTR DirPath) { HANDLE findHandle; PPH_STRING findPath; WIN32_FIND_DATA data = { 0 }; findPath = PhConcatStrings2(DirPath, L"\\*"); if ((findHandle = FindFirstFile(findPath->Buffer, &data)) == INVALID_HANDLE_VALUE) { if (GetLastError() == ERROR_FILE_NOT_FOUND) { PhDereferenceObject(findPath); return TRUE; } PhDereferenceObject(findPath); return FALSE; } do { if (PhEqualStringZ(data.cFileName, L".", TRUE) || PhEqualStringZ(data.cFileName, L"..", TRUE)) continue; if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { PPH_STRING dirPath = PhConcatStrings(3, DirPath, L"\\", data.cFileName); RemoveDirectoryPath(dirPath->Buffer); PhDereferenceObject(dirPath); } else { PPH_STRING filePath = PhConcatStrings(3, DirPath, L"\\", data.cFileName); if (data.dwFileAttributes & FILE_ATTRIBUTE_READONLY) { _wchmod(filePath->Buffer, _S_IWRITE); } SetupDeleteDirectoryFile(filePath->Buffer); PhDereferenceObject(filePath); } } while (FindNextFile(findHandle, &data)); FindClose(findHandle); // Delete the parent directory RemoveDirectory(DirPath); PhDereferenceObject(findPath); return TRUE; }