|
|
|
@ -79,6 +79,25 @@ namespace DebuggerLibrary
@@ -79,6 +79,25 @@ namespace DebuggerLibrary
|
|
|
|
|
return typeRefProps; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public IList<FieldProps> EnumFields(uint typeToken) |
|
|
|
|
{ |
|
|
|
|
List<FieldProps> fields = new List<FieldProps>(); |
|
|
|
|
|
|
|
|
|
IntPtr enumerator = IntPtr.Zero; |
|
|
|
|
while (true) { |
|
|
|
|
uint fieldToken; |
|
|
|
|
uint fieldsFetched; |
|
|
|
|
metaData.EnumFields(ref enumerator, typeToken, out fieldToken, 1, out fieldsFetched); |
|
|
|
|
if (fieldsFetched == 0) { |
|
|
|
|
metaData.CloseEnum(enumerator); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
fields.Add(GetFieldProps(fieldToken)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return fields; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public FieldProps GetFieldProps(uint fieldToken) |
|
|
|
|
{ |
|
|
|
|
FieldProps fieldProps; |
|
|
|
@ -122,23 +141,122 @@ namespace DebuggerLibrary
@@ -122,23 +141,122 @@ namespace DebuggerLibrary
|
|
|
|
|
return fieldProps; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public IList<FieldProps> EnumFields(uint classToken) |
|
|
|
|
public IList<MethodProps> EnumMethods(uint typeToken) |
|
|
|
|
{ |
|
|
|
|
List<FieldProps> fields = new List<FieldProps>(); |
|
|
|
|
IList<MethodProps> methods = new List<MethodProps>(); |
|
|
|
|
|
|
|
|
|
IntPtr enumerator = IntPtr.Zero; |
|
|
|
|
while(true) { |
|
|
|
|
uint fieldToken; |
|
|
|
|
uint fieldCount; |
|
|
|
|
metaData.EnumFields(ref enumerator, classToken, out fieldToken, 1, out fieldCount); |
|
|
|
|
if (fieldCount == 0) { |
|
|
|
|
uint methodToken; |
|
|
|
|
uint methodsFetched; |
|
|
|
|
metaData.EnumMethods(ref enumerator, typeToken, out methodToken, 1, out methodsFetched); |
|
|
|
|
if (methodsFetched == 0) { |
|
|
|
|
metaData.CloseEnum(enumerator); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
fields.Add(GetFieldProps(fieldToken)); |
|
|
|
|
methods.Add(GetMethodProps(methodToken)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return fields; |
|
|
|
|
return methods; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public unsafe MethodProps GetMethodProps(uint methodToken) |
|
|
|
|
{ |
|
|
|
|
MethodProps methodProps; |
|
|
|
|
|
|
|
|
|
methodProps.Token = methodToken; |
|
|
|
|
|
|
|
|
|
uint pStringLenght = 0; // Terminating character included in pStringLenght
|
|
|
|
|
IntPtr pString = IntPtr.Zero; |
|
|
|
|
IntPtr pSigBlob; |
|
|
|
|
uint sigBlobSize; |
|
|
|
|
metaData.GetMethodProps(methodProps.Token, |
|
|
|
|
out methodProps.ClassToken, |
|
|
|
|
pString, |
|
|
|
|
pStringLenght, |
|
|
|
|
out pStringLenght, // real string lenght
|
|
|
|
|
out methodProps.Flags, |
|
|
|
|
new IntPtr(&pSigBlob), |
|
|
|
|
out sigBlobSize, |
|
|
|
|
out methodProps.CodeRVA, |
|
|
|
|
out methodProps.ImplFlags); |
|
|
|
|
|
|
|
|
|
// Allocate string buffer
|
|
|
|
|
pString = Marshal.AllocHGlobal((int)pStringLenght * 2); |
|
|
|
|
|
|
|
|
|
metaData.GetMethodProps(methodProps.Token, |
|
|
|
|
out methodProps.ClassToken, |
|
|
|
|
pString, |
|
|
|
|
pStringLenght, |
|
|
|
|
out pStringLenght, // real string lenght
|
|
|
|
|
out methodProps.Flags, |
|
|
|
|
new IntPtr(&pSigBlob), |
|
|
|
|
out sigBlobSize, |
|
|
|
|
out methodProps.CodeRVA, |
|
|
|
|
out methodProps.ImplFlags); |
|
|
|
|
|
|
|
|
|
methodProps.Name = Marshal.PtrToStringUni(pString); |
|
|
|
|
Marshal.FreeHGlobal(pString); |
|
|
|
|
|
|
|
|
|
methodProps.Signature = new SignatureStream(pSigBlob, sigBlobSize); |
|
|
|
|
|
|
|
|
|
Marshal.FreeCoTaskMem(pSigBlob); |
|
|
|
|
|
|
|
|
|
return methodProps; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public ParamProps GetParamForMethodIndex(uint methodToken, uint parameterSequence) |
|
|
|
|
{ |
|
|
|
|
uint paramToken = 0; |
|
|
|
|
metaData.GetParamForMethodIndex(methodToken, parameterSequence, ref paramToken); |
|
|
|
|
return GetParamProps(paramToken); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public ParamProps GetParamProps(uint paramToken) |
|
|
|
|
{ |
|
|
|
|
ParamProps paramProps; |
|
|
|
|
|
|
|
|
|
paramProps.Token = paramToken; |
|
|
|
|
|
|
|
|
|
uint unused; |
|
|
|
|
uint pStringLenght = 0; // Terminating character included in pStringLenght
|
|
|
|
|
IntPtr pString = IntPtr.Zero; |
|
|
|
|
metaData.GetParamProps(paramProps.Token, |
|
|
|
|
out paramProps.MethodToken, |
|
|
|
|
out paramProps.ParameterSequence, |
|
|
|
|
pString, |
|
|
|
|
pStringLenght, |
|
|
|
|
out pStringLenght, // real string lenght
|
|
|
|
|
out paramProps.Flags, |
|
|
|
|
out unused, |
|
|
|
|
IntPtr.Zero, |
|
|
|
|
out unused); |
|
|
|
|
|
|
|
|
|
// Allocate string buffer
|
|
|
|
|
pString = Marshal.AllocHGlobal((int)pStringLenght * 2); |
|
|
|
|
|
|
|
|
|
metaData.GetParamProps(paramProps.Token, |
|
|
|
|
out paramProps.MethodToken, |
|
|
|
|
out paramProps.ParameterSequence, |
|
|
|
|
pString, |
|
|
|
|
pStringLenght, |
|
|
|
|
out pStringLenght, // real string lenght
|
|
|
|
|
out paramProps.Flags, |
|
|
|
|
out unused, |
|
|
|
|
IntPtr.Zero, |
|
|
|
|
out unused); |
|
|
|
|
|
|
|
|
|
paramProps.Name = Marshal.PtrToStringUni(pString); |
|
|
|
|
Marshal.FreeHGlobal(pString); |
|
|
|
|
|
|
|
|
|
return paramProps; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public TypeDefProps FindTypeDefByName(string typeName, uint enclosingClassToken) |
|
|
|
|
{ |
|
|
|
|
uint typeDefToken; |
|
|
|
|
metaData.FindTypeDefByName(typeName, enclosingClassToken, out typeDefToken); |
|
|
|
|
return GetTypeDefProps(typeDefToken); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|