From fb396036ccf3a0fd75d57c68e1e301b291245371 Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Thu, 24 May 2012 15:51:00 +0200 Subject: added new Link class and corresponding operation - replace read junction link target code with already existing Qt code Change-Id: I6642f19ceb9a907791987ced8e9eacc6ca4f2780 Reviewed-by: Karsten Heimrich --- src/libs/kdtools/kdsysinfo_win.cpp | 91 ++------------------------------------ 1 file changed, 3 insertions(+), 88 deletions(-) (limited to 'src/libs/kdtools') diff --git a/src/libs/kdtools/kdsysinfo_win.cpp b/src/libs/kdtools/kdsysinfo_win.cpp index 3e99e3925..8681c6825 100644 --- a/src/libs/kdtools/kdsysinfo_win.cpp +++ b/src/libs/kdtools/kdsysinfo_win.cpp @@ -22,6 +22,8 @@ #include "kdsysinfo.h" +#include "link.h" + #include #include #include @@ -249,93 +251,6 @@ bool killProcess(const ProcessInfo &process, int msecs) return returnValue; } -// REPARSE_DATA_BUFFER structure from msdn help: http://msdn.microsoft.com/en-us/library/ff552012.aspx -typedef struct _REPARSE_DATA_BUFFER { - ULONG ReparseTag; - USHORT ReparseDataLength; - USHORT Reserved; - union { - struct { - USHORT SubstituteNameOffset; - USHORT SubstituteNameLength; - USHORT PrintNameOffset; - USHORT PrintNameLength; - ULONG Flags; - WCHAR PathBuffer[1]; - } SymbolicLinkReparseBuffer; - struct { - USHORT SubstituteNameOffset; - USHORT SubstituteNameLength; - USHORT PrintNameOffset; - USHORT PrintNameLength; - WCHAR PathBuffer[1]; - } MountPointReparseBuffer; - struct { - UCHAR DataBuffer[1]; - } GenericReparseBuffer; - }; -} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER; - -QString junctionTargetPath(const QString &path) -{ - HANDLE fileHandle; - fileHandle = CreateFile(path.utf16(), FILE_READ_EA, FILE_SHARE_READ | FILE_SHARE_WRITE | - FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | - FILE_FLAG_OPEN_REPARSE_POINT, NULL); - if (fileHandle == INVALID_HANDLE_VALUE) { - qDebug() << QString::fromLatin1("Could not open: '%1'; error: %2\n").arg(path).arg(GetLastError()); - return path; - } - - REPARSE_DATA_BUFFER* reparseStructData = (REPARSE_DATA_BUFFER*)calloc(1, MAXIMUM_REPARSE_DATA_BUFFER_SIZE); - - DWORD bytesReturned; - // fill the reparseStructData - BOOL isOk = DeviceIoControl(fileHandle, FSCTL_GET_REPARSE_POINT, NULL, 0, reparseStructData, - MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &bytesReturned, NULL); - if (isOk == FALSE) { - DWORD deviceIOControlError = GetLastError(); - if (deviceIOControlError == ERROR_NOT_A_REPARSE_POINT) - qDebug() << QString::fromLatin1("Could not reparse information (windows symlink) for %1").arg(path); - else { - qDebug() << QString::fromLatin1("Get DeviceIoControl for %1 failed with error: %2").arg( - path).arg(deviceIOControlError); - } - CloseHandle(fileHandle); - return path; - } - CloseHandle(fileHandle); - - QString realPath = path; - if (IsReparseTagMicrosoft(reparseStructData->ReparseTag)) { - size_t realPathLength = 0; - WCHAR *realPathWCHAR = 0; - if (reparseStructData->ReparseTag == IO_REPARSE_TAG_SYMLINK){ - realPathLength = reparseStructData->SymbolicLinkReparseBuffer.PrintNameLength / sizeof(WCHAR); - realPathWCHAR = new WCHAR[realPathLength + 1]; - wcsncpy_s(realPathWCHAR, realPathLength + 1, &reparseStructData->SymbolicLinkReparseBuffer.PathBuffer[ - reparseStructData->SymbolicLinkReparseBuffer.PrintNameOffset / sizeof(WCHAR)], realPathLength); - } else if (reparseStructData->ReparseTag == IO_REPARSE_TAG_MOUNT_POINT) { - realPathLength = reparseStructData->MountPointReparseBuffer.PrintNameLength / sizeof(WCHAR); - realPathWCHAR = new WCHAR[realPathLength + 1]; - wcsncpy_s(realPathWCHAR, realPathLength + 1, &reparseStructData->MountPointReparseBuffer.PathBuffer[ - reparseStructData->MountPointReparseBuffer.PrintNameOffset / sizeof(WCHAR)], realPathLength); - } else { - qDebug() << QString::fromLatin1("Path %1 is not a symlink and not a mount point.").arg(path); - } - if (realPathLength != 0) { - realPathWCHAR[realPathLength] = 0; - realPath = QString::fromStdWString(realPathWCHAR); - delete [] realPathWCHAR; - } - - } else { - qDebug() << QString::fromLatin1("Path %1 is not reparse point.").arg(path); - } - free(reparseStructData); - return realPath; -} - bool pathIsOnLocalDevice(const QString &path) { if (!QFileInfo(path).exists()) @@ -348,7 +263,7 @@ bool pathIsOnLocalDevice(const QString &path) do { if (QFileInfo(dir, QString()).isSymLink()) { QString currentPath = QFileInfo(dir, QString()).absoluteFilePath(); - return pathIsOnLocalDevice(junctionTargetPath(currentPath)); + return pathIsOnLocalDevice(Link(currentPath).targetPath()); } } while (dir.cdUp()); -- cgit v1.2.3