Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Extented Copy v1.7 beta

6 views
Skip to first unread message

Oleg Yakovlev

unread,
Aug 23, 2005, 7:01:12 PM8/23/05
to

Пpиветствую вас All!

Пытаюсь пофиксить баг в сабже с копированием файлов из симлинка.
D:\1 симлинк на D:\temp.

Когда _dir="D:\1", res = "D:\temp" - правильно.
Когда _dir="D:", res = "D:\temp" - баг, DeviceIoControl возвращает херню.
Any comments? MSDN не помогает.

int GetSymLink(const String &_dir, String &res, int flg)

--- часть поскипано ----

int attr=GetFileAttributes(dir.ptr());
if (attr!=0xFFFFFFFF && (attr & FILE_ATTRIBUTE_DIRECTORY)
&& (attr & FILE_ATTRIBUTE_REPARSE_POINT))
{
HANDLE hf=CreateFile(dir.ptr(),
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT,
NULL);
if (hf!=INVALID_HANDLE_VALUE)
{
unsigned char Data[16384];
memset(Data, 0, sizeof(Data));
DWORD cb = 0;
if (DeviceIoControl(hf, FSCTL_GET_REPARSE_POINT, NULL, 0,
Data, sizeof(Data), &cb, NULL))
{
REPARSE_GUID_DATA_BUFFER *rd = (REPARSE_GUID_DATA_BUFFER*)Data;
if (rd->ReparseTag==0xA0000003 && !memcmp(rd->ReparseGuid.Data4,
if (rd->L"\\??\\", 8))
{
TCHAR buf[MAX_FILENAME];
memset(buf, 0, sizeof(buf));
_wtotcs(buf, (wchar_t*)&rd->GenericReparseBuffer, MAX_FILENAME);
String r=buf;
if (r.left(7)!="Volume{")
{
CloseHandle(hf);
res=CutEndSlash(buf);
return TRUE;
}
}
}
CloseHandle(hf);
}
}

0 new messages