diff --git a/programs/develop/libraries/dll/dll.asm b/programs/develop/libraries/dll/dll.asm new file mode 100644 index 0000000000..8af6122755 --- /dev/null +++ b/programs/develop/libraries/dll/dll.asm @@ -0,0 +1,74 @@ +; +; KolibriOS Dll load support +; +; (C) 2020-2021 Coldy +; Thank's you for use this code and software based on it! +; I will glad if it's will be helpful. +; +; Distributed under terms of GPL +; +format MS COFF +public @EXPORT as 'EXPORTS' + +include '../../../proc32.inc' +include '../../../macros.inc' + +section '.flat' code readable align 16 + +app_version equ word[8] +i_table_min_size = 1 + +APP_START_THUNK: + ; First make shure that app + ; have header version 2.0 or more + cmp app_version,2 + jl .denied + + ; Then make shure that we first + mov eax, @EXPORT + cmp dword[eax-4],0 + je .denied + + ; Don't allow second time + mov dword[eax-4],0 + + ; Early app initialization + + ; Test import table + mov eax, [0x24] ; i_table_ptr + test eax, eax + jz @f + mov esi, [0x10] + cmp esi, eax + jbe @f ; i_table_ptr >= img_size ? + mov ebx, eax + add ebx, i_table_min_size + cmp esi, ebx + jbe @f ; i_table_ptr + i_table_min_size >= img_size ? + + ; Link app import table with DLL's exoport table + stdcall dll.Load,eax + test eax, eax + jnz @f + ; Start of app code + mov eax, [0x0C] + ; TODO: test start_ptr + min_code_size < img_size + call eax +@@: + mov eax, -1 + int 0x40 +.denied: + ret +; } APP_START_THUNK + + +; WARNING! This code must be after app initialization thunk! +include '../../../dll.inc' +align 4 +;dd 0xdeadbeef +dd APP_START_THUNK +@EXPORT: +export \ + dll.Load, 'dll_load', \ + dll.Link, 'dll_link', \ + dll.GetProcAddress, 'dll_sym' ; \ No newline at end of file