1 /*-
2  ***********************************************************************
3  *
4  * $Id: rtimes.h,v 1.20 2014/07/18 06:40:45 mavrik Exp $
5  *
6  ***********************************************************************
7  *
8  * Copyright 2008-2014 The FTimes Project, All Rights Reserved.
9  *
10  ***********************************************************************
11  */
12 #ifndef _RTIMES_H_INCLUDED
13 #define _RTIMES_H_INCLUDED
14 
15 /*-
16  ***********************************************************************
17  *
18  * Defines.
19  *
20  ***********************************************************************
21  */
22 #define PROGRAM "rtimes"
23 #define VERSION "1.0.10"
24 
25 #define ER    -1
26 #define ER_OK  0
27 
28 #define XER_OK                0
29 #define XER_Usage             1
30 #define XER_Abort             2
31 #define XER_BootStrap         3
32 #define XER_ProcessArguments  4
33 #define XER_WorkHorse         5
34 
35 #define RTIMES_MAP_MODE 0x00000001
36 
37 #define RTIMES_MIN_DATA_SIZE          1
38 #define RTIMES_MAX_DATA_SIZE 1073741824 /* 1 GB */
39 
40 #define MESSAGE_SIZE (1024 * sizeof(TCHAR))
41 
42 #define NEUTER_ENCODING_RTIMES 0
43 #define NEUTER_ENCODING_FULL 1
44 #define RTIMES_ERROR_LENGTH 512
45 #define RTIMES_TIME_FORMAT _T("%04d-%02d-%02d %02d:%02d:%02d.%03d")
46 #define RTIMES_TIME_FORMAT_LENGTH 24
47 
48 #define RTIMES_DEFAULT_CLASS_STRING_SIZE (512 * sizeof(TCHAR))
49 #define RTIMES_DEFAULT_DATA_SIZE 1024
50 #define RTIMES_DEFAULT_NAME_SIZE 1024
51 
52 #define RTIMES_KEYNAME_SIZE ((255 + 1) * 2) /* Microsoft states that 255 "characters" is the limit. We add 1 (for the terminator) and multiply by 2 (to handle Unicode). */
53 
54 #define RTIMES_MAX_DO_OVERS 3
55 #define RTIMES_TYPE_SIZE (32 * sizeof(TCHAR))
56 
57 #define RTIMES_FLAG_KEY                0x00000001
58 #define RTIMES_FLAG_VALUE              0x00000002
59 #define RTIMES_FLAG_DEFAULT_VALUE      0x00000004
60 #define RTIMES_FLAG_REQUESTED_TRUNCATE 0x00000008
61 #define RTIMES_FLAG_MANDATORY_TRUNCATE 0x00000010
62 #define RTIMES_FLAG_OWNER_MISSING      0x00000020
63 #define RTIMES_FLAG_GROUP_MISSING      0x00000040
64 #define RTIMES_FLAG_CLASS_MISSING      0x00000080
65 #define RTIMES_FLAG_WTIME_MISSING      0x00000100
66 #define RTIMES_FLAG_DATA_MISSING       0x00000200
67 #define RTIMES_FLAG_MANDATORY_NAME_TRUNCATE 0x00000400
68 #define RTIMES_FLAG_OWNER_INVALID      0x00000800
69 #define RTIMES_FLAG_DACL_INVALID       0x00001000
70 #define RTIMES_FLAG_DACL_MISSING       0x00002000
71 #define RTIMES_FLAG_DACL_OMITTED       0x00004000
72 #define RTIMES_FLAG_GROUP_INVALID      0x00008000
73 
74 /*-
75  ***********************************************************************
76  *
77  * Typedefs.
78  *
79  ***********************************************************************
80  */
81 typedef enum _RTIMES_OPTION_IDS
82 {
83   OPT_MaxData,
84 } RTIMES_OPTION_IDS;
85 
86 typedef struct _RTIMES_PROPERTIES
87 {
88   int                 iRunMode;
89   DWORD               dwMaxData;
90 } RTIMES_PROPERTIES;
91 
92 typedef struct _RTIMES_TODO_LIST
93 {
94   HKEY                dwHive;
95   TCHAR               atcHive[(256 * sizeof(TCHAR))];
96   TCHAR               atcKey[(256 * sizeof(TCHAR))];
97 } RTIMES_TODO_LIST;
98 
99 /*-
100  ***********************************************************************
101  *
102  * Global Variables.
103  *
104  ***********************************************************************
105  */
106 
107 /*-
108  ***********************************************************************
109  *
110  * Function Prototypes.
111  *
112  ***********************************************************************
113  */
114 int                 main(int iArgumentCount, TCHAR *pptcArgumentVector[]);
115 void                FormatWinxError(DWORD dwError, TCHAR **pptcMessage);
116 int                 RTimesBootStrap(TCHAR *ptcError);
117 int                 RTimesEnumerateKeys(FILE *pFile, HKEY hKey, TCHAR *ptcPath, TCHAR *ptcError);
118 int                 RTimesEnumerateValues(FILE *pFile, HKEY hKey, TCHAR *ptcPath, TCHAR *ptcError);
119 RTIMES_PROPERTIES  *RTimesGetPropertiesReference(void);
120 int                 RTimesMapKey(FILE *pFile, HKEY hKey, TCHAR *ptcPath, TCHAR *ptcError);
121 int                 RTimesMd5ToHex(unsigned char *pucMd5, TCHAR *ptcHexHash);
122 TCHAR              *RTimesNeuterEncodeData(unsigned char *pucData, int iLength, int iOptions, TCHAR *ptcError);
123 TCHAR              *RTimesNewPath(TCHAR *ptcPath, TCHAR *ptcName, TCHAR *ptcDelimiter, TCHAR *ptcError);
124 RTIMES_PROPERTIES  *RTimesNewProperties(TCHAR *ptcError);
125 int                 RTimesOptionHandler(OPTIONS_TABLE *psOption, TCHAR *ptcValue, RTIMES_PROPERTIES *psProperties, TCHAR *ptcError);
126 int                 RTimesProcessArguments(int iArgumentCount, TCHAR *pptcArgumentVector[], RTIMES_PROPERTIES *psProperties, TCHAR *ptcError);
127 void                RTimesSetPropertiesReference(RTIMES_PROPERTIES *psProperties);
128 TCHAR              *RTimesSidToString(SID *psSid, TCHAR *ptcError);
129 void                RTimesUsage(void);
130 void                RTimesVersion(void);
131 int                 RTimesWorkHorse(RTIMES_PROPERTIES *psProperties, TCHAR *ptcError);
132 void                RTimesWriteValueRecord(FILE *pFile, DWORD dwFlags, DWORD dwType, BYTE *pbyteData, DWORD dwDataSize, TCHAR *ptcPath, TCHAR *ptcName);
133 int                 RTimesWTimeToString(FILETIME *pFileTime, TCHAR *ptcTime);
134 
135 #endif /* !_RTIMES_H_INCLUDED */
136