本帖最后由 shane007 于 2023-8-25 17:31 编辑 * ~( y* k/ V$ P& F" }) N; J, x; Q
% `% A% W: d9 X4 ~- E
本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,
& S* i. ]- j7 l" a5 t游戏应该实际只用了其中1个,暂时作下记录。& |) r( t: |& R5 ^8 Q
* ~# | |6 F3 m% dDirectDraw是由bin目录下的ddraw2d.dll来完成的。, W* y" }; d. a7 c! o6 P
以下是一处的初始化代码
3 i3 a4 l( Z6 G- CSpace:10015015
0 t* A% d( ^: N' l3 g; x - CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j
( s! X5 t7 J& Y$ z - CSpace:10015015 mov [ebp+lpGUID], 0
% [. @1 G- }' ?* T. |; {, I, r' K - CSpace:1001501C mov eax, [ebp+dwNewLong]
+ g2 M$ v* u) w - CSpace:1001501F mov ecx, [eax+230h]% Q, U, l# |+ I2 z4 K9 L o# y
- CSpace:10015025 movzx edx, byte ptr [ecx+1Ah]
( G! [' h& i/ i0 Z6 E( T - CSpace:10015029 test edx, edx* k# Z# v6 O+ S% k) x
- CSpace:1001502B jnz short loc_1001503C7 A% c; F3 M3 k) o
- CSpace:1001502D mov eax, [ebp+dwNewLong]
9 {! r4 a$ f1 v; O% D - CSpace:10015030 mov ecx, [eax+230h]
# w. Z5 U# Z3 B4 W; S) i. H/ x/ G - CSpace:10015036 add ecx, 8: x# P, }8 Y% ? t5 @1 k
- CSpace:10015039 mov [ebp+lpGUID], ecx* I$ d$ A9 C+ T
- CSpace:1001503C
0 }% S8 {7 [5 Z/ b9 |8 r - CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j
9 w! o; d- z5 T5 V2 h$ \, ` - CSpace:1001503C mov eax, [ebp+dwNewLong]
: P$ V8 m( e8 v - CSpace:1001503F mov ecx, [eax+230h]7 G& R" u/ H& H n
- CSpace:10015045 mov edx, [ecx+1Ch]3 O; a' v* H* M! Y# m+ O8 T9 \
- CSpace:10015048 push edx
d! C6 g$ m+ I0 E' V; u& k. m - CSpace:10015049 mov eax, [ebp+dwNewLong]
. ^( H& m& X/ V: C' u7 [/ | - CSpace:1001504C mov ecx, [eax+230h]
x/ U- ~' \+ g1 j Q - CSpace:10015052 mov edx, [ecx+20h]1 Z* `4 h9 E! ], Z
- CSpace:10015055 push edx
; r& d$ F- x5 W7 M8 ?. d7 E7 J - CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)"- F+ |3 V, |: j" } X
- CSpace:1001505B push 3% T+ a. d! E, ~* ? X3 O
- CSpace:1001505D mov eax, [ebp+dwNewLong]! g8 S- @ `/ r. p, u% d, B
- CSpace:10015060 push eax
& f4 {7 F! _2 i5 I2 ^' X - CSpace:10015061 call sub_1003882A' {1 r k' J, [, ^. m0 l, {
- CSpace:10015066 add esp, 14h
5 W% e+ W& K; c: Z - CSpace:10015069 push 0 ; pUnkOuter+ I8 X* Y: R5 k
- CSpace:1001506B mov eax, [ebp+dwNewLong], n z# Y5 b2 `- f8 ?$ X! M
- CSpace:1001506E add eax, 1DCh6 w( f7 Q9 L/ ^/ `
- CSpace:10015073 push eax ; lplpDD
1 Q. D# Q$ d! l - CSpace:10015074 mov ecx, [ebp+lpGUID]
% t# W! I! \7 c! j; b" k - CSpace:10015077 push ecx ; lpGUID2 Z* W. X0 F1 p3 L& \
- CSpace:10015078 call j_DirectDrawCreate
* k1 j; A9 h. L) e - CSpace:1001507D mov [ebp+var_14], eax
3 A8 d& L* h2 h' X4 S - CSpace:10015080 cmp [ebp+var_14], 0
8 m0 @. m* Z0 _+ y) R; L - CSpace:10015084 jz short loc_1001509E
$ B5 c# C9 s; f - CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n"
+ h- L6 N( u3 T% h5 T5 ~ - CSpace:1001508B mov eax, [ebp+var_14]6 M; T- o: _7 I+ i" w3 y- B
- CSpace:1001508E push eax u' c: k! B7 B" A, ]
- CSpace:1001508F mov ecx, [ebp+dwNewLong]. Y* R; S$ h9 H! h
- CSpace:10015092 call sub_10038F3C+ K! { x) p" P9 ]& {( W
- CSpace:10015097 xor al, al
( b# c1 i- O/ R- Z: R - CSpace:10015099 jmp loc_10015173
复制代码
4 M! y6 ^, R6 i7 G, E$ Y+ Q6 t3 z; ^$ n
4 }$ t3 m5 G6 h% ~! x- p" o. }3 q. U我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log.7 u- v' c6 W+ \+ u3 Z
记录到log_GL.out文件中。以下是摘录的一段。
& a. {7 M+ V& y- t* t我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。- F7 v" K$ p |( r$ g6 m$ q; {) I
以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?
8 r( j& r6 l% y0 q, Z2 |" c- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>) o2 e1 |% Y+ H, q u; ^
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>" H% Z( M: q0 X" r3 p) H
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>
% z A7 g7 n+ U - glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>
# \' `, s6 r0 h0 Q - glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
& R. Y; A, a* `7 J- i E6 g0 Q - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
4 `/ q& z* V0 A - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
8 w) \$ K8 M+ g6 u, _: z# q - glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890> P8 b; p, r: t, G$ x
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>6 v4 e& c% N9 u- _3 Z% K! y
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>
9 `5 f, z" T) U# _ - glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
! @) K0 N) q2 r - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>! i) ~* l* N+ o7 B$ T& P/ G
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
6 ]# u! ^" b2 R' m0 G - glClear, GLbitfield<256>9 X9 O' p( r; B4 T, u' \. v
- glShadeModel, GLenum<7424>
! }) L- [# n* S6 p$ c - glDisable, GLenum<2929>
# \1 ?) r# Y0 ^2 T; t: J - glDisable, GLenum<3008>1 u! b3 Y3 r- E0 S* n# ?3 P. Q
- glDisable, GLenum<2896>2 o6 k4 G! n. t2 ^
- glEnable, GLenum<3042>" P4 B! P* [$ ]* O6 ?
- glDisable, GLenum<3553>' ]# R3 {& [) n- {7 E% t Z
- glBindTexture, GLenum<3553>, GLuint<631>
- V* J( G- S2 Y2 ~. L' O# P - glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>+ C5 e+ o; j; v4 Q' W
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
- Y' `) K( h9 \( g" x( {3 C - glClear, GLbitfield<16384>- ?- G5 I0 K1 l3 c2 h) [
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>9 T/ P g- a: A: O; j2 X/ j- O) n
- glEnable, GLenum<3553> f: R% b# R* w) f
- glBegin, GLenum<7>
2 _) A/ f/ B2 ? - glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>- Z( [- ?1 T. n
- glTexCoord2f, GLfloat<0>, GLfloat<0>3 }8 I0 u' [4 L4 S
- glVertex2i, GLint<0>, GLint<768>
- a' W+ _4 T- T& y8 n' G8 K0 N - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>8 m% c0 h4 b3 [9 r2 \6 g
- glVertex2i, GLint<1024>, GLint<768>. v' `- Y" I# \% U# h7 s" k
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>6 X' k% W2 D1 A8 T# F2 q
- glVertex2i, GLint<1024>, GLint<-256>) o: t. N5 U& A6 V. h5 l
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
; D( `0 D# ~- L6 l8 { - glVertex2i, GLint<0>, GLint<-256>
1 b- b$ o) K% m S - glEnd
9 y4 {" J# f3 \% l6 r - glShadeModel, GLenum<7424>* Y& {# _ \3 m1 z9 b+ d2 z" M
- glGetError- N3 o- \$ e5 p8 `& ~- o$ o
- glDisable, GLenum<2929>% c/ w% r, ?7 O) t* [
- glGetError
$ s' l; f q$ K5 Q% r/ R0 r - glBlendFunc, GLenum<770>, GLenum<771> t7 f0 k, t/ J& ?
- glGetError
" P0 R4 }- `8 W3 K& w: L( y - glEnable, GLenum<3042>, v0 w9 u# G1 u; R
- glGetError
, Z0 i2 R5 U5 y& E - glDisable, GLenum<3553> E% T0 ]" J+ F( }5 }6 `8 |
- glGetError8 w# q$ s& O2 ]) ^' u7 ?
- glBegin, GLenum<7>' x' s5 m1 w9 s7 {3 U
- glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844>& F; }- K# U1 J5 @# M
- glTexCoord2f, GLfloat<0>, GLfloat<0>) v/ h: `7 ^1 H+ _) [/ Y
- glVertex2i, GLint<0>, GLint<768>( v# q+ o! |, ?% s
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>& z! f8 ~ L9 A
- glVertex2i, GLint<1024>, GLint<768>) o# w; }; y/ { U2 A' d O
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
# ^0 B8 ^3 L$ a6 t - glVertex2i, GLint<1024>, GLint<0>0 h- j+ \+ T" n- u4 _7 j
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>0 r% Y) f$ B; o9 v8 U2 Y
- glVertex2i, GLint<0>, GLint<0>% T! ^2 u2 h( U" l Z
- glEnd( f7 }/ c* `- K3 I' |+ q4 D
- glGetError0 ^ R2 L$ A3 t6 y
- glEnable, GLenum<3553># }" i! t7 f6 V2 e, Q
- glGetError
6 \$ ^6 v# w3 `- J: j - glFlush
* R# m/ Y+ I; w8 R8 d - wglSwapBuffers F3 P+ N; D0 s( A; g1 N( H
- ---------------------------
" @* [$ I/ p6 I% y8 D - , HDC<-33484711>$ ~. c3 w% I* U' E
- wglGetPixelFormat, HDC<-33484711># d/ ]7 i3 R4 T- P
- glMatrixMode, GLenum<5889>
8 d( |( p/ w1 q6 V - glLoadIdentity
8 g* P9 i0 X* t8 v - glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120>$ [. Z0 I+ s! \( N
- glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768>
. b' F I5 W% ~; L2 F: ] - glMatrixMode, GLenum<5888>
6 e$ N9 @! N4 G6 [ - glLoadIdentity1 [& R D; p+ E) U2 L
- glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0>) i/ C' h5 h" t! l6 m
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>2 q3 @. u- @: k t. Y6 s
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>( z9 x3 B! `( Y, R2 B' e9 i
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>
/ O5 _" @# n0 M9 a6 n - glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>
4 F7 C0 T( K* C9 R5 n( t. V1 f - glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>0 p! D5 c2 q4 y7 k
- glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>7 r/ d. ~0 ]' d2 H6 [& B$ R M
- glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>: I% Y8 j5 k0 b% ]
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>5 S9 r3 X. e4 m1 i" f4 `. @! V3 f$ c
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>& \. b) f$ a1 Z2 s
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>8 T! d1 {% j4 K$ ^
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
2 N( ~; [. i! h1 r! F+ x6 Y - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>
* M. [2 y* @, _5 E - glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216> X. ~1 t$ s* O" Y4 |3 K$ _; U
- glClear, GLbitfield<256>
6 \" r5 v; @/ w7 \ - glShadeModel, GLenum<7424>) `' o6 d) ]4 q, T+ \
- glDisable, GLenum<2929>
4 v- P+ q# N+ W/ a5 ` - glDisable, GLenum<3008>) i6 x8 S9 V2 U5 z" U& P' O& N
- glDisable, GLenum<2896>' C( q9 x: W8 P0 o* v e4 D3 K( E
- glEnable, GLenum<3042>& b; j w2 n5 D
- glDisable, GLenum<3553>0 G8 n7 P* `2 M2 D! ]
- glBindTexture, GLenum<3553>, GLuint<631>3 C6 b/ H! K5 o/ ~
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
9 b4 E4 a0 P f2 K! o( a - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>% Z) f! m; z t$ z4 N9 S
- glClear, GLbitfield<16384>
2 R" \" D7 }( | - glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608> u( D9 h: q! p* p2 u! ^; ~
- glEnable, GLenum<3553>
4 f4 ?1 s; Q. h6 R9 K6 q4 J - glBegin, GLenum<7>
( K" ~% `0 W/ N' g! M - glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
; _ j2 b+ X) v, ^8 N; e; ?* h, q - glTexCoord2f, GLfloat<0>, GLfloat<0>9 d, M: `, J! v* W! y$ }% e) t
- glVertex2i, GLint<0>, GLint<768>
5 X/ ~% `3 m' m5 v% s* M0 d5 b! C" { - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>% F l8 q% P" h4 Y8 K a$ m( F
- glVertex2i, GLint<1024>, GLint<768>
) N& ~* g4 f% a+ ?1 ^ - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
0 B+ E1 k7 B) N3 Q% p( q3 @8 j - glVertex2i, GLint<1024>, GLint<-256>8 J1 o. I7 b5 E
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>4 O" z0 f; Z0 w; t2 v
- glVertex2i, GLint<0>, GLint<-256>
, e4 D9 P& r: W! n
复制代码
% J. m. J2 `8 O# w1 w" A7 D" Q9 i( d
|