Release 1.1, this file got ommited

This commit is contained in:
2013-10-22 04:27:16 +01:00
parent 8b1e154dbd
commit a66040630b

View File

@@ -1,13 +1,29 @@
/* /*
DVDtoIMG v1.00. DVDtoIMG v1.10.
21 Oct 2013. 22 Oct 2013.
Written by Natalia Portillo <natalia@claunia.com> Written by Natalia Portillo <natalia@claunia.com>
Based on Truman's CDtoIMG Based on Truman's CDtoIMG
Thanks to V for help with CRC32.
Reads an entire DVD, dumping the Physical Format Information, Copyright Management Information, Reads an entire DVD, dumping the Physical Format Information, Copyright Management Information,
Disc Manufacturing Information and Burst Cutting Area. Disc Manufacturing Information and Burst Cutting Area.
*/ */
/*
This is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this software. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h> #include <stdio.h>
#include <malloc.h> #include <malloc.h>
@@ -18,8 +34,33 @@ Disc Manufacturing Information and Burst Cutting Area.
#include <string.h> // For memset() #include <string.h> // For memset()
#include <stdlib.h> // For atoi() #include <stdlib.h> // For atoi()
#include "crc32.h"
#include "md5.h"
#include "sha1.h"
//Global variables.. //Global variables..
unsigned char *data_buf; //Buffer for holding transfer data from or to drive. unsigned char *data_buf; //Buffer for holding transfer data from or to drive.
uint32_t crc;
MD5_CTX md5context;
SHA1_CTX sha1context;
unsigned char md5digest[MD5_DIGEST_LENGTH];
unsigned char sha1digest[SHA1_DIGEST_LENGTH];
char md5hash[(MD5_DIGEST_LENGTH * 2) + 1];
char sha1hash[(SHA1_DIGEST_LENGTH * 2) + 1];
int digesttostr(char *hash, const unsigned char *digest, size_t length) {
unsigned int i;
for (i = 0; i < length; i++) {
hash[(i * 2)] = ((digest[i] & 0xf0) >> 4) + '0';
if (hash[(i * 2)] > '9') hash[(i * 2)] += ('a' - '9' - 1);
hash[(i * 2) + 1] = (digest[i] & 0x0f) + '0';
if (hash[(i * 2) + 1] > '9') hash[(i * 2) + 1] += ('a' - '9' - 1);
}
hash[length * 2] = 0;
return length;
}
// Opens device using libcdio // Opens device using libcdio
CdIo_t *open_volume(char *drive_letter) CdIo_t *open_volume(char *drive_letter)
@@ -358,6 +399,25 @@ driver_return_code_t verified_read_PFI_layer(CdIo_t *p_cdio,
file_ptr=fopen(pfi_name, "wb"); file_ptr=fopen(pfi_name, "wb");
fwrite(pfi_buf, alloc_len, 1, file_ptr); fwrite(pfi_buf, alloc_len, 1, file_ptr);
fclose(file_ptr); fclose(file_ptr);
crc=0xFFFFFFFF;
MD5_Init(&md5context);
SHA1_Init(&sha1context);
crc = update_crc32(crc, pfi_buf, alloc_len);
MD5_Update(&md5context, pfi_buf, alloc_len);
SHA1_Update(&sha1context, pfi_buf, alloc_len);
MD5_Final(md5digest, &md5context);
SHA1_Final(sha1digest, &sha1context);
crc ^= 0xFFFFFFFF;
digesttostr(md5hash, md5digest, MD5_DIGEST_LENGTH);
digesttostr(sha1hash, sha1digest, SHA1_DIGEST_LENGTH);
printf("CRC32: %08x\n", (unsigned int)crc);
printf("MD5: %s\n", md5hash);
printf("SHA1: %s\n", sha1hash);
} }
else else
{ {
@@ -431,6 +491,25 @@ driver_return_code_t verified_read_BCA(CdIo_t *p_cdio,
file_ptr=fopen("BCA.BIN", "wb"); file_ptr=fopen("BCA.BIN", "wb");
fwrite(bca_buf, alloc_len, 1, file_ptr); fwrite(bca_buf, alloc_len, 1, file_ptr);
fclose(file_ptr); fclose(file_ptr);
crc=0xFFFFFFFF;
MD5_Init(&md5context);
SHA1_Init(&sha1context);
crc = update_crc32(crc, bca_buf, alloc_len);
MD5_Update(&md5context, bca_buf, alloc_len);
SHA1_Update(&sha1context, bca_buf, alloc_len);
MD5_Final(md5digest, &md5context);
SHA1_Final(sha1digest, &sha1context);
crc ^= 0xFFFFFFFF;
digesttostr(md5hash, md5digest, MD5_DIGEST_LENGTH);
digesttostr(sha1hash, sha1digest, SHA1_DIGEST_LENGTH);
printf("CRC32: %08x\n", (unsigned int)crc);
printf("MD5: %s\n", md5hash);
printf("SHA1: %s\n", sha1hash);
} }
else else
{ {
@@ -570,6 +649,25 @@ driver_return_code_t verified_read_PFI(CdIo_t *p_cdio,
file_ptr=fopen("PFI.BIN", "wb"); file_ptr=fopen("PFI.BIN", "wb");
fwrite(pfi_buf, alloc_len, 1, file_ptr); fwrite(pfi_buf, alloc_len, 1, file_ptr);
fclose(file_ptr); fclose(file_ptr);
crc=0xFFFFFFFF;
MD5_Init(&md5context);
SHA1_Init(&sha1context);
crc = update_crc32(crc, pfi_buf, alloc_len);
MD5_Update(&md5context, pfi_buf, alloc_len);
SHA1_Update(&sha1context, pfi_buf, alloc_len);
MD5_Final(md5digest, &md5context);
SHA1_Final(sha1digest, &sha1context);
crc ^= 0xFFFFFFFF;
digesttostr(md5hash, md5digest, MD5_DIGEST_LENGTH);
digesttostr(sha1hash, sha1digest, SHA1_DIGEST_LENGTH);
printf("CRC32: %08x\n", (unsigned int)crc);
printf("MD5: %s\n", md5hash);
printf("SHA1: %s\n", sha1hash);
} }
has_bca=(pfi_buf[16]&0x80)>>7; has_bca=(pfi_buf[16]&0x80)>>7;
@@ -653,6 +751,25 @@ driver_return_code_t verified_read_CMI(CdIo_t *p_cdio,
file_ptr=fopen("CMI.BIN", "wb"); file_ptr=fopen("CMI.BIN", "wb");
fwrite(cmi_buf, alloc_len, 1, file_ptr); fwrite(cmi_buf, alloc_len, 1, file_ptr);
fclose(file_ptr); fclose(file_ptr);
crc=0xFFFFFFFF;
MD5_Init(&md5context);
SHA1_Init(&sha1context);
crc = update_crc32(crc, cmi_buf, alloc_len);
MD5_Update(&md5context, cmi_buf, alloc_len);
SHA1_Update(&sha1context, cmi_buf, alloc_len);
MD5_Final(md5digest, &md5context);
SHA1_Final(sha1digest, &sha1context);
crc ^= 0xFFFFFFFF;
digesttostr(md5hash, md5digest, MD5_DIGEST_LENGTH);
digesttostr(sha1hash, sha1digest, SHA1_DIGEST_LENGTH);
printf("CRC32: %08x\n", (unsigned int)crc);
printf("MD5: %s\n", md5hash);
printf("SHA1: %s\n", sha1hash);
} }
else else
{ {
@@ -726,6 +843,25 @@ driver_return_code_t verified_read_DMI(CdIo_t *p_cdio,
file_ptr=fopen("DMI.BIN", "wb"); file_ptr=fopen("DMI.BIN", "wb");
fwrite(dmi_buf, alloc_len, 1, file_ptr); fwrite(dmi_buf, alloc_len, 1, file_ptr);
fclose(file_ptr); fclose(file_ptr);
crc=0xFFFFFFFF;
MD5_Init(&md5context);
SHA1_Init(&sha1context);
crc = update_crc32(crc, dmi_buf, alloc_len);
MD5_Update(&md5context, dmi_buf, alloc_len);
SHA1_Update(&sha1context, dmi_buf, alloc_len);
MD5_Final(md5digest, &md5context);
SHA1_Final(sha1digest, &sha1context);
crc ^= 0xFFFFFFFF;
digesttostr(md5hash, md5digest, MD5_DIGEST_LENGTH);
digesttostr(sha1hash, sha1digest, SHA1_DIGEST_LENGTH);
printf("CRC32: %08x\n", (unsigned int)crc);
printf("MD5: %s\n", md5hash);
printf("SHA1: %s\n", sha1hash);
} }
else else
{ {
@@ -910,6 +1046,11 @@ bool read_dvd_to_image(char *drive_letter, char *file_pathname, unsigned long in
{ {
n_sectors_to_read=data_buffer_size / 2048; //Block size: E.g.: 65536 / 2048 = 32. n_sectors_to_read=data_buffer_size / 2048; //Block size: E.g.: 65536 / 2048 = 32.
LBA_i=0; //Starting LBA address. LBA_i=0; //Starting LBA address.
crc=0xFFFFFFFF;
MD5_Init(&md5context);
SHA1_Init(&sha1context);
while(LBA_i<n_sectors) while(LBA_i<n_sectors)
{ {
//Check if block size is suitable for the remaining sectors. //Check if block size is suitable for the remaining sectors.
@@ -920,11 +1061,15 @@ bool read_dvd_to_image(char *drive_letter, char *file_pathname, unsigned long in
} }
LBA_i2=LBA_i+n_sectors_to_read-1; LBA_i2=LBA_i+n_sectors_to_read-1;
printf("Reading sector %lu to %lu (total: %lu, progress: %.1f%%)\n", LBA_i, LBA_i2, n_sectors, (double)LBA_i2/n_sectors*100); printf("%c[1000DReading sector %lu to %lu (total: %lu, progress: %.1f%%)", 0x1B, 0x1B, LBA_i, LBA_i2, n_sectors, (double)LBA_i2/n_sectors*100);
if(read_12(p_cdio, LBA_i, n_sectors_to_read)==DRIVER_OP_SUCCESS) if(read_12(p_cdio, LBA_i, n_sectors_to_read)==DRIVER_OP_SUCCESS)
{ {
if(success==DRIVER_OP_SUCCESS) if(success==DRIVER_OP_SUCCESS)
{ {
crc = update_crc32(crc, data_buf, 2048*n_sectors_to_read);
MD5_Update(&md5context, data_buf, 2048*n_sectors_to_read);
SHA1_Update(&sha1context, data_buf, 2048*n_sectors_to_read);
fwrite(data_buf, 2048*n_sectors_to_read, 1, file_ptr); fwrite(data_buf, 2048*n_sectors_to_read, 1, file_ptr);
if(ferror(file_ptr)) if(ferror(file_ptr))
{ {
@@ -966,6 +1111,18 @@ bool read_dvd_to_image(char *drive_letter, char *file_pathname, unsigned long in
LBA_i=LBA_i+n_sectors_to_read; LBA_i=LBA_i+n_sectors_to_read;
} }
MD5_Final(md5digest, &md5context);
SHA1_Final(sha1digest, &sha1context);
crc ^= 0xFFFFFFFF;
digesttostr(md5hash, md5digest, MD5_DIGEST_LENGTH);
digesttostr(sha1hash, sha1digest, SHA1_DIGEST_LENGTH);
printf("CRC32: %08x\n", (unsigned int)crc);
printf("MD5: %s\n", md5hash);
printf("SHA1: %s\n", sha1hash);
fclose(file_ptr); fclose(file_ptr);
cmd_ret=true; cmd_ret=true;
@@ -1010,7 +1167,7 @@ bool read_dvd_to_image(char *drive_letter, char *file_pathname, unsigned long in
void usage() void usage()
{ {
printf("DVDtoIMG v1.0. 21 Oct 2013.\n"); printf("DVDtoIMG v1.1. 22 Oct 2013.\n");
printf("Usage: cdtoimg <drive path> <output file>\n"); printf("Usage: cdtoimg <drive path> <output file>\n");
return ; //Exit program here. return ; //Exit program here.
} }
@@ -1040,4 +1197,4 @@ int main(int argc, char *argv[])
usage(); usage();
return -1; //Exit program here. return -1; //Exit program here.
} }
} }