Top.Mail.Ru
Ответы

Аргумент типа "WCHAR *" несовместим с параметром типа "const char *"

Мне нужен был инжектор, я скопировал код вставил и у меня ошибка " Аргумент типа "WCHAR *" несовместим с параметром типа "const char *" ", вот код:
#define DARWIN_INJECTOR_RUSTCLIENT
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>

DWORD get_proc_id(const char* proc_name)
{
DWORD proc_id = 0;
auto* const h_snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if (h_snap != INVALID_HANDLE_VALUE)
{
PROCESSENTRY32 proc_entry;
proc_entry.dwSize = sizeof(proc_entry);

if (Process32First(h_snap, &proc_entry))
{
do
{
if (!_stricmp(proc_entry.szExeFile, proc_name))
{
proc_id = proc_ entry.th 32ProcessID;
break;
}
} while (Process32Next(h_snap, &proc_entry));
}
}

CloseHandle(h_snap);
return proc_id;
}

int main()
{
const char* dll_path = R"(D:\LaffisServer\console.dll)";//Сюда имя dll
const char* proc_name = "RustClient.exe"; // Процесс игры
DWORD proc_id = 0;

while (!proc_id)
{
proc_id = get_proc_id(proc_name);
Sleep(30);
}

auto* const h_proc = OpenProcess(PROCESS_ALL_ACCESS, 0, proc_id);

if (h_proc && h_proc != INVALID_HANDLE_VALUE)
{
const LPVOID nt_open_file = GetProcAddress(LoadLibraryW(L"ntdll"), "NtOpenFile");//ggez
if (nt_open_file)
{
char original_bytes[5];
memcpy(original_bytes, nt_open_file, 5);
WriteProcessMemory(h_proc, nt_open_file, original_bytes, 5, nullptr);
}

auto* loc = VirtualAllocEx(h_proc, nullptr, MAX_PATH, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
WriteProcessMemory(h_proc, loc, dll_path, strlen(dll_path) + 1, nullptr);
auto* const h_thread = CreateRemoteThread(h_proc, nullptr, 0, reinterpret_cast<LPTHREAD_START_ROUTINE>(LoadLibraryA), loc, 0, nullptr);

if (h_thread) CloseHandle(h_thread);
}

if (h_proc) CloseHandle(h_proc);
return 0;
}

По дате
По рейтингу
Аватар пользователя
Новичок

WCHAR это wchar_t

char имеет размер 1 байт
wchar_t 2 байта, в особенных случаях 1 или более 2х. Поэтому microsoft использует свои имена, WCHAR точно будет равен 2х байтам.

если напишем две строки

const char * str1 = "Zhopa";
const wchar_t * str2 = L"Zhopa";

то в памяти str2 будет выглядеть так (если sizeof(wchar_t) = 2 байта)
Z0h0o0p0a000
потому что каждый символ 2 байта. символы типа цифр, базовой латиницы и основных знаков типа точки с запятой кодируются 1м байтом, поэтому второй байт будет нулём.
Соответственно, сделать преобразование char в wchar_t и обратно строки в которой нет двухбайтовых символов элементарно

12345678
 const char* stra = "Zhopa";
wchar_t strw[100];
for(int i = 0; i < 100; ++i)
    strw[i]=0;

int zhopa_len = strlen(stra);
for(int i = 0; i < zhopa_len; ++i)
    strw[i] = (wchar_t)stra[i]; 


Если у тебя многобайтовые строки, то используй функции WideCharToMultiByte и MultiByteToWideChar
Используй обычные массивы достаточного размера, ненадо выделять освобождать память.

Аватар пользователя
Высший разум

типу WCHAR* соответствует тип const wchar_t*