Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
3 / 3 / 1
Регистрация: 05.05.2013
Сообщений: 143
1

Перевод из C++ на PureBasic

26.09.2014, 13:22. Просмотров 659. Ответов 11
Метки нет (Все метки)

В общем, написал в свой раздел, там никто ничего не говорит толкового. Решил обратиться сюда
Задача такая: Как можно подробнее описать, что делается в коде. В общем, прокомментировать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include 
#include 
#pragma comment(lib,"d3dx9.lib")
 
typedef IDirect3D9* (__stdcall *DIRECT3DCREATE9)(unsigned int);   <-----!!!
typedef long (__stdcall *PRESENT9)(IDirect3DDevice9* self, const RECT*, const RECT*, HWND, void*);   <-----!!!
 
PRESENT9 g_D3D9_Present = 0;
BYTE g_codeFragment_p9[5] = {0, 0, 0, 0, 0};   <-----!!!
BYTE g_jmp_p9[5] = {0, 0, 0, 0, 0};   <-----!!!
DWORD g_savedProtection_p9 = 0;
DWORD present9 = 0;
bool indicator = 0;
D3DRECT rec = {10, 10, 120, 30};   <-----!!!
ID3DXFont *m_font = 0;
RECT fontRect = {10, 15, 120, 120};   <-----!!!
D3DCOLOR bkgColor = 0;
D3DCOLOR fontColor = 0;
 
void DrawIndicator(void* self)
{
        IDirect3DDevice9* dev = (IDirect3DDevice9*)self;
        dev->BeginScene(); 
  D3DXCreateFont(dev, 12, 0, FW_BOLD, 0, 0, 1, 0, 0, 0 | FF_DONTCARE, TEXT("Arial"), &m_font);  
  if(indicator)
  {
   bkgColor = D3DCOLOR_XRGB(0, 0, 255);
   fontColor = D3DCOLOR_XRGB(0, 255, 255);
  }
  else
  {
   bkgColor = D3DCOLOR_XRGB(255, 0, 0);
   fontColor = D3DCOLOR_XRGB(255, 0, 0);
  }
        dev->Clear(1, &rec, D3DCLEAR_TARGET, bkgColor, 1.0f, 0);
  m_font->DrawText(0, "keng.gamehacklab.ru", -1, &fontRect, 0, fontColor);
        dev->EndScene();
}
 
void GetDevice9Methods()
{
 HWND hWnd = CreateWindowA("STATIC","dummy", 0, 0, 0, 0, 0, 0, 0, 0, 0);
 HMODULE hD3D9 = LoadLibrary("d3d9");
 DIRECT3DCREATE9 Direct3DCreate9 = (DIRECT3DCREATE9)GetProcAddress(hD3D9, "Direct3DCreate9");
 IDirect3D9* d3d = Direct3DCreate9(D3D_SDK_VERSION);
    D3DDISPLAYMODE d3ddm;
    d3d->GetAdapterDisplayMode(0, &d3ddm);
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = 1;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = d3ddm.Format;
 IDirect3DDevice9* d3dDevice = 0;
    d3d->CreateDevice(0, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3dDevice);
 DWORD* vtablePtr = (DWORD*)(*((DWORD*)d3dDevice));   <-----!!!
 present9 = vtablePtr[17] - (DWORD)hD3D9;   <-----!!!
 d3dDevice->Release();
 d3d->Release();
 FreeLibrary(hD3D9);
 CloseHandle(hWnd);
}
 
long __stdcall HookedPresent9(IDirect3DDevice9* self, const RECT* src, const RECT* dest, HWND hWnd, void* unused)
{
 BYTE* codeDest = (BYTE*)g_D3D9_Present;   <-----!!!
 codeDest[0] = g_codeFragment_p9[0];   <-----!!!
 *((DWORD*)(codeDest + 1)) = *((DWORD*)(g_codeFragment_p9 + 1));   <-----!!!
 DrawIndicator(self);
 DWORD res = g_D3D9_Present(self, src, dest, hWnd, unused);   <-----!!!
 codeDest[0] = g_jmp_p9[0];   <-----!!!
 *((DWORD*)(codeDest + 1)) = *((DWORD*)(g_jmp_p9 + 1));   <-----!!!
 return res;
}
 
void HookDevice9Methods()
{
 HMODULE hD3D9 = GetModuleHandle("d3d9.dll");
 g_D3D9_Present = (PRESENT9)((DWORD)hD3D9 + present9);   <-----!!!
 g_jmp_p9[0] = 0xE9;
 DWORD addr = (DWORD)HookedPresent9 - (DWORD)g_D3D9_Present - 5;   <-----!!!
 memcpy(g_jmp_p9 + 1, &addr, sizeof(DWORD));   <-----!!!
 memcpy(g_codeFragment_p9, g_D3D9_Present, 5);   <-----!!!
 VirtualProtect(g_D3D9_Present, 8, PAGE_EXECUTE_READWRITE, &g_savedProtection_p9);   <-----!!!
 memcpy(g_D3D9_Present, g_jmp_p9, 5);   <-----!!!
}
 
DWORD __stdcall TF(void* lpParam)
{
 GetDevice9Methods();
 HookDevice9Methods();
 return 0;
}
 
DWORD __stdcall KeyboardHook(void* lpParam)
{
        while(1)
        {
                if(GetAsyncKeyState(VK_F1))   
                {
                        indicator = !indicator;
                        Beep(500,200);
                }
                Sleep(100);
        }     
        return 0;
}
 
int __stdcall DllMain(HINSTANCE hInst, DWORD  ul_reason_for_call, void* lpReserved)
{
        switch (ul_reason_for_call)   
        {
        case DLL_PROCESS_ATTACH:
   CreateThread(0, 0, &TF, 0, 0, 0);
   CreateThread(0, 0, &KeyboardHook, 0, 0, 0);
        }
        return 1;
}
Вот код. Там, где мне требуются объяснения, я пометил знаком "<-----!!!"
Огромное спасибо!)
З.Ы. с D3D я разобрался.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.09.2014, 13:22
Ответы с готовыми решениями:

Перевод структуры PureBasic на Си
Помогите плз, пришлось взяться за си и в Pelles C создавать библиотеку для приложения написанного...

PureBasic 4.60
Пару дней назад вышла версия 4.60. Демо версии можно скачать на официальном сайте...

PureBasic
Есть такая замечательная разновидность диалекта бейсика именуемая PureBasic. Сайт разработчика...

Purebasic 5.0 + html
Как использовать PB в web разработке ? Возможно ли применить его вместо JS и PHP ? Откликнитесь...

11
20 / 20 / 4
Регистрация: 23.10.2009
Сообщений: 139
26.09.2014, 13:25 2
А название темы как соотносится с её содержанием?
0
3 / 3 / 1
Регистрация: 05.05.2013
Сообщений: 143
26.09.2014, 15:01  [ТС] 3
Цитата Сообщение от gustav21 Посмотреть сообщение
А название темы как соотносится с её содержанием?

Я выполняю перевод из плюсов на PB, от вас прошу лишь помощи в объяснении содержания кода
0
20 / 20 / 4
Регистрация: 23.10.2009
Сообщений: 139
26.09.2014, 15:48 4
А РВ - это что?
0
3 / 3 / 1
Регистрация: 05.05.2013
Сообщений: 143
26.09.2014, 16:02  [ТС] 5
Цитата Сообщение от gustav21 Посмотреть сообщение
А РВ - это что?
PB-PureBasic
http://www.purebasic.com/
0
3 / 3 / 1
Регистрация: 05.05.2013
Сообщений: 143
29.09.2014, 14:42  [ТС] 6
Тема актуальна, всё ещё прошу помощи!)
0
3 / 3 / 1
Регистрация: 05.05.2013
Сообщений: 143
01.10.2014, 16:57  [ТС] 7
Неужели я не дождусь помощи? Ведь я, мне кажется, не такое уж и сложное прошу сделать дело...
0
Модератор
3465 / 2591 / 738
Регистрация: 19.09.2012
Сообщений: 7,953
01.10.2014, 17:32 8
Цитата Сообщение от mcleshiy Посмотреть сообщение
не такое уж и сложное прошу сделать дело
Тогда чего сам до сих пор не сделал?
0
3 / 3 / 1
Регистрация: 05.05.2013
Сообщений: 143
01.10.2014, 17:38  [ТС] 9
Вообще, в пару местах я уже разобрался, в некоторых только догадки. Синтаксис С++ не знаю вообще, поэтому и обратился сюда. Если в ближайшую неделю не получу помощи, придется, видимо, начать плюсики учить...
0
Форумчанин
Эксперт CЭксперт С++
8148 / 4998 / 1436
Регистрация: 29.11.2010
Сообщений: 13,460
01.10.2014, 18:43 10
Тут мало что чисто плюсового, сплошной WinAPI.
За докой в msdn.
Синтаксис WinAPI мало зависит от ЯП.
0
Студент
120 / 131 / 39
Регистрация: 07.04.2011
Сообщений: 503
01.10.2014, 18:57 11
Цитата Сообщение от mcleshiy Посмотреть сообщение
начать плюсики учить...
Скорее winapi и asm.

Цитата Сообщение от mcleshiy Посмотреть сообщение
DWORD* vtablePtr = (DWORD*)(*((DWORD*)d3dDevice)) ;
Адресс виртуальной таблици обьекта.
Таблица виртуальных методов

Цитата Сообщение от mcleshiy Посмотреть сообщение
present9 = vtablePtr[17] - (DWORD)hD3D9; <-----!!!
Смещение виртуального метода относительно его обьекта:
Метод: STDMETHOD(Reset)(THIS_ D3DPRESENT_PARAM ETERS* pPresentationParameters) PURE;

Цитата Сообщение от mcleshiy Посмотреть сообщение
BYTE g_codeFragment_p9[5] = {0, 0, 0, 0, 0}; <-----!!!
Орыгинальные начальные 5 байт, метода Reset.

Цитата Сообщение от mcleshiy Посмотреть сообщение
BYTE g_jmp_p9[5] = {0, 0, 0, 0, 0}; <-----!!!
{0xE9, 0, 0, 0, 0} -
0xE9 - комнда jmp для процессора.
4 ноля это относительное смещение куда джампиться, тоесть на функцию перехватичик, будет вставлено в начало метода Reset. (Google: перехват методом сплайсинга).

Цитата Сообщение от mcleshiy Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
long __stdcall HookedPresent9(IDirect3DDevice9* self, const RECT* src, const RECT* dest, HWND hWnd, void* unused) 
{ 
  BYTE* codeDest = (BYTE*)g_D3D9_Present; <-----!!! 
  codeDest[0] = g_codeFragment_p9[0]; <-----!!! 
  *((DWORD*)(codeDest + 1)) = *((DWORD*)(g_codeFragment_p9 + 1)); <-----!!! 
  DrawIndicator(self); 
  DWORD res = g_D3D9_Present(self, src, dest, hWnd, unused); <-----!!! 
  codeDest[0] = g_jmp_p9[0]; <-----!!! 
  *((DWORD*)(codeDest + 1)) = *((DWORD*)(g_jmp_p9 + 1)); <-----!!! return res; 
}
Функция перехватчик, куда перекинет jmp. Выполняется перехват, востанавливаються орыгинальные 5 байт, вызываеться метод заного уже без перехватчика, потом перехват устанавливаеться опять.

Цитата Сообщение от mcleshiy Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
void HookDevice9Methods() 
{ 
  HMODULE hD3D9 = GetModuleHandle("d3d9.dll"); 
  g_D3D9_Present = (PRESENT9)((DWORD)hD3D9 + present9); <-----!!!
  g_jmp_p9[0] = 0xE9; 
  DWORD addr = (DWORD)HookedPresent9 - (DWORD)g_D3D9_Present - 5; <-----!!! 
  memcpy(g_jmp_p9 + 1, &addr, sizeof(DWORD)); <-----!!! 
  memcpy(g_codeFragment_p9, g_D3D9_Present, 5); <-----!!! 
  VirtualProtect(g_D3D9_Present, 8, PAGE_EXECUTE_READWRITE, &g_savedProtection_p9); <-----!!! 
  memcpy(g_D3D9_Present, g_jmp_p9, 5); <-----!!! 
}
Тута устанавливаеться перехватчик на наш виртуальный 17 метод(Reset походу). Сохраняются орыгинальные 5 байт, устанавливаються атрибуты памяти для записи, записываеться перехватчик.
1
4292 / 1414 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
02.10.2014, 01:20 12
mcleshiy, правилами не пренебрегаем, кросспостинг запрещен. Тема закрыта.
Изначальная находится здесь.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.10.2014, 01:20

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Purebasic vs Blitz3D
Ваше мнение. p.s. как тут опрос создать :O

lib от PureBasic
Задача: есть lib, созданная в PureBasic'e. Известны функции, количество параметров в каждой из них....

Sound в PureBasic
Приветствую всех. Когда-то, очень давно, на cyberforum была моя тема о выборе бейсика для...

Учебник по purebasic
Подскажите где можно скачать хороший учебник с примерами по Purebasic. Ну или посоветуйте хороший...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.