micetools/src/micetools/launcher/spawn.c

64 lines
2.0 KiB
C

#include "spawn.h"
#include "../lib/mice/mice.h"
spawn_t mxspawns[3] = {
{ "keychip", SPAWN_DUMMY, MdkThreadProc, MxkThreadProc },
{ "master", SPAWN_DUMMY, MdmThreadProc, NULL },
{ "installer", SPAWN_DUMMY, MdiThreadProc, NULL },
};
int mxkMain();
int miceDummyKeychip(unsigned short textPort, unsigned short binaryPort, bool global);
int miceDummyMaster(unsigned short textPort, unsigned short binaryPort, bool global);
int miceDummyInstaller(unsigned short textPort, unsigned short binaryPort, bool global);
DWORD WINAPI MdkThreadProc(LPVOID lpParameter) {
miceDummyKeychip(40106, 40107, false);
return 0;
};
DWORD WINAPI MxkThreadProc(LPVOID lpParameter) {
mxkMain();
return 0;
};
DWORD WINAPI MdmThreadProc(LPVOID lpParameter) {
miceDummyMaster(40100, 40101, false);
return 0;
};
DWORD WINAPI MdiThreadProc(LPVOID lpParameter) {
miceDummyInstaller(40102, 40103, false);
return 0;
};
static inline void spawn_one(spawn_t* spawn) {
if (spawn->mode == SPAWN_NONE) {
log_warning(plfBoot, "Not spawning %s", spawn->name);
return;
}
if (spawn->mode == SPAWN_BOTH) {
log_error(plfBoot, "Invalid spawn mode for %s! Only one of md or mx may be selected",
spawn->name);
return;
}
if (spawn->mode == SPAWN_REAL) {
if (spawn->real == NULL) {
log_error(plfBoot, "mx mode for %s is not supported yet", spawn->name);
return;
}
CreateThread(NULL, 0, spawn->real, NULL, 0, NULL);
} else if (spawn->mode == SPAWN_DUMMY) {
if (spawn->dummy == NULL) {
log_error(plfBoot, "md mode for %s is not supported yet", spawn->name);
return;
}
CreateThread(NULL, 0, spawn->dummy, NULL, 0, NULL);
} else {
log_error(plfBoot, "Unknown spawn mode %d for %s", spawn->mode, spawn->name);
return;
}
}
void spawn_pcp_processes(void) {
for (int i = 0; i < _countof(mxspawns); i++) spawn_one(&(mxspawns[i]));
}