本帖最后由 shane007 于 2023-8-25 17:31 编辑 7 N% H8 l( N+ E' \
% }2 k: ~* [9 s
本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,: e t) Y5 D0 z C
游戏应该实际只用了其中1个,暂时作下记录。
* |5 A; x( s5 H, O1 |7 n6 v- r8 B9 D7 g" ?3 {1 _; k
DirectDraw是由bin目录下的ddraw2d.dll来完成的。' r2 M4 w e9 ]4 {6 K
以下是一处的初始化代码
/ b6 v/ q: J9 X8 d: q- O. x& i' i- CSpace:10015015, }$ i% T' e# A# I/ V: P
- CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j' q @1 _: s5 ~$ n
- CSpace:10015015 mov [ebp+lpGUID], 0
8 x) P6 O8 k+ a: e! w' H - CSpace:1001501C mov eax, [ebp+dwNewLong]5 B4 X$ L; x( |% Z. t6 \" i
- CSpace:1001501F mov ecx, [eax+230h]
- U2 Y" _* g! |5 o; D* m$ w6 u$ K - CSpace:10015025 movzx edx, byte ptr [ecx+1Ah]
1 L7 {' h$ |. J# ^6 a% z9 D# @$ Y - CSpace:10015029 test edx, edx* j$ f8 m3 i: ]$ \- u1 C8 [
- CSpace:1001502B jnz short loc_1001503C
/ k( t, B1 t! q0 D# s - CSpace:1001502D mov eax, [ebp+dwNewLong]9 _- ^! L5 Z; o6 F, t
- CSpace:10015030 mov ecx, [eax+230h]
. A4 f/ N [& }+ H) d3 N - CSpace:10015036 add ecx, 8
$ O- o9 ~; F% @+ f# R/ _: e d* | - CSpace:10015039 mov [ebp+lpGUID], ecx
3 l. R& W3 k6 m9 f - CSpace:1001503C; m" e# F- z) x$ D* p
- CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j6 T+ Y: L6 ?4 B R1 P! @: h, V
- CSpace:1001503C mov eax, [ebp+dwNewLong]' B- F- U" Z1 Y1 a
- CSpace:1001503F mov ecx, [eax+230h]* H' O: i. | i
- CSpace:10015045 mov edx, [ecx+1Ch]8 m( M, @/ X1 c4 e
- CSpace:10015048 push edx/ [2 O& A+ i! t7 l% E
- CSpace:10015049 mov eax, [ebp+dwNewLong]/ x' E* {' c' P
- CSpace:1001504C mov ecx, [eax+230h]6 d+ y* e! z! h3 ?% m
- CSpace:10015052 mov edx, [ecx+20h]
# v/ }5 e: y# X2 q - CSpace:10015055 push edx
' J: N/ i5 |: Y- y4 k( G - CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)": x- l! s8 p) D+ q
- CSpace:1001505B push 3
v3 a; A5 o( @. _ - CSpace:1001505D mov eax, [ebp+dwNewLong]" D9 T" n1 W. m# J J, k9 Z
- CSpace:10015060 push eax$ ?2 Z9 x$ i0 R
- CSpace:10015061 call sub_1003882A4 A, a8 F, ~: t) D: U& x, {
- CSpace:10015066 add esp, 14h. D. ~" D1 k$ {
- CSpace:10015069 push 0 ; pUnkOuter+ N6 X& V2 `: a+ Y9 O5 P
- CSpace:1001506B mov eax, [ebp+dwNewLong]' ]! r) T" ?3 ~ _8 ~
- CSpace:1001506E add eax, 1DCh
0 g/ x/ H9 X/ f# B0 L3 Q$ j8 L - CSpace:10015073 push eax ; lplpDD: W3 P0 Y% K* {; U+ ?5 a
- CSpace:10015074 mov ecx, [ebp+lpGUID]
/ g* Z+ [* e- ~) {+ ], z7 \& ?* v - CSpace:10015077 push ecx ; lpGUID
; R3 e" A: [0 X/ Q - CSpace:10015078 call j_DirectDrawCreate) N- U6 @ ?5 N
- CSpace:1001507D mov [ebp+var_14], eax
+ y( V! P! E+ w, l7 _ - CSpace:10015080 cmp [ebp+var_14], 0
" _1 v1 N) Z" Q" L" P4 \# V - CSpace:10015084 jz short loc_1001509E e {5 K# T/ A
- CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n"% o+ ~ m, M: o' h( A
- CSpace:1001508B mov eax, [ebp+var_14]* u' ?1 P* m) p* r+ p- H1 O: s
- CSpace:1001508E push eax$ ^' U& c) P7 h' R: {
- CSpace:1001508F mov ecx, [ebp+dwNewLong]
, J, ?+ R8 j+ o" e7 ~7 L - CSpace:10015092 call sub_10038F3C
5 x W$ b N7 X2 d - CSpace:10015097 xor al, al4 U0 z y' @5 K$ D
- CSpace:10015099 jmp loc_10015173
复制代码 ! N7 }4 f' j, G
3 }" ^" n( G% a% t
9 V; R6 Z1 E) j' Z5 {$ }$ [0 g
我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log.
( K' ?0 ]7 E' }& |( z记录到log_GL.out文件中。以下是摘录的一段。
" F( ]' q p4 }4 h0 r我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。
# \$ N4 a w; f" s9 Y( C以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?1 q7 L R: B( G/ r" _0 d
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>9 m4 u: n% v* l6 O8 Y; j) {2 q
- glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>
; O9 P y: M8 u, q! M1 E! p - glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768># \( l4 W! J3 r' [0 g
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>
9 `3 Z. q. L( Y; }' j - glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>4 T3 ]- c0 F6 T4 U/ A3 L) a# u
- glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
1 Y8 F9 j6 X5 v, }8 G - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
5 i6 c& ?# e; o/ i2 o - glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>
& t9 L n i, v% Q, i - glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
% {1 n7 W6 K7 a8 K0 i - glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>
- t9 E, L- S7 J( n( F - glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>$ h2 e2 { v) w5 G9 f
- glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>0 D8 w6 w/ J- N% R( J) L( N
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
; f) z; n4 B) W9 x, } - glClear, GLbitfield<256>
! U3 t( A- {) W& q7 R7 z - glShadeModel, GLenum<7424>
8 L! i8 P7 s5 S* d9 T4 g4 m - glDisable, GLenum<2929>
- _0 b E" ^1 q ^, _; K; v! O - glDisable, GLenum<3008>
- L% T9 n3 C" A- B, @- \) n - glDisable, GLenum<2896>( d# \; Y ], W; M- |
- glEnable, GLenum<3042>
+ B7 q! t, D% @$ g1 l) a - glDisable, GLenum<3553>
" s' C7 \1 ~, ~, `4 v - glBindTexture, GLenum<3553>, GLuint<631> f$ ?+ n! [, H, l+ m a
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
6 C4 x+ y' E9 x. e5 L: Y/ q - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>' l* N& s5 f. F9 L" m; h" R
- glClear, GLbitfield<16384>
% a) ~4 X: `' {& k( n! ~ - glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>
. Q" d4 e+ T1 i; X C - glEnable, GLenum<3553>
' ^9 J. Q1 B, L z5 q: p6 t - glBegin, GLenum<7>3 \/ j3 S' x" k3 ~ m' M1 o$ L0 r) r
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>9 E3 }/ A( l4 J
- glTexCoord2f, GLfloat<0>, GLfloat<0> R9 _4 ~' F$ e/ k
- glVertex2i, GLint<0>, GLint<768>
- b, {1 r' a3 q( Q% ]* ]7 i! Y - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>6 O& B$ a. ]$ I" R0 T+ I. R
- glVertex2i, GLint<1024>, GLint<768>5 o$ `. ~$ J+ F% D5 p# V
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
7 b9 V3 I% u! K+ |1 c - glVertex2i, GLint<1024>, GLint<-256>
5 ]4 j' v6 [$ S( X: h1 O" n - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
- A5 Z5 q# C' @4 T, v - glVertex2i, GLint<0>, GLint<-256>8 |4 P7 x/ q" x4 |
- glEnd9 c8 ~+ ~6 b; V+ f5 X" L/ n
- glShadeModel, GLenum<7424>3 r3 q1 J1 a' X1 `9 B0 `3 g
- glGetError' f5 d, x2 p9 W! w4 h9 R
- glDisable, GLenum<2929>
2 J" g/ a. Q: s/ x! f- Z5 ]3 J - glGetError/ U% R, r4 [4 E- r' I% U* s- _5 N/ A
- glBlendFunc, GLenum<770>, GLenum<771>
' g3 O" k% M1 l4 S4 r3 P6 g# ~* {3 i: m - glGetError! e% Y% L( ]9 X( S, |
- glEnable, GLenum<3042>
3 Y, t' Y" {( D: `! }2 A6 x - glGetError3 W/ e6 _0 I# a# k9 x: J
- glDisable, GLenum<3553>' O0 {" i9 D) O0 j) {4 E
- glGetError
, W, ~( X3 ~! U - glBegin, GLenum<7>2 e1 e& M. P6 Z1 L* \* |% k6 \
- glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844> L' C# W2 \/ A3 L7 i2 |( P
- glTexCoord2f, GLfloat<0>, GLfloat<0>; x" }1 G( s' T0 c3 u5 i& @& Q
- glVertex2i, GLint<0>, GLint<768>
) _) J& p! i9 K! x6 H m$ b - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
6 s" e, _" t; |' S4 Z7 f - glVertex2i, GLint<1024>, GLint<768>! y* x% I# Z! J+ N
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
' B+ ?7 `( F- V- p2 K2 T - glVertex2i, GLint<1024>, GLint<0>
0 F; E/ q: d, O4 g% N. \: c/ z - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>) h/ u4 m6 G5 c1 j3 B
- glVertex2i, GLint<0>, GLint<0>
+ ]: b/ d3 U6 e( v8 F - glEnd
" i" S- \& W" x - glGetError
5 P% q& o! L% y1 E0 L - glEnable, GLenum<3553>9 X+ y3 o! ~8 f9 S. c" H
- glGetError" M) |4 B" y2 @+ z' v' D6 j( L! |
- glFlush+ C4 d( _+ H$ M2 x
- wglSwapBuffers. Z3 Z4 u2 `; T/ B1 g) x
- ---------------------------9 s" W) R$ n5 Z4 k) [5 w$ W$ N
- , HDC<-33484711>5 R* G+ H1 z6 i: S
- wglGetPixelFormat, HDC<-33484711>
) Z& U |( p0 L - glMatrixMode, GLenum<5889>- D+ y# p4 |4 l; T' a* R( U: S# o
- glLoadIdentity
( C7 s2 a& a1 z - glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120>
$ T- ?; A- Q/ w" W+ { - glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768>
, k, Q* A5 O1 }/ e5 O - glMatrixMode, GLenum<5888>
. y M* F2 n9 R" Z2 ?! d - glLoadIdentity* @# P) o' w0 [1 l7 ]5 d3 ]
- glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0>
* P$ P$ z, h; Q0 M - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
5 B2 O) Z K, `2 C1 C9 p. F - glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>
/ q. v- _& }; \1 R- {+ _ G+ w - glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>
7 [8 u: e% B$ z5 b% D - glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>
- r' e" T, W8 {2 X0 W5 Q( F1 B - glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768># E/ ]1 j# L0 Z1 S4 B
- glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
6 F7 y) f3 ]5 l+ } R5 k - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
- l( P" n- d7 w$ ]+ k2 S - glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>
7 \- x$ C% T' [2 b' d5 }" `5 Y - glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>5 @. g k/ G5 C3 P6 Z
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>7 l- y( ?" q2 T+ Q; s
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
- _$ Y1 }6 l) G9 |3 N6 ^ - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>
3 |: u& C0 y. M# Y7 k2 _ - glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>+ y8 Y2 F. {$ C" s
- glClear, GLbitfield<256>3 [! O8 p3 O" y- u
- glShadeModel, GLenum<7424>
) H& ~3 {! R. b* a& E; { - glDisable, GLenum<2929>
+ W. b0 a: {; Q; c% R. }( A - glDisable, GLenum<3008>
5 W+ ^) ~, \: c; ]2 i9 A - glDisable, GLenum<2896>
6 C+ {# Y- Y" r l- I- [) C - glEnable, GLenum<3042>' P$ h& \/ z! u' P! O8 X$ r& P" ?7 N
- glDisable, GLenum<3553>
+ g4 V( o8 o) X" M5 h" A- [ - glBindTexture, GLenum<3553>, GLuint<631>2 ]* ~ A7 W( L" T# i
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
2 r" C7 |: N0 T s8 Q4 X - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
8 Y7 M6 b; _% ~ - glClear, GLbitfield<16384>7 X# v+ `/ }) n, C9 U5 u2 h
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>( J/ P4 z+ v6 z) b0 f. h
- glEnable, GLenum<3553>
" c: r" G$ q+ T - glBegin, GLenum<7>
7 n% N2 x1 s0 C - glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>: T( j% a# ]- V% R9 {
- glTexCoord2f, GLfloat<0>, GLfloat<0>( t, b7 G O; y) D8 }( n$ A1 g8 ^
- glVertex2i, GLint<0>, GLint<768>" c9 ?, L' R' u1 ^+ \
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
. X' l; D% ~4 L! j/ V7 d- ^' k( G; S - glVertex2i, GLint<1024>, GLint<768>
- c+ `/ _* t8 m9 r; { - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>8 H W1 R/ c+ e9 H$ m5 e k5 o4 Z" @( h
- glVertex2i, GLint<1024>, GLint<-256>
/ k1 {$ F/ f( @- ~4 h, Y2 _ - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>8 S# q; s/ q) N* J, |6 P, M8 c7 r
- glVertex2i, GLint<0>, GLint<-256>, e3 g0 X" O8 g; N6 W
复制代码 0 \# j; V0 g) z9 [4 H
4 @9 W8 {+ y+ x; k" E- H/ S( z |