1 /*-
2  ***********************************************************************
3  *
4  * $Id: ftimes-xpa.h,v 1.4 2014/07/18 06:40:45 mavrik Exp $
5  *
6  ***********************************************************************
7  *
8  * Copyright 2009-2014 The FTimes Project, All Rights Reserved.
9  *
10  ***********************************************************************
11  */
12 #ifndef _FTIMES_XPA_H_INCLUDED
13 #define _FTIMES_XPA_H_INCLUDED
14 
15 /*-
16  ***********************************************************************
17  *
18  * Defines
19  *
20  ***********************************************************************
21  */
22 #define PROGRAM_NAME "ftimes-xpa"
23 #define VERSION "1.0.0"
24 #define FTIMES_XPA_VERSION_0_1 0x00000001 /* Major.Minor */
25 #define FTIMES_XPA_VERSION FTIMES_XPA_VERSION_0_1
26 
27 #define ER       -1
28 #define ER_OK     0
29 
30 #define XER_OK    0
31 #define XER_Usage 1
32 #define XER_Abort 2
33 #define XER_BootStrap 3
34 #define XER_ProcessArguments 4
35 
36 #define FTIMES_XPA_EXTENDED_PATH_PREFIX "\\\\?\\"
37 
38 #define FTIMES_XPA_CHUNK_TYPE_NULL 0x58504100
39 #define FTIMES_XPA_CHUNK_TYPE_HEAD 0x58504101
40 #define FTIMES_XPA_CHUNK_TYPE_HKVP 0x58504102
41 #define FTIMES_XPA_CHUNK_TYPE_DATA 0x58504103
42 #define FTIMES_XPA_CHUNK_TYPE_DKVP 0x58504104
43 #define FTIMES_XPA_CHUNK_TYPE_JOIN 0x58504105
44 #define FTIMES_XPA_CHUNK_TYPE_TKVP 0x585041fe
45 #define FTIMES_XPA_CHUNK_TYPE_TAIL 0x585041ff
46 
47 #define FTIMES_XPA_KEY_ID_NAME          0
48 #define FTIMES_XPA_KEY_ID_MD5           1
49 #define FTIMES_XPA_KEY_ID_SHA1          2
50 #define FTIMES_XPA_KEY_ID_DATA_SIZE     3
51 #define FTIMES_XPA_KEY_ID_EXPECTED_SIZE 4
52 #define FTIMES_XPA_KEY_ID_REPORTED_SIZE 5
53 #define FTIMES_XPA_KEY_ID_HEAD_FLAGS    6
54 #define FTIMES_XPA_KEY_ID_TAIL_FLAGS    7
55 
56 #define FTIMES_XPA_MEMBER_HEAD_FLAG_OPEN_ERROR  0x00010000
57 
58 #define FTIMES_XPA_MEMBER_TAIL_FLAG_READ_ERROR  0x00010000
59 
60 #define FTIMES_XPA_KIVL_SIZE 4 /* KIVL --> Key ID / Value Length */
61 #define FTIMES_XPA_MAX_VALUE_LENGTH 1048576
62 
63 #define FTIMES_XPA_ARCHIVE_MODE 0x00000001
64 
65 #define FTIMES_XPA_DEFAULT_BLOCKSIZE 32768
66 #define FTIMES_XPA_MIN_BLOCKSIZE 1
67 #define FTIMES_XPA_MAX_BLOCKSIZE 0x10000000 /* 2^28 = 268435456 */
68 
69 /*-
70  ***********************************************************************
71  *
72  * Typedefs
73  *
74  ***********************************************************************
75  */
76 typedef struct _FTIMES_XPA_HANDLE
77 {
78   char               *pcDecodedName;
79   FILE               *pFile;
80 #ifdef WIN32
81   char               *pcFileA;
82   HANDLE              hFile;
83   int                 iFile;
84   wchar_t            *pcFileW;
85 #endif
86 } FTIMES_XPA_HANDLE;
87 
88 typedef struct _FTIMES_XPA_HEADER
89 {
90   APP_UI32            ui32Magic;
91   APP_UI32            ui32Version;
92   APP_UI32            ui32ThisChunkSize;
93   APP_UI32            ui32LastChunkSize;
94   APP_UI32            ui32ChunkId;
95 } FTIMES_XPA_HEADER;
96 #define FTIMES_XPA_HEADER_SIZE_0_1 20
97 #define FTIMES_XPA_HEADER_SIZE FTIMES_XPA_HEADER_SIZE_0_1
98 
99 typedef enum _FTIMES_XPA_OPTION_IDS
100 {
101   OPT_Blocksize,
102   OPT_ListFile,
103 } FTIMES_XPA_OPTION_IDS;
104 
105 typedef struct _FTIMES_XPA_PROPERTIES
106 {
107   char               *pcListFile;
108   char              **ppcFileVector;
109   int                 iRunMode;
110   int                 iFileCount;
111   APP_UI32            ui32Blocksize;
112   unsigned char      *pucData;
113 } FTIMES_XPA_PROPERTIES;
114 
115 /*-
116  ***********************************************************************
117  *
118  * Function Prototypes
119  *
120  ***********************************************************************
121  */
122 void                FTimesXpaAbort();
123 void                FTimesXpaAddMember(char *pcEncodedName, unsigned char *pucData, APP_UI32 ui32Blocksize, char *pcError);
124 #ifdef WINNT
125 BOOL                FTimesXpaAdjustPrivileges(LPCTSTR lpcPrivilege);
126 #endif
127 int                 FTimesXpaBootStrap(char *pcError);
128 char               *FTimesXpaDecodeString(char *pcEncoded, char *pcError);
129 #ifdef WINNT
130 void                FTimesXpaFormatWinxError(DWORD dwError, TCHAR **pptcMessage);
131 #endif
132 void                FTimesXpaFreeHandle(FTIMES_XPA_HANDLE *psHandle);
133 void                FTimesXpaFreeProperties(FTIMES_XPA_PROPERTIES *psProperties);
134 FTIMES_XPA_HANDLE  *FTimesXpaGetHandle(char *pcEncodedName, char *pcError);
135 FTIMES_XPA_PROPERTIES *FTimesXpaGetPropertiesReference(void);
136 FTIMES_XPA_PROPERTIES *FTimesXpaNewProperties(char *ptcError);
137 int                 FTimesXpaOptionHandler(OPTIONS_TABLE *psOption, char *pcValue, FTIMES_XPA_PROPERTIES *psProperties, char *pcError);
138 int                 FTimesXpaProcessArguments(int iArgumentCount, char *ppcArgumentVector[], FTIMES_XPA_PROPERTIES *psProperties, char *pcError);
139 #ifdef WINNT
140 int                 FTimesXpaSetPrivileges(char *pcError);
141 #endif
142 void                FTimesXpaSetPropertiesReference(FTIMES_XPA_PROPERTIES *psProperties);
143 void                FTimesXpaUsage(void);
144 wchar_t            *FTimesXpaUtf8ToWide(char *pcString, int iUtf8Size, char *pcError);
145 void                FTimesXpaVersion(void);
146 int                 FTimesXpaWriteData(FILE *pFile, unsigned char *pucData, int iLength, char *pcError);
147 int                 FTimesXpaWriteHeader(FILE *pFile, FTIMES_XPA_HEADER *psFileHeader, char *pcError);
148 int                 FTimesXpaWriteKvp(FILE *pFile, int iKeyId, void *pvValue, int iValueLength, char *pcError);
149 
150 #endif /* !_FTIMES_XPA_H_INCLUDED */
151