From eb72cf5cb9dad33a1b42d987af6b1300c4d4b468 Mon Sep 17 00:00:00 2001 From: Mikhail Frolov Date: Fri, 23 May 2025 08:12:42 +0500 Subject: [PATCH] fix bugs and update sys_func.inc code fixed size sockaddr struct update function CreateThread clear code in main file --- bin/httpd | Bin 6204 -> 6220 bytes bin/modules/block_access.obj | Bin 674 -> 674 bytes bin/modules/redirect.obj | Bin 687 -> 687 bytes bin/modules/srv_control.obj | Bin 1643 -> 1643 bytes bin/modules/test_unit.obj | Bin 1810 -> 1810 bytes bin/modules/test_unit4.obj | Bin 828 -> 848 bytes bin/modules/test_unit5.obj | Bin 718 -> 718 bytes bin/modules/test_unit6.obj | Bin 0 -> 659 bytes bin/modules/test_unit_2.obj | Bin 2012 -> 2012 bytes example/readme.md | 1 + example/srv_control.asm | 1 - example/test_unit4.asm | 3 +- example/test_unit5.asm | 1 - example/test_unit6.asm | 113 +++++++++++++++++++++++++++++++++++ example/test_unit_2.asm | 1 - httpd.asm | 56 +++++++---------- module_api.inc | 17 +++++- sys_func.inc | 39 ++++++++---- utils/block_access.asm | 1 - utils/redirect.asm | 1 - 20 files changed, 180 insertions(+), 54 deletions(-) create mode 100644 bin/modules/test_unit6.obj create mode 100644 example/test_unit6.asm diff --git a/bin/httpd b/bin/httpd index 06edceaeca2b00fa103eb807edcdbb160eda8562..3f85bda91ac209594d0cd099bee6a0d09f5a45be 100644 GIT binary patch delta 2494 zcmZWqeN0=|6~E8e;1L@;#C$X%l{X$O6dFuhvap!OUX4Q#^&Z4FEXhKH8ur4v6=lx} zNLg(3LY9|TwrWrNW9m933#$4tZRw~cqeRpJ4`*4?Sk^U_7ENvc=$-~$`A7$CqTT)O zv)Sl&rE}l8=lssO=bn4+c~?DedA2{<5{k5hJq;Woq}WEtTqz;v8glgd_CeF3hbD-V z5GA8bHKbNv8=ktihY%|9wjY|3kHY8*vz+*?iI7>}!Ja8I>85j|&+#NhX)?g{c1*Lr zB*mEZ?a#_K8M1@ZI^%P59}FJhe@zX%o1%_KuaY?iWu~)Lat` zn~o@bME}93$j%y-^7G8RoHiRt%2?XV2|Edqn+L!VY0E|S73hGI3f69wjHF`A8H}t1cru2`}&Y?mvG1G~8UXv)L-AxqY$Q${jiF?8{i5g2+U~UQ~|QnDw~`pK-)j znBAS7BFR!JHygo7mL#i9LG*5jV*xg2(|wnE;jX_>^#6~l?@~8YpyUvrD1jH-H$c`; zu^)cBCKx9ECIdC3mVf!R;g1=sG)pLv9{tOJtos>+M2!5OpIB|y$D2&gT+HmH^-A-g z8}{PaLfBNp2FYUwZAeXv>>cVy)+j|L&)mRCRr^kMTZ%Q~Gc)EAn?`;Y%TxSj)W5{L zMh9JEi8v*(PcxP?aLk6SDdTI+SeWuWC}Ux&9~&G~UI0xw3GOs$ zV;v!Ps3Gl%O_lK@P=3B(Vx96rbvUXYMF_a*fZEQxJM@Q*m9&$sluSogRJRyOk?xn% z)k^az#Hg%s1*${NnB^uCyA#zNFq!Vst@r>F)#*Pe%~%-n9ExvR|2@|3WHmv*N?@Ax ziL4Rot1CvbMo`>bRG*Cfl|+OBQ=f-@0@NDerfRtUhTYTj+aox&Uot)s&OA z=A=91X5%$URV+v3%G1VnNaWw-X5%qRe-%GNBi4TcgZY~|>v!&;on~98ybw;tH$*xb z=FR=i&K&SAfC$WSW*L4JGcS?^e5K%v70sWSFu=Q%DdodV5WykgY*K^e2C&A=(-STZ z^G^Mfbx+R&fcWybVEOO@u>u|1?$Vp_k|BL&y>T2e8V9QGgjYLm-yeSh`gw~!pGU}W znpw%Gco&hrfM178UxRP@7_W~bzj8V}ooK3;8kNvvyF(R@?-$|e_!C3)E3w5HKP7#` zP4)G$GWnWG3GFffA0Z$HsE;k~Q$k+l59hg8{f6dG(46OH3W!%bP;_6(9PZYOT)Ygi zGUa#thC82_)6Nw=$OW{^MXr3`K4zxfD0+aa(3Xn6RNso_$s*?49lOIe$FnoiKAj2H z!3h~XOHgV`(9>{J4OVDhbyRV6n&@bam*)jtO0YscU0!^=R|)aV(SZ$)*t$*M@h_u} z{Yt2s37Y(U!$Z_w7+dbkU^C)ZZq!Cy^50EO(el$3dKHp{s^0>rv`GoIW5=57N>ET1 zrxBMLsvd4?4TlBC$OTTTcW&jpTAS0|YILDns-5+rl`(a|JC-=j8UUX9E%{@2XP5rQ zGNq$?-xWIbXTh zemuShmq$q?9>Mq*Ja`hP>65iHw*FCnK+_X!dk3h7UGZCJ~8r?k79YsagLg}kb_;Qcmep6vp1pg?%gZcrQO0O;8GizSuZ7g?{r z4PxV&W4*_|b8N@6z5V3*HOS0(xlZl<(kn(2WbK;`*6&!SyP&;ZR{PWv>OUXFpK=fq z#djO%EGP~73#bhL@kj9o`8H?>^fKsekOu0?CnSs~vjhwe{yFfUZALu!vKG(AzX3+x BWgh?l delta 2463 zcmZ8jeN0=|6~E8e;2Imde6J;y+dLX9P_Vm@Knj&T8Hb?OGXzXY+khg(UMSk8#!k|x zi_Ko>`uZA)?)_7>ofZav(5|aCu~i^CX26T9Dy$jP+DMJ2blR$`g)AY^LAS1Nzw>O? zq*prkoqN9SIp>~p?2F!ay*nOj4R^P8d3^$7>}nxnsdC0n`Eu~99j8p5owLlvn37Qz zeW~@Ik1R4jV>91`_#Ek|kBatX{}X+SW;VTM`i>yfO!t~ig6XdRYEM}j8{aBp?1l0L zZVvzTy7GzI$|UHpAzO#;<pdPQ5dRP0C^0;Z?>jx5?)v`6g{ z?P~iTH72^$&PGkhueG|f2N8#Atv7$lzg5iGY!$9ppWJLUCxOK6^S>tIH@1n^EV1nl zNrqTr_W4pRP*5sd(xL^m6;p6MqFnN=Y&J}Og`U@5DR7q$kaA?(qKPcl&U>{#6!Z!E zwB6Q+5*~Tgk_n1}!{)GEFpJ)=VwWtCrWil@oWi#tanT-M$_S1!@to+APX}4-UiBIO z!|lP>PvoiXK~H;7X!m!lPd@&W6IGsth>^vPsQwU7k(DhymY-)9<+RyIRmM`%T*)XT zCb#qhW3iI)er?TKlJMu~OUiP_LPE4M79wY{U=EX4UCO6JY{(UrJQa*dZfxCp*=3Z+ zXv#TShM0XTzSOK4Y9_N-=M8RFpGTUK&7$}CKY!K*GYbydt#Vp87{8)y$Z6MLB4dew zW@3^TwI)?(jb1g3#%&o3-A-=LP;TWG!%GLY{(#k1E`Hf9ozt(;( zR2tD6NJpB1xL!7e9pZmfLay<*fGZ*U_%DsGHDe*>X+Xw8tWg6a<``hn#qfAD+Ofhy z;gl9H+?nVA_0E!rcgm|ZT~R)OyGK*;AiCP!!Rw4uY%iUZOh-?Yn~kVr_sQuRrDYh- zDO*B;>Xb8PxrxO$qPz$yOFg^*AIL=cm;ciBjD;jmp}dx6f{d|UbEqD+?4LnC*<8}V zC7N9Pfej<6qw}E67HRwJb%%e7DMBTC79{GMq(l`aQPc8Hq>#Gj>4`^?z#*4J)u}ho zfe+<)LA`;BDMvk?qwbbl{Mv8rl?kKMVtNY3JWDbb<-Y-gD&)^Z4~kZ0QTa3z!adnQm>RN62T9ap7WETW0sCIQ zW82yo#PHmCLdZU{%B(1(u$3P|*dPvX&xI$)sd6w|Pk6Og9fuOV;9s+F!OYl5nv~?{ zL@SHkg~4p)*O6R(kH|k>*Y$HRiESyw7sM@d4s3XhY^=$q`dEV!u6a1@a{j0Yxeg?s z)%VA5UI^%HaHOfeK3*X&n3QmxA#fe4Bv2o}c~A-4yvheJ3U3C$()x?4%TjpqX5D#q z3R22q!1<2wVlt(@TD0rlM&HV}M*f`y{rIr*(uZ6B(RC%d=b)i^rRYJyrR6yvsBea$ zlSO3T9p4}a(0zuROPP=xy6oKZ32kA((XMRB2b@wBQ`yi>G{6asu)y)_1@UQ^)S_8qDTQ!S@W~7II zXz0cqs$Gn9bo0ldbnPnlgWAnsK<9Sz*WeN+9@fwkQhzBLX)pib&25_W8W>W##2`OS zBqErv)nLoQK>=v3y4&z{;G(lR8-4`HAiu+X>4q|u{e@f{Vp!J2>2Lq zgDwM3ld+w7$RqGW_`VF70{jgNVc`63#@@u28j{xk0QWRdO8@`> diff --git a/bin/modules/block_access.obj b/bin/modules/block_access.obj index a2dd1cd6ecaa3d0fae6b542d0b8d26dab842b2cd..5e88979a150b013e23a34fba85a46e4c5f2f5714 100644 GIT binary patch delta 17 YcmZ3)x`>s-hmncl`(yo#jU2O>04^T|YybcN delta 17 YcmZ3)x`>s-hmnb)=5uD+Mvhrb04xawIRF3v diff --git a/bin/modules/redirect.obj b/bin/modules/redirect.obj index 0b52967d623a957722a4a20b24a4f4b0461135c1..c43c180dae1527bb0fece4f8f1d7044652bcd60b 100644 GIT binary patch delta 17 YcmZ3_x}KH8hmncl`(yo#jU3CF0591ElK=n! delta 17 YcmZ3_x}KH8hmnb)=5uD+Mvmo704>7>U;qFB diff --git a/bin/modules/srv_control.obj b/bin/modules/srv_control.obj index 071e6ccbc497d11b74d4c904342d059aab3d94c0..dbdf1aa0a525acf4541f64fbb56544e2e0c393b8 100644 GIT binary patch delta 17 YcmaFO^O}dlhmncl`(yo#jU35r05_)v*#H0l delta 17 YcmaFO^O}dlhmnb)=5uD+Mvi1Q05y>XrT_o{ diff --git a/bin/modules/test_unit.obj b/bin/modules/test_unit.obj index a0d0c255e7a71a0319f136516ce69f016da8be04..87a1df804a2695b9a0cb327aefb4597f5a84d1aa 100644 GIT binary patch delta 38 ucmbQlH;IqKhmncl`(yo#i5$DR9T@qWW-~A_bi27sJm<>juvvuhA1eUd4GWq8 delta 38 ucmbQlH;IqKhmnb)=5uD+M2_9uCXD<|vl$o|y4@@$o^xe1*(}2Nj}-va01HC^ diff --git a/bin/modules/test_unit4.obj b/bin/modules/test_unit4.obj index 7e7b44614cb6ce80337696954cfd62337d52d31e..53c14877a0acd121634df55aef272f8deeba0dc1 100644 GIT binary patch delta 190 zcmdnPc7cu4hmncl`(ynKv5B10hQAmX7*c@Pj|oTs0Ur=6Fa$X0r6iUlf<++22Ot&4 z$iQ%GVrY(1X?K{7;Ym-&1{*Gh(w~9N$5}EIfO28~MRx#|wH_$(pZM5>-zMO{=oTQq tn?(i4x-waYv6AuoH(48D^>si delta 170 zcmcb>wug<=hmnb)_H$+$(?m{b!w(D$3@JeD!UQCMfES1r7y=yhQW8rN!6Fa>q%MS! zf#KN1&>W@g?l1$xlb((ZHe3v)KLeYOvt%d$<--1p?f@!lJy7C0@v#Z3LBM~}EtAz4 iD;eKTUcmTIb1zU1WD6U^IXLSUob?dSdOrCgQ#}CHoF>%( diff --git a/bin/modules/test_unit5.obj b/bin/modules/test_unit5.obj index 92ba1a96ab40ede873abfba17dc9e6d3dba43603..47d8fae12658fde53d53f681e9f1abfd123759f4 100644 GIT binary patch delta 17 YcmX@ddXAODhmncl`(yo#jU30A05kUm@Bjb+ delta 17 YcmX@ddXAODhmnb)_H$<1Mvh}l05RzWz5oCK diff --git a/bin/modules/test_unit6.obj b/bin/modules/test_unit6.obj new file mode 100644 index 0000000000000000000000000000000000000000..97d53e934302575f78aa5c8c1f704549779a0fda GIT binary patch literal 659 zcmeZaWMcUKSU)3@iGhKc0R&nY_0n<@OTcUhaTrLY0P$-^2%i;5DKG>$=%plr2B2)I(0&)7M7JNy!Iw;*m+k-xF~r9m z;$a921u5!$nqi|~V3(l)1UtEaa{Sxf*xHU5Ui$vA;gCUxh)VO3|E&i~-@9bw7nN9n zlojk`0V&(&!p9C&WeQ|7Agg?Rj73EcsL8YRPV*6_jLZTng$$blJB2KUu>YbxK*g;G zN+dd8bw1R56c7{`@L#k8DE41;0+8%{6B~DkgW(Vh1IQr?KnwypK&%eL7C?Leh(REu zq@*AvJ~J<~gkb`NU7T7}24g4ZLM2(%j%Gi(fbaMo-%YdxH`70v>MD?|qe wkOhh;HU=KJm;hW%1TH247jumW@DBCTCXD<|%8U#Q-EI~ePYSaG0HP%cO#lD@ diff --git a/example/readme.md b/example/readme.md index 8afdd4b..323dcd4 100644 --- a/example/readme.md +++ b/example/readme.md @@ -5,3 +5,4 @@ - `test_unit4.asm` - Модуль отправляет в ответе заданную в файле конфигурации строку параметров и uri адрес запроса клиента. Используется chunked передача ответа. - `test_unit5.asm` - Модуль отправляет ответ используя chunked передачу. - `srv_control.asm` - Модуль, позволяющий удалённо выключать сервер. + - `test_unit6.asm` - Модуль выводящий данные об ipv4 адресе и порте клиента, с которого было установлено соединение с сервером. diff --git a/example/srv_control.asm b/example/srv_control.asm index 1ec1854..9db4673 100644 --- a/example/srv_control.asm +++ b/example/srv_control.asm @@ -4,7 +4,6 @@ public @EXPORT as 'EXPORTS' NO_DEBUG_INPUT = 0 include "macros.inc" -purge mov,add,sub include "proc32.inc" include '../module_api.inc' diff --git a/example/test_unit4.asm b/example/test_unit4.asm index 11816e7..7bc031a 100644 --- a/example/test_unit4.asm +++ b/example/test_unit4.asm @@ -4,7 +4,6 @@ public @EXPORT as 'EXPORTS' NO_DEBUG_INPUT = 0 include "macros.inc" -purge mov,add,sub include "proc32.inc" include '../module_api.inc' @@ -83,6 +82,8 @@ server_entry: invoke IMPORT.send_resp, eax,\ [esi + CONNECT_DATA.uri_path],\ [esp + 4] + mov eax, [esp] + invoke IMPORT.finish_send_resp, eax invoke IMPORT.destruct_resp ; arg in stack add esp, 4 .exit: diff --git a/example/test_unit5.asm b/example/test_unit5.asm index ef41694..da5765b 100644 --- a/example/test_unit5.asm +++ b/example/test_unit5.asm @@ -4,7 +4,6 @@ public @EXPORT as 'EXPORTS' NO_DEBUG_INPUT = 0 include "macros.inc" -purge mov,add,sub include "proc32.inc" include '../module_api.inc' diff --git a/example/test_unit6.asm b/example/test_unit6.asm new file mode 100644 index 0000000..77110e7 --- /dev/null +++ b/example/test_unit6.asm @@ -0,0 +1,113 @@ +; test api 0.1.0 - get cmd path and get context unit +format MS COFF ;<- this is lib format +public @EXPORT as 'EXPORTS' + +NO_DEBUG_INPUT = 0 +include "macros.inc" +include "proc32.inc" + +include '../module_api.inc' + +section '.flat' code readable align 16 + +unit_init: + xor eax, eax + push esi edi + mov esi, [esp + 4*2 + 4] + + cmp dword[esi + IMPORT_DATA.version], API_VERSION + jne .exit + + mov edi, IMPORT + mov ecx, [esi + IMPORT_DATA.sizeof] + shr ecx, 2 ; div 4 + rep movsd + + ; create unit context + mov eax, 1 + ;unit init successful +.exit: + pop edi esi + ret 12 + + +server_entry: + push esi ebp + mov esi, [esp + 4*2 + 4] ; request context + + mov ebp, esp + push dword '

' + push dword ' ' + + mov ecx, 10 + movzx eax, word[esi + CONNECT_DATA.sockaddr.sin_port] + xchg al, ah +@@: + xor edx, edx + div ecx + add dl, '0' + mov byte[esp], dl + add esp, -1 + test eax, eax + jnz @b + + inc esp + push dword 'ort:' + push dword ' p' + + mov ecx, 4 +.loop: + movzx eax, byte[esi + CONNECT_DATA.sockaddr.sin_addr + ecx - 1] +@@: + xor edx, edx + div dword[__10] + add dl, '0' + mov byte[esp], dl + add esp, -1 + test eax, eax + jnz @b + + mov byte[esp], '.' + add esp, -1 + dec ecx + jnz .loop + + add esp, 2 + + push dword 'ip: ' + push dword '

' + + invoke IMPORT.create_resp, esi, 0 + test eax, eax + jz .exit + + mov edx, ebp + mov ecx, esp + sub edx, esp + + push eax + invoke IMPORT.send_resp, eax, ecx, edx + invoke IMPORT.destruct_resp + mov esp, ebp +.exit: + pop ebp esi + ret 8 + +server_close: + + ret 4 + + +section '.data' data readable writable align 16 + +__10: dd 10 + + +@EXPORT: +export \ + unit_init, 'httpd_init', \ + server_entry, 'httpd_serv',\ + server_close, 'httpd_close' + + +IMPORT IMPORT_DATA \ No newline at end of file diff --git a/example/test_unit_2.asm b/example/test_unit_2.asm index b12b651..35f3d25 100644 --- a/example/test_unit_2.asm +++ b/example/test_unit_2.asm @@ -3,7 +3,6 @@ public @EXPORT as 'EXPORTS' NO_DEBUG_INPUT = 0 include "macros.inc" -purge mov,add,sub include "proc32.inc" include '../module_api.inc' diff --git a/httpd.asm b/httpd.asm index 8b1b0e5..5c3edab 100644 --- a/httpd.asm +++ b/httpd.asm @@ -8,6 +8,9 @@ ; ; ;*****************************************************************************; +HTTPD_FIRST_REQUEST_BUFFER = 0x8000 + + ;include "macros.inc" use32 org 0 @@ -16,7 +19,6 @@ M01header.params: dd PATH, 0 include "macros.inc" -purge mov,add,sub include 'module_api.inc' @@ -31,7 +33,7 @@ include 'settings.inc' ;CODE START: - mcall SF_SYS_MISC, SSF_HEAP_INIT ; init heap + call InitHeap mcall SF_SET_EVENTS_MASK, EVM_STACK ;set event bitmap ; init library @@ -75,17 +77,12 @@ START: je .sock_err mov [srv_socket], eax - push srv_sockaddr.length - push dword srv_sockaddr - push dword[srv_socket] - call netfunc_bind; [srv_socket], srv_sockaddr, srv_sockaddr.length + stdcall netfunc_bind, [srv_socket], srv_sockaddr, srv_sockaddr.length cmp eax, -1 je .bind_err ; listen() - push dword[srv_backlog] - push dword[srv_socket] - call netfunc_listen; [srv_socket], [srv_backlog] + stdcall netfunc_listen, [srv_socket], [srv_backlog] cmp eax, -1 jz .listen_err @@ -107,12 +104,11 @@ START: .shutdown: .listen_err: .bind_err: - push dword[srv_socket] - call netfunc_close; [srv_socket] + stdcall netfunc_close, [srv_socket] .err_settings: .sock_err: - mcall SF_TERMINATE_PROCESS + ThreadExit ;----------------------------------------------------------------------------- @@ -120,28 +116,23 @@ thread_connect: sub esp, sizeof.CONNECT_DATA mcall SF_SET_EVENTS_MASK, EVM_STACK ; set event - network event - ; ожидание подключения Accept, sockaddr находится на вершине стека нового потока - ;lea edx, [esp + CONNECT_DATA.sockaddr] ; new sockaddr - ;push dword 16 ; 16 byte - sockaddr length - ;push edx - push srv_sockaddr.length - push dword srv_sockaddr - + ; Accept - wait connection, get socket and sockaddr + lea edx, [esp + CONNECT_DATA.sockaddr] ; new sockaddr + push sizeof.sockaddr_in + push edx push dword[srv_socket] call netfunc_accept cmp eax, -1 jz .err_accept + ; connection is enable mov [esp + CONNECT_DATA.socket], eax - mov ebp, esp - ; соединение установленно, теперь нужно выделить буфер(тоже на 16 кб наверное), и + ; теперь нужно выделить буфер(тоже на 16 кб наверное), и ; прочитать в этот буфер из сокета, когда прочтём ноль(или больше 4 кб), тогда ; выходим из цикла и анализируем заголовки и стартовую стоку. - mov esi, 0x8000 - push esi - call Alloc ;alloc memory 32 kib + stdcall Alloc, HTTPD_FIRST_REQUEST_BUFFER ;alloc memory 32 kib test eax, eax jz .err_alloc @@ -153,7 +144,7 @@ thread_connect: ;read data from socket push dword 0 ;flags mov eax, [esi + CONNECT_DATA.request_size] - push dword 0x8000 + push dword HTTPD_FIRST_REQUEST_BUFFER sub [esp], eax push dword[esi + CONNECT_DATA.buffer_request] add [esp], eax @@ -166,7 +157,7 @@ thread_connect: test eax, eax jz @f add [esi + CONNECT_DATA.request_size], eax - ; cmp [esi + CONNECT_DATA.request_size], 0x8000 ; check end buffer + ; cmp [esi + CONNECT_DATA.request_size], HTTPD_FIRST_REQUEST_BUFFER ; check end buffer ; jb @b @@: ; после получения всего запроса(более или менее всего) выделяем озу для @@ -269,15 +260,14 @@ thread_connect: ; free IN buffer cmp dword[esp + CONNECT_DATA.buffer_request], 0 jz .err_alloc - push dword[esp + CONNECT_DATA.buffer_request] - call Free + + stdcall Free, [esp + CONNECT_DATA.buffer_request] .err_alloc: - push dword[esp + CONNECT_DATA.socket] - call netfunc_close + stdcall netfunc_close, [esp + CONNECT_DATA.socket] .err_accept: - lea ecx,[esp + sizeof.CONNECT_DATA - 0x4000] ; get pointer to alloc memory - mcall 68, 13 ; free - mcall SF_TERMINATE_PROCESS ; close thread + add esp, sizeof.CONNECT_DATA + ; close this thread + ret include 'parser.inc' diff --git a/module_api.inc b/module_api.inc index 5cdbd67..efb7c41 100644 --- a/module_api.inc +++ b/module_api.inc @@ -19,9 +19,16 @@ FLAG_NO_CACHE_CONTROL = 0x80 FLAG_TRANSFER_CHUNKED = 0x100 FLAG_RAW_STREAM = 0x200 +struct sockaddr_in + sin_family dw ? ; sa_family_t + sin_port dw ? ; in_port_t + sin_addr dd ? ; struct in_addr + sin_zero rb 8 ; zero +ends + struct CONNECT_DATA ; 16*4 = 64 bytes - socket dd 0 ; номер сокета подключения - sockaddr dd 16/4 ; socaddr connection + socket dd 0 ; connection socket number + sockaddr sockaddr_in ; socaddr connection buffer_request dd 0 ; pointer to buffer for geting message socket request_size dd 0 ; size geted data from client end_buffer_request dd 0 ; privat data for parser @@ -42,6 +49,8 @@ struct CONNECT_DATA ; 16*4 = 64 bytes message_body_len dd 0 ; length message_body in buffer ends +diff10 'sizeof.CONNECT_DATA: ', 0, sizeof.CONNECT_DATA + struct FILED opcode rd 1 offset rd 2 @@ -112,4 +121,6 @@ struct IMPORT_DATA ;void close_server(); GLOBAL_DATA rd 1 -ends \ No newline at end of file +ends + +HTTPD_THREAD_STACK = 0x4000 ; 16 kib diff --git a/sys_func.inc b/sys_func.inc index b7211cf..1054a73 100644 --- a/sys_func.inc +++ b/sys_func.inc @@ -57,13 +57,6 @@ SOL_SOCKET = 0xffff SO_BINDTODEVICE = 1 shl 9 SO_NONBLOCK = 1 shl 31 -struct sockaddr_in - sin_family dw ? ; sa_family_t - sin_port dw ? ; in_port_t - sin_addr dd ? ; struct in_addr - sin_zero rb 8 ; zero -ends - struct addrinfo ai_flags dd ? ; bitmask of AI_* ai_family dd ? ; PF_* @@ -162,30 +155,52 @@ netfunc_recv: pop ebx edi esi ret 16 +macro ThreadExit { + mcall SF_TERMINATE_PROCESS +} + ; stdcall CreatThread(void* entry_thread); CreateThread: push ebx edi - mcall SF_SYS_MISC, SSF_MEM_ALLOC, 0x4000 ;alloc memory 16 kib for stack + ;alloc memory for stack + mcall SF_SYS_MISC, SSF_MEM_ALLOC, HTTPD_THREAD_STACK test eax, eax jz .err - mov ecx, 0x4000/4 + mov ecx, HTTPD_THREAD_STACK/4 mov edi, eax ;start thread for new connection mov edx, eax xor eax, eax rep stosd - add edx, 0x4000 - mcall SF_CREATE_THREAD, 1, [esp + 2*4 + 4] ;<- thread entry + add edx, HTTPD_THREAD_STACK - 4 + m2m dword[edx], dword[esp + 2*4 + 4] + mcall SF_CREATE_THREAD, 1, .thread ;<- thread entry .err: pop ebx edi ret 4 + +.thread: + pop eax + call eax + lea ecx, [esp - HTTPD_THREAD_STACK] + mcall SF_SYS_MISC, SSF_MEM_FREE + ThreadExit + + +InitHeap: + push ebx + mcall SF_SYS_MISC, SSF_HEAP_INIT ; init heap + pop ebx + ret + ; stdcall Alloc(uint32_t size) Alloc: push ebx mcall SF_SYS_MISC, SSF_MEM_ALLOC, [esp + 4 + 4] pop ebx ret 4 + ; stdcall Free(void* ptr) Free: push ebx @@ -788,7 +803,7 @@ finish_send_resp: mov byte[esp], '0' mov ecx, esp - mov eax, [ebp + RESPD.session] + mov eax, [edx + RESPD.session] push dword 0 push dword 5 ; size buffer diff --git a/utils/block_access.asm b/utils/block_access.asm index b9ed45c..b379282 100644 --- a/utils/block_access.asm +++ b/utils/block_access.asm @@ -4,7 +4,6 @@ public @EXPORT as 'EXPORTS' NO_DEBUG_INPUT = 0 include "macros.inc" -purge mov,add,sub include "proc32.inc" include '../module_api.inc' diff --git a/utils/redirect.asm b/utils/redirect.asm index 0859082..37d8165 100644 --- a/utils/redirect.asm +++ b/utils/redirect.asm @@ -4,7 +4,6 @@ public @EXPORT as 'EXPORTS' NO_DEBUG_INPUT = 0 include "macros.inc" -purge mov,add,sub include "proc32.inc" include '../module_api.inc'