Make(delphi) ver(4.03 build 181) Add(MainForm,2953706,21,105) { } Add(InlineCode,2747598,154,203) { Code=#74:{*************************************************************************|74: * *|74: * DLL linking is provided by Benjamin Rosseaux, www.0ok.de, *|74: * mailto:benjamin@0ok.de *|74: * *|74: * This DLL Loader code is coyyrighted: (C) 2004, Benjamin Rosseaux *|74: * *|75: *************************************************************************}|0:|15:unit HiAsmUnit;|0:|9:interface|0:|32:uses Windows, Kol, Share, Debug;|0:|5:const|35: IMPORTED_NAME_OFFSET = $00000002;|35: IMAGE_ORDINAL_FLAG32 = $80000000;|35: IMAGE_ORDINAL_MASK32 = $0000FFFF;|0:|25: RTL_CRITSECT_TYPE = 0;|25: RTL_RESOURCE_TYPE = 1;|0:|25: DLL_PROCESS_ATTACH = 1;|25: DLL_THREAD_ATTACH = 2;|25: DLL_THREAD_DETACH = 3;|25: DLL_PROCESS_DETACH = 0;|0:|26: IMAGE_SIZEHEADER = 20;|0:|45: IMAGE_FILE_RELOCS_STRIPPED = $0001;|45: IMAGE_FILE_EXECUTABLE_IMAGE = $0002;|45: IMAGE_FILE_LINE_NUMS_STRIPPED = $0004;|45: IMAGE_FILE_LOCAL_SYMS_STRIPPED = $0008;|45: IMAGE_FILE_AGGRESIVE_WS_TRIM = $0010;|45: IMAGE_FILE_byteS_REVERSED_LO = $0080;|45: IMAGE_FILE_32BIT_MACHINE = $0100;|45: IMAGE_FILE_DEBUG_STRIPPED = $0200;|45: IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = $0400;|45: IMAGE_FILE_NET_RUN_FROM_SWAP = $0800;|45: IMAGE_FILE_SYSTEM = $1000;|45: IMAGE_FILE_DLL = $2000;|45: IMAGE_FILE_UP_SYSTEM_ONLY = $4000;|45: IMAGE_FILE_byteS_REVERSED_HI = $8000;|0:|45: IMAGE_FILE_MACHINE_UNKNOWN = $0000;|45: IMAGE_FILE_MACHINE_I386 = $014C;|45: IMAGE_FILE_MACHINE_R3000 = $0162;|45: IMAGE_FILE_MACHINE_R4000 = $0166;|45: IMAGE_FILE_MACHINE_R10000 = $0168;|45: IMAGE_FILE_MACHINE_ALPHA = $0184;|45: IMAGE_FILE_MACHINE_POWERPC = $01F0;|0:|42: IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16;|0:|41: IMAGE_SUBSYSTEM_UNKNOWN = 0;|41: IMAGE_SUBSYSTEM_NATIVE = 1;|41: IMAGE_SUBSYSTEM_WINDOWS_GUI = 2;|41: IMAGE_SUBSYSTEM_WINDOWS_CUI = 3;|41: IMAGE_SUBSYSTEM_OS2_CUI = 5;|41: IMAGE_SUBSYSTEM_POSIX_CUI = 7;|41: IMAGE_SUBSYSTEM_RESERVED = 8;|0:|41: IMAGE_DIRECTORY_ENTRY_EXPORT = 0;|41: IMAGE_DIRECTORY_ENTRY_IMPORT = 1;|41: IMAGE_DIRECTORY_ENTRY_RESOURCE = 2;|41: IMAGE_DIRECTORY_ENTRY_EXCEPTION = 3;|41: IMAGE_DIRECTORY_ENTRY_SECURITY = 4;|41: IMAGE_DIRECTORY_ENTRY_BASERELOC = 5;|41: IMAGE_DIRECTORY_ENTRY_DEBUG = 6;|41: IMAGE_DIRECTORY_ENTRY_COPYRIGHT = 7;|41: IMAGE_DIRECTORY_ENTRY_GLOBALPTR = 8;|41: IMAGE_DIRECTORY_ENTRY_TLS = 9;|42: IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG = 10;|42: IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT = 11;|42: IMAGE_DIRECTORY_ENTRY_IAT = 12;|0:|41: IMAGE_SIZEOF_SHORT_NAME = 8;|0:|47: IMAGE_SCN_TYIMAGE_REG = $00000000;|47: IMAGE_SCN_TYIMAGE_DSECT = $00000001;|47: IMAGE_SCN_TYIMAGE_NOLOAD = $00000002;|47: IMAGE_SCN_TYIMAGE_GROUP = $00000004;|47: IMAGE_SCN_TYIMAGE_NO_PAD = $00000008;|47: IMAGE_SCN_TYIMAGE_COPY = $00000010;|47: IMAGE_SCN_CNT_CODE = $00000020;|47: IMAGE_SCN_CNT_INITIALIZED_DATA = $00000040;|47: IMAGE_SCN_CNT_UNINITIALIZED_DATA = $00000080;|47: IMAGE_SCN_LNK_OTHER = $00000100;|47: IMAGE_SCN_LNK_INFO = $00000200;|47: IMAGE_SCN_TYIMAGE_OVER = $00000400;|47: IMAGE_SCN_LNK_REMOVE = $00000800;|47: IMAGE_SCN_LNK_COMDAT = $00001000;|47: IMAGE_SCN_MEM_PROTECTED = $00004000;|47: IMAGE_SCN_MEM_FARDATA = $00008000;|47: IMAGE_SCN_MEM_SYSHEAP = $00010000;|47: IMAGE_SCN_MEM_PURGEABLE = $00020000;|47: IMAGE_SCN_MEM_16BIT = $00020000;|47: IMAGE_SCN_MEM_LOCKED = $00040000;|47: IMAGE_SCN_MEM_PRELOAD = $00080000;|47: IMAGE_SCN_ALIGN_1byteS = $00100000;|47: IMAGE_SCN_ALIGN_2byteS = $00200000;|47: IMAGE_SCN_ALIGN_4byteS = $00300000;|47: IMAGE_SCN_ALIGN_8byteS = $00400000;|47: IMAGE_SCN_ALIGN_16byteS = $00500000;|47: IMAGE_SCN_ALIGN_32byteS = $00600000;|47: IMAGE_SCN_ALIGN_64byteS = $00700000;|47: IMAGE_SCN_LNK_NRELOC_OVFL = $01000000;|47: IMAGE_SCN_MEM_DISCARDABLE = $02000000;|47: IMAGE_SCN_MEM_NOT_CACHED = $04000000;|47: IMAGE_SCN_MEM_NOT_PAGED = $08000000;|47: IMAGE_SCN_MEM_SHARED = $10000000;|47: IMAGE_SCN_MEM_EXECUTE = $20000000;|47: IMAGE_SCN_MEM_READ = $40000000;|47: IMAGE_SCN_MEM_WRITE = $80000000;|0:|37: IMAGE_REL_BASED_ABSOLUTE = 0;|37: IMAGE_REL_BASED_HIGH = 1;|37: IMAGE_REL_BASED_LOW = 2;|37: IMAGE_REL_BASED_HIGHLOW = 3;|37: IMAGE_REL_BASED_HIGHADJ = 4;|37: IMAGE_REL_BASED_MIPS_JMPADDR = 5;|37: IMAGE_REL_BASED_SECTION = 6;|37: IMAGE_REL_BASED_REL32 = 7;|0:|37: IMAGE_REL_BASED_MIPS_JMPADDR16 = 9;|37: IMAGE_REL_BASED_IA64_IMM64 = 9;|38: IMAGE_REL_BASED_DIR64 = 10;|38: IMAGE_REL_BASED_HIGH3ADJ = 11;|0:|41: PAGE_NOACCESS = $0001;|41: PAGE_READONLY = $0002;|41: PAGE_READWRITE = $0004;|41: PAGE_WRITECOPY = $0008;|41: PAGE_EXECUTE = $0010;|41: PAGE_EXECUTE_READ = $0020;|41: PAGE_EXECUTE_READWRITE = $0040;|41: PAGE_EXECUTE_WRITECOPY = $0080;|41: PAGE_GUARD = $0100;|41: PAGE_NOCACHE = $0200;|0:|45: MEM_COMMIT = $00001000;|45: MEM_RESERVE = $00002000;|45: MEM_DECOMMIT = $00004000;|45: MEM_RELEASE = $00008000;|45: MEM_FREE = $00010000;|45: MEM_private = $00020000;|45: MEM_MAPPED = $00040000;|45: MEM_RESET = $00080000;|45: MEM_TOP_DOWN = $00100000;|45: SEC_FILE = $00800000;|45: SEC_IMAGE = $01000000;|45: SEC_RESERVE = $04000000;|45: SEC_COMMIT = $08000000;|45: SEC_NOCACHE = $10000000;|45: MEM_IMAGE = SEC_IMAGE;|6: |4:type|0:|22: PPointer = ^Pointer;|0:|25: PCardinal = ^Cardinal;|26: PPCardinal = ^PCardinal;|0:|17: PWord = ^word;|18: PPWord = ^PWord;|0:|21: HINST = cardinal;|18: HMODULE = HINST;|0:|27: PWordArray = ^TwordArray;|67: TwordArray = Array[0..(2147483647 div SizeOf(word)) - 1] of word;|0:|35: PCardinalArray = ^TCardinalArray;|79: TCardinalArray = Array[0..(2147483647 div SizeOf(cardinal)) - 1] of cardinal;|0:|37: PImageDOSHeader = ^TImageDOSHeader;|33: TImageDOSHeader = packed record|20: Signature: word;|20: PartPag: word;|20: PageCnt: word;|20: ReloCnt: word;|20: HdrSize: word;|20: MinMem: word;|20: MaxMem: word;|20: ReloSS: word;|20: ExeSP: word;|20: ChkSum: word;|20: ExeIP: word;|20: ReloCS: word;|20: Tabloff: word;|20: Overlay: word;|42: Reserved: packed Array[0..3] of word;|20: OEMID: word;|20: OEMInfo: word;|42: Reserved2: packed Array[0..9] of word;|24: LFAoffset: cardinal;|6: end;|0:|26: TISHMisc = packed record|17: case integer of|35: 0: (PhysicalAddress: cardinal);|31: 1: (VirtualSize: cardinal);|6: end;|0:|49: PImageExportDirectory = ^TImageExportDirectory;|39: TImageExportDirectory = packed record|36: Characteristics: cardinal;|36: TimeDateStamp: cardinal;|32: MajorVersion: word;|32: MinorVersion: word;|36: Name: cardinal;|36: Base: cardinal;|36: NUMBEROFfunctions: cardinal;|36: NUMBEROFNames: cardinal;|38: Addressoffunctions: PPCardinal;|38: AddressofNames: PPCardinal;|34: AddressofNameOrdinals: PPWord;|6: end;|0:|45: PImageSectionHeader = ^TImageSectionHeader;|37: TImageSectionHeader = packed record|79: Name: packed Array[0..IMAGE_SIZEOF_SHORT_NAME - 1] of byte;|35: Misc: TISHMisc;|35: VirtualAddress: cardinal;|35: SizeOfRawData: cardinal;|35: PointerToRawData: cardinal;|35: PointerToRelocations: cardinal;|35: PointerToLinenumbers: cardinal;|31: NUMBEROFRelocations: word;|31: NUMBEROFLinenumbers: word;|35: Characteristics: cardinal;|6: end;|0:|47: PImageSectionHeaders = ^TImageSectionHeaders;|107: TImageSectionHeaders = Array[0..(2147483647 div SizeOf(TImageSectionHeader)) - 1] of TImageSectionHeader;|0:|45: PImageDataDirectory = ^TImageDataDirectory;|37: TImageDataDirectory = packed record|29: VirtualAddress: cardinal;|29: Size: cardinal;|6: end;|0:|39: PImageFileHeader = ^TImageFileHeader;|34: TImageFileHeader = packed record|31: Machine: word;|31: NUMBEROFSections: word;|35: TimeDateStamp: cardinal;|35: PointerToSymbolTable: cardinal;|35: NUMBEROFSymbols: cardinal;|31: SizeOfOptionalHeader: word;|31: Characteristics: word;|6: end;|0:|47: PImageOptionalHeader = ^TImageOptionalHeader;|38: TImageOptionalHeader = packed record|38: Magic: word;|38: MajorLinkerVersion: byte;|38: MinorLinkerVersion: byte;|42: SizeOfCode: cardinal;|42: SizeOfInitializedData: cardinal;|42: SizeOfUninitializedData: cardinal;|42: AddressofEntryPoint: cardinal;|42: BaseofCode: cardinal;|42: BaseofData: cardinal;|42: ImageBase: cardinal;|42: SectionAlignment: cardinal;|42: FileAlignment: cardinal;|38: MajorOperatingSystemVersion: word;|38: MinorOperatingSystemVersion: word;|38: MajorImageVersion: word;|38: MinorImageVersion: word;|38: MajorSubsystemVersion: word;|38: MinorSubsystemVersion: word;|42: Win32VersionValue: cardinal;|42: SizeOfImage: cardinal;|42: SizeOfHeaders: cardinal;|42: CheckSum: cardinal;|38: Subsystem: word;|38: DllCharacteristics: word;|42: SizeOfStackReserve: cardinal;|42: SizeOfStackCommit: cardinal;|42: SizeOfHeapReserve: cardinal;|42: SizeOfHeapCommit: cardinal;|42: LoaderFlags: cardinal;|42: NUMBEROFRvaAndSizes: cardinal;|110: DataDirectory: packed Array[0..IMAGE_NUMBEROF_DIRECTORY_ENTRIES - 1] of TImageDataDirectory;|6: end;|0:|37: PImageNTHeaders = ^TImageNTHeaders;|33: TImageNTHeaders = packed record|29: Signature: cardinal;|37: FileHeader: TImageFileHeader;|41: OptionalHeader: TImageOptionalHeader;|6: end;|0:|51: PImageImportDescriptor = ^TImageImportDescriptor;|40: TImageImportDescriptor = packed record|33: OriginalFirstThunk: cardinal;|33: TimeDateStamp: cardinal;|33: ForwarderChain: cardinal;|33: Name: cardinal;|33: FirstThunk: cardinal;|6: end;|0:|47: PImageBaseRelocation = ^TImageBaseRelocation;|38: TImageBaseRelocation = packed record|29: VirtualAddress: cardinal;|29: SizeOfBlock: cardinal;|6: end;|0:|37: PImageThunkData = ^TImageThunkData;|33: TImageThunkData = packed record|30: Forwarderstring: cardinal;|30: Funktion: cardinal;|30: Ordinal: cardinal;|30: AddressofData: cardinal;|6: end;|0:|23: PSection = ^TSection;|26: TSection = packed record|29: Base: Pointer;|30: RVA: cardinal;|30: Size: cardinal;|30: Characteristics: cardinal;|6: end;|0:|32: TSections = Array of TSection;|0:|106: TDLLEntryProc = function(hinstDLL: HMODULE; dwReason: cardinal; lpvReserved: Pointer): boolean; stdcall;|0:|29: TNameOrID = (niName, niID);|0:|27: TExternalLibrary = record|26: LibraryName: string;|25: LibraryHandle: HINST;|6: end;|0:|48: TExternalLibrarys = Array of TExternalLibrary;|0:|43: PDLLfunctionImport = ^TDLLfunctionImport;|29: TDLLfunctionImport = record|23: NameOrID:TNameOrID;|17: Name: string;|18: ID: integer;|6: end;|0:|27: PDLLImport = ^TDLLImport;|21: TDLLImport = record|26: LibraryName: string;|25: LibraryHandle: HINST;|47: Entries: Array of TDLLfunctionImport;|6: end;|0:|33: TImports = Array of TDLLImport;|0:|43: PDLLfunctionExport = ^TDLLfunctionExport;|29: TDLLfunctionExport = record|28: Name: string;|29: Index: integer;|29: FunctionPointer: Pointer;|6: end;|0:|41: TExports = Array of TDLLfunctionExport;|0:|28: TExportTreeLink = Pointer;|0:|37: PExportTreeNode = ^TExportTreeNode;|26: TExportTreeNode = record|35: TheChar: Char;|46: Link: TExportTreeLink;|38: LinkExist: boolean;|46: Prevoius, Next, Up, Down: PExportTreeNode;|6: end;|0:|86://====================================================================================|0:|29: THiAsmClass = class(TDebug)|9: private|0:|8: public|0:|6: end;|0:|86://====================================================================================|0:|21: TExportTree = Class|9: private|25: Root:PExportTreeNode;|8: public|23: constructor Create;|33: destructor Destroy; override;|19: procedure Dump;|71: function Add(FunctionName: string; Link: TExportTreeLink): boolean;|51: function Delete(FunctionName: string): boolean;|76: function Find(FunctionName: string; var Link: TExportTreeLink): boolean;|6: end;|0:|20: TDLLLoader = Class|9: private|23: ImageBase: Pointer;|28: ImageBaseDelta: integer;|27: DLLProc: TDLLEntryProc;|44: ExternalLibraryArray: TExternalLibrarys;|26: ImportArray: TImports;|26: ExportArray: TExports;|24: Sections: TSections;|28: ExportTree: TExportTree;|63: function FindExternalLibrary(LibraryName: string): integer;|63: function LoadExternalLibrary(LibraryName: string): integer;|66: function GetExternalLibraryHandle(LibraryName: string): HINST;|8: public|23: constructor Create;|33: destructor Destroy; override;|44: function Load(Stream: PStream): boolean;|29: function Unload: boolean;|55: function FindExport(FunctionName: string): Pointer;|65: function FindExportPerIndex(functionIndex: integer): Pointer;|37: function GetExportList: PStrList;|6: end;|0:|14:implementation|0:|38:function StrToInt(S: string): integer;|3:var|12: C:integer;|5:begin|18: Val(S,Result,C);|4:end;|0:|60:function CreateExportTreeNode(AChar: Char): PExportTreeNode;|5:begin|42: GetMem(Result, SizeOf(TExportTreeNode));|27: Result^.TheChar := AChar;|22: Result^.Link := nil;|29: Result^.LinkExist := false;|26: Result^.Prevoius := nil;|22: Result^.Next := nil;|20: Result^.Up := nil;|22: Result^.Down := nil;|4:end;|0:|55:procedure DestroyExportTreeNode(Node: PExportTreeNode);|5:begin|34: if not Assigned(Node) then exit;|36: DestroyExportTreeNode(Node^.Next);|36: DestroyExportTreeNode(Node^.Down);|16: FreeMem(Node);|4:end;|0:|86://================================= TExportTree ======================================|0:|31:constructor TExportTree.Create;|5:begin|19: inherited Create;|14: Root := nil;|4:end;|0:|31:destructor TExportTree.Destroy;|5:begin|30: DestroyExportTreeNode(Root);|20: inherited Destroy;|4:end;|0:|27:procedure TExportTree.Dump;|3:var|16: Ident:integer;|0:|44: procedure DumpNode(Node: PExportTreeNode);|5: var|29: SubNode: PExportTreeNode;|35: IdentCounter,IdentOld: integer;|7: begin|47: for IdentCounter:=1 to Ident do write(' ');|25: write(Node^.TheChar);|22: IdentOld := Ident;|26: SubNode := Node^.Next;|30: while Assigned(SubNode) do|9: begin|29: write(SubNode.TheChar);|48: if not Assigned(SubNode^.Next) then break;|17: inc(Ident);|29: SubNode:=SubNode^.Next;|8: end;|12: writeln;|15: inc(Ident);|50: while Assigned(SubNode) and (SubNode<>Node) do|9: begin|62: if Assigned(SubNode^.Down) then DumpNode(SubNode^.Down);|33: SubNode:=SubNode^.Prevoius;|17: dec(Ident);|8: end;|20: Ident:=IdentOld;|54: if Assigned(Node^.Down) then DumpNode(Node^.Down);|6: end;|5:begin|13: Ident := 0;|17: DumpNode(Root);|4:end;|0:|79:function TExportTree.Add(FunctionName: string; Link: TExportTreeLink): boolean;|3:var|51: StringLength, Position, PositionCounter: integer;|43: NewNode, LastNode, Node: PExportTreeNode;|29: StringChar, NodeChar: Char;|5:begin|18: Result := false;|39: StringLength := length(FunctionName);|26: if StringLength > 0 then|7: begin|20: LastNode := nil;|17: Node := Root;|40: for Position := 1 to StringLength do|9: begin|43: StringChar := FunctionName[Position];|28: if Assigned(Node) then|11: begin|34: NodeChar := Node^.TheChar;|37: if NodeChar = StringChar then|13: begin|27: LastNode := Node;|29: Node := Node^.Next;|11: end|12: else|13: begin|67: while (NodeChar < StringChar) and Assigned(Node^.Down) do|15: begin|31: Node := Node^.Down;|38: NodeChar := Node^.TheChar;|14: end;|39: if NodeChar = StringChar then|15: begin|29: LastNode := Node;|31: Node := Node^.Next;|13: end|14: else|15: begin|56: NewNode := CreateExportTreeNode(StringChar);|41: if NodeChar < StringChar then|17: begin|42: NewNode^.Down := Node^.Down;|34: NewNode^.Up := Node;|75: if Assigned(NewNode^.Down) then NewNode^.Down^.Up := NewNode;|50: NewNode^.Prevoius := Node^.Prevoius;|34: Node^.Down:=NewNode;|15: end|46: else if NodeChar > StringChar then|17: begin|36: NewNode^.Down := Node;|38: NewNode^.Up := Node^.Up;|73: if Assigned(NewNode^.Up) then NewNode^.Up^.Down := NewNode;|48: NewNode^.Prevoius:=Node^.Prevoius;|47: if not Assigned(NewNode^.Up) then|19: begin|51: if Assigned(NewNode^.Prevoius) then|50: NewNode^.Prevoius^.Next:=NewNode|20: else|34: Root := NewNode;|18: end;|34: Node^.Up := NewNode;|16: end;|32: LastNode := NewNode;|35: Node := LastNode^.Next;|14: end;|12: end;|9: end|10: else|11: begin|58: for PositionCounter := Position to StringLength do|13: begin|73: NewNode := CreateExportTreeNode(FunctionName[PositionCounter]);|36: if Assigned(LastNode) then|15: begin|42: NewNode^.Prevoius := LastNode;|38: LastNode^.Next := NewNode;|39: LastNode := LastNode^.Next;|13: end|41: else if not Assigned(Root) then|15: begin|28: Root := NewNode;|29: LastNode := Root;|14: end;|12: end;|14: break;|10: end;|8: end;|58: if Assigned(LastNode) and not LastNode^.LinkExist then|9: begin|29: LastNode^.Link := Link;|34: LastNode^.LinkExist := true;|21: Result := true;|8: end;|6: end;|4:end;|0:|59:function TExportTree.Delete(FunctionName: string): boolean;|3:var|34: StringLength, Position: integer;|24: Node: PExportTreeNode;|29: StringChar, NodeChar: Char;|5:begin|18: Result := false;|39: StringLength := length(FunctionName);|26: if StringLength > 0 then|7: begin|17: Node := Root;|40: for Position := 1 to StringLength do|9: begin|43: StringChar := FunctionName[Position];|28: if Assigned(Node) then|11: begin|34: NodeChar := Node^.TheChar;|66: while (NodeChar <> StringChar) and Assigned(Node^.Down) do|13: begin|29: Node := Node^.Down;|36: NodeChar := Node^.TheChar;|12: end;|35: if NodeChar=StringChar then|13: begin|63: if (Position = StringLength) and Node^.LinkExist then|15: begin|37: Node^.LinkExist := false;|27: Result := true;|18: break;|14: end;|29: Node := Node^.Next;|12: end;|9: end|10: else|14: break;|8: end;|6: end;|4:end;|0:|31:function UpChar(C: Char): Char;|5:begin|35: if (C >= 'a') and (C <= 'z') then|32: Result := Char(byte(C) - 32)|6: else|16: Result := C;|4:end;|0:|84:function TExportTree.Find(FunctionName: string; var Link: TExportTreeLink): boolean;|3:var|34: StringLength, Position: integer;|24: Node: PExportTreeNode;|29: StringChar, NodeChar: Char;|5:begin|18: Result := false;|39: StringLength := length(FunctionName);|26: if StringLength > 0 then|7: begin|17: Node := Root;|38: for Position:=1 to StringLength do|9: begin|43: StringChar := FunctionName[Position];|28: if Assigned(Node) then|11: begin|34: NodeChar := Node^.TheChar;|80: while (UpChar(NodeChar)<>UpChar(StringChar)) and Assigned(Node^.Down) do|13: begin|29: Node := Node^.Down;|36: NodeChar := Node^.TheChar;|12: end;|51: if UpChar(NodeChar)=UpChar(StringChar) then|13: begin|61: if (Position=StringLength) and Node^.LinkExist then|15: begin|31: Link := Node^.Link;|27: Result := true;|18: break;|14: end;|29: Node := Node^.Next;|12: end;|9: end|10: else|14: break;|8: end;|6: end;|4:end;|0:|86://================================== TDLLLoader ======================================|0:|30:constructor TDLLLoader.Create;|5:begin|19: inherited Create;|19: ImageBase := nil;|17: DLLProc := nil;|30: ExternalLibraryArray := nil;|21: ImportArray := nil;|21: ExportArray := nil;|18: Sections := nil;|20: ExportTree := nil;|4:end;|0:|30:destructor TDLLLoader.Destroy;|5:begin|33: if @DLLProc <> nil then Unload;|50: if Assigned(ExportTree) then ExportTree.Destroy;|20: inherited Destroy;|4:end;|0:|70:function TDLLLoader.FindExternalLibrary(LibraryName: string): integer;|3:var|12: I: integer;|5:begin|15: Result := -1;|51: for I := 0 to length(ExternalLibraryArray) - 1 do|7: begin|60: if ExternalLibraryArray[I].LibraryName = LibraryName then|8: begin|15: Result:=I;|10: exit;|7: end;|6: end;|4:end;|0:|70:function TDLLLoader.LoadExternalLibrary(LibraryName: string): integer;|5:begin|45: Result := FindExternalLibrary(LibraryName);|20: if Result < 0 then|7: begin|43: Result := length(ExternalLibraryArray);|69: Setlength(ExternalLibraryArray,length(ExternalLibraryArray) + 1);|60: ExternalLibraryArray[Result].LibraryName := LibraryName;|82: ExternalLibraryArray[Result].LibraryHandle := LoadLibrary(PChar(LibraryName));|6: end;|4:end;|0:|76:function TDLLLoader.GetExternalLibraryHandle(LibraryName: string): cardinal;|3:var|13: I: integer;|5:begin|14: Result := 0;|51: for I := 0 to length(ExternalLibraryArray) - 1 do|7: begin|59: if ExternalLibraryArray[I].LibraryName=LibraryName then|9: begin|54: Result := ExternalLibraryArray[I].LibraryHandle;|11: exit;|8: end;|6: end;|4:end;|0:|51:function TDLLLoader.Load(Stream: PStream): boolean;|3:var|34: ImageDOSHeader: TImageDOSHeader;|34: ImageNTHeaders: TImageNTHeaders;|23: OldProtect: cardinal;|0:|50: function ConvertPointer(RVA: cardinal): Pointer;|5: var|15: I: integer;|7: begin|18: Result := nil;|41: for I := 0 to length(Sections) - 1 do|9: begin|85: if (RVA<(Sections[I].RVA + Sections[I].Size)) and (RVA >= Sections[I].RVA) then|11: begin|100: Result := Pointer(cardinal((RVA - cardinal(Sections[I].RVA)) + cardinal(Sections[I].Base)));|13: exit;|10: end;|8: end;|6: end;|2: |37: function ReadImageHeaders: boolean;|7: begin|20: Result := false;|27: if Stream.Size > 0 then|9: begin|59: FillChar(ImageNTHeaders,SizeOf(TImageNTHeaders), #0);|99: if Stream.Read(ImageDOSHeader, SizeOf(TImageDOSHeader)) <> SizeOf(TImageDOSHeader) then exit;|53: if ImageDOSHeader.Signature <> $5A4D then exit;|104: if Stream.Seek(ImageDOSHeader.LFAoffset, spBegin) <> cardinal(ImageDOSHeader.LFAoffset) then exit;|95: if Stream.Read(ImageNTHeaders.Signature, SizeOf(cardinal)) <> SizeOf(cardinal) then exit;|57: if ImageNTHeaders.Signature <> $00004550 then exit;|112: if Stream.Read(ImageNTHeaders.FileHeader, SizeOf(TImageFileHeader)) <> SizeOf(TImageFileHeader) then exit;|61: if ImageNTHeaders.FileHeader.Machine <> $14C then exit;|160: if Stream.Read(ImageNTHeaders.OptionalHeader, ImageNTHeaders.FileHeader.SizeOfOptionalHeader) <> ImageNTHeaders.FileHeader.SizeOfOptionalHeader then exit;|21: Result := true;|8: end;|6: end;|0:|36: function InitializeImage: boolean;|5: var|25: SectionBase: Pointer;|25: OldPosition: integer;|7: begin|20: Result := false;|58: if ImageNTHeaders.FileHeader.NUMBEROFSections > 0 then|9: begin|104: ImageBase:=VirtualAlloc(nil,ImageNTHeaders.OptionalHeader.SizeOfImage, MEM_RESERVE,PAGE_NOACCESS);|86: ImageBaseDelta := cardinal(ImageBase) - ImageNTHeaders.OptionalHeader.ImageBase;|117: SectionBase := VirtualAlloc(ImageBase, ImageNTHeaders.OptionalHeader.SizeOfHeaders, MEM_COMMIT,PAGE_READWRITE);|37: OldPosition := Stream.Position;|30: Stream.Seek(0, spBegin);|77: Stream.Read(SectionBase^, ImageNTHeaders.OptionalHeader.SizeOfHeaders);|107: VirtualProtect(SectionBase, ImageNTHeaders.OptionalHeader.SizeOfHeaders, PAGE_READONLY, @OldProtect);|40: Stream.Seek(OldPosition, spBegin);|21: Result := true;|8: end;|6: end;|0:|33: function ReadSections: boolean;|5: var|15: I: integer;|33: Section: TImageSectionHeader;|41: SectionHeaders: PImageSectionHeaders;|7: begin|20: Result := false;|58: if ImageNTHeaders.FileHeader.NUMBEROFSections > 0 then|9: begin|104: GetMem(SectionHeaders, ImageNTHeaders.FileHeader. NUMBEROFSections * SizeOf(TImageSectionHeader));|202: if Stream.Read(SectionHeaders^, (ImageNTHeaders.FileHeader.NUMBEROFSections * SizeOf(TImageSectionHeader))) <> (ImageNTHeaders.FileHeader.NUMBEROFSections * SizeOf(TImageSectionHeader)) then exit;|70: Setlength(Sections, ImageNTHeaders.FileHeader.NUMBEROFSections);|69: for I := 0 to ImageNTHeaders.FileHeader.NUMBEROFSections - 1 do|11: begin|38: Section := SectionHeaders^[I];|49: Sections[I].RVA :=Section.VirtualAddress;|50: Sections[I].Size := Section.SizeOfRawData;|103: if Sections[I].Size 0 then|13: begin|57: Stream.Seek(Section.PointerToRawData, spBegin);|112: if Stream.Read(Sections[I].Base^, Section.SizeOfRawData) <> cardinal(Section.SizeOfRawData) then exit;|12: end;|10: end;|30: FreeMem(SectionHeaders);|21: Result := true;|8: end;|6: end;|2: |39: function ProcessRelocations: boolean;|5: var|23: Relocations: PChar;|23: Position: cardinal;|41: BaseRelocation: PImageBaseRelocation;|18: Base: Pointer;|34: NUMBEROFRelocations: cardinal;|27: Relocation: PWordArray;|31: RelocationCounter: integer;|31: RelocationPointer: Pointer;|29: RelocationType: cardinal;|7: begin|108: if ImageNTHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress <> 0 then|9: begin|22: Result := false;|129: Relocations := ConvertPointer(ImageNTHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress);|20: Position := 0;|133: while Assigned(Relocations) and (Position 0 then|9: begin|131: ImportDescriptor := ConvertPointer(ImageNTHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);|40: if Assigned(ImportDescriptor) then|11: begin|34: Setlength(ImportArray, 0);|44: while ImportDescriptor^.Name <> 0 do|13: begin|57: Name := ConvertPointer(ImportDescriptor^.Name);|57: Setlength(ImportArray,length(ImportArray) + 1);|36: LoadExternalLibrary(Name);|61: DLLImport := @ImportArray[length(ImportArray) - 1];|41: DLLImport^.LibraryName := Name;|69: DLLImport^.LibraryHandle := GetExternalLibraryHandle(Name);|36: DLLImport^.Entries := nil;|53: if ImportDescriptor^.TimeDateStamp = 0 then|69: ThunkData := ConvertPointer(ImportDescriptor^.FirstThunk)|14: else|78: ThunkData := ConvertPointer(ImportDescriptor^.OriginalFirstThunk);|34: while ThunkData^ <> 0 do|15: begin|72: Setlength(DLLImport^.Entries, length(DLLImport^.Entries)+1);|85: DLLfunctionImport := @DLLImport^.Entries[length(DLLImport^.Entries) - 1];|62: if (ThunkData^ and IMAGE_ORDINAL_FLAG32) <> 0 then|17: begin|50: DLLfunctionImport^.NameOrID := niID;|75: DLLfunctionImport^.ID := ThunkData^ and IMAGE_ORDINAL_MASK32;|44: DLLfunctionImport^.Name := '';|118: FunctionPointer := GetProcAddress(DLLImport^.LibraryHandle, PChar(ThunkData^ and IMAGE_ORDINAL_MASK32));|15: end|16: else|17: begin|82: Name := ConvertPointer(cardinal(ThunkData^) + IMPORTED_NAME_OFFSET);|52: DLLfunctionImport^.NameOrID := niName;|41: DLLfunctionImport^.ID := 0;|46: DLLfunctionImport^.Name := Name;|79: FunctionPointer := GetProcAddress(DLLImport^.LibraryHandle,Name);|16: end;|52: PPointer(Thunkdata)^ := FunctionPointer;|27: inc(ThunkData);|14: end;|32: inc(ImportDescriptor);|12: end;|10: end;|8: end;|17: Result:=true;|6: end;|1: |36: function ProtectSections: boolean;|5: var|15: I: integer;|30: Characteristics: cardinal;|20: Flags: cardinal;|7: begin|20: Result := false;|58: if ImageNTHeaders.FileHeader.NUMBEROFSections > 0 then|9: begin|69: for I := 0 to ImageNTHeaders.FileHeader.NUMBEROFSections - 1 do|11: begin|55: Characteristics := Sections[I].Characteristics;|19: Flags := 0;|64: if (Characteristics and IMAGE_SCN_MEM_EXECUTE) <> 0 then|13: begin|63: if (Characteristics and IMAGE_SCN_MEM_READ) <> 0 then|15: begin|66: if (Characteristics and IMAGE_SCN_MEM_WRITE) <> 0 then|54: Flags := Flags or PAGE_EXECUTE_READWRITE|16: else|50: Flags := Flags or PAGE_EXECUTE_READ;|13: end|69: else if (Characteristics and IMAGE_SCN_MEM_WRITE) <> 0 then|52: Flags := Flags or PAGE_EXECUTE_WRITECOPY|14: else|41: Flags:=Flags or PAGE_EXECUTE;|11: end|66: else if (Characteristics and IMAGE_SCN_MEM_READ) <> 0 then|13: begin|64: if (Characteristics and IMAGE_SCN_MEM_WRITE) <> 0 then|44: Flags := Flags or PAGE_READWRITE|14: else|42: Flags:=Flags or PAGE_READONLY;|11: end|65: else if (Characteristics and IMAGE_SCN_MEM_WRITE)<>0 then|42: Flags := Flags or PAGE_WRITECOPY|12: else|42: Flags := Flags or PAGE_NOACCESS;|0:|97: if (Characteristics and IMAGE_SCN_MEM_NOT_CACHED) <> 0 then Flags:=Flags or PAGE_NOCACHE;|78: VirtualProtect(Sections[I].Base,Sections[I].Size, Flags, @OldProtect);|10: end;|19: Result:=true;|8: end;|6: end;|1: |38: function InitializeLibrary: boolean;|7: begin|20: Result := false;|82: @DLLProc := ConvertPointer(ImageNTHeaders.OptionalHeader.AddressofEntryPoint);|79: if DLLProc(cardinal(ImageBase),DLL_PROCESS_ATTACH,nil) then Result := true;|6: end;|0:|35: function ProcessExports: boolean;|5: var|15: I: integer;|43: ExportDirectory: PImageExportDirectory;|34: ExportDirectorySize: cardinal;|33: FunctionNamePointer: Pointer;|24: FunctionName: PChar;|34: functionIndexPointer: Pointer;|28: functionIndex: cardinal;|29: FunctionPointer: Pointer;|32: ForwarderCharPointer: PChar;|28: Forwarderstring: string;|29: ForwarderLibrary: string;|34: ForwarderLibraryHandle: HINST;|0:|62: function ParsestringToNumber(Astring: string): cardinal;|9: var|29: CharCounter: integer;|11: begin|20: Result := 0;|54: for CharCounter := 0 to length(Astring) - 1 do|13: begin|52: if Astring[CharCounter] in ['0'..'9'] then|82: Result := (Result * 10) + byte(byte(Astring[CharCounter]) - byte('0'))|14: else|17: exit;|12: end;|10: end;|6: |7: begin|105: if ImageNTHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress <> 0 then|9: begin|0:|39: ExportTree := TExportTree.Create;|130: ExportDirectory := ConvertPointer(ImageNTHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);|39: if Assigned(ExportDirectory) then|11: begin|0:|108: ExportDirectorySize:=ImageNTHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;|63: Setlength(ExportArray, ExportDirectory^.NUMBEROFNames);|59: for I := 0 to ExportDirectory^.NUMBEROFNames - 1 do|13: begin|91: FunctionNamePointer := ConvertPointer(cardinal(ExportDirectory^.AddressofNames));|89: FunctionNamePointer := ConvertPointer(PCardinalArray(FunctionNamePointer)^[I]);|46: FunctionName := FunctionNamePointer;|99: functionIndexPointer := ConvertPointer(cardinal(ExportDirectory^.AddressofNameOrdinals));|64: functionIndex := PWordArray(functionIndexPointer)^[I];|91: FunctionPointer := ConvertPointer(cardinal(ExportDirectory^.Addressoffunctions));|93: FunctionPointer := ConvertPointer(PCardinalArray(FunctionPointer)^[functionIndex]);|46: ExportArray[I].Name := FunctionName;|48: ExportArray[I].Index := functionIndex;|70: if (cardinal(ExportDirectory) '.' do inc(ForwarderCharPointer);|85: ForwarderLibrary:=COPY(Forwarderstring, 1, POS('.',Forwarderstring) - 1);|50: LoadExternalLibrary(ForwarderLibrary);|81: ForwarderLibraryHandle := GetExternalLibraryHandle(ForwarderLibrary);|47: if ForwarderCharPointer^ = '#' then|17: begin|40: inc(ForwarderCharPointer);|54: Forwarderstring := ForwarderCharPointer;|91: ForwarderCharPointer := ConvertPointer(ParsestringToNumber(Forwarderstring));|54: Forwarderstring := ForwarderCharPointer;|15: end|16: else|17: begin|54: Forwarderstring := ForwarderCharPointer;|111: ExportArray[I].FunctionPointer := GetProcAddress(ForwarderLibraryHandle, PChar(Forwarderstring));|16: end;|13: end|14: else|62: ExportArray[I].FunctionPointer := FunctionPointer;|77: ExportTree.Add(ExportArray[I].Name,ExportArray[I].FunctionPointer);|12: end;|10: end;|8: end;|17: Result:=true;|6: end;|0:|5:begin|18: Result := false;|26: if Assigned(Stream) then|7: begin|27: Stream.Seek(0, spBegin);|25: if Stream.Size>0 then|9: begin|30: if ReadImageHeaders then|11: begin|31: if InitializeImage then|13: begin|30: if ReadSections then|15: begin|38: if ProcessRelocations then|17: begin|36: if ProcessImports then|19: begin|39: if ProtectSections then|21: begin|43: if InitializeLibrary then|23: begin|56: if ProcessExports then Result:=true;|22: end;|20: end;|18: end;|16: end;|14: end;|12: end;|10: end;|8: end;|6: end;|4:end;|0:|36:function TDLLLoader.Unload: boolean;|3:var|16: I, J: integer;|5:begin|18: Result := false;|80: if @DLLProc <> nil then DLLProc(cardinal(ImageBase), DLL_PROCESS_DETACH, nil);|39: for I := 0 to length(Sections) - 1 do|7: begin|38: if Assigned(Sections[I].Base) then|52: VirtualFree(Sections[I].Base, 0, MEM_RELEASE);|6: end;|25: Setlength(Sections, 0);|51: for I := 0 to length(ExternalLibraryArray) - 1 do|7: begin|46: ExternalLibraryArray[I].LibraryName := '';|55: FreeLibrary(ExternalLibraryArray[I].LibraryHandle);|6: end;|37: Setlength(ExternalLibraryArray, 0);|42: for I := 0 to length(ImportArray) - 1 do|7: begin|55: for J := 0 to length(ImportArray[I].Entries) - 1 do|43: ImportArray[I].Entries[J].Name := '';|41: Setlength(ImportArray[I].Entries, 0);|6: end;|28: Setlength(ImportArray, 0);|69: for I := 0 to length(ExportArray) - 1 do ExportArray[I].Name := '';|28: Setlength(ExportArray, 0);|41: VirtualFree(ImageBase, 0, MEM_RELEASE);|30: if Assigned(ExportTree) then|7: begin|23: ExportTree.Destroy;|22: ExportTree := nil;|6: end;|4:end;|0:|62:function TDLLLoader.FindExport(FunctionName: string): Pointer;|3:var|13: I: integer;|5:begin|16: Result := nil;|30: if Assigned(ExportTree) then|40: ExportTree.Find(FunctionName,Result)|6: else|7: begin|44: for I := 0 to length(ExportArray) - 1 do|9: begin|67: //if ExportArray[I].Name=FunctionName then begin lstrcmpi|75: if lstrcmpi(pChar(ExportArray[I].Name), pChar(FunctionName)) = 0 then|11: begin|49: Result := ExportArray[I].FunctionPointer;|13: exit;|10: end;|8: end;|6: end;|4:end;|0:|72:function TDLLLoader.FindExportPerIndex(functionIndex: integer): Pointer;|3:var|13: I: integer;|5:begin|16: Result := nil;|42: for I := 0 to length(ExportArray) - 1 do|7: begin|48: if ExportArray[I].Index = functionIndex then|9: begin|47: Result := ExportArray[I].FunctionPointer;|11: exit;|8: end;|6: end;|4:end;|0:|44:function TDLLLoader.GetExportList: PStrList;|3:var|13: I: integer;|5:begin|23: Result := NewStrList;|75: for I := 0 to length(ExportArray) - 1 do Result.Add(ExportArray[I].Name);|21: Result.Sort(false);|4:end;|0:|4:end.| }