1 |
|
---|
2 | def ReadSymbolFile(symbolFileName)
|
---|
3 | begin
|
---|
4 | symbolFile = File.open(symbolFileName)
|
---|
5 | rescue Errno::ENOENT, Errno::EACCES => ex
|
---|
6 | abort(ex.message)
|
---|
7 | end
|
---|
8 |
|
---|
9 | symbolAddress = {}
|
---|
10 | symbolFile.each do |line|
|
---|
11 | # ã¹ãã¼ã¹åºåãã§å解
|
---|
12 | fields = line.split(/\s+/)
|
---|
13 |
|
---|
14 | # 3åã«ãªã£ã¦ããªãè¡ã¯é¤å¤
|
---|
15 | if fields.size == 3 && fields[2].start_with?("__exp_")
|
---|
16 | symbolAddress[fields[2].gsub("__exp_", "")] = fields[0].hex
|
---|
17 | end
|
---|
18 | end
|
---|
19 | symbolFile.close
|
---|
20 | return(symbolAddress)
|
---|
21 | end
|
---|
22 |
|
---|
23 | symbolsInfo = ReadSymbolFile("ntshell.syms")
|
---|
24 |
|
---|
25 | begin
|
---|
26 | outFile = File.open("../ntshell/shellif.h", "w")
|
---|
27 | rescue Errno::ENOENT, Errno::EACCES => ex
|
---|
28 | abort(ex.message)
|
---|
29 | end
|
---|
30 |
|
---|
31 | symbolsInfo.each do |k, v|
|
---|
32 | outFile.printf("#define __imp_%s ((%s_t)0x%08x)\n", k, k, v)
|
---|
33 | end
|
---|
34 |
|
---|
35 | outFile.close
|
---|
36 |
|
---|
37 | begin
|
---|
38 | outFile = File.open("../ntshell/shellif_stub.c", "w")
|
---|
39 | rescue Errno::ENOENT, Errno::EACCES => ex
|
---|
40 | abort(ex.message)
|
---|
41 | end
|
---|
42 |
|
---|
43 | symbolsInfo.each do |k, v|
|
---|
44 | outFile.printf("typedef int (*%s_t)(void);\n", k)
|
---|
45 | end
|
---|
46 |
|
---|
47 | outFile.print("\n")
|
---|
48 |
|
---|
49 | symbolsInfo.each do |k, v|
|
---|
50 | outFile.printf("int %s(void)\n", k)
|
---|
51 | outFile.print("{\n")
|
---|
52 | outFile.printf("\treturn __imp_%s();\n", k)
|
---|
53 | outFile.print("}\n")
|
---|
54 | outFile.print("\n")
|
---|
55 | end
|
---|
56 |
|
---|
57 | outFile.close
|
---|