设为首页收藏本站官方微博

【汉化资料】Hook OpenGL的問題

[复制链接]
查看: 1661|回复: 0
打印 上一主题 下一主题

【汉化资料】Hook OpenGL的問題

跳转到指定楼层
楼主
发表于 2009-6-6 15:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

【汉化资料】Hook OpenGL的問題

在分析Scratches是我发现这个游戏使用了OpenAL32.dll和wrap_oal.dll。
& Q$ e1 f1 @/ U  x+ e* C" i3 m' d所以估计使用了OpenGL的API,以下资料可以作为研究的基础资料。

4 k6 `3 f) [1 }* D$ b" Q7 v& I4 E4 h- m4 P
- \% n" F& S, o7 P5 t: t; }
原文
- L* T) t  i  |http://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html & j  {" t: v) e) C- Z+ J

& C: ~  l! h5 k: g* ~" E9 [/ j; T大家好,
( u: |" K% y0 g; S4 k
4 m! T8 Q; o5 Q. g: {1 A我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable / S4 Z1 l* g2 e! y9 o& Z
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣.... 3 o* u! Q, m9 p" X# G9 Q3 K* V
' m" ?: O( d5 ?3 d# d
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個
) N* W+ _# p/ m  {) s但是BMP圖放在wglSwapBuffers卻顯示不出來
/ d+ a4 \$ C; q1 |0 u(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
# v: P4 N0 E5 c; s& _  W% k樣的時間字串
* Z- D9 T  s5 e" W
0 Z( n2 {5 f: ?* J/ ~; \( _( P  P, v# ]- x
, s# u3 j: \" B/ b6 B# G1 W  W
作者 : fushunwu(fushunwu) . t# D+ o! |/ ], s
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
' u& n7 E# o/ n[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
% R6 |/ I" y5 B5 n8 C+ _$ ?2006/9/5 下午 03:21:34
% {" b3 ^7 w1 p6 r( J
+ [7 N& M9 z" usorry,按太快還沒打完 ..
* i0 F2 w) \/ n( p- p2 \7 n8 |& {0 H$ z: W
我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable 7 d* I6 ^* w0 i/ m' z/ {8 t
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API) " `# d! u3 a5 J& n* a: c) a0 c+ Z, C

* \4 y& |1 k5 [: E  M# \7 l; h(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來 + W  Q( |: S. i: V) h
(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了.
- |! D+ R% k9 i. f9 A+ E" e, C! t0 C; t' N
想請問各位高手,有沒有一些好方法可以解決 . 8 i  i' d( T; v4 B" ^. O3 Q3 F
6 n' D. [! v4 J; K* b8 _
下面是我hook opengl API的code : $ U  Q! d% \- w! Y
// hook wglSwapBuffers的code; hook glBegin的code也一樣 4 g  T' T$ V6 p: I% x. ~
void WINAPI wglSwapBuffersCallback(HDC hDC) + u5 W! A( k: b! ~8 e+ Q. s, Q) q! u
{ " c  t8 z  ]" P- |

  {# W4 ]# y7 r/ q' c; N( V% i: n% dif(!ininstializedfontshit)
2 `: g0 z: R* P{ ) {3 M$ [3 d0 b( t  Q
font.InitText(); " k% H3 r" b/ J# C: k9 @! X( C
ininstializedfontshit=true;
) t8 K: l( F0 W  q  ~! h/ }$ Z}
( J3 K* X) m- `: `- \) I
! x0 j$ e0 v, w) V6 q# m- aSYSTEMTIME SysTime; 8 p! w7 a8 o0 y+ G5 |1 H: ]( o1 l
GetLocalTime(&SysTime);
; n3 |+ \, n" nglPushAttrib(GL_CURRENT_BIT); 2 J7 m5 _, D/ k
// 顯示現在時間的字串
! l, ?; G6 {5 N; \9 E8 C) mfont.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond);
6 L5 ~: {/ K# u9 p/ T; K8 a7 _0 K& p. ]  |
// 顯示BMP
) Q& n' E: d; a( ]& w/ l2 E
. V! M4 ^5 V5 Z8 l' w/ y6 xbyte Texture[]={IDB_BITMAP1}; " T% J, s6 M3 h, ^) S* f
glGenTextures(1, &texture[0]); 7 l0 L+ W" B7 }
hBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION);
* o8 H7 j2 q/ Y) o  i9 x
% O" ?9 N* I# Y% ^( u3 Sif (hBMP) // Does The Bitmap Exist? " T# r. @- E7 }& T
{ // If So... ' M+ {, v0 Y+ ?* y! p1 K* `2 e
GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object , U1 ]. ~  n2 W& U9 |8 V1 o6 \+ r
// sizeof(BMP): Size Of Buffer For Object Information 3 A' Q  F1 u1 v% m% [
// Buffer For Object Information / e: {; c+ S8 ]$ H4 Y0 z
glMatrixMode(GL_MODELVIEW); 3 w9 o* z4 C5 Y, L
glLoadIdentity();
$ f2 ]2 S+ w1 ?. {" I2 V! i! YglTranslatef(0.0f,0.0f,-1.0f);
9 L& n$ b6 V# n* PglPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]);
8 ]0 F4 \0 \' Q1 W  w0 s4 \// Bind Our Texture / W' e* \2 P1 y! q
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering
2 k* ^& p  a" y# E% Z4 m- _glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering
: `/ I! V( w6 @1 X% A
& Q  m+ _; ~- K- U# L4 Y; sgluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits); 1 N: b: [  x1 F+ j
DeleteObject(hBMP); // Delete The Bitmap Object
  [# M7 Z7 _+ j' |} 4 n! I; d7 l9 f$ Y
glPopAttrib();
, B0 l! J# a( v  I
/ n; ]( B8 k9 d$ Z; x2 B$ y/ {2 _* @6 z3 Q% e4 H; ~7 S/ K
} $ d. t3 ^) l: T
wglSwapBuffersNext(hDC); 6 o  t+ c0 u! D6 B$ U1 L; x& M
} : H2 L) s2 x+ y, b; ?. j5 c3 q
/ [! r% S4 F) B/ F  U# g- _0 R- J7 ~

6 p8 J1 x) W& p, Z9 ?" ]3 S0 C: f0 m# G7 V. C
: N" E" b5 j1 z. w

: U0 v  C- x6 x! ~3 ~3 L1 g0 _" |+ I7 @
作者 : dorkas(aming) 8 l- K8 {% H" t* d/ v
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ] 3 ^7 I$ g8 K$ G8 k
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
1 J" v; X, k! H* K0 e; U6 Z2006/9/7 上午 10:30:03 6 N2 b0 k- h* ]3 z! O; U
( A0 Y6 B0 |5 [" P& B3 Z" r
1.貼圖動作錯誤 ! D! M# X5 ~7 F9 p8 u" A
* t4 t, M( i* F) z
2.
" v; b2 V; @, t! y每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡 . T* Z  \9 \5 l0 z7 ]4 q4 l( M

& C, s# ?0 e& z  H9 W" c5 ]
& O( n, e: [7 g4 Ustruct MyTime 0 H* ?7 L) `5 ]$ L6 W
{
' _/ o& K5 [8 U$ Z* W+ Jbyte Texture; * w+ q$ c+ P) K! P5 _
FontGL font; ; e" C7 z, i$ r% i7 d6 v3 a
void initial(void);
; }1 w/ a3 m, X& U/ e0 S, A9 Jvoid finish(void); # [  F* i4 m% z0 v" I$ Q/ ~
void draw(void); ' G) V: d: W- I$ ]) o
}; ) o% @3 M- ?1 m% ~% a) y7 K
void MyTime::initial(void)
5 ?" J' e" m, H{
: m" {% _0 I& H# _+ g$ O* w7 h; r// 載圖 初始字型
0 U% E) |! M" E( Q" [7 _font.InitText(); * g, O& }5 n+ l1 f% c, H2 O
glGenTextures(1, &Texture); & J/ G+ i" o& P
} * Z/ g/ P+ B2 D
void MyTime::finish(void) # h6 d. s, l, s. o
{ 4 u6 [2 G; n0 M3 V- F# ^
//釋放圖形 字型資源
7 _& V0 w  V0 e$ p" R' d: i9 O6 K} " O6 R- e, \$ y: q

. q* _9 m" ?: F/ D" a; e9 x- U0 ]void MyTime::draw(void) / F* y/ v) f6 a! e7 `7 c% y+ K' D& F! W
{ ; d8 O7 ]. h) n; P- j
// 顯示現在時間的字串
- H% [. D$ f0 h8 S- t$ o& ^$ ~font.Print(......something...); 8 n% R1 p' M! A
// Buffer For Object Information
% T% c% U) d/ I& T9 WglMatrixMode(GL_MODELVIEW);
. v8 c: Q7 h: F' m, |glLoadIdentity();
; m8 s& c$ \1 ^  a, ^glTranslatef(0.0f,0.0f,-1.0f);
0 k! f  \2 s$ G4 G6 n6 BglBindTexture(GL_TEXTURE_2D, Texture); / @$ p6 F/ [' e

1 F0 m6 {" t# Z" |..... DrawSomeThing
7 }$ ^1 l& z8 `1 s) e
2 J3 J# h6 I; n7 z5 u: `} 6 `8 I' h% q- x% E& e5 X

: C$ N/ z. r, R6 {1 Y$ H2 k! k- d& l7 E! }' G3 N7 Z, }( @
MyTime time;
) J" j( s0 M5 Gvoid WINAPI wglSwapBuffersCallback(HDC hDC) 0 u# c2 ?9 D0 M5 @/ S
{ . u4 C' o# j5 S! X4 o
time.draw(); 0 P% L& ]. x6 m, G; |0 w9 U
wglSwapBuffersNext(hDC); , ~! \4 Z+ I5 r. V+ x
}
0 Q3 u4 S/ }& O. M
: T9 z* D- Y2 |8 C5 S) M( {* r3 u你只要掛進去前呼叫 time.initial();
1 v) c0 g# r) N: f: T( b結束呼叫 time.finish();
! p( q/ f7 x7 D; D7 z' v! `, k; X. `' Q% l! i/ L) g
4 N' Q. }& U# ?, O8 i: }- D

9 @  ?$ y4 X7 m6 }
% n+ k; t: x9 y! @* v: }作者 : fushunwu(fushunwu) 2 n& a, n9 p! |; g: d" F
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
4 [$ A3 Q2 ~0 F[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
5 b7 a, `7 z6 x2 N( {! R# V  p, M* {2006/9/7 下午 04:19:31 ) p' Z  o, l2 A$ @0 L3 U! }1 j
' N, e7 d' D+ y- ?' l+ j
謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~ : K' C" n1 B( ?; u  e% C& I/ h

) r4 @) J0 K5 R; J(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新.
% R7 y5 q7 _8 @, V0 R' @% Q2 U2 }( q時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉. ' q; i+ l3 L( h! d; v
像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了. / K% L$ _1 t* m
所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ? $ P. i/ P, T5 @/ d4 }, |
3 E" N9 F+ S: x2 @. G$ p
# ?; I3 C# H9 ^0 l0 k
(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut * H$ g- E, w* F. E4 q, A; _
來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
7 ]& F5 r, W1 t" o7 F8 I$ C這樣我寫的Hook才可以通用其他非Pure OpenGL的Game.   t# U1 ?# ^, m8 g- m& W
4 Z$ \+ k9 B, W! \2 {7 |6 t3 v% e
(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? 3 G( S9 I- b& e% h! i' d' i; N+ e

2 c0 \- f- X& S6 q( Y( ~6 R7 C7 n- B6 R/ \+ t4 d7 Q

- q: |6 W# E# z  Z( V. W* o' r3 O: }  H: \+ z6 @& r
! j* P3 S" C$ h5 z5 l+ j9 \; W
作者 : dorkas(aming)
# c2 q; B* I# s4 o, m' a8 o5 ~7 r7 N[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ]
' H5 T% Q# d# a/ I8 F2 H7 [- x[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 8 J' z' V: @1 T  s
2006/9/7 下午 05:31:01
# K' b- q! p  g: A2 g
0 w/ O& f: Y4 I1&2   ^9 M5 _5 ?1 l8 e- k* S4 a
我對OpenGL不熟... 6 M4 }/ }! i, O- N$ n/ O- L
. I. p$ y% O. ^; N+ Z& @# |% b
>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ?
* f2 W& a8 d/ z0 ?( W+ u3 @$ r1 E' Q( n2 x1 [1 h0 N& F
! O$ [' o$ S& E2 Z. Q) J
初始跟結束都是做一次的就好了 / v/ a) }! y3 v& M& [
你高興要擺在迴圈裡面也是可以 , j: ]6 k3 g+ B  B# L( l6 L

$ E6 Y1 b6 p9 B! M8 M程式的要訣就是 起 承 轉 合 8 r7 O1 B7 _/ i) @  c+ `& v! S
initial
* m  y9 A. p- e+ x$ {+ ]" BupDate 2 I1 m! }% P8 v+ J
change
* V0 K8 ?" p9 A- b$ e2 {9 t6 mfinish
! `0 o, @& T  w4 k  }+ O物件也是起承轉合 8 c" h) g  L$ `% e3 A# }7 ~
函數也是起承轉合
5 n8 Y. y  Q& h* i: m; E迴圈裡面也是 起 承 轉 合
+ ?' X8 H3 n  O
! A/ ]" k4 S& C* _$ }7 L% D7 c$ `; u$ q0 k& R5 V
for(起;承;轉)
( g' o3 L2 g6 ?  ^7 y7 G- `/ y{
/ \0 R" j3 x! v
3 W& g! q; @9 M1 E. q2 @9 i
: S8 J9 `* ]: m/ V$ g
1 c& O5 L0 i( M% T) U
8 {( d/ y4 ?6 ~3 h+ w} 9 |! h: M( H  v) J. y
0 Q, @8 A+ m: Z- W7 |9 t
, ^7 s$ E( H  E- K8 }. H; G! n
只要你分的清楚 屬於那一塊的性質就好了
# G5 I5 S. v4 y1 L
2 m: N* B4 E" g# x
: n3 g1 ^3 t# V7 w, h# R5 O# ~/ p
3 I$ w5 W2 H' a. D) I( _/ H
9 d2 e4 C( v7 U# h% E/ X& S% o4 g/ n- }$ e- s
作者 : fushunwu(fushunwu) . x: t( p; ?) @0 w
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] ( X/ s* v( V5 F# w8 `
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] 4 ^2 E3 v3 y/ e' P, h
2006/9/8 上午 10:32:26
9 E+ n0 j& H2 F+ F  p
* m1 f: z% P3 r" g( b恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~ 7 M/ q' J- b3 L% W% j2 L; X, G) [
: P% M  C, F; `' Y" m6 W5 l* E4 x1 h! m' L
像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin
( I2 {+ @& \% f$ Q* Z所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來 " h! S8 e0 F' l
我在想是不是因為座標還是矩陣的問題 ?
6 w! K+ e- M' `
7 r' W7 r' g8 s( ^. d但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ?
( B$ ^6 ?5 |2 A$ a% B  j4 z至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面. 2 g1 e$ c9 M+ k6 w3 k, ~0 r7 h

& b, o" g' Y, Y3 U所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示.
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

快速回复 返回顶部 返回列表