commit 97eeb1350c8535df9fbcb34b1f445af9c58808d7 Author: yuv420p10le <139547685+yuv420p10le@users.noreply.github.com> Date: Wed May 8 02:55:36 2024 +0300 Initial commit. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1990b73 --- /dev/null +++ b/.gitignore @@ -0,0 +1,238 @@ +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates +*.userprefs +mono_crash.* +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ +.vs/ +Generated\ Files/ +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* +*.VisualState.xml +TestResult.xml +nunit-*.xml +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c +BenchmarkDotNet.Artifacts/ +project.lock.json +project.fragment.lock.json +artifacts/ +ScaffoldingReadMe.txt +StyleCopReport.xml +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc +_Chutzpah* +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb +*.psess +*.vsp +*.vspx +*.sap +*.e2e +$tf/ +*.gpState +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user +_TeamCity* +*.dotCover +.axoCover/* +!.axoCover/settings.json +coverage*.json +coverage*.xml +coverage*.info +*.coverage +*.coveragexml +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* +*.mm.* +AutoTest.Net/ +.sass-cache/ +[Ee]xpress/ +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html +publish/ +*.[Pp]ublish.xml +*.azurePubxml +*.pubxml +*.publishproj +PublishScripts/ +*.nupkg*.snupkg**/[Pp]ackages/*!**/[Pp]ackages/build/*.nuget.props +*.nuget.targets +csx/ +*.build.csdef +ecf/ +rcf/ +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload*.[Cc]ache!?*.[Cc]ache/ +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs +Generated_Code/ +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak +*.mdf +*.ldf +*.ndf +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl +FakesAssemblies/ +*.GhostDoc.xml +.ntvs_analysis.dat +node_modules/ +*.plg +*.opt +*.vbw +*.vbp +*.dsw +*.dsp +*.ncb +*.aps +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions +.paket/paket.exe +paket-files/ +.fake/ +.cr/personal +__pycache__/ +*.pyc +*.tss +*.jmconfig +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs +OpenCover/ +ASALocalRun/ +*.binlog +*.nvuser +.mfractor/ +.localhistory/ +.vshistory/ +healthchecksdb +MigrationBackup/ +.ionide/ +FodyWeavers.xsd +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace +.history/ +*.cab +*.msi +*.msix +*.msm +*.msp +*.sln.iml +*.d +*.slo +*.lo +*.o +*.obj +*.gch +*.pch +*.so +*.dylib +*.dll +*.mod +*.smod +*.lai +*.la +*.a +*.lib +*.exe +*.out +*.app +CMakeLists.txt.user +CMakeCache.txt +CMakeFiles +CMakeScripts +Testing +Makefile +cmake_install.cmake +install_manifest.txt +compile_commands.json +CTestTestfile.cmake +_deps diff --git a/README.md b/README.md new file mode 100644 index 0000000..fbb2a83 --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +# plexmediaserver_crack + +Enables Godmode, unlocking *all features* on (hardware transcoding, intro/credit detection, HEVC transcoding, etc..) on Plex Media Server. Including Plex Pass features without a required subscription, and including early-access/development/Plex Ninja features. + +## Installation + +### Windows + +1. Download `IPHLPAPI.dll` from [the latest release](https://github.com/yuv420p10le/plexmediaserver_crack/releases/latest/download/IPHLPAPI.dll) and put it in your Plex Media Server's installation folder. (e.g. `C:\Program Files\Plex\Plex Media Server`) +2. Restart Plex Media Server. All features will be unlocked. + +### Linux + +x86-64 only. + +Written for [linuxserver/docker-plex](https://github.com/linuxserver/docker-plex). + +Get the [latest amd64 build of patchelf](https://github.com/NixOS/patchelf/releases/latest), extract the inner `./bin/patchelf` file to your `/config` folder (the same one where `"Library"` is located). Ensure it has execute permissions. + +Download `plexmediaserver_crack.so` from [the latest release](https://github.com/yuv420p10le/plexmediaserver_crack/releases/latest/download/plexmediaserver_crack.so) and save it somewhere. If running under Docker, `/config` works. Otherwise, use a directory that is readable by the user running Plex Media Server. + +Execute the following commands: + +```sh +docker exec -it plex ln -s /config/plexmediaserver_crack.so /usr/lib/plexmediaserver/lib/plexmediaserver_crack.so +docker exec -it plex /config/patchelf --remove-needed plexmediaserver_crack.so "/usr/lib/plexmediaserver/lib/libsoci_core.so" +docker exec -it plex /config/patchelf --add-needed plexmediaserver_crack.so "/usr/lib/plexmediaserver/lib/libsoci_core.so" +``` + +Now restart Plex Media Server. All features will be unlocked. + +This will NOT persist through Docker image updates, as rebuilding the container will copy libraries freshly from the image. + +### Building + +#### Windows + +Build using Visual Studio 2022, C++20. + +#### Linux + +[linuxserver/docker-plex](https://github.com/linuxserver/docker-plex)'s image uses GLIBC 2.35, and Debian stable (bookworm, as of now) is at 2.36. Use a host with an older version to build (e.g. Debian Bullseye). + +### Troubleshooting + +* For intro/credit detection, go to Settings -> Library -> Marker source; and select the "local detection only" option. +* If hardware transcoding (or any other feature) does not work, it should not be related to this repository. Use Google to troubleshoot why said feature doesn't work on your setup specifically. + +### Screenshots + +![](https://i.imgur.com/6LGkLcm.png) ![](https://i.imgur.com/su02dh3.png) +![](https://i.imgur.com/sSysxcq.png) \ No newline at end of file diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt new file mode 100644 index 0000000..581d759 --- /dev/null +++ b/linux/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.18) +project(plexmediaserver_crack) +SET(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) +add_compile_options(-Wall -Wextra -Werror) + +set(SOURCES main.cpp hook.cpp) +set(HEADERS hook.hpp) + +add_library(plexmediaserver_crack SHARED ${SOURCES} ${HEADERS}) +set_target_properties(plexmediaserver_crack PROPERTIES PREFIX "") +set_target_properties(plexmediaserver_crack PROPERTIES LINK_FLAGS "-static-libstdc++ -static-libgcc") +set_target_properties(plexmediaserver_crack PROPERTIES OUTPUT_NAME "plexmediaserver_crack") +target_link_libraries(plexmediaserver_crack PUBLIC rt) +target_include_directories(plexmediaserver_crack PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/linux/hook.cpp b/linux/hook.cpp new file mode 100644 index 0000000..c414d36 --- /dev/null +++ b/linux/hook.cpp @@ -0,0 +1,122 @@ +#include "hook.hpp" + +#include +#include +#include +#include +#include +#include + +bool get_dottext_info(uintptr_t& start, uintptr_t& end) +{ + std::ifstream file("/proc/self/maps"); + std::string line; + + while(std::getline(file, line)) + { + // I don't understand Linux :| + // Only .text should have `r-xp`. This works I guess.. + if(line.find("Plex Media Server") != std::string::npos && line.find("r-xp") != std::string::npos) + { + auto range = line.substr(0, line.find(' ')); + start = std::stoull(line.substr(0, line.find('-')), nullptr, 16); + end = std::stoull(line.substr(line.find('-') + 1), nullptr, 16); + + return true; + } + } + + return false; +} + +uintptr_t sig_scan(const uintptr_t start, const uintptr_t end, std::string_view pattern) +{ + constexpr const uint16_t WILDCARD = 0xFFFF; + std::vector pattern_vec; + + for(uintptr_t i = 0; i < pattern.length(); i++) + { + if(pattern[i] == ' ') + { + continue; + } + + if(pattern[i] == '?') + { + if(pattern[i + 1] == '?') + { + i++; + } + + pattern_vec.push_back(WILDCARD); + + continue; + } + + pattern_vec.push_back(static_cast(std::strtol(&pattern[i], nullptr, 16))); + i++; + } + + const auto vec_length = pattern_vec.size(); + + for(uintptr_t i = start; i < end; i++) + { + for(uintptr_t x = 0; x < vec_length; x++) + { + const auto mem = *reinterpret_cast(i + x); + + if(pattern_vec[x] != WILDCARD && mem != pattern_vec[x]) + { + break; + } + + else if(x == vec_length - 1) + { + return i; + } + } + } + + return 0; +} + +uint64_t hook_is_feature_available([[maybe_unused]] uintptr_t user, [[maybe_unused]] const char* feature) +{ + // `feature` is a GUID. You can use it to enable certain features rather than Godmode (everything); but there's no reason to limit ourselves.. is there? + + return true; +} + +void hook() +{ + uintptr_t dottext_start; + uintptr_t dottext_end; + + if(!get_dottext_info(dottext_start, dottext_end)) + { + return; + } + + const auto _is_feature_available = sig_scan(dottext_start, dottext_end, "55 48 89 E5 41 57 41 56 53 50 49 89 F7 48 89 FB 4C 8D 77 08 4C 89 F7 E8 ? ? ? ? 48 8D 7B 30"); + + if(_is_feature_available == 0) + { + return; + } + + // Jumps to specified address + uint8_t shellcode[] = + { + 0x48, 0xB8, // movq rax, ? + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0x50, // push rax + 0xC3 // ret + }; + + *reinterpret_cast(&shellcode[2]) = &hook_is_feature_available; + + mprotect(reinterpret_cast(_is_feature_available), sizeof(shellcode), PROT_READ|PROT_WRITE|PROT_EXEC); + memcpy(reinterpret_cast(_is_feature_available), shellcode, sizeof(shellcode)); + mprotect(reinterpret_cast(_is_feature_available), sizeof(shellcode), PROT_READ|PROT_EXEC); +} diff --git a/linux/hook.hpp b/linux/hook.hpp new file mode 100644 index 0000000..edc7da0 --- /dev/null +++ b/linux/hook.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include +#include + +bool get_dottext_info(uintptr_t& start, uintptr_t& end); +uintptr_t sig_scan(const uintptr_t start, const uintptr_t end, std::string_view pattern); +uint64_t hook_is_feature_available(uintptr_t user, const char* feature); +void hook(); diff --git a/linux/main.cpp b/linux/main.cpp new file mode 100644 index 0000000..c413d08 --- /dev/null +++ b/linux/main.cpp @@ -0,0 +1,6 @@ +#include "hook.hpp" + +__attribute__((constructor)) void init_so() +{ + hook(); +} \ No newline at end of file diff --git a/windows/dllmain.cpp b/windows/dllmain.cpp new file mode 100644 index 0000000..a52cf6e --- /dev/null +++ b/windows/dllmain.cpp @@ -0,0 +1,16 @@ +#define WIN32_LEAN_AND_MEAN +#include + +#include "proxy.hpp" +#include "hook.hpp" + +BOOL APIENTRY DllMain([[maybe_unused]] HMODULE hModule, DWORD ul_reason_for_call, [[maybe_unused]] LPVOID lpReserved) +{ + if(ul_reason_for_call == DLL_PROCESS_ATTACH) + { + hook(); + } + + return TRUE; +} + diff --git a/windows/hook.cpp b/windows/hook.cpp new file mode 100644 index 0000000..17df9f2 --- /dev/null +++ b/windows/hook.cpp @@ -0,0 +1,113 @@ +#include "hook.hpp" + +#include +#include +#include +#include +#include + +uintptr_t _is_feature_available; + +bool get_section_info(std::string_view name, uintptr_t& start, uintptr_t& end) +{ + char filename[MAX_PATH]; + GetModuleFileNameA(NULL, filename, sizeof(filename)); + + auto cur_handle = GetModuleHandleA(filename); + IMAGE_NT_HEADERS* nt_hdr = ImageNtHeader(cur_handle); + IMAGE_SECTION_HEADER* section_hdr = reinterpret_cast(nt_hdr + 1); + uintptr_t image_base = reinterpret_cast(cur_handle); + + for(int i = 0; i < nt_hdr->FileHeader.NumberOfSections; i++, section_hdr++) + { + auto section_header_name = reinterpret_cast(section_hdr->Name); + + if(name == section_header_name) + { + uintptr_t base_module = image_base + section_hdr->VirtualAddress; + start = base_module; + end = base_module + section_hdr->Misc.VirtualSize - 1; + + return true; + } + } + + return false; +} + +uintptr_t sig_scan(const uintptr_t start, const uintptr_t end, std::string_view pattern) +{ + constexpr const uint16_t WILDCARD = 0xFFFF; + std::vector pattern_vec; + + for(uintptr_t i = 0; i < pattern.length(); i++) + { + if(pattern[i] == ' ') + { + continue; + } + + if(pattern[i] == '?') + { + if(pattern[i + 1] == '?') + { + i++; + } + + pattern_vec.push_back(WILDCARD); + + continue; + } + + pattern_vec.push_back(static_cast(std::strtol(&pattern[i], nullptr, 16))); + i++; + } + + const auto vec_length = pattern_vec.size(); + + for(uintptr_t i = start; i < end; i++) + { + for(uintptr_t x = 0; x < vec_length; x++) + { + const auto mem = *reinterpret_cast(i + x); + + if(pattern_vec[x] != WILDCARD && mem != pattern_vec[x]) + { + break; + } + + else if(x == vec_length - 1) + { + return i; + } + } + } + + return 0; +} + +uint64_t hook_is_feature_available([[maybe_unused]] uintptr_t user, [[maybe_unused]] const char* feature) +{ + // `feature` is a GUID. You can use it to enable certain features rather than Godmode (everything); but there's no reason to limit ourselves.. is there? + + return true; +} + +void hook() +{ + uintptr_t dottext_start; + uintptr_t dottext_end; + + if(!get_section_info(".text", dottext_start, dottext_end)) + { + std::cerr << "[ERR] [plexmediaserver_crack] .text section not found; aborting.\n"; + + return; + } + + _is_feature_available = sig_scan(dottext_start, dottext_end, "41 54 41 56 41 57 48 83 EC 20 4C 8B F9 4C 8B F2"); + + MH_Initialize(); + MH_CreateHook(reinterpret_cast(_is_feature_available), &hook_is_feature_available, reinterpret_cast(&_is_feature_available)); + MH_EnableHook(MH_ALL_HOOKS); +} diff --git a/windows/hook.hpp b/windows/hook.hpp new file mode 100644 index 0000000..8ebecbc --- /dev/null +++ b/windows/hook.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include +#include + +bool get_section_info(std::string_view name, uintptr_t& start, uintptr_t& end); +uintptr_t sig_scan(const uintptr_t start, const uintptr_t end, std::string_view pattern); +uint64_t hook_is_feature_available(uintptr_t user, const char* feature); +void hook(); diff --git a/windows/plexmediaserver_crack.sln b/windows/plexmediaserver_crack.sln new file mode 100644 index 0000000..5232f22 --- /dev/null +++ b/windows/plexmediaserver_crack.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.9.34728.123 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "win32", "win32.vcxproj", "{8511ADC9-EC45-4C37-8936-F4556AA01C97}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8511ADC9-EC45-4C37-8936-F4556AA01C97}.Debug|x64.ActiveCfg = Debug|x64 + {8511ADC9-EC45-4C37-8936-F4556AA01C97}.Debug|x64.Build.0 = Debug|x64 + {8511ADC9-EC45-4C37-8936-F4556AA01C97}.Debug|x86.ActiveCfg = Debug|Win32 + {8511ADC9-EC45-4C37-8936-F4556AA01C97}.Debug|x86.Build.0 = Debug|Win32 + {8511ADC9-EC45-4C37-8936-F4556AA01C97}.Release|x64.ActiveCfg = Release|x64 + {8511ADC9-EC45-4C37-8936-F4556AA01C97}.Release|x64.Build.0 = Release|x64 + {8511ADC9-EC45-4C37-8936-F4556AA01C97}.Release|x86.ActiveCfg = Release|Win32 + {8511ADC9-EC45-4C37-8936-F4556AA01C97}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {FCF6F8A5-FC33-4F65-9C30-61EE29E93806} + EndGlobalSection +EndGlobal diff --git a/windows/proxy.hpp b/windows/proxy.hpp new file mode 100644 index 0000000..8fe0a71 --- /dev/null +++ b/windows/proxy.hpp @@ -0,0 +1,313 @@ +#ifdef _WIN64 +#define DLLPATH "\\\\.\\GLOBALROOT\\SystemRoot\\System32\\IPHLPAPI.DLL" +#else +#define DLLPATH "\\\\.\\GLOBALROOT\\SystemRoot\\SysWOW64\\IPHLPAPI.DLL" +#endif // _WIN64 + +#pragma comment(linker, "/EXPORT:AddIPAddress=" DLLPATH ".AddIPAddress") +#pragma comment(linker, "/EXPORT:AllocateAndGetInterfaceInfoFromStack=" DLLPATH ".AllocateAndGetInterfaceInfoFromStack") +#pragma comment(linker, "/EXPORT:AllocateAndGetIpAddrTableFromStack=" DLLPATH ".AllocateAndGetIpAddrTableFromStack") +#pragma comment(linker, "/EXPORT:CancelIPChangeNotify=" DLLPATH ".CancelIPChangeNotify") +#pragma comment(linker, "/EXPORT:CancelIfTimestampConfigChange=" DLLPATH ".CancelIfTimestampConfigChange") +#pragma comment(linker, "/EXPORT:CancelMibChangeNotify2=" DLLPATH ".CancelMibChangeNotify2") +#pragma comment(linker, "/EXPORT:CaptureInterfaceHardwareCrossTimestamp=" DLLPATH ".CaptureInterfaceHardwareCrossTimestamp") +#pragma comment(linker, "/EXPORT:CloseCompartment=" DLLPATH ".CloseCompartment") +#pragma comment(linker, "/EXPORT:CloseGetIPPhysicalInterfaceForDestination=" DLLPATH ".CloseGetIPPhysicalInterfaceForDestination") +#pragma comment(linker, "/EXPORT:ConvertCompartmentGuidToId=" DLLPATH ".ConvertCompartmentGuidToId") +#pragma comment(linker, "/EXPORT:ConvertCompartmentIdToGuid=" DLLPATH ".ConvertCompartmentIdToGuid") +#pragma comment(linker, "/EXPORT:ConvertGuidToStringA=" DLLPATH ".ConvertGuidToStringA") +#pragma comment(linker, "/EXPORT:ConvertGuidToStringW=" DLLPATH ".ConvertGuidToStringW") +#pragma comment(linker, "/EXPORT:ConvertInterfaceAliasToLuid=" DLLPATH ".ConvertInterfaceAliasToLuid") +#pragma comment(linker, "/EXPORT:ConvertInterfaceGuidToLuid=" DLLPATH ".ConvertInterfaceGuidToLuid") +#pragma comment(linker, "/EXPORT:ConvertInterfaceIndexToLuid=" DLLPATH ".ConvertInterfaceIndexToLuid") +#pragma comment(linker, "/EXPORT:ConvertInterfaceLuidToAlias=" DLLPATH ".ConvertInterfaceLuidToAlias") +#pragma comment(linker, "/EXPORT:ConvertInterfaceLuidToGuid=" DLLPATH ".ConvertInterfaceLuidToGuid") +#pragma comment(linker, "/EXPORT:ConvertInterfaceLuidToIndex=" DLLPATH ".ConvertInterfaceLuidToIndex") +#pragma comment(linker, "/EXPORT:ConvertInterfaceLuidToNameA=" DLLPATH ".ConvertInterfaceLuidToNameA") +#pragma comment(linker, "/EXPORT:ConvertInterfaceLuidToNameW=" DLLPATH ".ConvertInterfaceLuidToNameW") +#pragma comment(linker, "/EXPORT:ConvertInterfaceNameToLuidA=" DLLPATH ".ConvertInterfaceNameToLuidA") +#pragma comment(linker, "/EXPORT:ConvertInterfaceNameToLuidW=" DLLPATH ".ConvertInterfaceNameToLuidW") +#pragma comment(linker, "/EXPORT:ConvertInterfacePhysicalAddressToLuid=" DLLPATH ".ConvertInterfacePhysicalAddressToLuid") +#pragma comment(linker, "/EXPORT:ConvertIpv4MaskToLength=" DLLPATH ".ConvertIpv4MaskToLength") +#pragma comment(linker, "/EXPORT:ConvertLengthToIpv4Mask=" DLLPATH ".ConvertLengthToIpv4Mask") +#pragma comment(linker, "/EXPORT:ConvertRemoteInterfaceAliasToLuid=" DLLPATH ".ConvertRemoteInterfaceAliasToLuid") +#pragma comment(linker, "/EXPORT:ConvertRemoteInterfaceGuidToLuid=" DLLPATH ".ConvertRemoteInterfaceGuidToLuid") +#pragma comment(linker, "/EXPORT:ConvertRemoteInterfaceIndexToLuid=" DLLPATH ".ConvertRemoteInterfaceIndexToLuid") +#pragma comment(linker, "/EXPORT:ConvertRemoteInterfaceLuidToAlias=" DLLPATH ".ConvertRemoteInterfaceLuidToAlias") +#pragma comment(linker, "/EXPORT:ConvertRemoteInterfaceLuidToGuid=" DLLPATH ".ConvertRemoteInterfaceLuidToGuid") +#pragma comment(linker, "/EXPORT:ConvertRemoteInterfaceLuidToIndex=" DLLPATH ".ConvertRemoteInterfaceLuidToIndex") +#pragma comment(linker, "/EXPORT:ConvertStringToGuidA=" DLLPATH ".ConvertStringToGuidA") +#pragma comment(linker, "/EXPORT:ConvertStringToGuidW=" DLLPATH ".ConvertStringToGuidW") +#pragma comment(linker, "/EXPORT:ConvertStringToInterfacePhysicalAddress=" DLLPATH ".ConvertStringToInterfacePhysicalAddress") +#pragma comment(linker, "/EXPORT:CreateAnycastIpAddressEntry=" DLLPATH ".CreateAnycastIpAddressEntry") +#pragma comment(linker, "/EXPORT:CreateCompartment=" DLLPATH ".CreateCompartment") +#pragma comment(linker, "/EXPORT:CreateIpForwardEntry=" DLLPATH ".CreateIpForwardEntry") +#pragma comment(linker, "/EXPORT:CreateIpForwardEntry2=" DLLPATH ".CreateIpForwardEntry2") +#pragma comment(linker, "/EXPORT:CreateIpNetEntry=" DLLPATH ".CreateIpNetEntry") +#pragma comment(linker, "/EXPORT:CreateIpNetEntry2=" DLLPATH ".CreateIpNetEntry2") +#pragma comment(linker, "/EXPORT:CreatePersistentTcpPortReservation=" DLLPATH ".CreatePersistentTcpPortReservation") +#pragma comment(linker, "/EXPORT:CreatePersistentUdpPortReservation=" DLLPATH ".CreatePersistentUdpPortReservation") +#pragma comment(linker, "/EXPORT:CreateProxyArpEntry=" DLLPATH ".CreateProxyArpEntry") +#pragma comment(linker, "/EXPORT:CreateSortedAddressPairs=" DLLPATH ".CreateSortedAddressPairs") +#pragma comment(linker, "/EXPORT:CreateUnicastIpAddressEntry=" DLLPATH ".CreateUnicastIpAddressEntry") +#pragma comment(linker, "/EXPORT:DeleteAnycastIpAddressEntry=" DLLPATH ".DeleteAnycastIpAddressEntry") +#pragma comment(linker, "/EXPORT:DeleteCompartment=" DLLPATH ".DeleteCompartment") +#pragma comment(linker, "/EXPORT:DeleteIPAddress=" DLLPATH ".DeleteIPAddress") +#pragma comment(linker, "/EXPORT:DeleteIpForwardEntry=" DLLPATH ".DeleteIpForwardEntry") +#pragma comment(linker, "/EXPORT:DeleteIpForwardEntry2=" DLLPATH ".DeleteIpForwardEntry2") +#pragma comment(linker, "/EXPORT:DeleteIpNetEntry=" DLLPATH ".DeleteIpNetEntry") +#pragma comment(linker, "/EXPORT:DeleteIpNetEntry2=" DLLPATH ".DeleteIpNetEntry2") +#pragma comment(linker, "/EXPORT:DeletePersistentTcpPortReservation=" DLLPATH ".DeletePersistentTcpPortReservation") +#pragma comment(linker, "/EXPORT:DeletePersistentUdpPortReservation=" DLLPATH ".DeletePersistentUdpPortReservation") +#pragma comment(linker, "/EXPORT:DeleteProxyArpEntry=" DLLPATH ".DeleteProxyArpEntry") +#pragma comment(linker, "/EXPORT:DeleteUnicastIpAddressEntry=" DLLPATH ".DeleteUnicastIpAddressEntry") +#pragma comment(linker, "/EXPORT:DisableMediaSense=" DLLPATH ".DisableMediaSense") +#pragma comment(linker, "/EXPORT:EnableRouter=" DLLPATH ".EnableRouter") +#pragma comment(linker, "/EXPORT:FlushIpNetTable=" DLLPATH ".FlushIpNetTable") +#pragma comment(linker, "/EXPORT:FlushIpNetTable2=" DLLPATH ".FlushIpNetTable2") +#pragma comment(linker, "/EXPORT:FlushIpPathTable=" DLLPATH ".FlushIpPathTable") +#pragma comment(linker, "/EXPORT:FreeDnsSettings=" DLLPATH ".FreeDnsSettings") +#pragma comment(linker, "/EXPORT:FreeInterfaceDnsSettings=" DLLPATH ".FreeInterfaceDnsSettings") +#pragma comment(linker, "/EXPORT:FreeMibTable=" DLLPATH ".FreeMibTable") +#pragma comment(linker, "/EXPORT:GetAdapterIndex=" DLLPATH ".GetAdapterIndex") +#pragma comment(linker, "/EXPORT:GetAdapterOrderMap=" DLLPATH ".GetAdapterOrderMap") +#pragma comment(linker, "/EXPORT:GetAdaptersAddresses=" DLLPATH ".GetAdaptersAddresses") +#pragma comment(linker, "/EXPORT:GetAdaptersInfo=" DLLPATH ".GetAdaptersInfo") +#pragma comment(linker, "/EXPORT:GetAnycastIpAddressEntry=" DLLPATH ".GetAnycastIpAddressEntry") +#pragma comment(linker, "/EXPORT:GetAnycastIpAddressTable=" DLLPATH ".GetAnycastIpAddressTable") +#pragma comment(linker, "/EXPORT:GetBestInterface=" DLLPATH ".GetBestInterface") +#pragma comment(linker, "/EXPORT:GetBestInterfaceEx=" DLLPATH ".GetBestInterfaceEx") +#pragma comment(linker, "/EXPORT:GetBestRoute=" DLLPATH ".GetBestRoute") +#pragma comment(linker, "/EXPORT:GetBestRoute2=" DLLPATH ".GetBestRoute2") +#pragma comment(linker, "/EXPORT:GetCurrentThreadCompartmentId=" DLLPATH ".GetCurrentThreadCompartmentId") +#pragma comment(linker, "/EXPORT:GetCurrentThreadCompartmentScope=" DLLPATH ".GetCurrentThreadCompartmentScope") +#pragma comment(linker, "/EXPORT:GetDefaultCompartmentId=" DLLPATH ".GetDefaultCompartmentId") +#pragma comment(linker, "/EXPORT:GetDnsSettings=" DLLPATH ".GetDnsSettings") +#pragma comment(linker, "/EXPORT:GetExtendedTcpTable=" DLLPATH ".GetExtendedTcpTable") +#pragma comment(linker, "/EXPORT:GetExtendedUdpTable=" DLLPATH ".GetExtendedUdpTable") +#pragma comment(linker, "/EXPORT:GetFriendlyIfIndex=" DLLPATH ".GetFriendlyIfIndex") +#pragma comment(linker, "/EXPORT:GetIcmpStatistics=" DLLPATH ".GetIcmpStatistics") +#pragma comment(linker, "/EXPORT:GetIcmpStatisticsEx=" DLLPATH ".GetIcmpStatisticsEx") +#pragma comment(linker, "/EXPORT:GetIfEntry=" DLLPATH ".GetIfEntry") +#pragma comment(linker, "/EXPORT:GetIfEntry2=" DLLPATH ".GetIfEntry2") +#pragma comment(linker, "/EXPORT:GetIfEntry2Ex=" DLLPATH ".GetIfEntry2Ex") +#pragma comment(linker, "/EXPORT:GetIfStackTable=" DLLPATH ".GetIfStackTable") +#pragma comment(linker, "/EXPORT:GetIfTable=" DLLPATH ".GetIfTable") +#pragma comment(linker, "/EXPORT:GetIfTable2=" DLLPATH ".GetIfTable2") +#pragma comment(linker, "/EXPORT:GetIfTable2Ex=" DLLPATH ".GetIfTable2Ex") +#pragma comment(linker, "/EXPORT:GetInterfaceActiveTimestampCapabilities=" DLLPATH ".GetInterfaceActiveTimestampCapabilities") +#pragma comment(linker, "/EXPORT:GetInterfaceCompartmentId=" DLLPATH ".GetInterfaceCompartmentId") +#pragma comment(linker, "/EXPORT:GetInterfaceCurrentTimestampCapabilities=" DLLPATH ".GetInterfaceCurrentTimestampCapabilities") +#pragma comment(linker, "/EXPORT:GetInterfaceDnsSettings=" DLLPATH ".GetInterfaceDnsSettings") +#pragma comment(linker, "/EXPORT:GetInterfaceHardwareTimestampCapabilities=" DLLPATH ".GetInterfaceHardwareTimestampCapabilities") +#pragma comment(linker, "/EXPORT:GetInterfaceInfo=" DLLPATH ".GetInterfaceInfo") +#pragma comment(linker, "/EXPORT:GetInterfaceSupportedTimestampCapabilities=" DLLPATH ".GetInterfaceSupportedTimestampCapabilities") +#pragma comment(linker, "/EXPORT:GetInvertedIfStackTable=" DLLPATH ".GetInvertedIfStackTable") +#pragma comment(linker, "/EXPORT:GetIpAddrTable=" DLLPATH ".GetIpAddrTable") +#pragma comment(linker, "/EXPORT:GetIpErrorString=" DLLPATH ".GetIpErrorString") +#pragma comment(linker, "/EXPORT:GetIpForwardEntry2=" DLLPATH ".GetIpForwardEntry2") +#pragma comment(linker, "/EXPORT:GetIpForwardTable=" DLLPATH ".GetIpForwardTable") +#pragma comment(linker, "/EXPORT:GetIpForwardTable2=" DLLPATH ".GetIpForwardTable2") +#pragma comment(linker, "/EXPORT:GetIpInterfaceEntry=" DLLPATH ".GetIpInterfaceEntry") +#pragma comment(linker, "/EXPORT:GetIpInterfaceTable=" DLLPATH ".GetIpInterfaceTable") +#pragma comment(linker, "/EXPORT:GetIpNetEntry2=" DLLPATH ".GetIpNetEntry2") +#pragma comment(linker, "/EXPORT:GetIpNetTable=" DLLPATH ".GetIpNetTable") +#pragma comment(linker, "/EXPORT:GetIpNetTable2=" DLLPATH ".GetIpNetTable2") +#pragma comment(linker, "/EXPORT:GetIpNetworkConnectionBandwidthEstimates=" DLLPATH ".GetIpNetworkConnectionBandwidthEstimates") +#pragma comment(linker, "/EXPORT:GetIpPathEntry=" DLLPATH ".GetIpPathEntry") +#pragma comment(linker, "/EXPORT:GetIpPathTable=" DLLPATH ".GetIpPathTable") +#pragma comment(linker, "/EXPORT:GetIpStatistics=" DLLPATH ".GetIpStatistics") +#pragma comment(linker, "/EXPORT:GetIpStatisticsEx=" DLLPATH ".GetIpStatisticsEx") +#pragma comment(linker, "/EXPORT:GetJobCompartmentId=" DLLPATH ".GetJobCompartmentId") +#pragma comment(linker, "/EXPORT:GetMulticastIpAddressEntry=" DLLPATH ".GetMulticastIpAddressEntry") +#pragma comment(linker, "/EXPORT:GetMulticastIpAddressTable=" DLLPATH ".GetMulticastIpAddressTable") +#pragma comment(linker, "/EXPORT:GetNetworkConnectivityHint=" DLLPATH ".GetNetworkConnectivityHint") +#pragma comment(linker, "/EXPORT:GetNetworkConnectivityHintForInterface=" DLLPATH ".GetNetworkConnectivityHintForInterface") +#pragma comment(linker, "/EXPORT:GetNetworkInformation=" DLLPATH ".GetNetworkInformation") +#pragma comment(linker, "/EXPORT:GetNetworkParams=" DLLPATH ".GetNetworkParams") +#pragma comment(linker, "/EXPORT:GetNumberOfInterfaces=" DLLPATH ".GetNumberOfInterfaces") +#pragma comment(linker, "/EXPORT:GetOwnerModuleFromPidAndInfo=" DLLPATH ".GetOwnerModuleFromPidAndInfo") +#pragma comment(linker, "/EXPORT:GetOwnerModuleFromTcp6Entry=" DLLPATH ".GetOwnerModuleFromTcp6Entry") +#pragma comment(linker, "/EXPORT:GetOwnerModuleFromTcpEntry=" DLLPATH ".GetOwnerModuleFromTcpEntry") +#pragma comment(linker, "/EXPORT:GetOwnerModuleFromUdp6Entry=" DLLPATH ".GetOwnerModuleFromUdp6Entry") +#pragma comment(linker, "/EXPORT:GetOwnerModuleFromUdpEntry=" DLLPATH ".GetOwnerModuleFromUdpEntry") +#pragma comment(linker, "/EXPORT:GetPerAdapterInfo=" DLLPATH ".GetPerAdapterInfo") +#pragma comment(linker, "/EXPORT:GetPerTcp6ConnectionEStats=" DLLPATH ".GetPerTcp6ConnectionEStats") +#pragma comment(linker, "/EXPORT:GetPerTcp6ConnectionStats=" DLLPATH ".GetPerTcp6ConnectionStats") +#pragma comment(linker, "/EXPORT:GetPerTcpConnectionEStats=" DLLPATH ".GetPerTcpConnectionEStats") +#pragma comment(linker, "/EXPORT:GetPerTcpConnectionStats=" DLLPATH ".GetPerTcpConnectionStats") +#pragma comment(linker, "/EXPORT:GetRTTAndHopCount=" DLLPATH ".GetRTTAndHopCount") +#pragma comment(linker, "/EXPORT:GetSessionCompartmentId=" DLLPATH ".GetSessionCompartmentId") +#pragma comment(linker, "/EXPORT:GetTcp6Table=" DLLPATH ".GetTcp6Table") +#pragma comment(linker, "/EXPORT:GetTcp6Table2=" DLLPATH ".GetTcp6Table2") +#pragma comment(linker, "/EXPORT:GetTcpStatistics=" DLLPATH ".GetTcpStatistics") +#pragma comment(linker, "/EXPORT:GetTcpStatisticsEx=" DLLPATH ".GetTcpStatisticsEx") +#pragma comment(linker, "/EXPORT:GetTcpStatisticsEx2=" DLLPATH ".GetTcpStatisticsEx2") +#pragma comment(linker, "/EXPORT:GetTcpTable=" DLLPATH ".GetTcpTable") +#pragma comment(linker, "/EXPORT:GetTcpTable2=" DLLPATH ".GetTcpTable2") +#pragma comment(linker, "/EXPORT:GetTeredoPort=" DLLPATH ".GetTeredoPort") +#pragma comment(linker, "/EXPORT:GetUdp6Table=" DLLPATH ".GetUdp6Table") +#pragma comment(linker, "/EXPORT:GetUdpStatistics=" DLLPATH ".GetUdpStatistics") +#pragma comment(linker, "/EXPORT:GetUdpStatisticsEx=" DLLPATH ".GetUdpStatisticsEx") +#pragma comment(linker, "/EXPORT:GetUdpStatisticsEx2=" DLLPATH ".GetUdpStatisticsEx2") +#pragma comment(linker, "/EXPORT:GetUdpTable=" DLLPATH ".GetUdpTable") +#pragma comment(linker, "/EXPORT:GetUniDirectionalAdapterInfo=" DLLPATH ".GetUniDirectionalAdapterInfo") +#pragma comment(linker, "/EXPORT:GetUnicastIpAddressEntry=" DLLPATH ".GetUnicastIpAddressEntry") +#pragma comment(linker, "/EXPORT:GetUnicastIpAddressTable=" DLLPATH ".GetUnicastIpAddressTable") +#pragma comment(linker, "/EXPORT:GetWPAOACSupportLevel=" DLLPATH ".GetWPAOACSupportLevel") +#pragma comment(linker, "/EXPORT:Icmp6CreateFile=" DLLPATH ".Icmp6CreateFile") +#pragma comment(linker, "/EXPORT:Icmp6ParseReplies=" DLLPATH ".Icmp6ParseReplies") +#pragma comment(linker, "/EXPORT:Icmp6SendEcho2=" DLLPATH ".Icmp6SendEcho2") +#pragma comment(linker, "/EXPORT:IcmpCloseHandle=" DLLPATH ".IcmpCloseHandle") +#pragma comment(linker, "/EXPORT:IcmpCreateFile=" DLLPATH ".IcmpCreateFile") +#pragma comment(linker, "/EXPORT:IcmpParseReplies=" DLLPATH ".IcmpParseReplies") +#pragma comment(linker, "/EXPORT:IcmpSendEcho=" DLLPATH ".IcmpSendEcho") +#pragma comment(linker, "/EXPORT:IcmpSendEcho2=" DLLPATH ".IcmpSendEcho2") +#pragma comment(linker, "/EXPORT:IcmpSendEcho2Ex=" DLLPATH ".IcmpSendEcho2Ex") +#pragma comment(linker, "/EXPORT:InitializeCompartmentEntry=" DLLPATH ".InitializeCompartmentEntry") +#pragma comment(linker, "/EXPORT:InitializeIpForwardEntry=" DLLPATH ".InitializeIpForwardEntry") +#pragma comment(linker, "/EXPORT:InitializeIpInterfaceEntry=" DLLPATH ".InitializeIpInterfaceEntry") +#pragma comment(linker, "/EXPORT:InitializeUnicastIpAddressEntry=" DLLPATH ".InitializeUnicastIpAddressEntry") +#pragma comment(linker, "/EXPORT:InternalCleanupPersistentStore=" DLLPATH ".InternalCleanupPersistentStore") +#pragma comment(linker, "/EXPORT:InternalCreateAnycastIpAddressEntry=" DLLPATH ".InternalCreateAnycastIpAddressEntry") +#pragma comment(linker, "/EXPORT:InternalCreateIpForwardEntry=" DLLPATH ".InternalCreateIpForwardEntry") +#pragma comment(linker, "/EXPORT:InternalCreateIpForwardEntry2=" DLLPATH ".InternalCreateIpForwardEntry2") +#pragma comment(linker, "/EXPORT:InternalCreateIpNetEntry=" DLLPATH ".InternalCreateIpNetEntry") +#pragma comment(linker, "/EXPORT:InternalCreateIpNetEntry2=" DLLPATH ".InternalCreateIpNetEntry2") +#pragma comment(linker, "/EXPORT:InternalCreateOrRefIpForwardEntry2=" DLLPATH ".InternalCreateOrRefIpForwardEntry2") +#pragma comment(linker, "/EXPORT:InternalCreateUnicastIpAddressEntry=" DLLPATH ".InternalCreateUnicastIpAddressEntry") +#pragma comment(linker, "/EXPORT:InternalDeleteAnycastIpAddressEntry=" DLLPATH ".InternalDeleteAnycastIpAddressEntry") +#pragma comment(linker, "/EXPORT:InternalDeleteIpForwardEntry=" DLLPATH ".InternalDeleteIpForwardEntry") +#pragma comment(linker, "/EXPORT:InternalDeleteIpForwardEntry2=" DLLPATH ".InternalDeleteIpForwardEntry2") +#pragma comment(linker, "/EXPORT:InternalDeleteIpNetEntry=" DLLPATH ".InternalDeleteIpNetEntry") +#pragma comment(linker, "/EXPORT:InternalDeleteIpNetEntry2=" DLLPATH ".InternalDeleteIpNetEntry2") +#pragma comment(linker, "/EXPORT:InternalDeleteUnicastIpAddressEntry=" DLLPATH ".InternalDeleteUnicastIpAddressEntry") +#pragma comment(linker, "/EXPORT:InternalFindInterfaceByAddress=" DLLPATH ".InternalFindInterfaceByAddress") +#pragma comment(linker, "/EXPORT:InternalGetAnycastIpAddressEntry=" DLLPATH ".InternalGetAnycastIpAddressEntry") +#pragma comment(linker, "/EXPORT:InternalGetAnycastIpAddressTable=" DLLPATH ".InternalGetAnycastIpAddressTable") +#pragma comment(linker, "/EXPORT:InternalGetBoundTcp6EndpointTable=" DLLPATH ".InternalGetBoundTcp6EndpointTable") +#pragma comment(linker, "/EXPORT:InternalGetBoundTcpEndpointTable=" DLLPATH ".InternalGetBoundTcpEndpointTable") +#pragma comment(linker, "/EXPORT:InternalGetForwardIpTable2=" DLLPATH ".InternalGetForwardIpTable2") +#pragma comment(linker, "/EXPORT:InternalGetIPPhysicalInterfaceForDestination=" DLLPATH ".InternalGetIPPhysicalInterfaceForDestination") +#pragma comment(linker, "/EXPORT:InternalGetIfEntry2=" DLLPATH ".InternalGetIfEntry2") +#pragma comment(linker, "/EXPORT:InternalGetIfTable=" DLLPATH ".InternalGetIfTable") +#pragma comment(linker, "/EXPORT:InternalGetIfTable2=" DLLPATH ".InternalGetIfTable2") +#pragma comment(linker, "/EXPORT:InternalGetIpAddrTable=" DLLPATH ".InternalGetIpAddrTable") +#pragma comment(linker, "/EXPORT:InternalGetIpForwardEntry2=" DLLPATH ".InternalGetIpForwardEntry2") +#pragma comment(linker, "/EXPORT:InternalGetIpForwardTable=" DLLPATH ".InternalGetIpForwardTable") +#pragma comment(linker, "/EXPORT:InternalGetIpInterfaceEntry=" DLLPATH ".InternalGetIpInterfaceEntry") +#pragma comment(linker, "/EXPORT:InternalGetIpInterfaceTable=" DLLPATH ".InternalGetIpInterfaceTable") +#pragma comment(linker, "/EXPORT:InternalGetIpNetEntry2=" DLLPATH ".InternalGetIpNetEntry2") +#pragma comment(linker, "/EXPORT:InternalGetIpNetTable=" DLLPATH ".InternalGetIpNetTable") +#pragma comment(linker, "/EXPORT:InternalGetIpNetTable2=" DLLPATH ".InternalGetIpNetTable2") +#pragma comment(linker, "/EXPORT:InternalGetMulticastIpAddressEntry=" DLLPATH ".InternalGetMulticastIpAddressEntry") +#pragma comment(linker, "/EXPORT:InternalGetMulticastIpAddressTable=" DLLPATH ".InternalGetMulticastIpAddressTable") +#pragma comment(linker, "/EXPORT:InternalGetRtcSlotInformation=" DLLPATH ".InternalGetRtcSlotInformation") +#pragma comment(linker, "/EXPORT:InternalGetTcp6Table2=" DLLPATH ".InternalGetTcp6Table2") +#pragma comment(linker, "/EXPORT:InternalGetTcp6TableWithOwnerModule=" DLLPATH ".InternalGetTcp6TableWithOwnerModule") +#pragma comment(linker, "/EXPORT:InternalGetTcp6TableWithOwnerPid=" DLLPATH ".InternalGetTcp6TableWithOwnerPid") +#pragma comment(linker, "/EXPORT:InternalGetTcpDynamicPortRange=" DLLPATH ".InternalGetTcpDynamicPortRange") +#pragma comment(linker, "/EXPORT:InternalGetTcpTable=" DLLPATH ".InternalGetTcpTable") +#pragma comment(linker, "/EXPORT:InternalGetTcpTable2=" DLLPATH ".InternalGetTcpTable2") +#pragma comment(linker, "/EXPORT:InternalGetTcpTableEx=" DLLPATH ".InternalGetTcpTableEx") +#pragma comment(linker, "/EXPORT:InternalGetTcpTableWithOwnerModule=" DLLPATH ".InternalGetTcpTableWithOwnerModule") +#pragma comment(linker, "/EXPORT:InternalGetTcpTableWithOwnerPid=" DLLPATH ".InternalGetTcpTableWithOwnerPid") +#pragma comment(linker, "/EXPORT:InternalGetTunnelPhysicalAdapter=" DLLPATH ".InternalGetTunnelPhysicalAdapter") +#pragma comment(linker, "/EXPORT:InternalGetUdp6Table2=" DLLPATH ".InternalGetUdp6Table2") +#pragma comment(linker, "/EXPORT:InternalGetUdp6TableWithOwnerModule=" DLLPATH ".InternalGetUdp6TableWithOwnerModule") +#pragma comment(linker, "/EXPORT:InternalGetUdp6TableWithOwnerPid=" DLLPATH ".InternalGetUdp6TableWithOwnerPid") +#pragma comment(linker, "/EXPORT:InternalGetUdpDynamicPortRange=" DLLPATH ".InternalGetUdpDynamicPortRange") +#pragma comment(linker, "/EXPORT:InternalGetUdpTable=" DLLPATH ".InternalGetUdpTable") +#pragma comment(linker, "/EXPORT:InternalGetUdpTable2=" DLLPATH ".InternalGetUdpTable2") +#pragma comment(linker, "/EXPORT:InternalGetUdpTableEx=" DLLPATH ".InternalGetUdpTableEx") +#pragma comment(linker, "/EXPORT:InternalGetUdpTableWithOwnerModule=" DLLPATH ".InternalGetUdpTableWithOwnerModule") +#pragma comment(linker, "/EXPORT:InternalGetUdpTableWithOwnerPid=" DLLPATH ".InternalGetUdpTableWithOwnerPid") +#pragma comment(linker, "/EXPORT:InternalGetUnicastIpAddressEntry=" DLLPATH ".InternalGetUnicastIpAddressEntry") +#pragma comment(linker, "/EXPORT:InternalGetUnicastIpAddressTable=" DLLPATH ".InternalGetUnicastIpAddressTable") +#pragma comment(linker, "/EXPORT:InternalIcmpCreateFileEx=" DLLPATH ".InternalIcmpCreateFileEx") +#pragma comment(linker, "/EXPORT:InternalSetIfEntry=" DLLPATH ".InternalSetIfEntry") +#pragma comment(linker, "/EXPORT:InternalSetIpForwardEntry=" DLLPATH ".InternalSetIpForwardEntry") +#pragma comment(linker, "/EXPORT:InternalSetIpForwardEntry2=" DLLPATH ".InternalSetIpForwardEntry2") +#pragma comment(linker, "/EXPORT:InternalSetIpInterfaceEntry=" DLLPATH ".InternalSetIpInterfaceEntry") +#pragma comment(linker, "/EXPORT:InternalSetIpNetEntry=" DLLPATH ".InternalSetIpNetEntry") +#pragma comment(linker, "/EXPORT:InternalSetIpNetEntry2=" DLLPATH ".InternalSetIpNetEntry2") +#pragma comment(linker, "/EXPORT:InternalSetIpStats=" DLLPATH ".InternalSetIpStats") +#pragma comment(linker, "/EXPORT:InternalSetTcpDynamicPortRange=" DLLPATH ".InternalSetTcpDynamicPortRange") +#pragma comment(linker, "/EXPORT:InternalSetTcpEntry=" DLLPATH ".InternalSetTcpEntry") +#pragma comment(linker, "/EXPORT:InternalSetTeredoPort=" DLLPATH ".InternalSetTeredoPort") +#pragma comment(linker, "/EXPORT:InternalSetUdpDynamicPortRange=" DLLPATH ".InternalSetUdpDynamicPortRange") +#pragma comment(linker, "/EXPORT:InternalSetUnicastIpAddressEntry=" DLLPATH ".InternalSetUnicastIpAddressEntry") +#pragma comment(linker, "/EXPORT:IpReleaseAddress=" DLLPATH ".IpReleaseAddress") +#pragma comment(linker, "/EXPORT:IpRenewAddress=" DLLPATH ".IpRenewAddress") +#pragma comment(linker, "/EXPORT:LookupPersistentTcpPortReservation=" DLLPATH ".LookupPersistentTcpPortReservation") +#pragma comment(linker, "/EXPORT:LookupPersistentUdpPortReservation=" DLLPATH ".LookupPersistentUdpPortReservation") +#pragma comment(linker, "/EXPORT:NTPTimeToNTFileTime=" DLLPATH ".NTPTimeToNTFileTime") +#pragma comment(linker, "/EXPORT:NTTimeToNTPTime=" DLLPATH ".NTTimeToNTPTime") +#pragma comment(linker, "/EXPORT:NhGetGuidFromInterfaceName=" DLLPATH ".NhGetGuidFromInterfaceName") +#pragma comment(linker, "/EXPORT:NhGetInterfaceDescriptionFromGuid=" DLLPATH ".NhGetInterfaceDescriptionFromGuid") +#pragma comment(linker, "/EXPORT:NhGetInterfaceNameFromDeviceGuid=" DLLPATH ".NhGetInterfaceNameFromDeviceGuid") +#pragma comment(linker, "/EXPORT:NhGetInterfaceNameFromGuid=" DLLPATH ".NhGetInterfaceNameFromGuid") +#pragma comment(linker, "/EXPORT:NhpAllocateAndGetInterfaceInfoFromStack=" DLLPATH ".NhpAllocateAndGetInterfaceInfoFromStack") +#pragma comment(linker, "/EXPORT:NotifyAddrChange=" DLLPATH ".NotifyAddrChange") +#pragma comment(linker, "/EXPORT:NotifyCompartmentChange=" DLLPATH ".NotifyCompartmentChange") +#pragma comment(linker, "/EXPORT:NotifyIfTimestampConfigChange=" DLLPATH ".NotifyIfTimestampConfigChange") +#pragma comment(linker, "/EXPORT:NotifyIpInterfaceChange=" DLLPATH ".NotifyIpInterfaceChange") +#pragma comment(linker, "/EXPORT:NotifyNetworkConnectivityHintChange=" DLLPATH ".NotifyNetworkConnectivityHintChange") +#pragma comment(linker, "/EXPORT:NotifyRouteChange=" DLLPATH ".NotifyRouteChange") +#pragma comment(linker, "/EXPORT:NotifyRouteChange2=" DLLPATH ".NotifyRouteChange2") +#pragma comment(linker, "/EXPORT:NotifyStableUnicastIpAddressTable=" DLLPATH ".NotifyStableUnicastIpAddressTable") +#pragma comment(linker, "/EXPORT:NotifyTeredoPortChange=" DLLPATH ".NotifyTeredoPortChange") +#pragma comment(linker, "/EXPORT:NotifyUnicastIpAddressChange=" DLLPATH ".NotifyUnicastIpAddressChange") +#pragma comment(linker, "/EXPORT:OpenCompartment=" DLLPATH ".OpenCompartment") +#pragma comment(linker, "/EXPORT:ParseNetworkString=" DLLPATH ".ParseNetworkString") +#pragma comment(linker, "/EXPORT:PfAddFiltersToInterface=" DLLPATH ".PfAddFiltersToInterface") +#pragma comment(linker, "/EXPORT:PfAddGlobalFilterToInterface=" DLLPATH ".PfAddGlobalFilterToInterface") +#pragma comment(linker, "/EXPORT:PfBindInterfaceToIPAddress=" DLLPATH ".PfBindInterfaceToIPAddress") +#pragma comment(linker, "/EXPORT:PfBindInterfaceToIndex=" DLLPATH ".PfBindInterfaceToIndex") +#pragma comment(linker, "/EXPORT:PfCreateInterface=" DLLPATH ".PfCreateInterface") +#pragma comment(linker, "/EXPORT:PfDeleteInterface=" DLLPATH ".PfDeleteInterface") +#pragma comment(linker, "/EXPORT:PfDeleteLog=" DLLPATH ".PfDeleteLog") +#pragma comment(linker, "/EXPORT:PfGetInterfaceStatistics=" DLLPATH ".PfGetInterfaceStatistics") +#pragma comment(linker, "/EXPORT:PfMakeLog=" DLLPATH ".PfMakeLog") +#pragma comment(linker, "/EXPORT:PfRebindFilters=" DLLPATH ".PfRebindFilters") +#pragma comment(linker, "/EXPORT:PfRemoveFilterHandles=" DLLPATH ".PfRemoveFilterHandles") +#pragma comment(linker, "/EXPORT:PfRemoveFiltersFromInterface=" DLLPATH ".PfRemoveFiltersFromInterface") +#pragma comment(linker, "/EXPORT:PfRemoveGlobalFilterFromInterface=" DLLPATH ".PfRemoveGlobalFilterFromInterface") +#pragma comment(linker, "/EXPORT:PfSetLogBuffer=" DLLPATH ".PfSetLogBuffer") +#pragma comment(linker, "/EXPORT:PfTestPacket=" DLLPATH ".PfTestPacket") +#pragma comment(linker, "/EXPORT:PfUnBindInterface=" DLLPATH ".PfUnBindInterface") +#pragma comment(linker, "/EXPORT:RegisterInterfaceTimestampConfigChange=" DLLPATH ".RegisterInterfaceTimestampConfigChange") +#pragma comment(linker, "/EXPORT:ResolveIpNetEntry2=" DLLPATH ".ResolveIpNetEntry2") +#pragma comment(linker, "/EXPORT:ResolveNeighbor=" DLLPATH ".ResolveNeighbor") +#pragma comment(linker, "/EXPORT:RestoreMediaSense=" DLLPATH ".RestoreMediaSense") +#pragma comment(linker, "/EXPORT:SendARP=" DLLPATH ".SendARP") +#pragma comment(linker, "/EXPORT:SetAdapterIpAddress=" DLLPATH ".SetAdapterIpAddress") +#pragma comment(linker, "/EXPORT:SetCurrentThreadCompartmentId=" DLLPATH ".SetCurrentThreadCompartmentId") +#pragma comment(linker, "/EXPORT:SetCurrentThreadCompartmentScope=" DLLPATH ".SetCurrentThreadCompartmentScope") +#pragma comment(linker, "/EXPORT:SetDnsSettings=" DLLPATH ".SetDnsSettings") +#pragma comment(linker, "/EXPORT:SetIfEntry=" DLLPATH ".SetIfEntry") +#pragma comment(linker, "/EXPORT:SetInterfaceDnsSettings=" DLLPATH ".SetInterfaceDnsSettings") +#pragma comment(linker, "/EXPORT:SetIpForwardEntry=" DLLPATH ".SetIpForwardEntry") +#pragma comment(linker, "/EXPORT:SetIpForwardEntry2=" DLLPATH ".SetIpForwardEntry2") +#pragma comment(linker, "/EXPORT:SetIpInterfaceEntry=" DLLPATH ".SetIpInterfaceEntry") +#pragma comment(linker, "/EXPORT:SetIpNetEntry=" DLLPATH ".SetIpNetEntry") +#pragma comment(linker, "/EXPORT:SetIpNetEntry2=" DLLPATH ".SetIpNetEntry2") +#pragma comment(linker, "/EXPORT:SetIpStatistics=" DLLPATH ".SetIpStatistics") +#pragma comment(linker, "/EXPORT:SetIpStatisticsEx=" DLLPATH ".SetIpStatisticsEx") +#pragma comment(linker, "/EXPORT:SetIpTTL=" DLLPATH ".SetIpTTL") +#pragma comment(linker, "/EXPORT:SetJobCompartmentId=" DLLPATH ".SetJobCompartmentId") +#pragma comment(linker, "/EXPORT:SetNetworkInformation=" DLLPATH ".SetNetworkInformation") +#pragma comment(linker, "/EXPORT:SetPerTcp6ConnectionEStats=" DLLPATH ".SetPerTcp6ConnectionEStats") +#pragma comment(linker, "/EXPORT:SetPerTcp6ConnectionStats=" DLLPATH ".SetPerTcp6ConnectionStats") +#pragma comment(linker, "/EXPORT:SetPerTcpConnectionEStats=" DLLPATH ".SetPerTcpConnectionEStats") +#pragma comment(linker, "/EXPORT:SetPerTcpConnectionStats=" DLLPATH ".SetPerTcpConnectionStats") +#pragma comment(linker, "/EXPORT:SetSessionCompartmentId=" DLLPATH ".SetSessionCompartmentId") +#pragma comment(linker, "/EXPORT:SetTcpEntry=" DLLPATH ".SetTcpEntry") +#pragma comment(linker, "/EXPORT:SetUnicastIpAddressEntry=" DLLPATH ".SetUnicastIpAddressEntry") +#pragma comment(linker, "/EXPORT:UnenableRouter=" DLLPATH ".UnenableRouter") +#pragma comment(linker, "/EXPORT:UnregisterInterfaceTimestampConfigChange=" DLLPATH ".UnregisterInterfaceTimestampConfigChange") +#pragma comment(linker, "/EXPORT:do_echo_rep=" DLLPATH ".do_echo_rep") +#pragma comment(linker, "/EXPORT:do_echo_req=" DLLPATH ".do_echo_req") +#pragma comment(linker, "/EXPORT:if_indextoname=" DLLPATH ".if_indextoname") +#pragma comment(linker, "/EXPORT:if_nametoindex=" DLLPATH ".if_nametoindex") +#pragma comment(linker, "/EXPORT:register_icmp=" DLLPATH ".register_icmp") \ No newline at end of file diff --git a/windows/win32.vcxproj b/windows/win32.vcxproj new file mode 100644 index 0000000..c988f5c --- /dev/null +++ b/windows/win32.vcxproj @@ -0,0 +1,189 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {8511adc9-ec45-4c37-8936-f4556aa01c97} + win32 + 10.0 + plexmediaserver_crack + + + + DynamicLibrary + true + v143 + Unicode + + + DynamicLibrary + false + v143 + true + Unicode + + + DynamicLibrary + true + v143 + Unicode + + + DynamicLibrary + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + IPHLPAPI + + + IPHLPAPI + + + IPHLPAPI + + + IPHLPAPI + + + true + + + true + + + true + + + true + + + + Level4 + true + WIN32;_DEBUG;PLEXLOADFILEHOOK_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + stdcpplatest + MultiThreadedDebug + true + + + Windows + true + false + /pdbaltpath:%_PDB% %(AdditionalOptions) + $(CoreLibraryDependencies);%(AdditionalDependencies);Dbghelp.lib + + + + + Level4 + true + true + true + WIN32;NDEBUG;PLEXLOADFILEHOOK_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + stdcpplatest + MultiThreaded + true + + + Windows + true + true + true + false + /pdbaltpath:%_PDB% %(AdditionalOptions) + $(CoreLibraryDependencies);%(AdditionalDependencies);Dbghelp.lib + + + + + Level4 + true + _DEBUG;PLEXLOADFILEHOOK_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + stdcpplatest + MultiThreadedDebug + true + + + Windows + true + false + /pdbaltpath:%_PDB% %(AdditionalOptions) + $(CoreLibraryDependencies);%(AdditionalDependencies);Dbghelp.lib + + + + + Level4 + true + true + true + NDEBUG;PLEXLOADFILEHOOK_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + stdcpplatest + MultiThreaded + true + + + Windows + true + true + true + false + /pdbaltpath:%_PDB% %(AdditionalOptions) + $(CoreLibraryDependencies);%(AdditionalDependencies);Dbghelp.lib + + + + + + + + + + + + + + \ No newline at end of file diff --git a/windows/win32.vcxproj.filters b/windows/win32.vcxproj.filters new file mode 100644 index 0000000..b018ae4 --- /dev/null +++ b/windows/win32.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + \ No newline at end of file