PLUGINFUNCTIONEND PLUGINFUNCTION(Store) { TempStack *tmp; int size = ((INST_R9+1)*g_stringsize); char *command, *cmd = command = system_popstring(); while (*cmd != 0) { switch (*(cmd++)) { case 's': case 'S': // Store the whole variables range tmp = (TempStack*) GlobalAlloc(GPTR, sizeof(TempStack)+size); tmp->Next = tempstack; tempstack = tmp; // Fill with data copymem(tempstack->Data, g_variables, size); break; case 'l': case 'L': if (tempstack == NULL) break; // Fill with data copymem(g_variables, tempstack->Data, size); // Restore stack tmp = tempstack->Next; GlobalFree((HANDLE) tempstack); tempstack = tmp; break; case 'P': *cmd += 10; case 'p': GlobalFree((HANDLE) system_pushstring(system_getuservariable(*(cmd++)-'0'))); break; case 'R': *cmd += 10; case 'r': GlobalFree((HANDLE) system_setuservariable(*(cmd++)-'0', system_popstring())); break; } } GlobalFree((HANDLE) command); }
PLUGINFUNCTIONEND PLUGINFUNCTION(Get) { SystemProc *proc = PrepareProc(FALSE); if (proc == NULL) { system_pushstring(_T("error")); return; } SYSTEM_LOG_ADD(_T("Get ")); SYSTEM_LOG_ADD(proc->DllName); SYSTEM_LOG_ADD(_T("::")); SYSTEM_LOG_ADD(proc->ProcName); //SYSTEM_LOG_ADD(_T("\n")); SYSTEM_LOG_POST; if ((proc->Options & POPT_ALWRETURN) != 0) { // Always return flag set -> return separate proc and result system_pushintptr((INT_PTR) proc); GlobalFree(system_pushstring(GetResultStr(proc))); } else { if (proc->ProcResult != PR_OK) { // No always return flag and error result - return result GlobalFree(system_pushstring(GetResultStr(proc))); // If proc is permanent? if ((proc->Options & POPT_PERMANENT) == 0) GlobalFree((HGLOBAL) proc); // No, free it } else // Ok result, return proc system_pushintptr((INT_PTR) proc); } } PLUGINFUNCTIONEND
void system_pushint(int value) { TCHAR buffer[80]; wsprintf(buffer, _T("%d"), value); system_pushstring(buffer); }
} PLUGINFUNCTIONEND PLUGINFUNCTION(Call) { // Prepare input SystemProc *proc = PrepareProc(TRUE); if (proc == NULL) return; SYSTEM_LOG_ADD(_T("Call ")); SYSTEM_LOG_ADD(proc->DllName); SYSTEM_LOG_ADD(_T("::")); SYSTEM_LOG_ADD(proc->ProcName); //SYSTEM_LOG_ADD(_T("\n")); SYSTEM_LOG_POST; if (proc->ProcResult != PR_CALLBACK) ParamAllocate(proc); ParamsIn(proc); #ifndef SYSTEM_X64 // Make the call if (proc->ProcResult != PR_ERROR) { switch (proc->ProcType) { case PT_NOTHING: if (proc->ProcResult == PR_CALLBACK) proc = CallBack(proc); break; case PT_PROC: case PT_VTABLEPROC: proc = CallProc(proc); break; case PT_STRUCT: CallStruct(proc); break; } } // Process output if ((proc->Options & POPT_ALWRETURN) != 0) { // Always return flag set - return separate return and result ParamsOut(proc); GlobalFree(system_pushstring(GetResultStr(proc))); } else { if (proc->ProcResult != PR_OK) { ProcParameter pp; // Save old return param pp = proc->Params[0]; // Return result instead of return value proc->Params[0].Value = BUGBUG64(int) GetResultStr(proc); proc->Params[0].Type = PAT_TSTRING; // Return all params ParamsOut(proc); // Restore old return param proc->Params[0] = pp; } else ParamsOut(proc); } if (proc->ProcResult != PR_CALLBACK) { // Deallocate params if not callback ParamsDeAllocate(proc); // if not callback - check for unload library option if ((proc->Options & POPT_UNLOAD) && (proc->ProcType == PT_PROC) && (proc->Dll != NULL)) FreeLibrary(proc->Dll); // and unload it :) // In case of POPT_ERROR - first pop will be proc error if ((proc->Options & POPT_ERROR) != 0) system_pushint(LastError); } // If proc is permanent? if ((proc->Options & POPT_PERMANENT) == 0) GlobalFree((HANDLE) proc); // No, free it #else // Fake the behavior of the System plugin for the LoadImage API function. // Otherwise, it is not yet implemented on 64-bit Windows. if (lstrcmp(proc->ProcName, "LoadImageA") == 0) { HANDLE res = LoadImage((HINSTANCE)proc->Params[1].Value, (LPCSTR)proc->Params[2].Value, (UINT)proc->Params[3].Value, (int)proc->Params[4].Value, (int)proc->Params[5].Value, (UINT)proc->Params[6].Value); ParamsOut(proc); system_pushintptr((INT_PTR)res); } else { ParamsOut(proc); system_pushintptr(0); } #endif } PLUGINFUNCTIONEND
} PLUGINFUNCTIONEND PLUGINFUNCTION(Call) { // Prepare input SystemProc *proc = PrepareProc(TRUE); if (proc == NULL) return; SYSTEM_LOG_ADD(_T("Call ")); SYSTEM_LOG_ADD(proc->DllName); SYSTEM_LOG_ADD(_T("::")); SYSTEM_LOG_ADD(proc->ProcName); SYSTEM_LOG_ADD(_T("\n")); if (proc->ProcResult != PR_CALLBACK) ParamAllocate(proc); ParamsIn(proc); // Make the call if (proc->ProcResult != PR_ERROR) { switch (proc->ProcType) { case PT_NOTHING: if (proc->ProcResult == PR_CALLBACK) proc = CallBack(proc); break; case PT_PROC: case PT_VTABLEPROC: proc = CallProc(proc); break; case PT_STRUCT: CallStruct(proc); break; } } // Process output if ((proc->Options & POPT_ALWRETURN) != 0) { // Always return flag set - return separate return and result ParamsOut(proc); GlobalFree(system_pushstring(GetResultStr(proc))); } else { if (proc->ProcResult != PR_OK) { ProcParameter pp; // Save old return param pp = proc->Params[0]; // Return result instead of return value proc->Params[0].Value = (int) GetResultStr(proc); #ifdef _UNICODE proc->Params[0].Type = PAT_WSTRING; #else proc->Params[0].Type = PAT_STRING; #endif // Return all params ParamsOut(proc); // Restore old return param proc->Params[0] = pp; } else ParamsOut(proc); } if (proc->ProcResult != PR_CALLBACK) { // Deallocate params if not callback ParamsDeAllocate(proc); // if not callback - check for unload library option if ((proc->Options & POPT_UNLOAD) && (proc->ProcType == PT_PROC) && (proc->Dll != NULL)) FreeLibrary(proc->Dll); // and unload it :) // In case of POPT_ERROR - first pop will be proc error if ((proc->Options & POPT_ERROR) != 0) system_pushint(LastError); } // If proc is permanent? if ((proc->Options & POPT_PERMANENT) == 0) GlobalFree((HANDLE) proc); // No, free it } PLUGINFUNCTIONEND
void system_pushint64(__int64 value) { TCHAR buffer[80]; wsprintf(buffer, _T("%I64d"), value); system_pushstring(buffer); }