Subversion Repositories Kolibri OS

Rev

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