Перейти к содержанию

directx c++ Visual Studio 2012


Рекомендуемые сообщения

Не судите строго изучаю directx 3 недели, с чужих исходов естественно.

Собственно задача:

1. Прочитать память из другой программы , определенный адрес(адрес с моими патронами)

2. Вывести значение этого адреса в моё directх приложение(пример с фрапсом)

Смысл в том , чтобы постоянно рисовать значение адреса с патронами . Как фрапс рисует значение ФПС.

Начну с исходного кода , думаю так будет понятнее:

1.Получаем хендл на другой процесс(код не нужен думаю)

2.Читаем память другого процесса,возвращаем значение ввиде байт(использовал код "Кодера")

byte* ReadMemory (DWORD address , DWORD size , DWORD pID)
{
static byte* bytes = new byte [size];
HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS , false , pID);
ReadProcessMemory(hProcess , (void*)address , bytes , size , NULL);
CloseHandle (hProcess);
return bytes;

}

3.Создаем буффер

Код:

WCHAR buffer [32];

4. Функция вывода текста(основная функция с аргументами,если нужен весь код я сброшу)

void PrintText(char pString[], int x, int y, D3DCOLOR col, ID3DXFont *font)
{
RECT FontRect = { x, y, x+500, y+30 };
font->DrawText( NULL, pString, -1, &FontRect, DT_LEFT | DT_WORDBREAK, col);
}

5. Вывод текста(правильно или нет судите сами , скорее всего нет)

void TestThread()
{
PrintText("вот тут нужно вывести значение адреса как это сделать?",10, 150, SKYBLUE, dMenu.pFont);

}

6. Выводится только текст L"%f" - не катит , в основной функции замена аргуметов

void PrintText(char pString[], int x, int y, D3DCOLOR col, ID3DXFont *font)
{
RECT FontRect = { x, y, x+500, y+30 };
font->DrawText( NULL, pString, -1, &FontRect, DT_LEFT | DT_WORDBREAK, col);
}

на

void PrintText(buffer, int x, int y, D3DCOLOR col, ID3DXFont *font)
{
RECT FontRect = { x, y, x+500, y+30 };
font->DrawText( NULL, buffer, -1, &FontRect, DT_LEFT | DT_WORDBREAK, col);
}

не катит, как решить задачу?

Ссылка на комментарий
Поделиться на другие сайты

текст нужно еще отформатировать с помощью wsprintf, передав ей необходимое значение.

если вам не трудно помогите с исходным кодом - у меня не получается форматировать текст и задать ему значение буфера

Нужно задать дополнительные параметры pString ??? что-то типа Pstring(buffer , pID , .....) или как?

void PrintText(char pString[], int x, int y, D3DCOLOR col, ID3DXFont *font)
{
RECT FontRect = { x, y, x+500, y+30 };
font->DrawText( NULL, pString, -1, &FontRect, DT_LEFT | DT_WORDBREAK, col);
}

Ссылка на комментарий
Поделиться на другие сайты


void PrintText(int x, int y, D3DCOLOR col, LPD3DXFONT pFont, const char *pString, ...)
{
char buf[1024];
RECT FontRect = { x, y, x+500, y+30 };
va_list vaList;

va_start(vaList, pString);
vsprintf_s(buf, pString, vaList);
va_end(vaList);

pFont->DrawText( NULL, buf, -1, &FontRect, DT_LEFT | DT_WORDBREAK, col);
}

........
PrintText(x, y, color, pFont, "0x%X", pFont);

Ссылка на комментарий
Поделиться на другие сайты



Друг не ругайся на меня сильно, но я не пойму ход мыслей твоих , так еще не совсем опытен в с++ , прошу отнестись адыкватно и объяснить как вывести значение адреса в формате флоат, не всего буфера а только нужного мне адреса , я запутался совсем.



void PrintText(int x(позиция Х), int y(позиция У), D3DCOLOR col(цвет), LPD3DXFONT pFont(текст), const char *pString(сама строка,зачем константное значение не пойму ), ...)
{
char buf[1024];(выделяем буффер)
RECT FontRect = { x, y, x+500, y+30 };(отрисовка)
va_list vaList;(не пойму для чего это - скорее всего для передачи необходимого значения строке)

va_start(vaList, pString);(аргументы : сам ва-лист и строка)
vsprintf_s(buf, pString, vaList);(настройки строки получается, что мы выводим: буфер , строка )
va_end(vaList);(тут ясно)

pFont->DrawText( NULL, buf, -1, &FontRect, DT_LEFT | DT_WORDBREAK, col); (что мы рисуем : ну тут главное буфер)
}

........
PrintText(x(позиция Х), y(позиция У), color(цвет), pFont(понятно), "0x(текст)%X(вот тут получается, выводит весь буфер, в формате целого числа, а как вывести не весь буфер а адрес нужный мне)");

читаю память я способом Кодера

byte* ReadMemory (DWORD address , DWORD size , DWORD pID)
{
static byte* bytes = new byte [size];
HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS , false , pID);
ReadProcessMemory(hProcess , (void*)address , bytes , size , NULL);
CloseHandle (hProcess);
return bytes;

}

может нужно как ни буть приравнять

char buf = 

я запутался...

Ссылка на комментарий
Поделиться на другие сайты

Если не ленится и поискать, можно найти ответы на все ваши вопросы. :)

"0x(текст)%X(вот тут получается, выводит весь буфер, в формате целого числа, а как вывести не весь буфер а адрес нужный мне)"


PrintText(x, y, color, pFont, "Font = 0x%X", pFont); //Выводит адрес "pFont"-а в hex виде..

Ссылка на комментарий
Поделиться на другие сайты

Если не ленится и поискать, можно найти ответы на все ваши вопросы. :)


PrintText(x, y, color, pFont, "Font = 0x%X", pFont); //Выводит адрес "pFont"-а в hex виде..

Друг или ты меня не поймешь или я тупой сильно (скорее всего), вот смотри что у меня получается , поправь , если я не правильно что-то закомментирую.

void PrintText2(int x, int y, D3DCOLOR col, LPD3DXFONT pFont, const char *pString2 )   -   параметры функции вывода текста в моё меню:" х, у, цвет, вывод шрифта по-моему , сама строка в ввиде чар"
{

char buf[1024]; - буффер
DWORD pID = GetProcessByName("Game.exe"); я получил хендл на нужный мне процесс(это не полный код)

RECT FontRect = { x, y, x+500, y+30 }; - не помню для чего это
va_list vaList;
va_start(vaList, pString2);
vsprintf_s(buf, pString2, vaList);
va_end(vaList);
вот это я вообще не пойму зачем , объясни пожалуйста
pFont->DrawText( NULL, buf, -1, &FontRect, DT_LEFT | DT_WORDBREAK, col); - рисование текста , аргументы: нул, буффер , автозаполнение(непомню чего), ссылка на FontRect , не знаю что это , цвет.
}

затем мы водим текст с заданными параметрами

PrintText2(10, 150, SKYBLUE,dMenu.pFont, " патроны %X"); - х , у , цвет , вот тут не понятно , где "патроны"	выводит текст в формате чар, где "%Х" выводит весь буфер в формате хекс, а мне необходимо , чтобы где по-колхозному говоря "%Х" постоянно выводило значение моего адреса (0х1652587) патрон

Читаю чужую программу , получаем ammo(значение адреса патронов)

byte* ReadMemory (DWORD address , DWORD size , DWORD pID)
{
static byte* bytes = new byte [size];
HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS , false , pID);
ReadProcessMemory(hProcess , (void*)address , bytes , size , NULL);
CloseHandle (hProcess);
return bytes;

}
DWORD ammo = 0;
byte* ammoBytes = ReadMemory (0x01668084 , sizeof(DWORD) , pID);

p.s. почему я не могу тебя отблагодарить - пишет лимит исчерпан,хотя я не кому "спасибо" не ставил

Ссылка на комментарий
Поделиться на другие сайты

Из MSDN


va_list vaList; //Variable argument list
va_start(vaList, pString2); //Initialize variable arguments
vsprintf_s(buf, pString2, vaList); //Write formatted output using a pointer to the list of arguments
va_end(vaList); //Reset variable arguments.


PrintText2(10, 150, SKYBLUE,dMenu.pFont, "Адрес патронов = 0x%X\nКоличество патронов = %d", ammoAddress/*Буффер 1*/, ammoValue/*Буффер 2*/);

Ссылка на комментарий
Поделиться на другие сайты

Из MSDN


va_list vaList; //Variable argument list
va_start(vaList, pString2); //Initialize variable arguments
vsprintf_s(buf, pString2, vaList); //Write formatted output using a pointer to the list of arguments
va_end(vaList); //Reset variable arguments.


PrintText2(10, 150, SKYBLUE,dMenu.pFont, "Адрес патронов = 0x%X\nКоличество патронов = %d", ammoAddress/*Буффер 1*/, ammoValue/*Буффер 2*/);

Правильно я понимаю? в %Х будет отображаться буфер 1 в хексе , а в %d будет отображаться буфер 2 в целых числах?

прочитал адрес и его значение и всунул во второй буффер (ammoBytes - значения адреса патронов) тут все нормально , но в первый буффер я вообще ничего не могу всунуть , постоянно пишет много аргументов (to many arguments in function call) , что я неправильно делаю?

byte* ReadMemory (DWORD address , DWORD size , DWORD pID)
{
static byte* bytes = new byte [size];
HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS , false , pID);
ReadProcessMemory(hProcess , (void*)address , bytes , size , NULL);
CloseHandle (hProcess);
return bytes;

}
DWORD ammo = 0;
byte* ammoBytes = ReadMemory (0x01668084 , sizeof(DWORD) , pID);

Ссылка на комментарий
Поделиться на другие сайты

Правильно я понимаю? в %Х будет отображаться буфер 1 в хексе , а в %d будет отображаться буфер 2 в целых числах?

Правильно...

прочитал адрес и его значение и всунул во второй буффер (ammoBytes - значения адреса патронов) тут все нормально , но в первый буффер я вообще ничего не могу всунуть , постоянно пишет много аргументов (to many arguments in function call) , что я неправильно делаю?

Твоя ошибка - "toо many arguments in function call"))

Ссылка на комментарий
Поделиться на другие сайты

Правильно...

Твоя ошибка - "toо many arguments in function call"))

это я понял - я сокращал колличество аргументов и все равно такая же проблема

PrintText2(10, 150, SKYBLUE,dMenu.pFont, "Количество патронов = %d",ammoBytes);

Ссылка на комментарий
Поделиться на другие сайты

Проверь аргументы функции PrintText2..

void PrintText2(int x, int y, D3DCOLOR col, LPD3DXFONT pFont, const char *pString2 )

- позиция х,у,цвет,шрифт, и строка с символами чар - не пойму на что ты намекаешь друг, добавлять еще аргумент не получается, добавить аргумент в va_list тоже , голова кругом идет ...

Ссылка на комментарий
Поделиться на другие сайты

Необходимо подсчитать и вывести на экран FPS в моём directx меню, помогите с исходным кодом разобраться

нашел какой-никой исходник, работает он конечно некорректно,помогите его доработать:

DWORD FrameCnt; // кол-во кадров

float TimeElapsed; // промежуток времени

float FPS; // наш фпс

float oldTime;

float newTime;

float deltatime;

FrameCnt++; // c каждым кадром увеличивается на 1, т.е. это кол-во кадров кот. мы разделим на промежуток времени

newTime = GetTickCount(); // записываем в ньютайм время после всех выполненных операциях

deltatime = newTime - oldTime; // узнаем сколько времени проходит от начала до конца

TimeElapsed += deltatime; // и прибавляем эту разницу к таймэлапседу

if(TimeElapsed >= 500.0) // если в таймэлапседе накопилось 0.5 сек, то

{

FPS = 1000*(float)FrameCnt / TimeElapsed; // делим кол-во кадров прошедшее за полсекунды на таймэлапсед(равный примерно 0.5 сек)

TimeElapsed = 0.0f; // обнуляем таймэлапсед, для следующего подсчета

FrameCnt = 0; // и обнуляем кол-во кадров

}

p.s. украл с киберфорума

Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...

Разобрался - расскажи другим, возможно, на форуме появятся люди, у которых возникнет такая же проблема. И да, хороший рассказ подразумевает плюс в репутацию, и, возможно, не только...

Ссылка на комментарий
Поделиться на другие сайты

Разобрался - расскажи другим, возможно, на форуме появятся люди, у которых возникнет такая же проблема. И да, хороший рассказ подразумевает плюс в репутацию, и, возможно, не только...

а скайп? :-D

А по делу вот что:

void PrintText(int x, int y, D3DCOLOR col, LPD3DXFONT pFont, const char *pString2, ... ) // создаем функцию,которая ничего не возвращает типа "void" , рассмотрим переменные
int x , int y - координаты,то есть расположения текста на экране
D3DCOLOR col - переменная col - сдесь мы устанавливаем цвет текста,это уже отдельная тема , требующая более подробного и углубленного описания
LPD3DXFONT pFont - где мы рисуем , LPD3DXFONT , это уже отдельная тема , требующая более подробного и углубленного описания
const char *pString2 - что мы выводим на экран , какую информацию и в каком формате
{
char buf[1024]; - создаем буфер , чтобы наверняка уже размером 1024 байт
RECT FontRect = { x, y, x+800, y+50 }; - это область применеия текста , то есть за границами указанных параметров текст отображаться не будет ,RECT - это уже отдельная тема , требующая более подробного и углубленного описания
======================================================================================================================================
собственно переходим к функции которая и позволяет нам выводить информацию в любом формате , будь то адрес или значение адреса
va_list vaList; - создаем аргумент для va_list
va_start(vaList, pString2); инициализируем наш аргумент в переменной "pString2"
vsprintf_s(buf, pString2, vaList); - о функции vsprintf_s нужно говорить отдельно , в кратце она необходима для вывода информации на экран
какие аргументы она принимает : buf - наш буфер , куда мы кладем то что хотим вывести на экран
va_end(vaList);
pFont->DrawText( NULL, buf, -1, &FontRect, DT_LEFT | DT_WORDBREAK, col); - это параметры вывода текста,нужно разбирать отдельно
}

Ссылка на комментарий
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.