本帖最后由 shane007 于 2023-8-25 17:31 编辑 0 `/ O/ C) `$ S$ ?
& U* g3 C' S& X) G) ?, c# k本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,( v$ b/ i% a3 l) q7 U
游戏应该实际只用了其中1个,暂时作下记录。! o% S. E) `9 x
- ~& ]; H& O& Y; uDirectDraw是由bin目录下的ddraw2d.dll来完成的。
6 B1 t8 s; K+ M% l$ L以下是一处的初始化代码$ O% J1 c" W$ B: B8 s3 d
- CSpace:10015015/ e# o5 o3 O8 P( }1 v/ e
- CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j/ {* Q7 V9 e$ u7 v8 O9 x
- CSpace:10015015 mov [ebp+lpGUID], 0% T4 S/ s: @" S* }* y" ~! N
- CSpace:1001501C mov eax, [ebp+dwNewLong]
+ ^3 Z O- Z: A - CSpace:1001501F mov ecx, [eax+230h]
h1 i- I3 K1 {2 l4 ?1 k7 ? - CSpace:10015025 movzx edx, byte ptr [ecx+1Ah]. a+ {3 q) d, n( V$ ~$ q
- CSpace:10015029 test edx, edx
6 l3 u/ e! k1 j, X% U - CSpace:1001502B jnz short loc_1001503C
5 F1 v$ D4 h5 j2 t - CSpace:1001502D mov eax, [ebp+dwNewLong]
$ P; y/ s) f, m+ Q( o% u+ G - CSpace:10015030 mov ecx, [eax+230h]. P3 O4 _* @+ Y6 a
- CSpace:10015036 add ecx, 8
* l: D5 ?/ F" s2 Q8 H; u% F9 P. r - CSpace:10015039 mov [ebp+lpGUID], ecx) @1 b" U3 S1 @% B- s" N
- CSpace:1001503C6 k. `8 M# d: y3 S/ d. K: B B% B
- CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j
7 g' t5 L+ l5 t, K# p& I1 F - CSpace:1001503C mov eax, [ebp+dwNewLong]- I% R. W1 W+ {4 C: G8 s
- CSpace:1001503F mov ecx, [eax+230h]" i; [$ U9 C6 u1 K3 C, L
- CSpace:10015045 mov edx, [ecx+1Ch]
0 v( w. {. q2 c B0 d - CSpace:10015048 push edx! Y3 W% k; n3 C. U. Z8 z
- CSpace:10015049 mov eax, [ebp+dwNewLong]: o% f1 V" O( q: }: x
- CSpace:1001504C mov ecx, [eax+230h]) S# a- U4 G( g5 I5 H' X
- CSpace:10015052 mov edx, [ecx+20h]$ T2 E. y/ s5 v3 l9 {* _0 C
- CSpace:10015055 push edx9 M* j% B- P9 ?8 c
- CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)"
- j$ j9 L0 Q# d5 o+ ]; }/ B1 W - CSpace:1001505B push 3- o6 R' ?0 E& [3 G6 I- c
- CSpace:1001505D mov eax, [ebp+dwNewLong]- L" f0 e5 I1 {3 [: O
- CSpace:10015060 push eax
% ?4 f. {5 g; L7 N0 Y4 ` - CSpace:10015061 call sub_1003882A% F) n$ ?. W, G3 m4 f. S) Y9 E, W
- CSpace:10015066 add esp, 14h) ^1 w$ L1 p$ W2 H: l
- CSpace:10015069 push 0 ; pUnkOuter# f8 _( E9 d: ]. E
- CSpace:1001506B mov eax, [ebp+dwNewLong]: i! Q" [; D4 K! u
- CSpace:1001506E add eax, 1DCh
& Y! F& i: H1 z( }7 Y) C2 u - CSpace:10015073 push eax ; lplpDD
. A+ U9 j8 s2 M! w3 ]' E - CSpace:10015074 mov ecx, [ebp+lpGUID]+ W9 {% T& Z: q, q" \2 ^
- CSpace:10015077 push ecx ; lpGUID1 k0 _0 `: o; ?
- CSpace:10015078 call j_DirectDrawCreate
9 x! ]: [$ `! i& V x% F - CSpace:1001507D mov [ebp+var_14], eax! u9 E4 |/ m; g" I9 M6 M
- CSpace:10015080 cmp [ebp+var_14], 0
: Q# L# ~3 l% F a1 u+ f - CSpace:10015084 jz short loc_1001509E
4 j2 I0 z7 x; Y( |' g! V3 `) t) y( _ - CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n"
; y4 }! v& \( B2 k: A - CSpace:1001508B mov eax, [ebp+var_14]
/ w3 O9 k& X4 y# f - CSpace:1001508E push eax
0 i6 z) L2 B/ f6 } - CSpace:1001508F mov ecx, [ebp+dwNewLong]
1 g1 u7 ~) Y7 n8 G) y - CSpace:10015092 call sub_10038F3C3 M2 F; X6 B! f' P* j& i
- CSpace:10015097 xor al, al- g( N! X+ O$ ~( _
- CSpace:10015099 jmp loc_10015173
复制代码
0 v' y3 j( o. z8 V5 Z' w7 x0 x) Y, O" T' C$ y S" u) l: r2 i1 e
5 S! v, W2 D, ^- n
我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log.1 ^+ l6 l) U. w9 y3 e% d5 ]8 U- v+ z
记录到log_GL.out文件中。以下是摘录的一段。
5 C. U! @+ }* ]1 {' M- N我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。0 U# O& M: a0 D5 B
以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?
, o: n2 M5 E9 Z$ x2 w: N- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
" C0 l" j2 N" q2 l" m/ ]1 y - glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>. d j7 @6 ?- ^6 W4 p
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>
& _% L+ X" Q+ O. S7 f( R4 e# H - glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>% v3 p# u0 }' H; C0 [5 J# @- C) L
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
. b$ ]; ?: @0 q& p - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>& z& n Q$ M9 }) D+ l
- glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>9 F2 G6 L5 X$ @ r5 Z
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>
; {- Z0 Y# S" e0 B. [6 l: Z - glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
9 ]1 t6 A& I( S9 s: I0 ^( U - glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>& k$ Y/ r7 | Y1 y
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>7 O1 ~7 d1 I: v& k; x5 v/ P
- glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>) d. i- ~! q# C/ T; m; Z9 e
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>1 l! |$ q/ Y. x- f
- glClear, GLbitfield<256>. v2 z# }0 D$ H: {) t
- glShadeModel, GLenum<7424>( N0 h, O7 g0 ?) t0 W& n- o5 b
- glDisable, GLenum<2929>
# a% e5 t7 ?' s; m/ D, e3 m/ h - glDisable, GLenum<3008>7 f2 ~% H6 J. m) W4 ?+ I
- glDisable, GLenum<2896>
: R$ p2 x1 t7 E% i1 k - glEnable, GLenum<3042>
/ e6 j/ n. ]% ~/ c( U" E - glDisable, GLenum<3553>/ c' y1 { e# y
- glBindTexture, GLenum<3553>, GLuint<631>5 r) F$ i4 k/ p
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
5 r7 c# i/ |4 A6 V0 | - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
3 J) c4 w$ u8 g. z) \ ~7 f F( _ - glClear, GLbitfield<16384>0 o3 h/ F% f3 d1 z( A& }. O
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>( ~( q( Q3 s2 e+ z, |2 {
- glEnable, GLenum<3553>4 M$ N8 a% L5 X4 N% @
- glBegin, GLenum<7>+ _) e$ s( K2 u
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
5 b. c7 q) ]6 G$ J4 n - glTexCoord2f, GLfloat<0>, GLfloat<0>3 T5 n$ ^% u; A8 T7 b
- glVertex2i, GLint<0>, GLint<768>
9 o% ?3 @" ]9 c9 B2 o4 { - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>% w5 I. u( t7 S& K7 N1 K/ A* g D
- glVertex2i, GLint<1024>, GLint<768>6 E6 L" Q4 _! n# o3 v) p! [4 a% R
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
5 P. x& P' \' E( R, \, q( S; v( w - glVertex2i, GLint<1024>, GLint<-256>
" h" K. ?+ r8 x' n q @ - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>* [4 A9 J: U+ q) o& O! I
- glVertex2i, GLint<0>, GLint<-256>5 x% F' ]: O' L+ D7 F# S
- glEnd: z8 B# G, c& b7 \' J
- glShadeModel, GLenum<7424>
, d) I; F& `1 U/ p. B8 k - glGetError
$ ^" E- z' y4 O3 ?8 x - glDisable, GLenum<2929>
; \' L. i2 ?% s7 h - glGetError
. @( l- p* L2 ]6 @! H: G9 [* y - glBlendFunc, GLenum<770>, GLenum<771>' X5 ^8 P* Q* E- ?% y
- glGetError9 H7 l0 E7 q8 }0 Q1 S0 o
- glEnable, GLenum<3042>
( F8 O( F6 y. L' \+ I& ` A: w$ p - glGetError
. D7 x( k1 ~4 n. Y - glDisable, GLenum<3553>3 a7 I; ~ w3 d" n5 c, n
- glGetError
" k* [1 G, ]6 u0 e - glBegin, GLenum<7>6 }) G2 |3 F$ q4 ?
- glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844>
* \) s4 B9 M# @" v3 { - glTexCoord2f, GLfloat<0>, GLfloat<0>! R i5 W2 T. N: F/ B7 {
- glVertex2i, GLint<0>, GLint<768>
8 X6 F8 w1 ^% e8 H$ b7 D" w - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>: c; A/ l/ m5 ?, I/ q
- glVertex2i, GLint<1024>, GLint<768>
% `* z, ~7 y6 ]5 X, b - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>6 v" Y0 P* X; t
- glVertex2i, GLint<1024>, GLint<0>% L1 J% m- V4 H3 Q
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>4 n; e0 Z9 j7 O* r
- glVertex2i, GLint<0>, GLint<0>! y) C: S, S& h3 F8 U7 d/ L
- glEnd
* P! y m6 W3 c- Q - glGetError) j, U: f: N4 \
- glEnable, GLenum<3553>7 l2 x& m7 a M2 G; Z# E( u) T
- glGetError
. M' G& m+ c1 E - glFlush& S( ~1 E) o4 e6 k
- wglSwapBuffers- N' S7 ^- o' B2 T4 g4 f+ k k
- ---------------------------" G% [( R# c3 z J# h# {
- , HDC<-33484711>' ~" s6 I' `! F' [1 X6 R
- wglGetPixelFormat, HDC<-33484711>3 m) a' I' n4 W
- glMatrixMode, GLenum<5889>
/ k8 N) U7 k& m; U | - glLoadIdentity
% ~6 J3 [: G* N2 T* w - glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120>8 D4 I" j+ h, G- o; G. @
- glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768>
8 z- R* G5 a9 m( Q# m# U, U- N( G - glMatrixMode, GLenum<5888>
. \) A" L. Z8 R( |2 |( S - glLoadIdentity" k" U- `8 H( _% j+ p
- glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0>
5 r& ]! f+ f$ `1 L# q - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>/ p7 d7 z }2 N% B7 ]0 o( S
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>: s! D4 }$ P$ a( }; N B
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>; ~4 s! W7 p# G& G
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>
9 \/ `4 `; b0 ^5 E5 j! a. z7 b, L - glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
8 e0 [8 h, l4 L- q - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
i, |7 @" O, X& Y9 a3 a4 P0 h - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
7 _) ~8 L" B3 u* \' ?+ }" J, G - glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>: u% c8 X' l6 u
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>2 c, D- Y7 G6 A3 n
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>0 w( e6 v$ Q& A7 }( a
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>: L3 n- J6 S0 i# I9 n" M
- glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>& Z6 E6 G# X$ Q0 W# C+ f `; ?8 @
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>; b' O/ k7 Y1 y- O
- glClear, GLbitfield<256>2 l" D$ K- f; _! V/ Q; F1 H9 K
- glShadeModel, GLenum<7424>
& I! y6 d9 L7 j) R9 c9 A' V - glDisable, GLenum<2929>8 h3 \1 U' t1 \8 ^; h
- glDisable, GLenum<3008>
3 l ~- q9 j w1 s& Z$ d' A6 e5 A O - glDisable, GLenum<2896>: Z. O" D6 D* v ?
- glEnable, GLenum<3042>7 W) W+ d9 P! Z. R" Q( M# u, e/ N
- glDisable, GLenum<3553>
' Q3 _6 H0 I$ j6 u1 I; o' a - glBindTexture, GLenum<3553>, GLuint<631>/ D+ p6 _) ]: W9 M2 z O/ ^1 r
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
6 H0 D4 N7 T& }! t - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
$ x3 g7 m* ^" E. G - glClear, GLbitfield<16384>% ]* f8 C9 C0 A
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>2 h. c3 Z- b9 j& \! [( q% r
- glEnable, GLenum<3553>
, }( w5 g0 E' f3 ` - glBegin, GLenum<7>
1 t/ b) \. \. f( L - glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
3 N+ U9 _& i% U! k% e# C" }, M - glTexCoord2f, GLfloat<0>, GLfloat<0>: V7 U( x- H6 ` ]) L
- glVertex2i, GLint<0>, GLint<768>
1 R4 O6 B* X; Z* ~% f7 R - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>1 g4 t8 d/ w" `: N. b$ k% `
- glVertex2i, GLint<1024>, GLint<768>
! T ?- t# N/ Y: L( W - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>, @& y: Y2 q; f0 c+ G5 ~0 _
- glVertex2i, GLint<1024>, GLint<-256>
5 D9 r; e3 u9 q( W - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>- H6 B7 o! A" k1 l2 R% @8 M; h
- glVertex2i, GLint<0>, GLint<-256>8 G, J! \* T% C- V7 C
复制代码 7 g2 n; x; \. o8 c) E7 B }
, H$ Z5 g: y. i6 B% k4 ` T1 x
|