public virtual void visit(dereference _dereference) { DefaultVisit(_dereference); }
public override void visit(dereference _dereference) { }
public override void visit(dereference _dereference) { DefaultVisit(_dereference); pre_do_visit(_dereference); visit(dereference.dereferencing_value); post_do_visit(_dereference); }
public virtual void post_do_visit(dereference _dereference) { }
public override void visit(dereference _dereference) { throw new NotImplementedException(); }
public virtual void visit(dereference _dereference) { }
public virtual void visit(dereference _dereference) { }
public virtual void visit(dereference _dereference) { DefaultVisit(_dereference); }
public override void visit(dereference _dereference) { prepare_node(_dereference.dereferencing_value, "dereferencing value"); }
public override void visit(dereference _dereference) { executer.visit(_dereference); if (_dereference.dereferencing_value != null) this.visit((dynamic)_dereference.dereferencing_value); if (_dereference.attributes != null) this.visit((dynamic)_dereference.attributes); }
/// <summary> /// Interprets the specified value and dereference according to the current interpretation method. /// </summary> /// <param name="data">The argument value.</param> /// <param name="dereference">The dereferenced data. This should be null if there are no dereferences.</param> /// <param name="autodetermine">If true, this funciton will change DISPLAY_TYPE depending on the dereference.</param> /// <returns></returns> public string getValueString(uint data, dereference dereference) { // Autodetect this type if required if (!detectedType) { // Detect the type of dereference byte[] derefData = dereference.data; if (derefData[0] >= 0x20 && derefData[0] <= 0x7E && derefData[1] == 0 && derefData[2] >= 0x20 && derefData[2] <= 0x7E && derefData[3] == 0) { // Unicode with no offset displayMethod = DISPLAY_TYPE.ULONG_UNICODE; } else if (derefData[0] >= 0x20 && derefData[0] <= 0x7E && derefData[1] >= 0x20 && derefData[1] <= 0x7E && derefData[2] >= 0x20 && derefData[2] <= 0x7E) { // Ascii with no offset displayMethod = DISPLAY_TYPE.ULONG_ASCII; } else { // Binary dereference displayMethod = DISPLAY_TYPE.ULONG_DATA; } detectedType = true; } string result = getValueString(data); if (displayMethod == DISPLAY_TYPE.ULONG_ASCII || displayMethod == DISPLAY_TYPE.ULONG_ASCII_F || displayMethod == DISPLAY_TYPE.ULONG_DATA || displayMethod == DISPLAY_TYPE.ULONG_STRUCT || displayMethod == DISPLAY_TYPE.ULONG_UNICODE) { // Setup the dereference result = result + "="; // Add the dereference string according to the type byte[] derefData = dereference.data; int i = 0; switch(displayMethod) { case DISPLAY_TYPE.ULONG_UNICODE: // Print until a null or invalid character result = result + "\""; i = 0; while (i < derefData.Length && derefData[i] >= 32 && derefData[i] <= 126) { result = result + (char)derefData[i]; i += 2; } result = result + "\""; break; case DISPLAY_TYPE.ULONG_ASCII: // Print until a null or invalid character result = result + "'"; i = 0; while (i < derefData.Length && derefData[i] >= 32 && derefData[i] <= 126) { result = result + (char)derefData[i]; i++; } result = result + "'"; break; case DISPLAY_TYPE.ULONG_ASCII_F: // Force the printing of the whole buffer as ascii result = result + "'"; i = 0; while (i < derefData.Length ) { if( derefData[i] > 31 ) { result = result + (char) derefData[i]; }else { result = result + '.'; } i++; } result = result + "'"; break; default: // Interpret as a data pointer result = result + "["; i = 0; while (i < derefData.Length ) { string byteData = derefData[i].ToString("X"); while( byteData.Length < 2 ) byteData = "0" + byteData; result = result + byteData + " "; i += 1; } result = result.TrimEnd(new char[] {' '}) + "]"; break; } } return result; }