本帖最后由 shane007 于 2023-8-25 17:31 编辑 " P7 y8 `$ ]9 S
U3 j4 ?# U* s" {1 Q本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,/ l* n. \1 m! R8 H4 X
游戏应该实际只用了其中1个,暂时作下记录。
; W4 |0 P9 N4 u8 r {0 q9 a+ x) o S) @( W8 m8 {
DirectDraw是由bin目录下的ddraw2d.dll来完成的。
, B& F, _: S$ r, U/ K/ X6 h% K" H以下是一处的初始化代码
* a; ]4 S$ _( l3 T+ Y1 I/ n- CSpace:10015015- K y T- h# p& |
- CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j$ i( U! c( M% k* ~4 r5 d
- CSpace:10015015 mov [ebp+lpGUID], 0+ i1 q ]) }% k* m/ D
- CSpace:1001501C mov eax, [ebp+dwNewLong]
% m$ |( j7 N2 b; b9 S - CSpace:1001501F mov ecx, [eax+230h]7 a- z% T1 _4 U) c z, R4 r
- CSpace:10015025 movzx edx, byte ptr [ecx+1Ah]" j! \4 d" N6 [, w( |! G
- CSpace:10015029 test edx, edx; |2 o2 }( P* _/ A$ T% J, T8 c
- CSpace:1001502B jnz short loc_1001503C2 a- l% |9 J" L+ E* q
- CSpace:1001502D mov eax, [ebp+dwNewLong]
: q0 h, {; G) K- E8 e% y* o4 I6 w - CSpace:10015030 mov ecx, [eax+230h]4 F# h6 `( l! T' V9 {- b% |
- CSpace:10015036 add ecx, 8% x. M* \9 ^8 Z t T5 Y9 m
- CSpace:10015039 mov [ebp+lpGUID], ecx6 v5 b' Q. P/ `8 h
- CSpace:1001503C# u1 G. D+ F( Q
- CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j
/ O! \/ S# V/ R - CSpace:1001503C mov eax, [ebp+dwNewLong]
1 K8 O p9 B( P3 x - CSpace:1001503F mov ecx, [eax+230h]* e$ H+ x! g" ~$ M, q* \
- CSpace:10015045 mov edx, [ecx+1Ch]! }- ~9 E. k; ]6 n
- CSpace:10015048 push edx' S* p8 v( M: m* A6 ~: ~
- CSpace:10015049 mov eax, [ebp+dwNewLong]
* @4 W: G; K5 Z8 V+ K. ^1 ^ - CSpace:1001504C mov ecx, [eax+230h]
) R/ W5 l. Z: D' g1 z% F - CSpace:10015052 mov edx, [ecx+20h]
. X: O$ C% M$ e& I( O - CSpace:10015055 push edx
& ]: H% `1 h! a9 E% ? - CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)"0 w- _8 \5 q3 p n v
- CSpace:1001505B push 3* C3 g% n4 [% ~; k
- CSpace:1001505D mov eax, [ebp+dwNewLong]
8 a3 W9 s7 D4 G0 P7 `; ` - CSpace:10015060 push eax
! j t) E2 L$ M9 y; Y* L6 K - CSpace:10015061 call sub_1003882A0 U# y# l0 Q3 q( p
- CSpace:10015066 add esp, 14h
) J1 [4 c- K2 G - CSpace:10015069 push 0 ; pUnkOuter
; ~- R7 W; Q. z& [' g - CSpace:1001506B mov eax, [ebp+dwNewLong]6 ~ X- \0 o* O9 L
- CSpace:1001506E add eax, 1DCh
( }$ @; n3 }7 a( U8 ?" c - CSpace:10015073 push eax ; lplpDD
& k& O2 \8 a: I: U# m3 d% U - CSpace:10015074 mov ecx, [ebp+lpGUID]9 u8 [& S# @8 Q# I0 P
- CSpace:10015077 push ecx ; lpGUID7 e* b- v( P [# ~
- CSpace:10015078 call j_DirectDrawCreate
Q$ O a% b U% _ ]9 Y - CSpace:1001507D mov [ebp+var_14], eax
# W# n9 q, w3 t# [4 q; x. o8 L/ p - CSpace:10015080 cmp [ebp+var_14], 0
2 t! W; }" t2 e- R$ y - CSpace:10015084 jz short loc_1001509E4 P) T3 Q: V$ | X
- CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n": F1 F: Z& Q% @# \/ x6 L& q8 @
- CSpace:1001508B mov eax, [ebp+var_14]
5 Z( y6 j$ _' h& K2 H - CSpace:1001508E push eax
, k- D) F3 o: I! N - CSpace:1001508F mov ecx, [ebp+dwNewLong]
: y. i, {/ U* ~2 j+ g - CSpace:10015092 call sub_10038F3C
" m' o. @/ F! p) L7 W8 r/ g - CSpace:10015097 xor al, al
8 v4 E9 y0 f- C6 p - CSpace:10015099 jmp loc_10015173
复制代码 2 g) E5 G) R7 Z4 {9 x: ]
) P7 B' Q, I& ]& L" `
0 C3 ]# n5 i/ a+ b2 p/ a
我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log.5 n8 r6 h, Q% x, v
记录到log_GL.out文件中。以下是摘录的一段。7 p4 T& r, V* o9 X
我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。1 X: t. F+ U. X* n
以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?+ z4 Y- P& R `
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
8 s8 A# }$ Z. Q! u; \. W1 a - glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>0 g/ B) L& P% f5 C5 V i* K# Y
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>9 u4 H$ ]7 o0 w2 q. `
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>2 { T& _4 u! K3 Q8 m/ k
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
3 V0 g' D* v1 e - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>& c; Z- d# f, X% Z& R
- glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>* {0 Y/ }& n8 f) @9 l% A) Z
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>- {5 C" v0 u+ c, a, T' J
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
8 ]( w( R2 h5 _3 y4 [3 p& H2 Y9 G$ { - glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>5 @+ e! Q# d7 W% w* l7 @2 r* C
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
- u, n$ T7 {( c1 O+ E+ ~7 W - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>
9 T3 i9 q5 z) \& _* @! o: z4 d# d - glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
$ \$ [$ j4 _0 P% w9 C - glClear, GLbitfield<256>( g0 X: U2 U0 x
- glShadeModel, GLenum<7424>
8 v4 q' u/ q6 Q# j+ d5 e0 P1 q - glDisable, GLenum<2929>
$ e. Q+ y4 _1 [ [5 `5 V0 W' E - glDisable, GLenum<3008>
3 i0 e: K5 w- T# Y2 @3 ] - glDisable, GLenum<2896>
) d4 g* K' ^+ w2 E. q# J" i - glEnable, GLenum<3042>. v5 c' D: i: h" \+ b
- glDisable, GLenum<3553>
+ U+ Y p* t- T# b5 q4 O - glBindTexture, GLenum<3553>, GLuint<631>
. n2 M F3 t# M2 l - glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>) i2 m# ?; L; ]% u v0 s
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
9 l. e. Q/ q/ W/ I - glClear, GLbitfield<16384>$ W7 J+ w s6 C" Y
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>3 w" L7 r: ^, f" c- j# a
- glEnable, GLenum<3553>
% a2 K) I3 n8 N) y$ d, x$ ~ - glBegin, GLenum<7>3 y4 x1 H6 Z! m, ]" M5 T; ?, y
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>- ~5 |7 X3 C/ ?! K. B
- glTexCoord2f, GLfloat<0>, GLfloat<0>
/ G( ~0 j$ h: c; ` - glVertex2i, GLint<0>, GLint<768>
: m: i) s, ]% O& s- b - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>& C% T4 d- p4 G( G5 o: Q
- glVertex2i, GLint<1024>, GLint<768>
! m- H& L) F- G - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>8 R V4 n- @7 E
- glVertex2i, GLint<1024>, GLint<-256>
" x: T; v3 E6 k4 Z$ e - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
8 d5 X% u' a- @" V% S! M# r - glVertex2i, GLint<0>, GLint<-256>
2 h. q& t4 q1 h6 j2 N. ` - glEnd
4 i; q. Z I" ?4 O0 N) p5 ^ - glShadeModel, GLenum<7424>
9 c0 `% u& T/ y2 G( ?, w - glGetError
3 B; S1 e* m* W/ E) a7 f - glDisable, GLenum<2929>& _' J$ l% p5 x& ~1 S
- glGetError( E3 G" _$ M0 S5 j; m
- glBlendFunc, GLenum<770>, GLenum<771>: p- g2 e3 T2 Y: G5 k2 a" F" G
- glGetError7 c0 o; D$ B0 w* ]$ ?) M8 p' b6 Y
- glEnable, GLenum<3042>1 p# D2 u5 [8 f1 f6 Q Y5 R* B) w
- glGetError
$ N: _: U1 W. h$ y4 l - glDisable, GLenum<3553>% S ^( _/ e/ @# ^* g
- glGetError; z6 ]- A. c' A" @
- glBegin, GLenum<7>
; K- v9 c% k3 f7 [8 i9 h - glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844>
- E' ^9 J2 z) Q4 M2 i - glTexCoord2f, GLfloat<0>, GLfloat<0>- }* h1 l# P0 m
- glVertex2i, GLint<0>, GLint<768>
+ R. @2 O# n$ }" e3 e - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
D- I7 S) e+ `# E; I - glVertex2i, GLint<1024>, GLint<768>. v- J& ~( d% w9 t: P; ?
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
$ h: H5 Z' M5 _ w - glVertex2i, GLint<1024>, GLint<0>( \. J! p6 w6 j5 @" y
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
& b' N5 n0 V+ [, H; p( |* v) b - glVertex2i, GLint<0>, GLint<0>
" T- | x$ x- p% O4 a3 z J* I; y - glEnd
2 d8 P' T3 u/ k3 W v - glGetError
5 B' U3 u" y4 ~% o - glEnable, GLenum<3553>
) V4 k8 \: |+ [- E - glGetError, Y i; T- ~, m! [' w# ]
- glFlush
4 S" y9 {3 d" i% h; r - wglSwapBuffers- O- w" b2 a3 U* Z$ L# M
- ---------------------------. O% \6 p! w: M& I5 X! X5 B$ W
- , HDC<-33484711>
7 ~8 }$ D7 i9 T ~ - wglGetPixelFormat, HDC<-33484711>
) u- k" I _( h3 } - glMatrixMode, GLenum<5889>; |: i g" X7 C8 A( D9 W1 y; x
- glLoadIdentity/ f: I0 `2 a9 ^5 V2 A5 c
- glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120>" q. {4 d% f7 K+ M) v9 |
- glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768># t) l5 C3 a$ q: ^; ]8 o; y- {
- glMatrixMode, GLenum<5888>
0 J |$ O+ q1 r* L& A - glLoadIdentity. n8 b- C/ M* ^; `
- glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0>
2 E! [3 @) h x8 w \ - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
; L/ D8 ^, g/ I- B - glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>7 I K5 F7 A8 P0 J& K
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>
) L0 V5 p7 |6 _$ K5 O - glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>0 ], A8 a( G" f# H
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>) A% m$ c- J" V
- glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>6 G2 D; N/ j0 D
- glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>6 g: E6 J2 U' ]1 \
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>1 G9 a( i! v8 S6 x
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
' I# C# \" T% P - glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>
( ]+ s9 N. b0 { - glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>( ?9 I# r% \6 g) p6 z
- glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>' e8 [4 b: n2 [* s' h ]
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>, t) @4 O7 d! f) z
- glClear, GLbitfield<256>- N2 {0 u# }3 b. E, X. e
- glShadeModel, GLenum<7424>
$ l; Z6 O) b4 [, X - glDisable, GLenum<2929>
7 b, ]( r, E7 h+ C6 A - glDisable, GLenum<3008>) E* i' c7 I* c) \' T6 Q
- glDisable, GLenum<2896># d x4 b" f6 e2 J- x$ D. i
- glEnable, GLenum<3042>$ R. l+ f0 a* E- q/ h8 p
- glDisable, GLenum<3553>
+ S, B" B7 Y- M7 j( \- a. } - glBindTexture, GLenum<3553>, GLuint<631>5 {7 p0 K( E4 p. [) A' e b
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>) [4 `; j% h" U3 J5 z
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>! f3 r+ x0 Z$ U% B }" Q
- glClear, GLbitfield<16384>, J( I5 p( H2 _4 k, b2 ^# W
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>; W6 y9 ^0 ^8 J9 b) @. u
- glEnable, GLenum<3553>. d2 B; ]; }3 f
- glBegin, GLenum<7>* ^$ i* ]$ j+ B- K- k0 u4 I
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
* q5 ]: W, D% ~! B5 g4 w) } - glTexCoord2f, GLfloat<0>, GLfloat<0>, W: F& ?( f: d7 O6 e
- glVertex2i, GLint<0>, GLint<768> `1 p# G3 k4 [$ o
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>2 J. F$ D. E3 P# d: T: R6 S
- glVertex2i, GLint<1024>, GLint<768>
( X$ F' m5 ^5 X9 w. o. E' W - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
; Z0 m4 `# G' ?: K0 \3 F x7 o0 ^, k - glVertex2i, GLint<1024>, GLint<-256>9 r; l9 l: [' f2 S
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
! S* o) L8 Z d - glVertex2i, GLint<0>, GLint<-256>( P, c" w) k) w4 P6 a, Q6 N
复制代码 - u6 j2 S; y; S5 @& O
4 S4 m) ?: G/ C% U
|