source: trunk/EraserDll/Options.cpp @ 4

Revision 4, 6.3 KB checked in by lowjoel, 7 years ago (diff)

Added the source files from EraserDll? (SVN migration commit 2)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
Line 
1// Options.cpp
2//
3// Eraser. Secure data removal. For Windows.
4// Copyright © 1997-2001  Sami Tolvanen (sami@tolvanen.com).
5//
6// This program is free software; you can redistribute it and/or
7// modify it under the terms of the GNU General Public License
8// as published by the Free Software Foundation; either version 2
9// of the License, or (at your option) any later version.
10//
11// This program is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15//
16// You should have received a copy of the GNU General Public License
17// along with this program; if not, write to the Free Software
18// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19// 02111-1307, USA.
20
21#include "stdafx.h"
22#include "EraserDll.h"
23#include "Common.h"
24#include "Options.h"
25#include "..\shared\key.h"
26
27#define LIBRARYSETTINGS_SIZE     (sizeof(LibrarySettings) - sizeof(LPMETHOD))
28#define CMETHOD_SIZE             (sizeof(METHOD) - sizeof(LPPASS))
29#define MAX_CMETHOD_SIZE         (CMETHOD_SIZE + PASSES_MAX * sizeof(PASS))
30#define MAX_LIBRARYSETTINGS_SIZE (LIBRARYSETTINGS_SIZE + (MAX_CUSTOM_METHODS * MAX_CMETHOD_SIZE))
31
32void
33setLibraryDefaults(LibrarySettings *pls)
34{
35    try {
36        ZeroMemory(pls, sizeof(LibrarySettings));
37
38        pls->m_nFileMethodID     = DEFAULT_FILE_METHOD_ID;
39        pls->m_nUDSMethodID      = DEFAULT_UDS_METHOD_ID;
40        pls->m_uItems            = (E_UINT8)-1; // select all
41        pls->m_nFileRandom       = PASSES_RND;
42        pls->m_nUDSRandom        = PASSES_RND;
43        pls->m_nCMethods         = 0;
44        pls->m_lpCMethods        = 0;
45    } catch (...) {
46        ASSERT(0);
47    }
48}
49
50extern bool no_registry;
51
52bool
53loadLibrarySettings(LibrarySettings *pls)
54{
55    try {
56        CKey kReg_reg;
57        CIniKey kReg_ini;
58        CKey &kReg = no_registry ? kReg_ini : kReg_reg;
59        bool    bResult = FALSE;
60        E_UINT32  uSize;
61        E_PUINT8  lpData;
62
63        setLibraryDefaults(pls);
64
65        if (!kReg.Open(HKEY_CURRENT_USER, ERASER_REGISTRY_BASE)) {
66            return false;
67        }
68
69        uSize = kReg.GetValueSize(ERASER_REGISTRY_LIBRARY);
70
71        if (uSize >= LIBRARYSETTINGS_SIZE && uSize <= MAX_LIBRARYSETTINGS_SIZE) {
72            lpData = new E_UINT8[uSize];
73            ZeroMemory(lpData, uSize);
74
75            if (kReg.GetValue((LPVOID)lpData, ERASER_REGISTRY_LIBRARY)) {
76                // basic fields
77                MoveMemory((LPVOID)pls, (LPCVOID)lpData, LIBRARYSETTINGS_SIZE);
78
79                // custom methods
80                if (pls->m_nCMethods > 0 && pls->m_nCMethods <= MAX_CUSTOM_METHODS) {
81                    pls->m_lpCMethods = new METHOD[pls->m_nCMethods];
82
83                    E_UINT32 uPos = LIBRARYSETTINGS_SIZE;
84
85                    for (E_UINT8 i = 0; i < pls->m_nCMethods; i++) {
86                        // custom method fields
87                        MoveMemory((LPVOID)(&pls->m_lpCMethods[i]),
88                                   (LPCVOID)(&lpData[uPos]),
89                                   CMETHOD_SIZE);
90
91                        uPos += CMETHOD_SIZE;
92
93                        // actual pass information
94                        if (pls->m_lpCMethods[i].m_nPasses > 0 &&
95                            pls->m_lpCMethods[i].m_nPasses <= PASSES_MAX) {
96                            pls->m_lpCMethods[i].m_lpPasses = new PASS[pls->m_lpCMethods[i].m_nPasses];
97                            ZeroMemory(pls->m_lpCMethods[i].m_lpPasses,
98                                       pls->m_lpCMethods[i].m_nPasses * sizeof(PASS));
99
100                            MoveMemory((LPVOID)(pls->m_lpCMethods[i].m_lpPasses),
101                                       (LPCVOID)(&lpData[uPos]),
102                                       pls->m_lpCMethods[i].m_nPasses * sizeof(PASS));
103
104                            uPos += (pls->m_lpCMethods[i].m_nPasses * sizeof(PASS));
105                        }
106                    }
107                }
108
109                bResult = true;
110            }
111
112            delete[] lpData;
113            lpData = 0;
114        }
115
116        return bResult;
117    } catch (CException *e) {
118        ASSERT(0);
119        e->ReportError(MB_ICONERROR);
120        e->Delete();
121
122        try {
123            CKey kReg_reg;
124            CIniKey kReg_ini;
125            CKey &kReg = no_registry ? kReg_ini : kReg_reg;
126            if (kReg.Open(HKEY_CURRENT_USER, ERASER_REGISTRY_BASE)) {
127                kReg.DeleteValue(ERASER_REGISTRY_LIBRARY);
128            }
129        } catch (...) {
130            ASSERT(0);
131        }
132    }
133
134    return false;
135}
136
137bool
138saveLibrarySettings(LibrarySettings *pls)
139{
140    try {
141        CKey kReg_reg;
142        CIniKey kReg_ini;
143        CKey &kReg = no_registry ? kReg_ini : kReg_reg;
144        bool    bResult = FALSE;
145        E_PUINT8  lpData;
146        E_UINT8   i;
147        E_UINT32  uSize;
148        E_UINT32  uPos;
149
150        if (!kReg.Open(HKEY_CURRENT_USER, ERASER_REGISTRY_BASE)) {
151            return FALSE;
152        }
153
154        // calculate data size
155        uSize = LIBRARYSETTINGS_SIZE + (pls->m_nCMethods * CMETHOD_SIZE);
156
157        for (i = 0; i < pls->m_nCMethods; i++) {
158            uSize += pls->m_lpCMethods[i].m_nPasses * sizeof(PASS);
159        }
160
161        // allocate memory
162        lpData = new E_UINT8[uSize];
163        ZeroMemory(lpData, uSize);
164
165        // basic information
166        MoveMemory((LPVOID)lpData, (LPCVOID)pls, LIBRARYSETTINGS_SIZE);
167        uPos = LIBRARYSETTINGS_SIZE;
168
169        // custom methods
170        for (i = 0; i < pls->m_nCMethods; i++) {
171            MoveMemory((LPVOID)(&lpData[uPos]),
172                       (LPCVOID)(&pls->m_lpCMethods[i]),
173                       CMETHOD_SIZE);
174
175            uPos += CMETHOD_SIZE;
176
177            // actual pass information
178            if (pls->m_lpCMethods[i].m_nPasses > 0 &&
179                pls->m_lpCMethods[i].m_nPasses <= PASSES_MAX) {
180                MoveMemory((LPVOID)(&lpData[uPos]),
181                           (LPCVOID)(pls->m_lpCMethods[i].m_lpPasses),
182                           pls->m_lpCMethods[i].m_nPasses * sizeof(PASS));
183
184                uPos += (pls->m_lpCMethods[i].m_nPasses * sizeof(PASS));
185            }
186        }
187
188        bResult = (kReg.SetValue((LPVOID)lpData, ERASER_REGISTRY_LIBRARY, uSize) != 0);
189
190        delete[] lpData;
191        lpData = 0;
192
193        return bResult;
194    } catch (CException *e) {
195        ASSERT(0);
196        e->ReportError(MB_ICONERROR);
197        e->Delete();
198    }
199
200    return false;
201}
Note: See TracBrowser for help on using the repository browser.