Ejemplo n.º 1
0
 public virtual void visit(dereference _dereference)
 {
     DefaultVisit(_dereference);
 }
Ejemplo n.º 2
0
 public override void visit(dereference _dereference)
 {
 }
Ejemplo n.º 3
0
		public override void visit(dereference _dereference)
		{
			DefaultVisit(_dereference);
			pre_do_visit(_dereference);
			visit(dereference.dereferencing_value);
			post_do_visit(_dereference);
		}
Ejemplo n.º 4
0
		public virtual void post_do_visit(dereference _dereference)
		{
		}
Ejemplo n.º 5
0
 public override void visit(dereference _dereference)
 {
     throw new NotImplementedException();
 }
Ejemplo n.º 6
0
 public virtual void visit(dereference _dereference)
 {
 }
Ejemplo n.º 7
0
		public virtual void visit(dereference _dereference)
		{
		}
		public virtual void visit(dereference _dereference)
		{
			DefaultVisit(_dereference);
		}
Ejemplo n.º 9
0
 public override void visit(dereference _dereference)
 {
     prepare_node(_dereference.dereferencing_value, "dereferencing value");
 }
Ejemplo n.º 10
0
		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);
		}
Ejemplo n.º 11
0
        /// <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;
        }