diff --git a/src-x86-x64-Fusix/RDPWrap.cpp b/src-x86-x64-Fusix/RDPWrap.cpp index 620ee60..a1ff822 100644 --- a/src-x86-x64-Fusix/RDPWrap.cpp +++ b/src-x86-x64-Fusix/RDPWrap.cpp @@ -15,6 +15,7 @@ */ #include "stdafx.h" +#include "IniFile.h" typedef struct { @@ -54,9 +55,7 @@ struct FARJMP FARJMP Old_SLGetWindowsInformationDWORD, Stub_SLGetWindowsInformationDWORD; SLGETWINDOWSINFORMATIONDWORD _SLGetWindowsInformationDWORD; -// Implement this -INIFile INI; -// Correct this +INI_FILE *IniFile; LPCTSTR LogFile = L"\\rdpwrap.txt"; HMODULE hTermSrv; HMODULE hSLC; @@ -240,9 +239,9 @@ BOOL __stdcall GetFileVersion(LPCWSTR lptstrFilename, FILE_VERSION *FileVersion) bool OverrideSL(LPWSTR ValueName, DWORD *Value) { - if (INIValueExists(INI, "SLPolicy", ValueName)) + if (IniFile->VariableExists(INI, "SLPolicy", ValueName)) { - *Value = INIReadDWord(INI, "SLPolicy", ValueName, 0); + if (!(IniFile->GetVariableInSection("SLPolicy", ValueName, Value))) *Value = 0; return true; } return false; @@ -371,7 +370,7 @@ HRESULT WINAPI New_CSLQuery_Initialize() Sect = new char[1024]; wsprintfA(Sect, "%d.%d.%d.%d-SLInit", FV.wVersion.Major, FV.wVersion.Minor, FV.Release, FV.Build); - if (INISectionExists(INI, Sect)) + if (IniFile->SectionExists(Sect)) { #ifdef _WIN64 bServerSku = (DWORD*)(TermSrvBase + INIReadDWordHex(INI, Sect, "bServerSku.x64", 0)); @@ -397,7 +396,7 @@ HRESULT WINAPI New_CSLQuery_Initialize() if (bServerSku) { - *bServerSku = INIReadDWord(INI, "SLInit", "bServerSku", 1); + if (!(IniFile->GetVariableInSection("SLInit", "bServerSku", bServerSku))) *bServerSku = 1; Log = new char[1024]; wsprintfA(Log, "[0x%p] bServerSku = %d\r\n", bServerSku, *bServerSku); @@ -406,7 +405,7 @@ HRESULT WINAPI New_CSLQuery_Initialize() } if (bRemoteConnAllowed) { - *bRemoteConnAllowed = INIReadDWord(INI, "SLInit", "bRemoteConnAllowed", 1); + if (!(IniFile->GetVariableInSection("SLInit", "bRemoteConnAllowed", bRemoteConnAllowed))) *bRemoteConnAllowed = 1; Log = new char[1024]; wsprintfA(Log, "[0x%p] bRemoteConnAllowed = %d\r\n", bRemoteConnAllowed, *bRemoteConnAllowed); @@ -415,7 +414,7 @@ HRESULT WINAPI New_CSLQuery_Initialize() } if (bFUSEnabled) { - *bFUSEnabled = INIReadDWord(INI, "SLInit", "bFUSEnabled", 1); + if (!(IniFile->GetVariableInSection("SLInit", "bFUSEnabled", bFUSEnabled))) *bFUSEnabled = 1; Log = new char[1024]; wsprintfA(Log, "[0x%p] bFUSEnabled = %d\r\n", bFUSEnabled, *bFUSEnabled); @@ -424,7 +423,7 @@ HRESULT WINAPI New_CSLQuery_Initialize() } if (bAppServerAllowed) { - *bAppServerAllowed = INIReadDWord(INI, "SLInit", "bAppServerAllowed", 1); + if (!(IniFile->GetVariableInSection("SLInit", "bAppServerAllowed", bAppServerAllowed))) *bAppServerAllowed = 1; Log = new char[1024]; wsprintfA(Log, "[0x%p] bAppServerAllowed = %d\r\n", bAppServerAllowed, *bAppServerAllowed); @@ -433,7 +432,7 @@ HRESULT WINAPI New_CSLQuery_Initialize() } if (bMultimonAllowed) { - *bMultimonAllowed = INIReadDWord(INI, "SLInit", "bMultimonAllowed", 1); + if (!(IniFile->GetVariableInSection("SLInit", "bMultimonAllowed", bMultimonAllowed))) *bMultimonAllowed = 1; Log = new char[1024]; wsprintfA(Log, "[0x%p] bMultimonAllowed = %d\r\n", bMultimonAllowed, *bMultimonAllowed); @@ -442,7 +441,7 @@ HRESULT WINAPI New_CSLQuery_Initialize() } if (lMaxUserSessions) { - *lMaxUserSessions = INIReadDWord(INI, "SLInit", "lMaxUserSessions", 0); + if (!(IniFile->GetVariableInSection("SLInit", "lMaxUserSessions", lMaxUserSessions))) *lMaxUserSessions = 0; Log = new char[1024]; wsprintfA(Log, "[0x%p] lMaxUserSessions = %d\r\n", lMaxUserSessions, *lMaxUserSessions); @@ -451,7 +450,7 @@ HRESULT WINAPI New_CSLQuery_Initialize() } if (ulMaxDebugSessions) { - *ulMaxDebugSessions = INIReadDWord(INI, "SLInit", "ulMaxDebugSessions", 0); + if (!(IniFile->GetVariableInSection("SLInit", "ulMaxDebugSessions", ulMaxDebugSessions))) *ulMaxDebugSessions = 0; Log = new char[1024]; wsprintfA(Log, "[0x%p] ulMaxDebugSessions = %d\r\n", ulMaxDebugSessions, *ulMaxDebugSessions); @@ -460,7 +459,7 @@ HRESULT WINAPI New_CSLQuery_Initialize() } if (bInitialized) { - *bInitialized = INIReadDWord(INI, "SLInit", "bInitialized", 1); + if (!(IniFile->GetVariableInSection("SLInit", "bInitialized", bInitialized))) *bInitialized = 1; Log = new char[1024]; wsprintfA(Log, "[0x%p] bInitialized = %d\r\n", bInitialized, *bInitialized); @@ -483,12 +482,17 @@ void Hook() AlreadyHooked = true; WriteToLog("Loading configuration...\r\n"); - if (!INILoad(INI, ExtractFilePath(GetBinaryPath()) + "rdpwrap.ini")) + *IniFile = new INI_FILE(ExtractFilePath(GetBinaryPath()) + L"rdpwrap.ini"); + if (*IniFile == NULL) { WriteToLog("Error: Failed to load configuration\r\n"); return; } - LogFile = INIReadString(INI, "Main", "LogFile", ExtractFilePath(GetBinaryPath()) + "rdpwrap.txt"); + + if(!(IniFile->GetVariableInSection("Main", "LogFile", &LogFile))) + { + LogFile = ExtractFilePath(GetBinaryPath()) + L"rdpwrap.txt"; + } bool Result; char *Log; @@ -559,17 +563,23 @@ void Hook() SetThreadsState(false); WriteToLog("Loading patch codes...\r\n"); - PatchList = INIReadSection(INI, "PatchCodes"); - //SetLength(Patch, Length(PatchList)); + INI->ReadSection("PatchCodes", &PatchList); + + INI_VAR_BYTEARRAY Patch[PatchList.length]; for (int i = 0; i < Patch.length; i++) { - Patch[i] = INIReadBytes(INI, "PatchCodes", PatchList[i]); - // for security reasons - // not more than 16 bytes - if (Patch[i].length > 16) SetLength(Patch[i], 16); + if (IniFile->GetVariableInSection("PatchCodes", PatchList[i], &Patch[i])) + { + // for security reasons + // not more than 16 bytes + if (Patch[i].length > 16) SetLength(Patch[i], 16); + } } - if ((Ver == 0x0600) && (INIReadBool(INI, "Main", "SLPolicyHookNT60", true))) + bool bSLHook; + if (!(IniFile->GetVariableInSection("Main", "SLPolicyHookNT60", &bSLHook))) bSLHook = true; + + if ((Ver == 0x0600) && bSLHook) { // Windows Vista // uses SL Policy API (slc.dll) @@ -598,7 +608,10 @@ void Hook() WriteProcessMemory(GetCurrentProcess(), _SLGetWindowsInformationDWORD, &Stub_SLGetWindowsInformationDWORD, sizeof(FARJMP), &bw); } } - if ((Ver == 0x0601) && (INIReadBool(INI, "Main", "SLPolicyHookNT61", true))) + + if (!(IniFile->GetVariableInSection("Main", "SLPolicyHookNT60", &bSLHook))) bSLHook = true; + + if ((Ver == 0x0601) && bSLHook) { // Windows 7 // uses SL Policy API (slc.dll) @@ -651,15 +664,17 @@ void Hook() char *Sect; Sect = new char[1024]; wsprintfA(Sect, "%d.%d.%d.%d", FV.wVersion.Major, FV.wVersion.Minor, FV.Release, FV.Build); - if (INISectionExists(INI, Sect)) + if (IniFile->SectionExists(Sect)) { if (GetModuleCodeSectionInfo(hTermSrv, &TermSrvBase, &TermSrvSize)) { + bool Bool; #ifdef _WIN64 - if (INIReadBool(INI, Sect, "LocalOnlyPatch.x64", false)) + if (!(IniFile->GetVariableInSection(Sect, "LocalOnlyPatch.x64", &Bool))) Bool = true; #else - if (INIReadBool(INI, Sect, "LocalOnlyPatch.x86", false)) + if (!(IniFile->GetVariableInSection(Sect, "LocalOnlyPatch.x86", &Bool))) Bool = true; #endif + if (Bool) { WriteToLog("Patch CEnforcementCore::GetInstanceOfTSLicense\r\n"); int i = -1; @@ -673,10 +688,11 @@ void Hook() if (i >= 0) WriteProcessMemory(GetCurrentProcess(), (LPVOID)SignPtr, &Patch[i], sizeof(Patch[i]), &bw); } #ifdef _WIN64 - if (INIReadBool(INI, Sect, "SingleUserPatch.x64", false)) + if (!(IniFile->GetVariableInSection(Sect, "SingleUserPatch.x64", &Bool))) Bool = true; #else - if (INIReadBool(INI, Sect, "SingleUserPatch.x86", false)) + if (!(IniFile->GetVariableInSection(Sect, "SingleUserPatch.x86", &Bool))) Bool = true; #endif + if (Bool) { WriteToLog("Patch CSessionArbitrationHelper::IsSingleSessionPerUserEnabled\r\n"); int i = -1; @@ -690,10 +706,11 @@ void Hook() if (i >= 0) WriteProcessMemory(GetCurrentProcess(), (LPVOID)SignPtr, &Patch[i], sizeof(Patch[i]), &bw); } #ifdef _WIN64 - if (INIReadBool(INI, Sect, "DefPolicyPatch.x64", false)) + if (!(IniFile->GetVariableInSection(Sect, "DefPolicyPatch.x64", &Bool))) Bool = true; #else - if (INIReadBool(INI, Sect, "DefPolicyPatch.x86", false)) + if (!(IniFile->GetVariableInSection(Sect, "DefPolicyPatch.x86", &Bool))) Bool = true; #endif + if (Bool) { WriteToLog("Patch CDefPolicy::Query\r\n"); int i = -1; @@ -707,10 +724,11 @@ void Hook() if (i >= 0) WriteProcessMemory(GetCurrentProcess(), (LPVOID)SignPtr, &Patch[i], sizeof(Patch[i]), &bw); } #ifdef _WIN64 - if (INIReadBool(INI, Sect, "SLPolicyInternal.x64", false)) + if (!(IniFile->GetVariableInSection(Sect, "SLPolicyInternal.x64", &Bool))) Bool = true; #else - if (INIReadBool(INI, Sect, "SLPolicyInternal.x86", false)) + if (!(IniFile->GetVariableInSection(Sect, "SLPolicyInternal.x86", &Bool))) Bool = true; #endif + if (Bool) { WriteToLog("Hook SLGetWindowsInformationDWORDWrapper\r\n"); char *FuncName; @@ -746,10 +764,11 @@ void Hook() WriteProcessMemory(GetCurrentProcess(), (LPVOID)SignPtr, &Jump, sizeof(FARJMP), &bw); } #ifdef _WIN64 - if (INIReadBool(INI, Sect, "SLInitHook.x64", false)) + if (!(IniFile->GetVariableInSection(Sect, "SLInitHook.x64", &Bool))) Bool = true; #else - if (INIReadBool(INI, Sect, "SLInitHook.x86", false)) + if (!(IniFile->GetVariableInSection(Sect, "SLInitHook.x86", &Bool))) Bool = true; #endif + if (Bool) { WriteToLog("Hook CSLQuery::Initialize\r\n"); char *FuncName;