|
44 | 44 | # define IO_REPARSE_TAG_DEDUP 0x80000013
|
45 | 45 | # endif
|
46 | 46 |
|
| 47 | +# ifndef IO_REPARSE_TAG_CLOUD |
| 48 | +# define IO_REPARSE_TAG_CLOUD (0x9000001AL) |
| 49 | +# endif |
| 50 | +/* IO_REPARSE_TAG_CLOUD_1 through IO_REPARSE_TAG_CLOUD_F have values of 0x9000101AL |
| 51 | + to 0x9000F01AL, they can be checked against the mask. */ |
| 52 | +#ifndef IO_REPARSE_TAG_CLOUD_MASK |
| 53 | +#define IO_REPARSE_TAG_CLOUD_MASK (0x0000F000L) |
| 54 | +#endif |
| 55 | + |
| 56 | +#ifndef IO_REPARSE_TAG_ONEDRIVE |
| 57 | +#define IO_REPARSE_TAG_ONEDRIVE (0x80000021L) |
| 58 | +#endif |
| 59 | + |
47 | 60 | # ifndef VOLUME_NAME_NT
|
48 | 61 | # define VOLUME_NAME_NT 0x2
|
49 | 62 | # endif
|
@@ -867,7 +880,7 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
|
867 | 880 | return -1;
|
868 | 881 | }
|
869 | 882 |
|
870 |
| - hLink = CreateFileW(pathw, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, NULL); |
| 883 | + hLink = CreateFileW(pathw, 0, 0, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, NULL); |
871 | 884 | if(hLink == INVALID_HANDLE_VALUE) {
|
872 | 885 | free_alloca(tmp, use_heap);
|
873 | 886 | FREE_PATHW()
|
@@ -960,7 +973,11 @@ static int tsrm_realpath_r(char *path, int start, int len, int *ll, time_t *t, i
|
960 | 973 | return -1;
|
961 | 974 | }
|
962 | 975 | }
|
963 |
| - else if (pbuffer->ReparseTag == IO_REPARSE_TAG_DEDUP) { |
| 976 | + else if (pbuffer->ReparseTag == IO_REPARSE_TAG_DEDUP || |
| 977 | + /* Starting with 1709. */ |
| 978 | + (pbuffer->ReparseTag & IO_REPARSE_TAG_CLOUD_MASK) != 0 && 0x90001018L != pbuffer->ReparseTag || |
| 979 | + IO_REPARSE_TAG_CLOUD == pbuffer->ReparseTag || |
| 980 | + IO_REPARSE_TAG_ONEDRIVE == pbuffer->ReparseTag) { |
964 | 981 | isabsolute = 1;
|
965 | 982 | substitutename = malloc((len + 1) * sizeof(char));
|
966 | 983 | if (!substitutename) {
|
|
0 commit comments