173 lines
5.3 KiB
C
173 lines
5.3 KiB
C
/*
|
|
* Interactive disassembler (IDA).
|
|
* Copyright (c) 1990-2021 Hex-Rays
|
|
* ALL RIGHTS RESERVED.
|
|
*
|
|
*/
|
|
|
|
#ifndef _PRODIR_H
|
|
#define _PRODIR_H
|
|
|
|
//-V:qffblk_t:730 not all members of a class are initialized inside the constructor
|
|
//-V:qffblk64_t:730
|
|
|
|
|
|
/*! \file prodir.h
|
|
|
|
\brief Unified interface to qfindfirst(),qfindnext(),qfindclose() functions.
|
|
|
|
These are low level functions, it is better to use enumerate_files2().
|
|
*/
|
|
|
|
/// \def{DIRCHAR, Path separator}
|
|
/// \def{SDIRCHAR, Path separator as a string}
|
|
/// \def{DRVCHAR, Windows drive separator}
|
|
#ifdef __NT__
|
|
#define __FAT__
|
|
#define SDIRCHAR "\\"
|
|
#define DIRCHAR '\\'
|
|
#define DRVCHAR ':'
|
|
#else
|
|
#define SDIRCHAR "/"
|
|
#define DIRCHAR '/'
|
|
#endif
|
|
|
|
/// Extension character is '.' for all systems
|
|
#define EXTCHAR '.'
|
|
|
|
//----------------------------------------------------------------------------
|
|
/// \struct{qffblk_t, Various file statistics returned by qfind()-like functions}
|
|
/// \var{qffblk_t::ff_name, file path}
|
|
/// \var{qffblk_t::ff_fsize, file size}
|
|
/// \var{qffblk_t::ff_attrib, file attribute}
|
|
/// \var{qffblk_t::ff_ftime, file time stamp (ms dos fat format)}
|
|
/// \var{qffblk_t::ff_fdate, file date stamp (ms dos fat format)}
|
|
/// \def{FA_RDONLY, File cannot be opened for writing}
|
|
/// \def{FA_DIREC, Directory}
|
|
/// \def{FA_ARCH, File has not been backed up}
|
|
/// \def{MAXPATH, Size limit of qffblk_t::ff_name}
|
|
#if defined(__UNIX__)
|
|
#define MAXPATH QMAXPATH
|
|
struct qffblk_t // Unix
|
|
{
|
|
// user fields:
|
|
int ff_attrib;
|
|
#define FA_DIREC S_IFDIR
|
|
#define FA_ARCH 0
|
|
#define FA_RDONLY 0
|
|
char ff_name[QMAXPATH];
|
|
uint32 ff_fsize;
|
|
uint16 ff_fdate;
|
|
uint16 ff_ftime;
|
|
// private fields:
|
|
void *filelist;
|
|
int fileidx, fileqty;
|
|
char dirpath[QMAXPATH];
|
|
char pattern[QMAXPATH];
|
|
int attr;
|
|
qffblk_t(void) : filelist(NULL), fileqty(0) {}
|
|
};
|
|
#elif !defined(__X86__)
|
|
// Win64 - use Visual Studio's ffblk
|
|
#define MAXPATH _MAX_PATH
|
|
struct qffblk_t
|
|
{
|
|
// inlined __finddata64_t from Visual Studio (for compatibility with IDA 7.0 API)
|
|
unsigned attrib;
|
|
// Time values are stored in UTC format.
|
|
__time64_t time_create; // -1 for FAT file systems
|
|
__time64_t time_access; // -1 for FAT file systems
|
|
__time64_t time_write;
|
|
__int64 size;
|
|
char name[260]; // NB: file name is assumed to be UTF-8
|
|
intptr_t handle; // handle returned by _wfindfirst64
|
|
int attr; // attr value passed to qfindfirst. only FA_DIREC is checked
|
|
#define FA_RDONLY 0x01
|
|
#define FA_DIREC 0x10
|
|
#define FA_ARCH 0x20
|
|
#define ff_name name
|
|
#define ff_attrib attrib
|
|
#define ff_fsize size
|
|
unsigned short ff_ftime; // FAT/DOS format modification time
|
|
unsigned short ff_fdate; // FAT/DOS format modification date
|
|
qffblk_t(void) : handle(-1) {}
|
|
};
|
|
CASSERT(sizeof(qffblk_t) == 0x140);
|
|
#else
|
|
#define MAXPATH 260
|
|
struct qffblk_t // Win32 - use Borland's ffblk (IDA 6.95 API compatibility)
|
|
{
|
|
long ff_reserved;
|
|
long ff_fsize;
|
|
unsigned long ff_attrib;
|
|
#define FA_RDONLY 0x01
|
|
#define FA_DIREC 0x10
|
|
#define FA_ARCH 0x20
|
|
unsigned short ff_ftime;
|
|
unsigned short ff_fdate;
|
|
char ff_name[MAXPATH];
|
|
qffblk_t(void) : ff_reserved(0) {}
|
|
};
|
|
#endif
|
|
|
|
/// \def{MAXDRIVE, Max drive name size}
|
|
/// \def{MAXDIR, Max directory name size}
|
|
/// \def{MAXFILE, Max file name size}
|
|
/// \def{MAXEXT, Max file extension size}
|
|
#if defined(__UNIX__)
|
|
#define MAXDRIVE QMAXPATH
|
|
#define MAXDIR QMAXPATH
|
|
#define MAXFILE QMAXPATH
|
|
#define MAXEXT QMAXPATH
|
|
#else
|
|
#define MAXDRIVE _MAX_DRIVE
|
|
#define MAXDIR _MAX_DIR
|
|
#define MAXFILE _MAX_FNAME
|
|
#define MAXEXT _MAX_EXT
|
|
#endif
|
|
|
|
/// Find first file that matches the pattern.
|
|
/// \param pattern file name pattern, usually with * and ? wildcards
|
|
/// \param blk structure that will hold the answer.
|
|
/// blk->ff_name will hold the file name, for example.
|
|
/// \param attr the desired file types (#FA_DIREC for directories only or 0 for both directories and files)
|
|
/// \return 0 if found a file, other values mean error (check qerrno)
|
|
|
|
idaman THREAD_SAFE int ida_export qfindfirst(
|
|
const char *pattern,
|
|
struct qffblk64_t *blk,
|
|
int attr);
|
|
|
|
|
|
/// Find next file that matches the pattern.
|
|
/// \param blk structure that holds the current state.
|
|
/// blk->ff_name will hold the next file name upon return.
|
|
/// \return 0 if found the next file, other values mean error (check qerrno)
|
|
|
|
idaman THREAD_SAFE int ida_export qfindnext(struct qffblk64_t *blk);
|
|
|
|
/// Stop the file enumeration and free internal structures.
|
|
/// \note usually there is no need to call this function manually, it is called
|
|
/// from the ::qffblk64_t destructor.
|
|
/// \param blk file enumeration structure
|
|
|
|
idaman THREAD_SAFE void ida_export qfindclose(struct qffblk64_t *blk);
|
|
|
|
|
|
/// Common structure with 64-bit ff_fsize - see ::qffblk_t.
|
|
struct qffblk64_t
|
|
{
|
|
int ff_attrib;
|
|
char ff_name[QMAXPATH];
|
|
uint64 ff_fsize;
|
|
uint16 ff_fdate;
|
|
uint16 ff_ftime;
|
|
// private field
|
|
struct qffblk_t base;
|
|
|
|
qffblk64_t(void) {}
|
|
~qffblk64_t(void) { qfindclose(this); }
|
|
};
|
|
|
|
#endif // _PRODIR_H
|