Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Backported [Bug 2882342]: correct struct _REPARSE_DATA_BUFFER in tcl 8.4 |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | core-8-4-branch |
Files: | files | file ages | folders |
SHA1: |
baeaa4f37547149cf56fdbb44774dabc |
User & Date: | jan.nijtmans 2013-01-09 15:43:54 |
Context
2013-01-16
| ||
08:52 | Allow win32 build with -DTCL_NO_DEPRECATED, just as the UNIX build, off by default. Define Tcl_EvalO... check-in: cd2c57a4b6 user: jan.nijtmans tags: core-8-4-branch | |
2013-01-11
| ||
13:44 | merge trunk Add Tcl_Canceled, Tcl_BackgroundException to the list as well. check-in: 1dc6c89845 user: jan.nijtmans tags: bug-3562640 | |
2013-01-09
| ||
21:31 | merge-mark check-in: b1b0a1174f user: jan.nijtmans tags: core-8-5-branch | |
15:43 | Backported [Bug 2882342]: correct struct _REPARSE_DATA_BUFFER in tcl 8.4 check-in: baeaa4f375 user: jan.nijtmans tags: core-8-4-branch | |
2013-01-08
| ||
10:13 | [Bug 3092089]: [file normalize] can remove path components. [Bug 3587096] win vista/7: "can't find i... check-in: 53a797afe6 user: jan.nijtmans tags: core-8-4-branch | |
Changes
Changes to win/tclWinFile.c.
︙ | ︙ | |||
113 114 115 116 117 118 119 120 121 122 123 124 125 126 | WORD Reserved; union { struct { WORD SubstituteNameOffset; WORD SubstituteNameLength; WORD PrintNameOffset; WORD PrintNameLength; WCHAR PathBuffer[1]; } SymbolicLinkReparseBuffer; struct { WORD SubstituteNameOffset; WORD SubstituteNameLength; WORD PrintNameOffset; WORD PrintNameLength; | > | 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | WORD Reserved; union { struct { WORD SubstituteNameOffset; WORD SubstituteNameLength; WORD PrintNameOffset; WORD PrintNameLength; ULONG Flags; WCHAR PathBuffer[1]; } SymbolicLinkReparseBuffer; struct { WORD SubstituteNameOffset; WORD SubstituteNameLength; WORD PrintNameOffset; WORD PrintNameLength; |
︙ | ︙ | |||
355 356 357 358 359 360 361 | if ((nativeTarget[len-1] == L'\\') && (nativeTarget[len-2] != L':')) { nativeTarget[len-1] = 0; } /* Build the reparse info */ memset(reparseBuffer, 0, sizeof(DUMMY_REPARSE_BUFFER)); reparseBuffer->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT; | | | | | | | | | 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 | if ((nativeTarget[len-1] == L'\\') && (nativeTarget[len-2] != L':')) { nativeTarget[len-1] = 0; } /* Build the reparse info */ memset(reparseBuffer, 0, sizeof(DUMMY_REPARSE_BUFFER)); reparseBuffer->ReparseTag = IO_REPARSE_TAG_MOUNT_POINT; reparseBuffer->MountPointReparseBuffer.SubstituteNameLength = wcslen(nativeTarget) * sizeof(WCHAR); reparseBuffer->Reserved = 0; reparseBuffer->MountPointReparseBuffer.PrintNameLength = 0; reparseBuffer->MountPointReparseBuffer.PrintNameOffset = reparseBuffer->MountPointReparseBuffer.SubstituteNameLength + sizeof(WCHAR); memcpy(reparseBuffer->MountPointReparseBuffer.PathBuffer, nativeTarget, sizeof(WCHAR) + reparseBuffer->MountPointReparseBuffer.SubstituteNameLength); reparseBuffer->ReparseDataLength = reparseBuffer->MountPointReparseBuffer.SubstituteNameLength + 12; return NativeWriteReparse(LinkDirectory, reparseBuffer); } /* *-------------------------------------------------------------------- * |
︙ | ︙ | |||
501 502 503 504 505 506 507 | * * There is an assumption in this code that 'wide' interfaces * are being used (see tclWin32Dll.c), which is true for the * only systems which support reparse tags at present. If * that changes in the future, this code will have to be * generalised. */ | | | | | | | | | | 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 | * * There is an assumption in this code that 'wide' interfaces * are being used (see tclWin32Dll.c), which is true for the * only systems which support reparse tags at present. If * that changes in the future, this code will have to be * generalised. */ if (reparseBuffer->MountPointReparseBuffer.PathBuffer[0] == L'\\') { /* Check whether this is a mounted volume */ if (wcsncmp(reparseBuffer->MountPointReparseBuffer.PathBuffer, L"\\??\\Volume{",11) == 0) { char drive; /* * There is some confusion between \??\ and \\?\ which * we have to fix here. It doesn't seem very well * documented. */ reparseBuffer->MountPointReparseBuffer .PathBuffer[1] = L'\\'; /* * Check if a corresponding drive letter exists, and * use that if it is found */ drive = TclWinDriveLetterForVolMountPoint(reparseBuffer ->MountPointReparseBuffer.PathBuffer); if (drive != -1) { char driveSpec[3] = { drive, ':', '\0' }; retVal = Tcl_NewStringObj(driveSpec,2); Tcl_IncrRefCount(retVal); return retVal; } /* * This is actually a mounted drive, which doesn't * exists as a DOS drive letter. This means the path * isn't actually a link, although we partially treat * it like one ('file type' will return 'link'), but * then the link will actually just be treated like * an ordinary directory. I don't believe any * serious inconsistency will arise from this, but it * is something to be aware of. */ Tcl_SetErrno(EINVAL); return NULL; } else if (wcsncmp(reparseBuffer->MountPointReparseBuffer .PathBuffer, L"\\\\?\\",4) == 0) { /* Strip off the prefix */ offset = 4; } else if (wcsncmp(reparseBuffer->MountPointReparseBuffer .PathBuffer, L"\\??\\",4) == 0) { /* Strip off the prefix */ offset = 4; } } Tcl_WinTCharToUtf( (CONST char*)reparseBuffer->MountPointReparseBuffer.PathBuffer, (int)reparseBuffer->MountPointReparseBuffer .SubstituteNameLength, &ds); copy = Tcl_DStringValue(&ds)+offset; len = Tcl_DStringLength(&ds)-offset; retVal = Tcl_NewStringObj(copy,len); Tcl_IncrRefCount(retVal); Tcl_DStringFree(&ds); |
︙ | ︙ |