冒险解谜游戏中文网 ChinaAVG

标题: 【汉化资料】Hook OpenGL的問題 [打印本页]

作者: shane007    时间: 2009-6-6 15:44
标题: 【汉化资料】Hook OpenGL的問題
在分析Scratches是我发现这个游戏使用了OpenAL32.dll和wrap_oal.dll。
! f8 C* M% y7 ?% @, V所以估计使用了OpenGL的API,以下资料可以作为研究的基础资料。
# w# I$ v* e! \. s8 B9 s% @
+ d  c* i  v2 I2 b6 i- v5 Z6 ^0 _
) i" Z& ~6 ^0 S7 p$ R5 w
原文
* D& I# C6 J5 c, ^0 z  q0 ^/ H! vhttp://www.programmer-club.com.tw/ShowSameTitleN/opengl/1654.html
' A8 C2 O# S, \2 `
# ^/ C9 v: J- h- o& ~* Q! y" d大家好, 3 j" b: p4 x4 g7 P8 r1 [

8 e9 k/ w( y, ~/ d; ~7 i我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable 3 ?0 b) T- ^1 ?+ @8 N7 B! v' w
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....
( N5 Q) I9 J7 i; R  _% {" q. ~* c- ^. ?
' ~) F. O4 ~0 q5 R$ H4 g(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個 " d! [" C2 o6 Y& u  c
但是BMP圖放在wglSwapBuffers卻顯示不出來
/ F& H. N! C8 x% n4 k7 M(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一
3 f9 f6 R  U2 @( J樣的時間字串
; @0 ]: T" m0 m. n) [5 O
! P. t% F& h8 a( f+ [! e$ [5 ]) W. b6 K# U0 U8 Q- Y
+ `3 j' [$ G' k8 |) k- j  T# X
作者 : fushunwu(fushunwu) 3 s% p8 ^4 z0 Z( L
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
' S3 a6 [1 P* a[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
, s- _* T- b' u8 O) t2006/9/5 下午 03:21:34 7 T+ |! _3 a9 T1 N! T( T
7 Q0 Z. K4 D: B' A# \) I
sorry,按太快還沒打完 .. / N" R. Z7 D0 F) x& f+ {& q% l

- }! I- H, H% v+ b- T我目前想要在OpenGL的Game中顯示出現在的時間的字串和一張BMP圖. 但是我Hook Opengl32.dll裏面的glBegin,glEnable 8 f+ k* t! K9 j
,wglSwapBuffers等API,在每個Game中看起來狀況都不一樣....( 我使用MadCodeHook的API)   H& @& N- T. j- b, @6 `8 |
  k0 n. A  ]* R$ p7 }5 ?( J
(1).在Quake4中要顯示現在時間的字串要放在wglSwapBuffers裏面,可以顯示出字串,而且只會顯示一個. 但是BMP圖放在wglSwapBuffers卻顯示不出來
  G# r7 f* W! ^- u(2).在CS中顯示現在時間的字串顯示不出來,我必須把顯示字串的功能放在glBegin中,但CS會同時顯示出很多一模一樣的時間字串 ; BMP圖放在glBegin中中在cs片頭中還可以顯示,但是圖會顛倒而且會占滿全部的畫面,進入game中再開圖就掛了.
0 ]6 U+ d) y3 A
+ C9 C+ Y* _# x# i9 p$ N1 j0 a想請問各位高手,有沒有一些好方法可以解決 . 7 n! W% g8 y, y- i% c/ q
9 R' ]9 D( W0 G5 w
下面是我hook opengl API的code :
' Z/ n. \1 p& v+ z" g$ ]( a// hook wglSwapBuffers的code; hook glBegin的code也一樣
. B- t: D* F6 V* F7 Svoid WINAPI wglSwapBuffersCallback(HDC hDC) ! [* ?' L& n- X1 f9 Q$ O3 K
{ 7 p  Y5 r& F" p9 s" _3 ~. W

& q% }" H/ k$ R3 E5 h8 u+ Cif(!ininstializedfontshit)
  I) E* w  W8 h5 s& W{ ; u$ }( a* b$ f' g2 ?6 t
font.InitText(); . @' a: A: N% w: H9 o: z
ininstializedfontshit=true; ; }+ C' q% s% y) Q7 f5 r
} : R  N5 [/ e$ q3 e# A& O

- e- m  Y8 U2 m7 |3 aSYSTEMTIME SysTime; 7 u8 D' L' q2 G1 w. G
GetLocalTime(&SysTime);
: Q' ^, b* Y/ j9 o2 oglPushAttrib(GL_CURRENT_BIT); - y7 a) g. c! L% c! \
// 顯示現在時間的字串
, V& H$ _( k" Cfont.Print(140,125,255,0,0,0,"Time: :%:%",SysTime.wHour,SysTime.wMinute,SysTime.wSecond);
. R; e! F& x! e% P) O7 ^
2 V0 o7 A  o8 m0 {8 f& N// 顯示BMP + l) f+ V. P' l7 g+ K

, l- @: }' f: }9 @" v  Wbyte Texture[]={IDB_BITMAP1}; ! J2 w6 r+ I& e8 H  ]& ^% a
glGenTextures(1, &texture[0]);
4 K# e/ T$ p$ e: s) m8 M& AhBMP=(HBITMAP)LoadImage(gl_hThisInstance,MAKEINTRESOURCE(IDB_BITMAP1), IMAGE_BITMAP, 0, 0 , LR_CREATEDIBSECTION);
9 `9 B# D* e5 f) P# q9 A/ H# j& q, D0 b  n8 n
if (hBMP) // Does The Bitmap Exist? + g5 M7 m! G# f- e7 y7 ]
{ // If So... ! ?* V" f  I7 ]5 T, |
GetObject(hBMP,sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object - x; f4 y9 d7 V  Y0 }
// sizeof(BMP): Size Of Buffer For Object Information
' x; I( O5 _2 F; K2 v9 G// Buffer For Object Information
' ^, o/ M0 V2 k! w7 w- fglMatrixMode(GL_MODELVIEW);
9 @# a$ t" f/ RglLoadIdentity();
6 E! e' T6 U- U$ r) L: H  V0 a. cglTranslatef(0.0f,0.0f,-1.0f);
2 W. @7 W: P9 O1 {3 ^2 Q: ]! hglPixelStorei(GL_UNPACK_ALIGNMENT,1); glBindTexture(GL_TEXTURE_2D, texture[0]);
; q7 j, V; y* Q7 O0 R$ _' l// Bind Our Texture ; R- Z- s- \4 H2 w) w* [
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST ); // Linear Filtering 9 l8 P1 T" x* F
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST ); // Mipmap Linear Filtering ' `0 t6 K, E% V1 |4 H

# e4 Y2 K6 b6 jgluBuild2DMipmaps(GL_TEXTURE_2D, 4, BMP.bmWidth, BMP.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, BMP.bmBits); ) ?% `1 z3 ?$ b1 ^
DeleteObject(hBMP); // Delete The Bitmap Object ; H, _9 j4 \# O* z6 l; y
}
+ ?" B9 n9 A/ G. gglPopAttrib(); , `! R& ~3 t) J8 d* f) h

* u1 Y$ f5 X' h& U/ T4 S3 q* J$ S9 m' U' c6 i" f
} 3 J( _; R8 }( b
wglSwapBuffersNext(hDC);
4 R! n" ?( W- }1 `% i- N* w}
' u. I, g- [6 P
' S3 y+ S& p' p, ~& I4 }# |" ?. l
# C) s, Q, y. ^) @  z
2 ~1 B; E0 t* ^, A& g2 s! K" [1 a9 ~9 C1 Z

' p/ I3 H* Z  Y# m! f+ `7 {, |' k3 s8 p- ?; {3 ~
作者 : dorkas(aming) 5 l! y- k( y6 w* |' L
[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ]
  }* |1 X8 {6 H  Z( i; E[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
  u' `& @1 d5 n2006/9/7 上午 10:30:03 ) U( ^7 c' ~0 R2 ?3 A7 l% w+ E
9 \5 f; `( s3 t& }; n$ D8 l
1.貼圖動作錯誤 & q7 z; |: g; j. S% S& _. b$ N

3 X' d- l' M; s2.   Q3 v% ?/ r* p; X  u! ^; P
每個Frame都創造貼圖,結束又沒釋放貼圖...跑沒幾秒就會資源耗盡
$ T  ~9 S% Q! q2 V
+ P" d+ k) G/ d2 f0 F0 |' c; C5 k
) ^7 ^8 @. y- k: V9 s$ cstruct MyTime / R: E6 n, q1 L- T  i3 H5 D4 t* o
{
+ E& u: y( j% Z0 u, qbyte Texture; ) V+ O. ?5 {/ U/ H; _, x* O
FontGL font;
! u2 |' d! V! D8 `% tvoid initial(void); $ n* V9 t% _( ~5 H2 W  L
void finish(void); * c- v% Q2 W, w. I# V4 l
void draw(void);
3 ?9 m* I" N9 F};
8 h+ b  ~+ C+ P( v9 W; Z; Gvoid MyTime::initial(void)
2 j) z# R8 m  a{
) X9 _& u9 I; f// 載圖 初始字型   Z6 b+ G" r, D1 H0 B5 F3 A" u
font.InitText(); ( l8 Z) q! H" ?! k& w
glGenTextures(1, &Texture);
; L& B+ R4 G! v* H% p, P}
4 E4 n- y3 A0 l; _void MyTime::finish(void) . N. I) I7 v$ v
{
8 H. Q6 b! F! }8 g//釋放圖形 字型資源 4 }. K- s( k; {) D- ^1 T: ?9 j
}
. c3 L8 w; ]. q8 y, t: X  O; ]5 F; q  p- j! n/ ^! w( C6 h
void MyTime::draw(void)
! @$ n! ^& G% }: ^{ 7 R! V& a# [; c% E6 P
// 顯示現在時間的字串
( `  C- W' Q* ?% }font.Print(......something...);
, m6 `# b3 D3 \! U2 l8 s// Buffer For Object Information
' r/ ?7 f" V, xglMatrixMode(GL_MODELVIEW); 1 U4 d+ E( T4 o4 M
glLoadIdentity(); 6 o8 z& r. E) {7 f: i" Z& \% y
glTranslatef(0.0f,0.0f,-1.0f);
3 f8 h; O. i% R/ K0 O7 V5 N; lglBindTexture(GL_TEXTURE_2D, Texture); 3 y+ \2 d# n% C. z9 p% X* B

/ @& K7 {$ h, F3 h9 c..... DrawSomeThing
0 B: N( k6 A+ i; j% y. D- p6 X
9 [+ X9 T( I! z}
% H7 G9 |3 j- y, i. Z1 V
( K1 u3 _5 ]; G7 G+ M/ E
. G7 c3 L( f+ w9 `+ D8 YMyTime time; : a' u/ O" ]( T$ a4 A3 ~2 ^
void WINAPI wglSwapBuffersCallback(HDC hDC) % S% G2 k7 m% U/ E. K! D% q4 U
{
8 q9 y+ ?9 {/ D( _time.draw();
  _# p. r& D1 BwglSwapBuffersNext(hDC);
0 m0 ]$ Z; s7 u$ u% b}
0 t. X. Y! x' \7 L3 b: Q1 r7 @+ g: M% k0 D& S4 n8 e
你只要掛進去前呼叫 time.initial(); 5 R# {* ]  ~9 @9 R
結束呼叫 time.finish(); ( ?7 h' p4 G4 R) X
1 J: h6 ^; g- f" t* [7 W9 F

" `  C, |8 [' G1 k8 m# |9 \9 e" A8 |2 S* A/ }3 S% I
3 K$ N. h4 |$ p2 f; H
作者 : fushunwu(fushunwu) : \4 b1 L1 B8 m' l+ L
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ]
, l! A" N1 H! L) S9 D) s0 O[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] ) V% z, X* b0 Q5 M) j) W
2006/9/7 下午 04:19:31
$ Q6 O+ H$ F7 o* D
* [7 L  H' v/ n% g謝謝. 但我還是有幾疑問想要請你幫忙,麻煩你了.謝謝 ~ $ r4 [/ h9 P0 }. _
" j$ a8 K1 ~) K1 {6 A+ g+ y
(1). 因為我要固定放現在的時間字串和BMP圖在被我Hook的Game上面,所以我必須要知道那一個OpenGL的API是一定會不斷地被Game來呼叫,這樣子Game畫面才會不斷地更新.
% x+ R. S4 Q; j時間字串也才會不斷地被更新而BMP也會不斷地貼在Game上面而不會被Game遮掉.
- p5 ?% @: m# r, D" {像是DirectX Game中的Present API就會不斷地被呼叫,所以我只要把現在的時間字串和BMP圖放在這個API裏面就OK了. * Z/ s' _: R! e9 E! t4 X
所以我想問的是OpenGL Game中是不是會不斷地呼叫wglSwapBuffers這個API,讓畫面不斷地更新 ? 還是有其它API是一定會不斷地被OpenGL來呼叫 ?
) |+ k# Z# M' ?1 A
9 y4 F; w/ Q; U. p! o& w, G
2 J9 {7 X3 U- {5 {(2). 現在OpenGL Game看起來都不是用Pure OpenGL API來製作,比如說像是用Glut ' N. I% k- \/ l; |$ A
來開發,他們是只是封裝起來底層還是需要用到Pure OpenGL的API 嗎 ?
+ g; j# f  p5 j0 ?2 p這樣我寫的Hook才可以通用其他非Pure OpenGL的Game. , C. V+ J$ s8 C5 n3 k! d
+ u8 ]3 d4 j2 g5 W+ k
(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? * `+ A+ j. [, l9 u0 P
5 U3 i( R; l3 d0 d1 S( j5 g7 G
/ I+ i5 f! i9 l. V1 j" j. Z- u3 o8 _
9 f9 J3 \" v, M% u) s$ q; \

8 Z* w/ y- N" `! H$ j8 O% I( W" q/ j' T& m. K7 s- W9 l
作者 : dorkas(aming)
/ D) {2 o, n  j; I6 ^' [0 _[ 貼文 2619 | 人氣 4536 | 評價 11790 | 送出評價 2 次 ] $ q: K! b/ \) y# J( p( w7 w9 [
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ] $ o* \: b' g0 Q6 G  V" a4 r# o
2006/9/7 下午 05:31:01
4 Z6 R' J! r; M2 Q8 i; T5 X
5 g/ a$ ~+ K/ Y1&2 $ e, y- w2 P# m/ x
我對OpenGL不熟... ! W& R# ]# K  h4 \9 C4 O6 W

  b! G( }, c6 G3 L0 e# q: B9 B, |, {. _>(3). 我不能在呼叫wglSwapBuffers這個API前面釋放掉釋放圖形/字型資源嗎 ? " F( W1 G: E3 ?9 S- F$ V; _

8 z6 \# I% t6 f9 m
2 p* {0 G$ |! [# x: u初始跟結束都是做一次的就好了 2 X7 }8 n" x8 f, k: o5 G6 ]6 t
你高興要擺在迴圈裡面也是可以
( {5 E/ N+ b2 _6 p: \; P9 b( ~; H' h8 I9 ~0 z- k1 k* H( X
程式的要訣就是 起 承 轉 合 6 |! L% t" }: X; ?9 }
initial   v+ z$ @& Z  ]# x
upDate
5 U5 F/ z- `) [6 X) j$ f3 pchange
/ ~' k0 M$ z0 q+ F8 G. f8 ~finish
" L* {7 F' U9 K) e+ Q8 p5 A% V& p物件也是起承轉合 4 ?5 K) S1 V; I' l  q2 n
函數也是起承轉合
, a* P! w1 w* ?4 D) n# J# n迴圈裡面也是 起 承 轉 合
& N. P) C. o  Q+ j/ X' S
3 }8 X9 i! p& W2 ]
8 L$ y$ z( ]! H, _/ f2 h$ Zfor(起;承;轉) - C* P2 L" G3 v) j! |2 ?4 v
{
5 T) e! b# P2 {1 ?% k6 e9 y7 k0 |! h3 w9 g# ]- C" q# o
- K7 r+ p- R$ v$ \

0 k7 l: T8 H0 {; v- [& E0 [: Q8 Y* @9 P- m
}
* A% O$ U/ e3 U; F& a# p
" h8 C4 Y* J! _$ I% O7 H  z8 H) o
只要你分的清楚 屬於那一塊的性質就好了 . q; Y. h! W: R) m/ V( u  J
0 W, f1 t' Z  [' S  [

+ e4 m4 m" m0 [6 F) f( l: Z4 @. Z5 m; Y0 K
$ M3 e$ L" B: l- u) m
9 Z! Y0 K* S$ Q4 J9 }& y
作者 : fushunwu(fushunwu) 7 {, }) M' N( S: r4 {
[ 貼文 6 | 人氣 1521 | 評價 0 | 送出評價 1 次 ] 3 C* @% [! Y7 |% _5 L8 [+ I3 @- ]
[ 回應本文 ] [ 發表新文 ] [ 給予評價 ] [ 給予評價 ] [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
! }* v( Y) w  \0 ?2006/9/8 上午 10:32:26 4 R" N1 b, Z$ Q1 u) A  d0 m6 W

# S! w7 C' Y; W9 z: L. T+ p恩,還是要謝謝你,目前問題還是沒有解決.Quake4和CS 顯示的狀況還是不一樣~ & M  h7 `. V4 p, e/ U4 @/ [

! o! T( V+ A2 O# T像是Quake4這個Game它就沒有使用到glBegin這個API 所以我hook不到glBegin
+ Z& [) J) o. l4 g. @所以我就把顯示字串和BMP圖放到swapBuffers裏面去做,字串可以正常顯示但圖秀不出來
" H$ ~' |6 e6 Z, s+ n- |我在想是不是因為座標還是矩陣的問題 ?
% h# l/ z: q1 o7 E& u
- v* d' \& {' l# }4 ?但是CS放在swapBuffers圖和字都顯示不出來,但是因為CS有用glBegin所以我就把同樣的code放在glBegin裏面,可以顯示字串只不過會顯示很多個,我在想是不是也是因為座標還是矩陣的問題 ?
% A, `8 T! W; `" K! ]! t至於BMP圖在CS片頭時可以秀,只不過會秀滿全螢幕而且是顛倒的占滿整個畫面.
. g8 n& s8 O& L  U- l. n
5 g6 R: p1 Z5 B( r7 ]5 t; n7 V所以我才想說有沒有一個統一的方式可以讓我把同樣的code放在某個OpenGL API裏面去然後每個OpenGL game都可以正常顯示.




欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2