Subversion Repositories Kolibri OS

Rev

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

  1. (*
  2.     BSD 2-Clause License
  3.  
  4.     Copyright (c) 2018-2020, Anton Krotov
  5.     All rights reserved.
  6. *)
  7.  
  8. MODULE API;
  9.  
  10. IMPORT SYSTEM;
  11.  
  12.  
  13. CONST
  14.  
  15.     SectionAlignment = 1000H;
  16.  
  17.     DLL_PROCESS_ATTACH = 1;
  18.     DLL_THREAD_ATTACH  = 2;
  19.     DLL_THREAD_DETACH  = 3;
  20.     DLL_PROCESS_DETACH = 0;
  21.  
  22.  
  23. TYPE
  24.  
  25.     DLL_ENTRY* = PROCEDURE (hinstDLL, fdwReason, lpvReserved: INTEGER);
  26.  
  27.  
  28. VAR
  29.  
  30.     eol*:  ARRAY 3 OF CHAR;
  31.     base*: INTEGER;
  32.     heap:  INTEGER;
  33.  
  34.     process_detach,
  35.     thread_detach,
  36.     thread_attach: DLL_ENTRY;
  37.  
  38.  
  39. PROCEDURE [windows-, "kernel32.dll", "ExitProcess"]    ExitProcess (code: INTEGER);
  40. PROCEDURE [windows-, "kernel32.dll", "ExitThread"]     ExitThread (code: INTEGER);
  41. PROCEDURE [windows-, "kernel32.dll", "GetProcessHeap"] GetProcessHeap (): INTEGER;
  42. PROCEDURE [windows-, "kernel32.dll", "HeapAlloc"]      HeapAlloc (hHeap, dwFlags, dwBytes: INTEGER): INTEGER;
  43. PROCEDURE [windows-, "kernel32.dll", "HeapFree"]       HeapFree(hHeap, dwFlags, lpMem: INTEGER);
  44.  
  45. PROCEDURE [windows-, "user32.dll", "MessageBoxA"]      MessageBoxA (hWnd, lpText, lpCaption, uType: INTEGER): INTEGER;
  46.  
  47.  
  48. PROCEDURE DebugMsg* (lpText, lpCaption: INTEGER);
  49. BEGIN
  50.     MessageBoxA(0, lpText, lpCaption, 16)
  51. END DebugMsg;
  52.  
  53.  
  54. PROCEDURE _NEW* (size: INTEGER): INTEGER;
  55.     RETURN HeapAlloc(heap, 8, size)
  56. END _NEW;
  57.  
  58.  
  59. PROCEDURE _DISPOSE* (p: INTEGER): INTEGER;
  60. BEGIN
  61.     HeapFree(heap, 0, p)
  62.     RETURN 0
  63. END _DISPOSE;
  64.  
  65.  
  66. PROCEDURE init* (reserved, code: INTEGER);
  67. BEGIN
  68.     process_detach := NIL;
  69.     thread_detach  := NIL;
  70.     thread_attach  := NIL;
  71.     eol[0] := 0DX; eol[1] := 0AX; eol[2] := 0X;
  72.     base := code - SectionAlignment;
  73.     heap := GetProcessHeap()
  74. END init;
  75.  
  76.  
  77. PROCEDURE exit* (code: INTEGER);
  78. BEGIN
  79.     ExitProcess(code)
  80. END exit;
  81.  
  82.  
  83. PROCEDURE exit_thread* (code: INTEGER);
  84. BEGIN
  85.     ExitThread(code)
  86. END exit_thread;
  87.  
  88.  
  89. PROCEDURE dllentry* (hinstDLL, fdwReason, lpvReserved: INTEGER): INTEGER;
  90. VAR
  91.     res: INTEGER;
  92.  
  93. BEGIN
  94.     res := 0;
  95.  
  96.     CASE fdwReason OF
  97.     |DLL_PROCESS_ATTACH:
  98.         res := 1
  99.     |DLL_THREAD_ATTACH:
  100.         IF thread_attach # NIL THEN
  101.             thread_attach(hinstDLL, fdwReason, lpvReserved)
  102.         END
  103.     |DLL_THREAD_DETACH:
  104.         IF thread_detach # NIL THEN
  105.             thread_detach(hinstDLL, fdwReason, lpvReserved)
  106.         END
  107.     |DLL_PROCESS_DETACH:
  108.         IF process_detach # NIL THEN
  109.             process_detach(hinstDLL, fdwReason, lpvReserved)
  110.         END
  111.     ELSE
  112.     END
  113.  
  114.     RETURN res
  115. END dllentry;
  116.  
  117.  
  118. PROCEDURE sofinit*;
  119. END sofinit;
  120.  
  121.  
  122. PROCEDURE SetDll* (_process_detach, _thread_detach, _thread_attach: DLL_ENTRY);
  123. BEGIN
  124.     process_detach := _process_detach;
  125.     thread_detach  := _thread_detach;
  126.     thread_attach  := _thread_attach
  127. END SetDll;
  128.  
  129.  
  130. END API.