Subversion Repositories Kolibri OS

Rev

Rev 6767 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. format PE DLL GUI 0.8 at 7FF00000h
  2. entry start
  3. include '../../struct.inc'
  4. include '../../proc32.inc'
  5. include 'fpo.inc'
  6. include 'export.inc'
  7. include 'pe.inc'
  8. section '.text' code readable executable
  9.  
  10. FS_STACK_MAX equ dword [fs:4]
  11. FS_STACK_MIN equ dword [fs:8]
  12. FS_SELF_PTR equ dword [fs:0x18]
  13. FS_PROCESS_DATA equ dword [fs:0x30]
  14. FS_ERRNO equ dword [fs:0x34]
  15. FS_SYSCALL_PTR equ dword [fs:0xC0]
  16.  
  17. ENOMEM = 12
  18.  
  19. DLL_PROCESS_DETACH = 0
  20. DLL_PROCESS_ATTACH = 1
  21. DLL_THREAD_ATTACH = 2
  22. DLL_THREAD_DETACH = 3
  23.  
  24. SYSCALL_METHOD_I40 = 1
  25. SYSCALL_METHOD_SYSENTER = 2
  26. SYSCALL_METHOD_SYSCALL = 3
  27.  
  28. ; Pointer to this structure is passed as the third argument
  29. ; to 'start' procedure by the kernel.
  30. struct kernel_init_data
  31. version         dw      ?
  32. flags           dw      ?
  33. syscall_method  dd      ?
  34. ; either one of SYSCALL_METHOD_xxx or pointer to procedure
  35. exe_base        dd      ?
  36. stack_base      dd      ?
  37. stack_size      dd      ?
  38. exe_path        dd      ?
  39. command_line    dd      ?
  40. ends
  41.  
  42. include 'malloc.inc'
  43.  
  44. proc syscall_int40
  45.         int     0x40
  46.         ret
  47. endp
  48.  
  49. proc kercall
  50.         jmp     FS_SYSCALL_PTR
  51. endp
  52.  
  53. prologue@proc equ fpo_prologue
  54. epilogue@proc equ fpo_epilogue
  55.  
  56. proc start stdcall, dll_base, reason, reserved
  57. ; 1. Do nothing unless called by the kernel for DLL_PROCESS_ATTACH.
  58.         cmp     [reason], DLL_PROCESS_ATTACH
  59.         jnz     .nothing
  60. ; 2. Validate version of the init struct.
  61. ; If not known, say a debug message and die.
  62.         mov     ebp, [reserved]
  63.         cmp     [ebp+kernel_init_data.version], 1
  64.         jnz     .version_mismatch
  65. ; 3. Setup common data based on the init struct.
  66.         mov     eax, [ebp+kernel_init_data.stack_base]
  67.         mov     FS_STACK_MIN, eax
  68.         add     eax, [ebp+kernel_init_data.stack_size]
  69.         mov     FS_STACK_MAX, eax
  70.         mov     eax, [ebp+kernel_init_data.syscall_method]
  71.         cmp     eax, 0x10000
  72.         jae     @f
  73.         mov     eax, syscall_int40
  74. @@:
  75.         mov     FS_SYSCALL_PTR, eax
  76. ; 4. Initialize the process heap.
  77.         mov     eax, [ebp+kernel_init_data.exe_base]
  78.         mov     edx, [eax+STRIPPED_PE_HEADER.SizeOfHeapReserve]
  79.         cmp     word [eax], 'MZ'
  80.         jnz     @f
  81.         add     eax, [eax+IMAGE_DOS_HEADER.e_lfanew]
  82.         mov     edx, [eax+IMAGE_NT_HEADERS.OptionalHeader.SizeOfHeapReserve]
  83. @@:
  84.         malloc_init
  85. ; ...TBD...
  86. ; Call exe entry point.
  87.         mov     eax, [ebp+kernel_init_data.exe_base]
  88.         mov     edx, [eax+STRIPPED_PE_HEADER.AddressOfEntryPoint]
  89.         cmp     word [eax], 'MZ'
  90.         jnz     @f
  91.         mov     ecx, [eax+IMAGE_DOS_HEADER.e_lfanew]
  92.         add     ecx, eax
  93.         mov     edx, [ecx+IMAGE_NT_HEADERS.OptionalHeader.AddressOfEntryPoint]
  94. @@:
  95.         add     edx, eax
  96.         call    edx
  97. ; If exe entry point has returned control, die.
  98.         mov     eax, -1
  99.         call    FS_SYSCALL_PTR
  100. .version_mismatch:
  101.         mov     esi, version_mismatch_msg
  102.         mov     eax, 63
  103.         mov     ebx, 1
  104. @@:
  105.         mov     cl, [esi]
  106.         test    cl, cl
  107.         jz      @f
  108.         int     0x40    ; can't use FS_SYSCALL_PTR here, it has not yet been set
  109.         inc     esi
  110.         jmp     @b
  111. @@:
  112.         mov     eax, -1
  113.         int     0x40
  114. .nothing:
  115.         ret
  116. endp
  117.  
  118. align 4
  119. data export
  120. export 'kolibri.dll' \
  121.         , kercall, 'kercall' \
  122.         , malloc, 'malloc' \
  123.         , free, 'free' \
  124.         , calloc, 'calloc' \
  125.         , realloc, 'realloc' \
  126.         , realloc_in_place, 'realloc_in_place' \
  127.         , memalign, 'memalign' \
  128.         , create_mspace, 'create_mspace' \
  129.         , destroy_mspace, 'destroy_mspace' \
  130.         , mspace_malloc, 'mspace_malloc' \
  131.         , mspace_free, 'mspace_free' \
  132.         , mspace_calloc, 'mspace_calloc' \
  133.         , mspace_realloc, 'mspace_realloc' \
  134.         , mspace_realloc_in_place, 'mspace_realloc_in_place' \
  135.         , mspace_memalign, 'mspace_memalign' \
  136.  
  137. end data
  138.  
  139. version_mismatch_msg    db      'Version mismatch between kernel and kolibri.dll',13,10,0
  140.  
  141. if FOOTERS
  142. section '.data' data readable writable
  143. malloc_magic    dd      ?
  144. end if
  145.