本帖最后由 shane007 于 2023-8-25 17:31 编辑
0 [1 `! t# B2 \
" l2 s+ T* ]6 u0 }( K5 w! _本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,
+ m6 Q6 [7 N/ z0 w) y游戏应该实际只用了其中1个,暂时作下记录。2 [% w0 {4 a5 C
1 ^" M9 _# z" b7 xDirectDraw是由bin目录下的ddraw2d.dll来完成的。" z( G; q+ L, Q6 U8 s) m8 l/ u
以下是一处的初始化代码
+ o" }& d' r, t7 {: `; Q" E+ o) B# I, U- CSpace:10015015# g" H4 B K* z0 G
- CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j( F7 Z0 o, e: r) C
- CSpace:10015015 mov [ebp+lpGUID], 0
7 F. n, r7 M5 E3 R7 [+ R$ a - CSpace:1001501C mov eax, [ebp+dwNewLong]$ |3 R( M$ J& X; r9 S
- CSpace:1001501F mov ecx, [eax+230h]
& N' d# }" e( R0 N - CSpace:10015025 movzx edx, byte ptr [ecx+1Ah]
( }6 u: [0 `' V X- K - CSpace:10015029 test edx, edx
: f' N, U5 |$ } - CSpace:1001502B jnz short loc_1001503C
/ m4 k" j6 R1 ~! e8 k4 E - CSpace:1001502D mov eax, [ebp+dwNewLong]( d5 `- y2 F; s. d
- CSpace:10015030 mov ecx, [eax+230h]
5 [2 a+ @; Y, s - CSpace:10015036 add ecx, 8
. t$ n8 n( g3 m) Q% }. m( F3 j2 A - CSpace:10015039 mov [ebp+lpGUID], ecx
) z0 I1 n# g6 \8 O' a* S - CSpace:1001503C
6 h, I6 u9 N2 Z4 K0 b. l* | - CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j% M; z3 ^! V8 s3 e s. _/ W
- CSpace:1001503C mov eax, [ebp+dwNewLong]
0 X$ d4 q; ]2 e0 y' T" ` k - CSpace:1001503F mov ecx, [eax+230h]
[9 a: T; L, c9 p+ g4 r" e/ _ - CSpace:10015045 mov edx, [ecx+1Ch]) G4 c! R+ I# m( a9 ? F8 {
- CSpace:10015048 push edx
% p/ t4 M3 W, a9 C0 y3 c - CSpace:10015049 mov eax, [ebp+dwNewLong]
6 K# c7 Y J5 f3 l$ f+ `- h - CSpace:1001504C mov ecx, [eax+230h]
n* F6 H+ U2 Q1 d - CSpace:10015052 mov edx, [ecx+20h]5 T% Y" h% k, ?6 U7 _8 B0 d3 s
- CSpace:10015055 push edx
/ B/ ~; a. O: q, I4 Y; T - CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)"
9 U4 T% o0 g) [$ q0 O, ~ - CSpace:1001505B push 36 g$ A* A1 l3 a' y) Y7 \4 Q, |
- CSpace:1001505D mov eax, [ebp+dwNewLong]+ D3 E; t& S q9 G0 R
- CSpace:10015060 push eax* v& \. D2 z8 }4 H# r
- CSpace:10015061 call sub_1003882A
& f8 t) N1 _8 _# f! K2 N$ l - CSpace:10015066 add esp, 14h7 c$ B j& V- e+ V1 X
- CSpace:10015069 push 0 ; pUnkOuter0 W+ f# X' \0 i- q& Z6 [
- CSpace:1001506B mov eax, [ebp+dwNewLong]
M5 V: @% u; @ - CSpace:1001506E add eax, 1DCh- H* I6 o. h! P4 d/ ^+ B6 c. Y5 e
- CSpace:10015073 push eax ; lplpDD; w: K8 \& I3 ]% O- _
- CSpace:10015074 mov ecx, [ebp+lpGUID]
$ y$ b, o# F ]! E. a - CSpace:10015077 push ecx ; lpGUID$ g. U9 K5 {4 {5 q } T
- CSpace:10015078 call j_DirectDrawCreate
) E( Q% c% n( u# }3 h P8 O6 c - CSpace:1001507D mov [ebp+var_14], eax
- T5 U9 j* _8 D/ K/ ] - CSpace:10015080 cmp [ebp+var_14], 0: X' q9 Z: \5 R$ m* m8 B0 U
- CSpace:10015084 jz short loc_1001509E% P/ f1 Q# D* a( A @) A u
- CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n"
1 e) X2 ~6 V, [& z P. W& Z - CSpace:1001508B mov eax, [ebp+var_14]" j. D: b- `) v0 K7 H
- CSpace:1001508E push eax
. _: D+ v1 B: {$ ?4 X$ k- W - CSpace:1001508F mov ecx, [ebp+dwNewLong]3 g% b1 @8 l( _/ N
- CSpace:10015092 call sub_10038F3C
- q& d. w# o. W3 M - CSpace:10015097 xor al, al
8 T5 n5 S8 O' w$ h - CSpace:10015099 jmp loc_10015173
复制代码
4 P x t' M, T3 w& F' M* H4 E( ^9 u
, X7 u$ p, [* a% j我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log.
$ m$ g/ U2 \) o0 }0 U记录到log_GL.out文件中。以下是摘录的一段。
, I C( U+ f# B- h. _ K6 {% |8 H我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。( k6 G8 {) C% C V
以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?
% s0 ^: u/ \" Q1 Y5 _; g$ J; m8 D- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
. U/ m0 l: X* Z5 v7 P - glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>
$ |+ y- T+ C& ]/ g5 _ - glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>% J. i- z$ d0 i6 s) |0 o
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>- m5 F. y1 W# W$ A+ I
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
9 @/ ]- f8 Q; y( p) F - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>! d' y' P! Y( ?& l
- glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>! q6 C! F+ V& u ^: S
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>; n: o$ G" A& i( @1 S) x5 Q* e
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
& m8 l- I$ g$ F: C Q% z, I - glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>( S3 ~2 z; `: c% K( X3 {5 }
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>* s" @8 N! m; K! P& z
- glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>, m3 o( A8 J9 \1 i. `& N8 ~ N
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>6 c& c6 N# o! T. }; L. u8 D& z& l4 F
- glClear, GLbitfield<256>
2 P- S" ^+ g9 d4 @( o, x4 [! c& D' u - glShadeModel, GLenum<7424>2 [$ e1 Y7 [* C+ a' O3 Z' U1 }
- glDisable, GLenum<2929>1 i2 U( A) M% P1 C' K2 v1 f
- glDisable, GLenum<3008>/ R& s% ^& _' Q+ ~% D6 w3 v( Y9 ^) X
- glDisable, GLenum<2896>
- Q# x9 n8 Y) }3 Q; X - glEnable, GLenum<3042>8 v M- `0 I; t! `4 a) Q: D
- glDisable, GLenum<3553>" z: t* {0 ~# ^& _: j- R4 D9 o
- glBindTexture, GLenum<3553>, GLuint<631>
# r3 Z+ z6 F. p# n. ~7 W - glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>- R" W: }6 N# a/ ?+ m& l
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
5 K1 c9 i9 Z6 A! Z" z. k( }8 e - glClear, GLbitfield<16384>
, M% x. g% b) h" V6 e! A1 K - glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>
, I: i4 s# d' y; U7 G - glEnable, GLenum<3553>* |; ]4 M( K# p1 D* `5 k* [
- glBegin, GLenum<7>
' {% U/ X s2 [$ R" F9 j+ E* u# ?) u - glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
& f w/ u9 @; y4 L! C* B7 g - glTexCoord2f, GLfloat<0>, GLfloat<0>
% R! b3 U5 z( a- ` - glVertex2i, GLint<0>, GLint<768>! L, J/ ~- ]; ~7 r9 K
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>$ | R' O% b( r3 f: E, r6 }% C
- glVertex2i, GLint<1024>, GLint<768>
; T0 u4 T2 \% ~ - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>' V- f/ a4 e! o0 C* Y3 l5 P
- glVertex2i, GLint<1024>, GLint<-256>
) T/ N3 s; B2 d* \7 R' j3 Y$ t - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
$ [ K% f; v5 Q7 l - glVertex2i, GLint<0>, GLint<-256> h: ?/ ] ~5 x
- glEnd
; D6 {$ B/ ?" r- z; J; T - glShadeModel, GLenum<7424>
: ?- X. ^; z6 a2 v2 n! s) \ - glGetError
! `% c3 [9 E, {* S - glDisable, GLenum<2929>1 E5 c |+ L, e6 q; p4 W
- glGetError, c+ A% t3 H' w$ z. D
- glBlendFunc, GLenum<770>, GLenum<771>
- X4 h8 |: Q0 M5 ]! O8 E7 c - glGetError `3 @# S" D" V! `
- glEnable, GLenum<3042>$ {1 c2 R9 Y' K# b j
- glGetError. H, E' j$ i! d7 ~ A: [5 [
- glDisable, GLenum<3553>. ^5 C9 E9 s1 t( l
- glGetError
) [: D- \: Z- K( N& W* {& ]% G - glBegin, GLenum<7>
1 v- c; t( C I - glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844>5 @# m! @ D& }+ b" |
- glTexCoord2f, GLfloat<0>, GLfloat<0>
+ }8 s2 E! C7 C9 \2 }5 B - glVertex2i, GLint<0>, GLint<768>
0 N# e ?3 v" p+ x/ ` - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>6 W6 y: o" d; F3 X
- glVertex2i, GLint<1024>, GLint<768>4 p$ ^: r( z, m c
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216> d. T V5 S; M
- glVertex2i, GLint<1024>, GLint<0>0 C- e# M" ]9 K$ k+ A
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>* w- _1 k* I; }9 d7 [" B, y; \
- glVertex2i, GLint<0>, GLint<0>* W! P' e. s* w3 f3 C
- glEnd
9 P* J B6 U5 Z2 A - glGetError
1 U$ e- H4 q% \. b* i6 U" k4 z i - glEnable, GLenum<3553>
7 R& D! Q) A2 h - glGetError" a: X+ l! k# l& i5 k
- glFlush J9 W. Y+ u/ r2 B5 f5 e6 Z' r* F h
- wglSwapBuffers) R1 ~6 U4 k2 l8 z
- ---------------------------
, w* K3 v9 l! u - , HDC<-33484711>
7 `$ T4 _0 D$ f: X - wglGetPixelFormat, HDC<-33484711>4 m8 p; B. o) C- l7 ~; j \
- glMatrixMode, GLenum<5889>5 @, Y% _, k0 S3 h8 h
- glLoadIdentity2 ~) e$ E& W C
- glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120>
( n+ V3 e% P* N/ o3 L* G, T - glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768>& L2 B3 K4 @4 W7 a: x
- glMatrixMode, GLenum<5888>9 ~" ]$ Q5 {# p7 Q( ~
- glLoadIdentity5 M9 B7 E$ n) I8 b' E
- glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0>" q7 ]0 R4 c8 i& }- ^9 r7 |" p* @
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
/ s5 n4 w6 Q* ?- C' M, R - glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>
( x! L" Z! C! d! R+ S& b, N8 c - glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>
- Q" V- S2 l r9 C% i7 |5 ^# q - glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>
4 Y% Y' q! l! x- J/ Y1 z - glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>% Z0 }5 F3 q- ~ X' G. \
- glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>) ]* @! S; D: o/ K
- glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
4 `5 O V0 p4 J" h- } - glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>5 b+ e$ @. T( ]; g8 ~. G; K
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
7 H" V5 i$ h% \3 G - glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>
; T$ Y$ L0 |" ?; i! t - glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
# V4 R9 k6 p/ Z: L - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>
9 q; {+ I( F4 r" ]- f* D - glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>" i5 h9 o- k% Z
- glClear, GLbitfield<256>
0 [5 g6 |# V0 E - glShadeModel, GLenum<7424>. A* f* e, d& r4 H A5 o) b9 G) y
- glDisable, GLenum<2929>
: I8 r% K: f e) j, x - glDisable, GLenum<3008>
3 F5 J; r6 S/ S% k% W - glDisable, GLenum<2896>$ o* l' K, r" p
- glEnable, GLenum<3042>
/ ~$ R7 l7 w! I1 r6 Y - glDisable, GLenum<3553>* r; L: v6 q+ _! E
- glBindTexture, GLenum<3553>, GLuint<631>8 l k, V w$ v' u+ w* h
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
1 R- i. z1 N; t" U - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>" _! j. I- i: h. M5 m
- glClear, GLbitfield<16384>* H( G7 f7 v) t- p3 P' D! H8 y
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>7 C; e |# b9 t! I0 k, }/ }
- glEnable, GLenum<3553> O6 F* `9 r2 L" ?) C
- glBegin, GLenum<7>$ P8 z! g& f+ z7 N
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>; }4 @* h8 u) L0 u
- glTexCoord2f, GLfloat<0>, GLfloat<0>
& x z j3 b; c, A, O# o4 U - glVertex2i, GLint<0>, GLint<768>
, {! _9 t/ U: {/ u0 a M - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
; k T8 d/ G2 p- L! h - glVertex2i, GLint<1024>, GLint<768>
1 h0 V2 F9 i3 R U( Y6 p0 _ - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
' }9 S8 ~& n$ W: `5 J7 U - glVertex2i, GLint<1024>, GLint<-256>
6 d, v! i) y# s1 P! B; D2 W% [ - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
. D! G# R N) X8 E2 c3 k - glVertex2i, GLint<0>, GLint<-256>5 D7 A% |- m: L) p7 [ a7 t, ~% c; D
复制代码
) D: b* m0 a9 r- k1 `; b' ~
" |: B. K, `( S5 @( Y |