dxeload.pp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 1999-2000 by Pierre Muller,
  4. member of the Free Pascal development team.
  5. Unit to Load DXE files for Go32V2
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************
  12. }
  13. {$IFNDEF FPC_DOTTEDUNITS}
  14. Unit dxeload;
  15. {$ENDIF FPC_DOTTEDUNITS}
  16. interface
  17. function dxe_load(filename : string) : pointer;
  18. implementation
  19. {$IFDEF FPC_DOTTEDUNITS}
  20. uses
  21. DOSApi.dxetype;
  22. {$ELSE FPC_DOTTEDUNITS}
  23. uses
  24. dxetype;
  25. {$ENDIF FPC_DOTTEDUNITS}
  26. function dxe_load(filename : string) : pointer;
  27. {
  28. Copyright (C) 1995 Charles Sandmann ([email protected])
  29. translated to Free Pascal by Pierre Muller
  30. }
  31. type
  32. { to avoid range check problems }
  33. pointer_array = array[0..maxlongint div sizeof(pointer)-1] of pointer;
  34. tpa = ^pointer_array;
  35. var
  36. dh : dxe_header;
  37. data : PAnsiChar;
  38. f : file;
  39. relocs : tpa;
  40. i : longint;
  41. addr : pcardinal;
  42. begin
  43. dxe_load:=nil;
  44. { open the file }
  45. assign(f,filename);
  46. {$I-}
  47. reset(f,1);
  48. {$I+}
  49. { quit if no file !! }
  50. if ioresult<>0 then
  51. exit;
  52. { load the header }
  53. blockread(f,dh,sizeof(dxe_header),i);
  54. if (i<>sizeof(dxe_header)) or (dh.magic<>DXE_MAGIC) then
  55. begin
  56. close(f);
  57. exit;
  58. end;
  59. { get memory for code }
  60. getmem(data,dh.element_size);
  61. if data=nil then
  62. exit;
  63. { get memory for relocations }
  64. getmem(relocs,dh.nrelocs*sizeof(pointer));
  65. if relocs=nil then
  66. begin
  67. freemem(data,dh.element_size);
  68. exit;
  69. end;
  70. { copy code }
  71. blockread(f,data^,dh.element_size);
  72. blockread(f,relocs^,dh.nrelocs*sizeof(pointer));
  73. close(f);
  74. { relocate internal references }
  75. for i:=0 to dh.nrelocs-1 do
  76. begin
  77. cardinal(addr):=cardinal(data)+cardinal(relocs^[i]);
  78. addr^:=addr^+cardinal(data);
  79. end;
  80. FreeMem(relocs,dh.nrelocs*sizeof(pointer));
  81. dxe_load:=pointer( dh.symbol_offset + cardinal(data));
  82. end;
  83. end.