1
/* $Id: path-win.cpp $ */
1
/* $Id: path-win.cpp 34003 2010-11-11 17:21:56Z vboxsync $ */
3
3
* IPRT - Path manipulation.
7
* Copyright (C) 2006-2007 Oracle Corporation
7
* Copyright (C) 2006-2010 Oracle Corporation
9
9
* This file is part of VirtualBox Open Source Edition (OSE), as
10
10
* available from http://www.virtualbox.org. This file is free software;
226
Data.dwFileAttributes = FindData.dwFileAttributes;
227
Data.ftCreationTime = FindData.ftCreationTime;
228
Data.ftLastAccessTime = FindData.ftLastAccessTime;
229
Data.ftLastWriteTime = FindData.ftLastWriteTime;
230
Data.nFileSizeHigh = FindData.nFileSizeHigh;
231
Data.nFileSizeLow = FindData.nFileSizeLow;
227
Data.dwFileAttributes = FindData.dwFileAttributes;
228
Data.ftCreationTime = FindData.ftCreationTime;
229
Data.ftLastAccessTime = FindData.ftLastAccessTime;
230
Data.ftLastWriteTime = FindData.ftLastWriteTime;
231
Data.nFileSizeHigh = FindData.nFileSizeHigh;
232
Data.nFileSizeLow = FindData.nFileSizeLow;
240
RTUtf16Free(pwszPath);
243
* Getting the information for the link target is a bit annoying and
244
* subject to the same access violation mess as above.. :/
246
/** @todo we're too lazy wrt to error paths here... */
241
247
if ( (fFlags & RTPATH_F_FOLLOW_LINK)
242
248
&& (Data.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT))
244
#ifndef DEBUG_sandervl
247
/** @todo Symlinks: RTPathQueryInfoEx is not handling symbolic links
248
* correctly on Windows. (Both GetFileAttributesEx and FileFindFirst
249
* will return info about the symlink.) */
250
HANDLE hFinal = CreateFileW(pwszPath,
252
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
255
FILE_FLAG_BACKUP_SEMANTICS,
257
if (hFinal != INVALID_HANDLE_VALUE)
259
BY_HANDLE_FILE_INFORMATION FileData;
260
if (GetFileInformationByHandle(hFinal, &FileData))
262
Data.dwFileAttributes = FileData.dwFileAttributes;
263
Data.ftCreationTime = FileData.ftCreationTime;
264
Data.ftLastAccessTime = FileData.ftLastAccessTime;
265
Data.ftLastWriteTime = FileData.ftLastWriteTime;
266
Data.nFileSizeHigh = FileData.nFileSizeHigh;
267
Data.nFileSizeLow = FileData.nFileSizeLow;
271
else if (GetLastError() != ERROR_SHARING_VIOLATION)
273
rc = RTErrConvertFromWin32(GetLastError());
274
RTUtf16Free(pwszPath);
279
RTUtf16Free(pwszPath);
253
282
* Setup the returned data.
271
300
switch (enmAdditionalAttribs)
273
case RTFSOBJATTRADD_EASIZE:
274
pObjInfo->Attr.enmAdditional = RTFSOBJATTRADD_EASIZE;
275
pObjInfo->Attr.u.EASize.cb = 0;
302
case RTFSOBJATTRADD_NOTHING:
303
pObjInfo->Attr.enmAdditional = RTFSOBJATTRADD_NOTHING;
278
306
case RTFSOBJATTRADD_UNIX:
287
315
pObjInfo->Attr.u.Unix.Device = 0;
290
case RTFSOBJATTRADD_NOTHING:
291
pObjInfo->Attr.enmAdditional = RTFSOBJATTRADD_NOTHING;
318
case RTFSOBJATTRADD_UNIX_OWNER:
319
pObjInfo->Attr.enmAdditional = RTFSOBJATTRADD_UNIX_OWNER;
320
pObjInfo->Attr.u.UnixOwner.uid = ~0U;
321
pObjInfo->Attr.u.UnixOwner.szName[0] = '\0'; /** @todo return something sensible here. */
324
case RTFSOBJATTRADD_UNIX_GROUP:
325
pObjInfo->Attr.enmAdditional = RTFSOBJATTRADD_UNIX_GROUP;
326
pObjInfo->Attr.u.UnixGroup.gid = ~0U;
327
pObjInfo->Attr.u.UnixGroup.szName[0] = '\0';
330
case RTFSOBJATTRADD_EASIZE:
331
pObjInfo->Attr.enmAdditional = RTFSOBJATTRADD_EASIZE;
332
pObjInfo->Attr.u.EASize.cb = 0;