Bug fixes for server stability

This commit is contained in:
RaidMax 2015-08-17 15:38:42 -05:00
parent a0ccd3ffa8
commit d3e42541ea
11 changed files with 357 additions and 99 deletions

View File

@ -25,12 +25,13 @@
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>false</MapFileExtensions>
<InstallUrl>http://raidmax.org/IW4M/Admin/</InstallUrl>
<SupportUrl>http://raidmax.org/IW4MAdmin</SupportUrl>
<ProductName>IW4M Administration</ProductName>
<PublisherName>RaidMax LLC</PublisherName>
<CreateWebPageOnPublish>true</CreateWebPageOnPublish>
<WebPage>publish.htm</WebPage>
<ApplicationRevision>7</ApplicationRevision>
<ApplicationVersion>0.7.0.%2a</ApplicationVersion>
<ApplicationRevision>6</ApplicationRevision>
<ApplicationVersion>0.9.1.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<PublishWizardCompleted>true</PublishWizardCompleted>
<BootstrapperEnabled>true</BootstrapperEnabled>
@ -72,12 +73,16 @@
<PropertyGroup>
<StartupObject>IW4MAdmin.Program</StartupObject>
</PropertyGroup>
<PropertyGroup>
<NoWin32Manifest>true</NoWin32Manifest>
</PropertyGroup>
<PropertyGroup />
<PropertyGroup>
<RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
</PropertyGroup>
<PropertyGroup>
<GenerateManifests>true</GenerateManifests>
</PropertyGroup>
<PropertyGroup>
<ApplicationManifest>Properties\app.manifest</ApplicationManifest>
</PropertyGroup>
<ItemGroup>
<Reference Include="Kayak">
<HintPath>..\packages\Kayak.0.7.2\lib\Kayak.dll</HintPath>
@ -123,21 +128,21 @@
<Compile Include="IW4_GameStructs.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="lib\AdminInterface.dll">
<None Include="lib\AdminInterface.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="lib\Kayak.dll">
</None>
<None Include="lib\Kayak.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="lib\Moserware.Skills.dll">
</None>
<None Include="lib\Moserware.Skills.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="lib\SQLite.Interop.dll">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="lib\System.Data.SQLite.dll">
</None>
<None Include="lib\SQLite.Interop.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</None>
<None Include="lib\System.Data.SQLite.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<Content Include="version.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
@ -171,13 +176,10 @@
<Content Include="config\rules.cfg">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="config\servers.cfg">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<None Include="app.config" />
<None Include="IW4MAdmin.exe.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<Content Include="IW4MAdmin.exe.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<None Include="m2demo\admin\commands.gsc">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
@ -190,12 +192,18 @@
<None Include="m2demo\settings\main.gsc">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Properties\app.manifest" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.0">
<Visible>False</Visible>
<ProductName>Microsoft .NET Framework 4 %28x86 and x64%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
@ -204,16 +212,101 @@
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Visual.C++.12.0.x86">
<Visible>False</Visible>
<ProductName>Visual C++ 2013 Runtime Libraries %28x86%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<Content Include="IW4MAdmin.ico" />
</ItemGroup>
<ItemGroup>
<PublishFile Include="config\maps.cfg">
<Visible>False</Visible>
<Group>
</Group>
<TargetPath>
</TargetPath>
<PublishState>DataFile</PublishState>
<IncludeHash>True</IncludeHash>
<FileType>File</FileType>
</PublishFile>
<PublishFile Include="config\messages.cfg">
<Visible>False</Visible>
<Group>
</Group>
<TargetPath>
</TargetPath>
<PublishState>DataFile</PublishState>
<IncludeHash>True</IncludeHash>
<FileType>File</FileType>
</PublishFile>
<PublishFile Include="config\rules.cfg">
<Visible>False</Visible>
<Group>
</Group>
<TargetPath>
</TargetPath>
<PublishState>DataFile</PublishState>
<IncludeHash>True</IncludeHash>
<FileType>File</FileType>
</PublishFile>
<PublishFile Include="IW4MAdmin.XmlSerializers">
<Visible>False</Visible>
<Group>
</Group>
<TargetPath>
</TargetPath>
<PublishState>Exclude</PublishState>
<IncludeHash>True</IncludeHash>
<FileType>Assembly</FileType>
</PublishFile>
<PublishFile Include="Kayak">
<Visible>False</Visible>
<Group>
</Group>
<TargetPath>
</TargetPath>
<PublishState>Exclude</PublishState>
<IncludeHash>True</IncludeHash>
<FileType>Assembly</FileType>
</PublishFile>
<PublishFile Include="Moserware.Skills">
<Visible>False</Visible>
<Group>
</Group>
<TargetPath>
</TargetPath>
<PublishState>Exclude</PublishState>
<IncludeHash>True</IncludeHash>
<FileType>Assembly</FileType>
</PublishFile>
<PublishFile Include="System.Data.SQLite">
<Visible>False</Visible>
<Group>
</Group>
<TargetPath>
</TargetPath>
<PublishState>Exclude</PublishState>
<IncludeHash>True</IncludeHash>
<FileType>Assembly</FileType>
</PublishFile>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>
</PostBuildEvent>
<PostBuildEvent>cd "$(TargetDir)"
del *.dll
del *.config
del *.application
del *.pdb
del *.manifest
del *.rm
cd ..
cd ..
copy IW4MAdmin.exe.config $(TargetDir)\IW4MAdmin.exe.config</PostBuildEvent>
</PropertyGroup>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View File

@ -21,6 +21,10 @@ namespace IW4MAdmin
Port = port;
}
public void Write(String line)
{
Write(line, Level.Debug);
}
public void Write(String line, Level lv)
{

View File

@ -3,18 +3,22 @@ using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Runtime.InteropServices;
namespace IW4MAdmin
{
class Program
{
static public double Version = 0.91;
static public double Version = 0.92;
static public double latestVersion;
static public bool usingMemory = true;
static private Manager serverManager;
static void Main(string[] args)
{
handler = new ConsoleEventDelegate(OnProcessExit);
SetConsoleCtrlHandler(handler, true);
double.TryParse(checkUpdate(), out latestVersion);
Console.WriteLine("=====================================================");
Console.WriteLine(" IW4M ADMIN");
@ -48,7 +52,7 @@ namespace IW4MAdmin
}
if (serverManager.getServers() != null)
Console.WriteLine("IW4M Now Initialized! Visit http://127.0.0.1:1624 for server overview.");
Program.getManager().mainLog.Write("IW4M Now Initialized! Visit http://127.0.0.1:1624 for server overview.");
if (serverManager.getServers().Count > 0)
{
@ -80,6 +84,38 @@ namespace IW4MAdmin
}
#endif
static ConsoleEventDelegate handler;
static private bool OnProcessExit(int e)
{
try
{
foreach (Server S in IW4MAdmin.Program.getServers())
{
if (S == null)
continue;
if (Utilities.shutdownInterface(S.pID(), IntPtr.Zero))
Program.getManager().mainLog.Write("Successfully removed IW4MAdmin from server with PID " + S.pID(), Log.Level.Debug);
else
Program.getManager().mainLog.Write("Could not remove IW4MAdmin from server with PID " + S.pID(), Log.Level.Debug);
}
Program.getManager().shutDown();
}
catch
{
return true;
}
return false;
}
private delegate bool ConsoleEventDelegate(int eventType);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetConsoleCtrlHandler(ConsoleEventDelegate callback, bool add);
static private String checkUpdate()
{
Connection Ver = new Connection("http://raidmax.org/IW4M/Admin/version.php");
@ -91,6 +127,11 @@ namespace IW4MAdmin
return serverManager.getServers().ToArray();
}
static public Manager getManager()
{
return serverManager;
}
#if DEBUG2
static List<Server> checkConfig()
{

View File

@ -14,7 +14,7 @@ namespace IW4MAdmin
private List<Server> Servers;
private SortedDictionary<int, Thread> ThreadList;
private List<int> activePIDs;
private Log mainLog;
public Log mainLog;
private bool initialized = false;
public Manager()
@ -80,6 +80,18 @@ namespace IW4MAdmin
}
}
public void shutDown()
{
foreach (Server S in Servers)
S.isRunning = false;
foreach (int PID in activePIDs)
{
ThreadList[PID].Abort();
mainLog.Write("Exited thread for PID " + PID);
}
}
public List<Server> getServers()
{
return Servers;
@ -88,8 +100,15 @@ namespace IW4MAdmin
private void scanForNewServers()
{
List<int> newProcesses = getCurrentIW4MProcesses();
if (activePIDs == null)
return;
foreach (int pID in newProcesses)
{
if (pID == 0)
continue;
bool newProcess = true;
foreach (int I in activePIDs)
{
@ -99,7 +118,6 @@ namespace IW4MAdmin
if (newProcess)
{
if (!ThreadList.ContainsKey(pID))
{
Server S = loadIndividualServer(pID);

View File

@ -28,7 +28,8 @@ namespace IW4MAdmin
//We want to read the reponse
public String[] responseSendRCON(String message)
{
try
return null;
/* try
{
String STR_REQUEST = String.Empty;
if (message != "getstatus")
@ -89,7 +90,7 @@ namespace IW4MAdmin
sv_connection.Close();
sv_connection = new UdpClient();
return null;
}
}*/
}
public String[] addRCON(String Message)
@ -113,7 +114,7 @@ namespace IW4MAdmin
{
RCON_Request Current = toSend.Peek();
//Current.Response = responseSendRCON(Current.Request);
Utilities.executeCommand(Instance.pID(), Current.Request);
Utilities.executeCommand(Instance.pID(), Current.Request, Instance.lastCommandPointer);
toSend.Dequeue();
//Utilities.Wait(0.567);
Utilities.Wait(.3);

View File

@ -529,17 +529,17 @@ namespace IW4MAdmin
public void executeCommand(String CMD)
{
Utilities.executeCommand(PID, CMD);
lastCommandPointer = Utilities.executeCommand(PID, CMD, lastCommandPointer);
}
private dvar getDvar(String DvarName)
{
return Utilities.getDvar(PID, DvarName);
return Utilities.getDvar(PID, DvarName, lastCommandPointer);
}
private void setDvar(String Dvar, String Value)
{
Utilities.executeCommand(PID, Dvar + " " + Value);
lastDvarPointer = Utilities.executeCommand(PID, Dvar + " " + Value, lastDvarPointer);
}
[DllImport("kernel32.dll")]
@ -706,7 +706,7 @@ namespace IW4MAdmin
}
oldLines = lines;
l_size = logFile.getSize();
Thread.Sleep(250);
Thread.Sleep(150);
}
#if DEBUG == false
catch (Exception E)
@ -721,7 +721,7 @@ namespace IW4MAdmin
RCONQueue.Abort();
eventQueue.Abort();
}
#if DEBUG
#if DEBUG2
private void pollServer()
{
int timesFailed = 0;
@ -814,7 +814,7 @@ namespace IW4MAdmin
if (maxClients == -1)
{
Log.Write("Could not get iw4m_onelog value", IW4MAdmin.Log.Level.Debug);
Log.Write("Could not get max clients value", IW4MAdmin.Log.Level.Debug);
return false;
}
@ -844,12 +844,12 @@ namespace IW4MAdmin
if (!File.Exists(logPath))
{
Log.Write("Gamelog does not exist!", Log.Level.All);
Log.Write("Gamelog `" + logPath + "` does not exist!", Log.Level.All);
return false;
}
logFile = new file(logPath);
Log.Write("Log file is " + logPath, Log.Level.Production);
Log.Write("Log file is " + logPath, Log.Level.Debug);
Log.Write("Now monitoring " + this.getName(), Log.Level.Production);
return true;
}
@ -1221,11 +1221,6 @@ namespace IW4MAdmin
//END
public String getPassword()
{
return rcon_pass;
}
private void initMacros()
{
Macros = new Dictionary<String, Object>();
@ -1379,12 +1374,12 @@ namespace IW4MAdmin
private String hostname;
private String mapname;
private int clientnum;
private string rcon_pass;
private List<Player> players;
private List<Command> commands;
private List<String> messages;
private int messageTime;
private TimeSpan lastMessage;
private DateTime lastPoll;
private int nextMessage;
private String IW_Ver;
private int maxClients;
@ -1393,13 +1388,13 @@ namespace IW4MAdmin
private DateTime lastWebChat;
private int Handle;
private int PID;
private String backupRotation;
private int backupTimeLimit;
//Will probably move this later
public Dictionary<String, Player> statusPlayers;
public bool isRunning;
private DateTime lastPoll;
private IntPtr dllPointer;
public IntPtr lastCommandPointer;
public IntPtr lastDvarPointer;
//Log stuff
private String Basepath;

View File

@ -91,6 +91,8 @@ namespace IW4MAdmin
public static String stripColors(String str)
{
if (str == null)
return "";
return Regex.Replace(str, @"\^[0-9]", "");
}
@ -287,7 +289,7 @@ namespace IW4MAdmin
catch(Exception E)
{
/// need to handle eventually
Console.WriteLine("Error handling player add -- " + E.Message);
Program.getManager().mainLog.Write("Error handling player add -- " + E.Message);
continue;
}
}
@ -403,6 +405,9 @@ namespace IW4MAdmin
[DllImport("kernel32.dll", SetLastError = true)]
static extern int CloseHandle(IntPtr hObject);
[DllImport("kernel32.dll")]
static extern bool GetExitCodeThread(IntPtr hThread, out uint lpExitCode);
[DllImport("ntdll.dll")]
public static extern uint RtlCreateUserThread(
[In] IntPtr Process,
@ -538,7 +543,7 @@ namespace IW4MAdmin
return BitConverter.ToBoolean(Buff, 0);
}
public static void executeCommand(int pID, String Command)
public static IntPtr executeCommand(int pID, String Command, IntPtr lastMemoryLocation)
{
/*IntPtr ProcessHandle = OpenProcess(ProcessAccessFlags.All, false, pID);
IntPtr memoryForCMDName = allocateAndWrite(Encoding.ASCII.GetBytes(Command + "\0"), ProcessHandle);
@ -574,28 +579,34 @@ namespace IW4MAdmin
// cleanup
if (!VirtualFreeEx(ProcessHandle, codeAllocation, 0, AllocationType.Release))
Console.WriteLine(Marshal.GetLastWin32Error());
Program.getManager().mainLog.Write(Marshal.GetLastWin32Error());
if (!VirtualFreeEx(ProcessHandle, memoryForCMDName, 0, AllocationType.Release))
Console.WriteLine(Marshal.GetLastWin32Error());*/
Program.getManager().mainLog.Write(Marshal.GetLastWin32Error());*/
IntPtr ProcessHandle = OpenProcess(ProcessAccessFlags.All, false, pID);
IntPtr memoryForDvarName = allocateAndWrite(Encoding.ASCII.GetBytes(Command + "\0"), ProcessHandle);
if (lastMemoryLocation != IntPtr.Zero)
{
if (!VirtualFreeEx(ProcessHandle, lastMemoryLocation, 0, AllocationType.Release))
{
Program.getManager().mainLog.Write("Virtual Free Failed -- Error #" + Marshal.GetLastWin32Error());
return IntPtr.Zero;
}
}
IntPtr memoryForDvarName = allocateAndWrite(Encoding.ASCII.GetBytes(Command + "\0"), ProcessHandle); // this gets disposed next call
if (memoryForDvarName == IntPtr.Zero)
{
Console.WriteLine("UNABLE TO ALLOCATE MEMORY FOR DVAR NAME");
return;
Program.getManager().mainLog.Write("UNABLE TO ALLOCATE MEMORY FOR DVAR NAME");
return IntPtr.Zero;
}
setDvarCurrentPtr(0x2098D9C, memoryForDvarName, ProcessHandle);
Utilities.Wait(.3);
if (!VirtualFreeEx(ProcessHandle, memoryForDvarName, 0, AllocationType.Release))
Console.WriteLine("Virtual Free Failed -- Error #" + Marshal.GetLastWin32Error());
CloseHandle(ProcessHandle);
return memoryForDvarName;
}
public static IntPtr allocateAndWrite(Byte[] Data, IntPtr ProcessHandle)
@ -604,7 +615,7 @@ namespace IW4MAdmin
IntPtr AllocatedMemory = VirtualAllocEx(ProcessHandle, IntPtr.Zero, (uint)Data.Length, AllocationType.Commit, MemoryProtection.ExecuteReadWrite);
if (!WriteProcessMemory(ProcessHandle, AllocatedMemory, Data, (uint)Data.Length, out bytesWritten))
{
Console.WriteLine("UNABLE TO WRITE PROCESS MEMORY!");
Program.getManager().mainLog.Write("Unable to write process memory!");
return IntPtr.Zero;
}
@ -626,13 +637,91 @@ namespace IW4MAdmin
return true;
}
public static bool initalizeInterface(int pID)
public static bool shutdownInterface(int pID, IntPtr moduleHandle, params IntPtr[] cleanUp)
{
IntPtr threadID;
IntPtr ProcessHandle = OpenProcess(ProcessAccessFlags.All, false, pID);
#if DEBUG
Program.getManager().mainLog.Write("Process handle is: " + ProcessHandle);
Program.getManager().mainLog.Write("Module handle is " + moduleHandle);
#endif
if (ProcessHandle == IntPtr.Zero)
{
Program.getManager().mainLog.Write("Unable to open target process");
return false;
}
IntPtr baseAddress = IntPtr.Zero;
System.Diagnostics.Process P = System.Diagnostics.Process.GetProcessById(pID);
foreach (System.Diagnostics.ProcessModule M in P.Modules)
{
if (M.ModuleName == "AdminInterface.dll")
baseAddress = M.BaseAddress;
}
if (baseAddress == IntPtr.Zero)
{
Program.getManager().mainLog.Write("Base address was not found!");
return false;
}
IntPtr lpLLAddress = GetProcAddress(GetModuleHandle("kernel32.dll"), "FreeLibrary");
if (lpLLAddress == IntPtr.Zero)
{
Program.getManager().mainLog.Write("Could not obtain address of function address");
return false;
}
ClientId clientid = new ClientId();
threadID = new IntPtr();
RtlCreateUserThread(ProcessHandle, IntPtr.Zero, false, 0, (uint)0, IntPtr.Zero, lpLLAddress, baseAddress, out threadID, out clientid);
if (threadID == IntPtr.Zero)
{
Program.getManager().mainLog.Write("Could not create remote thread");
return false;
}
#if DEBUG
//Program.getManager().mainLog.Write("Thread Status is " + threadStatus);
Program.getManager().mainLog.Write("Thread ID is " + threadID);
#endif
uint responseCode = WaitForSingleObject(threadID, 3000);
if (responseCode != 0x00000000L)
{
Program.getManager().mainLog.Write("Thread did not finish in a timely manner!");
Program.getManager().mainLog.Write("Last error is: " + Marshal.GetLastWin32Error());
return false;
}
CloseHandle(ProcessHandle);
foreach (IntPtr Pointer in cleanUp)
{
if (Pointer != IntPtr.Zero)
{
if (!VirtualFreeEx(ProcessHandle, Pointer, 0, AllocationType.Release))
Program.getManager().mainLog.Write("Virtual Free Failed During Exit Cleanup -- Error #" + Marshal.GetLastWin32Error());
}
}
#if DEBUG
Program.getManager().mainLog.Write("shutdown finished -- last error : " + Marshal.GetLastWin32Error());
#endif
return true;
}
/////////////////////////////////////////////////////////////
public static Boolean initalizeInterface(int pID)
{
String Path = AppDomain.CurrentDomain.BaseDirectory + "lib\\AdminInterface.dll";
if (!File.Exists(Path))
{
Console.WriteLine("AdminInterface DLL does not exist!");
Program.getManager().mainLog.Write("AdminInterface DLL does not exist!");
return false;
}
@ -641,11 +730,11 @@ namespace IW4MAdmin
IntPtr ProcessHandle = OpenProcess(ProcessAccessFlags.All, false, pID);
#if DEBUG
Console.WriteLine("Process handle is: " + ProcessHandle);
Program.getManager().mainLog.Write("Process handle is: " + ProcessHandle);
#endif
if (ProcessHandle == IntPtr.Zero)
{
Console.WriteLine("Unable to open target process");
Program.getManager().mainLog.Write("Unable to open target process");
return false;
}
@ -653,30 +742,30 @@ namespace IW4MAdmin
if (lpLLAddress == IntPtr.Zero)
{
Console.WriteLine("Could not obtain address of function address");
Program.getManager().mainLog.Write("Could not obtain address of function address");
return false;
}
#if DEBUG
Console.WriteLine("LoadLibraryA location is 0x" + lpLLAddress.ToString("X8"));
Program.getManager().mainLog.Write("LoadLibraryA location is 0x" + lpLLAddress.ToString("X8"));
#endif
IntPtr pathAllocation = VirtualAllocEx(ProcessHandle, IntPtr.Zero, (uint)Path.Length + 1, AllocationType.Commit, MemoryProtection.ExecuteReadWrite);
if (pathAllocation == IntPtr.Zero)
{
Console.WriteLine("Could not allocate memory for path location");
Program.getManager().mainLog.Write("Could not allocate memory for path location");
return false;
}
#if DEBUG
Console.WriteLine("Allocated DLL path address is 0x" + pathAllocation.ToString("X8"));
Program.getManager().mainLog.Write("Allocated DLL path address is 0x" + pathAllocation.ToString("X8"));
#endif
byte[] pathBytes = Encoding.ASCII.GetBytes(Path);
if (!WriteProcessMemory(ProcessHandle, pathAllocation, pathBytes, (uint)pathBytes.Length, out bytesWritten))
{
Console.WriteLine("Could not write process memory");
Program.getManager().mainLog.Write("Could not write process memory");
return false;
}
@ -686,46 +775,49 @@ namespace IW4MAdmin
if (threadID == IntPtr.Zero)
{
Console.WriteLine("Could not create remote thread");
Program.getManager().mainLog.Write("Could not create remote thread");
return false;
}
#if DEBUG
//Console.WriteLine("Thread Status is " + threadStatus);
Console.WriteLine("Thread ID is " + threadID);
//Program.getManager().mainLog.Write("Thread Status is " + threadStatus);
Program.getManager().mainLog.Write("Thread ID is " + threadID);
#endif
uint responseCode = WaitForSingleObject (threadID, 3000);
uint responseCode = WaitForSingleObject(threadID, 5000);
if (responseCode != 0x00000000L)
{
Console.WriteLine("Thread did not finish in a timely manner!");
Console.WriteLine("Last error is: " + Marshal.GetLastWin32Error());
Program.getManager().mainLog.Write("Thread did not finish in a timely manner!", Log.Level.Debug);
Program.getManager().mainLog.Write("Last error is: " + Marshal.GetLastWin32Error(), Log.Level.Debug);
return false;
}
if (!VirtualFreeEx(ProcessHandle, pathAllocation, 0, AllocationType.Decommit))
Console.WriteLine("Could not free memory allocated for DLL name");
CloseHandle(ProcessHandle);
#if DEBUG
Console.WriteLine("Initialization finished -- last error : " + Marshal.GetLastWin32Error());
Program.getManager().mainLog.Write("Initialization finished -- last error : " + Marshal.GetLastWin32Error());
#endif
return true;
}
public static dvar getDvar(int pID, String DVAR)
public static dvar getDvar(int pID, String DVAR, IntPtr lastMemoryLocation)
{
dvar requestedDvar = new dvar();
IntPtr ProcessHandle = OpenProcess(ProcessAccessFlags.All, false, pID);
if (lastMemoryLocation != IntPtr.Zero)
{
if (!VirtualFreeEx(ProcessHandle, lastMemoryLocation, 0, AllocationType.Release))
Program.getManager().mainLog.Write("Virtual free failed during cleanup-- Error #" + Marshal.GetLastWin32Error(), Log.Level.Debug);
}
IntPtr memoryForDvarName = allocateAndWrite(Encoding.ASCII.GetBytes(DVAR + "\0"), ProcessHandle);
if (memoryForDvarName == IntPtr.Zero)
{
Console.WriteLine("UNABLE TO ALLOCATE MEMORY FOR DVAR NAME");
Program.getManager().mainLog.Write("Unable to allocate memory for dvar name", Log.Level.Debug);
return requestedDvar;
}
setDvarCurrentPtr(0x2089E04, memoryForDvarName, ProcessHandle); // sv_debugRate
setDvarCurrentPtr(0x2089E04, memoryForDvarName, ProcessHandle); // sv_allowedclan1
#if ASD
/* byte[] copyDvarValue = {
0x55, 0x8B, 0xEC, 0x83, 0xEC, 0x08, // -----------------------------------------------
@ -743,7 +835,7 @@ namespace IW4MAdmin
IntPtr codeAllocation = allocateAndWrite(copyDvarValue, ProcessHandle);
if (codeAllocation == IntPtr.Zero)
Console.WriteLine("UNABLE TO ALLOCATE MEMORY FOR CODE");
Program.getManager().mainLog.Write("UNABLE TO ALLOCATE MEMORY FOR CODE");
IntPtr ThreadHandle = CreateRemoteThread(ProcessHandle, IntPtr.Zero, 0, codeAllocation, IntPtr.Zero, 0, out threadID);
if (ThreadHandle == null || ThreadHandle == IntPtr.Zero)
@ -752,11 +844,11 @@ namespace IW4MAdmin
WaitForSingleObject(ThreadHandle, Int32.MaxValue); // gg if thread doesn't finish
if (!VirtualFreeEx(ProcessHandle, codeAllocation, 0, AllocationType.Release))
Console.WriteLine(Marshal.GetLastWin32Error());
Program.getManager().mainLog.Write(Marshal.GetLastWin32Error());
if (!VirtualFreeEx(ProcessHandle, memoryForDvarName, 0, AllocationType.Release))
Console.WriteLine(Marshal.GetLastWin32Error());*/
Program.getManager().mainLog.Write(Marshal.GetLastWin32Error());*/
#endif
Utilities.Wait(.3);
Thread.Sleep(120);
int dvarLoc = getIntFromPointer(0x2089E04, (int)ProcessHandle); // this is where the dvar is stored
if (dvarLoc == 0)

View File

@ -408,9 +408,10 @@ namespace IW4MAdmin_Web
{
public void OnException(IScheduler scheduler, Exception e)
{
Console.WriteLine(e.InnerException.Message);
Console.Write(e.InnerException);
e.DebugStackTrace();
//Program.getManager().mainLog.Write(e.InnerException.Message);
//Console.Write(e.InnerException);
// e.DebugStackTrace();
IW4MAdmin.Program.getManager().mainLog.Write("Web front encountered an error!");
}
public void OnStop(IScheduler scheduler)
@ -426,7 +427,7 @@ namespace IW4MAdmin_Web
String type = "text/html";
if (request.Uri.StartsWith("/"))
{
//Console.WriteLine("[WEBFRONT] Processing Request for " + request.Uri);
//Program.getManager().mainLog.Write("[WEBFRONT] Processing Request for " + request.Uri);
var body = String.Empty;
if (request.Uri.StartsWith("/"))
@ -476,6 +477,9 @@ namespace IW4MAdmin_Web
else if (request.QueryString == "playerhistory")
{
//type = "text/plain";
if (IW4MAdmin.Program.getServers().Length < server)
return;
StringBuilder test = new StringBuilder();
test.Append("<script type='text/javascript' src='//www.google.com/jsapi'></script><div id='chart_div'></div>");
test.Append("<script> var players = [");
@ -515,6 +519,9 @@ namespace IW4MAdmin_Web
IP = req[2];
}
if (IW4MAdmin.Program.getServers().Length < server)
return;
IW4MAdmin.Player P = IW4MAdmin.Program.getServers()[server].clientDB.getPlayer(IP);
if (P == null)
P = new IW4MAdmin.Player("Guest", "Guest", 0, 0);
@ -530,6 +537,9 @@ namespace IW4MAdmin_Web
// if (IW4MAdmin.Program.Servers[server].chatHistory.Count < 8)
// IW4MAdmin.Program.Servers[server].chatHistory.Add(new IW4MAdmin.Chat(new IW4MAdmin.Player("TEST", "xuid", 0, 0), "TEST MESSAGE", DateTime.Now));
#endif
if (IW4MAdmin.Program.getServers().Length < server)
return;
String IP, Text;
if (req.Length > 3)
{

View File

@ -1,4 +1,8 @@
VERSION: 0.9.1
VERSION 0.9.2
CHANGELOG:
-fixed issues with crashing IW4 Servers
VERSION: 0.9.1
CHANGELOG:
-fixed issue with `history` timelime
-fixed issue with mapname not being updated

View File

@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.31101.0
VisualStudioVersion = 12.0.40629.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IW4M ADMIN", "Admin\IW4M ADMIN.csproj", "{DD5DCDA2-51DB-4B1A-922F-5705546E6115}"
EndProject