summaryrefslogtreecommitdiffstats
path: root/src/libs/installer/link.cpp
diff options
context:
space:
mode:
authorkh1 <karsten.heimrich@digia.com>2013-01-23 14:29:03 +0100
committerKarsten Heimrich <karsten.heimrich@digia.com>2013-01-29 11:12:24 +0100
commit8633d999d691f7072a6a40679398750e1af5f850 (patch)
tree67eb0742981ede47c1612c44d0a7b7aaac9d713c /src/libs/installer/link.cpp
parent80ceccff00a46ecd37ed2c65784cb5905d067526 (diff)
Make IFW compile with mingw.
Change-Id: I0336e02ef701a2bc392bd385d1822bc51cee0c5c Reviewed-by: Kai Koehne <kai.koehne@digia.com>
Diffstat (limited to 'src/libs/installer/link.cpp')
-rw-r--r--src/libs/installer/link.cpp52
1 files changed, 29 insertions, 23 deletions
diff --git a/src/libs/installer/link.cpp b/src/libs/installer/link.cpp
index 19b50aa49..28f8190d5 100644
--- a/src/libs/installer/link.cpp
+++ b/src/libs/installer/link.cpp
@@ -50,10 +50,19 @@
#endif
#ifdef Q_OS_WIN
+#ifdef Q_CC_MINGW
+# ifndef _WIN32_WINNT
+# define _WIN32_WINNT 0x0501
+# endif
+#else
+# include <strsafe.h>
+#endif
+
#include <windows.h>
-#include <strsafe.h>
+#include <winioctl.h>
+
+#if !defined(REPARSE_DATA_BUFFER_HEADER_SIZE)
-// 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;
@@ -79,8 +88,9 @@ typedef struct _REPARSE_DATA_BUFFER {
} GenericReparseBuffer;
};
} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
+#define REPARSE_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
-#define _REPARSE_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(_REPARSE_DATA_BUFFER, GenericReparseBuffer)
+#endif
class FileHandleWrapper
@@ -154,35 +164,31 @@ Link createJunction(const QString &linkPath, const QString &targetPath)
return Link(linkPath);
}
- TCHAR szDestDir[1024] = L"\\??\\"; //you need this to create valid unicode junctions
-
- QString normalizedTargetPath = QString(targetPath).replace(QLatin1Char('/'), QLatin1Char('\\'));
- //now we add the real absolute path
- StringCchCat(szDestDir, 1024, (wchar_t*)normalizedTargetPath.utf16());
+ const QString szDestDir = QString::fromLatin1("\\??\\").arg(targetPath).replace(QLatin1Char('/'),
+ QLatin1Char('\\'));
// Allocates a block of memory for an array of num elements(1) and initializes all its bits to zero.
- _REPARSE_DATA_BUFFER* reparseStructData = (_REPARSE_DATA_BUFFER*)calloc(1,
+ REPARSE_DATA_BUFFER* reparseStructData = (REPARSE_DATA_BUFFER*)calloc(1,
MAXIMUM_REPARSE_DATA_BUFFER_SIZE);
- const size_t destMountPointBytes = lstrlen(szDestDir) * sizeof(WCHAR);
-
+ reparseStructData->Reserved = 0;
reparseStructData->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;
+ reparseStructData->MountPointReparseBuffer.PrintNameLength = 0;
+ reparseStructData->MountPointReparseBuffer.SubstituteNameOffset = 0;
+ reparseStructData->MountPointReparseBuffer.SubstituteNameLength = szDestDir.length();
+ reparseStructData->MountPointReparseBuffer.PrintNameOffset = szDestDir.length() + sizeof(WCHAR);
- // Reserved(USHORT) + SubstituteNameOffset(USHORT) + SubstituteNameLength(USHORT)
- // + PrintNameOffset(USHORT) + PrintNameLength(USHORT) + PathBuffer[1](WCHAR)
uint spaceAfterGeneralData = sizeof(USHORT) * 5 + sizeof(WCHAR); //should be 12
- reparseStructData->ReparseDataLength = destMountPointBytes + spaceAfterGeneralData;
- reparseStructData->Reserved = 0;
- reparseStructData->MountPointReparseBuffer.SubstituteNameOffset = 0;
- reparseStructData->MountPointReparseBuffer.SubstituteNameLength = destMountPointBytes;
- // + sizeof(WCHAR) means \0 termination at the end of the string
- reparseStructData->MountPointReparseBuffer.PrintNameOffset = destMountPointBytes + sizeof(WCHAR);
- reparseStructData->MountPointReparseBuffer.PrintNameLength = 0;
- StringCchCopy(reparseStructData->MountPointReparseBuffer.PathBuffer, 1024, szDestDir);
+ reparseStructData->ReparseDataLength = szDestDir.length() + spaceAfterGeneralData;
+#ifndef Q_CC_MINGW
+ StringCchCopy(reparseStructData->MountPointReparseBuffer.PathBuffer, 1024, (wchar_t*)szDestDir.utf16());
+#else
+ wcsncpy(reparseStructData->MountPointReparseBuffer.PathBuffer, (wchar_t*)szDestDir.utf16(), 1024);
+#endif
DWORD bytesReturned;
if (!::DeviceIoControl(dirHandle.handle(), FSCTL_SET_REPARSE_POINT, reparseStructData,
- reparseStructData->ReparseDataLength + _REPARSE_DATA_BUFFER_HEADER_SIZE, 0, 0,
+ reparseStructData->ReparseDataLength + REPARSE_DATA_BUFFER_HEADER_SIZE, 0, 0,
&bytesReturned, 0)) {
qWarning() << QString::fromLatin1("Could not set the reparse point: for '%1' to %2; error: %3"
).arg(linkPath, targetPath).arg(GetLastError());
@@ -193,7 +199,7 @@ Link createJunction(const QString &linkPath, const QString &targetPath)
bool removeJunction(const QString &path)
{
// Allocates a block of memory for an array of num elements(1) and initializes all its bits to zero.
- _REPARSE_DATA_BUFFER* reparseStructData = (_REPARSE_DATA_BUFFER*)calloc(1,
+ REPARSE_DATA_BUFFER* reparseStructData = (REPARSE_DATA_BUFFER*)calloc(1,
MAXIMUM_REPARSE_DATA_BUFFER_SIZE);
reparseStructData->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;