@@ -0,0 +1,36 @@ | |||||
| |||||
Microsoft Visual Studio Solution File, Format Version 12.00 | |||||
# Visual Studio Version 16 | |||||
VisualStudioVersion = 16.0.30503.244 | |||||
MinimumVisualStudioVersion = 10.0.40219.1 | |||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BL3ProxySettings", "BL3ProxySettings.vcxproj", "{E70933C3-6395-4BB1-9B30-FB35D92D1643}" | |||||
EndProject | |||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BLua", "..\BL3Lua\BL3Lua.vcxproj", "{DF0B7199-3ED8-49DC-9544-46B6315D4390}" | |||||
EndProject | |||||
Global | |||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||||
Debug|x64 = Debug|x64 | |||||
Debug-JIT|x64 = Debug-JIT|x64 | |||||
Release|x64 = Release|x64 | |||||
EndGlobalSection | |||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution | |||||
{E70933C3-6395-4BB1-9B30-FB35D92D1643}.Debug|x64.ActiveCfg = Debug|x64 | |||||
{E70933C3-6395-4BB1-9B30-FB35D92D1643}.Debug|x64.Build.0 = Debug|x64 | |||||
{E70933C3-6395-4BB1-9B30-FB35D92D1643}.Debug-JIT|x64.ActiveCfg = Debug|x64 | |||||
{E70933C3-6395-4BB1-9B30-FB35D92D1643}.Debug-JIT|x64.Build.0 = Debug|x64 | |||||
{E70933C3-6395-4BB1-9B30-FB35D92D1643}.Release|x64.ActiveCfg = Release|x64 | |||||
{E70933C3-6395-4BB1-9B30-FB35D92D1643}.Release|x64.Build.0 = Release|x64 | |||||
{DF0B7199-3ED8-49DC-9544-46B6315D4390}.Debug|x64.ActiveCfg = Debug|x64 | |||||
{DF0B7199-3ED8-49DC-9544-46B6315D4390}.Debug|x64.Build.0 = Debug|x64 | |||||
{DF0B7199-3ED8-49DC-9544-46B6315D4390}.Debug-JIT|x64.ActiveCfg = Debug-JIT|x64 | |||||
{DF0B7199-3ED8-49DC-9544-46B6315D4390}.Debug-JIT|x64.Build.0 = Debug-JIT|x64 | |||||
{DF0B7199-3ED8-49DC-9544-46B6315D4390}.Release|x64.ActiveCfg = Release|x64 | |||||
{DF0B7199-3ED8-49DC-9544-46B6315D4390}.Release|x64.Build.0 = Release|x64 | |||||
EndGlobalSection | |||||
GlobalSection(SolutionProperties) = preSolution | |||||
HideSolutionNode = FALSE | |||||
EndGlobalSection | |||||
GlobalSection(ExtensibilityGlobals) = postSolution | |||||
SolutionGuid = {E5BFF991-181E-41E5-903E-7245BE2D45B0} | |||||
EndGlobalSection | |||||
EndGlobal |
@@ -0,0 +1,127 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||||
<ItemGroup Label="ProjectConfigurations"> | |||||
<ProjectConfiguration Include="Debug|x64"> | |||||
<Configuration>Debug</Configuration> | |||||
<Platform>x64</Platform> | |||||
</ProjectConfiguration> | |||||
<ProjectConfiguration Include="Release|x64"> | |||||
<Configuration>Release</Configuration> | |||||
<Platform>x64</Platform> | |||||
</ProjectConfiguration> | |||||
</ItemGroup> | |||||
<PropertyGroup Label="Globals"> | |||||
<VCProjectVersion>16.0</VCProjectVersion> | |||||
<Keyword>Win32Proj</Keyword> | |||||
<ProjectGuid>{e70933c3-6395-4bb1-9b30-fb35d92d1643}</ProjectGuid> | |||||
<RootNamespace>BL3ProxySettings</RootNamespace> | |||||
<WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion> | |||||
</PropertyGroup> | |||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> | |||||
<ConfigurationType>DynamicLibrary</ConfigurationType> | |||||
<UseDebugLibraries>true</UseDebugLibraries> | |||||
<PlatformToolset>v142</PlatformToolset> | |||||
<CharacterSet>Unicode</CharacterSet> | |||||
</PropertyGroup> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> | |||||
<ConfigurationType>DynamicLibrary</ConfigurationType> | |||||
<UseDebugLibraries>false</UseDebugLibraries> | |||||
<PlatformToolset>ClangCL</PlatformToolset> | |||||
<WholeProgramOptimization>true</WholeProgramOptimization> | |||||
<CharacterSet>Unicode</CharacterSet> | |||||
<UseOfMfc>false</UseOfMfc> | |||||
</PropertyGroup> | |||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> | |||||
<ImportGroup Label="ExtensionSettings"> | |||||
</ImportGroup> | |||||
<ImportGroup Label="Shared"> | |||||
</ImportGroup> | |||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> | |||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||||
</ImportGroup> | |||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> | |||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||||
</ImportGroup> | |||||
<PropertyGroup Label="UserMacros" /> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> | |||||
<LinkIncremental>true</LinkIncremental> | |||||
<IncludePath>F:\Programmieren\C++\vcpkg\installed\x64-windows-static-md\include;$(IncludePath)</IncludePath> | |||||
<LibraryPath>F:\Programmieren\C++\vcpkg\installed\x64-windows-static-md\debug\lib;$(LibraryPath)</LibraryPath> | |||||
</PropertyGroup> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> | |||||
<LinkIncremental>false</LinkIncremental> | |||||
<IncludePath>F:\Programmieren\C++\vcpkg\installed\x64-windows\include;$(IncludePath)</IncludePath> | |||||
<LibraryPath>F:\Programmieren\C++\vcpkg\installed\x64-windows\lib;$(LibraryPath)</LibraryPath> | |||||
</PropertyGroup> | |||||
<PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> | |||||
<VcpkgUseStatic>true</VcpkgUseStatic> | |||||
<VcpkgTriplet>x64-windows-static-md</VcpkgTriplet> | |||||
</PropertyGroup> | |||||
<PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> | |||||
<VcpkgUseStatic>true</VcpkgUseStatic> | |||||
<VcpkgTriplet>x64-windows-static-md</VcpkgTriplet> | |||||
</PropertyGroup> | |||||
<PropertyGroup Label="Vcpkg"> | |||||
<VcpkgEnabled>true</VcpkgEnabled> | |||||
<VcpkgAutoLink>false</VcpkgAutoLink> | |||||
</PropertyGroup> | |||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> | |||||
<ClCompile> | |||||
<WarningLevel>Level3</WarningLevel> | |||||
<SDLCheck>true</SDLCheck> | |||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||||
<ConformanceMode>false</ConformanceMode> | |||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> | |||||
<LanguageStandard_C>stdc17</LanguageStandard_C> | |||||
<AdditionalOptions>/bigobj %(AdditionalOptions)</AdditionalOptions> | |||||
<LanguageStandard>stdcpp17</LanguageStandard> | |||||
<BufferSecurityCheck>false</BufferSecurityCheck> | |||||
<DebugInformationFormat>OldStyle</DebugInformationFormat> | |||||
</ClCompile> | |||||
<Link> | |||||
<SubSystem>Console</SubSystem> | |||||
<GenerateDebugInformation>DebugFull</GenerateDebugInformation> | |||||
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies> | |||||
</Link> | |||||
</ItemDefinitionGroup> | |||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> | |||||
<ClCompile> | |||||
<WarningLevel>Level3</WarningLevel> | |||||
<FunctionLevelLinking>true</FunctionLevelLinking> | |||||
<IntrinsicFunctions>true</IntrinsicFunctions> | |||||
<SDLCheck>true</SDLCheck> | |||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||||
<ConformanceMode>false</ConformanceMode> | |||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> | |||||
<Optimization>MaxSpeed</Optimization> | |||||
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed> | |||||
<LanguageStandard_C>stdc17</LanguageStandard_C> | |||||
<LanguageStandard>stdcpp17</LanguageStandard> | |||||
<ExceptionHandling>Async</ExceptionHandling> | |||||
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion> | |||||
<BufferSecurityCheck>false</BufferSecurityCheck> | |||||
<DebugInformationFormat>None</DebugInformationFormat> | |||||
</ClCompile> | |||||
<Link> | |||||
<SubSystem>Console</SubSystem> | |||||
<EnableCOMDATFolding>true</EnableCOMDATFolding> | |||||
<OptimizeReferences>true</OptimizeReferences> | |||||
<GenerateDebugInformation>false</GenerateDebugInformation> | |||||
<IgnoreAllDefaultLibraries> | |||||
</IgnoreAllDefaultLibraries> | |||||
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies> | |||||
<AdditionalOptions>/DEBUG:NONE %(AdditionalOptions)</AdditionalOptions> | |||||
</Link> | |||||
</ItemDefinitionGroup> | |||||
<ItemGroup> | |||||
<ClCompile Include="BL3ProxySettings.cpp" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ClInclude Include="include\patternscan.hpp" /> | |||||
<ClInclude Include="SparkClasses.h" /> | |||||
</ItemGroup> | |||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | |||||
<ImportGroup Label="ExtensionTargets"> | |||||
</ImportGroup> | |||||
</Project> |
@@ -0,0 +1,30 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||||
<ItemGroup> | |||||
<Filter Include="Source Files"> | |||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> | |||||
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions> | |||||
</Filter> | |||||
<Filter Include="Header Files"> | |||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier> | |||||
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions> | |||||
</Filter> | |||||
<Filter Include="Resource Files"> | |||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier> | |||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions> | |||||
</Filter> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ClCompile Include="BL3ProxySettings.cpp"> | |||||
<Filter>Source Files</Filter> | |||||
</ClCompile> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ClInclude Include="include\patternscan.hpp"> | |||||
<Filter>Header Files</Filter> | |||||
</ClInclude> | |||||
<ClInclude Include="SparkClasses.h"> | |||||
<Filter>Header Files</Filter> | |||||
</ClInclude> | |||||
</ItemGroup> | |||||
</Project> |
@@ -0,0 +1,13 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> | |||||
<LocalDebuggerCommand>E:\SteamLibrary\steamapps\common\Borderlands 3\OakGame\Binaries\Win64\Borderlands3.exe</LocalDebuggerCommand> | |||||
<LocalDebuggerAttach>true</LocalDebuggerAttach> | |||||
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> | |||||
</PropertyGroup> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> | |||||
<LocalDebuggerCommand>E:\SteamLibrary\steamapps\common\Borderlands 3\OakGame\Binaries\Win64\Borderlands3.exe</LocalDebuggerCommand> | |||||
<LocalDebuggerAttach>true</LocalDebuggerAttach> | |||||
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> | |||||
</PropertyGroup> | |||||
</Project> |
@@ -0,0 +1,249 @@ | |||||
#pragma once | |||||
// Created with ReClass.NET 1.2 by KN4CK3R | |||||
class FSparkInitProcess | |||||
{ | |||||
public: | |||||
void* Something; //0x0008 | |||||
uint32_t N000015F8; //0x0010 | |||||
char pad_0014[84]; //0x0014 | |||||
uint32_t N00001603; //0x0068 | |||||
uint32_t N00001752; //0x006C | |||||
uint32_t N00001604; //0x0070 | |||||
uint32_t N00001754; //0x0074 | |||||
uint32_t N00001605; //0x0078 | |||||
uint32_t N00001756; //0x007C | |||||
uint32_t N00001606; //0x0080 | |||||
uint32_t N00001758; //0x0084 | |||||
uint32_t N00001607; //0x0088 | |||||
uint32_t N0000175A; //0x008C | |||||
wchar_t* UniqueSparkIDW; //0x0090 | |||||
char pad_0098[8]; //0x0098 | |||||
float N0000160A; //0x00A0 | |||||
int32_t N000016CD; //0x00A4 | |||||
int32_t N0000160B; //0x00A8 | |||||
float N000016D6; //0x00AC | |||||
uint32_t N0000160C; //0x00B0 | |||||
float N000016CF; //0x00B4 | |||||
int32_t N0000160D; //0x00B8 | |||||
float N000016C8; //0x00BC | |||||
bool hasBeenRequested; //0x00C0 | |||||
int8_t N00002E86; //0x00C1 | |||||
int8_t N00002E8A; //0x00C2 | |||||
int8_t N00002E90; //0x00C3 | |||||
int8_t InitStep; //0x00C4 | |||||
int8_t N00002E87; //0x00C5 | |||||
int8_t N00002E8D; //0x00C6 | |||||
int8_t N00002E88; //0x00C7 | |||||
uint8_t N00002E78; //0x00C8 | |||||
int8_t N00002E7B; //0x00C9 | |||||
int8_t N00002E79; //0x00CA | |||||
char pad_00CB[1]; //0x00CB | |||||
uint8_t N00002E95; //0x00CC | |||||
uint8_t N00002E98; //0x00CD | |||||
uint8_t N00002E96; //0x00CE | |||||
uint8_t N0000160F; //0x00CF | |||||
uint8_t N00002E7F; //0x00D0 | |||||
char pad_00D1[2]; //0x00D1 | |||||
int32_t N00001729; //0x00D3 | |||||
uint32_t N00001610; //0x00D7 | |||||
char pad_00DB[56]; //0x00DB | |||||
uint32_t N00001775; //0x0113 | |||||
char pad_0117[24]; //0x0117 | |||||
wchar_t* SteamIDW; //0x012F | |||||
uint32_t N0000161C; //0x0137 | |||||
uint32_t N0000172C; //0x013B | |||||
uint32_t N0000161D; //0x013F | |||||
uint32_t N0000172E; //0x0143 | |||||
uint32_t N0000161E; //0x0147 | |||||
uint32_t N00001730; //0x014B | |||||
uint32_t N0000161F; //0x014F | |||||
uint32_t N00001732; //0x0153 | |||||
char pad_0157[12]; //0x0157 | |||||
uint32_t N00001736; //0x0163 | |||||
char pad_0167[8]; //0x0167 | |||||
char* SteamIDA; //0x016F | |||||
char* SteamIDA2; //0x0177 | |||||
char pad_017F[8]; //0x017F | |||||
wchar_t* UniqueSparkIDW2; //0x0187 | |||||
char pad_018F[32]; //0x018F | |||||
uint32_t N0000162B; //0x01AF | |||||
uint32_t N000016E6; //0x01B3 | |||||
char pad_01B7[8]; //0x01B7 | |||||
uint32_t N0000162D; //0x01BF | |||||
uint32_t N000016EA; //0x01C3 | |||||
char* UniqueSparkIDA1; //0x01C7 | |||||
char* UniqueSparkIDA2; //0x01CF | |||||
char pad_01D7[8]; //0x01D7 | |||||
wchar_t* N00001631; //0x01DF | |||||
char pad_01E7[56]; //0x01E7 | |||||
char* N00001639; //0x021F | |||||
char* N0000163A; //0x0227 | |||||
char pad_022F[8]; //0x022F | |||||
wchar_t* N0000163C; //0x0237 | |||||
char pad_023F[56]; //0x023F | |||||
char* N00001644; //0x0277 | |||||
char* N00001645; //0x027F | |||||
char pad_0287[8]; //0x0287 | |||||
wchar_t* N00001647; //0x028F | |||||
char pad_0297[56]; //0x0297 | |||||
char* N0000164F; //0x02CF | |||||
char* N00001650; //0x02D7 | |||||
char pad_02DF[72]; //0x02DF | |||||
void* N0000165A; //0x0327 | |||||
void* N0000165B; //0x032F | |||||
void* N0000165C; //0x0337 | |||||
void* N0000165D; //0x033F | |||||
virtual void Function0(); | |||||
virtual void Function1(); | |||||
virtual void Function2(); | |||||
virtual void Function3(); | |||||
virtual void Function4(); | |||||
virtual void Function5(); | |||||
virtual void Function6(); | |||||
virtual void Function7(); | |||||
virtual void Function8(); | |||||
virtual void Function9(); | |||||
}; //Size: 0x0347 | |||||
class N000016AF | |||||
{ | |||||
public: | |||||
class FSparkInitProcess* FSparkinitProcess; //0x0000 | |||||
char pad_0008[128]; //0x0008 | |||||
}; //Size: 0x0088 | |||||
static_assert(sizeof(N000016AF) == 0x88); | |||||
class FSparkManager | |||||
{ | |||||
public: | |||||
char pad_0008[8]; //0x0008 | |||||
int64_t N00001928; //0x0010 | |||||
void* N00001929; //0x0018 | |||||
int32_t N0000192A; //0x0020 | |||||
int32_t N00001A91; //0x0024 | |||||
int32_t N0000192B; //0x0028 | |||||
int32_t N0000199A; //0x002C | |||||
void* N0000192C; //0x0030 | |||||
int32_t N0000192D; //0x0038 | |||||
int32_t N0000199C; //0x003C | |||||
int32_t N0000192E; //0x0040 | |||||
int32_t N0000199E; //0x0044 | |||||
char pad_0048[8]; //0x0048 | |||||
int32_t N00001930; //0x0050 | |||||
int32_t N00001A8E; //0x0054 | |||||
int32_t N00001931; //0x0058 | |||||
int32_t N000019A2; //0x005C | |||||
char pad_0060[8]; //0x0060 | |||||
int32_t N00001933; //0x0068 | |||||
int32_t N00001A8B; //0x006C | |||||
int32_t N00001934; //0x0070 | |||||
int32_t N000019A5; //0x0074 | |||||
char pad_0078[16]; //0x0078 | |||||
int32_t N00001937; //0x0088 | |||||
int32_t N000019A8; //0x008C | |||||
char pad_0090[8]; //0x0090 | |||||
int32_t N00001939; //0x0098 | |||||
int32_t N00001A82; //0x009C | |||||
int32_t N0000193A; //0x00A0 | |||||
int32_t N000019AB; //0x00A4 | |||||
char pad_00A8[8]; //0x00A8 | |||||
int32_t N0000193C; //0x00B0 | |||||
int32_t N00001A85; //0x00B4 | |||||
int32_t N0000193D; //0x00B8 | |||||
int32_t N000019AE; //0x00BC | |||||
char pad_00C0[8]; //0x00C0 | |||||
int32_t N0000193F; //0x00C8 | |||||
int32_t N00001A7F; //0x00CC | |||||
int32_t N00001940; //0x00D0 | |||||
int32_t N000019B1; //0x00D4 | |||||
char pad_00D8[8]; //0x00D8 | |||||
int32_t N00001942; //0x00E0 | |||||
int32_t N00001A9D; //0x00E4 | |||||
int32_t N00001943; //0x00E8 | |||||
int32_t N000019B4; //0x00EC | |||||
char pad_00F0[8]; //0x00F0 | |||||
int32_t N00001945; //0x00F8 | |||||
int32_t N00001A88; //0x00FC | |||||
int32_t N00001946; //0x0100 | |||||
int32_t N000019B7; //0x0104 | |||||
char pad_0108[8]; //0x0108 | |||||
int32_t N00001948; //0x0110 | |||||
char pad_0114[12]; //0x0114 | |||||
int32_t N0000194A; //0x0120 | |||||
char pad_0124[20]; //0x0124 | |||||
int32_t N0000194D; //0x0138 | |||||
int32_t N000019BA; //0x013C | |||||
char pad_0140[8]; //0x0140 | |||||
int32_t N0000194F; //0x0148 | |||||
int32_t N00001A9A; //0x014C | |||||
int32_t N00001950; //0x0150 | |||||
int32_t N000019BD; //0x0154 | |||||
char pad_0158[8]; //0x0158 | |||||
int32_t N00001952; //0x0160 | |||||
int32_t N000019C0; //0x0164 | |||||
char pad_0168[16]; //0x0168 | |||||
int32_t N00001955; //0x0178 | |||||
int32_t N000019C3; //0x017C | |||||
char pad_0180[8]; //0x0180 | |||||
int32_t N00001957; //0x0188 | |||||
int32_t N000019C6; //0x018C | |||||
char pad_0190[16]; //0x0190 | |||||
wchar_t* N0000195A; //0x01A0 | |||||
int32_t N0000195B; //0x01A8 | |||||
int32_t N00001A73; //0x01AC | |||||
char pad_01B0[208]; //0x01B0 | |||||
class N000016AF* FSparkInitProcessPtr; //0x0280 | |||||
char pad_0288[72]; //0x0288 | |||||
void* SparkTMSThings; //0x02D0 | |||||
void* N00001981; //0x02D8 | |||||
wchar_t* PlatformName; //0x02E0 | |||||
int32_t N00001983; //0x02E8 | |||||
int32_t N00001A29; //0x02EC | |||||
char pad_02F0[32]; //0x02F0 | |||||
wchar_t* N00001988; //0x0310 | |||||
char pad_0318[8]; //0x0318 | |||||
wchar_t* N0000198A; //0x0320 | |||||
char pad_0328[16]; //0x0328 | |||||
wchar_t* GameTitle; //0x0338 | |||||
char pad_0340[24]; //0x0340 | |||||
wchar_t* PlatformName2; //0x0358 | |||||
char pad_0360[40]; //0x0360 | |||||
int32_t N00001997; //0x0388 | |||||
int32_t N00001A78; //0x038C | |||||
int32_t N00001998; //0x0390 | |||||
int32_t N00001A7A; //0x0394 | |||||
virtual void Function0(); | |||||
virtual void SomethingBifrostTick(); | |||||
virtual void SomethingGbxSpark(); | |||||
virtual void Function3(); | |||||
virtual void Function4(); | |||||
virtual void SomethingTMS_FileVersion(); | |||||
virtual void Something_timeoffset(); | |||||
virtual void Something_long(); | |||||
virtual void Something_timestamp(); | |||||
virtual void Function9(); | |||||
virtual void Soemthing_boolean(); | |||||
virtual void Function11(); | |||||
virtual void Function12(); | |||||
virtual void Function13(); | |||||
virtual void Function14(); | |||||
virtual void Something_local_user_id(); | |||||
virtual void Something_string(); | |||||
virtual void Something_matchid(); | |||||
virtual void Something_integer(); | |||||
virtual void Something_timeoffset2(); | |||||
virtual void Something_long2(); | |||||
virtual void Something_timestamp2(); | |||||
virtual void Something_float(); | |||||
virtual void Something_boolean2(); | |||||
virtual void Function24(); | |||||
virtual void Function25(); | |||||
virtual void Function26(); | |||||
virtual void Function27(); | |||||
virtual void Function28(); | |||||
virtual void Function29(); | |||||
}; //Size: 0x0398 | |||||
static_assert(sizeof(FSparkManager) == 0x398); |
@@ -0,0 +1,199 @@ | |||||
/* | |||||
* MinHook - The Minimalistic API Hooking Library for x64/x86 | |||||
* Copyright (C) 2009-2017 Tsuda Kageyu. | |||||
* All rights reserved. | |||||
* | |||||
* Redistribution and use in source and binary forms, with or without | |||||
* modification, are permitted provided that the following conditions | |||||
* are met: | |||||
* | |||||
* 1. Redistributions of source code must retain the above copyright | |||||
* notice, this list of conditions and the following disclaimer. | |||||
* 2. Redistributions in binary form must reproduce the above copyright | |||||
* notice, this list of conditions and the following disclaimer in the | |||||
* documentation and/or other materials provided with the distribution. | |||||
* | |||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | |||||
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A | |||||
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER | |||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||||
*/ | |||||
#pragma once | |||||
#if !(defined _M_IX86) && !(defined _M_X64) && !(defined __i386__) && !(defined __x86_64__) | |||||
#error MinHook supports only x86 and x64 systems. | |||||
#endif | |||||
#include <windows.h> | |||||
// MinHook Error Codes. | |||||
typedef enum MH_STATUS | |||||
{ | |||||
// Unknown error. Should not be returned. | |||||
MH_UNKNOWN = -1, | |||||
// Successful. | |||||
MH_OK = 0, | |||||
// MinHook is already initialized. | |||||
MH_ERROR_ALREADY_INITIALIZED, | |||||
// MinHook is not initialized yet, or already uninitialized. | |||||
MH_ERROR_NOT_INITIALIZED, | |||||
// The hook for the specified target function is already created. | |||||
MH_ERROR_ALREADY_CREATED, | |||||
// The hook for the specified target function is not created yet. | |||||
MH_ERROR_NOT_CREATED, | |||||
// The hook for the specified target function is already enabled. | |||||
MH_ERROR_ENABLED, | |||||
// The hook for the specified target function is not enabled yet, or already | |||||
// disabled. | |||||
MH_ERROR_DISABLED, | |||||
// The specified pointer is invalid. It points the address of non-allocated | |||||
// and/or non-executable region. | |||||
MH_ERROR_NOT_EXECUTABLE, | |||||
// The specified target function cannot be hooked. | |||||
MH_ERROR_UNSUPPORTED_FUNCTION, | |||||
// Failed to allocate memory. | |||||
MH_ERROR_MEMORY_ALLOC, | |||||
// Failed to change the memory protection. | |||||
MH_ERROR_MEMORY_PROTECT, | |||||
// The specified module is not loaded. | |||||
MH_ERROR_MODULE_NOT_FOUND, | |||||
// The specified function is not found. | |||||
MH_ERROR_FUNCTION_NOT_FOUND | |||||
} MH_STATUS; | |||||
// Can be passed as a parameter to MH_EnableHook, MH_DisableHook, | |||||
// MH_QueueEnableHook or MH_QueueDisableHook. | |||||
#define MH_ALL_HOOKS NULL | |||||
#ifdef __cplusplus | |||||
extern "C" | |||||
{ | |||||
#endif | |||||
// Initialize the MinHook library. You must call this function EXACTLY ONCE | |||||
// at the beginning of your program. | |||||
MH_STATUS WINAPI MH_Initialize(VOID); | |||||
// Uninitialize the MinHook library. You must call this function EXACTLY | |||||
// ONCE at the end of your program. | |||||
MH_STATUS WINAPI MH_Uninitialize(VOID); | |||||
// Creates a Hook for the specified target function, in disabled state. | |||||
// Parameters: | |||||
// pTarget [in] A pointer to the target function, which will be | |||||
// overridden by the detour function. | |||||
// pDetour [in] A pointer to the detour function, which will override | |||||
// the target function. | |||||
// ppOriginal [out] A pointer to the trampoline function, which will be | |||||
// used to call the original target function. | |||||
// This parameter can be NULL. | |||||
MH_STATUS WINAPI MH_CreateHook(LPVOID pTarget, LPVOID pDetour, LPVOID *ppOriginal); | |||||
// Creates a Hook for the specified API function, in disabled state. | |||||
// Parameters: | |||||
// pszModule [in] A pointer to the loaded module name which contains the | |||||
// target function. | |||||
// pszTarget [in] A pointer to the target function name, which will be | |||||
// overridden by the detour function. | |||||
// pDetour [in] A pointer to the detour function, which will override | |||||
// the target function. | |||||
// ppOriginal [out] A pointer to the trampoline function, which will be | |||||
// used to call the original target function. | |||||
// This parameter can be NULL. | |||||
MH_STATUS WINAPI MH_CreateHookApi( | |||||
LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal); | |||||
// Creates a Hook for the specified API function, in disabled state. | |||||
// Parameters: | |||||
// pszModule [in] A pointer to the loaded module name which contains the | |||||
// target function. | |||||
// pszTarget [in] A pointer to the target function name, which will be | |||||
// overridden by the detour function. | |||||
// pDetour [in] A pointer to the detour function, which will override | |||||
// the target function. | |||||
// ppOriginal [out] A pointer to the trampoline function, which will be | |||||
// used to call the original target function. | |||||
// This parameter can be NULL. | |||||
// ppTarget [out] A pointer to the target function, which will be used | |||||
// with other functions. | |||||
// This parameter can be NULL. | |||||
MH_STATUS WINAPI MH_CreateHookApiEx( | |||||
LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, LPVOID *ppOriginal, LPVOID *ppTarget); | |||||
// Removes an already created hook. | |||||
// Parameters: | |||||
// pTarget [in] A pointer to the target function. | |||||
MH_STATUS WINAPI MH_RemoveHook(LPVOID pTarget); | |||||
// Enables an already created hook. | |||||
// Parameters: | |||||
// pTarget [in] A pointer to the target function. | |||||
// If this parameter is MH_ALL_HOOKS, all created hooks are | |||||
// enabled in one go. | |||||
MH_STATUS WINAPI MH_EnableHook(LPVOID pTarget); | |||||
// Disables an already created hook. | |||||
// Parameters: | |||||
// pTarget [in] A pointer to the target function. | |||||
// If this parameter is MH_ALL_HOOKS, all created hooks are | |||||
// disabled in one go. | |||||
MH_STATUS WINAPI MH_DisableHook(LPVOID pTarget); | |||||
// Queues to enable an already created hook. | |||||
// Parameters: | |||||
// pTarget [in] A pointer to the target function. | |||||
// If this parameter is MH_ALL_HOOKS, all created hooks are | |||||
// queued to be enabled. | |||||
MH_STATUS WINAPI MH_QueueEnableHook(LPVOID pTarget); | |||||
// Queues to disable an already created hook. | |||||
// Parameters: | |||||
// pTarget [in] A pointer to the target function. | |||||
// If this parameter is MH_ALL_HOOKS, all created hooks are | |||||
// queued to be disabled. | |||||
MH_STATUS WINAPI MH_QueueDisableHook(LPVOID pTarget); | |||||
// Applies all queued changes in one go. | |||||
MH_STATUS WINAPI MH_ApplyQueued(VOID); | |||||
// Translates the MH_STATUS to its name as a string. | |||||
const char *WINAPI MH_StatusToString(MH_STATUS status); | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
template <typename T> | |||||
inline MH_STATUS MH_CreateHookEx(LPVOID pTarget, LPVOID pDetour, T **ppOriginal) | |||||
{ | |||||
return MH_CreateHook(pTarget, pDetour, reinterpret_cast<LPVOID *>(ppOriginal)); | |||||
} | |||||
template <typename T> | |||||
inline MH_STATUS MH_CreateHookApiEx( | |||||
LPCWSTR pszModule, LPCSTR pszProcName, LPVOID pDetour, T **ppOriginal) | |||||
{ | |||||
return MH_CreateHookApi( | |||||
pszModule, pszProcName, pDetour, reinterpret_cast<LPVOID *>(ppOriginal)); | |||||
} |
@@ -0,0 +1,695 @@ | |||||
#ifdef _WIN32 | |||||
#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) | |||||
#define _CRT_SECURE_NO_WARNINGS // _CRT_SECURE_NO_WARNINGS for sscanf errors in MSVC2013 Express | |||||
#endif | |||||
#ifndef WIN32_LEAN_AND_MEAN | |||||
#define WIN32_LEAN_AND_MEAN | |||||
#endif | |||||
#include <fcntl.h> | |||||
#include <WinSock2.h> | |||||
#include <WS2tcpip.h> | |||||
#pragma comment(lib, "ws2_32") | |||||
#include <stdio.h> | |||||
#include <stdlib.h> | |||||
#include <string.h> | |||||
#include <sys/types.h> | |||||
#include <io.h> | |||||
#ifndef _SSIZE_T_DEFINED | |||||
typedef int ssize_t; | |||||
#define _SSIZE_T_DEFINED | |||||
#endif | |||||
#ifndef _SOCKET_T_DEFINED | |||||
typedef SOCKET socket_t; | |||||
#define _SOCKET_T_DEFINED | |||||
#endif | |||||
#ifndef snprintf | |||||
#define snprintf _snprintf_s | |||||
#endif | |||||
#if _MSC_VER >= 1600 | |||||
// vs2010 or later | |||||
#include <stdint.h> | |||||
#else | |||||
typedef __int8 int8_t; | |||||
typedef unsigned __int8 uint8_t; | |||||
typedef __int32 int32_t; | |||||
typedef unsigned __int32 uint32_t; | |||||
typedef __int64 int64_t; | |||||
typedef unsigned __int64 uint64_t; | |||||
#endif | |||||
#define socketerrno WSAGetLastError() | |||||
#define SOCKET_EAGAIN_EINPROGRESS WSAEINPROGRESS | |||||
#define SOCKET_EWOULDBLOCK WSAEWOULDBLOCK | |||||
#else | |||||
#include <fcntl.h> | |||||
#include <netdb.h> | |||||
#include <netinet/in.h> | |||||
#include <netinet/tcp.h> | |||||
#include <stdio.h> | |||||
#include <stdlib.h> | |||||
#include <string.h> | |||||
#include <sys/socket.h> | |||||
#include <sys/time.h> | |||||
#include <sys/types.h> | |||||
#include <unistd.h> | |||||
#include <stdint.h> | |||||
#ifndef _SOCKET_T_DEFINED | |||||
typedef int socket_t; | |||||
#define _SOCKET_T_DEFINED | |||||
#endif | |||||
#ifndef INVALID_SOCKET | |||||
#define INVALID_SOCKET (-1) | |||||
#endif | |||||
#ifndef SOCKET_ERROR | |||||
#define SOCKET_ERROR (-1) | |||||
#endif | |||||
#define closesocket(s) ::close(s) | |||||
#include <errno.h> | |||||
#define socketerrno errno | |||||
#define SOCKET_EAGAIN_EINPROGRESS EAGAIN | |||||
#define SOCKET_EWOULDBLOCK EWOULDBLOCK | |||||
#endif | |||||
#include <vector> | |||||
#include <string> | |||||
#include "easywsclient.hpp" | |||||
using easywsclient::BytesCallback_Imp; | |||||
using easywsclient::Callback_Imp; | |||||
namespace | |||||
{ // private module-only namespace | |||||
socket_t hostname_connect(const std::string &hostname, int port) | |||||
{ | |||||
struct addrinfo hints; | |||||
struct addrinfo *result; | |||||
struct addrinfo *p; | |||||
int ret; | |||||
socket_t sockfd = INVALID_SOCKET; | |||||
char sport[16]; | |||||
memset(&hints, 0, sizeof(hints)); | |||||
hints.ai_family = AF_UNSPEC; | |||||
hints.ai_socktype = SOCK_STREAM; | |||||
snprintf(sport, 16, "%d", port); | |||||
if ((ret = getaddrinfo(hostname.c_str(), sport, &hints, &result)) != 0) | |||||
{ | |||||
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret)); | |||||
return 1; | |||||
} | |||||
for (p = result; p != NULL; p = p->ai_next) | |||||
{ | |||||
sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol); | |||||
if (sockfd == INVALID_SOCKET) | |||||
{ | |||||
continue; | |||||
} | |||||
if (connect(sockfd, p->ai_addr, p->ai_addrlen) != SOCKET_ERROR) | |||||
{ | |||||
break; | |||||
} | |||||
closesocket(sockfd); | |||||
sockfd = INVALID_SOCKET; | |||||
} | |||||
freeaddrinfo(result); | |||||
return sockfd; | |||||
} | |||||
class _DummyWebSocket : public easywsclient::WebSocket | |||||
{ | |||||
public: | |||||
void poll(int timeout) {} | |||||
void send(const std::string &message) {} | |||||
void sendBinary(const std::string &message) {} | |||||
void sendBinary(const std::vector<uint8_t> &message) {} | |||||
void sendPing() {} | |||||
void close() {} | |||||
readyStateValues getReadyState() const { return CLOSED; } | |||||
void _dispatch(Callback_Imp &callable) {} | |||||
void _dispatchBinary(BytesCallback_Imp &callable) {} | |||||
}; | |||||
class _RealWebSocket : public easywsclient::WebSocket | |||||
{ | |||||
public: | |||||
// http://tools.ietf.org/html/rfc6455#section-5.2 Base Framing Protocol | |||||
// | |||||
// 0 1 2 3 | |||||
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 | |||||
// +-+-+-+-+-------+-+-------------+-------------------------------+ | |||||
// |F|R|R|R| opcode|M| Payload len | Extended payload length | | |||||
// |I|S|S|S| (4) |A| (7) | (16/64) | | |||||
// |N|V|V|V| |S| | (if payload len==126/127) | | |||||
// | |1|2|3| |K| | | | |||||
// +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + | |||||
// | Extended payload length continued, if payload len == 127 | | |||||
// + - - - - - - - - - - - - - - - +-------------------------------+ | |||||
// | |Masking-key, if MASK set to 1 | | |||||
// +-------------------------------+-------------------------------+ | |||||
// | Masking-key (continued) | Payload Data | | |||||
// +-------------------------------- - - - - - - - - - - - - - - - + | |||||
// : Payload Data continued ... : | |||||
// + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | |||||
// | Payload Data continued ... | | |||||
// +---------------------------------------------------------------+ | |||||
struct wsheader_type | |||||
{ | |||||
unsigned header_size; | |||||
bool fin; | |||||
bool mask; | |||||
enum opcode_type | |||||
{ | |||||
CONTINUATION = 0x0, | |||||
TEXT_FRAME = 0x1, | |||||
BINARY_FRAME = 0x2, | |||||
CLOSE = 8, | |||||
PING = 9, | |||||
PONG = 0xa, | |||||
} opcode; | |||||
int N0; | |||||
uint64_t N; | |||||
uint8_t masking_key[4]; | |||||
}; | |||||
std::vector<uint8_t> rxbuf; | |||||
std::vector<uint8_t> txbuf; | |||||
std::vector<uint8_t> receivedData; | |||||
socket_t sockfd; | |||||
readyStateValues readyState; | |||||
bool useMask; | |||||
bool isRxBad; | |||||
_RealWebSocket(socket_t sockfd, bool useMask) | |||||
: sockfd(sockfd), readyState(OPEN), useMask(useMask), isRxBad(false) | |||||
{ | |||||
} | |||||
readyStateValues getReadyState() const | |||||
{ | |||||
return readyState; | |||||
} | |||||
void poll(int timeout) | |||||
{ // timeout in milliseconds | |||||
if (readyState == CLOSED) | |||||
{ | |||||
if (timeout > 0) | |||||
{ | |||||
timeval tv = {timeout / 1000, (timeout % 1000) * 1000}; | |||||
select(0, NULL, NULL, NULL, &tv); | |||||
} | |||||
return; | |||||
} | |||||
if (timeout != 0) | |||||
{ | |||||
fd_set rfds; | |||||
fd_set wfds; | |||||
timeval tv = {timeout / 1000, (timeout % 1000) * 1000}; | |||||
FD_ZERO(&rfds); | |||||
FD_ZERO(&wfds); | |||||
FD_SET(sockfd, &rfds); | |||||
if (txbuf.size()) | |||||
{ | |||||
FD_SET(sockfd, &wfds); | |||||
} | |||||
select(sockfd + 1, &rfds, &wfds, 0, timeout > 0 ? &tv : 0); | |||||
} | |||||
while (true) | |||||
{ | |||||
// FD_ISSET(0, &rfds) will be true | |||||
int N = rxbuf.size(); | |||||
ssize_t ret; | |||||
rxbuf.resize(N + 1500); | |||||
ret = recv(sockfd, (char *)&rxbuf[0] + N, 1500, 0); | |||||
if (false) | |||||
{ | |||||
} | |||||
else if (ret < 0 && (socketerrno == SOCKET_EWOULDBLOCK || socketerrno == SOCKET_EAGAIN_EINPROGRESS)) | |||||
{ | |||||
rxbuf.resize(N); | |||||
break; | |||||
} | |||||
else if (ret <= 0) | |||||
{ | |||||
rxbuf.resize(N); | |||||
closesocket(sockfd); | |||||
readyState = CLOSED; | |||||
fputs(ret < 0 ? "Connection error!\n" : "Connection closed!\n", stderr); | |||||
break; | |||||
} | |||||
else | |||||
{ | |||||
rxbuf.resize(N + ret); | |||||
} | |||||
} | |||||
while (txbuf.size()) | |||||
{ | |||||
int ret = ::send(sockfd, (char *)&txbuf[0], txbuf.size(), 0); | |||||
if (false) | |||||
{ | |||||
} // ?? | |||||
else if (ret < 0 && (socketerrno == SOCKET_EWOULDBLOCK || socketerrno == SOCKET_EAGAIN_EINPROGRESS)) | |||||
{ | |||||
break; | |||||
} | |||||
else if (ret <= 0) | |||||
{ | |||||
closesocket(sockfd); | |||||
readyState = CLOSED; | |||||
fputs(ret < 0 ? "Connection error!\n" : "Connection closed!\n", stderr); | |||||
break; | |||||
} | |||||
else | |||||
{ | |||||
txbuf.erase(txbuf.begin(), txbuf.begin() + ret); | |||||
} | |||||
} | |||||
if (!txbuf.size() && readyState == CLOSING) | |||||
{ | |||||
closesocket(sockfd); | |||||
readyState = CLOSED; | |||||
} | |||||
} | |||||
// Callable must have signature: void(const std::string & message). | |||||
// Should work with C functions, C++ functors, and C++11 std::function and | |||||
// lambda: | |||||
//template<class Callable> | |||||
//void dispatch(Callable callable) | |||||
virtual void _dispatch(Callback_Imp &callable) | |||||
{ | |||||
struct CallbackAdapter : public BytesCallback_Imp | |||||
// Adapt void(const std::string<uint8_t>&) to void(const std::string&) | |||||
{ | |||||
Callback_Imp &callable; | |||||
CallbackAdapter(Callback_Imp &callable) : callable(callable) {} | |||||
void operator()(const std::vector<uint8_t> &message) | |||||
{ | |||||
std::string stringMessage(message.begin(), message.end()); | |||||
callable(stringMessage); | |||||
} | |||||
}; | |||||
CallbackAdapter bytesCallback(callable); | |||||
_dispatchBinary(bytesCallback); | |||||
} | |||||
virtual void _dispatchBinary(BytesCallback_Imp &callable) | |||||
{ | |||||
// TODO: consider acquiring a lock on rxbuf... | |||||
if (isRxBad) | |||||
{ | |||||
return; | |||||
} | |||||
while (true) | |||||
{ | |||||
wsheader_type ws; | |||||
if (rxbuf.size() < 2) | |||||
{ | |||||
return; /* Need at least 2 */ | |||||
} | |||||
const uint8_t *data = (uint8_t *)&rxbuf[0]; // peek, but don't consume | |||||
ws.fin = (data[0] & 0x80) == 0x80; | |||||
ws.opcode = (wsheader_type::opcode_type)(data[0] & 0x0f); | |||||
ws.mask = (data[1] & 0x80) == 0x80; | |||||
ws.N0 = (data[1] & 0x7f); | |||||
ws.header_size = 2 + (ws.N0 == 126 ? 2 : 0) + (ws.N0 == 127 ? 8 : 0) + (ws.mask ? 4 : 0); | |||||
if (rxbuf.size() < ws.header_size) | |||||
{ | |||||
return; /* Need: ws.header_size - rxbuf.size() */ | |||||
} | |||||
int i = 0; | |||||
if (ws.N0 < 126) | |||||
{ | |||||
ws.N = ws.N0; | |||||
i = 2; | |||||
} | |||||
else if (ws.N0 == 126) | |||||
{ | |||||
ws.N = 0; | |||||
ws.N |= ((uint64_t)data[2]) << 8; | |||||
ws.N |= ((uint64_t)data[3]) << 0; | |||||
i = 4; | |||||
} | |||||
else if (ws.N0 == 127) | |||||
{ | |||||
ws.N = 0; | |||||
ws.N |= ((uint64_t)data[2]) << 56; | |||||
ws.N |= ((uint64_t)data[3]) << 48; | |||||
ws.N |= ((uint64_t)data[4]) << 40; | |||||
ws.N |= ((uint64_t)data[5]) << 32; | |||||
ws.N |= ((uint64_t)data[6]) << 24; | |||||
ws.N |= ((uint64_t)data[7]) << 16; | |||||
ws.N |= ((uint64_t)data[8]) << 8; | |||||
ws.N |= ((uint64_t)data[9]) << 0; | |||||
i = 10; | |||||
if (ws.N & 0x8000000000000000ull) | |||||
{ | |||||
// https://tools.ietf.org/html/rfc6455 writes the "the most | |||||
// significant bit MUST be 0." | |||||
// | |||||
// We can't drop the frame, because (1) we don't we don't | |||||
// know how much data to skip over to find the next header, | |||||
// and (2) this would be an impractically long length, even | |||||
// if it were valid. So just close() and return immediately | |||||
// for now. | |||||
isRxBad = true; | |||||
fprintf(stderr, "ERROR: Frame has invalid frame length. Closing.\n"); | |||||
close(); | |||||
return; | |||||
} | |||||
} | |||||
if (ws.mask) | |||||
{ | |||||
ws.masking_key[0] = ((uint8_t)data[i + 0]) << 0; | |||||
ws.masking_key[1] = ((uint8_t)data[i + 1]) << 0; | |||||
ws.masking_key[2] = ((uint8_t)data[i + 2]) << 0; | |||||
ws.masking_key[3] = ((uint8_t)data[i + 3]) << 0; | |||||
} | |||||
else | |||||
{ | |||||
ws.masking_key[0] = 0; | |||||
ws.masking_key[1] = 0; | |||||
ws.masking_key[2] = 0; | |||||
ws.masking_key[3] = 0; | |||||
} | |||||
// Note: The checks above should hopefully ensure this addition | |||||
// cannot overflow: | |||||
if (rxbuf.size() < ws.header_size + ws.N) | |||||
{ | |||||
return; /* Need: ws.header_size+ws.N - rxbuf.size() */ | |||||
} | |||||
// We got a whole message, now do something with it: | |||||
if (false) | |||||
{ | |||||
} | |||||
else if ( | |||||
ws.opcode == wsheader_type::TEXT_FRAME || ws.opcode == wsheader_type::BINARY_FRAME || ws.opcode == wsheader_type::CONTINUATION) | |||||
{ | |||||
if (ws.mask) | |||||
{ | |||||
for (size_t i = 0; i != ws.N; ++i) | |||||
{ | |||||
rxbuf[i + ws.header_size] ^= ws.masking_key[i & 0x3]; | |||||
} | |||||
} | |||||
receivedData.insert(receivedData.end(), rxbuf.begin() + ws.header_size, rxbuf.begin() + ws.header_size + (size_t)ws.N); // just feed | |||||
if (ws.fin) | |||||
{ | |||||
callable((const std::vector<uint8_t>)receivedData); | |||||
receivedData.erase(receivedData.begin(), receivedData.end()); | |||||
std::vector<uint8_t>().swap(receivedData); // free memory | |||||
} | |||||
} | |||||
else if (ws.opcode == wsheader_type::PING) | |||||
{ | |||||
if (ws.mask) | |||||
{ | |||||
for (size_t i = 0; i != ws.N; ++i) | |||||
{ | |||||
rxbuf[i + ws.header_size] ^= ws.masking_key[i & 0x3]; | |||||
} | |||||
} | |||||
std::string data(rxbuf.begin() + ws.header_size, rxbuf.begin() + ws.header_size + (size_t)ws.N); | |||||
sendData(wsheader_type::PONG, data.size(), data.begin(), data.end()); | |||||
} | |||||
else if (ws.opcode == wsheader_type::PONG) | |||||
{ | |||||
} | |||||
else if (ws.opcode == wsheader_type::CLOSE) | |||||
{ | |||||
close(); | |||||
} | |||||
else | |||||
{ | |||||
fprintf(stderr, "ERROR: Got unexpected WebSocket message.\n"); | |||||
close(); | |||||
} | |||||
rxbuf.erase(rxbuf.begin(), rxbuf.begin() + ws.header_size + (size_t)ws.N); | |||||
} | |||||
} | |||||
void sendPing() | |||||
{ | |||||
std::string empty; | |||||
sendData(wsheader_type::PING, empty.size(), empty.begin(), empty.end()); | |||||
} | |||||
void send(const std::string &message) | |||||
{ | |||||
sendData(wsheader_type::TEXT_FRAME, message.size(), message.begin(), message.end()); | |||||
} | |||||
void sendBinary(const std::string &message) | |||||
{ | |||||
sendData(wsheader_type::BINARY_FRAME, message.size(), message.begin(), message.end()); | |||||
} | |||||
void sendBinary(const std::vector<uint8_t> &message) | |||||
{ | |||||
sendData(wsheader_type::BINARY_FRAME, message.size(), message.begin(), message.end()); | |||||
} | |||||
template <class Iterator> | |||||
void sendData(wsheader_type::opcode_type type, uint64_t message_size, Iterator message_begin, Iterator message_end) | |||||
{ | |||||
// TODO: | |||||
// Masking key should (must) be derived from a high quality random | |||||
// number generator, to mitigate attacks on non-WebSocket friendly | |||||
// middleware: | |||||
const uint8_t masking_key[4] = {0x12, 0x34, 0x56, 0x78}; | |||||
// TODO: consider acquiring a lock on txbuf... | |||||
if (readyState == CLOSING || readyState == CLOSED) | |||||
{ | |||||
return; | |||||
} | |||||
std::vector<uint8_t> header; | |||||
header.assign(2 + (message_size >= 126 ? 2 : 0) + (message_size >= 65536 ? 6 : 0) + (useMask ? 4 : 0), 0); | |||||
header[0] = 0x80 | type; | |||||
if (false) | |||||
{ | |||||
} | |||||
else if (message_size < 126) | |||||
{ | |||||
header[1] = (message_size & 0xff) | (useMask ? 0x80 : 0); | |||||
if (useMask) | |||||
{ | |||||
header[2] = masking_key[0]; | |||||
header[3] = masking_key[1]; | |||||
header[4] = masking_key[2]; | |||||
header[5] = masking_key[3]; | |||||
} | |||||
} | |||||
else if (message_size < 65536) | |||||
{ | |||||
header[1] = 126 | (useMask ? 0x80 : 0); | |||||
header[2] = (message_size >> 8) & 0xff; | |||||
header[3] = (message_size >> 0) & 0xff; | |||||
if (useMask) | |||||
{ | |||||
header[4] = masking_key[0]; | |||||
header[5] = masking_key[1]; | |||||
header[6] = masking_key[2]; | |||||
header[7] = masking_key[3]; | |||||
} | |||||
} | |||||
else | |||||
{ // TODO: run coverage testing here | |||||
header[1] = 127 | (useMask ? 0x80 : 0); | |||||
header[2] = (message_size >> 56) & 0xff; | |||||
header[3] = (message_size >> 48) & 0xff; | |||||
header[4] = (message_size >> 40) & 0xff; | |||||
header[5] = (message_size >> 32) & 0xff; | |||||
header[6] = (message_size >> 24) & 0xff; | |||||
header[7] = (message_size >> 16) & 0xff; | |||||
header[8] = (message_size >> 8) & 0xff; | |||||
header[9] = (message_size >> 0) & 0xff; | |||||
if (useMask) | |||||
{ | |||||
header[10] = masking_key[0]; | |||||
header[11] = masking_key[1]; | |||||
header[12] = masking_key[2]; | |||||
header[13] = masking_key[3]; | |||||
} | |||||
} | |||||
// N.B. - txbuf will keep growing until it can be transmitted over the socket: | |||||
txbuf.insert(txbuf.end(), header.begin(), header.end()); | |||||
txbuf.insert(txbuf.end(), message_begin, message_end); | |||||
if (useMask) | |||||
{ | |||||
size_t message_offset = txbuf.size() - message_size; | |||||
for (size_t i = 0; i != message_size; ++i) | |||||
{ | |||||
txbuf[message_offset + i] ^= masking_key[i & 0x3]; | |||||
} | |||||
} | |||||
} | |||||
void close() | |||||
{ | |||||
if (readyState == CLOSING || readyState == CLOSED) | |||||
{ | |||||
return; | |||||
} | |||||
readyState = CLOSING; | |||||
uint8_t closeFrame[6] = {0x88, 0x80, 0x00, 0x00, 0x00, 0x00}; // last 4 bytes are a masking key | |||||
std::vector<uint8_t> header(closeFrame, closeFrame + 6); | |||||
txbuf.insert(txbuf.end(), header.begin(), header.end()); | |||||
} | |||||
}; | |||||
easywsclient::WebSocket::pointer from_url(const std::string &url, bool useMask, const std::string &origin, bool internal = false) | |||||
{ | |||||
char host[512]; | |||||
int port; | |||||
char path[512]; | |||||
if (url.size() >= 512) | |||||
{ | |||||
fprintf(stderr, "ERROR: url size limit exceeded: %s\n", url.c_str()); | |||||
return NULL; | |||||
} | |||||
if (origin.size() >= 200) | |||||
{ | |||||
fprintf(stderr, "ERROR: origin size limit exceeded: %s\n", origin.c_str()); | |||||
return NULL; | |||||
} | |||||
if (false) | |||||
{ | |||||
} | |||||
else if (sscanf(url.c_str(), "ws://%[^:/]:%d/%s", host, &port, path) == 3) | |||||
{ | |||||
} | |||||
else if (sscanf(url.c_str(), "ws://%[^:/]/%s", host, path) == 2) | |||||
{ | |||||
port = 80; | |||||
} | |||||
else if (sscanf(url.c_str(), "ws://%[^:/]:%d", host, &port) == 2) | |||||
{ | |||||
path[0] = '\0'; | |||||
} | |||||
else if (sscanf(url.c_str(), "ws://%[^:/]", host) == 1) | |||||
{ | |||||
port = 80; | |||||
path[0] = '\0'; | |||||
} | |||||
else | |||||
{ | |||||
fprintf(stderr, "ERROR: Could not parse WebSocket url: %s\n", url.c_str()); | |||||
return NULL; | |||||
} | |||||
//fprintf(stderr, "easywsclient: connecting: host=%s port=%d path=/%s\n", host, port, path); | |||||
socket_t sockfd = hostname_connect(host, port); | |||||
if (sockfd == INVALID_SOCKET) | |||||
{ | |||||
fprintf(stderr, "Unable to connect to %s:%d\n", host, port); | |||||
return NULL; | |||||
} | |||||
{ | |||||
// XXX: this should be done non-blocking, | |||||
char line[1024]; | |||||
int status; | |||||
int i; | |||||
snprintf(line, 1024, "GET /%s HTTP/1.1\r\n", path); | |||||
::send(sockfd, line, strlen(line), 0); | |||||
if (port == 80) | |||||
{ | |||||
snprintf(line, 1024, "Host: %s\r\n", host); | |||||
::send(sockfd, line, strlen(line), 0); | |||||
} | |||||
else | |||||
{ | |||||
snprintf(line, 1024, "Host: %s:%d\r\n", host, port); | |||||
::send(sockfd, line, strlen(line), 0); | |||||
} | |||||
snprintf(line, 1024, "Upgrade: websocket\r\n"); | |||||
::send(sockfd, line, strlen(line), 0); | |||||
snprintf(line, 1024, "Connection: Upgrade\r\n"); | |||||
::send(sockfd, line, strlen(line), 0); | |||||
if (!origin.empty()) | |||||
{ | |||||
snprintf(line, 1024, "Origin: %s\r\n", origin.c_str()); | |||||
::send(sockfd, line, strlen(line), 0); | |||||
} | |||||
snprintf(line, 1024, "Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==\r\n"); | |||||
::send(sockfd, line, strlen(line), 0); | |||||
if (internal) | |||||
{ | |||||
snprintf(line, 1024, "internal: true\r\n"); | |||||
::send(sockfd, line, strlen(line), 0); | |||||
} | |||||
snprintf(line, 1024, "Sec-WebSocket-Version: 13\r\n"); | |||||
::send(sockfd, line, strlen(line), 0); | |||||
snprintf(line, 1024, "\r\n"); | |||||
::send(sockfd, line, strlen(line), 0); | |||||
for (i = 0; i < 2 || (i < 1023 && line[i - 2] != '\r' && line[i - 1] != '\n'); ++i) | |||||
{ | |||||
if (recv(sockfd, line + i, 1, 0) == 0) | |||||
{ | |||||
return NULL; | |||||
} | |||||
} | |||||
line[i] = 0; | |||||
if (i == 1023) | |||||
{ | |||||
fprintf(stderr, "ERROR: Got invalid status line connecting to: %s\n", url.c_str()); | |||||
return NULL; | |||||
} | |||||
if (sscanf(line, "HTTP/1.1 %d", &status) != 1 || status != 101) | |||||
{ | |||||
fprintf(stderr, "ERROR: Got bad status connecting to %s: %s", url.c_str(), line); | |||||
return NULL; | |||||
} | |||||
// TODO: verify response headers, | |||||
while (true) | |||||
{ | |||||
for (i = 0; i < 2 || (i < 1023 && line[i - 2] != '\r' && line[i - 1] != '\n'); ++i) | |||||
{ | |||||
if (recv(sockfd, line + i, 1, 0) == 0) | |||||
{ | |||||
return NULL; | |||||
} | |||||
} | |||||
if (line[0] == '\r' && line[1] == '\n') | |||||
{ | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
int flag = 1; | |||||
setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(flag)); // Disable Nagle's algorithm | |||||
#ifdef _WIN32 | |||||
u_long on = 1; | |||||
ioctlsocket(sockfd, FIONBIO, &on); | |||||
#else | |||||
fcntl(sockfd, F_SETFL, O_NONBLOCK); | |||||
#endif | |||||
//fprintf(stderr, "Connected to: %s\n", url.c_str()); | |||||
return easywsclient::WebSocket::pointer(new _RealWebSocket(sockfd, useMask)); | |||||
} | |||||
} // end of module-only namespace | |||||
namespace easywsclient | |||||
{ | |||||
WebSocket::pointer WebSocket::create_dummy() | |||||
{ | |||||
static pointer dummy = pointer(new _DummyWebSocket); | |||||
return dummy; | |||||
} | |||||
WebSocket::pointer WebSocket::from_url(const std::string &url, const std::string &origin, bool internal) | |||||
{ | |||||
return ::from_url(url, true, origin, internal); | |||||
} | |||||
WebSocket::pointer WebSocket::from_url_no_mask(const std::string &url, const std::string &origin) | |||||
{ | |||||
return ::from_url(url, false, origin); | |||||
} | |||||
} // namespace easywsclient |
@@ -0,0 +1,89 @@ | |||||
#ifndef EASYWSCLIENT_HPP_20120819_MIOFVASDTNUASZDQPLFD | |||||
#define EASYWSCLIENT_HPP_20120819_MIOFVASDTNUASZDQPLFD | |||||
// This code comes from: | |||||
// https://github.com/dhbaird/easywsclient | |||||
// | |||||
// To get the latest version: | |||||
// wget https://raw.github.com/dhbaird/easywsclient/master/easywsclient.hpp | |||||
// wget https://raw.github.com/dhbaird/easywsclient/master/easywsclient.cpp | |||||
#include <string> | |||||
#include <vector> | |||||
namespace easywsclient | |||||
{ | |||||
struct Callback_Imp | |||||
{ | |||||
virtual void operator()(const std::string &message) = 0; | |||||
}; | |||||
struct BytesCallback_Imp | |||||
{ | |||||
virtual void operator()(const std::vector<uint8_t> &message) = 0; | |||||
}; | |||||
class WebSocket | |||||
{ | |||||
public: | |||||
typedef WebSocket *pointer; | |||||
typedef enum readyStateValues | |||||
{ | |||||
CLOSING, | |||||
CLOSED, | |||||
CONNECTING, | |||||
OPEN | |||||
} readyStateValues; | |||||
// Factories: | |||||
static pointer create_dummy(); | |||||
static pointer from_url(const std::string &url, const std::string &origin = std::string()); | |||||
static pointer from_url(const std::string &url, const std::string &origin = std::string(), bool internal = false); | |||||
static pointer from_url_no_mask(const std::string &url, const std::string &origin = std::string()); | |||||
// Interfaces: | |||||
virtual ~WebSocket() {} | |||||
virtual void poll(int timeout = 0) = 0; // timeout in milliseconds | |||||
virtual void send(const std::string &message) = 0; | |||||
virtual void sendBinary(const std::string &message) = 0; | |||||
virtual void sendBinary(const std::vector<uint8_t> &message) = 0; | |||||
virtual void sendPing() = 0; | |||||
virtual void close() = 0; | |||||
virtual readyStateValues getReadyState() const = 0; | |||||
template <class Callable> | |||||
void dispatch(Callable callable) | |||||
// For callbacks that accept a string argument. | |||||
{ // N.B. this is compatible with both C++11 lambdas, functors and C function pointers | |||||
struct _Callback : public Callback_Imp | |||||
{ | |||||
Callable &callable; | |||||
_Callback(Callable &callable) : callable(callable) {} | |||||
void operator()(const std::string &message) { callable(message); } | |||||
}; | |||||
_Callback callback(callable); | |||||
_dispatch(callback); | |||||
} | |||||
template <class Callable> | |||||
void dispatchBinary(Callable callable) | |||||
// For callbacks that accept a std::vector<uint8_t> argument. | |||||
{ // N.B. this is compatible with both C++11 lambdas, functors and C function pointers | |||||
struct _Callback : public BytesCallback_Imp | |||||
{ | |||||
Callable &callable; | |||||
_Callback(Callable &callable) : callable(callable) {} | |||||
void operator()(const std::vector<uint8_t> &message) { callable(message); } | |||||
}; | |||||
_Callback callback(callable); | |||||
_dispatchBinary(callback); | |||||
} | |||||
protected: | |||||
virtual void _dispatch(Callback_Imp &callable) = 0; | |||||
virtual void _dispatchBinary(BytesCallback_Imp &callable) = 0; | |||||
}; | |||||
} // namespace easywsclient | |||||
#endif /* EASYWSCLIENT_HPP_20120819_MIOFVASDTNUASZDQPLFD */ |
@@ -0,0 +1,655 @@ | |||||
#pragma once | |||||
// #include <istream> | |||||
// #include <fstream> | |||||
// #include <vector> | |||||
#include <string> | |||||
// #include <sstream> | |||||
// #include <Psapi.h> | |||||
// #include <iterator> | |||||
#include <Windows.h> | |||||
// #include <assert.h> | |||||
// #include <iostream> | |||||
// #include <algorithm> | |||||
#include <Psapi.h> | |||||
// enum EPagePermissions | |||||
// { | |||||
// Execute = PAGE_EXECUTE, | |||||
// ExecuteRead = PAGE_EXECUTE_READ, | |||||
// ExecuteReadWrite = PAGE_EXECUTE_READWRITE, | |||||
// ExecuteWriteCopy = PAGE_EXECUTE_WRITECOPY, | |||||
// Read = PAGE_READONLY, | |||||
// ReadWrite = PAGE_READWRITE, | |||||
// WriteCopy = PAGE_WRITECOPY, | |||||
// WriteCombine = PAGE_WRITECOMBINE | |||||
// }; | |||||
// struct PatternInfo | |||||
// { | |||||
// const char *Pattern; | |||||
// EPagePermissions Permissions; | |||||
// }; | |||||
namespace PatternScan | |||||
{ | |||||
// struct PatternByte | |||||
// { | |||||
// struct PatternNibble | |||||
// { | |||||
// unsigned char data; | |||||
// bool wildcard; | |||||
// } nibble[2]; | |||||
// }; | |||||
// static std::string formathexpattern(std::string patterntext) | |||||
// { | |||||
// std::string result; | |||||
// int len = patterntext.length(); | |||||
// for (int i = 0; i < len; i++) | |||||
// if (patterntext[i] == '?' || isxdigit(patterntext[i])) | |||||
// result += toupper(patterntext[i]); | |||||
// return result; | |||||
// } | |||||
// static int hexchtoint(char ch) | |||||
// { | |||||
// if (ch >= '0' && ch <= '9') | |||||
// return ch - '0'; | |||||
// else if (ch >= 'A' && ch <= 'F') | |||||
// return ch - 'A' + 10; | |||||
// else if (ch >= 'a' && ch <= 'f') | |||||
// return ch - 'a' + 10; | |||||
// return 0; | |||||
// } | |||||
// static bool patterntransform(std::string patterntext, std::vector<PatternByte> &pattern) | |||||
// { | |||||
// pattern.clear(); | |||||
// patterntext = formathexpattern(patterntext); | |||||
// int len = patterntext.length(); | |||||
// if (!len) | |||||
// return false; | |||||
// if (len % 2) //not a multiple of 2 | |||||
// { | |||||
// patterntext += '?'; | |||||
// len++; | |||||
// } | |||||
// PatternByte newByte; | |||||
// for (int i = 0, j = 0; i < len; i++) | |||||
// { | |||||
// if (patterntext[i] == '?') //wildcard | |||||
// { | |||||
// newByte.nibble[j].wildcard = true; //match anything | |||||
// } | |||||
// else //hex | |||||
// { | |||||
// newByte.nibble[j].wildcard = false; | |||||
// newByte.nibble[j].data = hexchtoint(patterntext[i]) & 0xF; | |||||
// } | |||||
// j++; | |||||
// if (j == 2) //two nibbles = one byte | |||||
// { | |||||
// j = 0; | |||||
// pattern.push_back(newByte); | |||||
// } | |||||
// } | |||||
// return true; | |||||
// } | |||||
// static bool patternmatchbyte(unsigned char byte, const PatternByte &pbyte) | |||||
// { | |||||
// int matched = 0; | |||||
// unsigned char n1 = (byte >> 4) & 0xF; | |||||
// if (pbyte.nibble[0].wildcard) | |||||
// matched++; | |||||
// else if (pbyte.nibble[0].data == n1) | |||||
// matched++; | |||||
// unsigned char n2 = byte & 0xF; | |||||
// if (pbyte.nibble[1].wildcard) | |||||
// matched++; | |||||
// else if (pbyte.nibble[1].data == n2) | |||||
// matched++; | |||||
// return (matched == 2); | |||||
// } | |||||
// size_t patternfind(std::string pattern, int offset) | |||||
// { | |||||
// std::vector<PatternByte> searchpattern; | |||||
// std::string::iterator end_pos = std::remove(pattern.begin(), pattern.end(), ' '); | |||||
// pattern.erase(end_pos, pattern.end()); | |||||
// SYSTEM_INFO sysinf; | |||||
// GetSystemInfo(&sysinf); | |||||
// DWORD startAddress = (DWORD)sysinf.lpMinimumApplicationAddress; | |||||
// unsigned char *data = (unsigned char *)startAddress; | |||||
// //MEMORY_BASIC_INFORMATION mbi; | |||||
// if (!patterntransform(pattern.c_str(), searchpattern)) | |||||
// return (size_t)-1; | |||||
// //#define MEMORY_READABLE (PAGE_READONLY | PAGE_READWRITE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE) | |||||
// //#define MEMORY_WRITABLE (PAGE_READWRITE | PAGE_EXECUTE_READWRITE) | |||||
// //#define MEMORY_EXECUTABLE (PAGE_EXECUTE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE) | |||||
// size_t searchpatternsize = searchpattern.size(); | |||||
// for (size_t i = 0, pos = 0; i < 0x7FFFFFFF; i++) //search for the pattern | |||||
// { | |||||
// //if (VirtualQuery((LPVOID)i, &mbi, sizeof(MEMORY_BASIC_INFORMATION)) != 0 | |||||
// // && ((mbi.State != MEM_COMMIT) || !(mbi.Protect & MEMORY_READABLE) || (mbi.Protect & PAGE_GUARD))) | |||||
// // //&& mbi.State == MEM_COMMIT && mbi.Protect != PAGE_NOACCESS && !(mbi.Protect & PAGE_GUARD)) | |||||
// //{ | |||||
// if (patternmatchbyte(data[i], searchpattern.at(pos))) //check if our pattern matches the current byte | |||||
// { | |||||
// pos++; | |||||
// if (pos == searchpatternsize) //everything matched | |||||
// { | |||||
// if (offset >= 0) | |||||
// return startAddress + i - searchpatternsize + 1 + offset; | |||||
// if (offset < 0) | |||||
// return startAddress + i - searchpatternsize + 1 - offset; | |||||
// } | |||||
// } | |||||
// else if (pos > 0) //fix by Computer_Angel | |||||
// { | |||||
// i -= pos; | |||||
// pos = 0; //reset current pattern position | |||||
// } | |||||
// /*} | |||||
// else | |||||
// i += mbi.RegionSize;*/ | |||||
// } | |||||
// return (size_t)-1; | |||||
// } | |||||
// // Find all occurences of the Pattern until a wildcard is hit | |||||
// std::vector<uintptr_t> FindAllOccurences(std::vector<char *> pattern, std::vector<char> streamToSearch) | |||||
// { | |||||
// std::vector<uintptr_t> positions; | |||||
// // Length of the pattern to look for | |||||
// unsigned int patternLength = pattern.size(); | |||||
// // Total length of file to look through | |||||
// unsigned int totalLength = streamToSearch.size(); | |||||
// // First Byte of the pattern to look for | |||||
// //unsigned char* firstMatchByte; | |||||
// auto firstMatchByte = std::strtol(reinterpret_cast<const char *>(pattern[0]), nullptr, 16); | |||||
// std::vector<unsigned char> parsedPattern; | |||||
// parsedPattern.reserve(pattern.size()); | |||||
// for (auto &pat : pattern) | |||||
// { | |||||
// parsedPattern.push_back((unsigned char)std::strtoul(reinterpret_cast<const char *>(pat), nullptr, 16)); | |||||
// } | |||||
// for (unsigned int i = 0; i < totalLength; i++) | |||||
// { | |||||
// //auto cmp = (unsigned char)streamToSearch[i]; | |||||
// //auto cmp2 = (unsigned char)firstMatchByte; | |||||
// //auto cmp2 = std::strtol(reinterpret_cast<const char*>(streamToSearch.data()[i]), nullptr, 16); | |||||
// //auto second = streamToSearch; | |||||
// //memcpy(&firstMatchByte, streamToSearch[i], sizeof (unsigned char*)); | |||||
// // If the first Byte of the Searchpattern is at the current location of i | |||||
// // and the totalLength - i is greater or equal to the pattern length | |||||
// //if(i == 0x00000000000dca41) | |||||
// //{ | |||||
// //Q_ASSERT(false); | |||||
// //} | |||||
// if ((unsigned char)streamToSearch[i] == firstMatchByte && totalLength - i >= patternLength) | |||||
// //if (pattern.data()[0] == *(streamToSearch.begin() +i) && totalLength - i >= patternLength) | |||||
// { | |||||
// std::vector<unsigned char> match; //[patternLength]; | |||||
// match.resize(patternLength); | |||||
// memcpy(&match[0], &streamToSearch[i], patternLength); | |||||
// // If the current range of the search matches the searchPattern | |||||
// // add the current position(i) to the positionList and break | |||||
// if (memcmp(match.data(), parsedPattern.data(), patternLength) == 0) | |||||
// { | |||||
// positions.push_back(static_cast<uintptr_t>(i)); | |||||
// } | |||||
// else | |||||
// { | |||||
// memset(&match, 0, patternLength); | |||||
// } | |||||
// } | |||||
// } | |||||
// return positions; | |||||
// } | |||||
// // Find all occurences of the Pattern until a wildcard is hit | |||||
// std::vector<uintptr_t> FindAllOccurences(std::vector<char *> pattern, uintptr_t startAddress, uintptr_t totalSize = 0x7FFFFFFF) | |||||
// { | |||||
// std::vector<uintptr_t> positions; | |||||
// // Length of the pattern to look for | |||||
// unsigned int patternLength = pattern.size(); | |||||
// // Total length of file to look through | |||||
// unsigned int totalLength = totalSize - startAddress; | |||||
// // First Byte of the pattern to look for | |||||
// //unsigned char* firstMatchByte; | |||||
// auto firstMatchByte = std::strtol(reinterpret_cast<const char *>(pattern[0]), nullptr, 16); | |||||
// std::vector<unsigned char> parsedPattern; | |||||
// parsedPattern.reserve(pattern.size()); | |||||
// for (auto &pat : pattern) | |||||
// { | |||||
// parsedPattern.push_back((unsigned char)std::strtol(reinterpret_cast<const char *>(pat), nullptr, 16)); | |||||
// } | |||||
// for (unsigned int i = 0; i < totalLength; i++) | |||||
// { | |||||
// if ((*(PBYTE)startAddress + i) == firstMatchByte && totalLength - i >= patternLength) | |||||
// { | |||||
// std::vector<unsigned char> match; //[patternLength]; | |||||
// match.resize(patternLength); | |||||
// memcpy(&match[0], (LPVOID)(*(PBYTE)startAddress + i), patternLength); | |||||
// // If the current range of the search matches the searchPattern | |||||
// // add the current position(i) to the positionList and break | |||||
// if (memcmp(match.data(), parsedPattern.data(), patternLength) == 0) | |||||
// { | |||||
// positions.push_back(static_cast<uintptr_t>(i)); | |||||
// } | |||||
// else | |||||
// { | |||||
// memset(&match, 0, patternLength); | |||||
// } | |||||
// } | |||||
// } | |||||
// return positions; | |||||
// } | |||||
// // Search the given Pattern iconst n the given& char-vector | |||||
// uintptr_t SearchBytePattern(const std::string &pattern, std::vector<char> streamToSearch, int offset) | |||||
// { | |||||
// std::istringstream buf(pattern); | |||||
// std::istream_iterator<std::string> beg(buf), end; | |||||
// std::vector<std::string> tokens(beg, end); | |||||
// std::vector<char *> patternArray; | |||||
// patternArray.reserve(tokens.size()); | |||||
// for (auto &data : tokens) | |||||
// { | |||||
// patternArray.push_back(_strdup(data.c_str())); | |||||
// } | |||||
// std::vector<char *> temp; | |||||
// for (unsigned int i = 0; i < tokens.size(); i++) | |||||
// { | |||||
// // Using QString for the "startsWith function | |||||
// // auto value = QString(patternArray[i]); | |||||
// // if(!value.startsWith('?', Qt::CaseInsensitive)) | |||||
// auto value = std::string(patternArray[i]); | |||||
// if (!_strnicmp(value.c_str(), "?", sizeof("?"))) | |||||
// { | |||||
// temp.push_back(patternArray[i]); | |||||
// } | |||||
// else | |||||
// break; | |||||
// } | |||||
// auto occurences = FindAllOccurences(temp, streamToSearch); | |||||
// std::vector<unsigned char> parsedPattern; | |||||
// parsedPattern.reserve(patternArray.size()); | |||||
// for (auto &pat : patternArray) | |||||
// { | |||||
// parsedPattern.push_back((unsigned char)std::strtol(reinterpret_cast<const char *>(pat), nullptr, 16)); | |||||
// } | |||||
// std::vector<char> check(patternArray.size()); | |||||
// for (auto &occ : occurences) | |||||
// { | |||||
// memset(check.data(), 0, patternArray.size()); | |||||
// memcpy(check.data(), &streamToSearch[occ], patternArray.size()); | |||||
// for (unsigned int o = 0; o < patternArray.size(); o++) | |||||
// { | |||||
// // If the current Patterncharacter is a wildcard, go to next index | |||||
// if (isalnum(*patternArray[o]) == 0) // == 0 || isalpha(*patternArray[0]) == 0) | |||||
// continue; | |||||
// // Convert current Patternindex | |||||
// char pat = (char)std::stoul(std::string(patternArray[o]), nullptr, 16); | |||||
// // Compare memory, if equal, result is 0 | |||||
// int mem = memcmp(&check[o], &pat, 1); | |||||
// // If memory is not equal, the pattern doesn't match | |||||
// if (mem != 0) | |||||
// { | |||||
// break; | |||||
// } | |||||
// // o can only be the size of the pattern if it matches | |||||
// if (o == patternArray.size() - 1) | |||||
// { | |||||
// if (offset < 0) | |||||
// return occ - offset; | |||||
// if (offset > 0) | |||||
// return occ + offset; | |||||
// return occ; | |||||
// } | |||||
// } | |||||
// } | |||||
// // No result found | |||||
// return 0; | |||||
// } | |||||
// uintptr_t SearchBytePattern(uintptr_t startAddress, uintptr_t fileSize, const std::string &pattern, int offset) | |||||
// { | |||||
// MODULEINFO miInfos = {NULL}; | |||||
// HMODULE hmModule = GetModuleHandle(NULL); | |||||
// if (hmModule) | |||||
// { | |||||
// GetModuleInformation(GetCurrentProcess(), hmModule, &miInfos, sizeof(MODULEINFO)); | |||||
// } | |||||
// std::istringstream buf(pattern); | |||||
// std::istream_iterator<std::string> beg(buf), end; | |||||
// std::vector<std::string> tokens(beg, end); | |||||
// std::vector<char *> patternArray; | |||||
// patternArray.reserve(tokens.size()); | |||||
// for (auto &data : tokens) | |||||
// { | |||||
// patternArray.push_back(_strdup(data.c_str())); | |||||
// } | |||||
// std::vector<char *> temp; | |||||
// for (unsigned int i = 0; i < tokens.size(); i++) | |||||
// { | |||||
// // Using QString for the "startsWith function | |||||
// auto value = std::string(patternArray[i]); | |||||
// if (_strnicmp(value.c_str(), "?", sizeof("?"))) | |||||
// { | |||||
// temp.push_back(patternArray[i]); | |||||
// } | |||||
// else | |||||
// break; | |||||
// } | |||||
// auto occurences = FindAllOccurences(temp, startAddress); | |||||
// std::vector<unsigned char> parsedPattern; | |||||
// parsedPattern.reserve(patternArray.size()); | |||||
// for (auto &pat : patternArray) | |||||
// { | |||||
// parsedPattern.push_back((unsigned char)std::strtol(reinterpret_cast<const char *>(pat), nullptr, 16)); | |||||
// } | |||||
// std::vector<char> check(patternArray.size()); | |||||
// for (auto &occ : occurences) | |||||
// { | |||||
// memset(check.data(), 0, patternArray.size()); | |||||
// memcpy(check.data(), (LPVOID)(startAddress + occ), patternArray.size()); | |||||
// for (unsigned int o = 0; o < patternArray.size(); o++) | |||||
// { | |||||
// // If the current Patterncharacter is a wildcard, go to next index | |||||
// if (isalnum(*patternArray[o]) == 0) // == 0 || isalpha(*patternArray[0]) == 0) | |||||
// continue; | |||||
// // Convert current Patternindex | |||||
// char pat = (char)std::stoul(std::string(patternArray[o]), nullptr, 16); | |||||
// // Compare memory, if equal, result is 0 | |||||
// int mem = memcmp(&check[o], &pat, 1); | |||||
// // If memory is not equal, the pattern doesn't match | |||||
// if (mem != 0) | |||||
// { | |||||
// break; | |||||
// } | |||||
// // o can only be the size of the pattern if it matches | |||||
// if (o == patternArray.size() - 1) | |||||
// { | |||||
// if (offset < 0) | |||||
// return occ - offset; | |||||
// if (offset > 0) | |||||
// return occ + offset; | |||||
// return occ; | |||||
// } | |||||
// } | |||||
// } | |||||
// // No result found | |||||
// return 0; | |||||
// } | |||||
// /** | |||||
// * \brief Returns first occurrence of byte pattern in a module | |||||
// * \param module Base address of module | |||||
// * \param signature IDA-style byte pattern | |||||
// * \return Pointer to first occurrence | |||||
// * \see CSGOSimple by MarkHC | |||||
// */ | |||||
// inline std::uint8_t *patternScan(void *module, std::string signature) | |||||
// { | |||||
// static auto pattern_to_byte = [](const char *pattern) { | |||||
// auto bytes = std::vector<int>{}; | |||||
// auto start = const_cast<char *>(pattern); | |||||
// auto end = const_cast<char *>(pattern) + strlen(pattern); | |||||
// for (auto current = start; current < end; ++current) | |||||
// { | |||||
// if (*current == '??') | |||||
// { | |||||
// ++current; | |||||
// if (*current == '??') | |||||
// ++current; | |||||
// bytes.push_back(-1); | |||||
// } | |||||
// else | |||||
// bytes.push_back(strtoul(current, ¤t, 16)); | |||||
// } | |||||
// return bytes; | |||||
// }; | |||||
// auto dosHeader = (PIMAGE_DOS_HEADER)module; | |||||
// auto ntHeaders = (PIMAGE_NT_HEADERS)((std::uint8_t *)module + dosHeader->e_lfanew); | |||||
// auto sizeOfImage = ntHeaders->OptionalHeader.SizeOfImage; | |||||
// auto patternBytes = pattern_to_byte(signature.c_str()); | |||||
// auto scanBytes = reinterpret_cast<std::uint8_t *>(module); | |||||
// auto s = patternBytes.size(); | |||||
// auto d = patternBytes.data(); | |||||
// for (auto i = 0ul; i < sizeOfImage - s; ++i) | |||||
// { | |||||
// bool found = true; | |||||
// for (auto j = 0ul; j < s; ++j) | |||||
// { | |||||
// if (scanBytes[i + j] != d[j] && d[j] != -1) | |||||
// { | |||||
// found = false; | |||||
// break; | |||||
// } | |||||
// } | |||||
// if (found) | |||||
// return &scanBytes[i]; | |||||
// } | |||||
// return nullptr; | |||||
// } | |||||
// static std::vector<unsigned char> ParseSignature(std::string &pattern) | |||||
// { | |||||
// std::vector<unsigned char> bytes; | |||||
// for (unsigned int i = 0; i < pattern.length(); i += 2) | |||||
// { | |||||
// std::string byteString = pattern.substr(i, 2); | |||||
// char byte = (char)strtol(byteString.c_str(), NULL, 16); | |||||
// bytes.push_back(byte); | |||||
// } | |||||
// return bytes; | |||||
// } | |||||
// static DWORD FindMySignature(const char *szModule, std::string szSignature, int offset) | |||||
// { | |||||
// /*AllocConsole(); | |||||
// freopen("CONIN$", "r", stdin); | |||||
// freopen("CONOUT$", "w", stdout); | |||||
// freopen("CONOUT$", "w", stderr);*/ | |||||
// MODULEINFO modInfo; | |||||
// GetModuleInformation(GetCurrentProcess(), GetModuleHandleA(szModule), &modInfo, sizeof(MODULEINFO)); | |||||
// DWORD startAddress = (DWORD)modInfo.lpBaseOfDll; | |||||
// DWORD endAddress = startAddress + modInfo.SizeOfImage; | |||||
// std::string pattern = szSignature; | |||||
// std::string::iterator end_pos = std::remove(szSignature.begin(), szSignature.end(), ' '); | |||||
// szSignature.erase(end_pos, szSignature.end()); | |||||
// //const char* pat = szSignature.c_str(); | |||||
// auto pat = ParseSignature(szSignature); | |||||
// DWORD firstMatch = 0; | |||||
// //std::vector<char> check(sizeof(szSignature)); | |||||
// //auto firstMatchByte = std::strtol(&pat[0], nullptr, 16); | |||||
// auto firstMatchByte = (int)pat[0]; | |||||
// std::cout << std::hex << (int)*(unsigned char *)startAddress << '\n'; | |||||
// std::cout << "Pattern to search for: " << szSignature << '\n'; | |||||
// std::cout << "Length of Pattern: " << szSignature.length() << '\n'; | |||||
// std::cout << "FirstMatchByte: " << std::hex << firstMatchByte << '\n'; | |||||
// SYSTEM_INFO sysinf; | |||||
// GetSystemInfo(&sysinf); | |||||
// MEMORY_BASIC_INFORMATION mbi; | |||||
// //startAddress += 0x4F318C; | |||||
// /*for (int i = 0; i < pat.size(); i++) | |||||
// std::cout << (int)pat[i];*/ | |||||
// for (DWORD pCur = startAddress; pCur < 0x7FFFFFFF; pCur++) | |||||
// { | |||||
// if (VirtualQuery((LPVOID)pCur, &mbi, sizeof(MEMORY_BASIC_INFORMATION)) != 0 | |||||
// //&& ((mBI.State != MEM_COMMIT) || !(mBI.Protect & MEMORY_READABLE) || (mBI.Protect & PAGE_GUARD))) | |||||
// && mbi.State == MEM_COMMIT && mbi.Protect != PAGE_NOACCESS && !(mbi.Protect & PAGE_GUARD)) | |||||
// { | |||||
// //CREDITS: learn_more | |||||
// #define INRANGE(x, a, b) (x >= a && x <= b) | |||||
// #define getBits(x) (INRANGE((x & (~0x20)), 'A', 'F') ? ((x & (~0x20)) - 'A' + 0xa) : (INRANGE(x, '0', '9') ? x - '0' : 0)) | |||||
// #define getByte(x) (getBits(x[0]) << 4 | getBits(x[1])) | |||||
// const char *patt = pattern.c_str(); | |||||
// if (!*patt) | |||||
// return firstMatch; | |||||
// if (*(PBYTE)patt == '\?' || *(BYTE *)pCur == getByte(patt)) | |||||
// { | |||||
// if (!firstMatch) | |||||
// firstMatch = pCur; | |||||
// if (!patt[2]) | |||||
// return firstMatch; | |||||
// if (*(PWORD)patt == '\?\?' || *(PBYTE)patt != '\?') | |||||
// patt += 3; | |||||
// else | |||||
// patt += 2; //one ? | |||||
// } | |||||
// else | |||||
// { | |||||
// patt = szSignature.c_str(); | |||||
// firstMatch = 0; | |||||
// } | |||||
// if ((int)*(unsigned char *)pCur == (int)firstMatchByte && endAddress - pCur >= szSignature.length()) | |||||
// { | |||||
// //if (pattern.data()[0] == *(streamToSearch.begin() +i) && totalLength - i >= patternLength) | |||||
// for (unsigned int o = 0; o < pat.size(); o++) | |||||
// { | |||||
// // If the current Patterncharacter is a wildcard, go to next index | |||||
// //if (isalnum(szSignature[o]) == 0)// == 0 || isalpha(*patternArray[0]) == 0) | |||||
// if (pat[o] == strtol("??", 0, 16)) | |||||
// { | |||||
// //std::cout << "Current Patternindex is a wildcard: " << pat[o] << '\n'; | |||||
// continue; | |||||
// } | |||||
// auto currentPat = (int)pat[o]; | |||||
// /*std::cout << '\n\n'; | |||||
// std::cout << "Startaddress: 0x" << std::hex << (DWORD)modInfo.lpBaseOfDll << '\n'; | |||||
// std::cout << "Currentaddress: 0x" << std::hex << pCur + o << '\n'; | |||||
// std::cout << "Current Byte is: " << std::hex << (int)*(unsigned char*)(pCur + o) << '\n'; | |||||
// std::cout << "Current Pattern is: " << std::hex << currentPat << '\n'; | |||||
// std::cout << '\n';*/ | |||||
// if ((int)*(unsigned char *)(pCur + o) != currentPat) | |||||
// { | |||||
// //std::cout << "Cur Val: 0x" << std::hex << (int)*(unsigned char*)(pCur + o) << " Pattern: 0x" << std::hex << currentPat << '\n'; | |||||
// break; | |||||
// } | |||||
// // o can only be the size of the pattern if it matches | |||||
// if (o == pat.size() - 1) | |||||
// { | |||||
// if (offset < 0) | |||||
// return pCur - offset; | |||||
// if (offset > 0) | |||||
// return pCur + offset; | |||||
// return pCur; | |||||
// } | |||||
// } | |||||
// } | |||||
// } | |||||
// else | |||||
// pCur += mbi.RegionSize; | |||||
// } | |||||
// return NULL; | |||||
// } | |||||
static uintptr_t FindSignature(const char *szModule, const char *szSignature) | |||||
{ | |||||
//CREDITS: learn_more | |||||
#define INRANGE(x, a, b) (x >= a && x <= b) | |||||
#define getBits(x) (INRANGE((x & (~0x20)), 'A', 'F') ? ((x & (~0x20)) - 'A' + 0xa) : (INRANGE(x, '0', '9') ? x - '0' : 0)) | |||||
#define getByte(x) (getBits(x[0]) << 4 | getBits(x[1])) | |||||
MODULEINFO modInfo; | |||||
GetModuleInformation(GetCurrentProcess(), GetModuleHandleA(szModule), &modInfo, sizeof(MODULEINFO)); | |||||
uintptr_t startAddress = (uintptr_t)modInfo.lpBaseOfDll; | |||||
uintptr_t endAddress = startAddress + modInfo.SizeOfImage; | |||||
const char *pat = szSignature; | |||||
uintptr_t firstMatch = 0; | |||||
for (uintptr_t pCur = startAddress; pCur < endAddress; pCur++) | |||||
{ | |||||
if (!*pat) | |||||
return firstMatch; | |||||
if (*(PBYTE)pat == '\?' || *(BYTE *)pCur == getByte(pat)) | |||||
{ | |||||
if (!firstMatch) | |||||
firstMatch = pCur; | |||||
if (!pat[2]) | |||||
return firstMatch; | |||||
if (*(PWORD)pat == '\?\?' || *(PBYTE)pat != '\?') | |||||
//if (*(PWORD)pat == '\?' || *(PBYTE)pat != '\?') | |||||
pat += 3; | |||||
else | |||||
pat += 2; //one ? | |||||
} | |||||
else | |||||
{ | |||||
pat = szSignature; | |||||
firstMatch = 0; | |||||
} | |||||
} | |||||
return 0; | |||||
} | |||||
} // namespace PatternScan |
@@ -0,0 +1,11 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<Project> | |||||
<ProjectOutputs> | |||||
<ProjectOutput> | |||||
<FullPath>F:\Programmieren\C++\BL3\BL3ProxySettings\x64\Debug\BL3ProxySettings.dll</FullPath> | |||||
</ProjectOutput> | |||||
</ProjectOutputs> | |||||
<ContentFiles /> | |||||
<SatelliteDlls /> | |||||
<NonRecipeFileRefs /> | |||||
</Project> |
@@ -0,0 +1,42 @@ | |||||
cl : command line warning D9025: overriding '/sdl' with '/GS-' | |||||
BL3ProxySettings.cpp | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(98,29): warning C4477: 'fprintf' : format string '%s' requires an argument of type 'char *', but variadic argument 1 has type 'WCHAR *' | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(98,29): message : consider using '%ls' in the format string | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(98,29): message : consider using '%lls' in the format string | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(98,29): message : consider using '%Ls' in the format string | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(98,29): message : consider using '%ws' in the format string | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(108,16): warning C4267: 'argument': conversion from 'size_t' to 'int', possible loss of data | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(217,31): warning C4244: 'argument': conversion from 'socket_t' to 'int', possible loss of data | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(222,1): warning C4267: 'initializing': conversion from 'size_t' to 'int', possible loss of data | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(249,1): warning C4267: 'argument': conversion from 'size_t' to 'int', possible loss of data | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(597,49): warning C4267: 'argument': conversion from 'size_t' to 'int', possible loss of data | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(601,53): warning C4267: 'argument': conversion from 'size_t' to 'int', possible loss of data | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(606,53): warning C4267: 'argument': conversion from 'size_t' to 'int', possible loss of data | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(609,49): warning C4267: 'argument': conversion from 'size_t' to 'int', possible loss of data | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(611,49): warning C4267: 'argument': conversion from 'size_t' to 'int', possible loss of data | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(615,53): warning C4267: 'argument': conversion from 'size_t' to 'int', possible loss of data | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(618,49): warning C4267: 'argument': conversion from 'size_t' to 'int', possible loss of data | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(622,53): warning C4267: 'argument': conversion from 'size_t' to 'int', possible loss of data | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(625,49): warning C4267: 'argument': conversion from 'size_t' to 'int', possible loss of data | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(627,49): warning C4267: 'argument': conversion from 'size_t' to 'int', possible loss of data | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(563,18): warning C4996: 'sscanf': This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(566,18): warning C4996: 'sscanf': This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(570,18): warning C4996: 'sscanf': This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(574,18): warning C4996: 'sscanf': This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\include\easywsclient.cpp(641,17): warning C4996: 'sscanf': This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\BL3ProxySettings.cpp(188,2): warning C4091: 'typedef ': ignored on left of '<unnamed-enum-CURLOPT_URL>' when no variable is declared | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\BL3ProxySettings.cpp(194,2): warning C4091: 'typedef ': ignored on left of '<unnamed-enum-CURLE_OK>' when no variable is declared | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\BL3ProxySettings.cpp(570,35): warning C4099: 'TArray<FNewsItem>': type name first seen using 'struct' now seen using 'class' | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\BL3ProxySettings.cpp(570): message : see declaration of 'TArray<FNewsItem>' | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\BL3ProxySettings.cpp(633,26): warning C4099: 'FString': type name first seen using 'struct' now seen using 'class' | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\BL3ProxySettings.cpp(472): message : see declaration of 'FString' | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\BL3ProxySettings.cpp(637,23): warning C4099: 'TArray<FString>': type name first seen using 'struct' now seen using 'class' | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\BL3ProxySettings.cpp(637): message : see declaration of 'TArray<FString>' | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\BL3ProxySettings.cpp(723,5): warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. | |||||
libMinHook-MD.x64.lib(hook.obj) : MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance | |||||
LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/LTCG' specification | |||||
Creating library F:\Programmieren\C++\BL3\BL3ProxySettings\x64\Debug\BL3ProxySettings.lib and object F:\Programmieren\C++\BL3\BL3ProxySettings\x64\Debug\BL3ProxySettings.exp | |||||
LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library | |||||
Generating code | |||||
Finished generating code | |||||
BL3ProxySettings.vcxproj -> F:\Programmieren\C++\BL3\BL3ProxySettings\x64\Debug\BL3ProxySettings.dll |
@@ -0,0 +1,2 @@ | |||||
PlatformToolSet=v142:VCToolArchitecture=Native32Bit:VCToolsVersion=14.28.29910:TargetPlatformVersion=10.0.19041.0: | |||||
Debug|x64|F:\Programmieren\C++\BL3\BL3ProxySettings\| |
@@ -0,0 +1 @@ | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\x64\Debug\BL3ProxySettings.dll |
@@ -0,0 +1 @@ | |||||
|
@@ -0,0 +1,11 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<Project> | |||||
<ProjectOutputs> | |||||
<ProjectOutput> | |||||
<FullPath>F:\Programmieren\C++\BL3\BL3ProxySettings\x64\Release\BL3ProxySettings.dll</FullPath> | |||||
</ProjectOutput> | |||||
</ProjectOutputs> | |||||
<ContentFiles /> | |||||
<SatelliteDlls /> | |||||
<NonRecipeFileRefs /> | |||||
</Project> |
@@ -0,0 +1,41 @@ | |||||
In file included from BL3ProxySettings.cpp:24: | |||||
./include/patternscan.hpp(641,24): warning : multi-character character constant [-Wmultichar] | |||||
In file included from BL3ProxySettings.cpp:36: | |||||
./include/easywsclient.cpp(98,50): warning : format specifies type 'char *' but the argument has type 'WCHAR *' (aka 'wchar_t *') [-Wformat] | |||||
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um\WS2tcpip.h(670,24): message : expanded from macro 'gai_strerror' | |||||
In file included from BL3ProxySettings.cpp:36: | |||||
./include/easywsclient.cpp(563,18): warning : 'sscanf' is deprecated: This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. [-Wdeprecated-declarations] | |||||
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt\stdio.h(2239,20): message : 'sscanf' has been explicitly marked deprecated here | |||||
I:\Microsoft VisualStudio 2019\VC\Tools\MSVC\14.28.29910\include\vcruntime.h(320,55): message : expanded from macro '_CRT_INSECURE_DEPRECATE' | |||||
I:\Microsoft VisualStudio 2019\VC\Tools\MSVC\14.28.29910\include\vcruntime.h(310,47): message : expanded from macro '_CRT_DEPRECATE_TEXT' | |||||
In file included from BL3ProxySettings.cpp:36: | |||||
./include/easywsclient.cpp(566,18): warning : 'sscanf' is deprecated: This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. [-Wdeprecated-declarations] | |||||
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt\stdio.h(2239,20): message : 'sscanf' has been explicitly marked deprecated here | |||||
I:\Microsoft VisualStudio 2019\VC\Tools\MSVC\14.28.29910\include\vcruntime.h(320,55): message : expanded from macro '_CRT_INSECURE_DEPRECATE' | |||||
I:\Microsoft VisualStudio 2019\VC\Tools\MSVC\14.28.29910\include\vcruntime.h(310,47): message : expanded from macro '_CRT_DEPRECATE_TEXT' | |||||
In file included from BL3ProxySettings.cpp:36: | |||||
./include/easywsclient.cpp(570,18): warning : 'sscanf' is deprecated: This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. [-Wdeprecated-declarations] | |||||
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt\stdio.h(2239,20): message : 'sscanf' has been explicitly marked deprecated here | |||||
I:\Microsoft VisualStudio 2019\VC\Tools\MSVC\14.28.29910\include\vcruntime.h(320,55): message : expanded from macro '_CRT_INSECURE_DEPRECATE' | |||||
I:\Microsoft VisualStudio 2019\VC\Tools\MSVC\14.28.29910\include\vcruntime.h(310,47): message : expanded from macro '_CRT_DEPRECATE_TEXT' | |||||
In file included from BL3ProxySettings.cpp:36: | |||||
./include/easywsclient.cpp(574,18): warning : 'sscanf' is deprecated: This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. [-Wdeprecated-declarations] | |||||
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt\stdio.h(2239,20): message : 'sscanf' has been explicitly marked deprecated here | |||||
I:\Microsoft VisualStudio 2019\VC\Tools\MSVC\14.28.29910\include\vcruntime.h(320,55): message : expanded from macro '_CRT_INSECURE_DEPRECATE' | |||||
I:\Microsoft VisualStudio 2019\VC\Tools\MSVC\14.28.29910\include\vcruntime.h(310,47): message : expanded from macro '_CRT_DEPRECATE_TEXT' | |||||
In file included from BL3ProxySettings.cpp:36: | |||||
./include/easywsclient.cpp(641,17): warning : 'sscanf' is deprecated: This function or variable may be unsafe. Consider using sscanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. [-Wdeprecated-declarations] | |||||
C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt\stdio.h(2239,20): message : 'sscanf' has been explicitly marked deprecated here | |||||
I:\Microsoft VisualStudio 2019\VC\Tools\MSVC\14.28.29910\include\vcruntime.h(320,55): message : expanded from macro '_CRT_INSECURE_DEPRECATE' | |||||
I:\Microsoft VisualStudio 2019\VC\Tools\MSVC\14.28.29910\include\vcruntime.h(310,47): message : expanded from macro '_CRT_DEPRECATE_TEXT' | |||||
BL3ProxySettings.cpp(124,1): warning : typedef requires a name [-Wmissing-declarations] | |||||
BL3ProxySettings.cpp(188,1): warning : typedef requires a name [-Wmissing-declarations] | |||||
BL3ProxySettings.cpp(464,2): warning : class 'TArray' was previously declared as a struct; this is valid, but may result in linker errors under the Microsoft C++ ABI [-Wmismatched-tags] | |||||
BL3ProxySettings.cpp(227,8): message : previous use is here | |||||
BL3ProxySettings.cpp(895,12): warning : unused variable 'replaceMode' [-Wunused-variable] | |||||
BL3ProxySettings.cpp(1153,49): warning : implicit conversion between pointer-to-function and pointer-to-object is a Microsoft extension [-Wmicrosoft-cast] | |||||
BL3ProxySettings.cpp(1156,54): warning : implicit conversion between pointer-to-function and pointer-to-object is a Microsoft extension [-Wmicrosoft-cast] | |||||
BL3ProxySettings.cpp(1159,55): warning : implicit conversion between pointer-to-function and pointer-to-object is a Microsoft extension [-Wmicrosoft-cast] | |||||
BL3ProxySettings.cpp(1162,52): warning : implicit conversion between pointer-to-function and pointer-to-object is a Microsoft extension [-Wmicrosoft-cast] | |||||
BL3ProxySettings.cpp(1165,53): warning : implicit conversion between pointer-to-function and pointer-to-object is a Microsoft extension [-Wmicrosoft-cast] | |||||
BL3ProxySettings.vcxproj -> F:\Programmieren\C++\BL3\BL3ProxySettings\x64\Release\BL3ProxySettings.dll |
@@ -0,0 +1,2 @@ | |||||
PlatformToolSet=ClangCL:VCToolArchitecture=Native32Bit:VCToolsVersion=14.28.29910:TargetPlatformVersion=10.0.19041.0: | |||||
I:\Microsoft VisualStudio 2019\VC\Tools\Llvm\x64|11.0.0|Release|x64|F:\Programmieren\C++\BL3\BL3ProxySettings\| |
@@ -0,0 +1 @@ | |||||
F:\Programmieren\C++\BL3\BL3ProxySettings\x64\Release\BL3ProxySettings.dll |
@@ -0,0 +1 @@ | |||||
|