271 lines
10 KiB
C
271 lines
10 KiB
C
/*
|
|
* remote filename and checksum server
|
|
*
|
|
* sumserve.h packet definitions
|
|
*
|
|
* client attaches to the named pipe \\servername\pipe\NPNAME,
|
|
* and sends one of the request packets below. He then
|
|
* waits for one or more of the reply packets.
|
|
*
|
|
* when he gets a reply packet indicating the end of the reply,
|
|
* he either sends another request, or closes his named pipe handle.
|
|
*
|
|
*/
|
|
|
|
/* Versions...
|
|
* The server must always be at a version at least as great as a client.
|
|
* New versions of the server will handle old clients (at least for a bit?)
|
|
* The client specifies a version number when it connects. (The original
|
|
* version with no number is version 0). The server will then respond
|
|
* with structures and protocols for that version. The version number is
|
|
* included in the response packets to allow me to change this scheme,
|
|
* should it ever be necessary.
|
|
* New version requests can be distinguished from version 0 requests by
|
|
* having NEGATIVE request codes.
|
|
*/
|
|
|
|
/* name of named pipe */
|
|
#define NPNAME "sumserve"
|
|
|
|
#define SS_VERSION 1 /* latest version number */
|
|
|
|
/* request packets ---------------------------------- */
|
|
|
|
typedef struct {
|
|
long lCode; /* request code (below) */
|
|
char szPath[MAX_PATH]; /* null terminated pathname string */
|
|
} SSREQUEST, * PSSREQUEST;
|
|
|
|
/* If the requst comes in with a NEGATIVE lCode then it means use this
|
|
* structure instead. This has a version number and so future structures
|
|
* can all be told apart by that.
|
|
*/
|
|
typedef struct {
|
|
long lCode; /* request code (below) */
|
|
long lRequest; /* should be LREQUEST */
|
|
long lVersion; /* version number */
|
|
DWORD lFlags; /* options - INCLUDESUBS is only one so far */
|
|
char szPath[MAX_PATH]; /* null terminated pathname string */
|
|
char szLocal[MAX_PATH]; /* for a FILES request, the local name is
|
|
appended directly after the terminating
|
|
NULL of szPath. This field ensures
|
|
enough space is allocated */
|
|
} SSNEWREQ, * PSSNEWREQ;
|
|
|
|
#define INCLUDESUBS 0x01
|
|
|
|
#define LREQUEST 33333333
|
|
|
|
/* values for lCode*/
|
|
|
|
/* server should exit. no args. will receive no response */
|
|
#define SSREQ_EXIT 32895 /* chosen to be an unusual number so that
|
|
we will NOT get one of these by mistake.
|
|
New version server will fail to respond to
|
|
version 0 EXIT requests. Big deal!
|
|
*/
|
|
|
|
|
|
/* arg is a pathname: please send all files with checksums.
|
|
* will receive either SSRESP_BADPASS or a mixture of 0 or more SSRESP_FILE and
|
|
* SSRESP_ERROR responses, terminated by SSRESP_END.
|
|
*/
|
|
#define SSREQ_SCAN 2 /* please return list of dirs. arg:path */
|
|
|
|
/* end of this client's session. no args. will receive no response */
|
|
#define SSREQ_END 3 /* end of session - I have no more requests */
|
|
|
|
/* szPath buffer contains two null-term. strings. first is the password,
|
|
* second is the \\server\share name. please make a connection to this
|
|
* server for the rest of my session.
|
|
* one reply: either SSRESP_ERROR or SSRESP_END
|
|
*/
|
|
#define SSREQ_UNC 4 /* connect to UNC name passed. szPath contains
|
|
* two null-terminated strings; first is
|
|
* the password, second is \\server\share
|
|
*
|
|
* share will be disconnected at end of client
|
|
* session.
|
|
*/
|
|
|
|
/*
|
|
* please send a file. szPath is the name of the file. response
|
|
* will be a sequence of ssPacket structs, continuing until lSequence is < 1
|
|
* or ulSize is 0
|
|
*/
|
|
#define SSREQ_FILE 5
|
|
|
|
/*
|
|
* please send a set of files, First request does NOT have a file.
|
|
* a series of following NEXTFILE requests do name the files.
|
|
* The NEXTFILE requests expect no response. After the last
|
|
* files request will come an SSREQ_ENDFILES.
|
|
*/
|
|
#define SSREQ_FILES 6
|
|
#define SSREQ_NEXTFILE 7
|
|
#define SSREQ_ENDFILES 8
|
|
|
|
/* arg is a pathname: please send all files with times, sizes but NO checksums.
|
|
* will receive either SSRESP_BADPASS or a mixture of 0 or more SSRESP_FILE and
|
|
* SSRESP_ERROR responses, terminated by SSRESP_END.
|
|
*/
|
|
#define SSREQ_QUICKSCAN 9 /* please return list of dirs. arg:path */
|
|
|
|
|
|
/*
|
|
* please send the error log buffer (in one packet)
|
|
*/
|
|
#define SSREQ_ERRORLOG 10
|
|
|
|
/*
|
|
* please send the activity log buffer in one packet
|
|
*/
|
|
#define SSREQ_EVENTLOG 11
|
|
|
|
/*
|
|
* please send the current connections log in one packet
|
|
*/
|
|
#define SSREQ_CONNECTS 12
|
|
|
|
|
|
/* response packets ---------------------------------- */
|
|
|
|
typedef struct {
|
|
long lCode; /* response code */
|
|
ULONG ulSize; /* file size */
|
|
ULONG ulSum; /* checksum for file */
|
|
char szFile[MAX_PATH]; /* null-term. filename relative to orig req. */
|
|
} SSRESPONSE, * PSSRESPONSE;
|
|
|
|
/* for version 1 and later */
|
|
typedef struct { /* files.c knows this is
|
|
RESPHEADSIZE+strlen(szFile)+1
|
|
+ strlen(szLocal)+1 bytes long */
|
|
long lVersion; /* protocol version (it will be >=1) */
|
|
long lResponse; /* 22222222 decimal means This is a Response */
|
|
long lCode; /* response code */
|
|
ULONG ulSize; /* file size (Win32 error code for SSRESP_ERROR) */
|
|
DWORD fileattribs;
|
|
FILETIME ft_create;
|
|
FILETIME ft_lastaccess;
|
|
FILETIME ft_lastwrite;
|
|
ULONG ulSum; /* checksum for file */
|
|
BOOL bSumValid; /* TRUE iff there was a checksum for file */
|
|
char szFile[MAX_PATH]; /* null-term. filename/pipename
|
|
relative to orig req. */
|
|
char szLocal[MAX_PATH]; /* client file name - but the data is actually
|
|
concatenated straight on the end of szFile
|
|
after the terminating NULL */
|
|
} SSNEWRESP, * PSSNEWRESP;
|
|
|
|
#define RESPHEADSIZE (3*sizeof(long)+2*sizeof(ULONG)+3*sizeof(FILETIME)+sizeof(DWORD)+sizeof(BOOL))
|
|
|
|
#define LRESPONSE 22222222
|
|
|
|
/* response codes for lCode */
|
|
|
|
#define SSRESP_FILE 1 /* file passed: lSum and szFile are valid
|
|
This is followed by a series of data Packets
|
|
which are the compressed file.
|
|
*/
|
|
#define SSRESP_DIR 2 /* dir passed: szFile ok, lSum not valid */
|
|
#define SSRESP_PIPENAME 3 /* files requested. Here is the pipe name */
|
|
#define SSRESP_END 0 /* no more files: lSum and szFile are empty*/
|
|
#define SSRESP_ERROR -1 /* file/dir cannot be read: szFile is valid */
|
|
#define SSRESP_BADPASS -2 /* bad password error (on UNC name) */
|
|
#define SSRESP_BADVERS -3 /* down level server */
|
|
#define SSRESP_CANTOPEN -4 /* Can't open file
|
|
In reply to a scan, szFile, date/time and size are valid
|
|
*/
|
|
#define SSRESP_NOATTRIBS -5 /* Can't get file attributes */
|
|
#define SSRESP_NOCOMPRESS -6 /* Can't compress the file (obsolete) */
|
|
#define SSRESP_NOREADCOMP -7 /* Can't read the compressed file
|
|
Uncompressed file follows as data packets
|
|
*/
|
|
#define SSRESP_NOTEMPPATH -8 /* Can't create a temp path
|
|
Uncompressed file follows as data packets
|
|
*/
|
|
#define SSRESP_COMPRESSEXCEPT -9 /* Exception from Compress
|
|
Uncompressed file follows as data packets
|
|
*/
|
|
#define SSRESP_NOREAD -10 /* Couldn't read uncompressed file (either)
|
|
No file follows.
|
|
*/
|
|
#define SSRESP_COMPRESSFAIL -11 /* COMPRESS reported failure
|
|
Uncompressed file follows as data packets
|
|
*/
|
|
|
|
|
|
#define PACKDATALENGTH 8192
|
|
/*
|
|
* response block for FILE request.
|
|
*/
|
|
typedef struct {
|
|
long lSequence ; /* packet sequence nr, or -1 if error and end*/
|
|
ULONG ulSize; /* length of data in this block */
|
|
ULONG ulSum; /* checksum for this block */
|
|
char Data[PACKDATALENGTH]; /* send in blocks of 8k */
|
|
} SSPACKET, * PSSPACKET;
|
|
|
|
/*
|
|
* response block for FILE request.
|
|
*/
|
|
typedef struct { /* files.c knows this starts "long lSequence" */
|
|
/* and is PACKHEADSIZE+ulSize in length really*/
|
|
long lVersion; /* server/protocol version number */
|
|
long lPacket; /* 11111111 decimal means This is a Packet */
|
|
long lSequence ; /* packet sequence nr, or -1 if error and end*/
|
|
ULONG ulSize; /* length of data in this block */
|
|
ULONG ulSum; /* checksum for this block */
|
|
char Data[PACKDATALENGTH]; /* send in blocks of 8k */
|
|
} SSNEWPACK, * PSSNEWPACK;
|
|
|
|
/* size of SSNEWPACK header */
|
|
#define PACKHEADSIZE (3*sizeof(long)+2*sizeof(ULONG))
|
|
|
|
#define LPACKET 11111111
|
|
/*
|
|
* in response to a FILE request, we send SSPACKET responses until there
|
|
* is no more data. The final block will have ulSize == 0 to indicate that
|
|
* there is no more data. The Data[] field of this block will then be
|
|
* a SSATTRIBS containing the file attributes and file times.
|
|
*/
|
|
typedef struct {
|
|
DWORD fileattribs;
|
|
FILETIME ft_create;
|
|
FILETIME ft_lastaccess;
|
|
FILETIME ft_lastwrite;
|
|
} SSATTRIBS, * PSSATTRIBS;
|
|
|
|
|
|
|
|
|
|
/*
|
|
* in response to errorlog, eventlog and connections requests, we send one
|
|
* of these structures.
|
|
*
|
|
* The Data section consists of a FILETIME (64-bit UTC event time), followed
|
|
* by a null-terminated ansi string, for each event logged.
|
|
*
|
|
*/
|
|
struct corelog {
|
|
DWORD lcode; /* packet checkcode - should be LRESPONSE */
|
|
BOOL bWrapped; /* log overrun - earlier data lost */
|
|
DWORD dwRevCount; /* revision count of log */
|
|
DWORD length; /* length of data in log */
|
|
BYTE Data[PACKDATALENGTH];
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef trace
|
|
/* add msg to the trace file */
|
|
void APIENTRY Trace_File(LPSTR msg);
|
|
#endif //trace
|