/trunk/mdbglib/DebugSymbols.cpp

# · C++ · 415 lines · 275 code · 21 blank · 119 comment · 4 complexity · a6d786e7b7e880bc21ff3d9c83f57e82 MD5 · raw file

  1. #include "StdAfx.h"
  2. #include "DebugSymbols.h"
  3. using namespace System;
  4. namespace MS
  5. {
  6. namespace Debuggers
  7. {
  8. namespace DbgEng
  9. {
  10. DebugSymbols::DebugSymbols(DbgSymbols* symbols)
  11. {
  12. m_symbols = symbols;
  13. m_symbols->AddRef();
  14. m_disposed = false;
  15. }
  16. DebugSymbols::~DebugSymbols()
  17. {
  18. this->!DebugSymbols();
  19. m_disposed = true;
  20. }
  21. DebugSymbols::!DebugSymbols()
  22. {
  23. if(NULL != m_symbols)
  24. {
  25. m_symbols->Release();
  26. m_symbols = NULL;
  27. }
  28. }
  29. String^ DebugSymbols::GetConstantName(ULONG64 module, ULONG typeId, ULONG64 value)
  30. {
  31. //HRESULT
  32. // IDebugSymbols3::GetConstantName(
  33. // IN ULONG64 Module,
  34. // IN ULONG TypeId,
  35. // IN ULONG64 Value,
  36. // OUT OPTIONAL PWSTR NameBuffer,
  37. // IN ULONG NameBufferSize,
  38. // OUT OPTIONAL PULONG NameSize
  39. // );
  40. PWSTR pwConstantName = NULL;
  41. try
  42. {
  43. ULONG nameSize;
  44. Tools::CheckHR(m_symbols->GetConstantNameWide(module, typeId, value, NULL, 0, &nameSize));
  45. pwConstantName = new WCHAR[nameSize];
  46. Tools::CheckHR(m_symbols->GetConstantNameWide(module, typeId, value, pwConstantName, nameSize, NULL));
  47. return gcnew String(pwConstantName);
  48. }
  49. finally
  50. {
  51. delete[] pwConstantName;
  52. }
  53. }
  54. array<Byte>^ DebugSymbols::ReadTypedDataPhysical(ULONG64 offset, ULONG64 module, ULONG typeId)
  55. {
  56. //HRESULT
  57. // IDebugSymbols::ReadTypedDataPhysical(
  58. // IN ULONG64 Offset,
  59. // IN ULONG64 Module,
  60. // IN ULONG TypeId,
  61. // OUT PVOID Buffer,
  62. // IN ULONG BufferSize,
  63. // OUT OPTIONAL PULONG BytesRead
  64. // );
  65. ULONG buffSize;
  66. Tools::CheckHR(m_symbols->ReadTypedDataPhysical(offset, module, typeId, NULL, 0, &buffSize));
  67. array<Byte>^ buff = gcnew array<Byte>(buffSize);
  68. pin_ptr<BYTE> buffPtr = &buff[0];
  69. Tools::CheckHR(m_symbols->ReadTypedDataPhysical(offset, module, typeId, buffPtr, buffSize, NULL));
  70. return buff;
  71. }
  72. void DebugSymbols::OutputTypedDataPhysical(DebugOutputControl outputControl, ULONG64 offset, ULONG64 module, ULONG typeId, TypeOptions flags)
  73. {
  74. //HRESULT
  75. // IDebugSymbols::OutputTypedDataPhysical(
  76. // IN ULONG OutputControl,
  77. // IN ULONG64 Offset,
  78. // IN ULONG64 Module,
  79. // IN ULONG TypeId,
  80. // IN ULONG Flags
  81. // );
  82. Tools::CheckHR(m_symbols->OutputTypedDataPhysical((ULONG) outputControl, offset, module, typeId, (ULONG)flags));
  83. }
  84. ULONG DebugSymbols::WriteTypedDataPhysical(ULONG64 offset, ULONG64 module, ULONG typeId, array<Byte>^ buff)
  85. {
  86. //HRESULT
  87. // IDebugSymbols::WriteTypedDataPhysical(
  88. // IN ULONG64 Offset,
  89. // IN ULONG64 Module,
  90. // IN ULONG TypeId,
  91. // IN PVOID Buffer,
  92. // IN ULONG BufferSize,
  93. // OUT OPTIONAL PULONG BytesWritten
  94. // );
  95. ULONG bytesWritten;
  96. pin_ptr<BYTE> buffPtr = &buff[0];
  97. Tools::CheckHR(m_symbols->WriteTypedDataPhysical(offset, module, typeId, buffPtr, buff->Length, &bytesWritten));
  98. return bytesWritten;
  99. }
  100. array<Byte>^ DebugSymbols::ReadTypedDataVirtual(ULONG64 offset, ULONG64 module, ULONG typeId)
  101. {
  102. //HRESULT
  103. // IDebugSymbols::ReadTypedDataVirtual(
  104. // IN ULONG64 Offset,
  105. // IN ULONG64 Module,
  106. // IN ULONG TypeId,
  107. // OUT PVOID Buffer,
  108. // IN ULONG BufferSize,
  109. // OUT OPTIONAL PULONG BytesRead
  110. // );
  111. ULONG buffSize;
  112. Tools::CheckHR(m_symbols->ReadTypedDataVirtual(offset, module, typeId, NULL, 0, &buffSize));
  113. array<Byte>^ buff = gcnew array<Byte>(buffSize);
  114. pin_ptr<BYTE> buffPtr = &buff[0];
  115. Tools::CheckHR(m_symbols->ReadTypedDataVirtual(offset, module, typeId, buffPtr, buffSize, NULL));
  116. return buff;
  117. }
  118. void DebugSymbols::OutputTypedDataVirtual(DebugOutputControl outputControl, ULONG64 offset, ULONG64 module, ULONG typeId, TypeOptions flags)
  119. {
  120. //HRESULT
  121. // IDebugSymbols::OutputTypedDataVirtual(
  122. // IN ULONG OutputControl,
  123. // IN ULONG64 Offset,
  124. // IN ULONG64 Module,
  125. // IN ULONG TypeId,
  126. // IN ULONG Flags
  127. // );
  128. Tools::CheckHR(m_symbols->OutputTypedDataVirtual((ULONG) outputControl, offset, module, typeId, (ULONG)flags));
  129. }
  130. ULONG DebugSymbols::WriteTypedDataVirtual(ULONG64 offset, ULONG64 module, ULONG typeId, array<Byte>^ buff)
  131. {
  132. //HRESULT
  133. // IDebugSymbols::WriteTypedDataVirtual(
  134. // IN ULONG64 Offset,
  135. // IN ULONG64 Module,
  136. // IN ULONG TypeId,
  137. // IN PVOID Buffer,
  138. // IN ULONG BufferSize,
  139. // OUT OPTIONAL PULONG BytesWritten
  140. // );
  141. ULONG bytesWritten;
  142. pin_ptr<BYTE> buffPtr = &buff[0];
  143. Tools::CheckHR(m_symbols->WriteTypedDataVirtual(offset, module, typeId, buffPtr, buff->Length, &bytesWritten));
  144. return bytesWritten;
  145. }
  146. String^ DebugSymbols::GetFieldName(ULONG64 module, ULONG typeId, ULONG fieldIndex)
  147. {
  148. //HRESULT
  149. // IDebugSymbols3::GetFieldNameWide(
  150. // IN ULONG64 Module,
  151. // IN ULONG TypeId,
  152. // IN ULONG FieldIndex,
  153. // OUT OPTIONAL PSTR NameBuffer,
  154. // IN ULONG NameBufferSize,
  155. // OUT OPTIONAL PULONG NameSize
  156. // );
  157. PWSTR pFieldName = NULL;
  158. try
  159. {
  160. ULONG nameSize;
  161. Tools::CheckHR(m_symbols->GetFieldNameWide(module, typeId, fieldIndex, NULL, 0, &nameSize));
  162. pFieldName = new WCHAR[nameSize];
  163. Tools::CheckHR(m_symbols->GetFieldNameWide(module, typeId, fieldIndex, pFieldName, nameSize, NULL));
  164. String^ fieldName = gcnew String(pFieldName);
  165. return fieldName;
  166. }
  167. finally
  168. {
  169. delete[] pFieldName;
  170. }
  171. }
  172. String^ DebugSymbols::GetImagePath()
  173. {
  174. //IDebugSymbols3::GetImagePathWide(
  175. // OUT OPTIONAL PWSTR Buffer,
  176. // IN ULONG BufferSize,
  177. // Out OPTIONAL PULONG PathSize
  178. // );
  179. PWSTR pImagePath = NULL;
  180. try
  181. {
  182. ULONG pathSize;
  183. Tools::CheckHR(m_symbols->GetImagePath(NULL, 0, &pathSize));
  184. pImagePath = new WCHAR[pathSize];
  185. Tools::CheckHR(m_symbols->GetImagePathWide(pImagePath, pathSize, NULL));
  186. String^ imagePath = gcnew String(pImagePath);
  187. return imagePath;
  188. }
  189. finally
  190. {
  191. delete[] pImagePath;
  192. }
  193. }
  194. void DebugSymbols::SetImagePath(String^ value)
  195. {
  196. //IdebugSymbols3::SetImagePathWide(
  197. // IN PCWSTR Path
  198. // );
  199. pin_ptr<const wchar_t> pImagePath = PtrToStringChars(value);
  200. Tools::CheckHR(m_symbols->SetImagePathWide(pImagePath));
  201. }
  202. void DebugSymbols::GetLineByOffset(ULONG64 offset, [Out] ULONG %line, [Out] String ^%fileName, [Out] ULONG64 %displacement)
  203. {
  204. //IdebugSymbols3::GetLineByOffsetWide(
  205. // IN ULONG64 Offset,
  206. // OUT OPTIONAL PULONG Line,
  207. // OUT OPTIONAL PWSTR FileBuffer,
  208. // IN ULONG FileBufferSize,
  209. // OUT OPTIONAL PULONG FileSize,
  210. // OUT OPTIONAL PULONG64 Displacement
  211. // );
  212. PWSTR pwFile = NULL;
  213. try
  214. {
  215. ULONG fileNameSize;
  216. Tools::CheckHR(m_symbols->GetLineByOffsetWide(offset, NULL, NULL, 0, &fileNameSize, NULL));
  217. pwFile = new WCHAR[fileNameSize];
  218. ULONG mLine;
  219. Tools::CheckHR(m_symbols->GetLineByOffsetWide(offset, &mLine, pwFile, fileNameSize, &fileNameSize, NULL));
  220. line = mLine;
  221. fileName = gcnew String(pwFile);
  222. }
  223. finally
  224. {
  225. delete[] pwFile;
  226. }
  227. }
  228. void DebugSymbols::GetFieldTypeAndOffset(ULONG64 moduleBase, ULONG typeId, String ^fieldName, [Out] ULONG %fieldTypeId, [Out] ULONG %fieldOffset)
  229. {
  230. //IDebugSymbols3::GetFieldTypeAndOffsetWide(
  231. // IN ULONG64 Module,
  232. // IN ULONG ContainerTypeId,
  233. // IN PCWSTR Field,
  234. // OUT OPTIONAL PULONG FieldTypeId,
  235. // OUT OPTIONAL PULONG Offset
  236. // );
  237. ULONG fType;
  238. ULONG fOffset;
  239. pin_ptr<const wchar_t> pFieldName = PtrToStringChars(fieldName);
  240. Tools::CheckHR(m_symbols->GetFieldTypeAndOffsetWide(moduleBase, typeId, pFieldName, &fType, &fOffset));
  241. fieldTypeId = fType;
  242. fieldOffset = fOffset;
  243. }
  244. void DebugSymbols::GetNameByOffset(ULONG64 offset, [Out] String ^%functionName, [Out] ULONG64 %displacement)
  245. {
  246. PWSTR pwFunctionName = NULL;
  247. try
  248. {
  249. ULONG nameSize;
  250. HRESULT hr = m_symbols->GetNameByOffsetWide(offset,NULL, 0, &nameSize, NULL);
  251. if (hr == -2147467259) //Number taken from mdbgeng.dll
  252. {
  253. throw gcnew ArgumentException("No symbol found at specified location.", "offset");
  254. }
  255. Tools::CheckHR(hr);
  256. pwFunctionName = new WCHAR[nameSize];
  257. ULONG64 mDisplacement;
  258. Tools::CheckHR(m_symbols->GetNameByOffsetWide(offset, pwFunctionName, nameSize, NULL, &mDisplacement));
  259. displacement = mDisplacement;
  260. functionName = gcnew String(pwFunctionName);
  261. }
  262. finally
  263. {
  264. delete[] pwFunctionName;
  265. }
  266. }
  267. #pragma region Scope
  268. void DebugSymbols::SetScopeFromStoredEvent()
  269. {
  270. Tools::CheckHR(m_symbols->SetScopeFromStoredEvent());
  271. }
  272. ULONG DebugSymbols::GetCurrentScopeFrameIndex()
  273. {
  274. ULONG result;
  275. Tools::CheckHR(m_symbols->GetCurrentScopeFrameIndex(&result));
  276. return result;
  277. }
  278. void DebugSymbols::SetScopeFrameByIndex(ULONG index)
  279. {
  280. Tools::CheckHR(m_symbols->SetScopeFrameByIndex(index));
  281. }
  282. void DebugSymbols::SetScope(ULONG64 instructionOffset, PDEBUG_STACK_FRAME pScopeFrame, PVOID pScopeContext, ULONG scopeContextSize)
  283. {
  284. Tools::CheckHR(m_symbols->SetScope(instructionOffset, pScopeFrame, pScopeContext, scopeContextSize));
  285. }
  286. void DebugSymbols::GetScope(PULONG64 pInstructionOffset, PDEBUG_STACK_FRAME pScopeFrame, PVOID pScopeContext, ULONG scopeContextSize)
  287. {
  288. Tools::CheckHR(m_symbols->GetScope(pInstructionOffset, pScopeFrame, pScopeContext, scopeContextSize));
  289. }
  290. #pragma endregion
  291. #pragma region Symbol Location
  292. void DebugSymbols::SetSymbolPath(String ^symbolPath)
  293. {
  294. //DbgSymbols::SetSymbolPathWide(
  295. // IN PWSTR Path
  296. // );
  297. pin_ptr<const wchar_t> pSymbolPath = PtrToStringChars(symbolPath);
  298. Tools::CheckHR(m_symbols->SetSymbolPathWide(pSymbolPath));
  299. }
  300. String ^DebugSymbols::GetSymbolPath()
  301. {
  302. //DbgSymbols::GetSymbolPathWide(
  303. // OUT OPTIONAL PSTR Buffer,
  304. // IN ULONG BufferSize,
  305. // OUT OPTIONAL PULONG PathSize
  306. // );
  307. PWSTR pwSymbolPath = NULL;
  308. try
  309. {
  310. ULONG pathSize;
  311. Tools::CheckHR(m_symbols->GetSymbolPathWide(NULL, 0, &pathSize));
  312. pwSymbolPath = new WCHAR[pathSize];
  313. Tools::CheckHR(m_symbols->GetSymbolPathWide(pwSymbolPath, pathSize, NULL));
  314. return gcnew String(pwSymbolPath);
  315. }
  316. finally
  317. {
  318. delete[] pwSymbolPath;
  319. }
  320. }
  321. void DebugSymbols::AppendSymbolPath(String ^symbolPath)
  322. {
  323. //DbgSymbols::AppendSymbolPathWide(
  324. // IN PCWSTR Addition
  325. // );
  326. pin_ptr<const wchar_t> pSymbolPath = PtrToStringChars(symbolPath);
  327. Tools::CheckHR(m_symbols->AppendSymbolPathWide(pSymbolPath));
  328. }
  329. #pragma endregion
  330. #pragma region Module
  331. String^ DebugSymbols::GetModuleNameString(ModuleNameType nameType, ULONG index, ULONG64 base, ULONG nameSize)
  332. {
  333. PWSTR pwName = NULL;
  334. try
  335. {
  336. pwName = new WCHAR[nameSize];
  337. Tools::CheckHR(m_symbols->GetModuleNameStringWide((ULONG)nameType, index, base, pwName, nameSize, NULL));
  338. return gcnew String(pwName);
  339. }
  340. finally
  341. {
  342. delete[] pwName;
  343. }
  344. }
  345. void DebugSymbols::GetModuleByModuleName(String^ name, ULONG startIndex, GetMethodFlags flags, [Out] ULONG %index, [Out] ULONG64 %base)
  346. {
  347. //HRESULT
  348. // IDebugSymbols3::GetModuleByModuleName2Wide(
  349. // IN PCWSTR Name,
  350. // IN ULONG StartIndex,
  351. // IN ULONG Flags,
  352. // OUT OPTIONAL PULONG Index,
  353. // OUT OPTIONAL PULONG64 Base
  354. // );
  355. pin_ptr<const wchar_t> pName = PtrToStringChars(name);
  356. ULONG mIndex;
  357. ULONG64 mBase;
  358. Tools::CheckHR(m_symbols->GetModuleByModuleName2Wide(pName, startIndex, (ULONG)flags, &mIndex, &mBase));
  359. index = mIndex;
  360. base = mBase;
  361. }
  362. void DebugSymbols::GetModuleByModuleName(String^ name, [Out] ULONG %index, [Out] ULONG64 %base)
  363. {
  364. return this->GetModuleByModuleName(name, 0, GetMethodFlags::Default, index, base);
  365. }
  366. #pragma endregion
  367. #pragma region Type
  368. ULONG DebugSymbols::GetTypeId(ULONG64 moduleBase, String ^typeName)
  369. {
  370. ULONG typeId;
  371. pin_ptr<const wchar_t> pResultObjectTypeName = PtrToStringChars(typeName);
  372. Tools::CheckHR(m_symbols->GetTypeIdWide(moduleBase, pResultObjectTypeName, &typeId));
  373. return typeId;
  374. }
  375. #pragma endregion
  376. void DebugSymbols::GetSymbolType(String ^symbol, [Out] ULONG %typeId, [Out] ULONG64 %moduleBase)
  377. {
  378. //HRESULT
  379. // DbgSymbols::GetSymbolTypeIdWide(
  380. // IN PCWSTR Symbol,
  381. // OUT PULONG TypeId,
  382. // OUT OPTIONAL PULONG64 Module
  383. // );
  384. ULONG mTypeId;
  385. ULONG64 mModuleBase;
  386. pin_ptr<const wchar_t> pSymbol = PtrToStringChars(symbol);
  387. Tools::CheckHR(m_symbols->GetSymbolTypeIdWide(pSymbol, &mTypeId, &mModuleBase));
  388. typeId = mTypeId;
  389. moduleBase = mModuleBase;
  390. }
  391. }
  392. }
  393. }
  394. //throw gcnew NotImplementedException("Please implement me");