De meeste tweakers kennen het vast wel: gegevens worden op je hd zo achter gelaten dat eigenlijk alleen de verwijzing naar het bestand is gewist maar de gegevens nog gewoon aanwezig zijn.
Omdat ik niet van het idee houd dat gegevens toch zichtbaar blijven had ik in msdos met qbasic een programmatje gemaakt dat de hd 'wiped'. Schoonmaakt dus. Dat deed die door telkens achter elkaar een reeks van 3200 tekens met daarin allemaal 0'llen naar de hd te schrijven tot je een bestand van 4GB had, n nieuw bestand maken en dat doen totdat de hd vol was...
Dat werkte best leuk, alleen nu ben ik me broncode kwijt en wil ik toch een nieuwe maken die namelijk wat vaker over de gegevens heen schrijft. Het blijkt dat men tot 7x terug de bits kan vinden die op de hd hebben gestaan omdat de machnetische velden op de hd zich niet alleen beperken tot de ruimte waar de 'bit' staat maar ook er omheen voor magnetische velden zorgen...
Dus ik vogel ff een programma in elkaar met t volgende principe:
Om een rare reden wil dit niet vlotten en blijkt ie tijdens runtime via perror() een error te geven die zegt dat ergens iets mis is als ie fwrite doet.
Dat was opgelost toen ik de dimensie uit 'buffer' weg haalde... maar toen moest ik dus 8x de lus herhalen.
Daarnaast bedacht ik mij dus ook dat de meeste HD's een behoorlijke cache hebben, tegenwoordig al zo'n 8 tot 16 MB. Ik moet dus wel een mb of 32 schrijven voordat ik opnieuw over dezelfde positie heen schrijf om te voorkomen dat hij in de cache ging herschrijven.
Dit deed ik door om de fwrite() nog een for() te zetten die zich 1000x herhaalde.
Maar wat schetste mijn verbazing toen ik een bestand van 300mb had maar er achter kwam dat er allemaal gegevens in stonden. Nix niet leeg met allemaal 0'llen... r stond een zich telkens herhalende boodschap in...
K zet de code van me 1e versie hier maar neer, t is erg simpel gehouden en was vooral bedoelt als 'beginttest'. De optimalisatie komt wel als t principe werkt...
Omdat ik niet van het idee houd dat gegevens toch zichtbaar blijven had ik in msdos met qbasic een programmatje gemaakt dat de hd 'wiped'. Schoonmaakt dus. Dat deed die door telkens achter elkaar een reeks van 3200 tekens met daarin allemaal 0'llen naar de hd te schrijven tot je een bestand van 4GB had, n nieuw bestand maken en dat doen totdat de hd vol was...
Dat werkte best leuk, alleen nu ben ik me broncode kwijt en wil ik toch een nieuwe maken die namelijk wat vaker over de gegevens heen schrijft. Het blijkt dat men tot 7x terug de bits kan vinden die op de hd hebben gestaan omdat de machnetische velden op de hd zich niet alleen beperken tot de ruimte waar de 'bit' staat maar ook er omheen voor magnetische velden zorgen...
Dus ik vogel ff een programma in elkaar met t volgende principe:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| char buffer[8][1]; buffer[0][0] = 13; //etc etc etc tot buffer[7][0] = 0; fpos_t bestandsgrootte; FILE *bestand; bestand = fopen("bestandsnaam", "wb"); while(!(ferror(bestand))) { for(int hexvalue = 0; hexvalue < 8; hexvalue++) { fsetpos(bestand, &bestandsgrootte); fwrite(&buffer[hexvalue], 1, 32000, bestand); } } |
Om een rare reden wil dit niet vlotten en blijkt ie tijdens runtime via perror() een error te geven die zegt dat ergens iets mis is als ie fwrite doet.
Dat was opgelost toen ik de dimensie uit 'buffer' weg haalde... maar toen moest ik dus 8x de lus herhalen.
Daarnaast bedacht ik mij dus ook dat de meeste HD's een behoorlijke cache hebben, tegenwoordig al zo'n 8 tot 16 MB. Ik moet dus wel een mb of 32 schrijven voordat ik opnieuw over dezelfde positie heen schrijf om te voorkomen dat hij in de cache ging herschrijven.
Dit deed ik door om de fwrite() nog een for() te zetten die zich 1000x herhaalde.
Maar wat schetste mijn verbazing toen ik een bestand van 300mb had maar er achter kwam dat er allemaal gegevens in stonden. Nix niet leeg met allemaal 0'llen... r stond een zich telkens herhalende boodschap in...
K zet de code van me 1e versie hier maar neer, t is erg simpel gehouden en was vooral bedoelt als 'beginttest'. De optimalisatie komt wel als t principe werkt...
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
| #define SCHRIJFBLOK 4096 #define OMZIJLSCHRIJFBUFFER 16000 #define WIPETYPE_SIMPLE 1 #define WIPETYPE_GOOD 2 #define WIPETYPE_ULTRA 3 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> int main() { char reeks[10], wipebestandsnaam[20]; int wipetype; int station; bool gadoor = true; bool schijferror = false; bool schijfvol = false; FILE *wipebestand; int bestandsnummer = 0; time_t begintijd, huidigetijd, haaltijd; long schrijfsnelheid; int teller; //gegevens om file mee vol te schrijven: srand(time(NULL)); char buffer1[2], buffer2[2], buffer3[2], buffer4[2], buffer5[2], buffer6[2], buffer7[2], buffer8[2]; buffer1[0] = 17; buffer2[0] = 133; buffer3[0] = 255; buffer4[0] = 0; buffer5[0] = 238; buffer6[0] = 166; buffer7[0] = rand()%256; buffer8[0] = 0; unsigned long int geschreven_mbytes, geschreven_bytes; fpos_t bestandsgrootte; while(gadoor) { //vraag om de type 'wipe' while(!(reeks[0] == '0'+WIPETYPE_SIMPLE || reeks[0] == '0'+WIPETYPE_GOOD || reeks[0] == '0'+WIPETYPE_ULTRA)) { printf("\n--- Wipe free space ---\n"); printf("(1) Simple wipe (HEX 00)\n"); printf("(2) Good wipe (HEX 11 | HEX 85 | HEX FF | HEX 00)\n"); printf("(3) Ultra wipe (HEX 11 | HEX 85 | HEX FF | HEX 00 | HEX EE | HEX A6 | HEX rand | HEX 00)\n"); scanf("%1s", &reeks); } wipetype = reeks[0]; //lees een stationsnaam in while(!((reeks[0] >= 'a' && reeks[0] <= 'z') || (reeks[0] >= 'A' && reeks[0] <= 'Z'))) { printf("\nSpecificeer station: "); scanf("%1s", &reeks); } station = reeks[0]; geschreven_bytes = 0; geschreven_mbytes = 0; schijfvol = false; schijferror = false; //ga in de lus die telkens achter elkaar bestanden van 4gb maakt while(schijfvol == false && schijferror == false) { //construeer de bestandsnaam wipebestandsnaam[0] = station; wipebestandsnaam[1] = 0; strcat(wipebestandsnaam, ":\\wipe"); sprintf(reeks, "%04i", bestandsnummer); strcat(wipebestandsnaam, reeks); strcat(wipebestandsnaam, ".big"); //open het bestand wipebestand = fopen(wipebestandsnaam, "wb"); if(wipebestand == NULL) { schijferror = true; break; } bestandsgrootte = 0; begintijd = time(NULL); huidigetijd = begintijd; schrijfsnelheid = 0; //ga het bestand vol schrijven while(bestandsgrootte < 4000000000) { //schrijf en herschrijf data naar bestand, doe telkens +- 200MB zodat je niet te maken krijgt met de //hd buffer die gegevens voor je gaat bufferen... for(teller = 0; teller < OMZIJLSCHRIJFBUFFER; teller++) { fwrite(&buffer1, 1, SCHRIJFBLOK, wipebestand); } if(wipetype == WIPETYPE_GOOD || wipetype == WIPETYPE_ULTRA) { fsetpos(wipebestand, &bestandsgrootte); for(teller = 0; teller < OMZIJLSCHRIJFBUFFER; teller++) { fwrite(&buffer1, 1, SCHRIJFBLOK, wipebestand); } fsetpos(wipebestand, &bestandsgrootte); for(teller = 0; teller < OMZIJLSCHRIJFBUFFER; teller++) { fwrite(&buffer2, 1, SCHRIJFBLOK, wipebestand); } fsetpos(wipebestand, &bestandsgrootte); for(teller = 0; teller < OMZIJLSCHRIJFBUFFER; teller++) { fwrite(&buffer3, 1, SCHRIJFBLOK, wipebestand); } fsetpos(wipebestand, &bestandsgrootte); for(teller = 0; teller < OMZIJLSCHRIJFBUFFER; teller++) { fwrite(&buffer4, 1, SCHRIJFBLOK, wipebestand); } } if(wipetype == WIPETYPE_ULTRA) { fsetpos(wipebestand, &bestandsgrootte); for(teller = 0; teller < OMZIJLSCHRIJFBUFFER; teller++) { fwrite(&buffer5, 1, SCHRIJFBLOK, wipebestand); } fsetpos(wipebestand, &bestandsgrootte); for(teller = 0; teller < OMZIJLSCHRIJFBUFFER; teller++) { fwrite(&buffer6, 1, SCHRIJFBLOK, wipebestand); } fsetpos(wipebestand, &bestandsgrootte); for(teller = 0; teller < OMZIJLSCHRIJFBUFFER; teller++) { buffer7[0] = rand()%256; fwrite(&buffer7, 1, SCHRIJFBLOK, wipebestand); } srand(time(NULL)); fsetpos(wipebestand, &bestandsgrootte); for(teller = 0; teller < OMZIJLSCHRIJFBUFFER; teller++) { fwrite(&buffer8, 1, SCHRIJFBLOK, wipebestand); } } //hou de tellers bij bestandsgrootte += SCHRIJFBLOK * OMZIJLSCHRIJFBUFFER; geschreven_bytes += SCHRIJFBLOK * OMZIJLSCHRIJFBUFFER; if((geschreven_bytes / 1000000) > 1) { geschreven_mbytes += (geschreven_bytes / 1000000); geschreven_bytes = geschreven_bytes - (geschreven_bytes / 1000000) * 1000000; haaltijd = time(NULL); if(haaltijd > huidigetijd) { huidigetijd = haaltijd; schrijfsnelheid = bestandsgrootte / (huidigetijd - begintijd) / 1000000; printf("[%u.%u] [%liMb/s]\n", geschreven_mbytes, geschreven_bytes, schrijfsnelheid); } } //kijk of schijf vol is if(ferror(wipebestand)) { perror ("This error has occurred"); schijfvol = true; break; } } fclose(wipebestand); } //verwijder alle gemaakte bestanden for(int x = 0; x <= bestandsnummer; x++) { //construeer de bestandsnaam wipebestandsnaam[0] = station; wipebestandsnaam[1] = 0; strcat(wipebestandsnaam, ":\\wipe"); sprintf(reeks, "%04i", x); strcat(wipebestandsnaam, reeks); strcat(wipebestandsnaam, ".big"); //verwijder het bestand remove(wipebestandsnaam); } if(schijfvol == true) { printf("\n\nDe %c schijf is klaar\n", station); gadoor = false; } if(schijferror == true) { printf("\n\nDe %c schijf kan niet worden aangesproken\n", station); } } return 0; } |