00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <windows.h>
00025 #include <stdlib.h>
00026 #include <limits.h>
00027 #include <math.h>
00028 #include "strings.h"
00029
00030 #define ROUND_UP_ON_DIVIDE(d, n) (0 == ((d) % (n)) ? ((d)/(n)) : ((d)/(n))+1)
00031
00032 VOID
00033 Strings_CreateDataBufferString(
00034 IN PCHAR DataBuffer,
00035 IN ULONG DataBufferLength,
00036 IN ULONG NumBytesToDisplay,
00037 IN ULONG DisplayBlockSize,
00038 OUT PCHAR *BufferString
00039 )
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 {
00058 ULONG BufferStringLength;
00059 ULONG MaxDisplayedBytes;
00060 PUCHAR NextByte;
00061 PUCHAR String;
00062 PUCHAR CurrentBufferOffset;
00063 INT nFullIterations;
00064 INT LeftOverBytes;
00065 INT IterationIndex;
00066 INT ByteOffset;
00067
00068
00069
00070
00071
00072
00073 MaxDisplayedBytes = (NumBytesToDisplay > DataBufferLength) ? DataBufferLength
00074 : NumBytesToDisplay;
00075
00076
00077
00078
00079
00080
00081
00082 BufferStringLength = 2*MaxDisplayedBytes + ROUND_UP_ON_DIVIDE(MaxDisplayedBytes,
00083 DisplayBlockSize
00084 );
00085
00086
00087
00088
00089
00090 String = (PCHAR) malloc(BufferStringLength * sizeof(CHAR));
00091
00092 if (NULL != String) {
00093
00094
00095
00096
00097
00098 nFullIterations = MaxDisplayedBytes / DisplayBlockSize;
00099
00100
00101
00102
00103
00104
00105
00106
00107 CurrentBufferOffset = DataBuffer;
00108 NextByte = String-1;
00109
00110
00111
00112
00113
00114
00115
00116 for (IterationIndex = 0; IterationIndex < nFullIterations; IterationIndex++)
00117 {
00118 NextByte++;
00119
00120
00121
00122
00123
00124
00125
00126 for (ByteOffset = DisplayBlockSize-1; ByteOffset >= 0; ByteOffset--)
00127 {
00128 wsprintf(NextByte, "%02X", *(CurrentBufferOffset+ByteOffset));
00129
00130 NextByte += 2;
00131 }
00132
00133
00134
00135
00136
00137 *(NextByte) = ' ';
00138
00139 CurrentBufferOffset += DisplayBlockSize;
00140 }
00141
00142
00143
00144
00145
00146 LeftOverBytes = (MaxDisplayedBytes % DisplayBlockSize);
00147
00148 if (0 == LeftOverBytes)
00149 {
00150 *(NextByte) = '\0';
00151 }
00152
00153 for (ByteOffset = LeftOverBytes-1, NextByte++; ByteOffset >= 0; ByteOffset--)
00154 {
00155 wsprintf(NextByte, "%02X", *(CurrentBufferOffset+ByteOffset));
00156 NextByte += 2;
00157 }
00158 }
00159
00160 *BufferString = String;
00161
00162 return;
00163 }
00164
00165 BOOL
00166 Strings_StringToUnsignedList(
00167 IN OUT PCHAR InString,
00168 IN ULONG UnsignedSize,
00169 IN ULONG Base,
00170 OUT PCHAR *UnsignedList,
00171 OUT PULONG nUnsigneds
00172 )
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192 {
00193 CHAR tokDelims[] = "\t,; ";
00194 PCHAR strToken;
00195 PCHAR endp;
00196 BOOL fStatus;
00197 ULONG ulValue;
00198 PCHAR pList;
00199 PCHAR pNewList;
00200 ULONG nAllocUnsigneds;
00201 ULONG nActualUnsigneds;
00202 ULONG ulMaxValue;
00203
00204
00205
00206
00207
00208
00209
00210
00211 nAllocUnsigneds = 2;
00212 nActualUnsigneds = 0;
00213
00214 pList = (PCHAR) malloc(nAllocUnsigneds * sizeof(ULONG));
00215
00216 if (NULL == pList)
00217 {
00218 return (FALSE);
00219 }
00220
00221
00222
00223
00224
00225
00226 ulMaxValue = (sizeof(ULONG) == UnsignedSize) ? ULONG_MAX
00227 : (1 << (UnsignedSize*8)) - 1;
00228
00229
00230
00231
00232
00233
00234
00235
00236 fStatus = TRUE;
00237
00238 strToken = strtok(InString, tokDelims);
00239
00240
00241
00242
00243
00244 while (NULL != strToken && fStatus)
00245 {
00246
00247
00248
00249
00250
00251 fStatus = FALSE;
00252
00253
00254
00255
00256
00257 ulValue = strtoul(strToken, &endp, Base);
00258
00259
00260
00261
00262
00263 if ('\0' == *endp)
00264 {
00265
00266
00267
00268
00269
00270 if (ulValue <= ulMaxValue)
00271 {
00272
00273
00274
00275
00276
00277
00278 if (nAllocUnsigneds == nActualUnsigneds)
00279 {
00280 nAllocUnsigneds *= 2;
00281
00282 pNewList = (PCHAR) realloc(pList, UnsignedSize*nAllocUnsigneds);
00283
00284 if (NULL == pNewList)
00285 {
00286 break;
00287 }
00288 pList = pNewList;
00289 }
00290
00291
00292
00293
00294
00295 memcpy(pList + (UnsignedSize * nActualUnsigneds),
00296 &ulValue,
00297 UnsignedSize);
00298
00299 nActualUnsigneds++;
00300
00301
00302
00303
00304
00305
00306 fStatus = TRUE;
00307
00308 strToken = strtok(NULL, tokDelims);
00309 }
00310 }
00311 }
00312
00313
00314
00315
00316
00317
00318 if (!fStatus || 0 == nActualUnsigneds)
00319 {
00320 free(pList);
00321 pList = NULL;
00322 nActualUnsigneds = 0;
00323 }
00324
00325 *UnsignedList = pList;
00326 *nUnsigneds = nActualUnsigneds;
00327
00328 return (fStatus);
00329 }
00330