PERWAPI.PEReader.GetBlobType C# (CSharp) Метод

GetBlobType() приватный Метод

private GetBlobType ( ) : Type
Результат Type
        private Type GetBlobType()
        {
            //Class currClass, Method currMeth) {
            byte typeIx = blob.ReadByte();
            if (Diag.DiagOn) Console.WriteLine("Getting blob type " + (ElementType)typeIx);
            if (typeIx < PrimitiveType.primitives.Length)
                return PrimitiveType.primitives[typeIx];
            switch (typeIx) {
                case ((int)ElementType.Ptr) :
                    return new UnmanagedPointer(GetBlobType()); //currClass,currMeth));
                case ((int)ElementType.ByRef) :
                    return new ManagedPointer(GetBlobType()); //currClass,currMeth));
                case ((int)ElementType.ValueType) :
                    //Console.WriteLine("Reading value type");
                    uint vcIx = blob.ReadCompressedNum();
                    Class vClass = (Class)GetCodedElement(CIx.TypeDefOrRef,vcIx);
                    vClass.MakeValueClass();
                    return vClass;
                case ((int)ElementType.Class)   :
                    return (Class)GetCodedElement(CIx.TypeDefOrRef,blob.ReadCompressedNum());
                case ((int)ElementType.Array) :
                    Type elemType = GetBlobType(); //currClass,currMeth);
                    int rank = (int)blob.ReadCompressedNum();
                    int numSizes = (int)blob.ReadCompressedNum();
                    int[] sizes = null;
                    if (numSizes > 0){
                        sizes = new int[numSizes];
                        for (int i=0; i < numSizes; i++)
                            sizes[i] = (int)blob.ReadCompressedNum();
                    }
                    int numBounds = (int)blob.ReadCompressedNum();
                    int[] loBounds = null, hiBounds = null;
                    if ((numBounds > 0) && (numSizes > 0)){
                        loBounds = new int[numBounds];
                        hiBounds = new int[numBounds];
                        for (int i=0; i < numBounds; i++) {
                            loBounds[i] = (int)blob.ReadCompressedNum();
                            hiBounds[i] = loBounds[i] + sizes[i] - 1;
                        }
                    }
                    if (numSizes == 0) return new BoundArray(elemType,rank);
                    if (numBounds == 0) return new BoundArray(elemType,rank,sizes);
                    return new BoundArray(elemType,rank,loBounds,hiBounds);
                case ((int)ElementType.TypedByRef) :
                    return PrimitiveType.TypedRef;
                case ((int)ElementType.I) :
                    return PrimitiveType.IntPtr;
                case ((int)ElementType.U) :
                    return PrimitiveType.UIntPtr;
                case ((int)ElementType.FnPtr) :
                    MethSig mSig = ReadMethSig(null,false);
                    return new MethPtrType(mSig);
                case ((int)ElementType.Object) :
                    return PrimitiveType.Object;
                case ((int)ElementType.SZArray) :
                    return new ZeroBasedArray(GetBlobType()); //currClass,currMeth));
                case ((int)ElementType.CmodReqd) :
                case ((int)ElementType.CmodOpt) :
                    Class modType = (Class)GetCodedElement(CIx.TypeDefOrRef,blob.ReadCompressedNum());
                    return new CustomModifiedType(GetBlobType(),(CustomModifier)typeIx,modType);
                case ((int)ElementType.Sentinel) :
                    return sentinel;
                case ((int)ElementType.Pinned) :
                    return pinned;
                case ((int)ElementType.GenericInst) :
                    Class instType = (Class)GetBlobType();
                    Class scopeSave = currentClassScope;
                    if (genInstNestLevel > 0) {
                        currentClassScope = instType;
                    }
                    genInstNestLevel++;
                    ClassSpec newClassSpec = new ClassSpec(instType,GetListOfType());
                    genInstNestLevel--;
                    if (genInstNestLevel > 0) {
                        currentClassScope = scopeSave;
                    }
                    return newClassSpec;
                case ((int)ElementType.Var) :
                    if (currentClassScope == null) {
                        //Console.WriteLine("GenericParam with currClass == null");
                        return GenericParam.AnonClassPar(blob.ReadCompressedNum());
                        //throw new Exception("No current class set");
                    }
                    return currentClassScope.GetGenPar(blob.ReadCompressedNum());
                case ((int)ElementType.MVar) :
                    if (currentMethodScope == null) {
                        //Console.WriteLine("GenericParam with currMeth == null");
                        return GenericParam.AnonMethPar(blob.ReadCompressedNum());
                        //throw new Exception("No current method set");
                    }
                    return currentMethodScope.GetGenericParam((int)blob.ReadCompressedNum());
                default: break;
            }
            return null;
        }

Same methods

PEReader::GetBlobType ( uint blobIx ) : Type

Usage Example

Пример #1
0
 internal override void Resolve(PEReader buff)
 {
     buff.InsertInTable(MDTable.TypeSpec,Row,buff.GetBlobType(blobIx));
     this.unresolved = false;
 }