亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? vars.pas

?? SrcDecompiler is about creating a Delphi program decompiler. The program is written for Delphi 4 or
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
unit Vars;

interface

uses
  Classes, Procs, PEFile, dcDecomps, dcUnits, dcTypeIntf;

type
  TVarConst  = set of (vtVar, vtConst);
  TDecompType = (dtNormal, dtResString);

  { TVar }

  TVar = class(TDecompItem)
  private
    FInitValue: Pointer;
    FVarConst: TVarConst;
    FDecomps: TList;
    FDecompTypes: TList;
    FOffsets: TList;
    FName: string;
    FRefVar: Boolean;
    FVarSize: Integer;
    FContainType: Boolean;
    FType: IdcType;
    FAppendBefore: TAppendType;
    FAppendAfter: TAppendType;
    procedure SetInitValue(Value: Pointer);
    function GetDecompCount: Integer;
    function GetDecompItem(Index: Integer): TDecompItem;
    function GetDecompType(Index: Integer): TDecompType;
    function GetOffset(Index: Integer): Integer;
    function GetDeclaration: string;
    procedure SetVarSize(Value: Integer);
    procedure SetAppendBefore(Value: TAppendType);
    procedure SetAppendAfter(Value: TAppendType);
  protected
    procedure SetSize(Value: Integer); override;
  public
    constructor Create(Collection: TCollection); override;
    destructor Destroy; override;
    procedure AddDecomp(Decomp: TDecompItem; Offset: Integer; DecompType: TDecompType);
    function IsRefAddress(AAddress: PChar): Boolean; override;

    property InitValue: Pointer read FInitValue write SetInitValue;
    property VarConst: TVarConst read FVarConst write FVarConst;
    property DecompCount: Integer read GetDecompCount;
    property DecompItems[Index: Integer]: TDecompItem read GetDecompItem;
    property DecompItemTypes[Index: Integer]: TDecompType read GetDecompType;
    property OffSet[Index: Integer]: Integer read GetOffset;
    property Name: string read FName write FName;
    property ContainType: Boolean read FContainType write FContainType;
    property VarDecl: string read GetDeclaration;
    property VarSize: Integer read FVarSize write SetVarSize;
    property AType: IdcType read FType;
    property AppendBefore: TAppendType read FAppendBefore write SetAppendBefore;
    property AppendAfter: TAppendType read FAppendAfter write SetAppendAfter;
    // If RefVar is true a reference to the value of the var must be replaced by
    // a reference to the address and there shouldn't by a ref direct to the var
    // and the size must be 4, exactly on the decompitem.
    property RefVar: Boolean read FRefVar write FRefVar;
  end;

  { TVarInfos }

  TVarInfos = class(TDecompCollection)
  private
    function GetItem(Index: Integer): TVar;
    procedure SetItem(Index: Integer; Value: TVar);
  public
    procedure LoadVars;
    procedure LoadFixups;
    procedure LoadInitVars;
    procedure DeterUnits;
    procedure GenerateNames;
    function IndexOfName(Name: string): Integer;
    function IndexOfAddress(AAddress: PChar): Integer;
    procedure LoadVar(Address: PChar; Name: string; AUnit: TUnit);
    property Items[Index: Integer]: TVar read GetItem write SetItem; default;
  end;

implementation

uses
  {$IFOPT D+}dcDebug, Dialogs,{$ENDIF}
  PEFileClass, SysUtils, SysVars, NameMangling;

type
  PWord = ^Word;
  PCardinal = ^Cardinal;

{ TVar }

constructor TVar.Create(Collection: TCollection);
begin
  inherited Create(Collection);
  FVarConst := [vtVar, vtConst];
  FContainType := True;
  FType := CreateType;
end;

destructor TVar.Destroy;
begin
  FreeMem(FInitValue);
  FDecomps.Free;
  FDecompTypes.Free;
  FOffsets.Free;
  inherited Destroy;
end;

procedure TVar.SetInitValue(Value: Pointer);
begin
  Move(Value^, FInitValue^, VarSize);
end;

function TVar.GetDecompCount: Integer;
begin
  if FDecomps = nil then
    Result := 0
  else
    Result := FDecomps.Count;
end;

function TVar.GetDecompItem(Index: Integer): TDecompItem;
begin
  if FDecomps = nil then
    raise EDecompilerError.Create('Var has no decomps');
  Result := TDecompItem(FDecomps[Index]);
end;

function TVar.GetDecompType(Index: Integer): TDecompType;
begin
  if FDecompTypes = nil then
    raise EDecompilerError.Create('Var has no decomps');
  Result := TDecompType(FDecompTypes[Index]);
end;

function TVar.GetOffset(Index: Integer): Integer;
begin
  if FOffsets = nil then
    raise EDecompilerError.Create('Var has no decomps');
  Result := Integer(FOffsets[Index]);
end;

procedure TVar.SetSize(Value: Integer);
begin
  inherited SetSize(Value);
  VarSize := Value;
end;

procedure TVar.AddDecomp(Decomp: TDecompItem; Offset: Integer; DecompType: TDecompType);
begin
  if FDecomps = nil then
  begin
    FDecomps := TList.Create;
    FOffsets := TList.Create;
    FDecompTypes := TList.Create;
  end;
  FDecomps.Add(Decomp);
  FDecompTypes.Add(Pointer(DecompType));
  AddReq(Decomp, nil);
  FOffsets.Add(Pointer(Offset));
end;

function TVar.GetDeclaration: string;

  function GetIntValue(Address: PChar; Size: Integer): Cardinal;
  begin
    case Size of
      1: Result := PByte(Address)^;
      2: Result := PWord(Address)^;
      4: Result := PCardinal(Address)^;
      else
        raise EDecompilerError.CreateFmt('Unknown integer value %d', [Size]);
    end;
  end;

  function GetTypeName: string;
  const
    TypeName: array[1..4] of string = ('Byte', 'Word', '', 'Cardinal');

    function GetArrayName(ArraySize: Integer = 4): string;
    var
      I: Integer;
    begin
      if Size mod ArraySize = 0 then
      begin
        Result := Format('array[0..%d] of %s', [Size div ArraySize -1, TypeName[ArraySize]]);
        if Address < PEFileClass.BSS then
        begin
          Result := Format('%s = (%u', [Result, GetIntValue(InitValue, ArraySize)]);
          for I := 1 to VarSize div ArraySize -1 do
            Result := Format('%s, %u', [Result, GetIntValue(PChar(InitValue) + I * ArraySize, ArraySize)]);
          Result := Result + ')';
        end;
      end
      else
        Result := GetArrayName(ArraySize div 2);
    end;

  type
    TXType = (xtByte, xtWord, xtCardinal, xtString, xtPointer, xtArray);
    // if XType is xtArray then the XType after it is the the xType of the array and
    // the Value after that is the number of elements.
  var
    Types: TList;

    procedure AddVarTypes(ASize: Integer);
    var
      I: Integer;
   begin
      if ASize mod 4 = 0 then
        for I := 0 to ASize div 4 -1 do
          Types.Add(Pointer(xtCardinal))
      else if ASize mod 2 = 0 then
        for I := 0 to ASize div 2 -1 do
          Types.Add(Pointer(xtWord))
      else
        for I := 0 to ASize -1 do
          Types.Add(Pointer(xtByte))
    end;

    function GetXTypeSize(Index: Integer): Integer;
    const
      XTypeSize: array[TXType] of Integer =
        (1, 2, 4, 4, 4, 33);
    begin
      if Types[Index] = Pointer(xtArray) then
        Result := Integer(Types[Index +1]) * GetXTypeSize(Index + 1)
      else
        Result := XTypeSize[TXType(Types[Index])];
    end;

    function GetXTypeName(Index: Integer): string;
    const
      XTypeName: array[TXType] of string =
        ('Byte', 'Word', 'Cardinal', 'string', 'Pointer', 'Error');
    begin
      if Types[Index] = Pointer(xtArray) then
        Result := Format('array[0..%d] of %s', [Integer(Types[Index + 2])-1,
          GetXTypeName(Index + 1)])
      else
        Result := XTypeName[TXType(Types[Index])];
    end;

    function GetXTypeInitName(Index: Integer; Offset: Integer): string;
    var
      I: Integer;
    begin
      case TXType(Types[Index]) of
        xtByte: Result := IntToStr(PByte(PChar(InitValue) + Offset)^);
        xtWord: Result := IntToStr(PWord(PChar(InitValue) + Offset)^);
        xtCardinal: Result := IntToStr(PWord(PChar(InitValue) + Offset)^);
        xtPointer:
          begin
            for I := 0 to DecompCount -1 do
              if Self.Offset[I] = Offset then
              begin
                if DecompItems[I] is TProc then
                  Result := '@' + TProc(DecompItems[I]).Name
                else if DecompItems[I] is TVar then
                  Result := '@' + TVar(DecompItems[I]).Name
                else if DecompItems[I] is TStringInfo then
                  Result := '@' + TStringInfo(DecompItems[I]).Name
                else if DecompItems[I] is TClassInfo then
                  Result := TClassInfo(DecompItems[I]).AClass.ClassName
                else
                  raise EDecompilerError.CreateFmt('Undefined const, %s', [DecompItems[I].ClassName]);
              end;
          end;
        xtString:
          begin
            for I := 0 to DecompCount -1 do
              if Self.Offset[I] = Offset then
              begin
                Result := EnhQuotedStr((DecompItems[I] as TStringInfo).Value);
                Break;
              end;
          end;
        xtArray:
          begin
            Result := '(';
            for I := 0 to Integer(Types[Index + 2]) -1 do
              Result := Result + GetXTypeInitName(Index + 1, Offset + I * GetXTypeSize(Index +1)) + ', ';
            SetLength(Result, Length(Result) -1);
            Result[Length(Result)] := ')';
          end;
      end;
    end;

  var
    I, J: Integer;
  begin
    if DecompCount = 0 then
    begin
      // If there are known decomp items referenced use a array of a byte, Word or dword.
      if Address < PEFileClass.BSS then
        Result := '%s = %u'
      else
        Result := '%s';
      if VarSize in [1, 2, 4] then
        Result := Format(Result, [TypeName[VarSize], GetIntValue(InitValue, VarSize)])
      else
        Result := GetArrayName;
    end
    else
    begin
      Types := TList.Create;
      try
        // Create a list of the var Types.
        I := 0;
        J := 0;
        while J <> VarSize do
        begin
          if I >= DecompCount then
          begin
            // No decomp item after J
            AddVarTypes(VarSize - J);
            J := Size;
          end
          else if Offset[I] <> J then
          begin
            // No decomp item untile Offset[I]
            AddVarTypes(Offset[I] - J);
            J := OffSet[I];
          end
          else
          begin
            // Decomp item at J.
            if DecompItemTypes[I] = dtResString then
              Types.Add(Pointer(xtString))
            else
            begin
              if (DecompItems[I] is TStringInfo) and
                 (TStringInfo(DecompItems[I]).StringType in [stAnsiString]) then
                Types.Add(Pointer(xtString))
              else
                Types.Add(Pointer(xtPointer));
            end;
            Inc(J, 4);
            Inc(I);
          end;
        end;

        // Replace a row of Types with xtArray
        I := 0;
        while I < Types.Count -2 do
        begin
          if Types[I] = Types[I+1] then
          begin
            J := I+2;
            while (J < Types.Count) and (Types[J] = Types[I])  do
              Inc(J);
            Types[I] := Pointer(xtArray);
            Types.Insert(I + 2, Pointer(J - I));
            I := I + 3;
            while (I < Types.Count) and (Types[I] = Types[I-2]) do
              Types.Delete(I);
          end
          else
            Inc(I);
        end;

        // Create a record using the Types.
        if (Types.Count = 1) or
           ((Types.Count = 3) and (Types[0] = Pointer(xtArray))) then
          Result := GetXTypeName(0) + ' = ' + GetXTypeInitName(0, 0)
        else
        begin
          I := 0;
          Result := 'record';
          while I < Types.Count do
          begin

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕人成不卡一区| 国产中文字幕精品| 国产sm精品调教视频网站| 色成人在线视频| 欧美精品一区二区三区一线天视频| 亚洲欧洲另类国产综合| 韩国av一区二区三区在线观看| 91污在线观看| 中文一区一区三区高中清不卡| 午夜精品久久久久久久久| 岛国精品在线观看| 久久精品免费在线观看| 日韩电影免费在线观看网站| 欧美影院精品一区| 综合精品久久久| 丁香婷婷综合激情五月色| 精品久久国产字幕高潮| 亚洲.国产.中文慕字在线| 色综合久久天天| 国产精品久久久久一区二区三区共| 免费看精品久久片| 欧美一区在线视频| 香蕉加勒比综合久久| 欧美三级中文字| 亚洲已满18点击进入久久| av在线播放不卡| 亚洲高清免费一级二级三级| 中文字幕av免费专区久久| 亚洲图片欧美色图| 99re亚洲国产精品| 国产精品精品国产色婷婷| 国产精品1区二区.| 欧美激情一区二区三区在线| 国产成人一区在线| 国产亚洲精品久| 国产成人精品综合在线观看| 国产欧美视频在线观看| 成人午夜视频免费看| 国产精品区一区二区三区| 国产成人精品一区二区三区网站观看| 久久精品在这里| 性做久久久久久免费观看| 国产精品伊人色| 国产蜜臀97一区二区三区| 99久久精品国产精品久久| 国产精品传媒视频| 91麻豆精品秘密| 亚洲人成亚洲人成在线观看图片 | 久久久天堂av| 高清不卡在线观看av| 国产精品―色哟哟| 91黄视频在线观看| 亚洲超丰满肉感bbw| 日韩三级在线观看| 岛国精品在线播放| 亚洲一区二区三区小说| 日韩精品一区二区三区四区视频| 国产成人在线电影| 亚洲午夜激情网站| 2欧美一区二区三区在线观看视频| 国产激情视频一区二区三区欧美| 亚洲素人一区二区| 3d动漫精品啪啪1区2区免费| 精品亚洲aⅴ乱码一区二区三区| 久久美女高清视频| 欧美视频日韩视频| 国产毛片精品视频| 亚洲 欧美综合在线网络| 欧美国产日韩亚洲一区| 欧美色图12p| 国产91丝袜在线观看| 午夜欧美2019年伦理| 欧美国产精品一区二区三区| 欧美精品丝袜中出| 91麻豆国产自产在线观看| 三级欧美韩日大片在线看| 国产欧美日韩在线| 欧美大片国产精品| 欧美日精品一区视频| 成人免费观看视频| 久久狠狠亚洲综合| 亚洲成av人片在线观看无码| 国产精品视频观看| 精品播放一区二区| 69堂亚洲精品首页| 色综合久久久久综合| 国产成a人亚洲| 激情五月婷婷综合| 午夜私人影院久久久久| 亚洲三级免费电影| 国产精品福利一区二区三区| 日韩欧美综合一区| 91精品国产一区二区三区香蕉| 色综合久久99| 成人一二三区视频| 国产乱码精品一区二区三| 狂野欧美性猛交blacked| 亚洲国产综合91精品麻豆| 亚洲欧美在线视频观看| 国产欧美一区二区三区在线老狼| 日韩精品一区在线观看| 欧美一级日韩免费不卡| 欧美日韩一区二区三区视频| 一本到高清视频免费精品| 99久久精品一区| 国产98色在线|日韩| 粉嫩绯色av一区二区在线观看| 久久99精品久久久久久| 免费日本视频一区| 日韩av电影天堂| 美女视频黄a大片欧美| 免费看精品久久片| 久久精品二区亚洲w码| 另类调教123区| 久久99热国产| 国产乱人伦偷精品视频不卡| 国产精品456| 成人精品免费看| 91在线视频网址| 91麻豆国产自产在线观看| 欧美性高清videossexo| 欧美色图12p| 日韩欧美高清一区| 久久久久高清精品| 亚洲婷婷综合色高清在线| 亚洲精品中文在线| 日日摸夜夜添夜夜添国产精品| 亚瑟在线精品视频| 国内精品写真在线观看| 成人综合在线网站| 色婷婷久久一区二区三区麻豆| 欧美性猛片xxxx免费看久爱| 91精品在线一区二区| 精品久久久久香蕉网| 国产精品国产三级国产aⅴ中文| 亚洲精品美国一| 人人狠狠综合久久亚洲| 国产成人av影院| 欧美做爰猛烈大尺度电影无法无天| 欧美性大战xxxxx久久久| 日韩美一区二区三区| 中文字幕不卡在线| 亚洲成a人v欧美综合天堂| 国产乱人伦偷精品视频免下载| 91在线免费看| 日韩欧美一级片| 中文字幕一区二区三区不卡| 日韩和欧美一区二区三区| 国产精品一二一区| 在线精品视频一区二区三四| 日韩三级伦理片妻子的秘密按摩| 国产精品国产a级| 蜜桃久久精品一区二区| 成人91在线观看| 欧美videos大乳护士334| 国产精品网站一区| 青娱乐精品在线视频| 91蜜桃视频在线| 久久综合九色综合欧美98| 亚洲另类在线视频| 国产成都精品91一区二区三 | 91香蕉视频mp4| 制服丝袜日韩国产| 亚洲婷婷国产精品电影人久久| 久久国产欧美日韩精品| 91福利国产成人精品照片| 久久久亚洲高清| 蜜臀精品一区二区三区在线观看 | 欧美日韩1234| 最新国产の精品合集bt伙计| 国产在线精品一区二区| 欧美日韩国产高清一区二区| 国产精品美女一区二区| 久久99精品久久久久| 欧美电影在线免费观看| 亚洲最快最全在线视频| 不卡的av电影| 日本一区二区久久| 久久66热re国产| 日韩欧美高清在线| 青椒成人免费视频| 欧美三日本三级三级在线播放| 亚洲三级理论片| 成人免费观看av| 欧美韩日一区二区三区| 国产成人8x视频一区二区| 久久综合久久久久88| 久久国产剧场电影| 欧美大片拔萝卜| 久久精品国产亚洲高清剧情介绍| 欧美日韩精品欧美日韩精品| 亚洲国产裸拍裸体视频在线观看乱了 | 水野朝阳av一区二区三区| 欧美性视频一区二区三区| 亚洲欧美一区二区三区极速播放 | 亚洲午夜精品一区二区三区他趣| 一本久道久久综合中文字幕| 亚洲精品乱码久久久久久久久| 一本久久精品一区二区| 亚洲伊人伊色伊影伊综合网|