CDirEntry *FilesFind2(U8 *files_find_mask, I64 fuf_flags)
{
        CDrive          *drive = Fs->cur_dv;
        CDirEntry       *res   = NULL;

        DriveCheck(drive);
        switch (drive->fs_type)
        {
                case FSt_REDSEA:
                        res = RedSeaFilesFind(files_find_mask, fuf_flags);
                        break;

                case FSt_FAT32:
                        res = FAT32FilesFind(files_find_mask, fuf_flags);
                        break;

                default:
                        PrintErr("File System Not Supported\n");
                        res = NULL;
        }
        if (res)
        {
                DirFilesSort(&res, SK_NAME);
                if (fuf_flags & (FUF_FLATTEN_TREE | FUF_JUST_FILES))
                        DirFilesFlatten(res, &res, fuf_flags);
                if (fuf_flags & FUF_CLUS_ORDER)
                        DirFilesSort(&res, SK_CLUS);
        }
        return res;
}

CDirEntry *FilesFind(U8 *files_find_mask, I64 fuf_flags=0)
{/* See ::/Doc/FileUtils.DD.

Find files and make a directory tree in memory.

When done,  you free with DirEntryDel(), DirEntryDel2(), 
DirTreeDel() or DirTreeDel2().

*/
        CDirEntry       *res;
        CDirContext     *dirc;

        if (fuf_flags & ~FUG_FILES_FIND)
                throw('FUF');
        if (fuf_flags & FUF_SINGLE)
        {
                res = MAlloc(sizeof(CDirEntry));
                if (!FileFind(files_find_mask, res))
                {
                        Free(res);
                        return NULL;
                }
        }
        else if (dirc = DirContextNew(files_find_mask, TRUE))
        {
                res = FilesFind2(dirc->mask, fuf_flags);
                DirContextDel(dirc);
        }
        else
                return NULL;
        return res;
}

Bool FileFind(U8 *filename, CDirEntry *_de=NULL, I64 fuf_flags=0)
{//FUF_JUST_DIRS,  FUF_JUST_FILES, FUF_SCAN_PARENTS
//If you pass _de,  you must Free(_de->full_name);
        I64                      cur_dir_clus;
        U8                      *full_name = NULL;
        CDirEntry        de;
        CDirContext     *dirc;
        Bool             res = FALSE;

        if (fuf_flags & ~FUG_FILE_FIND)
                throw('FUF');
        if (!filename || *filename && filename[1] == ':' && !Letter2Drive(*filename, FALSE))
                return FALSE;

        if (dirc = DirContextNew(filename))
        {
                cur_dir_clus = Name2DirClus(dirc->drive, Fs->cur_dir);
                switch (dirc->drive->fs_type)
                {
                        case FSt_REDSEA:
                                res = RedSeaFileFind(dirc->drive, cur_dir_clus, dirc->mask, &de, fuf_flags);
                                break;

                        case FSt_FAT32:
                                res = FAT32FileFind(dirc->drive, cur_dir_clus, dirc->mask, &de, fuf_flags);
                                break;

                        default:
                                PrintErr("File System Not Supported\n");
                }
                if (res && _de)
                {
                        if (StrCompare(Fs->cur_dir, "/"))
                                full_name = MStrPrint("%C:%s/%s", Drive2Letter(Fs->cur_dv), Fs->cur_dir, de.name);
                        else
                                full_name = MStrPrint("%C:/%s", Drive2Letter(Fs->cur_dv), de.name);
                }
                DirContextDel(dirc);
        }
        if (!res && fuf_flags & FUF_SCAN_PARENTS)
        {
                if (dirc = DirContextNew(filename))
                {
                        cur_dir_clus = Name2DirClus(dirc->drive, Fs->cur_dir);
                        while (!res && StrCompare(Fs->cur_dir, "/"))
                        {
                                Cd("..");
                                cur_dir_clus = Name2DirClus(dirc->drive, Fs->cur_dir);
                                switch (dirc->drive->fs_type)
                                {
                                        case FSt_REDSEA:
                                                res = RedSeaFileFind(dirc->drive, cur_dir_clus, dirc->mask, &de, fuf_flags);
                                                break;

                                        case FSt_FAT32:
                                                res = FAT32FileFind(dirc->drive, cur_dir_clus, dirc->mask, &de, fuf_flags);
                                                break;

                                        default:
                                                PrintErr("File System Not Supported\n");
                                }
                        }
                        if (res && _de)
                        {
                                if (StrCompare(Fs->cur_dir, "/"))
                                        full_name = MStrPrint("%C:%s/%s", Drive2Letter(Fs->cur_dv), Fs->cur_dir, de.name);
                                else
                                        full_name = MStrPrint("%C:/%s", Drive2Letter(Fs->cur_dv), de.name);
                        }
                        DirContextDel(dirc);
                }
        }
        if (_de)
        {
                if (res)
                {
                        MemCopy(_de, &de, sizeof(CDirEntry));
                        _de->full_name = full_name;
                }
                else
                        MemSet(_de, 0, sizeof(CDirEntry));
        }
        return res;
}