Windows.ADVAPI32.Mod 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. (* Copyright (c) 1994 - 2000 Emil J. Zeller *)
  2. MODULE ADVAPI32; (** non-portable / source: Windows.ADVAPI32.Mod *) (* ejz *)
  3. IMPORT SYSTEM, Kernel32, Modules, KernelLog; (* ALEX *)
  4. (** This module defines all the Win32 ADVAPI32 APIs used by Oberon. *)
  5. CONST
  6. (** HKEYs *)
  7. HKEYClassesRoot* = LONGINT(080000000H); HKEYCurrentUser* = LONGINT(080000001H);
  8. (** value type *)
  9. RegNone* = 0; RegSZ* = 01H;
  10. (** sam *)
  11. KeyQueryValue* = 0; KeySetValue* = 1; KeyCreateSubKey* = 2; KeyEnumerateSubKeys* = 3; KeyAllAccess* = {19, 18, 17, 16, 5, 4 ,3, 2, 1, 0};
  12. (** options *)
  13. RegOptionNonVolatile* = {};
  14. (** error codes *)
  15. Success* = 0H; ErrorMoreData* = 234;
  16. (* ALEX *)
  17. SC_MANAGER_CREATE_SERVICE* = 0002H;
  18. SC_MANAGER_ALL_ACCESS* = 000F003FH;
  19. SERVICE_ALL_ACCESS* = 000F01FFH;
  20. SERVICE_WIN32_OWN_PROCESS* = 00000010H;
  21. SERVICE_AUTO_START* = 00000002H;
  22. SERVICE_ERROR_NORMAL* = 00000001H;
  23. SERVICE_WIN32* = 30H;
  24. SERVICE_START_PENDING *= 00000002H;
  25. SERVICE_ACCEPT_STOP* = 00000001H;
  26. SERVICE_ACCEPT_SHUTDOWN* = 00000004H;
  27. SERVICE_RUNNING* = 00000004H;
  28. SERVICE_CONTROL_STOP* = 00000001H;
  29. SERVICE_CONTROL_SHUTDOWN* = 00000005H;
  30. SERVICE_STOPPED* = 00000001H;
  31. TYPE
  32. (** Handle to a registry key. *)
  33. HKEY* = ADDRESS;
  34. (* ALEX *)
  35. LPSTR* = ADDRESS;
  36. LPCSTR* = ARRAY OF CHAR;
  37. HWND* = Kernel32.HANDLE;
  38. HINSTANCE* = Kernel32.HINSTANCE;
  39. INT* = LONGINT;
  40. LPCTSTR* = LPCSTR;
  41. SC_HANDLE* = Kernel32.HANDLE;
  42. DWORD* = LONGINT;
  43. LPDWORD* = ADDRESS;
  44. BOOL* = Kernel32.BOOL;
  45. LPSERVICE_MAIN_FUNCTIONA = PROCEDURE {WINAPI} (dwNumServicesArgs: DWORD; VAR lpServiceArgVectors: ARRAY OF CHAR): BOOL;
  46. LPSERVICE_MAIN_FUNCTION* = LPSERVICE_MAIN_FUNCTIONA;
  47. SERVICE_TABLE_ENTRYA = RECORD
  48. lpServiceName*: LPSTR;
  49. lpServiceProc*: LPSERVICE_MAIN_FUNCTIONA;
  50. END;
  51. SERVICE_TABLE_ENTRY* = SERVICE_TABLE_ENTRYA;
  52. LPHANDLER_FUNCTION* = PROCEDURE {WINAPI} (dwControl: DWORD);
  53. SERVICE_STATUS_HANDLE* = Kernel32.HANDLE;
  54. SERVICE_STATUS* = RECORD
  55. dwServiceType*,
  56. dwCurrentState*,
  57. dwControlsAccepted*,
  58. dwWin32ExitCode*,
  59. dwServiceSpecificExitCode*,
  60. dwCheckPoint*,
  61. dwWaitHint*: DWORD;
  62. END;
  63. VAR
  64. (** The GetUserName function retrieves the user name of the current thread. *)
  65. GetUserName-: PROCEDURE {WINAPI} (VAR lpBuffer: ARRAY OF CHAR; VAR nSize: LONGINT): Kernel32.BOOL;
  66. (** The RegCloseKey function releases a handle to the specified key. *)
  67. RegCloseKey-: PROCEDURE {WINAPI} (hKey: HKEY): LONGINT;
  68. (** The RegCreateKeyEx function creates the specified key. *)
  69. RegCreateKeyEx-: PROCEDURE {WINAPI} (hKey: HKEY; lpSubKey: ARRAY OF CHAR; Reserved: LONGINT; lpClass: ARRAY OF CHAR; dwOptions, samDesired: SET; lpSecurityAttributes: ANY; VAR phkResult: HKEY; VAR lpdwDisposition: LONGINT): LONGINT;
  70. (** The RegDeleteKey function deleted a subkey. *)
  71. RegDeleteKey-: PROCEDURE {WINAPI} (hKey: HKEY; lpSubKey: ARRAY OF CHAR): LONGINT;
  72. (** The RegDeleteValue function removes a named value from the specified registry key. *)
  73. RegDeleteValue-: PROCEDURE {WINAPI} (hKey: HKEY; lpValueName: ARRAY OF CHAR): LONGINT;
  74. (** The RegEnumKeyEx function enumerates subkeys of the specified open registry key. *)
  75. RegEnumKeyEx-: PROCEDURE {WINAPI} (hKey: HKEY; dwIndex: LONGINT; VAR lpName: ARRAY OF CHAR; VAR lpcbName: LONGINT; VAR lpReserved: LONGINT; VAR lpClass: ARRAY OF CHAR; VAR lpcbClass: LONGINT; VAR lpftLastWriteTime: Kernel32.FileTime): LONGINT;
  76. (** The RegEnumValue function enumerates the values for the specified open registry key. *)
  77. RegEnumValue-: PROCEDURE {WINAPI} (hKey: HKEY; dwIndex: LONGINT; VAR lpValueName: ARRAY OF CHAR; VAR lpcbValueName: LONGINT; VAR lpReserved, type: LONGINT; VAR lpData: ARRAY OF SYSTEM.BYTE; VAR lpcbData: LONGINT): LONGINT;
  78. (** The RegOpenKeyEx function opens the specified key. *)
  79. RegOpenKeyEx-: PROCEDURE {WINAPI} (hKey: HKEY; lpSubKey: ARRAY OF CHAR; ulOptions: LONGINT; samDesired: SET; VAR phkResult: HKEY): LONGINT;
  80. (** The RegQueryValueEx function retrieves the type and data for a specified value name associated with an
  81. open registry key. *)
  82. RegQueryValueEx-: PROCEDURE {WINAPI} (hKey: HKEY; lpValueName: ARRAY OF CHAR; VAR lpReserved, lpType: LONGINT; VAR lpData: ARRAY OF SYSTEM.BYTE; VAR lpcbData: LONGINT): LONGINT;
  83. (** The RegSetValueEx function sets the data and type of a specified value under a registry key. *)
  84. RegSetValueEx-: PROCEDURE {WINAPI} (hKey: HKEY; lpValueName: ARRAY OF CHAR; Reserved, dwType: LONGINT; VAR lpData: ARRAY OF SYSTEM.BYTE; cbData: LONGINT): LONGINT;
  85. (** The GetFileVersionInfo function returns version information about a specified file. *)
  86. GetFileVersionInfo-: PROCEDURE {WINAPI} (lpstrFilename: ARRAY OF CHAR; dwHandle, dwLen: LONGINT; VAR lpDate: ARRAY OF SYSTEM.BYTE): Kernel32.BOOL;
  87. (** The GetFileVersionInfoSize function determines whether the operating system can obtain version information
  88. about a specified file. *)
  89. GetFileVersionInfoSize-: PROCEDURE {WINAPI} (lpstrFilename: ARRAY OF CHAR; VAR lpdwHandle: LONGINT): LONGINT;
  90. (** The VerQueryValue function returns selected version information from the specified version-information resource. *)
  91. VerQueryValue-: PROCEDURE {WINAPI} (pBlock: ARRAY OF SYSTEM.BYTE; lpSubBlock: ARRAY OF CHAR; VAR lplpBuffer: ADDRESS; VAR puLen: LONGINT): Kernel32.BOOL;
  92. (* ALEX BEGIN *)
  93. CloseServiceHandle-: PROCEDURE {WINAPI} (hSCObject: SC_HANDLE): BOOL;
  94. CreateService-: PROCEDURE {WINAPI} (hSCManager: SC_HANDLE; VAR lpServiceName, lpDisplayName: LPCTSTR;
  95. dwDesiredAccess, dwServiceType, dwStartType, dwErrorControl: DWORD;
  96. VAR lpBinaryPathName, lpLoadOrderGroup: LPCTSTR; lpdwTagId: LPDWORD;
  97. VAR lpDependencies, lpServiceStartName, lpPassword: LPCTSTR): SC_HANDLE;
  98. DeleteService-: PROCEDURE {WINAPI} (hService: SC_HANDLE): BOOL;
  99. OpenSCManager-: PROCEDURE {WINAPI} (VAR lpMachineName, lpDatabaseName: LPCTSTR; dwDesiredAccess: DWORD): SC_HANDLE;
  100. OpenService-: PROCEDURE {WINAPI} (hSCManager: SC_HANDLE; VAR lpServiceName: LPCTSTR; dwDesiredAccess: DWORD): SC_HANDLE;
  101. RegisterServiceCtrlHandler-: PROCEDURE {WINAPI} (VAR lpServiceName: ARRAY OF CHAR; lpHandlerProc: LPHANDLER_FUNCTION): SERVICE_STATUS_HANDLE;
  102. SetServiceStatus-: PROCEDURE {WINAPI} (hServiceStatus: SERVICE_STATUS_HANDLE; VAR lpServiceStatus: SERVICE_STATUS): BOOL;
  103. StartService-: PROCEDURE {WINAPI} (hService: SC_HANDLE; dwNumServiceArgs: DWORD; VAR lpServiceArgVectors: LPCTSTR): BOOL;
  104. StartServiceCtrlDispatcher-: PROCEDURE {WINAPI} (VAR lpServiceTable: ARRAY OF SYSTEM.BYTE): BOOL;
  105. advapi32: Kernel32.HMODULE;
  106. PROCEDURE InstallService*(srvName, serviceDesc, exeFile: ARRAY OF CHAR): BOOLEAN;
  107. VAR newService, scm: SC_HANDLE; err: LONGINT;
  108. BEGIN
  109. scm := OpenSCManager(NIL,NIL,SC_MANAGER_CREATE_SERVICE);
  110. IF scm = Kernel32.NULL THEN
  111. err := OutError("Advapi32.OpenSCManager");
  112. RETURN FALSE;
  113. END;
  114. newService := CreateService(scm, srvName,
  115. serviceDesc,
  116. SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_AUTO_START,
  117. SERVICE_ERROR_NORMAL,
  118. exeFile,
  119. NIL,0,NIL,NIL,NIL);
  120. IF newService = Kernel32.NULL THEN
  121. err := OutError("Advapi32.CreateService");
  122. CloseServiceHandle(scm);
  123. RETURN FALSE;
  124. END;
  125. CloseServiceHandle(newService);
  126. CloseServiceHandle(scm);
  127. KernelLog.Enter;
  128. KernelLog.String('Service "'); KernelLog.String(srvName); KernelLog.String('" was installed!'); KernelLog.Ln;
  129. KernelLog.Exit;
  130. RETURN TRUE;
  131. END InstallService;
  132. PROCEDURE UninstallService*(srvName: ARRAY OF CHAR): BOOLEAN;
  133. VAR scm, service: SC_HANDLE;
  134. ret: BOOL; err: LONGINT;
  135. BEGIN
  136. scm := OpenSCManager(NIL, NIL, SC_MANAGER_ALL_ACCESS);
  137. IF scm = Kernel32.NULL THEN
  138. err := OutError("Advapi32.OpenSCManager");
  139. RETURN FALSE
  140. ELSE
  141. service := OpenService( scm, srvName, SERVICE_ALL_ACCESS);
  142. IF service = Kernel32.NULL THEN
  143. err := OutError("Advapi32.OpenService");
  144. RETURN FALSE
  145. ELSE
  146. ret := DeleteService(service);
  147. IF ret = Kernel32.NULL THEN
  148. err := OutError("Advapi32.DeleteService");
  149. RETURN FALSE
  150. ELSE
  151. KernelLog.Enter;
  152. KernelLog.String('Service "'); KernelLog.String(srvName); KernelLog.String('" was removed!'); KernelLog.Ln;
  153. KernelLog.Exit;
  154. END;
  155. CloseServiceHandle(service);
  156. END;
  157. CloseServiceHandle(scm);
  158. RETURN TRUE
  159. END
  160. END UninstallService;
  161. PROCEDURE OutError*(funcName: ARRAY OF CHAR): LONGINT;
  162. VAR err: LONGINT;
  163. BEGIN
  164. err := Kernel32.GetLastError();
  165. KernelLog.Enter;
  166. KernelLog.String(funcName); KernelLog.String(" failed, error code = "); KernelLog.Int(err, 10);
  167. KernelLog.Ln; KernelLog.Exit;
  168. RETURN err
  169. END OutError;
  170. PROCEDURE TermMod;
  171. BEGIN
  172. IF advapi32 # Kernel32.NULL THEN
  173. Kernel32.FreeLibrary(advapi32); advapi32 := Kernel32.NULL
  174. END
  175. END TermMod;
  176. (* ALEX END *)
  177. PROCEDURE GetProcAddress(hModule: ADDRESS; VAR adr: ADDRESS; procName: ARRAY OF CHAR);
  178. BEGIN
  179. Kernel32.GetProcAddress(hModule,procName,adr);
  180. END GetProcAddress;
  181. PROCEDURE Init;
  182. VAR
  183. mod: Kernel32.HMODULE;str: ARRAY 32 OF CHAR;
  184. BEGIN
  185. str := "ADVAPI32.DLL";
  186. mod := Kernel32.LoadLibrary(str);
  187. advapi32 := mod;
  188. GetProcAddress(mod,SYSTEM.VAL(ADDRESS,GetUserName ),"GetUserNameA");
  189. GetProcAddress(mod,SYSTEM.VAL(ADDRESS,RegCloseKey ),"RegCloseKey");
  190. GetProcAddress(mod,SYSTEM.VAL(ADDRESS,RegCreateKeyEx ),"RegCreateKeyExA");
  191. GetProcAddress(mod,SYSTEM.VAL(ADDRESS,RegDeleteKey ),"RegDeleteKeyA");
  192. GetProcAddress(mod,SYSTEM.VAL(ADDRESS,RegDeleteValue ),"RegDeleteValueA");
  193. GetProcAddress(mod,SYSTEM.VAL(ADDRESS,RegEnumKeyEx ),"RegEnumKeyExA");
  194. GetProcAddress(mod,SYSTEM.VAL(ADDRESS,RegEnumValue ),"RegEnumValueA");
  195. GetProcAddress(mod,SYSTEM.VAL(ADDRESS,RegOpenKeyEx ),"RegOpenKeyExA");
  196. GetProcAddress(mod,SYSTEM.VAL(ADDRESS,RegQueryValueEx ),"RegQueryValueExA");
  197. GetProcAddress(mod,SYSTEM.VAL(ADDRESS,RegSetValueEx ),"RegSetValueExA");
  198. str := "Version";
  199. mod := Kernel32.LoadLibrary(str);
  200. GetProcAddress(mod,SYSTEM.VAL(ADDRESS,GetFileVersionInfo ),"GetFileVersionInfoA");
  201. GetProcAddress(mod,SYSTEM.VAL(ADDRESS,GetFileVersionInfoSize),"GetFileVersionInfoSizeA");
  202. GetProcAddress(mod,SYSTEM.VAL(ADDRESS,VerQueryValue),"VerQueryValueA");
  203. (* ALEX *)
  204. Kernel32.GetProcAddress(advapi32, "CloseServiceHandle", SYSTEM.VAL(ADDRESS, CloseServiceHandle));
  205. Kernel32.GetProcAddress(advapi32, "CreateServiceA", SYSTEM.VAL(ADDRESS, CreateService));
  206. Kernel32.GetProcAddress(advapi32, "DeleteService", SYSTEM.VAL(ADDRESS, DeleteService));
  207. Kernel32.GetProcAddress(advapi32, "OpenSCManagerA", SYSTEM.VAL(ADDRESS, OpenSCManager));
  208. Kernel32.GetProcAddress(advapi32, "OpenServiceA", SYSTEM.VAL(ADDRESS, OpenService));
  209. Kernel32.GetProcAddress(advapi32, "RegisterServiceCtrlHandlerA", SYSTEM.VAL(ADDRESS, RegisterServiceCtrlHandler));
  210. Kernel32.GetProcAddress(advapi32, "SetServiceStatusA", SYSTEM.VAL(ADDRESS, SetServiceStatus));
  211. Kernel32.GetProcAddress(advapi32, "StartServiceA", SYSTEM.VAL(ADDRESS, StartService));
  212. Kernel32.GetProcAddress(advapi32, "StartServiceCtrlDispatcherA", SYSTEM.VAL(ADDRESS, StartServiceCtrlDispatcher));
  213. Modules.InstallTermHandler(TermMod)
  214. END Init;
  215. BEGIN
  216. Init;
  217. END ADVAPI32.