Сейчас на форуме: UniSoft, bartolomeo (+6 невидимых)

 eXeL@B —› Программирование —› Помогите подправить C++ исходники.
Посл.ответ Сообщение


Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 16 января 2011 04:12
· Личное сообщение · #1

Здравствуйте!
Прошу помощь потому, что в Си и С++ я полный ноль и не знаю даже синтаксиса. Не могу понять принципа работы который заложен в исходниках иначе попытался бы повторить это на Delphi.
Существует проблема с работой старых игрушек на nvidia картах. По английски это звучит так: Starting with the Geforce 8XXX series nVidia introduced a bug in their DirectDraw implementation. This can be seen in most games as black boxes around sprites.
DLL исходники которой доступны тут подменяет вызов DirectDrawCreate и исправляет этот баг. Разумеется игра должна обращаться к nvddf.dll а не к ddraw.dll
Моя проблема в том, что нужная мне программа использует DirectDrawCreateEx, а эта функция в библиотеке не экспортируется. С автором проекта связаться пытался - он молчит...
Если это не очень сложно - прошу добавить DirectDrawCreateEx и скомпеллировать длл. Если сложно - буду признателен за объяснения того, как это работает...




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 16 января 2011 04:51 · Поправил: reversecode
· Личное сообщение · #2

ничего не понял
кто мешает взять уже скомпилеными?
https://github.com/jlanger/nvidia_ddraw_fix/downloads



Ранг: 55.7 (постоянный), 6thx
Активность: 0.030
Статус: Участник

Создано: 16 января 2011 05:01 · Поправил: Evol
· Личное сообщение · #3

reversecode, ему нужна подмена не DirectDrawCreate, а DirectDrawCreateEx по ходу.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 16 января 2011 05:12 · Поправил: reversecode
· Личное сообщение · #4

ну если так
то быстрее будет найти функцию

Code:
  1. //! load real direct draw dll
  2. static void load_ddraw_dll()
  3. {
  4.          ddraw_handle = LoadLibraryA("ddraw.dll");
  5.          RealDirectDrawCreate = (pDirectDrawCreate)GetProcAddress(ddraw_handle, "DirectDrawCreate");
  6. }

в dll и добавить два символа Ex, там выравнивание 4 пустых байта, так что влезет

Code:
  1. .rdata:10005148 ; char unk_10005148[]
  2. .rdata:10005148 unk_10005148    db  44h ; D ; DATA XREF: DllMain(x,x,x)+19o
  3. .rdata:10005149                 db  69h ; i
  4. .rdata:1000514A                 db  72h ; r
  5. .rdata:1000514B                 db  65h ; e
  6. .rdata:1000514C                 db  63h ; c
  7. .rdata:1000514D                 db  74h ; t
  8. .rdata:1000514E                 db  44h ; D
  9. .rdata:1000514F                 db  72h ; r
  10. .rdata:10005150                 db  61h ; a
  11. .rdata:10005151                 db  77h ; w
  12. .rdata:10005152                 db  43h ; C
  13. .rdata:10005153                 db  72h ; r
  14. .rdata:10005154                 db  65h ; e
  15. .rdata:10005155                 db  61h ; a
  16. .rdata:10005156                 db  74h ; t
  17. .rdata:10005157                 db  65h ; e
  18. .rdata:10005158                 db    0
  19. .rdata:10005159                 db    0
  20. .rdata:1000515A                 db    0
  21. .rdata:1000515B                 db    0



add есть другая проблема, это все не спасет и не поможет, нужно вникать в программу, поскольку DirectDrawCreate и DirectDrawCreateEx две разные функции и у них разные параметры

Code:
  1.     extern HRESULT WINAPI DirectDrawCreate( GUID FAR *lpGUID, LPDIRECTDRAW FAR *lplpDD, IUnknown FAR *pUnkOuter );
  2.     extern HRESULT WINAPI DirectDrawCreateEx( GUID FAR * lpGuid, LPVOID  *lplpDD, REFIID  iid,IUnknown FAR *pUnkOuter );


нужно еще один параметр "REFIID iid" ввести, он через стек, поэтому только компилять( (нет под рукой компилятора)

тогда main.cpp, такие фиксы

Code:
  1. typedef HRESULT (WINAPI *pDirectDrawCreateEx)(GUID* a, LPDIRECTDRAW* b, REFIID  iid, IUnknown* c);
  2.  
  3.  
  4. //! pointer to the real DirectDrawCreateEx function
  5. static pDirectDrawCreateEx RealDirectDrawCreateEx = NULL;


Code:
  1.          RealDirectDrawCreateEx = (pDirectDrawCreateEx)GetProcAddress(ddraw_handle, "DirectDrawCreateEx");


Code:
  1. extern "C" __declspec(dllexport) HRESULT WINAPI
  2. #if defined(_MSC_VER)
  3. FakeDirectDrawCreateEx
  4. #else
  5. DirectDrawCreateEx
  6. #endif
  7. (GUID* a, LPDIRECTDRAW* b, REFIID  iid, IUnknown* c)
  8. {
  9.          FNTRACE
  10.  
  11.          if(ddraw) {
  12.                  *= static_cast<IDirectDraw*>(ddraw);
  13.                  ddraw->AddRef();
  14.                  return 0;
  15.          }
  16.  
  17.          HRESULT hr = RealDirectDrawCreateEx(a, b, iid, c);
  18.          if(FAILED(hr))
  19.                  return hr;
  20.  
  21.          ddraw = new fake_ddraw(*b);
  22.  
  23.          *= static_cast<IDirectDraw*>(ddraw);
  24.          ddraw->AddRef();
  25.          return 0;
  26. }


add2 щщит, там еще полно мест для исправления
если надо могу пофиксить, только скомпилить не смогу



Ранг: 55.7 (постоянный), 6thx
Активность: 0.030
Статус: Участник

Создано: 16 января 2011 05:54 · Поправил: Evol
· Личное сообщение · #5

reversecode, ну попробуй пофиксить. вроде компилиться у меня.

add: что-то не вижу что там еще фиксить.
ToBad, попробуй, может так пойдет

5a64_15.01.2011_CRACKLAB.rU.tgz - Release.zip

add2: ToBad пишет:
прошу добавить DirectDrawCreateEx

нужно добавить, или можно заменить DirectDrawCreate ?




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 16 января 2011 06:20
· Личное сообщение · #6

а стоп, должно все получится
тех фиксов ну кроме еще .def експорта поправить на Ex, должно хватить

то меня struct fake_ddraw_base, сбил с толку, я думал там тоже нужно еще будет "REFIID iid" параметр вводить.



Ранг: 55.7 (постоянный), 6thx
Активность: 0.030
Статус: Участник

Создано: 16 января 2011 06:32
· Личное сообщение · #7

Добавил вроде

35a3_15.01.2011_CRACKLAB.rU.tgz - Release2.zip




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 16 января 2011 15:13
· Личное сообщение · #8

reversecode, Evol - Спасибо за помощь!
Я ступил и толком не глянул, что ещё из ddraw.dll импортируется функция DirectDrawEnumerateExA.
Можно её добавить?



Ранг: 55.7 (постоянный), 6thx
Активность: 0.030
Статус: Участник

Создано: 16 января 2011 17:49 · Поправил: Evol
· Личное сообщение · #9

ToBad, значит нам нужно просто перенаправить вызов DirectDrawEnumerateExA, вроде должно быть достаточно этого кода для пренаправления:
Code:
  1. extern "C" __declspec(dllexport) HRESULT WINAPI
  2. #if defined(_MSC_VER)
  3. FakeDirectDrawEnumerateExA
  4. #else
  5. DirectDrawEnumerateExA
  6. #endif
  7. (LPDDENUMCALLBACKEX* a, LPDIRECTDRAW* b, DWORD c)
  8. {
  9.          FNTRACE
  10.  
  11.          HRESULT hr = RealDirectDrawEnumerateExA(a, b, c);
  12.          if(FAILED(hr))
  13.                  return hr;
  14.           
  15.          return 0;
  16. }

Можешь попробовать, будет ли работать

070a_16.01.2011_CRACKLAB.rU.tgz - Release3.zip




Ранг: 450.3 (мудрец), 13thx
Активность: 0.20
Статус: Участник

Создано: 16 января 2011 18:26
· Личное сообщение · #10

Всё отлично работает!!!
Ребята, спасибо огромное, выручили!




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 16 января 2011 21:27
· Личное сообщение · #11

Evol
)) можно было сделать проще
только в def добавить и все



Ранг: 55.7 (постоянный), 6thx
Активность: 0.030
Статус: Участник

Создано: 16 января 2011 22:53 · Поправил: Evol
· Личное сообщение · #12

reversecode
как именно?

add: reversecode пишет:
и она должна проекспортировать на прямую

что-то не хочет, либо я что-то делаю не так




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 17 января 2011 00:29
· Личное сообщение · #13

ну в def дописываешь в експорт

FakeDirectDrawEnumerateExA=DirectDrawEnumerateExA

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


 eXeL@B —› Программирование —› Помогите подправить C++ исходники.
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати