@@ -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 @@ | |||
|