本帖最后由 shane007 于 2023-8-25 17:31 编辑
- v( g" i/ ]# f' S5 R- J. q
3 l0 m6 Y4 u5 D5 w8 t本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,
3 S5 E: s# ~2 E+ b" Q d( y' B, D8 g# v) H游戏应该实际只用了其中1个,暂时作下记录。% b. Z8 ~3 p" a( `/ q! G
7 I( P' `; B1 C2 aDirectDraw是由bin目录下的ddraw2d.dll来完成的。
% y* t+ ^4 l# m+ A& P以下是一处的初始化代码
$ F$ i, r7 b/ q2 q: T- CSpace:10015015
2 {& N" S+ j9 d% g+ T7 C2 }0 h/ Z - CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j% {& b T5 p( q$ T: j
- CSpace:10015015 mov [ebp+lpGUID], 0; w* P: E+ l8 j) x
- CSpace:1001501C mov eax, [ebp+dwNewLong]
& K/ d# G0 U* ~+ c4 S9 }3 U( q - CSpace:1001501F mov ecx, [eax+230h]/ g8 X6 U6 D {* [
- CSpace:10015025 movzx edx, byte ptr [ecx+1Ah]5 i* N! h% p0 n; ?
- CSpace:10015029 test edx, edx
' p/ O9 ?4 h0 p; ?. D* U. b w - CSpace:1001502B jnz short loc_1001503C
! c& L r- Z) }2 V2 E3 j( W$ d - CSpace:1001502D mov eax, [ebp+dwNewLong]4 {% c+ e0 ^1 `9 U. V
- CSpace:10015030 mov ecx, [eax+230h]0 f+ H( O- c6 @1 k1 O5 A9 [
- CSpace:10015036 add ecx, 8
: V4 p1 l8 B8 M6 ~$ ~2 z - CSpace:10015039 mov [ebp+lpGUID], ecx4 [$ [0 p$ Y8 T1 A
- CSpace:1001503C
% s- L1 |: k2 b6 ? - CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j
3 L* p/ N: I$ m# R& @) ?: ^ - CSpace:1001503C mov eax, [ebp+dwNewLong]0 U6 r& m3 k# G) U/ A0 j0 Q6 k+ F: f
- CSpace:1001503F mov ecx, [eax+230h]9 p: }, u0 O6 k2 K& y* }" a
- CSpace:10015045 mov edx, [ecx+1Ch]% @ w: G& Z+ e! R$ v- ^
- CSpace:10015048 push edx: A( Y' T! K5 \& r
- CSpace:10015049 mov eax, [ebp+dwNewLong]/ f2 H, s6 r, B, r
- CSpace:1001504C mov ecx, [eax+230h]% ]+ U& R8 a. G! X1 j* A
- CSpace:10015052 mov edx, [ecx+20h]
) D- g1 C6 ]2 n) t - CSpace:10015055 push edx
5 o! v6 Q6 u9 a9 F( s. S - CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)"2 P, w; ]) P+ Q- p7 j
- CSpace:1001505B push 36 t* r$ X' k, k0 Q4 g5 |3 W8 Y9 s
- CSpace:1001505D mov eax, [ebp+dwNewLong]
0 E. w4 E2 }. z+ m$ x3 s, ~" S - CSpace:10015060 push eax
0 o- p, y5 w* R2 I1 l! m/ _ - CSpace:10015061 call sub_1003882A6 o4 p% Y6 P/ T
- CSpace:10015066 add esp, 14h
- [$ h$ q# m& h2 H! |8 | - CSpace:10015069 push 0 ; pUnkOuter
. k' j" v: P" G - CSpace:1001506B mov eax, [ebp+dwNewLong]" h( \$ L+ ]& U
- CSpace:1001506E add eax, 1DCh- _" ~0 g& Y Y" ?6 `/ U+ U& s
- CSpace:10015073 push eax ; lplpDD6 g6 ^0 Z+ @3 L
- CSpace:10015074 mov ecx, [ebp+lpGUID]
6 m) y+ b" k5 t8 |; ?6 o - CSpace:10015077 push ecx ; lpGUID" \8 H1 R f4 o
- CSpace:10015078 call j_DirectDrawCreate, k& c! S) s) k- A) _, W3 W
- CSpace:1001507D mov [ebp+var_14], eax) q1 q! E7 ^8 g b, P7 U
- CSpace:10015080 cmp [ebp+var_14], 0, C9 D9 S; A4 \% v5 v
- CSpace:10015084 jz short loc_1001509E: a R5 n; s" u
- CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n"- u5 T% @ k; q7 q7 B
- CSpace:1001508B mov eax, [ebp+var_14]$ w9 R$ g- d( K
- CSpace:1001508E push eax* v5 W/ v" k8 T2 P2 v
- CSpace:1001508F mov ecx, [ebp+dwNewLong]5 B' {+ N: l3 l
- CSpace:10015092 call sub_10038F3C& R0 l F) Z+ v
- CSpace:10015097 xor al, al
. A$ D* b) a- N6 | - CSpace:10015099 jmp loc_10015173
复制代码
/ F ~% P) a9 L4 g8 ]
6 F3 e' T( J) T. a1 N3 d1 }8 a3 d& c ?# v% W0 d" t2 h
我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log.
: Z M; S6 p: t% b% K记录到log_GL.out文件中。以下是摘录的一段。
3 H; r8 R9 M" N2 ^* f我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。2 d/ v$ z& A# W% A
以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?
6 m& ~ x2 C& }- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>, w* q1 t H/ ~
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>. {% _ b) _0 G$ W0 `
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>% k/ p6 T, A7 x u4 t" y' c& J
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>7 z; v- [- u# x2 T( Q# K5 a
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>+ \8 g9 R3 n4 y. ]/ `4 I
- glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
9 {* L. w' i/ C5 I2 ^3 e- V - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216># p8 x" n, }3 g e. |/ q( B
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>
/ y4 P3 P' S" o - glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
0 b6 s' b7 G: ] - glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>7 V- ~2 c: O* N+ ~: t' @9 ^
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
4 ^: H4 t9 G3 ~/ E; B8 l0 N - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>! m( b' ]! c* f! J9 ^$ ?) N
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>' v/ |( ?. d- }7 Z. i6 q
- glClear, GLbitfield<256>; {# s' G0 e& `( \
- glShadeModel, GLenum<7424>
4 `8 L1 \" A# Q/ n5 a/ o - glDisable, GLenum<2929>
$ }) R5 v/ r+ b - glDisable, GLenum<3008>
& c# n8 Y* _* J2 m& ?% d# B - glDisable, GLenum<2896>: l' U# m6 G. l9 I% q7 }. ~8 z- T6 e
- glEnable, GLenum<3042>- w+ c1 m/ l2 G! ]' S( v5 p$ e0 A K
- glDisable, GLenum<3553>
8 s" S# e1 k8 Y4 S, U! C - glBindTexture, GLenum<3553>, GLuint<631>
, C9 ^! d o# r$ t: r+ t - glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>% T7 I$ h$ ?+ V
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
4 n6 {$ k _2 ^) } - glClear, GLbitfield<16384>, o- Y5 D% j% X: n8 Q, @9 ?9 ~
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>
8 \& X H- D3 R( f; `% i, ]' C - glEnable, GLenum<3553>
: O+ m7 \. v! H2 {9 t - glBegin, GLenum<7>6 \6 a& ~( d& M% \; R
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
* j% c& ^7 r) o9 b/ } - glTexCoord2f, GLfloat<0>, GLfloat<0>
- c! s# C$ G" v6 C9 B - glVertex2i, GLint<0>, GLint<768>/ i% Q2 |. h8 c/ \4 Q0 q6 G- G
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>5 q" I! w' ~: O
- glVertex2i, GLint<1024>, GLint<768>+ r: w r$ q8 }
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
8 ~/ l# H5 g, P9 L! Q9 Q( f4 t( C' k - glVertex2i, GLint<1024>, GLint<-256>
1 i/ Y x; k( s8 e. p- n( q9 j+ [ - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
8 n* K$ n# O8 ?) v - glVertex2i, GLint<0>, GLint<-256>
. @6 k. e6 {3 L3 i - glEnd
5 A5 v$ @0 f; N' U( `& A1 u - glShadeModel, GLenum<7424>, Y/ k- L, _: B9 R' `
- glGetError5 o& A9 @+ n1 W
- glDisable, GLenum<2929>; a1 Y7 o' G) k# z- J& f
- glGetError9 b' X# v/ w4 o8 B
- glBlendFunc, GLenum<770>, GLenum<771>& w! y1 {8 J" d8 E0 o) T2 H: f
- glGetError
5 Y, z" [! K, {+ B5 P - glEnable, GLenum<3042>0 |! k. n, w: o* G% D. E k
- glGetError( [3 w4 L- |/ W* Q
- glDisable, GLenum<3553>( P( \7 D. D# o8 z
- glGetError3 u2 N7 p) [, @- ]# q' F) b6 I( ]
- glBegin, GLenum<7>" b5 O0 J2 c9 W# l8 _' p
- glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844>
8 g" Y$ }1 [& Z - glTexCoord2f, GLfloat<0>, GLfloat<0>
( B/ s2 P3 Y! P1 y8 L1 w1 ?- K0 r - glVertex2i, GLint<0>, GLint<768>
# S9 X$ V; d }' Y# t - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>8 F. T# x/ o2 `" k
- glVertex2i, GLint<1024>, GLint<768>9 e. ~ c2 y; ]- w, D& @% Y* m# B
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
. q2 r" }* F w9 Q! r& i( \ - glVertex2i, GLint<1024>, GLint<0>8 i1 I/ q* I2 A. f2 r
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>, `& f C. T+ _( U, @ k' ?
- glVertex2i, GLint<0>, GLint<0>$ Q' u3 c" |. _; u
- glEnd
3 g) L: ^0 k7 B: J3 ], V - glGetError- V/ b8 Y4 z' s" V# N8 y
- glEnable, GLenum<3553>
. u% r, A3 {* {- T* Q - glGetError
6 K7 o. W! t& m) Q - glFlush
, \* e! P; G1 e) E - wglSwapBuffers
" o4 p9 N! S. v, v7 Z) k& b - ---------------------------2 h2 _2 J# m. H4 I& t
- , HDC<-33484711>/ z) ~0 g9 D* ^$ F: F+ n4 v
- wglGetPixelFormat, HDC<-33484711>
2 W' B( T' R, Y1 S - glMatrixMode, GLenum<5889>
2 T# f+ f" b- z2 R9 B( F - glLoadIdentity
+ b- V9 g' J, u1 v - glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120>0 P4 J5 g V$ ~; d7 w ?" h
- glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768>
" g; ]1 D3 g/ }! n7 |# i( y( J - glMatrixMode, GLenum<5888>9 L0 M9 |) T+ X3 q+ C2 ^
- glLoadIdentity5 I3 q* L0 ^% l( E. P# O- b/ [
- glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0>: s# O1 P) C7 C/ @/ ?5 g, s1 {; A3 u* U
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>( F+ z8 P i) E0 ^# ` g1 U3 n a
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>8 O: b5 g/ w) x8 w: a7 `
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>
d' A, {* ?. s! l - glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>) J+ Z; z9 v/ |. U" w% T. R e/ c
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>+ N, O2 M; G( f" I$ A
- glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
% R9 w5 E/ p9 @# s' v - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>$ q' Z( Y$ b9 c
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>, h' j/ X$ Z4 R
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>! y7 p) k) d5 V) }
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>
& _1 d0 P$ R9 Y' {; A1 f - glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>- g1 e- S& x' i2 F5 h
- glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>, w- z. G2 h2 S& k! I
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>& r' j# D/ |9 x. J7 |; v
- glClear, GLbitfield<256>
B4 f; L4 }4 U: P( Y - glShadeModel, GLenum<7424>
/ K: w# E* }" Q* U: \ - glDisable, GLenum<2929>9 O1 A9 c7 z3 X% O
- glDisable, GLenum<3008>
2 t9 a3 N$ E5 g: D2 t# v z" z - glDisable, GLenum<2896>
9 Z6 S$ m7 P0 |& c7 n# X/ K - glEnable, GLenum<3042>
9 |8 l' J% n. T" ^* } - glDisable, GLenum<3553>6 a) Q( E4 z! ^2 z* \
- glBindTexture, GLenum<3553>, GLuint<631>
8 E* _7 p9 v, c - glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>5 |# u1 N: Z" b E, R
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>- c7 k' I, v; q6 ~# h5 u" z
- glClear, GLbitfield<16384>
- F9 j9 ^5 V9 h$ D# i* Y - glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>' D- i+ o$ e3 e1 t1 M+ O) D$ X
- glEnable, GLenum<3553>
1 i2 \3 i6 w# [' R" W8 H - glBegin, GLenum<7>6 [. C2 k$ u7 a
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
# _0 h: z0 C4 @% Z0 l; ]& n - glTexCoord2f, GLfloat<0>, GLfloat<0>
$ b2 p/ c: D- m$ {( c - glVertex2i, GLint<0>, GLint<768>
+ m/ Y& J { Z# R, M: K% k - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>1 ]9 c; X( n S. Q" e2 B4 u8 H
- glVertex2i, GLint<1024>, GLint<768>8 w$ t, G+ N0 |
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216> @9 K# W4 D, M! k2 f( R
- glVertex2i, GLint<1024>, GLint<-256>
1 b6 z- u0 Q$ s4 F; t$ _ - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>, ^' H. n" W& m; s" r- v5 Y0 a% A
- glVertex2i, GLint<0>, GLint<-256>
; R* ^4 O. O% A) X% k+ v0 @" K
复制代码 ( N1 ^% K5 {0 k/ [
6 M$ n8 e4 B# n7 L6 C7 m |