mirror of
https://github.com/WindowsNT351/CE-Collections.git
synced 2025-12-26 17:10:25 +08:00
202B105
This commit is contained in:
parent
54ffedacee
commit
5581c18bd8
726
WNT/shellmgr.exe/main.cpp
Normal file
726
WNT/shellmgr.exe/main.cpp
Normal file
@ -0,0 +1,726 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <afxwin.h>
|
||||
//#include <psapi.h>
|
||||
#include <tlhelp32.h>
|
||||
#include <conio.h>
|
||||
#include <iostream>
|
||||
#include <VersionHelpers.h>
|
||||
//#pragma comment(lib, "psapi.lib")
|
||||
using namespace std;
|
||||
//#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
|
||||
|
||||
BOOL LoadNTDriver(char* lpszDriverName, char* lpszDriverPath) {
|
||||
char szDriverImagePath[256];
|
||||
GetFullPathName(lpszDriverPath, 256, szDriverImagePath, NULL);
|
||||
BOOL bRet = FALSE;
|
||||
SC_HANDLE hServiceMgr = NULL;
|
||||
SC_HANDLE hServiceDDK = NULL;
|
||||
|
||||
hServiceMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
||||
if (hServiceMgr == NULL) {
|
||||
printf("OpenSCManager() Failed %d!\n", GetLastError());
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
hServiceDDK = CreateService(hServiceMgr, lpszDriverName, lpszDriverName, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, szDriverImagePath, NULL, NULL, NULL, NULL, NULL);
|
||||
if (hServiceDDK == NULL) {
|
||||
DWORD dwRtn = GetLastError();
|
||||
if (dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS) {
|
||||
printf("CreateService() Failed %d!\n", dwRtn);
|
||||
CloseServiceHandle(hServiceMgr);
|
||||
return FALSE;
|
||||
}
|
||||
hServiceDDK = OpenService(hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS);
|
||||
if (hServiceDDK == NULL) {
|
||||
printf("OpenService() Failed %d!\n", GetLastError());
|
||||
CloseServiceHandle(hServiceMgr);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
bRet = StartService(hServiceDDK, NULL, NULL);
|
||||
if (!bRet) {
|
||||
DWORD dwRtn = GetLastError();
|
||||
if (dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING) {
|
||||
printf("StartService() Failed %d!\n", dwRtn);
|
||||
CloseServiceHandle(hServiceDDK);
|
||||
CloseServiceHandle(hServiceMgr);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
CloseServiceHandle(hServiceDDK);
|
||||
CloseServiceHandle(hServiceMgr);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// 卸载驱动程序
|
||||
BOOL UnloadNTDriver(char* szSvrName) {
|
||||
BOOL bRet = FALSE;
|
||||
SC_HANDLE hServiceMgr = NULL;
|
||||
SC_HANDLE hServiceDDK = NULL;
|
||||
SERVICE_STATUS SvrSta;
|
||||
|
||||
hServiceMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
||||
if (hServiceMgr == NULL) {
|
||||
printf("OpenSCManager() Failed %d!\n", GetLastError());
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
hServiceDDK = OpenService(hServiceMgr, szSvrName, SERVICE_ALL_ACCESS);
|
||||
if (hServiceDDK == NULL) {
|
||||
printf("OpenService() Failed %d!\n", GetLastError());
|
||||
CloseServiceHandle(hServiceMgr);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!ControlService(hServiceDDK, SERVICE_CONTROL_STOP, &SvrSta)) {
|
||||
printf("ControlService() Failed %d!\n", GetLastError());
|
||||
}
|
||||
|
||||
if (!DeleteService(hServiceDDK)) {
|
||||
printf("DeleteService() Failed %d!\n", GetLastError());
|
||||
}
|
||||
|
||||
CloseServiceHandle(hServiceDDK);
|
||||
CloseServiceHandle(hServiceMgr);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL KillNTDriver(char* szSvrName) {
|
||||
BOOL bRet = FALSE;
|
||||
SC_HANDLE hServiceMgr = NULL;
|
||||
SC_HANDLE hServiceDDK = NULL;
|
||||
SERVICE_STATUS SvrSta;
|
||||
|
||||
hServiceMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
|
||||
if (hServiceMgr == NULL) {
|
||||
//printf("OpenSCManager() Failed %d!\n", GetLastError());
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
hServiceDDK = OpenService(hServiceMgr, szSvrName, SERVICE_ALL_ACCESS);
|
||||
if (hServiceDDK == NULL) {
|
||||
//printf("OpenService() Failed %d!\n", GetLastError());
|
||||
CloseServiceHandle(hServiceMgr);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!ControlService(hServiceDDK, SERVICE_CONTROL_STOP, &SvrSta)) {
|
||||
//printf("ControlService() Failed %d!\n", GetLastError());
|
||||
}
|
||||
|
||||
|
||||
CloseServiceHandle(hServiceDDK);
|
||||
CloseServiceHandle(hServiceMgr);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool DeleteDirectory(CString DirName)
|
||||
{
|
||||
CString PUBPATH;
|
||||
PUBPATH = DirName;
|
||||
CFileFind tempFind;
|
||||
DirName += "\\*.*";
|
||||
BOOL IsFinded = (BOOL)tempFind.FindFile(DirName);
|
||||
//cout << IsFinded <<endl;
|
||||
while (IsFinded)
|
||||
{
|
||||
IsFinded = (BOOL)tempFind.FindNextFile();
|
||||
if (!tempFind.IsDots())
|
||||
{
|
||||
CString strDirName;
|
||||
strDirName += PUBPATH;
|
||||
strDirName += "\\";
|
||||
strDirName += tempFind.GetFileName();
|
||||
if (tempFind.IsDirectory())
|
||||
{
|
||||
DeleteDirectory(strDirName);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetFileAttributes(strDirName, FILE_ATTRIBUTE_NORMAL); //去掉文件的系统和隐藏属性
|
||||
DeleteFile(strDirName);
|
||||
}
|
||||
}
|
||||
}
|
||||
tempFind.Close();
|
||||
if (!RemoveDirectory(PUBPATH))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
int fileCopy(char *in, char *out)
|
||||
{
|
||||
if (!CopyFile(in, out, FALSE))
|
||||
return 0;
|
||||
SetFileAttributes(out, FILE_ATTRIBUTE_NORMAL); //去掉文件属性
|
||||
return 1;
|
||||
}
|
||||
|
||||
int CopyDir(TCHAR* srcFolder, TCHAR* dstFolder)
|
||||
{
|
||||
SHFILEOPSTRUCT fop = { 0 };
|
||||
fop.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NOCONFIRMMKDIR;
|
||||
fop.wFunc = FO_COPY;//选择执行类型,FO_COPY,FO_DELETE,FO_RENAME,FO_MOVE四种
|
||||
|
||||
fop.pFrom = srcFolder;//如:D:\\*.txt
|
||||
fop.pTo = dstFolder;//D:\\test
|
||||
|
||||
if (SHFileOperation(&fop) != 0)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
bool KillProcessByName(char *processName) {
|
||||
// 创建进程快照
|
||||
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
||||
PROCESSENTRY32 pe;
|
||||
|
||||
if (hSnapShot == INVALID_HANDLE_VALUE) {
|
||||
return false;
|
||||
}
|
||||
|
||||
pe.dwSize = sizeof(PROCESSENTRY32);
|
||||
|
||||
// 遍历进程列表
|
||||
if (Process32First(hSnapShot, &pe)) {
|
||||
do {
|
||||
// 检查进程名称
|
||||
if (_stricmp(pe.szExeFile, processName) == 0) {
|
||||
// 找到目标进程,尝试关闭
|
||||
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pe.th32ProcessID);
|
||||
|
||||
if (hProcess != NULL) {
|
||||
TerminateProcess(hProcess, 0);
|
||||
CloseHandle(hProcess);
|
||||
CloseHandle(hSnapShot);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} while (Process32Next(hSnapShot, &pe));
|
||||
}
|
||||
|
||||
CloseHandle(hSnapShot);
|
||||
return false;
|
||||
}
|
||||
|
||||
/*int delReg(char *path)
|
||||
{
|
||||
char fatKey[255] = { 0 };
|
||||
char subKey2[255] = { 0 };
|
||||
char subKey[255] = { 0 };
|
||||
int j = 0;
|
||||
for (int i = strlen(path) - 1; i >= 0; i--)
|
||||
{
|
||||
if (path[i] == '\\')
|
||||
{
|
||||
path[i] = '\0';
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
subKey2[j] = path[i];
|
||||
j++;
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < strlen(subKey2); i++)
|
||||
{
|
||||
j--;
|
||||
subKey[i] = subKey2[j];
|
||||
}
|
||||
j = 0;
|
||||
for (int i = 0; i < strlen(path); i++)
|
||||
{
|
||||
if (path[i] == '\\')
|
||||
{
|
||||
i++;
|
||||
for (int k = i; k < strlen(path); k++)
|
||||
{
|
||||
fatKey[j] = path[k];
|
||||
j++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
printf("fat:%s sub:%s\n", fatKey, subKey);
|
||||
HKEY hKey;
|
||||
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, fatKey, 0, KEY_WRITE, &hKey) != ERROR_SUCCESS)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if (RegDeleteKey(hKey, subKey) != ERROR_SUCCESS)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}*/
|
||||
|
||||
DWORD WINAPI dispWind_cantStart(LPVOID lpParam)
|
||||
{
|
||||
MessageBox(NULL, "You can't start emulator due to:\r\n - You are running another Shell Emulator.\r\n - Your OS is not the required version for the emulator.", "CE-Collections", MB_OK);
|
||||
return 0;
|
||||
}
|
||||
|
||||
DWORD WINAPI dispWind_starting(LPVOID lpParam)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
MessageBox(NULL, "Please wait while emulator is starting.", "CE-Collections", MB_OK);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
DWORD WINAPI APC10_killApchook(LPVOID lpParam)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
Sleep(100);
|
||||
if (KillNTDriver("apchook"))
|
||||
{
|
||||
//printf("Kill apchook SUCCESSFULY!\n");
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
typedef BOOL(WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
|
||||
LPFN_ISWOW64PROCESS fnIsWow64Process;
|
||||
BOOL IsWow64()
|
||||
{
|
||||
BOOL bIsWow64 = FALSE;
|
||||
//IsWow64Process is not available on all supported versions of Windows.
|
||||
//Use GetModuleHandle to get a handle to the DLL that contains the function
|
||||
//and GetProcAddress to get a pointer to the function if available.
|
||||
fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(
|
||||
GetModuleHandle(TEXT("kernel32")), "IsWow64Process");
|
||||
if (NULL != fnIsWow64Process)
|
||||
{
|
||||
if (!fnIsWow64Process(GetCurrentProcess(), &bIsWow64))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return bIsWow64;
|
||||
}
|
||||
|
||||
void afterworks(char *outDir)
|
||||
{
|
||||
printf("\n");
|
||||
Sleep(300);
|
||||
if (!KillProcessByName("FILESYS.EXE"))
|
||||
puts("Warning - Can't stop FILESYS.exe");
|
||||
Sleep(100);
|
||||
if (!DeleteDirectory(outDir))
|
||||
puts("Warning - Can't delete CESHLTMP");
|
||||
Sleep(100);
|
||||
printf("All TEMP files removed.\n");
|
||||
exit(0);
|
||||
return;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
if (argc == 1)
|
||||
{
|
||||
puts("Windows CE Shell Emulator Starter for CE-Collections 2.02 - 351Workshop 2025");
|
||||
puts("Usage: Emustarter <Start type> <Path to EMUL> <shell32.exe name>");
|
||||
puts(" <Start type>:");
|
||||
puts(" 1: Standard 1.x series");
|
||||
puts(" 2: Standard 2.x series");
|
||||
puts(" 3: PocketPC 2000");
|
||||
puts(" 4: Auto PC 1.0");
|
||||
puts("Sample: Emustarter 1 .\\10xHPC\\ SHELL32.exe");
|
||||
puts(" Emustarter 2 .\\200HPC\\ explorem.exe");
|
||||
puts("Copyright 351Workshop 2025 - Last built: with CECv202B105");
|
||||
return 1;
|
||||
}
|
||||
else if (argc != 4)
|
||||
{
|
||||
puts("Error - Wrong command");
|
||||
return 1;
|
||||
}
|
||||
|
||||
HANDLE hDispWindStarting = CreateThread(
|
||||
NULL, // 默认安全属性
|
||||
0, // 默认堆栈大小
|
||||
dispWind_starting, // 线程函数
|
||||
NULL, // 无参数传递
|
||||
0, // 立即执行线程
|
||||
NULL // 不接收线程ID
|
||||
);
|
||||
|
||||
|
||||
char srcDir[255] = { 0 };
|
||||
char outDir[255] = { 0 };
|
||||
char execName[255] = { 0 };
|
||||
char execPath[255] = { 0 };
|
||||
strcpy_s(srcDir, argv[2]);
|
||||
strcpy_s(execName, argv[3]);
|
||||
if (GetTempPath(255, outDir) == 0)
|
||||
{
|
||||
puts("Error - Can't get TEMP path");
|
||||
return 1;
|
||||
}
|
||||
sprintf_s(outDir, "%s\\CESHLTMP\\", outDir);
|
||||
|
||||
printf("====================Prep TEMP files=====================\n");
|
||||
printf("srcDir......................:%s\n", srcDir);
|
||||
printf("outDir......................:%s\n", outDir);
|
||||
|
||||
if (!DeleteDirectory(outDir))
|
||||
puts("Warning - Can't delete CESHLTMP");
|
||||
Sleep(50);
|
||||
if (CopyDir(srcDir, outDir) == 0)
|
||||
{
|
||||
puts("ERROR - Can't copy files into CESHLTMP");
|
||||
return 1;
|
||||
}
|
||||
|
||||
int emulType = atoi(argv[1]);
|
||||
if (emulType == 1)
|
||||
{
|
||||
char shellEnv[255] = { 0 };
|
||||
sprintf_s(shellEnv, "PegEmulDir=%s", outDir);
|
||||
sprintf_s(execPath, "%s\\Bin\\%s", outDir, execName);
|
||||
printf("==============WCE1.0 Mode - Startring Emul==============\n");
|
||||
printf("shellEnv....................:%s\n", shellEnv);
|
||||
printf("outDir......................:%s\n", outDir);
|
||||
printf("execName....................:%s\n", execName);
|
||||
printf("execPath....................:%s\n", execPath);
|
||||
STARTUPINFO si;
|
||||
PROCESS_INFORMATION pi;
|
||||
ZeroMemory(&si, sizeof(si));
|
||||
si.cb = sizeof(si);
|
||||
ZeroMemory(&pi, sizeof(pi));
|
||||
if (!CreateProcess(
|
||||
NULL, // 不在此指定可执行文件的文件名
|
||||
execPath, // 命令行参数
|
||||
NULL, // 默认进程安全性
|
||||
NULL, // 默认线程安全性
|
||||
FALSE, // 指定当前进程内的句柄不可以被子进程继承
|
||||
0, // 创建标志
|
||||
shellEnv, // 使用本进程的环境变量
|
||||
outDir, // 使用本进程的驱动器和目录
|
||||
&si, // 指向 STARTUPINFO 结构的指针
|
||||
&pi // 指向 PROCESS_INFORMATION 结构的指针
|
||||
))
|
||||
{
|
||||
puts("ERROR - Can't start the emulator");
|
||||
afterworks(outDir);
|
||||
}
|
||||
Sleep(1000);
|
||||
TerminateThread(hDispWindStarting, 0);
|
||||
WaitForSingleObject(pi.hProcess, INFINITE);
|
||||
}
|
||||
else if (emulType == 2)
|
||||
{
|
||||
char regPath[255] = { 0 };
|
||||
char regKeyPath[255] = { 0 };
|
||||
char regKeyPath64[255] = { 0 };
|
||||
char regKeyPathE[255] = { 0 };
|
||||
char regKeyPathE64[255] = { 0 };
|
||||
char regCmd[255] = { 0 };
|
||||
sprintf_s(execPath, "%s\\Windows\\%s", outDir, execName);
|
||||
sprintf_s(regPath, "%s\\cei.reg", outDir);
|
||||
sprintf_s(regCmd, "regedit.exe /s %s\\cei.reg", outDir);
|
||||
GetPrivateProfileString("shellmgr", "regKeyPath", NULL, regKeyPath, 255, regPath);
|
||||
GetPrivateProfileString("shellmgr", "regKeyPath64", NULL, regKeyPath64, 255, regPath);
|
||||
sprintf_s(regKeyPathE, "%s\\Environment", regKeyPath);
|
||||
sprintf_s(regKeyPathE64, "%s\\Environment", regKeyPath64);
|
||||
|
||||
string outDirReg;
|
||||
outDirReg += "\"";
|
||||
outDirReg += outDir;
|
||||
for (int i = 0; i < outDirReg.size(); i++)
|
||||
{
|
||||
if (outDirReg[i] == '\\')
|
||||
{
|
||||
outDirReg.replace(i, 1, "\\\\");
|
||||
i++;
|
||||
}
|
||||
}
|
||||
outDirReg += "\"";
|
||||
|
||||
printf("==============WCE2.0 Mode - Startring Emul==============\n");
|
||||
printf("regPath.....................:%s\n", regPath);
|
||||
printf("outDir......................:%s\n", outDir);
|
||||
printf("execName....................:%s\n", execName);
|
||||
printf("execPath....................:%s\n", execPath);
|
||||
printf("regKeyPath..................:%s\n", regKeyPath);
|
||||
printf("regKeyPath64................:%s\n", regKeyPath64);
|
||||
printf("regKeyPathE.................:%s\n", regKeyPathE);
|
||||
printf("regKeyPathE64...............:%s\n", regKeyPathE64);
|
||||
printf("regCmd......................:%s\n", regCmd);
|
||||
printf("outDirReg...................:%s\n", outDirReg.c_str());
|
||||
Sleep(50);
|
||||
WritePrivateProfileString(regKeyPathE, "\"Root Directory\"", outDirReg.c_str(), regPath);
|
||||
WritePrivateProfileString(regKeyPathE64, "\"Root Directory\"", outDirReg.c_str(), regPath);
|
||||
|
||||
system(regCmd);
|
||||
|
||||
STARTUPINFO si;
|
||||
PROCESS_INFORMATION pi;
|
||||
ZeroMemory(&si, sizeof(si));
|
||||
si.cb = sizeof(si);
|
||||
ZeroMemory(&pi, sizeof(pi));
|
||||
if (!CreateProcess(
|
||||
NULL, // 不在此指定可执行文件的文件名
|
||||
execPath, // 命令行参数
|
||||
NULL, // 默认进程安全性
|
||||
NULL, // 默认线程安全性
|
||||
FALSE, // 指定当前进程内的句柄不可以被子进程继承
|
||||
0, // 创建标志
|
||||
NULL, // 使用本进程的环境变量
|
||||
outDir, // 使用本进程的驱动器和目录
|
||||
&si, // 指向 STARTUPINFO 结构的指针
|
||||
&pi // 指向 PROCESS_INFORMATION 结构的指针
|
||||
))
|
||||
{
|
||||
puts("ERROR - Can't start the emulator");
|
||||
afterworks(outDir);
|
||||
}
|
||||
Sleep(1000);
|
||||
TerminateThread(hDispWindStarting, 0);
|
||||
WaitForSingleObject(pi.hProcess, INFINITE);
|
||||
/*if (!delReg(regKeyPath))
|
||||
puts("Warning - Can't remove EMULATION reg key.");
|
||||
if(!delReg(regKeyPath64))
|
||||
puts("Warning - Can't remove EMULATION64 reg key.");*/
|
||||
}
|
||||
else if (emulType == 3)
|
||||
{
|
||||
char regPath[255] = { 0 };
|
||||
char regKeyPath[255] = { 0 };
|
||||
char regKeyPath64[255] = { 0 };
|
||||
char regKeyPathE[255] = { 0 };
|
||||
char regKeyPathE64[255] = { 0 };
|
||||
char regCmd[255] = { 0 };
|
||||
char emulDir[255] = { 0 };
|
||||
sprintf_s(execPath, "%s\\palm300\\Windows\\%s", outDir, execName);
|
||||
sprintf_s(regPath, "%s\\cei.reg", outDir);
|
||||
sprintf_s(regCmd, "%%SystemRoot%%\\regedit.exe /s %s\\cei.reg", outDir);
|
||||
GetPrivateProfileString("shellmgr", "regKeyPath", NULL, regKeyPath, 255, regPath);
|
||||
GetPrivateProfileString("shellmgr", "regKeyPath64", NULL, regKeyPath64, 255, regPath);
|
||||
sprintf_s(regKeyPathE, "%s\\Environment", regKeyPath);
|
||||
sprintf_s(regKeyPathE64, "%s\\Environment", regKeyPath64);
|
||||
sprintf_s(emulDir, "%s\\palm300\\", outDir);
|
||||
|
||||
string outDirReg;
|
||||
outDirReg += "\"";
|
||||
outDirReg += outDir;
|
||||
outDirReg += "\\palm300\\";
|
||||
for (int i = 0; i < outDirReg.size(); i++)
|
||||
{
|
||||
if (outDirReg[i] == '\\')
|
||||
{
|
||||
outDirReg.replace(i, 1, "\\\\");
|
||||
i++;
|
||||
}
|
||||
}
|
||||
outDirReg += "\"";
|
||||
|
||||
if (IsWindowsVistaOrGreater())
|
||||
{
|
||||
printf("Info - Can't start emulator due to OS version too high.Press Backspace to skip.\n");
|
||||
HANDLE hDispWindCantStart = CreateThread(
|
||||
NULL, // 默认安全属性
|
||||
0, // 默认堆栈大小
|
||||
dispWind_cantStart, // 线程函数
|
||||
NULL, // 无参数传递
|
||||
0, // 立即执行线程
|
||||
NULL // 不接收线程ID
|
||||
);
|
||||
DWORD flag = 0;
|
||||
while (1)
|
||||
{
|
||||
if (_kbhit() && _getche() == '\b')
|
||||
break;
|
||||
GetExitCodeThread(hDispWindCantStart, &flag);
|
||||
if (flag != STILL_ACTIVE)
|
||||
{
|
||||
afterworks(outDir);
|
||||
}
|
||||
}
|
||||
TerminateThread(hDispWindCantStart, 0);
|
||||
}
|
||||
|
||||
printf("==============Palm2K Mode - Startring Emul==============\n");
|
||||
printf("regPath.....................:%s\n", regPath);
|
||||
printf("outDir......................:%s\n", outDir);
|
||||
printf("emulDir.....................:%s\n", emulDir);
|
||||
printf("execName....................:%s\n", execName);
|
||||
printf("execPath....................:%s\n", execPath);
|
||||
printf("regKeyPath..................:%s\n", regKeyPath);
|
||||
printf("regKeyPath64................:%s\n", regKeyPath64);
|
||||
printf("regKeyPathE.................:%s\n", regKeyPathE);
|
||||
printf("regKeyPathE64...............:%s\n", regKeyPathE64);
|
||||
printf("regCmd......................:%s\n", regCmd);
|
||||
printf("outDirReg...................:%s\n", outDirReg.c_str());
|
||||
Sleep(50);
|
||||
WritePrivateProfileString(regKeyPathE, "\"Root Directory\"", outDirReg.c_str(), regPath);
|
||||
WritePrivateProfileString(regKeyPathE64, "\"Root Directory\"", outDirReg.c_str(), regPath);
|
||||
|
||||
system(regCmd);
|
||||
|
||||
STARTUPINFO si;
|
||||
PROCESS_INFORMATION pi;
|
||||
ZeroMemory(&si, sizeof(si));
|
||||
si.cb = sizeof(si);
|
||||
ZeroMemory(&pi, sizeof(pi));
|
||||
if (!CreateProcess(
|
||||
NULL, // 不在此指定可执行文件的文件名
|
||||
execPath, // 命令行参数
|
||||
NULL, // 默认进程安全性
|
||||
NULL, // 默认线程安全性
|
||||
FALSE, // 指定当前进程内的句柄不可以被子进程继承
|
||||
0, // 创建标志
|
||||
NULL, // 使用本进程的环境变量
|
||||
emulDir, // 使用本进程的驱动器和目录
|
||||
&si, // 指向 STARTUPINFO 结构的指针
|
||||
&pi // 指向 PROCESS_INFORMATION 结构的指针
|
||||
))
|
||||
{
|
||||
puts("ERROR - Can't start the emulator");
|
||||
afterworks(outDir);
|
||||
}
|
||||
Sleep(1000);
|
||||
TerminateThread(hDispWindStarting, 0);
|
||||
WaitForSingleObject(pi.hProcess, INFINITE);
|
||||
/*if (!delReg(regKeyPath))
|
||||
puts("Warning - Can't remove EMULATION reg key.");
|
||||
if(!delReg(regKeyPath64))
|
||||
puts("Warning - Can't remove EMULATION64 reg key.");*/
|
||||
}
|
||||
else if (emulType == 4)
|
||||
{
|
||||
char wcefsPath[255] = { 0 };
|
||||
char regPath[255] = { 0 };
|
||||
char regKeyPath[255] = { 0 };
|
||||
char regKeyPathE[255] = { 0 };
|
||||
char regCmd[255] = { 0 };
|
||||
sprintf_s(execPath, "%s\\Bin\\%s", outDir, execName);
|
||||
sprintf_s(regPath, "%s\\cei.reg", outDir);
|
||||
sprintf_s(regCmd, "regedit.exe /s %s\\cei.reg", outDir);
|
||||
GetPrivateProfileString("shellmgr", "regKeyPath", NULL, regKeyPath, 255, regPath);
|
||||
sprintf_s(regKeyPathE, "%s\\Environment", regKeyPath);
|
||||
sprintf_s(wcefsPath, "%s\\bin\\wcefs.sys", outDir);
|
||||
|
||||
string outDirReg;
|
||||
outDirReg += "\"";
|
||||
outDirReg += outDir;
|
||||
for (int i = 0; i < outDirReg.size(); i++)
|
||||
{
|
||||
if (outDirReg[i] == '\\')
|
||||
{
|
||||
outDirReg.replace(i, 1, "\\\\");
|
||||
i++;
|
||||
}
|
||||
}
|
||||
outDirReg += "\"";
|
||||
|
||||
if (IsWow64())
|
||||
{
|
||||
printf("Info - Can't start emulator due to the OS isn't I386.Press Backspace to skip.\n");
|
||||
HANDLE hDispWindCantStart = CreateThread(
|
||||
NULL, // 默认安全属性
|
||||
0, // 默认堆栈大小
|
||||
dispWind_cantStart, // 线程函数
|
||||
NULL, // 无参数传递
|
||||
0, // 立即执行线程
|
||||
NULL // 不接收线程ID
|
||||
);
|
||||
DWORD flag = 0;
|
||||
while (1)
|
||||
{
|
||||
if (_kbhit() && _getche() == '\b')
|
||||
break;
|
||||
GetExitCodeThread(hDispWindCantStart, &flag);
|
||||
if (flag != STILL_ACTIVE)
|
||||
{
|
||||
afterworks(outDir);
|
||||
}
|
||||
}
|
||||
TerminateThread(hDispWindCantStart, 0);
|
||||
}
|
||||
|
||||
printf("====================Auto PC 1.0 Mode====================\n");
|
||||
printf("wcefsPath...................:%s\n", wcefsPath);
|
||||
printf("regPath.....................:%s\n", regPath);
|
||||
printf("outDir......................:%s\n", outDir);
|
||||
printf("execName....................:%s\n", execName);
|
||||
printf("execPath....................:%s\n", execPath);
|
||||
printf("regKeyPath..................:%s\n", regKeyPath);
|
||||
printf("regKeyPathE.................:%s\n", regKeyPathE);
|
||||
printf("regCmd......................:%s\n", regCmd);
|
||||
printf("outDirReg...................:%s\n", outDirReg.c_str());
|
||||
|
||||
Sleep(50);
|
||||
WritePrivateProfileString(regKeyPathE, "\"Root Directory\"", outDirReg.c_str(), regPath);
|
||||
system(regCmd);
|
||||
|
||||
HANDLE hKillApchook = NULL;
|
||||
if (IsWindowsVistaOrGreater())
|
||||
{
|
||||
hKillApchook = CreateThread(
|
||||
NULL, // 默认安全属性
|
||||
0, // 默认堆栈大小
|
||||
APC10_killApchook, // 线程函数
|
||||
NULL, // 无参数传递
|
||||
0, // 立即执行线程
|
||||
NULL // 不接收线程ID
|
||||
);
|
||||
printf("Info - NT6.x,Started killing APCHOOK driver.\n");
|
||||
}
|
||||
|
||||
STARTUPINFO si;
|
||||
PROCESS_INFORMATION pi;
|
||||
ZeroMemory(&si, sizeof(si));
|
||||
si.cb = sizeof(si);
|
||||
ZeroMemory(&pi, sizeof(pi));
|
||||
if (!CreateProcess(
|
||||
NULL, // 不在此指定可执行文件的文件名
|
||||
execPath, // 命令行参数
|
||||
NULL, // 默认进程安全性
|
||||
NULL, // 默认线程安全性
|
||||
FALSE, // 指定当前进程内的句柄不可以被子进程继承
|
||||
0, // 创建标志
|
||||
NULL, // 使用本进程的环境变量
|
||||
outDir, // 使用本进程的驱动器和目录
|
||||
&si, // 指向 STARTUPINFO 结构的指针
|
||||
&pi // 指向 PROCESS_INFORMATION 结构的指针
|
||||
))
|
||||
{
|
||||
puts("ERROR - Can't start the emulator");
|
||||
afterworks(outDir);
|
||||
}
|
||||
|
||||
Sleep(200);
|
||||
if (!LoadNTDriver("wcefs", wcefsPath))
|
||||
{
|
||||
printf("ERROR - Can't load WCEFS driver.");
|
||||
afterworks(outDir);
|
||||
}
|
||||
Sleep(1000);
|
||||
TerminateThread(hDispWindStarting, 0);
|
||||
|
||||
WaitForSingleObject(pi.hProcess, INFINITE);
|
||||
Sleep(100);
|
||||
if (!UnloadNTDriver("wcefs"))
|
||||
{
|
||||
printf("ERROR - Can't unload WCEFS driver.");
|
||||
afterworks(outDir);
|
||||
}
|
||||
if (IsWindowsVistaOrGreater())
|
||||
TerminateThread(hKillApchook, 0);
|
||||
}
|
||||
|
||||
afterworks(outDir);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user