Esempio n. 1
0
        private void cmbBoxScanCompareType_SelectedIndexChanged(Object sender, EventArgs e)
        {
            var newScanCompareType = (IScanCompareType)cmbBoxScanCompareType.SelectedItem;

            currentScanCompareType = newScanCompareType;

            txtBoxScanValue.Enabled       = newScanCompareType.supportsScanValue;
            txtBoxScanSecondValue.Enabled = newScanCompareType.supportsScanSecondValue;
        }
Esempio n. 2
0
        public static List <Tuple <UInt64, dynamic> > scan(UInt64 searchStartAddress, Byte[] searchBuffer, dynamic value, Type valueType, IScanCompareType compareType, dynamic[] extraParams = null)
        {
            List <Tuple <UInt64, dynamic> > listResults = new List <Tuple <UInt64, dynamic> >();

            if (valueType == typeof(Byte[]))
            {
                Byte[]  valueBuffer    = value;
                Int64   lenValueBuffer = valueBuffer.LongLength;
                Int64[] bufBoyerMoore  = new Int64[256];
                for (Int32 i = 0; i < 256; i++)
                {
                    bufBoyerMoore[i] = lenValueBuffer;
                }
                Int64 indexPatternEnd = lenValueBuffer - 1;
                for (Int64 i = 0; i < indexPatternEnd; i++)
                {
                    bufBoyerMoore[value[i]] = indexPatternEnd;
                }

                Int64 index = 0;
                while (index <= searchBuffer.LongLength - lenValueBuffer)
                {
                    for (Int64 i = indexPatternEnd; searchBuffer[index + i] == value[i]; i--)
                    {
                        if (i == 0)
                        {
                            listResults.Add(new Tuple <UInt64, dynamic>(searchStartAddress + (UInt64)index, value));
                            break;
                        }
                    }
                    index += bufBoyerMoore[searchBuffer[index + indexPatternEnd]];
                }
            }
            else
            {
                if (compareType.GetType() == typeof(CompareTypeExactValue))
                {
                    var patternMatchScanResults = scan(searchStartAddress, searchBuffer, dotNetExtensions.getBytes(value, valueType), typeof(Byte[]), null);
                    foreach (Tuple <UInt64, dynamic> tuple in patternMatchScanResults)
                    {
                        listResults.Add(new Tuple <UInt64, dynamic>(tuple.Item1, value));
                    }
                }
                else
                {
                    Int32 objectTypeSize = 0;
                    Func <Int32 /* searchBufferIndex */, dynamic /* returnValue */> fnGetMemoryValueAt = null;
                    switch (Type.GetTypeCode(valueType))
                    {
                    case TypeCode.SByte: {
                        fnGetMemoryValueAt = (iBuffer) => searchBuffer[iBuffer];
                        objectTypeSize     = sizeof(SByte);
                    }
                    break;

                    case TypeCode.Byte: {
                        fnGetMemoryValueAt = (iBuffer) => searchBuffer[iBuffer];
                        objectTypeSize     = sizeof(Byte);
                    }
                    break;

                    case TypeCode.Boolean: {
                        fnGetMemoryValueAt = (iBuffer) => BitConverter.ToBoolean(searchBuffer, iBuffer);
                        objectTypeSize     = 1;
                    }
                    break;

                    case TypeCode.Int16: {
                        fnGetMemoryValueAt = (iBuffer) => BitConverter.ToInt16(searchBuffer, iBuffer);
                        objectTypeSize     = sizeof(Int16);
                    }
                    break;

                    case TypeCode.UInt16: {
                        fnGetMemoryValueAt = (iBuffer) => BitConverter.ToUInt16(searchBuffer, iBuffer);
                        objectTypeSize     = sizeof(UInt16);
                    }
                    break;

                    case TypeCode.Int32: {
                        fnGetMemoryValueAt = (iBuffer) => BitConverter.ToUInt32(searchBuffer, iBuffer);
                        objectTypeSize     = sizeof(Int32);
                    }
                    break;

                    case TypeCode.UInt32: {
                        fnGetMemoryValueAt = (iBuffer) => BitConverter.ToUInt32(searchBuffer, iBuffer);
                        objectTypeSize     = sizeof(UInt32);
                    }
                    break;

                    case TypeCode.Int64: {
                        fnGetMemoryValueAt = (iBuffer) => BitConverter.ToUInt64(searchBuffer, iBuffer);
                        objectTypeSize     = sizeof(Int64);
                    }
                    break;

                    case TypeCode.UInt64: {
                        fnGetMemoryValueAt = (iBuffer) => BitConverter.ToUInt64(searchBuffer, iBuffer);
                        objectTypeSize     = sizeof(UInt64);
                    }
                    break;

                    case TypeCode.Double: {
                        fnGetMemoryValueAt = (iBuffer) => BitConverter.ToDouble(searchBuffer, iBuffer);
                        objectTypeSize     = sizeof(Double);
                    }
                    break;

                    case TypeCode.Single: {
                        fnGetMemoryValueAt = (iBuffer) => BitConverter.ToSingle(searchBuffer, iBuffer);
                        objectTypeSize     = sizeof(Single);
                    }
                    break;

                    case TypeCode.String: {
                        var scanResults = scan(searchStartAddress, searchBuffer, ((Object)value).getBytes(typeof(String)), typeof(Byte[]), compareType, extraParams);
                        foreach (Tuple <UInt64, dynamic> tuple in scanResults)
                        {
                            listResults.Add(new Tuple <UInt64, dynamic>(tuple.Item1, Encoding.ASCII.GetString(tuple.Item2)));
                        }
                        return(listResults);
                    }
                    }

                    Int32 indexEnd = searchBuffer.Length - objectTypeSize;
                    if (indexEnd > 0)
                    {
                        for (Int32 index = 0; index < indexEnd; index += objectTypeSize)
                        {
                            dynamic memoryValue = fnGetMemoryValueAt(index);
                            if (compareType.compare(value, memoryValue, null, extraParams))
                            {
                                listResults.Add(new Tuple <UInt64, dynamic>(searchStartAddress + (UInt64)index, memoryValue));
                            }
                        }
                    }
                }
            }
            return(listResults);
        }