Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

165 lines
4.7 KiB

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. #include <imagehlp.h>
  5. #ifndef _CRTAPI1
  6. #define _CRTAPI1
  7. #endif
  8. #define IS_ARG(c) (((c) == '-') || ((c) == '/'))
  9. typedef BOOL (* SYMINITIALIZE)(HANDLE, LPSTR, BOOL);
  10. typedef BOOL (* SYMLOADMODULE)(HANDLE, HANDLE, PSTR, PSTR, DWORD, DWORD);
  11. typedef BOOL (* SYMGETSYMFROMADDR)(HANDLE, DWORD, PDWORD, PIMAGEHLP_SYMBOL);
  12. typedef BOOL (* SYMCLEANUP)(HANDLE);
  13. void _CRTAPI1 main(int, char**);
  14. void usage(void);
  15. VOID InitSymLib(VOID);
  16. VOID TermSymLib(VOID);
  17. LPSTR GetDebugSymbol(DWORD Address, LPDWORD Offset);
  18. void _CRTAPI1 main(int argc, char** argv) {
  19. char * fni = NULL;
  20. char * fno = NULL;
  21. for (--argc, ++argv; argc; --argc, ++argv) {
  22. if (IS_ARG(**argv)) {
  23. switch (*++*argv) {
  24. default:
  25. printf("error: unrecognized command line flag: '%c'\n", **argv);
  26. usage();
  27. break;
  28. }
  29. } else if (fno) {
  30. printf("error: unrecognized command line argument: \"%s\"\n", *argv);
  31. usage();
  32. } else if (fni) {
  33. fno = *argv;
  34. } else {
  35. fni = *argv;
  36. }
  37. }
  38. if (!fni || !fno) {
  39. usage();
  40. }
  41. FILE * fpi = fopen(fni, "rt");
  42. if (!fpi) {
  43. printf("error: cannot open file \"%s\" for read\n", fni);
  44. exit(1);
  45. }
  46. FILE * fpo = fopen(fno, "wt");
  47. if (!fpo) {
  48. printf("error: cannot open file \"%s\" for write\n", fno);
  49. exit(1);
  50. }
  51. InitSymLib();
  52. while (!feof(fpi)) {
  53. char buf[1024];
  54. if (!fgets(buf, sizeof(buf), fpi)) {
  55. break;
  56. }
  57. char * p = strstr(buf, "+0x");
  58. if (p) {
  59. DWORD val = (DWORD)strtoul(p, NULL, 0);
  60. DWORD offset;
  61. char * str = GetDebugSymbol(val, &offset);
  62. if (str) {
  63. sprintf(p, "%s+%#x\n", str, offset);
  64. }
  65. }
  66. fwrite(buf, strlen(buf), 1, fpo);
  67. }
  68. fclose(fpi);
  69. fclose(fpo);
  70. TermSymLib();
  71. }
  72. void usage() {
  73. printf("usage: convsym <input_file> <output_file>\n"
  74. );
  75. exit(1);
  76. }
  77. HMODULE hSymLib = NULL;
  78. SYMINITIALIZE pSymInitialize = NULL;
  79. SYMLOADMODULE pSymLoadModule = NULL;
  80. SYMGETSYMFROMADDR pSymGetSymFromAddr = NULL;
  81. SYMCLEANUP pSymCleanup = NULL;
  82. VOID InitSymLib(VOID) {
  83. if (hSymLib == NULL) {
  84. hSymLib = LoadLibrary("IMAGEHLP.DLL");
  85. if (hSymLib != NULL) {
  86. pSymInitialize = (SYMINITIALIZE)GetProcAddress(hSymLib,
  87. "SymInitialize"
  88. );
  89. pSymLoadModule = (SYMLOADMODULE)GetProcAddress(hSymLib,
  90. "SymLoadModule"
  91. );
  92. pSymGetSymFromAddr = (SYMGETSYMFROMADDR)GetProcAddress(hSymLib,
  93. "SymGetSymFromAddr"
  94. );
  95. pSymCleanup = (SYMCLEANUP)GetProcAddress(hSymLib,
  96. "SymCleanup"
  97. );
  98. if (!pSymInitialize
  99. || !pSymLoadModule
  100. || !pSymGetSymFromAddr
  101. || !pSymCleanup) {
  102. FreeLibrary(hSymLib);
  103. hSymLib = NULL;
  104. pSymInitialize = NULL;
  105. pSymLoadModule = NULL;
  106. pSymGetSymFromAddr = NULL;
  107. pSymCleanup = NULL;
  108. return;
  109. }
  110. }
  111. pSymInitialize(GetCurrentProcess(), NULL, FALSE);
  112. //SymInitialize(GetCurrentProcess(), NULL, TRUE);
  113. pSymLoadModule(GetCurrentProcess(), NULL, "WININET.DLL", "WININET", 0, 0);
  114. }
  115. }
  116. VOID TermSymLib(VOID) {
  117. if (pSymCleanup) {
  118. pSymCleanup(GetCurrentProcess());
  119. FreeLibrary(hSymLib);
  120. }
  121. }
  122. LPSTR GetDebugSymbol(DWORD Address, LPDWORD Offset) {
  123. *Offset = Address;
  124. if (!pSymGetSymFromAddr) {
  125. return "";
  126. }
  127. static char symBuf[512];
  128. //((PIMAGEHLP_SYMBOL)symBuf)->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL);
  129. ((PIMAGEHLP_SYMBOL)symBuf)->SizeOfStruct = sizeof(symBuf);
  130. ((PIMAGEHLP_SYMBOL)symBuf)->MaxNameLength = sizeof(symBuf) - sizeof(IMAGEHLP_SYMBOL);
  131. if (!pSymGetSymFromAddr(GetCurrentProcess(),
  132. Address,
  133. Offset,
  134. (PIMAGEHLP_SYMBOL)symBuf)) {
  135. ((PIMAGEHLP_SYMBOL)symBuf)->Name[0] = '\0';
  136. }
  137. return ((PIMAGEHLP_SYMBOL)symBuf)->Name;
  138. }