def ReadSymbolFile(symbolFileName) begin symbolFile = File.open(symbolFileName) rescue Errno::ENOENT, Errno::EACCES => ex abort(ex.message) end symbolAddress = {} symbolFile.each do |line| # スペース区切りで分解 fields = line.split(/\s+/) # 3列になっていない行は除外 if fields.size == 3 && fields[2].start_with?("__exp_") symbolAddress[fields[2].gsub("__exp_", "")] = fields[0].hex end end symbolFile.close return(symbolAddress) end symbolsInfo = ReadSymbolFile("ntshell.syms") begin outFile = File.open("../ntshell/shellif.h", "w") rescue Errno::ENOENT, Errno::EACCES => ex abort(ex.message) end symbolsInfo.each do |k, v| outFile.printf("#define __imp_%s ((%s_t)0x%08x)\n", k, k, v) end outFile.close begin outFile = File.open("../ntshell/shellif_stub.c", "w") rescue Errno::ENOENT, Errno::EACCES => ex abort(ex.message) end symbolsInfo.each do |k, v| outFile.printf("typedef int (*%s_t)(void);\n", k) end outFile.print("\n") symbolsInfo.each do |k, v| outFile.printf("int %s(void)\n", k) outFile.print("{\n") outFile.printf("\treturn __imp_%s();\n", k) outFile.print("}\n") outFile.print("\n") end outFile.close