Subversion Repositories Kolibri OS

Rev

Rev 6613 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. (*
  2.     Copyright 2016, 2017 Anton Krotov
  3.  
  4.     This program is free software: you can redistribute it and/or modify
  5.     it under the terms of the GNU Lesser General Public License as published by
  6.     the Free Software Foundation, either version 3 of the License, or
  7.     (at your option) any later version.
  8.  
  9.     This program is distributed in the hope that it will be useful,
  10.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.     GNU Lesser General Public License for more details.
  13.  
  14.     You should have received a copy of the GNU Lesser General Public License
  15.     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  16. *)
  17.  
  18. MODULE API;
  19.  
  20. IMPORT sys := SYSTEM;
  21.  
  22. VAR
  23.  
  24.   Alloc*: PROCEDURE [winapi] (uFlags, dwBytes: INTEGER): INTEGER;
  25.   Free*: PROCEDURE [winapi] (hMem: INTEGER): INTEGER;
  26.   MessageBoxA*: PROCEDURE [winapi] (hWnd, lpText, lpCaption, uType: INTEGER): INTEGER;
  27.   ExitProcess*: PROCEDURE [winapi] (code: INTEGER);
  28.   ExitThread*: PROCEDURE [winapi] (code: INTEGER);
  29.   GetCurrentThreadId*: PROCEDURE [winapi] (): INTEGER;
  30.   strncmp*: PROCEDURE [cdecl] (a, b, n: INTEGER): INTEGER;
  31.  
  32.   GetProcAddress*: PROCEDURE [winapi] (hModule, name: INTEGER): INTEGER;
  33.   LoadLibraryA*: PROCEDURE [winapi] (name: INTEGER): INTEGER;
  34.  
  35. PROCEDURE zeromem*(size, adr: INTEGER);
  36. END zeromem;
  37.  
  38. PROCEDURE DebugMsg*(lpText, lpCaption: INTEGER);
  39. BEGIN
  40.   MessageBoxA(0, lpText, lpCaption, 16)
  41. END DebugMsg;
  42.  
  43. PROCEDURE GetProc(name: ARRAY OF CHAR; hMOD, adr: INTEGER);
  44. VAR H: INTEGER;
  45. BEGIN
  46.   H := GetProcAddress(hMOD, sys.ADR(name[0]));
  47.   ASSERT(H # 0);
  48.   sys.PUT(adr, H);
  49. END GetProc;
  50.  
  51. PROCEDURE _NEW*(size: INTEGER): INTEGER;
  52.   RETURN Alloc(64, size)
  53. END _NEW;
  54.  
  55. PROCEDURE _DISPOSE*(p: INTEGER): INTEGER;
  56.   RETURN Free(p)
  57. END _DISPOSE;
  58.  
  59. PROCEDURE init* (esp: INTEGER);
  60. VAR lib: INTEGER;
  61. BEGIN
  62.   sys.GET(esp, GetProcAddress);
  63.   sys.GET(esp + 4, LoadLibraryA);
  64.  
  65.   lib := LoadLibraryA(sys.ADR("kernel32.dll"));
  66.   GetProc("ExitProcess", lib, sys.ADR(ExitProcess));
  67.   GetProc("ExitThread", lib, sys.ADR(ExitThread));
  68.   GetProc("GetCurrentThreadId", lib, sys.ADR(GetCurrentThreadId));
  69.   GetProc("GlobalAlloc", lib, sys.ADR(Alloc));
  70.   GetProc("GlobalFree", lib, sys.ADR(Free));
  71.  
  72.   lib := LoadLibraryA(sys.ADR("msvcrt.dll"));
  73.   GetProc("strncmp", lib, sys.ADR(strncmp));
  74.  
  75.   lib := LoadLibraryA(sys.ADR("user32.dll"));
  76.   GetProc("MessageBoxA", lib, sys.ADR(MessageBoxA));
  77. END init;
  78.  
  79. END API.