1
1
/**
2
2
* HashCheck Shell Extension
3
3
* Original work copyright (C) Kai Liu. All rights reserved.
4
- * Modified work copyright (C) 2014 Christopher Gurnee. All rights reserved.
4
+ * Modified work copyright (C) 2014, 2016 Christopher Gurnee. All rights reserved.
5
5
* Modified work copyright (C) 2016 Tim Schlueter. All rights reserved.
6
6
*
7
7
* Please refer to readme.txt for information about this source code.
11
11
#include "globals.h"
12
12
#include "HashCheckCommon.h"
13
13
#include "HashCheckOptions.h"
14
+ #include "libs/WinHash.h"
14
15
#include "RegHelpers.h"
15
16
#include "libs/IsFontAvailable.h"
16
17
@@ -52,7 +53,7 @@ VOID WINAPI OptionsDlgInit( HWND hWnd, POPTIONSCONTEXT poptctx );
52
53
53
54
// Dialog commands
54
55
VOID WINAPI ChangeFont ( HWND hWnd , POPTIONSCONTEXT poptctx );
55
- VOID WINAPI SaveSettings ( HWND hWnd , POPTIONSCONTEXT poptctx );
56
+ BOOL WINAPI SaveSettings ( HWND hWnd , POPTIONSCONTEXT poptctx );
56
57
57
58
58
59
@@ -132,6 +133,17 @@ VOID __fastcall OptionsLoad( PHASHCHECKOPTIONS popt )
132
133
}
133
134
}
134
135
136
+ if (popt -> dwFlags & HCOF_CHECKSUMS )
137
+ {
138
+ if (!(hKey &&
139
+ RegGetDW (hKey , TEXT ("Checksums" ), & popt -> dwChecksums ) &&
140
+ popt -> dwChecksums > 0 && popt -> dwChecksums <= WHEX_ALL ))
141
+ {
142
+ // Fall back to default (CRC-32, SHA-1, both SHA-2's)
143
+ popt -> dwChecksums = DEFAULT_HASH_ALGORITHMS ;
144
+ }
145
+ }
146
+
135
147
if (popt -> dwFlags & HCOF_FONT )
136
148
{
137
149
DWORD dwType ;
@@ -184,6 +196,9 @@ VOID __fastcall OptionsSave( PHASHCHECKOPTIONS popt )
184
196
if (popt -> dwFlags & HCOF_SAVEENCODING )
185
197
RegSetDW (hKey , TEXT ("SaveEncoding" ), popt -> dwSaveEncoding );
186
198
199
+ if (popt -> dwFlags & HCOF_CHECKSUMS )
200
+ RegSetDW (hKey , TEXT ("Checksums" ), popt -> dwChecksums );
201
+
187
202
if (popt -> dwFlags & HCOF_FONT )
188
203
RegSetValueEx (hKey , TEXT ("Font" ), 0 , REG_BINARY , (PBYTE )& popt -> lfFont , sizeof (LOGFONT ));
189
204
@@ -225,7 +240,8 @@ INT_PTR CALLBACK OptionsDlgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPa
225
240
return (TRUE);
226
241
227
242
case IDC_OK :
228
- SaveSettings (hWnd , poptctx );
243
+ if (SaveSettings (hWnd , poptctx ) == FALSE)
244
+ return (TRUE); // don't close on save errors
229
245
case IDC_CANCEL :
230
246
end_dialog : EndDialog (hWnd , 0 );
231
247
return (TRUE);
@@ -252,6 +268,7 @@ VOID WINAPI OptionsDlgInit( HWND hWnd, POPTIONSCONTEXT poptctx )
252
268
{ IDC_OPT_ENCODING_UTF8 , IDS_OPT_ENCODING_UTF8 },
253
269
{ IDC_OPT_ENCODING_UTF16 , IDS_OPT_ENCODING_UTF16 },
254
270
{ IDC_OPT_ENCODING_ANSI , IDS_OPT_ENCODING_ANSI },
271
+ { IDC_OPT_CHK , IDS_OPT_CHK },
255
272
{ IDC_OPT_FONT , IDS_OPT_FONT },
256
273
{ IDC_OPT_FONT_CHANGE , IDS_OPT_FONT_CHANGE },
257
274
{ IDC_OK , IDS_OPT_OK },
@@ -283,6 +300,11 @@ VOID WINAPI OptionsDlgInit( HWND hWnd, POPTIONSCONTEXT poptctx )
283
300
SendDlgItemMessage (hWnd , IDC_OPT_ENCODING_FIRSTID + poptctx -> popt -> dwSaveEncoding ,
284
301
BM_SETCHECK , BST_CHECKED , 0 );
285
302
303
+ #define HASH_OPT_SET_CHECKS_op (alg ) \
304
+ if (poptctx->popt->dwChecksums & WHEX_CHECK##alg) \
305
+ SendDlgItemMessage(hWnd, IDC_OPT_CHK_##alg, BM_SETCHECK, BST_CHECKED, 0);
306
+ FOR_EACH_HASH (HASH_OPT_SET_CHECKS_op )
307
+
286
308
if (poptctx -> hFont = CreateFontIndirect (& poptctx -> popt -> lfFont ))
287
309
SendDlgItemMessage (hWnd , IDC_OPT_FONT_PREVIEW , WM_SETFONT , (WPARAM )poptctx -> hFont , FALSE);
288
310
@@ -321,10 +343,34 @@ VOID WINAPI ChangeFont( HWND hWnd, POPTIONSCONTEXT poptctx )
321
343
}
322
344
}
323
345
324
- VOID WINAPI SaveSettings ( HWND hWnd , POPTIONSCONTEXT poptctx )
346
+ BOOL WINAPI SaveSettings ( HWND hWnd , POPTIONSCONTEXT poptctx )
325
347
{
326
348
DWORD i ;
327
349
350
+ // Get the user-selected value for dwChecksums
351
+ i = 0 ;
352
+ #define HASH_OPT_GET_CHECKS_op (alg ) \
353
+ if (SendDlgItemMessage(hWnd, IDC_OPT_CHK_##alg, BM_GETCHECK, 0, 0) == BST_CHECKED) \
354
+ i |= WHEX_CHECK##alg;
355
+ FOR_EACH_HASH (HASH_OPT_GET_CHECKS_op )
356
+
357
+ // Ensure at least one is checked
358
+ if (i == 0 )
359
+ {
360
+ TCHAR szError [MAX_STRINGMSG ];
361
+ // "Please select at least one checksum"
362
+ LoadString (g_hModThisDll , IDS_OPT_CHK_ERROR , szError , countof (szError ));
363
+ MessageBox (hWnd , szError , NULL , MB_ICONWARNING );
364
+ return (FALSE);
365
+ }
366
+
367
+ // If the value has changed, flag it for saving
368
+ if (i <= WHEX_ALL && poptctx -> popt -> dwChecksums != i )
369
+ {
370
+ poptctx -> popt -> dwFlags |= HCOF_CHECKSUMS ;
371
+ poptctx -> popt -> dwChecksums = i ;
372
+ }
373
+
328
374
// Get the user-selected value for dwMenuDisplay
329
375
for (i = 0 ; i < 3 ; ++ i )
330
376
{
@@ -358,4 +404,6 @@ VOID WINAPI SaveSettings( HWND hWnd, POPTIONSCONTEXT poptctx )
358
404
poptctx -> popt -> dwFlags |= HCOF_FONT ;
359
405
360
406
OptionsSave (poptctx -> popt );
407
+
408
+ return (TRUE);
361
409
}
0 commit comments