本帖最后由 shane007 于 2023-8-25 17:31 编辑 8 r- R d3 P' m& ^
" o. [1 Z* g( Q1 U! G6 V! Q: V* K本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,
$ R' ^. l2 w B# E游戏应该实际只用了其中1个,暂时作下记录。
8 i$ g, W R T3 _4 I8 O
) F4 C5 A9 Q0 I! A3 HDirectDraw是由bin目录下的ddraw2d.dll来完成的。
! Q" z# `3 v3 H: o. @6 D7 u$ B以下是一处的初始化代码. ~# t% i' C' [( Z
- CSpace:10015015
8 d& s! O; ^6 P- I: p8 Q - CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j& Q% Y N) I: {3 X7 U
- CSpace:10015015 mov [ebp+lpGUID], 0$ S" L; w8 |7 v* B5 ]
- CSpace:1001501C mov eax, [ebp+dwNewLong]
! F4 N1 M; ^+ r* V. V8 ^ - CSpace:1001501F mov ecx, [eax+230h], t# X! d% d* T0 @$ o& b* O+ [
- CSpace:10015025 movzx edx, byte ptr [ecx+1Ah]
" s4 R$ W9 p. s* ]% _/ W+ f - CSpace:10015029 test edx, edx
+ n" L! [) \$ Q7 H. o - CSpace:1001502B jnz short loc_1001503C3 ~9 z+ J5 L6 Z- H' H) W/ z* U6 H8 z
- CSpace:1001502D mov eax, [ebp+dwNewLong]0 r) A" n& y. T$ `$ X
- CSpace:10015030 mov ecx, [eax+230h]
1 l( r5 s0 [8 J, V - CSpace:10015036 add ecx, 82 e9 k8 v% W, Q6 [# n
- CSpace:10015039 mov [ebp+lpGUID], ecx, j' C8 F7 W! z/ Z" y
- CSpace:1001503C
3 Q; h" Y1 ~' u6 c - CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j" A2 M* x9 x- o, s/ l
- CSpace:1001503C mov eax, [ebp+dwNewLong]" u+ q% ]% O9 F+ [ ~7 W
- CSpace:1001503F mov ecx, [eax+230h]) f7 E* K X4 I% e; c4 @8 d
- CSpace:10015045 mov edx, [ecx+1Ch]
8 [ i u& N: _: d8 S& t8 J* t - CSpace:10015048 push edx
$ N" A9 a. Q, x# D. C - CSpace:10015049 mov eax, [ebp+dwNewLong]
6 J B9 s; ?/ q- q/ `/ M, p# I% S - CSpace:1001504C mov ecx, [eax+230h]# x2 y( C: r# c, M2 `
- CSpace:10015052 mov edx, [ecx+20h]
1 h& M' E8 O" g, V' M: K6 t - CSpace:10015055 push edx
* Q/ [6 d! i+ e - CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)"
+ E/ r! Y) o7 `# i - CSpace:1001505B push 3& M" M7 Q2 b. u( [ F8 C3 W
- CSpace:1001505D mov eax, [ebp+dwNewLong]
. q! c2 c, g) \# _: [+ W9 n - CSpace:10015060 push eax6 _, l. I+ \7 O4 k$ @" t
- CSpace:10015061 call sub_1003882A
' ^+ Y5 w9 a1 l! U- l7 y9 o - CSpace:10015066 add esp, 14h2 I0 y, j7 S8 j7 Q
- CSpace:10015069 push 0 ; pUnkOuter
; j1 F9 w. j- o; S8 W: I' n! D - CSpace:1001506B mov eax, [ebp+dwNewLong]: l u8 z2 ~% ~2 C' s
- CSpace:1001506E add eax, 1DCh
4 h; Q& z* Y2 q - CSpace:10015073 push eax ; lplpDD- V" f, F5 a8 @" L3 @/ o: O
- CSpace:10015074 mov ecx, [ebp+lpGUID]
. h4 H Z- X8 ~* F2 }1 N - CSpace:10015077 push ecx ; lpGUID% }( I, d6 r! o# @
- CSpace:10015078 call j_DirectDrawCreate4 K/ A4 B: ^. ?$ Q
- CSpace:1001507D mov [ebp+var_14], eax/ b7 I2 @0 |, z( A3 D0 b. T9 o
- CSpace:10015080 cmp [ebp+var_14], 0
$ ?2 |/ @ w) Q; ^7 K9 [6 V3 e) |. z - CSpace:10015084 jz short loc_1001509E' h7 W( z8 G" S& X
- CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n"
' A0 B+ [ |( f* }2 [ - CSpace:1001508B mov eax, [ebp+var_14]
, z# {6 Z! f% b7 U - CSpace:1001508E push eax) t1 b2 \- r- w6 S) @
- CSpace:1001508F mov ecx, [ebp+dwNewLong]$ g7 @; p0 J7 ^
- CSpace:10015092 call sub_10038F3C$ M; a/ K k" @" [: F8 L
- CSpace:10015097 xor al, al
! l! B+ G" W0 V/ a3 q: T - CSpace:10015099 jmp loc_10015173
复制代码
* D! T! `# r: a" Y5 {0 A2 ?& }
3 s9 Y4 H8 |( J$ P! ?3 c) M
; `( \) ]8 H5 Z0 k' [. H; o我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log.
2 T5 @3 a2 R: p p3 ~2 P R3 a记录到log_GL.out文件中。以下是摘录的一段。
+ g$ Y; X" a% w; f8 ~. K5 f我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。$ |/ m# X, n- i5 l( p
以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?. S4 w; }# M8 _! r& o1 Z$ Q
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
) r8 |6 x$ Y! Q# K+ j6 j/ i# _0 E - glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>
8 ]: z- b$ t q7 J; H. [- W - glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>+ N1 [% g) Y e6 ` |- L. b
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>/ {' \% V5 [/ s: g! V% L' l3 @3 @6 O
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
5 N# q- b. I4 s* T5 e, ? - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
6 r) L# x& \+ d3 s; d - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
& Y( x5 |* _3 Q - glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>
# y% u; I1 f/ V/ ~ - glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>2 S: O" o g# h
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>
' [3 G' g8 |( v$ d" h9 c5 y6 h( T - glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>) q1 N% C( x, _7 l5 ^5 f ?2 ^2 z3 R
- glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>1 s0 U& `, B6 D! S2 s2 D
- glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
1 J/ n* H3 a Z$ J6 e - glClear, GLbitfield<256>1 e' ]- o( w+ |* |, ]/ a( w. r; P9 i
- glShadeModel, GLenum<7424>
5 U C, \6 ]) o/ I, g g6 G - glDisable, GLenum<2929>
; @. x+ b) {/ o; c- Q - glDisable, GLenum<3008>- J- U5 [3 ~9 L- @! s2 @
- glDisable, GLenum<2896>9 o1 A [1 D8 \3 g, ?* k
- glEnable, GLenum<3042>1 Q4 \( G% `; k+ U" G k& e$ E
- glDisable, GLenum<3553>
' m9 w$ z9 p% L; A - glBindTexture, GLenum<3553>, GLuint<631>+ Z5 g- o/ J$ ~
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729># ^( J6 s3 L0 I Y1 K, C1 V
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>! d% K) L6 }/ a! b5 v- g. Q7 O
- glClear, GLbitfield<16384>
, y8 l6 w: G8 e - glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>6 f \# N7 u* K' R# R" e4 f
- glEnable, GLenum<3553>
8 c1 E$ I- {+ I* X0 O( b - glBegin, GLenum<7>1 {' s/ X& h# ~
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>" U$ F) W5 V4 |' \- ]% y) k
- glTexCoord2f, GLfloat<0>, GLfloat<0>
; ]8 |) _0 x& H, W3 n8 y - glVertex2i, GLint<0>, GLint<768>4 Q& g8 N* W, l9 ^
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>/ C# P0 E, e) f" ] t8 V7 K
- glVertex2i, GLint<1024>, GLint<768>: ^/ ^$ m* J8 c1 q7 t, G
- glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
) w6 p o+ G; L' }# H" ?% g! _ - glVertex2i, GLint<1024>, GLint<-256>8 l0 k. z9 B; \0 v
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>4 w0 Q3 U( \5 S. n- _
- glVertex2i, GLint<0>, GLint<-256>/ T8 e0 M9 p& @
- glEnd; |- s" ?5 M, A5 s/ F6 C8 s
- glShadeModel, GLenum<7424>& ^1 t, [; H0 S# V5 w/ m/ e
- glGetError
* o1 O% y+ v- o6 O - glDisable, GLenum<2929>& P+ {+ V. d( T/ [
- glGetError
7 M. k8 m( K. |9 y" H Z* [" ` - glBlendFunc, GLenum<770>, GLenum<771>1 y- x- u4 r' N) @) z# B8 S
- glGetError3 T8 a7 C$ x( N T: E8 k
- glEnable, GLenum<3042>" Y5 Q! I3 F0 h9 P0 E1 _& O7 N
- glGetError
& w* c2 l! N* G2 Q: p: } - glDisable, GLenum<3553>
2 k4 x0 \5 Z9 I: q3 m - glGetError! e, }& z1 P f0 C1 n. R* L5 A
- glBegin, GLenum<7>" t9 J" ~3 W9 t8 E1 z& C
- glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844>
" l- R2 j8 a; {6 k3 f - glTexCoord2f, GLfloat<0>, GLfloat<0>
7 H3 y+ \- m0 k - glVertex2i, GLint<0>, GLint<768>
u* Q2 V6 {0 t1 ^ - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>; I& g) c4 G, m0 d$ d
- glVertex2i, GLint<1024>, GLint<768>
3 N- h$ q2 y8 _* Y - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>3 L+ Y" h2 u2 {) q {% x
- glVertex2i, GLint<1024>, GLint<0>
9 o0 s' ^) o3 B2 e$ w: P1 A* h - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>8 E9 u. X" N+ {
- glVertex2i, GLint<0>, GLint<0>; m' a0 i u- L4 v/ V* x5 f
- glEnd+ K. g% H* W7 A
- glGetError
! [5 S5 o5 \) D/ W. L+ a) g5 R: t - glEnable, GLenum<3553>7 d) `; U. h/ I, r
- glGetError
1 W1 T0 L2 Y! S4 g1 x3 C - glFlush: [4 r( X% H" X3 q& O6 ~
- wglSwapBuffers
( M5 @! x d+ R5 c. @3 S& X- R( u5 W7 K - ---------------------------
9 @% ~0 f+ B4 {& A, k+ g& M - , HDC<-33484711>7 Y5 v% |% q% M, A7 J9 U
- wglGetPixelFormat, HDC<-33484711>
/ {: O: v4 d- l - glMatrixMode, GLenum<5889>
" Z/ f, E. k* a& ~$ v& D - glLoadIdentity
/ j! {- {, ?* u9 B; t - glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120>
/ W& g* k: Z3 k - glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768>
4 {% l% n" Y- ^% |+ C9 w2 t - glMatrixMode, GLenum<5888>+ F0 y0 F) g4 x" x
- glLoadIdentity" \ H3 f5 X; X+ z' B
- glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0>5 Q: s: \* C7 q
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
* P2 T+ b! o8 S3 m8 c/ }* A) X - glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>
& B' L1 B- }- {+ t S' S - glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>
9 R+ B7 `" J& q; ~% ~. }$ E - glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>
3 y% E" ~" S; B8 ^ - glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>* o8 F4 P& v0 o, D' e: s- W
- glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
A, A$ P$ H1 ]6 x0 i3 } - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
1 q3 Z# f( f) O - glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>4 k L' t e" p# D9 n' m7 ~; C {
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
2 G. t' d! u. I) v - glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>
; J9 ~! {! d' c) i0 J6 s+ i1 ?' i - glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>4 r, N* G0 H/ F1 x+ F
- glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>
0 x- M8 T0 r8 L, B6 S$ t - glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
( f A8 O v: A) F - glClear, GLbitfield<256>
8 i& e; o# ] g- y& w0 Q E& X) ~# q - glShadeModel, GLenum<7424>$ J, q7 ^; z) g7 ]- ~
- glDisable, GLenum<2929>
( |5 u9 w* V0 Y. f- R* b5 D - glDisable, GLenum<3008>
F X: e2 Y9 C0 j; T - glDisable, GLenum<2896>
1 r% j; s/ i1 t% {( T2 ~ - glEnable, GLenum<3042>
9 y4 w9 r/ J5 O - glDisable, GLenum<3553>
8 j: q- B7 r. q( _' S - glBindTexture, GLenum<3553>, GLuint<631> x8 z K. T) o5 Q
- glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>, Y0 z- g" B5 x: a- `( e7 T+ R6 `
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
# W' {; W9 V' R8 i! t& i* y - glClear, GLbitfield<16384>
4 x+ n" c2 k( j2 v) O6 u6 F - glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>
, Z) a, k+ w+ W( m+ k - glEnable, GLenum<3553>
% N: H0 K% \4 I1 W, Q ^ - glBegin, GLenum<7>
3 T& c" y: f7 ~3 k, L - glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
8 @% ~! }2 o [3 n# r3 }7 @ - glTexCoord2f, GLfloat<0>, GLfloat<0>3 M% W: M6 U4 m
- glVertex2i, GLint<0>, GLint<768>$ w! ^& p2 b& j# v/ \
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>$ p0 r; }; ?! _' l O( l0 j
- glVertex2i, GLint<1024>, GLint<768>
( u* P1 I8 @- j# @0 | u' Q9 C/ E - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
. `+ { i' M$ ?, L - glVertex2i, GLint<1024>, GLint<-256>
( m v) A% o, v, B* k9 K - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>6 x( Q2 U% j+ g2 i& ?
- glVertex2i, GLint<0>, GLint<-256>
7 H9 Q' a1 |5 N J+ F
复制代码
2 V0 f5 O4 C0 ^0 P3 \# S) q7 D: D( E- |. K! s: q
|