unsafe public int GetFieldValue(ulong moduleBase, uint typeId, string fieldName, ulong structureAddress, out ulong fieldValue) { int hr; fieldValue = 0; _EXT_TYPED_DATA symbolTypedData; symbolTypedData.Operation = _EXT_TDOP.EXT_TDOP_SET_FROM_TYPE_ID_AND_U64; symbolTypedData.InData.ModBase = moduleBase; symbolTypedData.InData.TypeId = typeId; symbolTypedData.InData.Offset = structureAddress; if (FAILED(hr = Advanced.Request(DEBUG_REQUEST.EXT_TYPED_DATA_ANSI, &symbolTypedData, sizeof(_EXT_TYPED_DATA), &symbolTypedData, sizeof(_EXT_TYPED_DATA), null))) { return(hr); } IntPtr buffer = IntPtr.Zero; IntPtr memPtr = IntPtr.Zero; try { _EXT_TYPED_DATA temporaryTypedDataForBufferConstruction; memPtr = Marshal.StringToHGlobalAnsi(fieldName); int totalSize = sizeof(_EXT_TYPED_DATA) + fieldName.Length + 1; //+1 to account for the null terminator buffer = Marshal.AllocHGlobal(totalSize); temporaryTypedDataForBufferConstruction.Operation = _EXT_TDOP.EXT_TDOP_GET_FIELD; temporaryTypedDataForBufferConstruction.InData = symbolTypedData.OutData; temporaryTypedDataForBufferConstruction.InStrIndex = (uint)sizeof(_EXT_TYPED_DATA); Utilities.CopyMemory(buffer, (IntPtr)(&temporaryTypedDataForBufferConstruction), sizeof(_EXT_TYPED_DATA)); Utilities.CopyMemory(buffer + sizeof(_EXT_TYPED_DATA), memPtr, fieldName.Length + 1); if (FAILED(hr = Advanced.Request(DEBUG_REQUEST.EXT_TYPED_DATA_ANSI, (void *)buffer, totalSize, (void *)buffer, totalSize, null))) { return(hr); } var typedDataInClassForm = (_EXT_TYPED_DATA)Marshal.PtrToStructure(buffer, typeof(_EXT_TYPED_DATA)); fieldValue = typedDataInClassForm.OutData.Data; } finally { Marshal.FreeHGlobal(buffer); Marshal.FreeHGlobal(memPtr); } return(S_OK); }
private _EXT_TYPED_DATA PerformRequest(_EXT_TYPED_DATA payload, byte[] additionalPayload) { var payloadBuffer = ToBytes(payload, additionalPayload); var resultBuffer = new byte[Defaults.BufferSize * 50]; int outSize; var hr = _advanced.Request(DEBUG_REQUEST.EXT_TYPED_DATA_ANSI, payloadBuffer, payloadBuffer.Length, resultBuffer, Defaults.BufferSize * 50, out outSize); return(FromBytes(resultBuffer)); }
/// <summary> /// Requests the specified request type. /// </summary> /// <param name="client">The DbgEng.dll Advanced interface.</param> /// <param name="requestType">Type of the request.</param> /// <param name="request">The request.</param> /// <returns></returns> public static EXT_TYPED_DATA Request(this IDebugAdvanced3 client, DebugRequest requestType, EXT_TYPED_DATA request) { using (var requestNative = new MarshalStructure <EXT_TYPED_DATA>()) { uint outSize; requestNative.Structure = request; client.Request(requestType, requestNative.Pointer, requestNative.USize, requestNative.Pointer, requestNative.USize, out outSize); return(requestNative.Structure); } }
/// <summary> /// Requests the specified request type with extended structure. /// </summary> /// <param name="client">The DbgEng.dll Advanced interface.</param> /// <param name="requestType">Type of the request.</param> /// <param name="request">The request.</param> /// <param name="extended">The extended string.</param> public static EXT_TYPED_DATA RequestExtended(this IDebugAdvanced3 client, DebugRequest requestType, EXT_TYPED_DATA request, string extended) { using (var requestNative = new MarshalStructureExtendedWithAnsiString <EXT_TYPED_DATA>()) { uint outSize; requestNative.Extended = extended; requestNative.Structure = request; client.Request(requestType, requestNative.Pointer, requestNative.USize, requestNative.Pointer, requestNative.USize, out outSize); return(requestNative.Structure); } }