Latest available version: IDA and decompilers v8.4.240527sp2 see all releases
Hex-Rays logo State-of-the-art binary code analysis tools
email icon
fpro.h File Reference

System independent counterparts of FILE* related functions from Clib. More...


#define stdin   dont_use_stdin
 use gets()
#define stdout   dont_use_stdout
 use qprintf()
#define stderr   dont_use_stderr
 use qeprintf()
#define fopen   dont_use_fopen
 use qfopen()
#define fread   dont_use_fread
 use qfread()
#define fwrite   dont_use_fwrite
 use qfwrite()
#define ftell   dont_use_ftell
 use qftell()
#define fseek   dont_use_fseek
 use qfseek()
#define fclose   dont_use_fclose
 use qfclose()
#define fflush   dont_use_fflush
 use qflush()
#define fputc   dont_use_fputc
 use qfputc()
#define fgetc   dont_use_fgetc
 use qfgetc()
#define fgets   dont_use_fgets
 use qfgets()
#define fputs   dont_use_fputs
 use qfputs()
#define vfprintf   dont_use_vfprintf
 use qvfprintf()
#define vfscanf   dont_use_vfscanf
 use qvfscanf()
#define fprintf   dont_use_fprintf
 use qfprintf()
#define fscanf   dont_use_fscanf
 use qfscanf()


typedef janitor_t< FILE * > file_janitor_t
 File janitor: will close a file at destruction-time.


enum  { QMOVE_CROSS_FS = 0x01 , QMOVE_OVERWRITE = 0x02 , QMOVE_OVR_RO = 0x04 }


idaman THREAD_SAFE ssize_t ida_export qgetline (qstring *buf, FILE *fp)
 Read line from file (the newline is removed from the output buffer) More...
idaman THREAD_SAFE int ida_export qrename (const char *oldfname, const char *newfname)
 Rename a file: 'newname' may exist, and will be deleted.
idaman THREAD_SAFE int ida_export qmove (const char *oldfname, const char *newfname, uint32 flags)
 Move a file - more powerful version of qrename. More...
idaman THREAD_SAFE int ida_export qcopyfile (const char *from, const char *to, bool overwrite=true, bool(idaapi *cb)(uint64 pos, uint64 total, void *ud)=nullptr, void *ud=nullptr, int flags=0)
 Copy a file. More...
idaman char *ida_export qtmpdir (char *buf, size_t bufsize)
 Get temporary directory name Returns absolute path.
idaman char *ida_export qtmpnam (char *buf, size_t bufsize)
 Get temporary file name. More...
File I/O

The following functions work just like their counterparts from Clib, only they are safer, system independent, and they set qerrno (see get_qerrno()).

idaman THREAD_SAFE FILE *ida_export qfopen (const char *file, const char *mode)
idaman THREAD_SAFE ssize_t ida_export qfread (FILE *fp, void *buf, size_t n)
idaman THREAD_SAFE ssize_t ida_export qfwrite (FILE *fp, const void *buf, size_t n)
idaman THREAD_SAFE qoff64_t ida_export qftell (FILE *fp)
idaman THREAD_SAFE int ida_export qfseek (FILE *fp, qoff64_t offset, int whence)
idaman THREAD_SAFE int ida_export qfclose (FILE *fp)
idaman THREAD_SAFE int ida_export qflush (FILE *fp)
idaman THREAD_SAFE int ida_export qfputc (int chr, FILE *fp)
idaman THREAD_SAFE int ida_export qfgetc (FILE *fp)
idaman THREAD_SAFE char *ida_export qfgets (char *s, size_t len, FILE *fp)
idaman THREAD_SAFE int ida_export qfputs (const char *s, FILE *fp)
idaman FILE *ida_export qtmpfile (void)
idaman THREAD_SAFE int ida_export qunlink (const char *fname)
idaman THREAD_SAFE int ida_export qaccess (const char *fname, int mode)
idaman THREAD_SAFE char *ida_export qgets (char *line, size_t linesize)
idaman THREAD_SAFE uint64 ida_export qfsize (FILE *fp)
idaman THREAD_SAFE int ida_export qvfprintf (FILE *fp, const char *format, va_list va)
idaman THREAD_SAFE int ida_export qvprintf (const char *format, va_list va)
idaman THREAD_SAFE int ida_export qveprintf (const char *format, va_list va)
idaman THREAD_SAFE int ida_export qvfscanf (FILE *fp, const char *format, va_list va)
THREAD_SAFE int qfprintf (FILE *fp, const char *format,...)
THREAD_SAFE int qprintf (const char *format,...)
THREAD_SAFE int qeprintf (const char *format,...)
THREAD_SAFE int qfscanf (FILE *fp, const char *format,...)


Add-ins for 2..32 byte read/writes.

fppointer to file
resvalue read from file
sizesize of value in bytes (1..32)
mostfirstis MSB first? (0/1)
Return values
0All these functions return 0 on success
#define DEF_FREADBYTES(read, write, type, size)
idaman THREAD_SAFE int ida_export freadbytes (FILE *fp, void *res, int size, int mostfirst)
idaman THREAD_SAFE int ida_export fwritebytes (FILE *fp, const void *l, int size, int mostfirst)
int fread2bytes (FILE *fp, int16 *res, bool mostfirst)
int fwrite2bytes (FILE *fp, const int16 *res, bool mostfirst)
int fread2bytes (FILE *fp, uint16 *res, bool mostfirst)
int fwrite2bytes (FILE *fp, const uint16 *res, bool mostfirst)
int fread4bytes (FILE *fp, int32 *res, bool mostfirst)
int fwrite4bytes (FILE *fp, const int32 *res, bool mostfirst)
int fread4bytes (FILE *fp, uint32 *res, bool mostfirst)
int fwrite4bytes (FILE *fp, const uint32 *res, bool mostfirst)
int fread8bytes (FILE *fp, int64 *res, bool mostfirst)
int fwrite8bytes (FILE *fp, const int64 *res, bool mostfirst)
int fread8bytes (FILE *fp, uint64 *res, bool mostfirst)
int fwrite8bytes (FILE *fp, const uint64 *res, bool mostfirst)

Detailed Description

System independent counterparts of FILE* related functions from Clib.

You should not use C standard I/O functions in your modules. The reason: Each module compiled with Borland (and statically linked to Borland's library) will host a copy of the FILE * information.

So, if you open a file in the plugin and pass the handle to the kernel, the kernel will not be able to use it.

If you really need to use the standard functions, define USE_STANDARD_FILE_FUNCTIONS. In this case do not mix them with q... functions.

Macro Definition Documentation


#define DEF_FREADBYTES (   read,
inline THREAD_SAFE int read(FILE *fp, type *res, bool mostfirst) \
{ return freadbytes(fp, res, size, mostfirst); } \
inline THREAD_SAFE int write(FILE *fp, const type *res, bool mostfirst) \
{ return fwritebytes(fp, res, size, mostfirst); }
Functions callable from any thread are marked with this keyword.
Definition: pro.h:320

Function Documentation

◆ qgetline()

idaman THREAD_SAFE ssize_t ida_export qgetline ( qstring buf,
FILE *  fp 

Read line from file (the newline is removed from the output buffer)

bufoutput buffer
fppointer to file
-1 or length of line

◆ qmove()

idaman THREAD_SAFE int ida_export qmove ( const char *  oldfname,
const char *  newfname,
uint32  flags 

Move a file - more powerful version of qrename.

Return values
-1system error
elsea combination of flags to be given for successful move

◆ qcopyfile()

idaman THREAD_SAFE int ida_export qcopyfile ( const char *  from,
const char *  to,
bool  overwrite = true,
bool(idaapi *)(uint64 pos, uint64 total, void *ud)  cb = nullptr,
void *  ud = nullptr,
int  flags = 0 

Copy a file.

fromsource file name
todestination file name
overwriteoverwrite output if it exists?
cbuser callback. return false to abort the copy loop
uduser data passed back to cb
flagsreserved (should be zero)
Return values
-1input file not found
-2output file not writable
-3output file already exists while overwrite is false
-4write failure
-5interrupted from the callback

◆ qtmpnam()

idaman char *ida_export qtmpnam ( char *  buf,
size_t  bufsize 

Get temporary file name.

Returns absolute path (includes directory)