0
|
1 #include <stdio.h>
|
|
2 #include <string.h>
|
|
3
|
|
4 #ifndef __GNUC__
|
|
5 # include "XGetopt.h"
|
|
6 #endif
|
|
7
|
|
8 #ifndef _WIN32
|
|
9 # include <unistd.h>
|
|
10 #endif
|
|
11
|
|
12 #include "define.h"
|
|
13 #include "libpst.h"
|
|
14
|
|
15 static void usage();
|
|
16
|
|
17 int main(int argc, char ** argv) {
|
|
18 // pass the id number to display on the command line
|
|
19 char *fname, *sid;
|
|
20 pst_file pstfile;
|
|
21 unsigned int id;
|
|
22 int decrypt = 0, process = 0, binary = 0, c;
|
|
23 unsigned char *buf = NULL;
|
|
24 size_t readSize;
|
|
25 pst_item *item;
|
|
26 pst_desc_ll* ptr;
|
|
27
|
|
28 DEBUG_INIT("getidblock.log");
|
|
29 DEBUG_REGISTER_CLOSE();
|
|
30 DEBUG_ENT("main");
|
|
31
|
|
32 while ((c = getopt(argc, argv, "bdp")) != -1) {
|
|
33 switch (c) {
|
|
34 case 'b':
|
|
35 // enable binary output
|
|
36 binary = 1;
|
|
37 break;
|
|
38 case 'd':
|
|
39 //enable decrypt
|
|
40 decrypt = 1;
|
|
41 break;
|
|
42 case 'p':
|
|
43 // enable procesing of block
|
|
44 process = 1;
|
|
45 break;
|
|
46 default:
|
|
47 usage();
|
|
48 exit(EXIT_FAILURE);
|
|
49 }
|
|
50 }
|
|
51
|
|
52 if (optind+1 >= argc) {
|
|
53 // no more items on the cmd
|
|
54 usage();
|
|
55 exit(EXIT_FAILURE);
|
|
56 }
|
|
57 fname = argv[optind];
|
|
58 sid = argv[optind+1];
|
|
59 id = (unsigned int)strtol(sid, NULL, 0);
|
|
60
|
|
61 DEBUG_MAIN(("Opening file\n"));
|
|
62 memset(&pstfile, 0, sizeof(pstfile));
|
|
63 if (pst_open(&pstfile, fname, "r")!=0) {
|
|
64 DIE(("Error opening file\n"));
|
|
65 }
|
|
66
|
|
67 DEBUG_MAIN(("Loading Index\n"));
|
|
68 if (pst_load_index(&pstfile) != 0) {
|
|
69 DIE(("Error loading file index\n"));
|
|
70 }
|
|
71
|
|
72 // if ((ptr = _pst_getID(&pstfile, id)) == NULL) {
|
|
73 // DIE(("id not found [%#x]\n", id));
|
|
74 // }
|
|
75
|
|
76 DEBUG_MAIN(("Loading block\n"));
|
|
77
|
|
78 if ((readSize = _pst_ff_getIDblock(&pstfile, id, &buf)) <= 0 || buf == NULL) {
|
|
79 // if ((readSize = _pst_read_block_size(&pstfile, ptr->offset, ptr->size, &buf, 1, 1)) < ptr->size) {
|
|
80 DIE(("Error loading block\n"));
|
|
81 }
|
|
82 if (binary==0) printf("Block %#x, size %#x[%i]\n",id, (unsigned int)readSize, (int) readSize);
|
|
83
|
|
84 if (decrypt!=0)
|
|
85 if (_pst_decrypt(buf, readSize, (int)pstfile.encryption) != 0) {
|
|
86 DIE(("Error decrypting block\n"));
|
|
87 }
|
|
88
|
|
89 DEBUG_MAIN(("Printing block... [id %#x, size %#x]\n", id, readSize));
|
|
90 if (binary==0) {
|
|
91 _pst_debug_hexdump(stdout, buf, readSize, 0x10);
|
|
92 } else {
|
|
93 if (fwrite(buf, 1, readSize, stdout) != 0) {
|
|
94 DIE(("Error occured during writing of buf to stdout\n"));
|
|
95 }
|
|
96 }
|
|
97 free(buf);
|
|
98
|
|
99 if (process!=0) {
|
|
100 DEBUG_MAIN(("Parsing block...\n"));
|
|
101 ptr = pstfile.d_head;
|
|
102 while(ptr != NULL) {
|
|
103 if (ptr->list_index != NULL && ptr->list_index->id == id)
|
|
104 break;
|
|
105 if (ptr->desc != NULL && ptr->desc->id == id)
|
|
106 break;
|
|
107 ptr = pst_getNextDptr(ptr);
|
|
108 }
|
|
109 if (ptr == NULL) {
|
|
110 ptr = (pst_desc_ll*)xmalloc(sizeof(pst_desc_ll));
|
|
111 ptr->desc = _pst_getID(&pstfile, id);
|
|
112 ptr->list_index = NULL;
|
|
113 }
|
|
114 if (ptr != NULL) {
|
|
115 if ((item = _pst_parse_item(&pstfile, ptr)) != NULL)
|
|
116 _pst_freeItem(item);
|
|
117 } else {
|
|
118 DEBUG_MAIN(("item not found with this ID\n"));
|
|
119 printf("Cannot find the owning Record of this ID. Cannot parse\n");
|
|
120 }
|
|
121 }
|
|
122
|
|
123 if(pst_close(&pstfile)!=0) {
|
|
124 DIE(("pst_close failed\n"));
|
|
125 }
|
|
126
|
|
127 DEBUG_RET();
|
|
128 return 0;
|
|
129 }
|
|
130
|
|
131 void usage() {
|
|
132 printf("usage: getidblock [options] filename id\n");
|
|
133 printf("\tfilename - name of the file to access\n");
|
|
134 printf("\tid - ID of the block to fetch - can begin with 0x for hex\n");
|
|
135 printf("\toptions\n");
|
|
136 printf("\t\t-d\tDecrypt the block before printing\n");
|
|
137 printf("\t\t-p\tProcess the block before finishing.\n");
|
|
138 printf("\t\t\tView the debug log for information\n");
|
|
139 }
|