PageRenderTime 26ms CodeModel.GetById 34ms RepoModel.GetById 1ms app.codeStats 0ms

/code/dias/aimkstp_wrap.cpp

https://github.com/macx0r/dias-desktop
C++ | 284 lines | 251 code | 29 blank | 4 comment | 38 complexity | 780b9bf2a51a85d8225f77eb27b64d73 MD5 | raw file
  1. #include "stdafx.h"
  2. #include <malloc.h>
  3. #include <memory.h>
  4. #include <winsock2.h>
  5. #include "aimkstp.h"
  6. #define KSSOCK_BUFF_SIZE 0x10000
  7. udword kstp_errno;
  8. struct errordef_st kserr_messages[] = {
  9. KSERR_SUCCESS, "Operation completed successfully",
  10. KSERR_NOACCESS, "Access denied",
  11. KSERR_SHARECONFLICT, "Object sharing conflict",
  12. KSERR_NOTHOBJ, "Invalid object handle",
  13. KSERR_NOTEXISTS, "Object not exists",
  14. KSERR_OPENED, "Object is already opened",
  15. KSERR_SOCKET, "Error during creating server socket",
  16. KSERR_BIND, "Error during binding socket",
  17. KSERR_LISTEN, "Error during listen socket",
  18. KSERR_COULDNTSTART, "Kernel service couldn't start",
  19. KSERR_OBJOPENED, "Object is successfully opened",
  20. KSERR_WAITFORCLIENT, "Kernel service thread is waiting for client",
  21. KSERR_CLIENTCONNECTED, "Client has been successfully connected",
  22. KSERR_CLIENTDISCONN, "Client session was completed successfully",
  23. KSERR_ACCEPTSOCKET, "Error while accepting socket connection",
  24. KSERR_SOCKRECV, "Socket read error",
  25. KSERR_SOCKRECVDATA, "Wrong request format",
  26. KSERR_ARGCOUNT, "Wrong arguments count in service procedure query",
  27. KSERR_ARGTYPE, "Wrong argument type in service procedure query",
  28. KSERR_NULLPTR, "NULL pointer",
  29. KSERR_NEWCLIENT, "New cliend has been logged in",
  30. KSERR_BYECLIENT, "Client has been loged out",
  31. KSERR_UNKNOWNCMD, "Unknown service call",
  32. KSERR_OUTOFMEM, "Out of memory",
  33. KSERR_NOTKSMEM, "Not a kernel service memory object",
  34. KSERR_NOTOWNER, "Non-owner access denied",
  35. KSERR_MEMINT, "Internal kernel service memory manager error",
  36. KSERR_SOCKRECVFMT, "Wrong request format",
  37. KSERR_STARTED, "Dias Kernel Service was successfully started",
  38. KSERR_SRCFILEOPEN, "Unable to open source file",
  39. KSERR_OBJFILEOPEN, "Unable to create object's file",
  40. KSERR_NOTIMPLEMENTED, "Service is not implemented",
  41. KSERR_WRONGSRCPATH, "Wrong source file path specified",
  42. KSERR_WRONGSRCFILE, "Wrong source file format",
  43. KSERR_UNKNOWNDOBJF, "Unknown object file format specified",
  44. KSERR_UNKNOWNDOBJT, "Unknown object type specified",
  45. KSERR_OBJDBINIT, "Unable to initialize database connection",
  46. KSERR_OBJDBCONN, "Unable to connect objects' database",
  47. KSERR_MAXCLIENTS, "Unable to connect client: maximum clients number reached",
  48. KSERR_SQL, "SQL error",
  49. KSERR_OPFAILED, "Operation failed",
  50. KSERR_OBJEXISTS, "Object already exists in database",
  51. KSERR_OBJHASPARENTS, "Object has parents",
  52. KSERR_OBJNOTPARENT, "Object is not a parents",
  53. KSERR_QUOT, "Quota limit",
  54. 0xFFFFFFFF, "Unknown internal error"
  55. };
  56. #define VALIDATE_A(cond,err,a) if (cond) { \
  57. kstp_errno = err; \
  58. a; \
  59. return (false); \
  60. }
  61. #define VALIDATE(cond,err) if (cond) { \
  62. kstp_errno = err; \
  63. return (false); \
  64. }
  65. bool kstp_allocate (packet* data, uvar32_64 argsno) {
  66. uvar32_64 i;
  67. kstp_errno = 0;
  68. VALIDATE (!data, KSTPERR_NULLPTR);
  69. data->argc = argsno;
  70. VALIDATE (!(data->argt = (ubyte*)malloc (argsno)), KSTPERR_OUTOFMEM);
  71. VALIDATE (!(data->argv = (void**)malloc (argsno * sizeof (void*))), KSTPERR_OUTOFMEM);
  72. for (i = 0 ; i < data->argc ; i++)
  73. data->argv[i] = NULL;
  74. return (true);
  75. }
  76. void kstp_release (packet* data) {
  77. uvar32_64 i;
  78. kstp_errno = 0;
  79. if (!data) return;
  80. for (i = 0 ; data->argv && i < data->argc ; i++) {
  81. if (data->argv[i] && data->argt[i] == 0x00)
  82. strsafe_free ((string)data->argv[i]);
  83. else
  84. free (data->argv[i]);
  85. }
  86. free (data->argv);
  87. free (data->argt);
  88. }
  89. bool kstp_send (SOCKET s, packet* data) {
  90. udword i;
  91. ubyte crc8;
  92. uvar32_64 len, buff_len;
  93. uchar *sendbuff, *ptr;
  94. kstp_errno = 0;
  95. VALIDATE (!data, KSTPERR_NULLPTR);
  96. len = 76 + sizeof (uvar32_64) + data->argc * (1 + 4);
  97. for (i = 0 ; i < data->argc ; ++i) {
  98. if (data->argt[i] == 0x00) len += strsafe_len ((string)(data->argv[i]));
  99. if (data->argt[i] == 0x01) len += sizeof (udword);
  100. if (data->argt[i] == 0x02) len += sizeof (rtbyte);
  101. }
  102. VALIDATE (!(sendbuff = (uchar*)malloc (buff_len = len)), KSTPERR_OUTOFMEM);
  103. memset (sendbuff, 0, buff_len);
  104. ptr = sendbuff + 4;
  105. memcpy (ptr, &(len), 4);
  106. memcpy (ptr += 4, &(data->cmd), 4);
  107. memcpy (ptr += 4, &(data->argc), sizeof (uvar32_64));
  108. memcpy (ptr += sizeof (uvar32_64), data->key, 64);
  109. memcpy (ptr += 64, data->argt, data->argc);
  110. ptr += data->argc;
  111. for (i = 0 ; i < data->argc ; ++i)
  112. switch (data->argt[i]) {
  113. case 0x00:
  114. len = *(udword*)(ptr) = strsafe_len ((string)(data->argv[i]));
  115. memcpy (ptr += 4, strsafe_ptr ((string)(data->argv[i])), len);
  116. ptr += *(udword*)(ptr - 4);
  117. break;
  118. case 0x01:
  119. *(udword*)(ptr) = 4;
  120. memcpy (ptr += 4, data->argv[i], 4);
  121. ptr += 4;
  122. break;
  123. case 0x02:
  124. *(udword*)(ptr) = sizeof (rtbyte);
  125. memcpy (ptr += 4, data->argv[i], sizeof (rtbyte));
  126. ptr += sizeof (rtbyte);
  127. break;
  128. }
  129. for (ptr = sendbuff + 4, crc8 = 0; (uvar32_64)(ptr - sendbuff) < len; ++ptr)
  130. crc8 ^= *ptr;
  131. *(udword*)sendbuff = crc8;
  132. VALIDATE_A (send (s, (const char *)sendbuff, buff_len, 0) == -1, KSTPERR_SOCKRECV, free (sendbuff));
  133. kstp_release (data);
  134. free (sendbuff);
  135. return (true);
  136. }
  137. bool kstp_recv (SOCKET s, packet* data) {
  138. udword i;
  139. ubyte crc8;
  140. uvar32_64 len;
  141. ubyte *recvbuff, *ptr;
  142. kstp_errno = 0;
  143. VALIDATE (!data, KSTPERR_NULLPTR);
  144. VALIDATE (!(recvbuff = (uchar*)malloc (KSSOCK_BUFF_SIZE)), KSTPERR_OUTOFMEM);
  145. memset (recvbuff, 0, KSSOCK_BUFF_SIZE);
  146. VALIDATE_A ((len = recv (s, (char *)recvbuff, KSSOCK_BUFF_SIZE, 0)) == -1, KSTPERR_SOCKRECV, free (recvbuff));
  147. /* TODO: If received len == KSSOCK_BUFF_SIZE and ptr->len > KSSOCK_BUFF_SIZE receive other
  148. strings and splice them */
  149. for (ptr = recvbuff + 4, crc8 = 0; (uvar32_64)(ptr - recvbuff) < len; ++ptr)
  150. crc8 ^= *ptr;
  151. ptr = recvbuff;
  152. /* TODO: Do CRC check */
  153. /* VALIDATE_A (crc8 != *(udword*)(ptr) || len != *(udword*)(ptr + 4) || *(udword*)(ptr + 12) >= len / 8, KSTPERR_SOCKRECVFMT, free (sendbuff));*/
  154. data->cmd = *(udword*)(ptr += 8);
  155. data->argc = *(udword*)(ptr += 4);
  156. memcpy (data->key, ptr += 4, 64);
  157. VALIDATE_A (!(data->argt = (ubyte *)malloc (data->argc)), KSTPERR_OUTOFMEM, free (recvbuff));
  158. VALIDATE_A (!(data->argv = (void **)malloc (sizeof (void *) * data->argc)), KSTPERR_OUTOFMEM,
  159. free (recvbuff); free (data->argt));
  160. memset (data->argv, 0, sizeof (void *) * data->argc);
  161. memcpy (data->argt, ptr += 64, data->argc);
  162. ptr += data->argc;
  163. for (i = 0 ; i < data->argc ; ++i)
  164. switch (data->argt[i]) {
  165. case 0x00:
  166. data->argv[i] = strsafe_frombin (ptr + 4, len = *(udword*)(ptr));
  167. ptr += len + 4;
  168. break;
  169. case 0x01:
  170. VALIDATE_A ((len = *(udword*)ptr) != 4, KSTPERR_SOCKRECVFMT,
  171. free (recvbuff); kstp_release (data));
  172. VALIDATE_A (!(data->argv[i] = malloc (len)), KSTPERR_OUTOFMEM,
  173. free (recvbuff); kstp_release (data));
  174. memcpy (data->argv[i], ptr += 4, len);
  175. ptr += 4;
  176. break;
  177. case 0x02:
  178. VALIDATE_A (*(udword*)(ptr) != sizeof (rtbyte), KSTPERR_SOCKRECVFMT,
  179. free (recvbuff); kstp_release (data));
  180. VALIDATE_A (!(data->argv[i] = malloc (len)), KSTPERR_OUTOFMEM,
  181. free (recvbuff); kstp_release (data));
  182. memcpy (data->argv[i], ptr += 4, len);
  183. ptr += sizeof (rtbyte);
  184. break;
  185. }
  186. free (recvbuff);
  187. return (true);
  188. }
  189. bool kstp_get_string (packet* data, uvar32_64 argno, string* val) {
  190. kstp_errno = 0;
  191. VALIDATE (!data, KSTPERR_NULLPTR);
  192. VALIDATE (argno >= data->argc, KSTPERR_ARGCOUNT);
  193. VALIDATE (data->argt[argno] != 0x00, KSTPERR_ARGTYPE);
  194. VALIDATE (!val, KSTPERR_NULLPTR);
  195. *val = (string)(data->argv[argno]);
  196. return (true);
  197. }
  198. bool kstp_get_int (packet* data, uvar32_64 argno, sdword* val) {
  199. kstp_errno = 0;
  200. VALIDATE (!data, KSTPERR_NULLPTR);
  201. VALIDATE (argno >= data->argc, KSTPERR_ARGCOUNT);
  202. VALIDATE (data->argt[argno] != 0x01, KSTPERR_ARGTYPE);
  203. VALIDATE (!val, KSTPERR_NULLPTR);
  204. *val = *(sdword *)(data->argv[argno]);
  205. return (true);
  206. }
  207. bool kstp_get_real (packet* data, uvar32_64 argno, rtbyte* val) {
  208. kstp_errno = 0;
  209. VALIDATE (!data, KSTPERR_NULLPTR);
  210. VALIDATE (argno >= data->argc, KSTPERR_ARGCOUNT);
  211. VALIDATE (data->argt[argno] != 0x02, KSTPERR_ARGTYPE);
  212. VALIDATE (!val, KSTPERR_NULLPTR);
  213. *val = *(rtbyte *)(data->argv[argno]);
  214. return (true);
  215. }
  216. bool kstp_set_string (packet* data, uvar32_64 argno, string val) {
  217. kstp_errno = 0;
  218. VALIDATE (!data, KSTPERR_NULLPTR);
  219. VALIDATE (argno >= data->argc, KSTPERR_ARGCOUNT);
  220. VALIDATE (!data->argt || !data->argv, KSTPERR_NULLPTR);
  221. data->argt[argno] = 0x00;
  222. if (!val)
  223. data->argv[argno] = strsafe_fromstr ("", 1);
  224. else {
  225. VALIDATE (!(data->argv[argno] = malloc (sizeof(struct string_st) + strsafe_len (val))), KSTPERR_OUTOFMEM);
  226. memcpy ((string)(data->argv[argno]), val, sizeof (struct string_st) + strsafe_len (val));
  227. }
  228. return (true);
  229. }
  230. bool kstp_set_int (packet* data, uvar32_64 argno, sdword val) {
  231. kstp_errno = 0;
  232. VALIDATE (!data, KSTPERR_NULLPTR);
  233. VALIDATE (argno >= data->argc, KSTPERR_ARGCOUNT);
  234. VALIDATE (!data->argt || !data->argv, KSTPERR_NULLPTR);
  235. data->argt[argno] = 0x01;
  236. VALIDATE (!(data->argv[argno] = malloc (sizeof(sdword))), KSTPERR_OUTOFMEM);
  237. *(sdword *)(data->argv[argno]) = val;
  238. return (true);
  239. }
  240. bool kstp_set_real (packet* data, uvar32_64 argno, rtbyte val) {
  241. kstp_errno = 0;
  242. VALIDATE (!data, KSTPERR_NULLPTR);
  243. VALIDATE (argno >= data->argc, KSTPERR_ARGCOUNT);
  244. VALIDATE (!data->argt || !data->argv, KSTPERR_NULLPTR);
  245. data->argt[argno] = 0x02;
  246. VALIDATE (!(data->argv[argno] = malloc (sizeof(rtbyte))), KSTPERR_OUTOFMEM);
  247. *(rtbyte *)(data->argv[argno]) = val;
  248. return (true);
  249. }
  250. char* kstp_msg (error_t err) {
  251. uvar32_64 i = 0;
  252. struct errordef_st* e = kserr_messages;
  253. while (e[i].type != 0xFFFFFFFF && e[i].type != err) i++;
  254. return (e[i].message);
  255. }