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

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

?? fixup.pas

?? DeDe3.2004源碼
?? PAS
字號:
unit FixUp;
(*
The DCU Fixup information module of the DCU32INT utility by Alexei Hmelnov.
----------------------------------------------------------------------------
E-Mail: alex@monster.icc.ru
http://monster.icc.ru/~alex/DCU/
----------------------------------------------------------------------------

See the file "readme.txt" for more details.

------------------------------------------------------------------------
                             IMPORTANT NOTE:
This software is provided 'as-is', without any expressed or implied warranty.
In no event will the author be held liable for any damages arising from the
use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented, you must not
   claim that you wrote the original software.
2. Altered source versions must be plainly marked as such, and must not
   be misrepresented as being the original software.
3. This notice may not be removed or altered from any source
   distribution.
*)
interface

uses
  DCU_In;

const {Fixup type constants}
  fxAddr = 1;
  fxJmpAddr = 2;
  fxDataAddr = 3;

  fxStart20 = 3;
  fxEnd20 = 4;
  fxStart30 = 5;
  fxEnd30 = 6;

  fxStart: Byte = fxStart30;
  fxEnd: Byte = fxEnd30;

const
  FixOfsMask = $FFFFFF;

type

TByte4=array[0..3]of Byte;

PFixupRec = ^TFixupRec;
TFixupRec = record
  OfsF: integer;{Low 3 bytes - ofs, high 1 byte - B1}
  Ndx: TNDX;
end ;

PFixupTbl = ^TFixupTbl;
TFixupTbl = array[Word] of TFixupRec;

{Fixup variables and procedures used in the DAsmUtil and DCU32 units}
var
  CodeBase,CodeEnd: PChar;
  CodeStart, FixUpEnd: PChar;
  FixUnit: Pointer{TUnit};

procedure SetCodeRange(ACodeStart,ACodeBase: Pointer; ABlSz: Cardinal);
procedure SetFixupInfo(ACodeFixupCnt: integer; ACodeFixups: PFixupRec;
  AFixUnit: Pointer{TUnit});
procedure ClearFixupInfo;

type
  TFixupState = record
    FixCnt: integer;
    Fix: PFixupRec;
    FixEnd: Pointer;
    FixUnit: Pointer {TUnit};
  end ;

  TFixupMemState = record
    Fx: TFixupState;
    CodeBase,CodeEnd: PChar;
    CodeStart: PChar;
  end ;

procedure SaveFixupState(var S:TFixupState);
procedure RestoreFixupState(const S:TFixupState);

procedure SaveFixupMemState(var S:TFixupMemState);
procedure RestoreFixupMemState(const S:TFixupMemState);

procedure SkipFixups(Ofs: Cardinal);

function ChkNoFixupIn(CodePtr:PChar; Size: Cardinal): boolean;
function GetFixupFor(CodePtr:PChar; Size: Cardinal; StartOk: boolean;
  var Fix: PFixupRec): boolean;

function FixupOk(Fix: PFixupRec): boolean;
function ReportFixup(Fix: PFixupRec): boolean;

implementation

uses
  DCU_Out, DCU32;

var
  CodeFixupCnt: integer;
  CodeFixups: PFixupRec;

procedure SetCodeRange(ACodeStart,ACodeBase: Pointer; ABlSz: Cardinal);
begin
  ClearFixupInfo;
  CodeStart := ACodeStart;
  CodeBase := ACodeBase;
  CodeEnd := CodeBase+ABlSz;
  FixUpEnd := CodeBase;
end ;

procedure SetFixupInfo(ACodeFixupCnt: integer; ACodeFixups: PFixupRec;
  AFixUnit: Pointer{TUnit});
begin
  CodeFixupCnt := ACodeFixupCnt;
  CodeFixups := ACodeFixups;
  FixUnit := AFixUnit;
end ;

procedure ClearFixupInfo;
begin
  CodeFixupCnt := 0;
  CodeFixups := Nil;
  FixUnit := Nil;
end ;

procedure SaveFixupState(var S:TFixupState);
begin
  S.FixCnt := CodeFixupCnt;
  S.Fix := CodeFixups;
  S.FixEnd := FixUpEnd;
  S.FixUnit := FixUnit;
end ;

procedure RestoreFixupState(const S:TFixupState);
begin
  CodeFixupCnt := S.FixCnt;
  CodeFixups := S.Fix;
  FixUpEnd := S.FixEnd;
  FixUnit := S.FixUnit;
end ;

procedure SaveFixupMemState(var S:TFixupMemState);
begin
  SaveFixupState(S.Fx);
  S.CodeBase := CodeBase;
  S.CodeEnd := CodeEnd;
  S.CodeStart := CodeStart;
end ;

procedure RestoreFixupMemState(const S:TFixupMemState);
begin
  RestoreFixupState(S.Fx);
  CodeBase := S.CodeBase;
  CodeEnd := S.CodeEnd;
  CodeStart := S.CodeStart;
end ;

procedure SetFixEnd;
{Set FixUpEnd to the max(FixUpEnd,CodeFixups^.Ofs+4)
 if CodeFixups^.F is not fxStart or fxEnd}
var
  CurOfs: Cardinal;
  F: Byte;
  EP: PChar;
begin
  CurOfs := CodeFixups^.OfsF;
  F := TByte4(CurOfs)[3];
  CurOfs := CurOfs and FixOfsMask;
  if F<fxStart then begin
    EP := CodeStart+CurOfs+4;
    if EP>FixUpEnd then
      FixUpEnd := EP;
  end ;
end ;

procedure SkipFixups(Ofs: Cardinal);
{Move CodeFixups to the next fixup with Offset>=Ofs}
begin
  while CodeFixupCnt>0 do begin
    if (CodeFixups^.OfsF and FixOfsMask)>=Ofs then
      Break;
    SetFixEnd;
    Inc(CodeFixups);
    Dec(CodeFixupCnt);
  end ;
end ;

function CurFixup(Ofs: Cardinal): PFixupRec;
{If CodeFixups^ has the Offset=Ofs return it, else - Nil}
begin
  if (CodeFixupCnt>0)and((CodeFixups^.OfsF and FixOfsMask)=Ofs) then
    Result := CodeFixups
  else
    Result := Nil;
end ;

function NextFixup(Ofs: Cardinal): boolean;
{Move CodeFixups to the next fixup, Return true
 if the next fixup has the Offset<=Ofs}
begin
  Result := false;
  if CodeFixupCnt<=0 then
    Exit;
  SetFixEnd;
  Inc(CodeFixups);
  Dec(CodeFixupCnt);
  if CodeFixupCnt<=0 then
    Exit;
  if (CodeFixups^.OfsF and FixOfsMask)>Ofs then
    Exit;
  Result := true;
end ;

function ChkNoFixupIn(CodePtr:PChar; Size: Cardinal): boolean;
{Result: false - something wrong, true - Ok}
var
  Fx: PFixupRec;
  F: Byte;
  Ofs: Cardinal;
begin
  Result := false;
  if CodePtr+Size>CodeEnd then
    Exit {Memory block finished};
  Ofs := CodePtr-CodeStart;
  SkipFixups(Ofs+Size);
  if CodePtr<FixUpEnd then
    Exit {Code can't be inside FixUp};
  Result := true;
end ;

function GetFixupFor(CodePtr:PChar; Size: Cardinal; StartOk: boolean;
  var Fix: PFixupRec): boolean;
{Result: false - something wrong, true - Ok, but Fix may be Nil and may be not}
var
  Fx: PFixupRec;
  F: Byte;
  Ofs: Cardinal;
begin
  Result := false;
  Fix := Nil;
  if CodePtr+Size>CodeEnd then
    Exit {Memory block finished};
  Ofs := CodePtr-CodeStart;
  if Size=4 {All fixups are 4 byte} then begin
    SkipFixups(Ofs);
    if CodePtr<FixUpEnd then
      Exit {Can't intersect with some previous FixUp};
    repeat
      Fx := CurFixup(Ofs);
      if Fx=Nil then
        Break;
      F := TByte4(Fx^.OfsF)[3];
      if F<fxStart then begin
        if Fix<>Nil then
          Exit {Paranoic - can't happen, but i trust no one};
       {The difference between fxAddr and fxJmpAddr could also be taken into account}
        Fix := Fx;
       end
      else if not((F=fxStart)and StartOk) then
        Exit {Can't be inside a command};
    until not NextFixup(Ofs);
    FixUpEnd := CodePtr {Dummy - for the next test};
  end ;
  SkipFixups(Ofs+Size);
  if CodePtr<FixUpEnd then
    Exit {Immed data can't intersect [another] FixUp};
  Result := true;
end ;

function FixupOk(Fix: PFixupRec): boolean;
begin
  Result := (Fix<>Nil)and(FixUnit<>Nil);
end ;

function ReportFixup(Fix: PFixupRec): boolean;
begin
  Result := false;
  if (Fix=Nil)or(FixUnit=Nil) then
    Exit;
  Inc(AuxLevel);
  PutSFmt('K%x ',[TByte4(Fix^.OfsF)[3]]);
  Dec(AuxLevel);
  PutS(TUnit(FixUnit).GetAddrStr(Fix^.NDX,true));
  Result := true;
end ;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人免费黄色在线| 日韩精品五月天| 欧美国产欧美综合| 久久精品人人做人人爽97| 日韩你懂的在线播放| 日韩免费视频一区二区| 欧美一区三区二区| 精品国产乱码久久久久久牛牛| 欧美日韩国产精品成人| 91麻豆精品国产91久久久使用方法 | 1区2区3区欧美| 亚洲国产激情av| 亚洲天堂网中文字| 亚洲自拍偷拍综合| 五月天婷婷综合| 久久99九九99精品| 成人精品在线视频观看| 91猫先生在线| 欧美精品在线观看播放| 精品国产乱码久久久久久影片| 久久一区二区三区国产精品| 久久久久9999亚洲精品| 国产精品高清亚洲| 天堂一区二区在线免费观看| 黄网站免费久久| 欧美三级韩国三级日本三斤| 欧美男男青年gay1069videost| 日韩欧美一区在线观看| 欧美国产禁国产网站cc| 亚洲午夜电影在线| 九九九精品视频| 色综合久久天天| 欧美xxxxx牲另类人与| 亚洲视频狠狠干| 麻豆视频一区二区| 99久久精品情趣| 日韩片之四级片| 中文字幕一区av| 免费xxxx性欧美18vr| 99国产精品99久久久久久| jlzzjlzz亚洲日本少妇| 在线观看国产日韩| 久久亚洲综合av| 五月天网站亚洲| 国产69精品久久99不卡| 6080国产精品一区二区| 最新国产の精品合集bt伙计| 国内欧美视频一区二区| 99视频精品在线| 久久综合国产精品| 免费久久99精品国产| 在线观看免费亚洲| 中文字幕佐山爱一区二区免费| 国产一区二区免费视频| 欧美一区二区黄色| 亚洲福利视频三区| 在线中文字幕一区| 亚洲欧美区自拍先锋| 国产成人在线视频免费播放| 日韩欧美国产综合在线一区二区三区| 亚洲一区二区三区四区五区黄| 成人高清免费在线播放| 欧美国产成人在线| 国产精品白丝av| 久久久精品综合| 国产综合一区二区| 2020国产成人综合网| 美国一区二区三区在线播放| 欧美电影一区二区| 日本一区中文字幕| 4hu四虎永久在线影院成人| 一片黄亚洲嫩模| 色哟哟一区二区| 亚洲精品国产视频| 欧美视频你懂的| 午夜不卡av在线| 91精品国产品国语在线不卡| 日产欧产美韩系列久久99| 欧美一区二区三区电影| 精品综合久久久久久8888| xnxx国产精品| 欧美视频一区二区三区四区| 亚洲国产综合色| 91精品欧美一区二区三区综合在| 爽爽淫人综合网网站| 欧美一区二区三区公司| 国内精品嫩模私拍在线| 国产精品久久久久婷婷二区次| 成人av综合在线| 亚洲小说欧美激情另类| 欧美剧情片在线观看| 国产一区二区在线看| 中文字幕av在线一区二区三区| 国产99精品国产| 一区二区三区中文字幕| 欧美巨大另类极品videosbest| 久久不见久久见免费视频7| 国产嫩草影院久久久久| 91美女片黄在线观看| 日韩高清中文字幕一区| 久久亚洲影视婷婷| 91成人免费在线| 激情综合网天天干| 亚洲欧美国产三级| 精品国产青草久久久久福利| 成人精品国产免费网站| 日本伊人色综合网| 1024精品合集| 日韩欧美的一区| 91久久精品一区二区| 麻豆精品视频在线观看视频| 国产精品第四页| 欧美成人在线直播| 色哟哟一区二区| 国产成人精品亚洲日本在线桃色 | 亚洲妇女屁股眼交7| 精品日韩在线观看| 欧美日韩综合在线| 懂色av一区二区三区免费观看 | 成人av网站免费| 视频一区在线播放| 中文字幕在线观看不卡视频| 欧美成人乱码一区二区三区| 色综合天天综合网天天狠天天| 久久国产精品第一页| 亚洲一区二区三区四区的| 国产精品电影院| 国产欧美日韩在线视频| 欧美一卡二卡在线观看| 91丨国产丨九色丨pron| 福利视频网站一区二区三区| 日韩福利视频导航| 亚洲一二三区不卡| 久久精品人人爽人人爽| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 国产成人99久久亚洲综合精品| 亚洲视频在线观看三级| 日本一区二区三区四区| 26uuu精品一区二区在线观看| 欧美一区二区私人影院日本| 色中色一区二区| 91理论电影在线观看| 国产成人午夜视频| 日日欢夜夜爽一区| 亚洲一区二区三区小说| 中文字幕视频一区二区三区久| 久久五月婷婷丁香社区| 日韩一卡二卡三卡四卡| 欧美日韩国产精品自在自线| 色av一区二区| 欧美日韩一区二区三区在线看| 风流少妇一区二区| 福利一区二区在线| 99这里只有久久精品视频| 99精品视频在线免费观看| 成人国产精品免费网站| 丁香激情综合五月| eeuss国产一区二区三区| 国产一区二区三区黄视频 | 色婷婷综合久久久中文一区二区 | 亚洲欧洲综合另类在线| 亚洲三级电影全部在线观看高清| 亚洲天堂2014| 午夜精品一区二区三区电影天堂 | 日韩高清不卡在线| 蜜桃av一区二区三区| 精品一区二区三区久久久| 激情综合网av| 成人精品视频一区二区三区| 91一区二区在线观看| 欧美三区在线视频| www国产精品av| 中文字幕在线播放不卡一区| 亚洲福利一二三区| 激情国产一区二区| 97久久久精品综合88久久| 欧美久久久久中文字幕| 精品成人一区二区三区四区| 国产精品免费久久| 午夜精品aaa| 91尤物视频在线观看| 欧美日韩免费一区二区三区| 精品国产91久久久久久久妲己| 欧美国产丝袜视频| 亚洲综合另类小说| 麻豆精品视频在线观看免费| 99国产精品国产精品久久| 欧美综合久久久| 日韩欧美国产三级| 亚洲欧洲性图库| 免费欧美日韩国产三级电影| 国产在线日韩欧美| 欧洲国产伦久久久久久久| 精品国产区一区| 丝袜脚交一区二区| 色94色欧美sute亚洲13| 久久久久久久久久看片| 日日摸夜夜添夜夜添国产精品| av一区二区久久| 久久久精品免费免费|