summaryrefslogtreecommitdiffhomepage
path: root/dev/SCIKit
diff options
context:
space:
mode:
authorAmlal <amlal.elmahrouss@icloud.com>2024-10-26 07:59:10 +0200
committerAmlal <amlal.elmahrouss@icloud.com>2024-10-26 07:59:10 +0200
commit05f085c9055fa5bd13bdba40fc40fb3f00d69fab (patch)
treeeccb2acb77b05c0e8ca073a3cea845acc0a35eec /dev/SCIKit
parent0d0829659be019b3695795e1604d36591a3c3785 (diff)
IMP: Fixes and improvements.
Signed-off-by: Amlal <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/SCIKit')
-rw-r--r--dev/SCIKit/CompilerHint.h23
-rw-r--r--dev/SCIKit/Foundation.h249
-rw-r--r--dev/SCIKit/LPC.h48
-rw-r--r--dev/SCIKit/ReadMe.md5
-rw-r--r--dev/SCIKit/build.json21
-rw-r--r--dev/SCIKit/makefile12
-rw-r--r--dev/SCIKit/scm-design.drawio28
-rw-r--r--dev/SCIKit/src/Foundation.cc45
8 files changed, 431 insertions, 0 deletions
diff --git a/dev/SCIKit/CompilerHint.h b/dev/SCIKit/CompilerHint.h
new file mode 100644
index 00000000..b550bac5
--- /dev/null
+++ b/dev/SCIKit/CompilerHint.h
@@ -0,0 +1,23 @@
+/* -------------------------------------------
+
+ Copyright ZKA Web Services Co.
+
+------------------------------------------- */
+
+#ifndef __SCI_HINT_H__
+#define __SCI_HINT_H__
+
+#pragma compiler(hint_manifest)
+
+#define _Input
+#define _Output
+
+#define _Optional
+
+#define _StrictCheckInput
+#define _StrictCheckOutput
+
+#define _InOut
+#define _StrictInOut
+
+#endif // ifndef __SCI_HINT_H__
diff --git a/dev/SCIKit/Foundation.h b/dev/SCIKit/Foundation.h
new file mode 100644
index 00000000..d0ba87a1
--- /dev/null
+++ b/dev/SCIKit/Foundation.h
@@ -0,0 +1,249 @@
+/* -------------------------------------------
+
+Copyright ZKA Web Services Co.
+
+File: sci_base.h
+Purpose: SCI core header file (C++ only).
+
+------------------------------------------- */
+
+#ifndef SCI_BASE_H
+#define SCI_BASE_H
+
+#define ATTRIBUTE(X) __attribute__((X))
+#define IMPORT_CXX extern "C++"
+#define IMPORT_C extern "C"
+
+typedef bool Bool;
+typedef void Void;
+
+typedef __UINT64_TYPE__ UInt64;
+typedef __UINT32_TYPE__ UInt32;
+typedef __UINT16_TYPE__ UInt16;
+typedef __UINT8_TYPE__ UInt8;
+
+typedef __SIZE_TYPE__ SizeT;
+
+typedef __INT64_TYPE__ SInt64;
+typedef __INT32_TYPE__ SInt32;
+typedef __INT16_TYPE__ SInt16;
+typedef __INT8_TYPE__ SInt8;
+
+typedef void* VoidPtr;
+typedef __UINTPTR_TYPE__ UIntPtr;
+typedef char Char;
+
+#include <SCIKit/CompilerHint.h>
+#include <SCIKit/LPC.h>
+
+// ------------------------------------------------------------------------------------------ //
+/// @brief Handle Type Definitions.
+// ------------------------------------------------------------------------------------------ //
+
+typedef VoidPtr SCIObject;
+
+typedef SCIObject DLLObject;
+typedef SCIObject IOObject;
+typedef SCIObject SCMObject;
+typedef SCIObject ThreadObject;
+typedef SCIObject SocketObject;
+typedef SCIObject ShellObject;
+typedef SCIObject UIObject;
+
+// ------------------------------------------------------------------------------------------ //
+/// @brief Dynamic Loader API.
+// ------------------------------------------------------------------------------------------ //
+
+/// @brief Get function which is part of the DLL.
+/// @param symbol the symbol to look for
+/// @param dll_handle the DLL handle.
+/// @return the proc pointer.
+IMPORT_C SCIObject LdrGetDLLSymbolFromHandle(_Input const Char* symbol, _Input SCIObject dll_handle);
+
+/// @brief Open DLL handle.
+/// @param path
+/// @param drv
+/// @return
+IMPORT_C SCIObject LdrOpenDLLHandle(_Input const Char* path, _Input const Char* drive_letter);
+
+/// @brief Close DLL handle
+/// @param dll_handle
+/// @return
+IMPORT_C Void LdrCloseDLLHandle(_Input SCIObject* dll_handle);
+
+// ------------------------------------------------------------------------------------------ //
+// File API.
+// ------------------------------------------------------------------------------------------ //
+
+/// @brief Opens a file from a drive.
+/// @param fs_path the filesystem path.
+/// @param drive_letter drive name, use NULL to use default one.
+/// @return the file descriptor of the file.
+IMPORT_C SCIObject IoOpenFile(const Char* fs_path, const Char* drive_letter);
+
+/// @brief Closes a file and flushes its content.
+/// @param file_desc the file descriptor.
+/// @return void.
+IMPORT_C Void IoCloseFile(_Input SCIObject file_desc);
+
+/// @brief Write data to a file.
+/// @param file_desc the file descriptor.
+/// @param out_data the data to write.
+/// @param sz_data the size of the data to write.
+/// @return the number of bytes written.
+IMPORT_C UInt32 IoWriteFile(_Input SCIObject file_desc, _Output VoidPtr out_data, SizeT sz_data);
+
+/// @brief Read data from a file.
+/// @param file_desc the file descriptor.
+/// @param out_data the data to read.
+/// @param sz_data the size of the data to read.
+IMPORT_C UInt32 IoReadFile(_Input SCIObject file_desc, _Output VoidPtr* out_data, SizeT sz_data);
+
+/// @brief Rewind the file pointer to the beginning of the file.
+/// @param file_desc the file descriptor.
+/// @return the number of bytes read.
+IMPORT_C UInt64 IoRewindFile(_Input SCIObject file_desc);
+
+/// @brief Tell the current position of the file pointer.
+/// @param file_desc the file descriptor.
+/// @return the current position of the file pointer.
+IMPORT_C UInt64 IoTellFile(_Input SCIObject file_desc);
+
+/// @brief Seek file offset from file descriptor.
+IMPORT_C UInt64 IoSeekFile(_Input SCIObject file_desc, UInt64 file_offset);
+
+// ------------------------------------------------------------------------
+// TLS API.
+// ------------------------------------------------------------------------
+
+/// @brief Installs the Thread Information Block and Global Information Block inside the current process.
+/// @param void.
+/// @return > 0 error ocurred or already present, = 0 success.
+IMPORT_C UInt32 RtlTlsInstall(Void);
+
+// ------------------------------------------------------------------------
+// Memory Management API.
+// ------------------------------------------------------------------------
+
+/// @brief Creates a new heap from the process's address space.
+/// @param len the length of it.
+/// @param flags the flags of it.
+/// @return heap pointer.
+IMPORT_C VoidPtr MmCreateHeap(_Input SizeT len, _Input UInt32 flags);
+
+/// @brief Destroys the pointer
+/// @param heap the heap itself.
+/// @return void.
+IMPORT_C Void MmDestroyHeap(_Input VoidPtr heap);
+
+/// @brief Change protection flags of a memory region.
+IMPORT_C Void MmSetHeapFlags(_Input VoidPtr heap, _Input UInt32 flags);
+
+/// @brief Change protection flags of a memory region.
+IMPORT_C UInt32 MmGetHeapFlags(_Input VoidPtr heap);
+
+/// @brief Fill memory region with CRC32.
+IMPORT_C UInt32 MmFillCRC32Heap(_Input VoidPtr heap);
+
+/// @brief Copy memory region.
+IMPORT_C VoidPtr MmCopyMemory(_Input VoidPtr dest, _Input VoidPtr src, _Input SizeT len);
+
+/// @brief Fill memory region.
+IMPORT_C VoidPtr MmFillMemory(_Input VoidPtr dest, _Input SizeT len, _Input UInt8 value);
+
+// ------------------------------------------------------------------------
+// Error handling API.
+// ------------------------------------------------------------------------
+
+IMPORT_C SInt32 ErrGetLastError(Void);
+
+// ------------------------------------------------------------------------
+// Threading API.
+// ------------------------------------------------------------------------
+
+/// @brief Exit the current thread.
+/// @param exit_code the exit code.
+IMPORT_C Void ThrExitCurrentThread(_Input SInt32 exit_code);
+
+/// @brief Exit the main thread.
+/// @param exit_code the exit code.
+IMPORT_C Void ThrExitMainThread(_Input SInt32 exit_code);
+
+/// @brief Exit a thread.
+/// @param thread the thread to exit.
+/// @param exit_code the exit code.
+IMPORT_C Void ThrExitThread(_Input ThreadObject thread, _Input SInt32 exit_code);
+
+/// @brief Thread procedure function type.
+typedef Void (*ThreadProc)(Void);
+
+/// @brief Creates a thread.
+/// @param procedure the thread procedure.
+/// @param argument_count number of arguments inside that thread.
+/// @param flags Thread flags.
+/// @return the thread object.
+IMPORT_C ThreadObject ThrCreateThread(ThreadProc procedure, SInt32 argument_count, SInt32 flags);
+
+/// @brief Yields the current thread.
+/// @param thread the thread to yield.
+IMPORT_C Void ThrYieldThread(Void);
+
+/// @brief Joins a thread.
+/// @param thread the thread to join.
+IMPORT_C Void ThrJoinThread(Void);
+
+/// @brief Detach sa thread.
+/// @param thread the thread to detach.
+IMPORT_C Void ThrDetachThread(Void);
+
+// ------------------------------------------------------------------------
+// Drive Management API.
+// ------------------------------------------------------------------------
+
+/// @brief Get the default drive letter.
+/// @param void.
+/// @return the drive letter.
+IMPORT_C Char* DrvGetDefaultDriveLetter(Void);
+
+/// @brief Get the drive letter from a path.
+/// @param path the path.
+/// @return the drive letter.
+IMPORT_C Char* DrvGetDriveLetterFromPath(_Input const Char* path);
+
+/// @brief Get a mounted drive from a letter.
+/// @param letter the letter (A..Z).
+/// @return the drive object.
+IMPORT_C SCIObject DrvGetMountedDrive(_Input const Char letter);
+
+/// @brief Mount a drive.
+/// @param path the path to mount.
+/// @param letter the letter to mount.
+IMPORT_C Void DrvMountDrive(_Input const Char* path, _Input const Char* letter);
+
+/// @brief Unmount a drive.
+/// @param letter the letter to unmount.
+IMPORT_C Void DrvUnmountDrive(_Input const Char letter);
+
+// ------------------------------------------------------------------------
+// Event handling API, use to listen to OS specific events.
+// ------------------------------------------------------------------------
+
+/// @brief Add an event listener.
+/// @param event_name the event name.
+/// @param listener the listener to add.
+/// @return the event listener.
+IMPORT_C Void EvtAddListener(_Input const Char* event_name, _Input SCIObject listener);
+
+/// @brief Remove an event listener.
+/// @param event_name the event name.
+/// @param listener the listener to remove.
+/// @return the event listener.
+IMPORT_C Void EvtRemoveListener(_Input const Char* event_name, _Input SCIObject listener);
+
+/// @brief Dispatch an event.
+/// @param event_name the event name.
+/// @param event_data the event data.
+/// @return the event data.
+IMPORT_C VoidPtr EvtDispatchEvent(_Input const Char* event_name, _Input VoidPtr event_data);
+
+#endif // ifndef SCI_BASE_H
diff --git a/dev/SCIKit/LPC.h b/dev/SCIKit/LPC.h
new file mode 100644
index 00000000..c634b790
--- /dev/null
+++ b/dev/SCIKit/LPC.h
@@ -0,0 +1,48 @@
+/* -------------------------------------------
+
+ Copyright ZKA Web Services Co.
+
+------------------------------------------- */
+
+#pragma once
+
+#define ErrLocalIsOk() (kLastError == kErrorSuccess)
+#define ErrLocalFailed() (kLastError != kErrorSuccess)
+#define ErrLocal() (kLastError)
+
+typedef SInt32 ErrObject;
+
+inline constexpr ErrObject kErrorSuccess = 0;
+inline constexpr ErrObject kErrorExecutable = 33;
+inline constexpr ErrObject kErrorExecutableLib = 34;
+inline constexpr ErrObject kErrorFileNotFound = 35;
+inline constexpr ErrObject kErrorDirectoryNotFound = 36;
+inline constexpr ErrObject kErrorDiskReadOnly = 37;
+inline constexpr ErrObject kErrorDiskIsFull = 38;
+inline constexpr ErrObject kErrorProcessFault = 39;
+inline constexpr ErrObject kErrorSocketHangUp = 40;
+inline constexpr ErrObject kErrorThreadLocalStorage = 41;
+inline constexpr ErrObject kErrorMath = 42;
+inline constexpr ErrObject kErrorNoNetwork = 43;
+inline constexpr ErrObject kErrorHeapOutOfMemory = 44;
+inline constexpr ErrObject kErrorNoSuchDisk = 45;
+inline constexpr ErrObject kErrorFileExists = 46;
+inline constexpr ErrObject kErrorFormatFailed = 47;
+inline constexpr ErrObject kErrorNetworkTimeout = 48;
+inline constexpr ErrObject kErrorInternal = 49;
+inline constexpr ErrObject kErrorForkAlreadyExists = 50;
+inline constexpr ErrObject kErrorOutOfTeamSlot = 51;
+inline constexpr ErrObject kErrorHeapNotPresent = 52;
+inline constexpr ErrObject kErrorNoEntrypoint = 53;
+inline constexpr ErrObject kErrorDiskIsCorrupted = 54;
+inline constexpr ErrObject kErrorDisk = 55;
+inline constexpr ErrObject kErrorInvalidData = 56;
+inline constexpr ErrObject kErrorAsync = 57;
+inline constexpr ErrObject kErrorNonBlocking = 58;
+inline constexpr ErrObject kErrorIPC = 59;
+inline constexpr ErrObject kErrorSign = 60;
+inline constexpr ErrObject kErrorInvalidCreds = 61;
+inline constexpr ErrObject kErrorUnimplemented = 0;
+
+/// @brief The last error reported by the system to the process.
+IMPORT_C ErrObject kLastError;
diff --git a/dev/SCIKit/ReadMe.md b/dev/SCIKit/ReadMe.md
new file mode 100644
index 00000000..f3b5a156
--- /dev/null
+++ b/dev/SCIKit/ReadMe.md
@@ -0,0 +1,5 @@
+# ZKA's SCI.
+
+System Call and Component Interface, used maninly to communicate with Kernel and registered objects.
+
+###### (c) ZKA Web Services Co, all rights reserved.
diff --git a/dev/SCIKit/build.json b/dev/SCIKit/build.json
new file mode 100644
index 00000000..104be044
--- /dev/null
+++ b/dev/SCIKit/build.json
@@ -0,0 +1,21 @@
+{
+ "compiler_path": "x86_64-w64-mingw32-g++",
+ "compiler_std": "c++20",
+ "headers_path": ["../"],
+ "sources_path": ["src/*.cc"],
+ "output_name": "sci.dll",
+ "compiler_flags": [
+ "-fPIC",
+ "-ffreestanding",
+ "-shared",
+ "-fno-rtti",
+ "-fno-exceptions",
+ "-Wl,--subsystem=17"
+ ],
+ "cpp_macros": [
+ "__SCI_IMPL__",
+ "cSCIVersion=0x0100",
+ "cSCIVersionHighest=0x0100",
+ "cSCIVersionLowest=0x0100"
+ ]
+}
diff --git a/dev/SCIKit/makefile b/dev/SCIKit/makefile
new file mode 100644
index 00000000..f18fbeff
--- /dev/null
+++ b/dev/SCIKit/makefile
@@ -0,0 +1,12 @@
+######################
+# (C) ZKA
+# XPCOM/SCI kit makefile.
+######################
+
+CC=g++
+FLAGS=-I../ -shared -fPIC -D__ZKA_SYMS__
+OUTPUT=sci.dll
+
+.PHONY: build-sci
+build-sci:
+ $(CC) $(wildcard .cc) $(FLAGS) -o $(OUTPUT)
diff --git a/dev/SCIKit/scm-design.drawio b/dev/SCIKit/scm-design.drawio
new file mode 100644
index 00000000..22bcace6
--- /dev/null
+++ b/dev/SCIKit/scm-design.drawio
@@ -0,0 +1,28 @@
+<mxfile host="65bd71144e">
+ <diagram name="Page-1" id="_vc7fxBdNKI2W8YhI8VA">
+ <mxGraphModel dx="774" dy="581" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
+ <root>
+ <mxCell id="0"/>
+ <mxCell id="1" parent="0"/>
+ <mxCell id="eRehIIeIVOPW1y23kRkx-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" parent="1" source="eRehIIeIVOPW1y23kRkx-2" target="eRehIIeIVOPW1y23kRkx-8" edge="1">
+ <mxGeometry relative="1" as="geometry"/>
+ </mxCell>
+ <mxCell id="eRehIIeIVOPW1y23kRkx-2" value="User level interfaces and events." style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
+ <mxGeometry x="200" y="450" width="226" height="60" as="geometry"/>
+ </mxCell>
+ <mxCell id="eRehIIeIVOPW1y23kRkx-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="eRehIIeIVOPW1y23kRkx-3" target="eRehIIeIVOPW1y23kRkx-2" edge="1">
+ <mxGeometry relative="1" as="geometry"/>
+ </mxCell>
+ <mxCell id="eRehIIeIVOPW1y23kRkx-3" value="IDB" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" parent="1" vertex="1">
+ <mxGeometry x="283" y="290" width="60" height="80" as="geometry"/>
+ </mxCell>
+ <mxCell id="eRehIIeIVOPW1y23kRkx-8" value="Program #2&lt;div&gt;Is a web browser, it uses an HTML parser component.&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;" parent="1" vertex="1">
+ <mxGeometry x="253" y="570" width="120" height="60" as="geometry"/>
+ </mxCell>
+ <mxCell id="eRehIIeIVOPW1y23kRkx-10" value="&lt;h1 style=&quot;margin-top: 0px;&quot;&gt;System Component/Call Model/Interface&lt;/h1&gt;&lt;p&gt;XPCOM is a standardized way of sharing code within DLLs in NewOS.&lt;/p&gt;&lt;p&gt;All classes are based upon&amp;nbsp;&lt;span style=&quot;color: rgb(78, 201, 176); background-color: rgb(31, 31, 31); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px;&quot;&gt;IUnknown&lt;/span&gt;&lt;/p&gt;&lt;p&gt;It is also used to register and call code using&amp;nbsp;&lt;span style=&quot;color: rgb(78, 201, 176); background-color: rgb(31, 31, 31); font-family: Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 14px;&quot;&gt;IEventListener&lt;/span&gt;&lt;/p&gt;" style="text;html=1;whiteSpace=wrap;overflow=hidden;rounded=0;" parent="1" vertex="1">
+ <mxGeometry x="450" y="240" width="320" height="240" as="geometry"/>
+ </mxCell>
+ </root>
+ </mxGraphModel>
+ </diagram>
+</mxfile>
diff --git a/dev/SCIKit/src/Foundation.cc b/dev/SCIKit/src/Foundation.cc
new file mode 100644
index 00000000..93104a45
--- /dev/null
+++ b/dev/SCIKit/src/Foundation.cc
@@ -0,0 +1,45 @@
+/* -------------------------------------------
+
+ Copyright ZKA Web Services Co.
+
+------------------------------------------- */
+
+#include <SCIKit/Foundation.h>
+
+/// @file sci_base.cc
+/// @brief Base Memory Manager functions for SCI.dll
+
+/// @brief Copy memory region.
+IMPORT_C VoidPtr MmCopyMemory(_Input VoidPtr dest, _Input VoidPtr src, _Input SizeT len)
+{
+ if (!len ||
+ !dest ||
+ !src)
+ {
+ return nullptr;
+ }
+
+ for (SizeT i = 0; i < len; i++)
+ {
+ ((Char*)dest)[i] = ((Char*)src)[i];
+ }
+
+ return dest;
+}
+
+/// @brief Fill memory region with **value**.
+IMPORT_C VoidPtr MmFillMemory(_Input VoidPtr dest, _Input SizeT len, _Input UInt8 value)
+{
+ if (!len ||
+ !dest)
+ {
+ return nullptr;
+ }
+
+ for (SizeT i = 0; i < len; i++)
+ {
+ ((Char*)dest)[i] = value;
+ }
+
+ return dest;
+}