qboolean Info_SetValue(struct info *info, char *key, char *value) { int i; char *v; if (!info || !key || !value) return false; v = strdup(value); if (!v) return false; for(i=0; i<CLIENT_INFO_MAX && info->info[i].key; i++) if (String_Compare(info->info[i].key, key)) { if (info->info[i].value) free(info->info[i].value); info->info[i].value = v; return true; } info->info[i].key = strdup(key); if (!info->info[i].key) { free(v); return false; } info->info[i].value = v; return true; }
void test_String_Compare ( ) { STR80 strTest1, strTest2; cout << "Testing:" << endl; cout <<"bool String_Compare" << endl; GetTestString("....Enter a string 1:",strTest1); GetTestString("....Enter a string 2:",strTest2); cout <<"....String 1 before execution:"<<strTest1<<endl; cout <<"....String 2 before execution:"<<strTest2<<endl; cout <<endl; if (String_Compare(strTest1, strTest2)) cout <<"....Strings are equal"<<endl; else cout <<"....Strings are NOT equal"<<endl; cout <<endl; cout <<"....String 1 after execution:"<<strTest1<<endl; cout <<"....String 2 after execution:"<<strTest2<<endl; pause_display(); }
void GetDeviceDetail( HANDLE DeviceInformation, SP_DEVINFO_DATA* DeviceData ) { wchar_t propertyBuffer[1000]; DWORD propertyDataType = 1; DWORD requiredSize = 0; SetupDiGetDeviceRegistryPropertyW( DeviceInformation, DeviceData, SPDRP_DEVICEDESC, &propertyDataType, &propertyBuffer, 1000 * sizeof(wchar_t), &requiredSize ); if (String_Compare(propertyBuffer, L"MotioninJoy Virtual Xinput device for Windows") == 0) { Log(L"Driver already installed for this device"); } else { Log(L"Installing driver..."); InstallDriver(DeviceInformation, DeviceData); } }
INT32 ListView_GetColumnId( WCHAR* ColumnName ) { int i; for (i = 0; i < ListView_Columns; i++) { WCHAR columnName[260]; ListView_GetColumnText(i, columnName); if (String_Compare(columnName, ColumnName) == 0) return i; } return -1; }
char *Info_GetValue(struct info *info, char *key) { int i; if (!info || !key) return NULL; for (i=0;i<CLIENT_INFO_MAX;i++) { if (info->info[i].key == NULL) return NULL; if (String_Compare(info->info[i].key, key)) return info->info[i].value; } return NULL; }
int Info_GetFlags(char *key) { int i; for (i=0; i<(sizeof(info_relevance)/sizeof(*info_relevance)); i++) { switch (info_relevance[i].check_method) { case IFM_STRCMP: if (String_Compare(info_relevance[i].key, key)) return info_relevance[i].flags; break; case IFM_STRNCMP: if (String_CompareLength(info_relevance[i].key, key, NULL)) return info_relevance[i].flags; break; case IFM_STRSTR: break; } } return IF_ALL; }
VOID Cache( PUSH_GAME* Game ) { CHAR mountPoint = 0; UINT64 bytes = 0, availableMemory = 0; // in bytes SYSTEM_BASIC_PERFORMANCE_INFORMATION performanceInfo; //BfBatchFile batchFile(Game); // Check if game is already cached so we donot have wait through another if (String_Compare(g_szPrevGame, Game->InstallPath) == 0 && !g_bRecache) return; g_bRecache = FALSE; if (!FolderExists(Game->InstallPath)) { Log(L"Folder not exist!"); } // Check available memory NtQuerySystemInformation( SystemBasicPerformanceInformation, &performanceInfo, sizeof(SYSTEM_BASIC_PERFORMANCE_INFORMATION), NULL ); availableMemory = performanceInfo.AvailablePages * HwInfoSystemBasicInformation.PageSize; // Read batch file PushFileList = 0; BatchFile_Initialize(Game); bytes = BatchFile_GetBatchSize(); PushFileList = BatchFile_GetBatchList(); // Check if any files at all are marked for cache, if not return. if (PushFileList == NULL) // List is empty hence no files to cache, return. return; // Add 200MB padding for disk format; bytes += 209715200; if (bytes > availableMemory) { MessageBoxW( NULL, L"There isn't enough memory to hold all the files you marked for caching.\n" L"The Ramdisk will be set to an acceptable size and filled with what it can hold.\n" L"Please upgrade RAM.", L"Push", MB_TOPMOST ); } RemoveRamDisk(); mountPoint = FindFreeDriveLetter(); CreateRamDisk(bytes, mountPoint); FormatRamDisk(); CacheFiles(mountPoint); // Release batchfile list PushFileList = NULL; String_Copy(g_szPrevGame, Game->InstallPath); }
INT32 __stdcall start( ) { HANDLE sectionHandle, *hMutex; HANDLE eventHandle; HANDLE threadHandle; DWORD sectionSize; MSG messages; OBJECT_ATTRIBUTES objAttrib = {0}; PTEB threadEnvironmentBlock; UNICODE_STRING eventSource; LDR_DATA_TABLE_ENTRY *module; SECTION_BASIC_INFORMATION sectionInfo; LARGE_INTEGER newSectionSize; InitializeCRT(); threadEnvironmentBlock = NtCurrentTeb(); PushProcessId = threadEnvironmentBlock->ClientId.UniqueProcess; PushHeapHandle = threadEnvironmentBlock->ProcessEnvironmentBlock->ProcessHeap; PushSessionId = threadEnvironmentBlock->ProcessEnvironmentBlock->SessionId; // Check if already running hMutex = CreateMutexW(0, FALSE, L"PushOneInstance"); if (threadEnvironmentBlock->LastErrorValue == ERROR_ALREADY_EXISTS || threadEnvironmentBlock->LastErrorValue == ERROR_ACCESS_DENIED) { MessageBoxW(0, L"Only one instance!", 0,0); ExitProcess(0); } //create image event eventHandle = NULL; UnicodeString_Init(&eventSource, L"Global\\" PUSH_IMAGE_EVENT_NAME); objAttrib.Length = sizeof(OBJECT_ATTRIBUTES); objAttrib.RootDirectory = BaseGetNamedObjectDirectory(); objAttrib.ObjectName = &eventSource; objAttrib.Attributes = OBJ_OPENIF; objAttrib.SecurityDescriptor = NULL; objAttrib.SecurityQualityOfService = NULL; NtCreateEvent(&eventHandle, EVENT_ALL_ACCESS, &objAttrib, NotificationEvent, FALSE); // populate file name and path module = (LDR_DATA_TABLE_ENTRY*)threadEnvironmentBlock->ProcessEnvironmentBlock->Ldr->InLoadOrderModuleList.Flink; Memory_Copy(PushFilePath, module->FullDllName.Buffer, module->FullDllName.Length); PushFilePath[module->FullDllName.Length] = L'\0'; // Start Driver. Driver_Extract(); PushDriverLoaded = Driver_Load(); //initialize instance PushInstance = Module_GetHandle(L"Push.exe"); // Create interface MwCreateMainWindow(); // Create section. sectionSize = sizeof(PUSH_SHARED_MEMORY) + OSD_GetSize(); PushSharedMemory = (PUSH_SHARED_MEMORY*)Memory_MapViewOfSection(PUSH_SECTION_NAME, sectionSize, §ionHandle); if (!PushSharedMemory) { Log(L"Could not create shared memory"); return 0; } Log(L"Created section of size %i bytes", sectionSize); //zero struct Memory_Clear(PushSharedMemory, sizeof(PUSH_SHARED_MEMORY)); //initialize window handle used by overlay //PushSharedMemory->WindowHandle = PushMainWindow->Handle; //initialize default font properties for overlay String_Copy(PushSharedMemory->FontName, L"Verdana"); PushSharedMemory->FontBold = TRUE; if (File_Exists(PUSH_SETTINGS_FILE)) { wchar_t *buffer; wchar_t marker; // Check if file is UTF-16LE. buffer = (WCHAR*) File_Load(PUSH_SETTINGS_FILE, NULL); marker = buffer[0]; Memory_Free(buffer); if (marker == 0xFEFF) //is UTF-LE. { // Init settings from ini file. buffer = Memory_Allocate(100 * sizeof(WCHAR)); Ini_GetString(L"Settings", L"FrameLimit", NULL, buffer, 5, L".\\" PUSH_SETTINGS_FILE); PushSharedMemory->FrameLimit = _wtoi(buffer); if (Ini_ReadBoolean(L"Settings", L"ThreadOptimization", FALSE, L".\\" PUSH_SETTINGS_FILE)) PushSharedMemory->ThreadOptimization = TRUE; if (Ini_ReadBoolean(L"Settings", L"KeepFps", FALSE, L".\\" PUSH_SETTINGS_FILE)) PushSharedMemory->KeepFps = TRUE; Ini_GetString(L"Settings", L"OverlayInterface", NULL, buffer, 5, L".\\" PUSH_SETTINGS_FILE); if (String_Compare(buffer, L"PURE") == 0) PushOverlayInterface = OVERLAY_INTERFACE_PURE; else if (String_Compare(buffer, L"RTSS") == 0) PushOverlayInterface = OVERLAY_INTERFACE_RTSS; Ini_GetString(L"Settings", L"KeyboardHookType", L"AUTO", buffer, 10, L".\\" PUSH_SETTINGS_FILE); if (String_Compare(buffer, L"AUTO") == 0) { PushSharedMemory->KeyboardHookType = KEYBOARD_HOOK_AUTO; } else if (String_Compare(buffer, L"SUBCLASS") == 0) { PushSharedMemory->KeyboardHookType = KEYBOARD_HOOK_SUBCLASS; } else if (String_Compare(buffer, L"MESSAGE") == 0) { PushSharedMemory->KeyboardHookType = KEYBOARD_HOOK_MESSAGE; } else if (String_Compare(buffer, L"KEYBOARD") == 0) { PushSharedMemory->KeyboardHookType = KEYBOARD_HOOK_KEYBOARD; } else if (String_Compare(buffer, L"DETOURS") == 0) { PushSharedMemory->KeyboardHookType = KEYBOARD_HOOK_DETOURS; } else if (String_Compare(buffer, L"RAW") == 0) { PushSharedMemory->KeyboardHookType = KEYBOARD_HOOK_RAW; } else { PushSharedMemory->KeyboardHookType = KEYBOARD_HOOK_AUTO; } Ini_GetString(L"Settings", L"EngineClockMax", NULL, buffer, 5, L".\\" PUSH_SETTINGS_FILE); PushSharedMemory->HarwareInformation.DisplayDevice.EngineOverclock = _wtoi(buffer); Ini_GetString(L"Settings", L"MemoryClockMax", NULL, buffer, 5, L".\\" PUSH_SETTINGS_FILE); PushSharedMemory->HarwareInformation.DisplayDevice.MemoryOverclock = _wtoi(buffer); Ini_GetString(L"Settings", L"ControllerTimeout", NULL, buffer, 5, L".\\" PUSH_SETTINGS_FILE); PushSharedMemory->ControllerTimeout = _wtoi(buffer); Ini_GetString(L"Settings", L"FontName", L"Verdana", buffer, 100, L".\\" PUSH_SETTINGS_FILE); String_Copy(PushSharedMemory->FontName, buffer); Memory_Free(buffer); if (Ini_ReadBoolean(L"Settings", L"FontBold", FALSE, L".\\" PUSH_SETTINGS_FILE)) PushSharedMemory->FontBold = TRUE; } else { MessageBoxW( NULL, L"Settings file not UTF-16LE! " L"Resave the file as \"Unicode\" or Push won't read it!", L"Bad Settings file", NULL ); } } if (!PushDriverLoaded) { wchar_t driverPath[260]; Resource_Extract(L"DRIVERALT", L"WinRing0x64.sys"); GetDriverPath(L"WinRing0x64.sys", driverPath); Wr0DriverLoaded = Wr0Initialize(driverPath); } //initialize HWInfo GetHardwareInfo(); //initialize OSD items NtQuerySection( sectionHandle, SectionBasicInformation, §ionInfo, sizeof(SECTION_BASIC_INFORMATION), NULL ); newSectionSize.QuadPart = OSD_Initialize() + sizeof(PUSH_SHARED_MEMORY); if (newSectionSize.QuadPart > sectionInfo.MaximumSize.QuadPart) { Log(L"Shared memory too small!"); } //Check for controllers/gamepads/bluetooth adapters //EnumerateDevices(); // Check for running games Process_EnumProcesses(ProcessEnum); // Activate process monitoring if (PushDriverLoaded) { PushToggleProcessMonitoring(TRUE); } else { HANDLE overlayLib = NULL; void* prcAddress = 0; Resource_Extract(L"OVERLAY32", PUSH_LIB_NAME_32); overlayLib = Module_Load(L"overlay32.dll"); prcAddress = Module_GetProcedureAddress(overlayLib, "InstallOverlayHook"); if (prcAddress) { InstallOverlayHook = (TYPE_InstallOverlayHook)prcAddress; InstallOverlayHook(); } } g_szPrevGame[5] = '\0'; NtCreateThreadEx( &PushMonitorThreadHandle, THREAD_ALL_ACCESS, NULL, NtCurrentProcess(), &MonitorThread, NULL, NoThreadFlags, 0, 0, 0, NULL ); NtCreateThreadEx( &threadHandle, THREAD_ALL_ACCESS, NULL, NtCurrentProcess(), &PipeThread, NULL, NoThreadFlags, 0, 0, 0, NULL ); // Handle messages while(GetMessageW(&messages, 0,0,0)) { TranslateMessage(&messages); DispatchMessageW(&messages); } ExitProcess(0); return 0; }
PUBLIC BOOL CmdLine_Parse(s_CLONEPARMS *parm) { BOOL gotSrcFn=FALSE,gotDstFn=FALSE; PSTR pszArg; UINT argc = Env_ParamCount(); UINT iArg = 1; ZeroMemory(parm,sizeof(s_CLONEPARMS)); parm->flags = PARM_FLAG_CLIMODE; while (iArg <= argc) { pszArg = Env_ParamStr(iArg); if (!pszArg) break; // can't happen. iArg++; if (pszArg[0]=='-') { // if option if (pszArg[1]=='-') { // verbose options char szItem[32]; pszArg+=2; for (;;) { pszArg = VerboseSubOption(szItem,32,pszArg); if (szItem[0]==0) break; if (String_Compare(szItem,pszVOPTHELP)==0) { return Usage(TRUE); } else if (String_Compare(szItem,pszVOPTOUTPUT)==0) { iArg = GetOutputOption(parm,iArg,gotDstFn); if (iArg==0) return FALSE; gotDstFn = TRUE; } else if (String_Compare(szItem,pszVOPTKEEPUUID)==0) { if (!GetOption(parm,iArg,PARM_FLAG_KEEPUUID,pszVOPTKEEPUUID)) return FALSE; } else if (String_Compare(szItem,pszVOPTCOMPACT)==0) { if (!GetOption(parm,iArg,PARM_FLAG_COMPACT,pszVOPTCOMPACT)) return FALSE; } else if (String_Compare(szItem,pszVOPTNOMERGE)==0) { if (!GetOption(parm,iArg,PARM_FLAG_NOMERGE,pszVOPTNOMERGE)) return FALSE; } else if (String_Compare(szItem,pszVOPTREPART)==0) { if (!GetOption(parm,iArg,PARM_FLAG_REPART,pszVOPTREPART)) return FALSE; } else if (String_Compare(szItem,pszVOPTENLARGE)==0) { iArg = GetEnlargeOption(parm,iArg); if (iArg==0) return FALSE; } else { return ArgError(RSTR(UNKOPT),iArg-1); } } } else { // single char options. CHAR c; pszArg++; c = *pszArg++; if (!c) return ArgError(RSTR(INVOPT),iArg-1); while (c) { if (c==pszCHAROPT[4]) { // 'h' return Usage(TRUE); } else if (c==pszCHAROPT[0]) { // 'o' iArg = GetOutputOption(parm,iArg,gotDstFn); if (iArg==0) return FALSE; gotDstFn = TRUE; } else if (c==pszCHAROPT[1]) { // 'k' if (!GetOption(parm,iArg,PARM_FLAG_KEEPUUID,pszVOPTKEEPUUID)) return FALSE; } else if (c==pszCHAROPT[3]) { // 'c' if (!GetOption(parm,iArg,PARM_FLAG_COMPACT,pszVOPTCOMPACT)) return FALSE; } else if (c==pszCHAROPT[5]) { // 'r' if (!GetOption(parm,iArg,PARM_FLAG_REPART,pszVOPTREPART)) return FALSE; } else if (c==pszCHAROPT[2]) { // 'e' iArg = GetEnlargeOption(parm,iArg); if (iArg==0) return FALSE; } else { return ArgError(RSTR(UNKOPT),iArg-1); } c = *pszArg++; } } } else if (gotSrcFn) { return ArgError(RSTR(SRCTWICE),iArg-1); } else { GetFullPathName(pszArg,1024,parm->srcfn,0); gotSrcFn = TRUE; } } if (!gotSrcFn) { return ArgError(RSTR(NEEDSRC),iArg-1); } if (!gotDstFn) { Env_GenerateCloneName(parm->dstfn,parm->srcfn); } GetFullPathName(parm->dstfn,1024,tmpfn,0); String_Copy(parm->dstfn, tmpfn, 1024); if (!(parm->flags & PARM_FLAG_ENLARGE)) parm->flags &= ~PARM_FLAG_REPART; return TRUE; }