Toon posts:

Corruptie - een prog om de eerste 'x' bytes te verplaatsen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hi Tweakers,

Ondanks eerdere euforie in dit topic, is er toch iets erg vervelends gebeurt met mijn circa 11.000 mp3's. Door een fout op de schijf zijn alle bestanden 35840 bytes verschoven, waarschijnlijk is er op de oude schijf iets verkeerd gegaan met de FAT-table. Nu is het begin van elk nummer afgeknipt, en staat aan het einde van het nummer het begin van het volgende nummer.

Wie zou voor mij een programmatje kunnen schrijven (windows) dat de laatste 35840 bytes van een bestand afknipt en aan het begin van een ander bestand plakt?? Hiermee zou ik (al is het maar handmatig) de boel kunnen repareren. Voor de meeste albums geldt dat ze in het geheel zijn geshift, dus een mogelijkheid om voor alle bestanden in een directory dit uit te voeren (oplopend op bestandsnaam) zou nóg fijner zijn. Maargoed, het uberhaupt terugkrijgen van de files is mijn primaire zorg, dus elke oplossing is fantastisch!

Wie kan me helpen?? Ik zou je eeuwig dankbaar zijn, en ben uiteraard bereid een wederdienst te verrichten. :)

Verwijderd

Topicstarter
@ moderator, ik post hem truowens wel even in DEV.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Wat is de volgorde precies? Is dit gewoon alfabetisch?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Ik zie dat je ergens anders al doorgegaan bent - aub voortaan een move aanvragen via Schop een Modje, en niet gewoon een nieuw topic openen :)

Help needed! Wie kan er een programmatje schrijven dat...?

  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

En terug open op verzoek. De vraag aan olivi3r om zelf zoveel mogelijk initiatief te tonen. Ook bewerk ik je topic titel even tjes :)

[ Voor 69% gewijzigd door elevator op 29-11-2003 20:01 ]


Verwijderd

Weet je zeker dat je je probleem hiermee oplost ?
En het aantal bytes is altijd evenveel?
En wat is de volgorde precies van de bestanden in een directory?
En waar gaan de laatste bytes van de laatste file in een directory naar toe ??

Kan best tricky worden als ik zo ff nadenk. Opzich is zoiets simpel te bouwen

[ Voor 35% gewijzigd door Verwijderd op 29-11-2003 19:05 ]


Verwijderd

Topicstarter
Verwijderd schreef op 29 november 2003 @ 19:04:
Weet je zeker dat je je probleem hiermee oplost ?
En het aantal bytes is altijd evenveel?
En wat is de volgorde precies van de bestanden in een directory?
En waar gaan de laatste bytes van de laatste file in een directory naar toe ??

Kan best tricky worden als ik zo ff nadenk. Opzich is zoiets simpel te bouwen
Ik heb het handmatig geprobeerd met één file en dat ging goed (wel hoop werk met hex-editor). Met een programmatje kan ik denk ik 90- 95% van de files fixen. Het probleem doet zich identiek voor bij alle bestanden op de schijf.

De directories zijn op alfabet gesorteerd (filenames) en nagenoeg de gehele schijf is in zijn geheel verplaatst (dus meestal gaat het einde van de directory over in de volgende directory). Als ik een directory zou kunnen selecteren die in zijn geheel 'geprocessed' wordt, zou ik al een heel eind zijn. Om het laatste bestand van een directory te fixen, zou het het veiligst zijn om ook één specifieke file te kunnen kiezen, en het doelbestand waar hij heen gekopieerd wordt.

Ik heb een stuk of 20 'probes' gedaan over de schijf en tot nu toe ben ik iedere keer een grootte van 35840 bytes tegengekomen (volgens mij het formaat van 1 track op de schijf). De mogelijkheid om een variable grootte te kiezen zou op zich wel het veiligst zijn, mochten er toch folders zijn waar de grootte in afwijkt.

Ik heb geprobeerd een mp3-cutting programma te vinden wat dit kan doen, maar tot nu toe heb ik er alleen een gevonden met de mogelijkheid om een stukje te knippen en te plakken naar het einde van een ander bestand (in plaats van het begin). Met de betreffende utility kon je ook alleen met je muis selecteren welk stuk geknipt moet worden, dus dat zou veel te bewerkelijk worden. De stappen die een programmatje zou moeten nemen zijn waarschijnlijk op zich niet heel ingewikkeld, maar mijn kennis van C/Delphi/etc. is veel te gering om het zelf te kunnen doen.

Bedankt voor de reacties tot dusver! :)

Verwijderd

Een poging:

Let op: dit is geen "af" programma, het haalt de bytes bijvoorbeeld niet van het eerste bestand af, maar laat ze nog gewoon staan. Dit prog is ook niet getest!!! Misschien kan je het zelf of iemand anders het verbeteren.

35840.exe

sourcecode:

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
#include <windows.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    FILE *fp, *fp2;
    char *szTemp = "mp3.tmp";
    unsigned char buf[35840];
    int bytesread;
    WIN32_FIND_DATA FileData;
    HANDLE hSearch;
    char szLastFile[MAX_PATH];
    int found;

    strcpy(szLastFile, "");

    hSearch = FindFirstFile("*.mp3", &FileData);
 
    if(hSearch)found = 1;

    while(found)
    {
        if(strlen(szLastFile) != 0)
        {
            printf("Verplaatsen data van %s naar %s\n", szLastFile, FileData.cFileName);

            /* lees laatste bytes van bestand 1 */
            fp = fopen(szLastFile, "rb");
            if(fp == NULL)return -1;

            fseek(fp, -35840, SEEK_END);
            fread(buf, 1, sizeof(buf), fp);

            fclose(fp);

            fp = fopen(szTemp, "wb");
            if(fp == NULL)return -1;
            fp2 = fopen(FileData.cFileName, "rb");
            if(fp2 == NULL)return -1;

            /* schrijf die 35840 bytes naar tijdelijk bestand */
            fwrite(buf, 1, sizeof(buf), fp);

            /* plak andere bestand achter tijdelijk bestand aan */
            while(!feof(fp2))
            {
                bytesread = fread(buf, 1, sizeof(buf), fp2);
                fwrite(buf, 1, bytesread, fp);
            }

            fclose(fp);
            fclose(fp2);

            /* verwijder bestand2 */
            DeleteFile(FileData.cFileName);

            /* hernoem tijdelijk bestand naar bestand2 */
            MoveFile(szTemp, FileData.cFileName);

        }

        strcpy(szLastFile, FileData.cFileName);
        
        found = FindNextFile(hSearch, &FileData);
    }
 
    FindClose(hSearch);

    return 0;
}

Verwijderd

Topicstarter
Verwijderd schreef op 29 november 2003 @ 19:44:
Een poging:

Let op: dit is geen "af" programma, het haalt de bytes bijvoorbeeld niet van het eerste bestand af, maar laat ze nog gewoon staan. Dit prog is ook niet getest!!! Misschien kan je het zelf of iemand anders het verbeteren.
Weew, thanks ;) Is het safe om dit te draaien/testen? Is het command-line?

Edit: ah ik zie het denk ik al, hij loopt zo te zien alle mp3's in een directory af

[ Voor 11% gewijzigd door Verwijderd op 29-11-2003 19:58 ]


Verwijderd

anders maak je eerst een backup? of zet je wat mp3tjes apart?

Verwijderd

Topicstarter
Verwijderd schreef op 29 november 2003 @ 19:57:
anders maak je eerst een backup? of zet je wat mp3tjes apart?
Ja dat doe ik sowieso ;)

Verwijderd

Ik zou wel een backupje maken, en via batchfiletje, kan je hele directories aansturen met dit proggie. (ik was ook al begonnen, maar is nu niet meer echt nodig).
Misschien wel handig om het aantal bytes ook als parameter op te nemen

[edit]
ik zie nu dat ie een hele directory afstruind ...

[ Voor 12% gewijzigd door Verwijderd op 29-11-2003 20:01 ]


Verwijderd

Verwijderd schreef op 29 november 2003 @ 19:53:
Is het safe om dit te draaien/testen? Is het command-line?
Ja het is commandline, maar pas wel op, draai dit niet op je werkelijke mp3 map!!! probeer het eerst eens op een andere map waar je wat mp3s naar kopieert (in ieder geval kan ik niet aansprakelijk gesteld worden voor gegevensverlies :+ ). Dit werkt volgens de volgorde van bestanden die Windows geeft, of dat alfabetisch is is ook maar de vraag, kortom alles kan mis gaan...

Het prog werkt gewoon op de huidige map, je krijgt niet de kans om een map te kiezen. Het lijkt me het verstandigst om het vanuit een command window te starten, en niet vanuit verkenner omdat je nooit weet wat de huidige map is als je het vanuit verkenner start.

Als het helemaal fout gaat ctrl-c drukken en hopen dat er nog niets is gesloopt!

Verwijderd

Topicstarter
Thanks so far guys! Gelukkig staat je wildcard op *.mp3 joris, dus waarschijnlijk gaan er geen hele nare dingen gebeuren. :Y)

Verwijderd

Sowiezo moet er nog iets aan worden toegevoegd dat de laatste paar bytes van het eerste bestand eraf knipt, dat gebeurt nog niet. Als het al werkt is hopelijk het begin van elk nummer nu goed, maar het einde nog steeds niet.

Elk bestand word nu dan ook 35840 bytes groter.

Verwijderd

Topicstarter
Verwijderd schreef op 29 november 2003 @ 20:11:
Sowiezo moet er nog iets aan worden toegevoegd dat de laatste paar bytes van het eerste bestand eraf knipt, dat gebeurt nog niet. Als het al werkt is hopelijk het begin van elk nummer nu goed, maar het einde nog steeds niet.

Elk bestand word nu dan ook 35840 bytes groter.
Nou dit is al heel gaaf hoor. :) En om van de overhead data af te komen zou ik eventueel een apart programmatje over de hele disk kunnen laten rennen toch?

Zou het moeilijk zijn om de huidige code in een windows programma te zetten, zodat ik een directory zou kunnen kiezen die geprocessed wordt?

Verwijderd

Verwijderd schreef op 29 november 2003 @ 20:19:
Zou het moeilijk zijn om de huidige code in een windows programma te zetten, zodat ik een directory zou kunnen kiezen die geprocessed wordt?
Dat zou op zich niet moeilijk zijn, maar het lijkt me hogere prioriteit hebben om het eerst maar eens volledig werkend te krijgen! Probeer het eens op een map met een paar opvolgende mp3s. Programma in dezelfde test map zetten als de mp3s, draaien vanuit commandline, en erna even met een hexeditor kijken of het begin van de nummers dan is gerepareerd.

Verwijderd

Topicstarter
Ik heb het getest en het kopieren gaat op zich perfect (dat heb je goed gedaan zonder het zelf te testen joris ;)).

De output klopt voor zover ik kan zien en wordt ook gewoon afgespeeld, maar geeft helaas wel een glitch bij een aantal mp3's. Het lijkt alsof er toch nog een soort overhead junk bij sommige files zit, die roet in het eten gooit...Ik ga nog even verder testen. :)

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 22:20

LauPro

Prof Mierenneuke®

Ik ben ook even aan het prutsen geweest, hij haalt nu ook het laatste stuk eraf. Dit is een van de eerste c++-prutsels van mij dus er kunnen nog bugs/onhandigheden in zitten 8)7 .

Let erop dat het eerste en het laatste bestand niet goed worden bewerkt!

Daarnaast vraag ik me af of dit überhaupt werkt omdat die file-search handle volgens mij de boel sorteert ook.


http://laupro.nl/web/writetest.exe

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
#include <windows.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    FILE *fp, *fp2; 
    char *szTemp = "mp3.tmp";
    const int blok_lengte = 35840;
    unsigned char buf[blok_lengte]; //35840
    int bytesread; 
    WIN32_FIND_DATA FileData; 
    HANDLE hSearch; 
    char szLastFile[MAX_PATH]; 
    int found;
    long i;

    printf("\nProg naar aanleiding van topic: Corruptie - een prog om de eerste 'x' bytes te verplaatsen\nURI: [TOPIC=841700///][NOHTML]Corruptie - een prog om de eerste 'x' bytes te verplaatsen[/NOHTML][/TOPIC]\n\n");

    strcpy(szLastFile, ""); 

    hSearch = FindFirstFile("*.mp3", &FileData);

    if(hSearch)found = 1;

    while(found) 
    { 

        if(strlen(szLastFile) != 0) 
        { 
            printf("Verplaatsen data van %s naar %s\n", szLastFile, FileData.cFileName);

            /* lees laatste bytes van bestand 1 */ 
            fp = fopen(szLastFile, "rb"); 
            if(fp == NULL)return -1; 

            fseek(fp, -blok_lengte, SEEK_END);
            fread(buf, 1, sizeof(buf), fp); 

            fclose(fp); 

            fp = fopen(szTemp, "wb"); 
            if(fp == NULL)return -1; 
            fp2 = fopen(FileData.cFileName, "rb");
            if(fp2 == NULL)return -1; 

            /* schrijf die 35840 bytes naar tijdelijk bestand */ 
            fwrite(buf, 1, sizeof(buf), fp); 

            /* plak andere bestand achter tijdelijk bestand aan */ 
            while(!feof(fp2)) 
            {
                bytesread = fread(buf, 1, sizeof(buf), fp2); 
                fwrite(buf, 1, bytesread, fp); 
            } 

            fclose(fp); 
            fclose(fp2); 

            /* verwijder bestand2 */ 
            DeleteFile(FileData.cFileName);

            /* hernoem tijdelijk bestand naar bestand2 */
            MoveFile(szTemp, FileData.cFileName);

        } 

        strcpy(szLastFile, FileData.cFileName); 
         
        found = FindNextFile(hSearch, &FileData); 
    }
  
    FindClose(hSearch); 

    //'knip' laatste stukjes

    hSearch = FindFirstFile("*.mp3", &FileData);

    if(hSearch)found = 1;
    while(found)
    { 

        printf("Verwijderen van laatste %i bytes van bestand: %s ...\n", blok_lengte, FileData.cFileName);

        /* zoek einde uit van bestand */
        fp = fopen(FileData.cFileName, "rb");
        if(fp == NULL)return -1;

        fseek(fp, 0, SEEK_END);
        i = ftell(fp) - blok_lengte;

        fclose(fp);

        fp = fopen(szTemp, "wb");
        if(fp == NULL)return -1;
        fp2 = fopen(FileData.cFileName, "rb");
        if(fp2 == NULL)return -1;


        while(!feof(fp2) && ftell(fp) < i)
        {
            bytesread = fread(buf, 1, 1, fp2);
            fwrite(buf, 1, bytesread, fp);
        }

        fclose(fp);
        fclose(fp2);

        /* verwijder oorspronkelijke bestand */
        DeleteFile(FileData.cFileName);

        /* hernoem tijdelijk bestand naar bestand */
        MoveFile(szTemp, FileData.cFileName);

        // zoek volgende bestand
        found = FindNextFile(hSearch, &FileData); 
    }
  
    FindClose(hSearch); 

    return 0; 
}

[ Voor 4% gewijzigd door LauPro op 30-11-2003 00:00 ]

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


Verwijderd

Topicstarter
LauPro schreef op 29 november 2003 @ 23:45:
Ik ben ook even aan het prutsen geweest, hij haalt nu ook het laatste stuk eraf. Dit is een van de eerste c++-prutsels van mij dus er kunnen nog bugs/onhandigheden in zitten 8)7 .

Let erop dat het eerste en het laatste bestand niet goed worden bewerkt!

Daarnaast vraag ik me af of dit überhaupt werkt omdat die file-search handle volgens mij de boel sorteert ook.


http://laupro.nl/web/writetest.exe
Bedankt ook! :>

Ik krijg tot nu toe wisselende resultaten: soms lijkt het probleemloos te gaan, maar soms zit er toch nog een klik tussen het geknipte stuk en de rest van het nummer...Ik moet denk ik niet uitsluiten dat het toch niet gaat lukken om op grote schaal nummers te herstellen. ;(

Ik waardeer jullie hulp in ieder geval enorm, veel dank voor de reacties!

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 22:20

LauPro

Prof Mierenneuke®

Sorry, er zat een bug in, je moet hem even opnieuw downloaden (heb nieuwe versie gemaakt). Hij die tweede keer sorteerde hij nog op .txt ipv .mp3.

Ik weet niet zo 1-2-3 hoe dit recursief kan gebeuren maar als je een beetje creatief met een batch-file aan de gang gaat lukt dat wel aardig denk ik.

[ Voor 47% gewijzigd door LauPro op 30-11-2003 00:06 . Reden: Gelukkige zondag iedereen overigens 8)7 ]

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


Verwijderd

Verwijderd schreef op 29 november 2003 @ 23:50:
Ik krijg tot nu toe wisselende resultaten: soms lijkt het probleemloos te gaan, maar soms zit er toch nog een klik tussen het geknipte stuk en de rest van het nummer...Ik moet denk ik niet uitsluiten dat het toch niet gaat lukken om op grote schaal nummers te herstellen. ;(
Niet zo snel opgeven hoor, goede kans dat er nog een bug in het programma zit waardoor bijvoorbeeld net een byte mist of dat er een byte teveel staat op het punt waar de twee stukken aan elkaar worden geplakt. Om dit te controleren moet je gewoon het resultaat van het programma even met een hexeditor controleren bij 1 bestand (handmatig bytes tellen dus...).

Verwijderd

Topicstarter
Verwijderd schreef op 30 november 2003 @ 00:10:
[...]

Niet zo snel opgeven hoor
hehe, nee hoor. ;)

ik heb verschillende tests gedaan op verschillende plaatsen op de schijf, maar de resultaten blijven wisselend. het lastige is dat in sommige gevallen de verplaatsing goed lijkt te gaan, maar dat op andere een glitch in de muziek overblijft. kennelijk wordt er dan toch iets verstoord in de mp3-stream, waar een player over struikelt. voor zover ik kan zien is de chunk-grootte wel goed, want die kan ik met een mp3-testprogramma precies berekenen. lastig dus, want het systeem gaat natuurlijk pas goed werken als het op grote schaal kan worden toegepast. :/

ik zal nog een laatste keer gaan proberen of er toch nog iets te veranderen is aan de chunk-grootte, anders geef ik het op; dan kan ik beter gaan proberen via vrienden en bekenden zoveel mogelijk materiaal opnieuw te verzamelen...

thanks again! :>

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Met de linux dd tool kun je op een erg low-level manier bitten over je harde schijf kopieren. Een paar sectoren opschuiven is daarmee geen enkel probleem, je HD volledig corrumperen ook niet. Met Knoppix zou je die tool los kunnen laten op je harde schijf zonder Linux te installeren.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
MSalters schreef op 01 december 2003 @ 22:13:
Met de linux dd tool kun je op een erg low-level manier bitten over je harde schijf kopieren. Een paar sectoren opschuiven is daarmee geen enkel probleem, je HD volledig corrumperen ook niet. Met Knoppix zou je die tool los kunnen laten op je harde schijf zonder Linux te installeren.
bedankt voor de tip :)
Pagina: 1