static void DumpFile(string full_path, NtFile root, int recusive_depth, bool no_files)
        {
            try
            {
                if (!_walked.Add(full_path))
                {
                    return;
                }

                using (NtFile file = OpenFile(full_path, root))
                {
                    CheckAccess(full_path, file);

                    if (file.IsDirectory && !file.IsReparsePoint && file.IsAccessMaskGranted(FileDirectoryAccessRights.ListDirectory) && recusive_depth > 0)
                    {
                        IEnumerable <FileDirectoryEntry> dir_entries = file.QueryDirectoryInfo(null, FileTypeMask.All).OrderBy(d => d.FileName);

                        if (!no_files)
                        {
                            foreach (string file_name in dir_entries.Where(d => !d.IsDirectory).Select(d => d.FileName))
                            {
                                DumpFile(Path.Combine(full_path, file_name), file, recusive_depth - 1, no_files);
                            }
                        }

                        foreach (string file_name in dir_entries.Where(d => d.IsDirectory).Select(d => d.FileName))
                        {
                            DumpFile(Path.Combine(full_path, file_name), file, recusive_depth - 1, no_files);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                if (!_quiet)
                {
                    Console.Error.WriteLine("Error dumping file {0} {1}", full_path, ex.Message);
                }
            }
        }