aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsegfault <toni@impl.cc>2020-11-27 09:16:47 -0800
committersegfault <toni@impl.cc>2020-11-27 09:16:47 -0800
commiteaba393b123fe2c282d883b05c9fea28d9c6179a (patch)
treeb42110c82abbff8baa20f5de44403eb1ed6b637c
parent11ab26cd9642d6be7496df5e4e14486a51fc5419 (diff)
CEPacket template class, CMD_CREATETOOLHELP32SNAPSHOT and preps for CMD_PROCESS32FIRST / CMD_PROCESS32NEXT
-rw-r--r--CheatEngineServer/CheatEngine.h20
-rw-r--r--CheatEngineServer/CheatEngineServer.cpp2
-rw-r--r--CheatEngineServer/CommandDispatcher.cpp83
3 files changed, 104 insertions, 1 deletions
diff --git a/CheatEngineServer/CheatEngine.h b/CheatEngineServer/CheatEngine.h
index 3cfbc32..9d13183 100644
--- a/CheatEngineServer/CheatEngine.h
+++ b/CheatEngineServer/CheatEngine.h
@@ -3,6 +3,7 @@
#include <winsock.h>
#define CE_PORT "52736"
+#define MSG_WAITALL 0x8
typedef enum ce_command {
CMD_GETVERSION = 0,
@@ -64,6 +65,25 @@ static inline char const * ce_command_to_string(enum ce_command cmd)
return cmd_map[cmd];
}
+#pragma pack(1)
+typedef struct {
+ DWORD dwFlags;
+ DWORD th32ProcessID;
+} CeCreateToolhelp32Snapshot, *PCeCreateToolhelp32Snapshot;
+
+typedef struct {
+ int result;
+ int pid;
+ int processnamesize;
+ //processname
+} CeProcessEntry, *PCeProcessEntry;
+#pragma pack()
+
+template <class T>
+class CEPacket {
+
+};
+
class CEConnection {
public:
explicit CEConnection(SOCKET s) : sock(s) {}
diff --git a/CheatEngineServer/CheatEngineServer.cpp b/CheatEngineServer/CheatEngineServer.cpp
index 3dc6361..436975b 100644
--- a/CheatEngineServer/CheatEngineServer.cpp
+++ b/CheatEngineServer/CheatEngineServer.cpp
@@ -35,9 +35,11 @@ static SOCKET make_accept_sock(const char *servspec) {
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&one, sizeof(one));
if (bind(sock, ai->ai_addr, (int)ai->ai_addrlen) != 0)
{
+ std::cout << "bind() failed" << std::endl;
}
if (listen(sock, 256) != 0)
{
+ std::cout << "listen() failed" << std::endl;
}
freeaddrinfo(res);
diff --git a/CheatEngineServer/CommandDispatcher.cpp b/CheatEngineServer/CommandDispatcher.cpp
index 1f9a7d1..386e2c0 100644
--- a/CheatEngineServer/CommandDispatcher.cpp
+++ b/CheatEngineServer/CommandDispatcher.cpp
@@ -4,6 +4,74 @@
#include <iostream>
+
+static int recvall(SOCKET s, void *buf, int size, int flags)
+{
+ int totalreceived = 0;
+ int sizeleft = size;
+ char *buffer = (char*)buf;
+
+ flags = flags | MSG_WAITALL;
+ while (sizeleft > 0)
+ {
+ int i = recv(s, &buffer[totalreceived], sizeleft, flags);
+ if (i == 0)
+ {
+ std::cout << "recv returned 0" << std::endl;
+ return i;
+ }
+ if (i <= -1)
+ {
+ std::cout << "recv returned -1" << std::endl;
+ if (errno == EINTR)
+ {
+ std::cout << "errno = EINTR\n" << std::endl;
+ i = 0;
+ }
+ else
+ {
+ std::cout << "Error during recvall: " << (int)i << ". errno=" << errno << "\n" << std::endl;
+ return i; //read error, or disconnected
+ }
+ }
+ totalreceived += i;
+ sizeleft -= i;
+ }
+ return totalreceived;
+}
+
+static int sendall(SOCKET s, void *buf, int size, int flags)
+{
+ int totalsent = 0;
+ int sizeleft = size;
+ char *buffer = (char*)buf;
+
+ while (sizeleft > 0)
+ {
+ int i = send(s, &buffer[totalsent], sizeleft, flags);
+
+ if (i == 0)
+ {
+ return i;
+ }
+ if (i == -1)
+ {
+ if (errno == EINTR)
+ i = 0;
+ else
+ {
+ std::cout << "Error during sendall: " << (int)i << ". errno=" << errno << "\n" << std::endl;
+ return i;
+ }
+ }
+
+ totalsent += i;
+ sizeleft -= i;
+ }
+
+ return totalsent;
+}
+
int DispatchCommand(CEConnection & con, char command)
{
enum ce_command cmd = (enum ce_command)command;
@@ -20,8 +88,21 @@ int DispatchCommand(CEConnection & con, char command)
break;
case CMD_OPENPROCESS:
break;
- case CMD_CREATETOOLHELP32SNAPSHOT:
+ case CMD_CREATETOOLHELP32SNAPSHOT: {
+ HANDLE result = (HANDLE)((ULONG_PTR)0x1);
+ CeCreateToolhelp32Snapshot params;
+
+ if (recvall(con.getSocket(), &params, sizeof(CeCreateToolhelp32Snapshot), MSG_WAITALL) > 0)
+ {
+ std::cout << "Calling CreateToolhelp32Snapshot with flags 0x" << std::hex << params.dwFlags
+ << " for PID 0x" << std::hex << params.th32ProcessID << std::endl;
+ }
+ if (sendall(con.getSocket(), &result, sizeof(result), 0) == sizeof(result))
+ {
+ return 0;
+ }
break;
+ }
case CMD_PROCESS32FIRST:
break;
case CMD_PROCESS32NEXT: