Другое С/С++ Вопрос - Ответ

swlm

Участник
47
15
в структуре CNetGame есть указатель на RakClientInterface (pNetGame + 0x2C на R3), можешь от туда его получить и изменять указатель на метод внутри самой вмт. Либо же можешь найти адрес самой функции и хукать ее (samp.dll + 0x34AC0 на R3)
Вот, смотри, я сделал вот так:


C++:
bool Hooks::HookReceive() {
    void** vtable = reinterpret_cast<void**>(AVSSync::getRakClientIntf());
    if (!vtable) {
        return false;
    }

    void* receiveAddr = vtable[9];

    MH_STATUS createStatus = MH_CreateHook(receiveAddr, &HookedReceive, reinterpret_cast<void**>(&originalReceive));
    if (createStatus != MH_OK) {
        return false;
    }

    MH_STATUS enableStatus = MH_EnableHook(receiveAddr);
    if (enableStatus != MH_OK) {
        return false;
    }

    std::cout << "Receive hooked successfully!" << std::endl;
    return true;
}

Это правильно? getRakClientIntf() возвращает указатель на RakClientInterface*
 

вайега52

Налуашил состояние
Модератор
2,985
3,105
Вот, смотри, я сделал вот так:


C++:
bool Hooks::HookReceive() {
    void** vtable = reinterpret_cast<void**>(AVSSync::getRakClientIntf());
    if (!vtable) {
        return false;
    }

    void* receiveAddr = vtable[9];

    MH_STATUS createStatus = MH_CreateHook(receiveAddr, &HookedReceive, reinterpret_cast<void**>(&originalReceive));
    if (createStatus != MH_OK) {
        return false;
    }

    MH_STATUS enableStatus = MH_EnableHook(receiveAddr);
    if (enableStatus != MH_OK) {
        return false;
    }

    std::cout << "Receive hooked successfully!" << std::endl;
    return true;
}

Это правильно? getRakClientIntf() возвращает указатель на RakClientInterface*
Ты на какой версии сампа? Если р3, то receiveAddr - samp.dll должен совпадать 0x34AC0
 

swlm

Участник
47
15
Во, сделал так:
И хук заработал, только как теперь работать с пакетами, когда я пытаюсь получить что-то из пакета, происходит краш.


C++:
bool Hooks::HookReceive() {
    Packet* __fastcall HookedReceive(RakClientInterface__vtable* thisPtr, void* edx) {
        Packet* packet = originalReceive(thisPtr);

        return packet;
    }


    HMODULE sampModule = GetModuleHandleA("samp.dll");
    if (!sampModule) {
        return false;
    }

    // Получаем указатель на рак клиент
    RakClientInterface** rakclient = reinterpret_cast<RakClientInterface**>(AVSSync::getRakClientIntf());
    if (!rakclient) {
        return false;
    }

    DWORD* vTable = *reinterpret_cast<DWORD**>(rakclient);
    LPVOID target = reinterpret_cast<LPVOID>(vTable[8]);

    MH_STATUS createStatus = MH_CreateHook(target, &HookedReceive, reinterpret_cast<void**>(&originalReceive));
    if (createStatus != MH_OK) {
        return false;
    }

    MH_STATUS enableStatus = MH_EnableHook(target);
    if (enableStatus != MH_OK) {
        return false;
    }

    std::cout << "Receive hooked successfully!" << std::endl;
    return true;
}

Ты на какой версии сампа? Если р3, то receiveAddr - samp.dll должен совпадать 0x34AC0
На R3, но нет, не совпадает: 0x5CAF637A
 
Последнее редактирование:

AdCKuY_DpO4uLa

Адский дрочер
Друг
369
811
 

swlm

Участник
47
15
ладно, сделаю тогда на функцию сразу...
 

вайега52

Налуашил состояние
Модератор
2,985
3,105
получить что-то из пакета, происходит краш.
Потому-что эта функция вызывается в бесконечном цикле игры и не морозит основной поток, т.е. если нет пакета для получения, возвращается nullptr (под капотом там обычное получение пакета из потокобезопасной очереди, которая пополняется внутри ракпира). Делай проверку на nullptr и должно работать
 

swlm

Участник
47
15
Потому-что эта функция вызывается в бесконечном цикле игры и не морозит основной поток, т.е. если нет пакета для получения, возвращается nullptr (под капотом там обычное получение пакета из потокобезопасной очереди, которая пополняется внутри ракпира). Делай проверку на nullptr и должно работать
Да, сяб, проверил и всё работает.

Получается этот вариант хука правильный?
C++:
bool Hooks::HookReceive() {
    HMODULE sampModule = GetModuleHandleA("samp.dll");
    if (!sampModule) {
        return false;
    }

    // Получаем указатель на рак клиент
    RakClientInterface** rakclient = reinterpret_cast<RakClientInterface**>(AVSSync::getRakClientIntf());
    if (!rakclient) {
        return false;
    }

    DWORD* vTable = *reinterpret_cast<DWORD**>(rakclient);
    LPVOID target = reinterpret_cast<LPVOID>(vTable[8]);

    MH_STATUS createStatus = MH_CreateHook(target, &HookedReceive, reinterpret_cast<void**>(&originalReceive));
    if (createStatus != MH_OK) {
        return false;
    }

    MH_STATUS enableStatus = MH_EnableHook(target);
    if (enableStatus != MH_OK) {
        return false;
    }

    std::cout << "Receive hooked successfully!" << std::endl;
    return true;
}
 
  • Нравится
Реакции: вайега52

вайега52

Налуашил состояние
Модератор
2,985
3,105
Да, сяб, проверил и всё работает.

Получается этот вариант хука правильный?
C++:
bool Hooks::HookReceive() {
    HMODULE sampModule = GetModuleHandleA("samp.dll");
    if (!sampModule) {
        return false;
    }

    // Получаем указатель на рак клиент
    RakClientInterface** rakclient = reinterpret_cast<RakClientInterface**>(AVSSync::getRakClientIntf());
    if (!rakclient) {
        return false;
    }

    DWORD* vTable = *reinterpret_cast<DWORD**>(rakclient);
    LPVOID target = reinterpret_cast<LPVOID>(vTable[8]);

    MH_STATUS createStatus = MH_CreateHook(target, &HookedReceive, reinterpret_cast<void**>(&originalReceive));
    if (createStatus != MH_OK) {
        return false;
    }

    MH_STATUS enableStatus = MH_EnableHook(target);
    if (enableStatus != MH_OK) {
        return false;
    }

    std::cout << "Receive hooked successfully!" << std::endl;
    return true;
}
Если указатель на ракклиент верный, то да по сути (я минхуком не пользовался, не знаю,умеет ли он в вмт)
 
  • Нравится
Реакции: swlm

swlm

Участник
47
15
Пытаюсь получить координаты локального игрока в мире, но почему-то они постоянно 0.
Что не так?


cpp:
Это R3

CVector* pos = samp->getPos();
printf("x: %f, y: %f, z: %f\n", pos->x, pos->y, pos->z);

uintptr_t* getPlayerEntity() {
    uintptr_t player_pool = getPlayerPool();
    uintptr_t local_info = player_pool + 0x2F14;

    return reinterpret_cast<uintptr_t*>(local_info + 0x2A4);
}

CVector* getPos() {
    uintptr_t* gamePed = getPlayerEntity();
    if (gamePed != nullptr) {
        return reinterpret_cast<CVector*(__thiscall*)(uintptr_t*)>(0x4043A0)(gamePed);
    }

    //return CVector(1.0, 5.0, 10.0);
}

// 0x4043A0
CSimpleTransform *__thiscall CEntity::GetPosition(CEntity *this) - функция в IDA PRO
 

вайега52

Налуашил состояние
Модератор
2,985
3,105
Пытаюсь получить координаты локального игрока в мире, но почему-то они постоянно 0.
Что не так?


cpp:
Это R3

CVector* pos = samp->getPos();
printf("x: %f, y: %f, z: %f\n", pos->x, pos->y, pos->z);

uintptr_t* getPlayerEntity() {
    uintptr_t player_pool = getPlayerPool();
    uintptr_t local_info = player_pool + 0x2F14;

    return reinterpret_cast<uintptr_t*>(local_info + 0x2A4);
}

CVector* getPos() {
    uintptr_t* gamePed = getPlayerEntity();
    if (gamePed != nullptr) {
        return reinterpret_cast<CVector*(__thiscall*)(uintptr_t*)>(0x4043A0)(gamePed);
    }

    //return CVector(1.0, 5.0, 10.0);
}

// 0x4043A0
CSimpleTransform *__thiscall CEntity::GetPosition(CEntity *this) - функция в IDA PRO
Лучше используй псдк, получай CPed* локального игрока через FindPlayerPed() и из него доставай матрицу (вроде даже есть метод GetPosition)
 

swlm

Участник
47
15
Лучше используй псдк, получай CPed* локального игрока через FindPlayerPed() и из него доставай матрицу (вроде даже есть метод GetPosition)
Не могу, у меня проект создан отдельно от plugin-sdk, если я его добавлю в ручную - то он работать не будет
 

вайега52

Налуашил состояние
Модератор
2,985
3,105
Не могу, у меня проект создан отдельно от plugin-sdk, если я его добавлю в ручную - то он работать не будет
Не совсем понял, как это. Ты можешь просто в свой проект подключить plugin-sdk как библиотеку
Пытаюсь получить координаты локального игрока в мире, но почему-то они постоянно 0.
Что не так?


cpp:
Это R3

CVector* pos = samp->getPos();
printf("x: %f, y: %f, z: %f\n", pos->x, pos->y, pos->z);

uintptr_t* getPlayerEntity() {
    uintptr_t player_pool = getPlayerPool();
    uintptr_t local_info = player_pool + 0x2F14;

    return reinterpret_cast<uintptr_t*>(local_info + 0x2A4);
}

CVector* getPos() {
    uintptr_t* gamePed = getPlayerEntity();
    if (gamePed != nullptr) {
        return reinterpret_cast<CVector*(__thiscall*)(uintptr_t*)>(0x4043A0)(gamePed);
    }

    //return CVector(1.0, 5.0, 10.0);
}

// 0x4043A0
CSimpleTransform *__thiscall CEntity::GetPosition(CEntity *this) - функция в IDA PRO
Если getPlayerPool возвращает указатель на пул, то +- такой код (хотя опять же, есть уже все готовое: sampapi):
C++:
Это R3

CVector* pos = samp->getPos();
printf("x: %f, y: %f, z: %f\n", pos->x, pos->y, pos->z);

uintptr_t* getPlayerEntity() {
    uintptr_t player_pool = getPlayerPool();
    uintptr_t local_info = player_pool + 0x2F14;
    uintptr_t* local_player = reinterpret_cast<uintptr_t*>(local_info + 0x26);
    uintptr_t samp_ped = *local_player; // offset 0x0 CPed
    uintptr_t game_ped = samp_ped + 0x2A4;

    return game_ped;
}

CVector* getPos() {
    uintptr_t* gamePed = getPlayerEntity();
    if (gamePed != nullptr) {
        return reinterpret_cast<CVector*(__thiscall*)(uintptr_t*)>(0x4043A0)(gamePed);
    }

    //return CVector(1.0, 5.0, 10.0);
}

// 0x4043A0
CSimpleTransform *__thiscall CEntity::GetPosition(CEntity *this) - функция в IDA PRO
 

swlm

Участник
47
15
Не совсем понял, как это. Ты можешь просто в свой проект подключить plugin-sdk как библиотеку

Если getPlayerPool возвращает указатель на пул, то +- такой код (хотя опять же, есть уже все готовое: sampapi):
C++:
Это R3

CVector* pos = samp->getPos();
printf("x: %f, y: %f, z: %f\n", pos->x, pos->y, pos->z);

uintptr_t* getPlayerEntity() {
    uintptr_t player_pool = getPlayerPool();
    uintptr_t local_info = player_pool + 0x2F14;
    uintptr_t* local_player = reinterpret_cast<uintptr_t*>(local_info + 0x26);
    uintptr_t samp_ped = *local_player; // offset 0x0 CPed
    uintptr_t game_ped = samp_ped + 0x2A4;

    return game_ped;
}

CVector* getPos() {
    uintptr_t* gamePed = getPlayerEntity();
    if (gamePed != nullptr) {
        return reinterpret_cast<CVector*(__thiscall*)(uintptr_t*)>(0x4043A0)(gamePed);
    }

    //return CVector(1.0, 5.0, 10.0);
}

// 0x4043A0
CSimpleTransform *__thiscall CEntity::GetPosition(CEntity *this) - функция в IDA PRO
Проект отдельно от plugin-sdk, это значит что проект у меня совсем в другой директории.
И если я добавлю plugin-sdk как библиотеку - то в проекте появятся какие-то ошибки...
Когда я инклуд plugin.h делаю
 

вайега52

Налуашил состояние
Модератор
2,985
3,105
Проект отдельно от plugin-sdk, это значит что проект у меня совсем в другой директории.
И если я добавлю plugin-sdk как библиотеку - то в проекте появятся какие-то ошибки...
Когда я инклуд plugin.h делаю
Значит неправильно подключаешь)

Если используешь визуалку, то копируешь псдк с гита, запускаешь его инсталлер, ставишь в первом поле путь до папки, где у тебя плагинсдк лежит, потом выбираешь версию визуалки, генерируешь проект, билдишь.

В своём проекте в настройках пишешь путь до .lib файла псдк и до заголовочных файлов
 

swlm

Участник
47
15
Выводило 0, до того, пока код не изменил вот так:


cpp:
uintptr_t* getPlayerEntity() {
    uintptr_t player_pool = getPlayerPool();
    uintptr_t local_info = player_pool + 0x2F14;
    uintptr_t* local_player = reinterpret_cast<uintptr_t*>(local_info + 0x26);
    uintptr_t samp_ped = *local_player;
    uintptr_t game_ped = samp_ped + 0x2A4;

    return &game_ped;
}

CVector* getPos() {
    uintptr_t* gamePed = getPlayerEntity();
    if (gamePed != nullptr) {
        return reinterpret_cast<CVector*(__thiscall*)(uintptr_t*)>(0x4043A0)(gamePed);
    }

    //return CVector(1.0, 5.0, 10.0);
}
И вылет с ошибкой: Память не может быть Read.
А был вот такой код, до момента вылета:


cpp:
[CODE title="cpp"]uintptr_t getPlayerEntity() {
    uintptr_t player_pool = getPlayerPool();
    uintptr_t local_info = player_pool + 0x2F14;
    uintptr_t* local_player = reinterpret_cast<uintptr_t*>(local_info + 0x26);
    uintptr_t samp_ped = *local_player;
    uintptr_t game_ped = samp_ped + 0x2A4;

    return game_ped;
}

CVector* getPos() {
    uintptr_t gamePed = getPlayerEntity();
    if (&gamePed != nullptr) {
        return reinterpret_cast<CVector*(__thiscall*)(uintptr_t)>(0x4043A0)(gamePed);
    }

    //return CVector(1.0, 5.0, 10.0);
}
[/CODE]

Значит неправильно подключаешь)

Если используешь визуалку, то копируешь псдк с гита, запускаешь его инсталлер, ставишь в первом поле путь до папки, где у тебя плагинсдк лежит, потом выбираешь версию визуалки, генерируешь проект, билдишь.

В своём проекте в настройках пишешь путь до .lib файла псдк и до заголовочных файлов
Так всё и сделано, смотри, вот такая конфигурация:


cpp:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|Win32">
      <Configuration>Debug</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|Win32">
      <Configuration>Release</Configuration>
      <Platform>Win32</Platform>
    </ProjectConfiguration>
    <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>17.0</VCProjectVersion>
    <Keyword>Win32Proj</Keyword>
    <ProjectGuid>{ab886c38-1f59-43d8-9935-abe2983b5637}</ProjectGuid>
    <RootNamespace>sampvoice</RootNamespace>
    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v143</PlatformToolset>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>false</UseDebugLibraries>
    <PlatformToolset>v143</PlatformToolset>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <CharacterSet>Unicode</CharacterSet>
    <PreferredToolArchitecture>
    </PreferredToolArchitecture>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>true</UseDebugLibraries>
    <PlatformToolset>v143</PlatformToolset>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
    <ConfigurationType>DynamicLibrary</ConfigurationType>
    <UseDebugLibraries>false</UseDebugLibraries>
    <PlatformToolset>v143</PlatformToolset>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <CharacterSet>Unicode</CharacterSet>
  </PropertyGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
  <ImportGroup Label="ExtensionSettings">
  </ImportGroup>
  <ImportGroup Label="Shared">
  </ImportGroup>
  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <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|Win32'">
    <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)'=='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" />
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <SDLCheck>true</SDLCheck>
      <PreprocessorDefinitions>WIN32;_DEBUG;SAMPVOICE_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <ConformanceMode>true</ConformanceMode>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <EnableUAC>false</EnableUAC>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <SDLCheck>true</SDLCheck>
      <PreprocessorDefinitions>WIN32;NDEBUG;SAMPVOICE_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <ConformanceMode>true</ConformanceMode>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
      <LanguageStandard>stdcpplatest</LanguageStandard>
      <AdditionalIncludeDirectories>C:\plugin-sdk\tools\myplugin-gen\generated\client-npc\RakHook\include;C:\plugin-sdk\tools\myplugin-gen\generated\client-npc\RakHook\out\build\x86-Release\_deps\cyanide-src\include;C:\plugin-sdk\tools\myplugin-gen\generated\client-npc\RakHook\out\build\x86-Release\_deps\polyhook-src\zydis\src;C:\plugin-sdk\tools\myplugin-gen\generated\client-npc\RakHook\out\build\x86-Release\_deps\polyhook-src;C:\plugin-sdk\tools\myplugin-gen\generated\client-npc\RakHook\out\build\x86-Release\_deps\polyhook-src\polyhook2;C:\plugin-sdk\tools\myplugin-gen\generated\client-npc\RakHook\out\build\x86-Release\_deps\polyhook-src\sources;C:\plugin-sdk\tools\myplugin-gen\generated\client-npc\RakHook\out\build\x86-Release\_deps\polyhook-src\zydis\include;C:\plugin-sdk\tools\myplugin-gen\generated\client-npc\RakHook\out\build\x86-Release\_deps\polyhook-src\zydis\include\Zydis;C:\plugin-sdk\tools\myplugin-gen\generated\client-npc\RakHook\out\build\x86-Release\_deps\xbyak-src;C:\plugin-sdk\tools\myplugin-gen\generated\client-npc\RakHook\out\build\x86-Release\_deps\xbyak-src\xbyak;C:\plugin-sdk\tools\myplugin-gen\generated\client-npc\RakHook\out\build\x64-Debug\_deps\polyhook-src\zydis\dependencies\zycore\include;C:\plugin-sdk\tools\myplugin-gen\generated\client-npc\RakHook\out\build\x64-Debug\_deps\polyhook-src\zydis\msvc;C:\portaudio-master\include;C:\Users\swlm\Desktop\MinHook\include;C:\opus-main\include;C:\Users\swlm\Desktop\basic-template;C:\Users\swlm\Desktop\basic-template\pawn\source;C:\Users\swlm\Desktop\basic-template\pawn\source\linux;C:\Users\swlm\Desktop\basic-template\sdk\include;C:\Users\swlm\Desktop\basic-template\sdk\lib\glm\glm\..;C:\Users\swlm\Desktop\basic-template\sdk\lib\robin-hood-hashing\src\include;C:\Users\swlm\Desktop\basic-template\sdk\lib\span-lite\include;C:\Users\swlm\Desktop\basic-template\sdk\lib\string-view-lite\include;$(PLUGIN_SDK_DIR)\shared;$(PLUGIN_SDK_DIR)\shared\game;$(PLUGIN_SDK_DIR)\plugin_SA;$(PLUGIN_SDK_DIR)\plugin_SA\game_SA;$(PLUGIN_SDK_DIR)\plugin_SA\game_SA\rw;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
      <BufferSecurityCheck>true</BufferSecurityCheck>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <EnableUAC>false</EnableUAC>
      <AdditionalLibraryDirectories>C:\plugin-sdk\output\lib;C:\opus-main\out\build\x86-Release\Release;C:\Users\swlm\Desktop\minhook\build\VC17\lib\Release;C:\portaudio-master\out\build\x86-Release\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
      <AdditionalDependencies>plugin.lib;rakhook.lib;PolyHook_2.lib;cyanide.lib;Zydis.lib;Zycore.lib;portaudio.lib;opus.lib;libMinHook.x86.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;comdlg32.lib;advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <SDLCheck>true</SDLCheck>
      <PreprocessorDefinitions>_DEBUG;SAMPVOICE_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <ConformanceMode>true</ConformanceMode>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <EnableUAC>false</EnableUAC>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <ClCompile>
      <WarningLevel>Level3</WarningLevel>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <SDLCheck>true</SDLCheck>
      <PreprocessorDefinitions>NDEBUG;SAMPVOICE_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <ConformanceMode>true</ConformanceMode>
      <PrecompiledHeader>Use</PrecompiledHeader>
      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <EnableUAC>false</EnableUAC>
    </Link>
  </ItemDefinitionGroup>
  <ItemGroup>
    <ClInclude Include="AVSSync\AVSSyncClient.hpp" />
    <ClInclude Include="BitStream.h" />
    <ClInclude Include="AVSSync\raknet\RakClient.h" />
    <ClInclude Include="CAudio.h" />
    <ClInclude Include="CCodec.h" />
    <ClInclude Include="CMultiplayer.h" />
    <ClInclude Include="dllmain.h" />
    <ClInclude Include="framework.h" />
    <ClInclude Include="Hooks.h" />
    <ClInclude Include="pch.h" />
  </ItemGroup>
  <ItemGroup>
    <ClCompile Include="BitStream.cpp" />
    <ClCompile Include="CAudio.cpp" />
    <ClCompile Include="CMultiplayer.cpp" />
    <ClCompile Include="dllmain.cpp" />
    <ClCompile Include="Hooks.cpp" />
    <ClCompile Include="pch.cpp">
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
    </ClCompile>
  </ItemGroup>
  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
  <ImportGroup Label="ExtensionTargets">
  </ImportGroup>
</Project>