129
|
1 #include <stdint.h>
|
|
2 #include <stdio.h>
|
|
3 #include <stdlib.h>
|
|
4 #include <inttypes.h>
|
|
5
|
|
6 static void decode_size(unsigned long x)
|
|
7 {
|
|
8 const char *lut[] = {"No", "One", "Two", "Four"};
|
|
9
|
|
10 printf("k%sByteCode", lut[x & 3]);
|
|
11 }
|
|
12
|
|
13 int main(int argc, char *argv[])
|
|
14 {
|
|
15 unsigned long x;
|
|
16
|
|
17 if (argc < 2) {
|
|
18 fprintf(stderr, "usage: decrypt-mixed-call <param>\n");
|
|
19 return 1;
|
|
20 }
|
|
21
|
|
22 x = strtoul(argv[1], NULL, 0);
|
|
23
|
|
24 switch (x & 15) {
|
|
25 case 0:
|
|
26 printf("kPascalStackBased");
|
|
27 break;
|
|
28 case 1:
|
|
29 printf("kCStackBased");
|
|
30 break;
|
|
31 case 2:
|
|
32 printf("I'm too lazy for this!");
|
|
33 return 1;
|
|
34 case 5:
|
|
35 printf("kThinkCStackBased");
|
|
36 break;
|
|
37 case 8:
|
|
38 printf("kD0DispatchedPascalStackBased");
|
|
39 break;
|
|
40 case 9:
|
|
41 printf("kD0DispatchedCStackBased");
|
|
42 break;
|
|
43 case 12:
|
|
44 printf("kD1DispatchedPascalStackBased");
|
|
45 break;
|
|
46 case 14:
|
|
47 printf("kStackDispatchedPascalStackBased");
|
|
48 break;
|
|
49 default:
|
|
50 /* Invalid */
|
|
51 return 1;
|
|
52 }
|
|
53
|
|
54 x >>= 4;
|
|
55
|
|
56 printf(" | RESULT_SIZE(");
|
|
57 decode_size(x);
|
|
58 printf(")");
|
|
59
|
|
60 /* trim the fat */
|
|
61 x >>= 2;
|
|
62
|
|
63 /* hopefully we're using stack, since that's the ONLY thing i'm handling */
|
|
64 for (uint32_t i = 1; i < 13 && x; i++, x >>= 2) {
|
|
65 printf(" | STACK_ROUTINE_PARAMETER(%" PRIu32 ", ", i);
|
|
66 decode_size(x);
|
|
67 printf(")");
|
|
68 }
|
|
69
|
|
70 puts("");
|
|
71
|
|
72 return 0;
|
|
73 }
|