| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- /*
- * libkms.c
- */
- #ifndef CONFIG
- #define CONFIG "config.h"
- #endif // CONFIG
- #include CONFIG
- #ifdef EXTERNAL
- #undef EXTERNAL
- #endif
- #define EXTERNAL dllexport
- #define DLLVERSION 0x30002
- #include "libkms.h"
- #include "shared_globals.h"
- #include "network.h"
- #include "helpers.h"
- #ifndef _WIN32
- #include <signal.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <errno.h>
- #include <netinet/in.h>
- #endif // WIN32
- static int_fast8_t IsServerStarted = FALSE;
- #ifdef _WIN32
- #ifndef USE_MSRPC
- static int_fast8_t SocketsInitialized = FALSE;
- WSADATA wsadata;
- static int initializeWinSockets()
- {
- if (SocketsInitialized) return 0;
- SocketsInitialized = TRUE;
- return WSAStartup(0x0202, &wsadata);
- }
- #endif // USE_MSRPC
- #endif // _WIN32
- EXTERNC __declspec(EXTERNAL) char* __cdecl GetErrorMessage()
- {
- return ErrorMessage;
- }
- EXTERNC __declspec(EXTERNAL) SOCKET __cdecl ConnectToServer(const char* host, const char* port, const int addressFamily)
- {
- SOCKET sock;
- *ErrorMessage = 0;
- # if defined(_WIN32) && !defined(USE_MSRPC)
- initializeWinSockets();
- # endif // defined(_WIN32) && !defined(USE_MSRPC)
- size_t adrlen = strlen(host) + 16;
- char* RemoteAddr = (char*)alloca(adrlen);
- snprintf(RemoteAddr, adrlen, "[%s]:%s", host, port);
- sock = connectToAddress(RemoteAddr, addressFamily, FALSE);
- if (sock == INVALID_RPCCTX)
- {
- printerrorf("Fatal: Could not connect to %s\n", RemoteAddr);
- return sock;
- }
- return sock;
- }
- EXTERNC __declspec(EXTERNAL) RpcStatus __cdecl BindRpc(const SOCKET sock, const int_fast8_t useMultiplexedRpc)
- {
- *ErrorMessage = 0;
- UseMultiplexedRpc = useMultiplexedRpc;
- return rpcBindClient(sock, FALSE);
- }
- EXTERNC __declspec(EXTERNAL) void __cdecl CloseConnection(const SOCKET sock)
- {
- socketclose(sock);
- }
- EXTERNC __declspec(EXTERNAL) DWORD __cdecl SendKMSRequest(const SOCKET sock, RESPONSE* baseResponse, REQUEST* baseRequest, RESPONSE_RESULT* result, BYTE *hwid)
- {
- *ErrorMessage = 0;
- return SendActivationRequest(sock, baseResponse, baseRequest, result, hwid);
- }
- EXTERNC __declspec(EXTERNAL) int_fast8_t __cdecl IsDisconnected(const SOCKET sock)
- {
- return isDisconnected(sock);
- }
- EXTERNC __declspec(EXTERNAL) DWORD __cdecl StartKmsServer(const int port, RequestCallback_t requestCallback)
- {
- #ifndef SIMPLE_SOCKETS
- char listenAddress[64];
- if (IsServerStarted) return !0;
- # ifdef _WIN32
- int error = initializeWinSockets();
- if (error) return error;
- # endif // _WIN32
- CreateResponseBase = requestCallback;
- int maxsockets = 0;
- int_fast8_t haveIPv4 = FALSE;
- int_fast8_t haveIPv6 = FALSE;
- if (checkProtocolStack(AF_INET)) { haveIPv4 = TRUE; maxsockets++; }
- if (checkProtocolStack(AF_INET6)) { haveIPv6 = TRUE; maxsockets++; }
- if(!maxsockets) return !0;
- SocketList = (SOCKET*)vlmcsd_malloc(sizeof(SOCKET) * (size_t)maxsockets);
- numsockets = 0;
- if (haveIPv4)
- {
- snprintf(listenAddress, 64, "0.0.0.0:%u", (unsigned int)port);
- addListeningSocket(listenAddress);
- }
- if (haveIPv6)
- {
- snprintf(listenAddress, 64, "[::]:%u", (unsigned int)port);
- addListeningSocket(listenAddress);
- }
- if (!numsockets)
- {
- free(SocketList);
- return !0;
- }
- IsServerStarted = TRUE;
- runServer();
- IsServerStarted = FALSE;
- return 0;
- # else // SIMPLE_SOCKETS
- if (IsServerStarted) return !0;
- int error;
- # ifdef _WIN32
- error = initializeWinSockets();
- if (error) return error;
- # endif // _WIN32
- defaultport = vlmcsd_malloc(16);
- snprintf((char*)defaultport, (size_t)16, "%i", port);
- CreateResponseBase = requestCallback;
- error = listenOnAllAddresses();
- if (error) return error;
- IsServerStarted = TRUE;
- runServer();
- IsServerStarted = FALSE;
- return 0;
- # endif // SIMPLE_SOCKETS
- }
- EXTERNC __declspec(EXTERNAL) DWORD __cdecl StopKmsServer()
- {
- if (!IsServerStarted) return !0;
- closeAllListeningSockets();
- # ifndef SIMPLE_SOCKETS
- if (SocketList) free(SocketList);
- # endif
- return 0;
- }
- EXTERNC __declspec(EXTERNAL) int __cdecl GetLibKmsVersion()
- {
- return DLLVERSION;
- }
- EXTERNC __declspec(EXTERNAL) const char* const __cdecl GetEmulatorVersion()
- {
- return VERSION;
- }
|