mklink가 만든 이 재분석 지점에 무슨 일이 일어나고 있나요?

mklink가 만든 이 재분석 지점에 무슨 일이 일어나고 있나요?

mklinkVista 이후 Windows에서 발생하는 몇 가지 이상한 동작은 다음과 같습니다 . mklinkNTFS 파일 시스템 드라이버에 결함이 있거나 그 만큼 깊은 결함이 있을 수 있다고 생각 하지만 동작에 대한 설명이 필요할 수 있습니다. 이 동작은 각각 Windows 7 및 10에서 발생했습니다.

NTFS 볼륨에 디렉토리가 있다고 가정합니다(아니다이 유일한 목적으로 생성하는 볼륨과 bar.txt그 안에 이름이 지정된 파일을 제외한 모든 항목에 이 작업을 시도해 보세요.

md F:\1
echo foo > F:\1\bar.txt

이제 다음 명령을 실행하십시오(특권 프롬프트를 통해):

mklink F:\1:bar F:\1\bar.txt

... 다음을 제공해야 합니다.

symbolic link created for F:\1:bar <<===>> F:\1\bar.txt

걱정하지 마세요.알다 이것은바보 같은. 하지만 대체 데이터 스트림(ADS)이 재분석 지점이 될 수 있는지 테스트한 결과였습니다. 대체 데이터 스트림에는 이름, 크기 및 내부 데이터만 있기 때문에 나는 그럴 수 없다고 생각했습니다. 파일이나 디렉터리와 달리 파일 속성이나 자체 타임스탬프가 없으므로 ADS를 재분석 지점으로 지정하는 속성이 없습니다(그렇지 않으면 파일 속성을 통해 발생함). 또는 다르게 말하면 재분석 지점은 참조만 가능합니다.에게디렉토리 항목( 을 통해 $Extend\$Reparse)과 달리 ADS는 디렉토리 항목에 연결됩니다.

위 명령의 결과는 다음과 같습니다.

F:\>dir /r
 Volume in drive F is TEST
 Volume Serial Number is 24F3-8A7D

 Directory of F:\

2018-04-03  20:47    <SYMLINKD>     1 [F:\1\bar.txt]
                                  0 1:bar:$DATA
               0 File(s)              0 bytes
               1 Dir(s)   4,244,283,392 bytes free

당연히 이 디렉토리로 변경하려는 시도가 작동하지 않고 결과가 발생합니다.The directory name is invalid.

junction -d마찬가지로 (Sysinternals Suite에서)을 사용하거나 사용하여 재분석 지점을 삭제하려고 하면 fsutil reparsepoint delete동일한 오류가 발생하여 실패합니다. 재분석 지점 데이터를 검사하면 다음과 같은 사항을 확인할 수 있습니다.

 F:\>fsutil reparsepoint query F:\1
Reparse Tag Value : 0xa000000c
Tag value: Microsoft
Tag value: Name Surrogate
Tag value: Symbolic Link

Reparse Data Length: 0x00000044
Reparse Data:
0000:  18 00 20 00 00 00 18 00  00 00 00 00 46 00 3a 00  .. .........F.:.
0010:  5c 00 31 00 5c 00 62 00  61 00 72 00 2e 00 74 00  \.1.\.b.a.r...t.
0020:  78 00 74 00 5c 00 3f 00  3f 00 5c 00 46 00 3a 00  x.t.\.?.?.\.F.:.
0030:  5c 00 31 00 5c 00 62 00  61 00 72 00 2e 00 74 00  \.1.\.b.a.r...t.
0040:  78 00 74 00                                       x.t.

이제 내 질문은 여기서 무슨 일이 일어났는지, 그리고 온보드 Windows 도구(또는 실패할 경우 외부 도구)를 사용하여 이러한 재분석 지점을 어떻게 다시 제거할 수 있습니까?폴더 내의 파일에 무슨 일이 일어났는지 답변 1하고 방법론을 공개할 수 있다는 점에서 보너스 포인트입니다.

지금까지 내 작업 이론은 다음과 같습니다.

  1. mklink"파일"을 생성 F:\1:bar하고 성공합니다(아마도 를 통해 CreateFile()).
  2. mklinkREPARSE_DATA_BUFFER디렉토리의 ADS이므로 작동할 수 없는 생성된 "파일"에 를 설정합니다 . 따라서 내부적으로 일어나는 일은 파일 시스템 드라이버가 디렉터리에 재분석 데이터 버퍼를 설정한다는 것입니다.

결과는 우리가 보는 것입니다. 여기서 나를 괴롭히는 것은 일반적으로 특정 플래그를 지정하지 않고는 디렉토리에 대한 핸들을 얻을 수 없다는 것입니다. 그래서 우리는 mklink심볼릭 링크를 생성 했을 뿐만 아니라디렉토리에파일에 FILE_FLAG_BACKUP_SEMANTICS.

FILE_FLAG_BACKUP_SEMANTICS이하 의 문서CreateFile읽는다:

디렉터리에 대한 핸들을 얻으려면 이 플래그를 설정해야 합니다. 일부 함수에는 파일 핸들 대신 디렉터리 핸들이 전달될 수 있습니다. 자세한 내용은 설명 섹션을 참조하세요.


재생산하려면 다음을 강력히 권합니다.~ 아니다기존 NTFS 드라이브에서 이 작업을 시도하고 대신 다음을 사용하여 새 드라이브를 생성하십시오.아임디스크RAM 디스크 드라이버 및 함께 제공되는 imdisk명령줄 도구(권한 프롬프트를 통해):

imdisk -a -t vm -p "/fs:ntfs /q /y /v:TEST" -s 4G -m F:

(적절하다고 판단되는 대로 매개변수를 변경하십시오. -m는 드라이브 문자와 -sRAM 디스크의 크기를 나타냅니다.)

관련 정보