¿Qué está pasando con este punto de análisis creado por mklink?

¿Qué está pasando con este punto de análisis creado por mklink?

Aquí hay un comportamiento extraño que encontré y mklinkque viene en Windows desde Vista. Sospecho que puede haber un defecto en mklinkel controlador del sistema de archivos NTFS o incluso tan profundo, pero el comportamiento podría necesitar alguna explicación. Este comportamiento se encontró en Windows 7 y 10 respectivamente.

Supongamos que tenemos un directorio en un volumen NTFS (hagaNO¡pruebe esto en cualquier cosa que no sea un volumen que esté creando para este único propósito!) y un archivo nombrado bar.txtdentro de él.

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

Ahora emita el siguiente comando (a través de un mensaje privilegiado):

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

... que debería darte:

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

No te preocupes, yosaberesto estonto. Pero fue el resultado de una prueba sobre si un flujo de datos alternativo (ADS) podría convertirse en un punto de análisis. Sostuve que no podía, porque un flujo de datos alternativo sólo tiene un nombre, un tamaño y, bueno, los datos que contiene. A diferencia de un archivo o directorio, no tiene atributos de archivo ni marcas de tiempo propias, por lo que no habría ningún atributo para designar el ADS como punto de análisis (lo que de otro modo sucede a través de los atributos del archivo). O dicho de otro modo: los puntos de análisis sólo pueden referirseaentradas de directorio (a través de $Extend\$Reparse), mientras que los ADS están vinculados a entradas de directorio.

El resultado del comando anterior es este:

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

Como era de esperar, intentar cambiar a este directorio no funciona y produce resultados.The directory name is invalid.

De manera similar, intentar eliminar el punto de análisis usando junction -d(de Sysinternals Suite) o usando fsutil reparsepoint deletefalla con el mismo error. Sólo inspeccionar los datos del punto de análisis me da algo a lo que aferrarme:

 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.

Ahora mi pregunta es ¿qué pasó aquí y cómo puedo deshacerme de ese punto de análisis nuevamente con las herramientas integradas de Windows (o, en su defecto, con las externas)?Puntos de bonificación por poder responder qué pasó con el archivo dentro de la carpeta 1y revelar su metodología.

Mi teoría de trabajo hasta ahora es la siguiente:

  1. mklinkcrea el "archivo" F:\1:bary lo logra (presumiblemente a través de CreateFile()).
  2. mklinkestablece el REPARSE_DATA_BUFFER"archivo" creado que no puede funcionar porque es un ADS en un directorio. Entonces, internamente, lo que sucede es que el controlador del sistema de archivos configura el búfer de datos de análisis en el directorio.

El resultado es lo que vemos. Lo que me molesta aquí es que normalmente no se puede controlar un directorio sin especificar un indicador en particular. Así que no sólo hemos provocado mklinkque se cree un vínculo simbólicoen un directorioa un archivo, también evitamos la necesidad de especificar FILE_FLAG_BACKUP_SEMANTICS.

La documentación de FILE_FLAG_BACKUP_SEMANTICSmenosCreateFilelee:

Debe establecer este indicador para obtener un identificador de un directorio. Se puede pasar un identificador de directorio a algunas funciones en lugar de un identificador de archivo. Para obtener más información, consulte la sección Comentarios.


Para reproducir le recomiendo encarecidamente quenoIntente esto en una unidad NTFS existente, pero en su lugar cree una nueva usando elImDiskControlador de disco RAM y la imdiskherramienta de línea de comando que lo acompaña (a través del mensaje privilegiado):

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

(Modifique los parámetros como mejor le parezca. -mIndica una letra de unidad y -sel tamaño del disco RAM).

información relacionada