public int Read(FileInfo info, string name, ref Span <byte> data)
        {
            using Kernel32.SafeHFILE handle =
                      Kernel32.CreateFile($"{info.FullName}:tsuku.{name}",
                                          Kernel32.FileAccess.FILE_GENERIC_READ,
                                          FileShare.Read, null, FileMode.Open,
                                          FileFlagsAndAttributes.FILE_ATTRIBUTE_NORMAL);

            if (handle == HFILE.INVALID_HANDLE_VALUE)
            {
                Kernel32.GetLastError().ThrowIfFailed();
            }

            int maxRead = Math.Min(data.Length, Tsuku.MAX_ATTR_SIZE);

            // Kernel32.SafeHFILE should close after on dispose.
            using var stream = new FileStream(new SafeFileHandle(handle.DangerousGetHandle(), false), FileAccess.Read);
            return(stream.Read(data[..maxRead]));
        public void Write(FileInfo info, string name, ReadOnlySpan <byte> data)
        {
            using Kernel32.SafeHFILE handle =
                      Kernel32.CreateFile($"{info.FullName}:tsuku.{name}",
                                          Kernel32.FileAccess.FILE_GENERIC_WRITE,
                                          FileShare.Write, null, FileMode.OpenOrCreate,
                                          FileFlagsAndAttributes.FILE_ATTRIBUTE_NORMAL);

            if (handle == HFILE.INVALID_HANDLE_VALUE)
            {
                Kernel32.GetLastError().ThrowIfFailed();
            }

            // Kernel32.SafeHFILE should close after on dispose.
            using var stream = new FileStream(new SafeFileHandle(handle.DangerousGetHandle(), false),
                                              FileAccess.ReadWrite);
            stream.Write(data);
            stream.Flush();
        }