/* * 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