#ifndef _INC_RLOEW
#define _INC_RLOEW

#include <windows.h>
#include <time.h>

typedef int PRC(char *base,char *name,struct _finddata_t *ex,int arg,int dir,int pass);
typedef int PRCL(char *base,char *name,struct _finddata_t *ex,int arg,int dir,int pass,int *matchlist);
typedef int PRCS(char *name,int val,int param);
typedef int FCALL(int *arg);
typedef int PRC64(char *base,char *name,struct _finddatai64_t *ex,int arg,int dir,int pass);
typedef int PRCL64(char *base,char *name,struct _finddatai64_t *ex,int arg,int dir,int pass,int *matchlist);
typedef int PRCS64(char *name,unsigned _int64 val,int param);

int tree(PRC *proc,char *fn,int flags,long date,int arg);
int wtree(PRC *proc,char *wc,int flags,long date,int arg);
int xtree(char *wc,int flags,int proc);
//  proc(char *name);
int wtreelst(PRCL *proc,char *wc,int flags,long date,int arg,int *matchlist);
int xtreelst(char *wc,int flags,int proc,int *matchlist);
//  proc(char *name,int *matchlist);
int filesort(PRCS *proc,char *fn,int flags,long date,int arg);
int tree64(PRC64 *proc,char *fn,int flags,long date,int arg);
int wtree64(PRC64 *proc,char *wc,int flags,long date,int arg);
int wtreelst64(PRCL64 *proc,char *wc,int flags,long date,int arg,int *matchlist);
int filesort64(PRCS64 *proc,char *fn,int flags,long date,int arg);

int fileprop(char *name,struct _finddata_t *prop);
int fileprop64(char *name,struct _finddatai64_t *prop);
int filedate(char *name);

int findmtch(char *wc,int flags,time_t date,char *res);
int wildcard(char *tmpl,char *name,int nocase);
int wildcdex(char *fmt,char *name,int nocase);
char *wildbase(char *temp,char **rem);
char *wildfmt(char *temp,int nocase);
int wildcardl(char *tmpl,char *name,int nocase,int *matchlist);
int wildcdexl(char *fmt,char *name,int nocase,int *matchlist);
int wildexp(char *fn,char *temp,char *name,int *list,int cnt);
int wildcnt(char *s);
int wildchk(char *s,int n);

int makestr(char *s,int n);

int regtree(char *wc,int sub,int proc,int proc2);
//  proc(HKEY key,char *name,int proc2);
int regvalue(HKEY key,char *name,int proc);
//  proc(HKEY key,char *kname.char *vname,BYTE type,BYTE len,BYTE *data);

int parsearg(char **v,char *str,int len,int del);
int getline(int f,char *b,int len);
int getnum(char *str);
_int64 getnum64(char *str);

int getdate(char *name,int *date);
char *fmtdate(int date);
int setfdate(char *name,int date);

char *fullname(char *name);
char *cat(char *s,...);
char *catpath(char *s1,char *s2);

void mkdir(char *dir);
int createsn(char *d,char *sn,int dir);
int createsp(char *d,char *sp,int dir);

int compmem(char *b1,char *b2,int len);

void printerr(int e);

int copyblk(int f1,int f2,int len,char *buff,int blen);

int hexdump(int addr,BYTE *data,int len);
int phexdump(int addr,BYTE *data,int len);
int fhexdump(int fh,int addr,BYTE *data,int len);

int privinit();
int cpl(int l);
int intr(int i);

int int2173w(int cmd,int drive,DWORD start,DWORD count,BYTE *buff);
int lockdrv(int drive,int mode);

int openaspi();
int typeaspi(int unit);
int aspidisk(int unit);
int findaspi(int start,int type);
int doaspi(int unit,BYTE *cmd,int cmdlen,int dir,BYTE *data,int dlen,BYTE *sense);
int aspicmd(int unit,int code,DWORD off,int len,int dir,BYTE *data,int dlen,BYTE *sense);
int readaspi(int unit,DWORD off,int len,BYTE *data,int dlen,BYTE *sense);
int writeaspi(int unit,DWORD off,int len,BYTE *data,int dlen,BYTE *sense);
int aspicmdex(int unit,int code,_int64 off,int len,int dir,BYTE *data,int dlen,BYTE *sense);
int readaspiex(int unit,_int64 off,int len,BYTE *data,int dlen,BYTE *sense);
int writeaspiex(int unit,_int64 off,int len,BYTE *data,int dlen,BYTE *sense);
void aspierr(char *str,BYTE *sense);
void closeaspi();

int atapicmd(int dev,BYTE *cmd,int cmdlen,int dir,BYTE *data,int dlen);
int atapistat(int dev,BYTE *data);
int atapiid(int dev,WORD *data);
int atapitype(int dev);

int tcpinit();
SOCKET tcp(char *url,int port);
SOCKET tcpin(char *url,int port);

int udpinit();
SOCKET udp(char *url,int port);

SOCKET sendhttp(char *url,char **cookie,char **argname,char **argval);
int recvhttp(SOCKET s,int fh,int hdr,int prog);
int chkhttp(SOCKET s,int fh);

int getweb(int flg,char *url,char *fn,char **cookie,char **argname,char **argval);

int timedioinit(int *info,FCALL *io);
void timediowait(int *info,int timeout);
void timediokill(int *info);

int dasm(BYTE *s,DWORD pc,int m,char *out,int pm,...);
int instlen(BYTE *s,int m);

int callsub(int a,...);
int jumpthru(int a);
int callthru(int a,int s[5]);

HANDLE run(int proc,int *ret,...);

int query(char *text,char *init,int minlen,char *buff,int bufflen);

char *dmake32(int f1,int f2,int f3,int m,char *b1);

int getseg(int seg);

int ring0(void *proc,void *arg);
int ring0();
void ring3();
int ring0tc();
void ring3tc();

int int20(int,...);
int int20f(int,...);

int modaddr(char *,int,int *);

int physmem(unsigned int a1,unsigned int a2,unsigned char *b,unsigned int len,int mode);  // Mode 0=Read 1=Write

int factor(unsigned int x,unsigned int *l,unsigned int n);

int getvol(int i,char *n);
int findvol(char *v,int s);

int openex(char *base,int blocklen,int filecnt,unsigned int filesize);
int readex(int fhex,unsigned int block,int blocks,char *buff);
int writeex(int fhex,unsigned int block,int blocks,char *buff);

int creat64(char *n);
int delete64(char *n);
int close64(int x);
int open64(char *n,int f);
int read64(int i,void *b,int l);
int write64(int i,void *b,int l);
_int64 lseek64(int i,_int64 p,int m);
int trunc64(int i,_int64 p);

_int64 seek64(int f,_int64 p,int m);

unsigned int llseekex(int fn,int off,int m);

int win32svc(int *,int,...);

int peldr(char *,char *);

int stubchk(int);

int k32ords(int);

int calllib(char *lib,char *ent,...);
void freelibs();

int21(int eax,int ebx,int ecx,int edx,int esi,int edi,int *result);
snopen(char *name,int tail);

void aesencr(void *src,void *dest,void *key,int kdws);
void aesdecr(void *src,void *dest,void *key,int kdws);
void aeskeyexp(void *key,void *buff,int kdws);
void aesinit();  // If Compiled with INITAES Defined

int aesencrstrm(char *s,char *d,int l,void *key,int keylen);
int aesdecrstrm(char *s,char *d,char *part,int l,void *key,int keylen);

unsigned short crc(unsigned char *data,unsigned short val,int len);

int systime(int);

struct SSLentry {
char *str;
DWORD length;
struct SSLentry *(node[17]);
};
struct SSLlist {
int depth;
DWORD random;
struct SSLentry *(node[17]);
};
struct SSLlist *initSSL();
void freeSSL(struct SSLlist *l);
struct SSLentry *insertSSLentry(struct SSLlist *l,char *str);
char *getSSLentry(struct SSLlist *l,char *str,char *laststr);
struct SSLentry *getSSLprev(struct SSLlist *l,char *str,char *laststr);
removeSSLSntry(struct SSLlist *l,char *str);

#endif
