本帖最后由 shane007 于 2023-8-25 17:31 编辑
- A& t. Y1 S& x6 N
" i0 d' Q9 \( k0 n6 g8 X) Q* `) x本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,
* V! Q% n M0 [$ y) m* l& s游戏应该实际只用了其中1个,暂时作下记录。
/ V' }' Y- l+ z
! F7 v% K) d& ~( {+ \DirectDraw是由bin目录下的ddraw2d.dll来完成的。- H8 m7 {% K& s
以下是一处的初始化代码0 T8 e/ Q8 a, p2 N; Z& u
- CSpace:10015015
' i5 d* F- W* o5 s- k& Q( M6 @: ]$ a - CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j0 ^) b) A4 c9 \/ j9 B
- CSpace:10015015 mov [ebp+lpGUID], 0; T' A) R& b) N5 F/ \
- CSpace:1001501C mov eax, [ebp+dwNewLong]
2 @$ C6 J: y1 U3 Q/ Z$ ` - CSpace:1001501F mov ecx, [eax+230h]" P! G7 a# P, v" t" H) z
- CSpace:10015025 movzx edx, byte ptr [ecx+1Ah]
$ a! l3 L0 u$ g: q - CSpace:10015029 test edx, edx7 r' m0 b8 ]1 u q! _5 m
- CSpace:1001502B jnz short loc_1001503C0 y0 _3 J2 U9 H) ?- n+ h# Y4 E6 R
- CSpace:1001502D mov eax, [ebp+dwNewLong]
5 ]% }7 ?" g' D - CSpace:10015030 mov ecx, [eax+230h]4 M9 \1 B. g: V9 @ ~/ P+ e
- CSpace:10015036 add ecx, 8+ M3 t& T( t' ~ w3 q
- CSpace:10015039 mov [ebp+lpGUID], ecx. z) \" P" O' ~
- CSpace:1001503C9 H) D3 k% N+ R# a/ x0 H+ \7 G
- CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j' E. Z" I2 E; Q
- CSpace:1001503C mov eax, [ebp+dwNewLong]: ?, B( m8 U8 _- j k( P
- CSpace:1001503F mov ecx, [eax+230h]
' M: j7 B; F% Q - CSpace:10015045 mov edx, [ecx+1Ch]7 i7 v3 l& M# V2 } y4 {9 b
- CSpace:10015048 push edx
( o( o7 V9 e5 z5 M' y' k5 b - CSpace:10015049 mov eax, [ebp+dwNewLong]
]5 n$ ]/ ^5 w% E' g* K6 | - CSpace:1001504C mov ecx, [eax+230h]
" l( C, P5 a7 C3 Y3 w& X. z$ Z! O* A - CSpace:10015052 mov edx, [ecx+20h], T( E1 M: d% l' F6 u: n* a
- CSpace:10015055 push edx1 S; w4 |9 ]# y
- CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)"
4 y9 u* X$ T' ? - CSpace:1001505B push 3
l2 V1 ]- U4 O) @8 g! b" z - CSpace:1001505D mov eax, [ebp+dwNewLong]
# T5 [9 F R f( w - CSpace:10015060 push eax. P+ U* m( o) K* c. v
- CSpace:10015061 call sub_1003882A. C: n4 N. @' q0 j3 R% K1 t9 k$ t! ^
- CSpace:10015066 add esp, 14h& K! |! h% v. E/ P4 t
- CSpace:10015069 push 0 ; pUnkOuter
3 O8 b# m$ R& q J4 d) t - CSpace:1001506B mov eax, [ebp+dwNewLong]% z+ a8 z! A3 s5 _4 d( }' G
- CSpace:1001506E add eax, 1DCh
' B0 q0 |* b" _/ C - CSpace:10015073 push eax ; lplpDD
: K I0 U( S1 X8 [ - CSpace:10015074 mov ecx, [ebp+lpGUID]
! w2 b t! l. K- p2 t4 B - CSpace:10015077 push ecx ; lpGUID5 h% e+ n) M0 Y# q: M) P
- CSpace:10015078 call j_DirectDrawCreate. w/ I: i: n# l' }3 Q* \
- CSpace:1001507D mov [ebp+var_14], eax
! f7 Q6 w: }5 @5 R' B+ ~ - CSpace:10015080 cmp [ebp+var_14], 0
1 {6 k# G$ r4 L7 h - CSpace:10015084 jz short loc_1001509E
0 s2 c& V% ?$ I4 M$ W# L - CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n"
% i8 [: {: j$ z- X - CSpace:1001508B mov eax, [ebp+var_14]
! A0 N$ k3 P5 w - CSpace:1001508E push eax0 W( Z1 \+ ^. I! K6 X. i$ G2 T& E' l' J
- CSpace:1001508F mov ecx, [ebp+dwNewLong]
) B, ?+ o5 L. v7 U - CSpace:10015092 call sub_10038F3C: j. G! ^- g& X- G
- CSpace:10015097 xor al, al: b, I/ F9 v, c* O" j1 a8 O
- CSpace:10015099 jmp loc_10015173
复制代码
7 o# H' M9 z5 {% S- p5 R% |* b3 I/ V' L" e4 h
) T+ e% ?9 K R4 n我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log.
0 }0 q+ ]; D, D) E `3 a记录到log_GL.out文件中。以下是摘录的一段。
: V8 ?4 W# R, N0 l/ G我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。; j$ m6 [" P+ k* g! Y* A. F
以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?0 Y% _3 ] d1 p. A4 e
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
5 m$ b& u% f0 j6 U, T3 `, `5 E - glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>* Q7 Q# x( [( ~
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>% Y2 I9 B# \# |( D/ }6 M
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>& P( r4 Z! [5 ?* F) c& I2 q/ B
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
1 k& c- f8 |/ u. y% k j" ] - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
% C* A& X. c' {) y! j - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
4 S3 X3 l5 q) G, F3 ` - glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>* y! O7 D; b/ h
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
`: `* ?9 m4 e. \) Q9 f; d - glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>
: d& c7 u5 R2 W/ Q; M3 L, v - glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>9 v+ z6 m# u7 {
- glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>
J) e5 F% O0 j* k j- d - glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>$ v- D% I/ J# w5 k, Q4 n+ \# w
- glClear, GLbitfield<256> p3 w0 ?( A) W" ]' D s
- glShadeModel, GLenum<7424>
N4 I, R) m% {: h" p- ]* _ - glDisable, GLenum<2929>
, ^$ o& a. X k) I1 V - glDisable, GLenum<3008>
/ R( O/ S* n7 @4 f. c5 X - glDisable, GLenum<2896>& u. T2 Y1 n! g4 P2 { D. f" T' P
- glEnable, GLenum<3042>$ A3 V3 k: {. p7 [7 q2 b- W4 Z
- glDisable, GLenum<3553>
4 s/ D1 N. r3 L! z$ m - glBindTexture, GLenum<3553>, GLuint<631>0 H& N+ X" j3 w n. E: T
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
$ t. e+ G; O( I# F, ? - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
+ i' L( w' e) K3 ^8 [" C4 T1 f - glClear, GLbitfield<16384>3 o ?: g7 @& Q i; E5 j$ {7 \) B) ~# P
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>
7 `% T' q O# F# }5 K - glEnable, GLenum<3553>
1 G- A. W, _& X B) ? - glBegin, GLenum<7>
! U- k# W# f. X - glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>- U G0 g. g0 V- O
- glTexCoord2f, GLfloat<0>, GLfloat<0>
/ ?/ f+ d5 f6 p3 i - glVertex2i, GLint<0>, GLint<768>
1 I' B# z3 t' y - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>9 o. @8 [; b5 [4 M3 m6 X
- glVertex2i, GLint<1024>, GLint<768>
" H# S M/ J/ A0 I& w+ q0 m - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>$ v: t+ d1 d; I4 E
- glVertex2i, GLint<1024>, GLint<-256>, s# p- T0 ?1 R3 Q
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216> q% W$ T8 w4 ~' c2 m; C# [
- glVertex2i, GLint<0>, GLint<-256>
; f- Q! s- M$ Z! S# `4 [ - glEnd
" n+ t) ~9 a% \9 _ - glShadeModel, GLenum<7424>6 ^ G9 _ K0 R: h3 F
- glGetError
# j5 K X% V: [5 T* o* k+ M3 M7 x" P - glDisable, GLenum<2929>2 w o- Q/ N1 W6 m) g/ Y$ e" n( a1 A
- glGetError6 m. M+ S, r& Y V! e: t9 w
- glBlendFunc, GLenum<770>, GLenum<771>8 W: U2 f) l( T9 p$ R0 E5 W) C
- glGetError
* r* ]6 Z% E8 m3 m- J& B4 C - glEnable, GLenum<3042>
8 I0 t+ M5 Q; G5 ^8 S4 h! ]3 U/ R - glGetError) Y; M4 c: z8 m5 |# j* P2 B
- glDisable, GLenum<3553> y. L5 e* k# g# ^7 F4 }2 i- [* S
- glGetError
1 z. Q; J' o5 D- v - glBegin, GLenum<7>, |/ n6 L( u% X0 h+ I* k4 I
- glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844>
- `5 e8 y7 T4 w# ~5 {7 t - glTexCoord2f, GLfloat<0>, GLfloat<0>
& F9 r' i$ ^& _6 a1 w; w - glVertex2i, GLint<0>, GLint<768>/ b7 j& N4 J. z4 s. L( @
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>0 @8 \: d. a% U6 Y
- glVertex2i, GLint<1024>, GLint<768>4 D* ]0 C8 J5 s4 B' n
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
3 d ^1 g% P% _& f" ? - glVertex2i, GLint<1024>, GLint<0>4 r) q. |0 Z* P" p6 G
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>+ X4 {5 r/ I" S ]4 b, _* m: r
- glVertex2i, GLint<0>, GLint<0>8 s ]" L3 _& J# m& t" J
- glEnd
" q3 I2 ~( |; e" z1 \3 ` - glGetError
@$ _ {' \+ e/ j! C - glEnable, GLenum<3553>
& g4 I: p W2 T5 j7 N; N2 ~. ? - glGetError
7 D' U, _! S1 v2 e: X' U" R- o8 \ - glFlush
! A. i; M7 J- ` {2 q - wglSwapBuffers' l7 U( _; P: U& Q* {! u
- ---------------------------
# y' ?1 @: ~* m* Q! w9 G - , HDC<-33484711># O* |$ _# K; M# `& C+ q5 [5 y! X
- wglGetPixelFormat, HDC<-33484711>
* E* Q# p( y' y1 q - glMatrixMode, GLenum<5889># r: r! N# q9 r$ ~! K! L# O
- glLoadIdentity' I1 M( ]/ a6 K9 e3 U* }
- glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120>3 R! S& P5 [: V8 Z
- glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768>' W' q" T* u: v0 B8 C) e" p
- glMatrixMode, GLenum<5888>9 d1 k& a! U& U9 @: M6 k$ i9 c
- glLoadIdentity% Z- p2 k& A" P4 s% Y6 B
- glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0>6 i4 m% @1 g9 ?! K) }" L- |* \! Y7 y% {
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>! p5 m. c( Q8 O- Z
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>( {& E) f6 U7 B X8 ]4 g% u
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>$ u. w8 [; T9 O' Y
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>+ `6 z! h! }# A; \/ E3 b' _
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
4 |- b: _% t! R9 A2 T - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
: O! J) d5 S! ?( Z+ e! s& J5 s- x - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>0 |& @- `. i; \, z( V( H
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>7 E4 Q% }5 U: r8 _4 r. k
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
. O. ^6 c0 |6 Z6 `- }. {1 ?% ? - glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>7 M/ e4 r! Z- B6 ^
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
* b( [, U+ n( p - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>
* ] }5 P( a& p$ e7 g- N; ? - glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
' G2 L: q; a* _) e: f: n% ~/ J - glClear, GLbitfield<256>9 _# y! ~1 ^+ |+ c% F% _2 |
- glShadeModel, GLenum<7424>
5 ?" d. k# Z: j1 t. x - glDisable, GLenum<2929>
7 \' k' _; `3 m8 E- M, g - glDisable, GLenum<3008>
, q4 q8 c/ a( `2 h - glDisable, GLenum<2896>" H- ^% O6 b' k% c+ G Y+ { F; o
- glEnable, GLenum<3042>
$ @/ x& O0 D; L9 ?) h* b - glDisable, GLenum<3553>6 ^( A, K) M% x* E( W* A' g
- glBindTexture, GLenum<3553>, GLuint<631>
( T5 k) A/ o# S - glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
2 B* b( `2 J* o) E - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
$ i8 z! L3 v! c - glClear, GLbitfield<16384>, ?3 ~: w" o/ Q1 U) {! S
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>( Q7 H" ?% P2 c1 D
- glEnable, GLenum<3553>
8 [7 N2 W6 P A - glBegin, GLenum<7> d& J5 F) z L% }9 D" T! _
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
% E! M: C8 C; U- Y' Y% D - glTexCoord2f, GLfloat<0>, GLfloat<0>* G% i+ s/ ]6 X* n8 \: g5 r
- glVertex2i, GLint<0>, GLint<768>
0 x- u B* s m; I. Q - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
6 P4 A' e. L7 q8 R" C% b - glVertex2i, GLint<1024>, GLint<768>% E5 E& D8 Q) b$ @: U4 s
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>) Z) ]. k+ U/ K S/ C1 I
- glVertex2i, GLint<1024>, GLint<-256>
# I1 p: \% \( \# D& [ - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>! t3 c2 O+ O! [- }9 y5 f. u8 A
- glVertex2i, GLint<0>, GLint<-256>; `4 R* [2 b" M, d6 L* l
复制代码 " d( Y6 Z O6 f" R
1 m1 G" d; V: b4 Q, j
|