windows-nt/Source/XPSP1/NT/sdktools/windiff/server/sumserve.h
2020-09-26 16:20:57 +08:00

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