本帖最后由 shane007 于 2023-8-25 17:31 编辑 0 c5 G) _ l3 C$ T1 U; M5 ?
' v ^7 O2 g; {6 O4 k* @& I本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,- I5 Z9 o% p; A, \! w3 D& o
游戏应该实际只用了其中1个,暂时作下记录。+ q+ X- m6 O( o( t2 O" B
6 C [. H# C0 W# n+ Q' w5 A. ^; e% EDirectDraw是由bin目录下的ddraw2d.dll来完成的。 y4 x$ r; `4 u2 U9 e! H
以下是一处的初始化代码
- q& _( d* E& U7 B& B* w6 W- CSpace:100150153 U0 K3 f1 v V+ e, \' R
- CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j. N5 U2 J. W( b
- CSpace:10015015 mov [ebp+lpGUID], 0
7 R0 j) h1 { x+ w8 S - CSpace:1001501C mov eax, [ebp+dwNewLong] r7 h* s! }1 Q- V( E
- CSpace:1001501F mov ecx, [eax+230h]
, P2 `4 z% i( ?0 [3 p& ? - CSpace:10015025 movzx edx, byte ptr [ecx+1Ah]& ]- y" n! V, U: ]9 r& v' |
- CSpace:10015029 test edx, edx0 }7 e' J0 h" j: d( R ]2 R8 g: _
- CSpace:1001502B jnz short loc_1001503C! J [7 _4 v+ l4 V
- CSpace:1001502D mov eax, [ebp+dwNewLong]! S7 J4 b! a a9 e: z U9 ~
- CSpace:10015030 mov ecx, [eax+230h]
9 i; F) M. b. P+ l - CSpace:10015036 add ecx, 8
2 O7 f3 `3 y' R2 k' F - CSpace:10015039 mov [ebp+lpGUID], ecx5 w$ [( s7 l# t7 P
- CSpace:1001503C+ [6 \1 q0 u( u' ^
- CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j
" N6 a. o6 T5 Y+ h) }; R! D - CSpace:1001503C mov eax, [ebp+dwNewLong]* q9 r: u3 I( |" @/ {9 O
- CSpace:1001503F mov ecx, [eax+230h]
8 i- [6 O5 \9 K* f - CSpace:10015045 mov edx, [ecx+1Ch]
4 j$ d- |3 \" \3 K5 c7 ^ - CSpace:10015048 push edx
0 W! u. r& q! ^; c4 c' H# a/ i$ a - CSpace:10015049 mov eax, [ebp+dwNewLong]! O4 \: E: s1 p2 {5 q4 Z: J6 I
- CSpace:1001504C mov ecx, [eax+230h]
7 U2 q) U/ Y' h6 S' h - CSpace:10015052 mov edx, [ecx+20h]2 z3 C4 ?, L4 V+ N" a1 G, M
- CSpace:10015055 push edx
6 ^# I$ u8 o- c4 m6 S5 a2 ~ - CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)"
3 V6 N- }9 h( Y& m- o: F) ?8 k2 @" B - CSpace:1001505B push 3
5 C7 {$ g0 c, u2 k0 v8 y - CSpace:1001505D mov eax, [ebp+dwNewLong]
% W" {" x9 w1 `# H9 G5 L - CSpace:10015060 push eax4 H: Y9 n6 J; {$ ^
- CSpace:10015061 call sub_1003882A6 i# I( N2 N) W: h, I
- CSpace:10015066 add esp, 14h
$ q0 L$ `! E( Y- U6 x4 T - CSpace:10015069 push 0 ; pUnkOuter$ {1 [# j9 ^* Z4 i o4 z3 @
- CSpace:1001506B mov eax, [ebp+dwNewLong]" b4 F1 j0 B' J/ r! }
- CSpace:1001506E add eax, 1DCh F& ~6 g* H/ }: q/ D" P4 b7 x
- CSpace:10015073 push eax ; lplpDD
2 q+ q9 N9 W2 G$ k - CSpace:10015074 mov ecx, [ebp+lpGUID]7 F9 ~8 H& _( ?& T' O4 \# O
- CSpace:10015077 push ecx ; lpGUID
4 ~4 h4 R. ~: v8 i5 { - CSpace:10015078 call j_DirectDrawCreate
4 N- Z$ r3 x2 D/ }, Y) U- k: h4 l - CSpace:1001507D mov [ebp+var_14], eax
% W, q; U3 q. p - CSpace:10015080 cmp [ebp+var_14], 0
& T! C d6 C8 `* C - CSpace:10015084 jz short loc_1001509E
* w& C8 j; D/ g, D {! ] - CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n"
) p. W$ t2 w& ` - CSpace:1001508B mov eax, [ebp+var_14]
: R+ m+ G' A/ _2 b# q - CSpace:1001508E push eax; D. m9 y' q" |, B, c* z% ^
- CSpace:1001508F mov ecx, [ebp+dwNewLong]1 {- c- H) A3 P- X
- CSpace:10015092 call sub_10038F3C- N; p- k- J% Y9 R
- CSpace:10015097 xor al, al
9 Q2 R! C! @9 p9 f' a! x. C - CSpace:10015099 jmp loc_10015173
复制代码 : p6 m3 o! g& G# E; [& V
' _! }* h) G" B- M% t" }: W
2 D9 E' ?" n9 v6 z* o* g我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log.
' p; l, i* ~9 t. g0 f0 E记录到log_GL.out文件中。以下是摘录的一段。
, a4 o3 Y" X; n9 G) s0 H我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。
6 z! o6 r; R4 U) w- }2 ]% D- s$ g以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?% C- Z+ p7 P6 J' ^
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
5 d8 n+ P5 N: @/ G! ] - glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>
$ i9 D$ B2 g5 g' M( [ - glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>
! j" V& W* V4 z) c" | - glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>
* b9 D+ R1 Z' ^$ Z - glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
2 z2 l9 ]* k' t! F9 r5 [+ H% q - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>2 M) s2 S3 |0 E
- glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>7 D, O- K _! [. f; b. Q
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>2 b$ `) H2 Y! K1 J% Y
- glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>' P2 K" \1 I( @. a+ Y, U
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167> |9 e2 e$ C0 m; ]
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
9 i f( Y9 Y1 m X4 n - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>
9 n7 V T/ W6 w# W% b" w - glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
. c$ u* D3 q" I/ B! [; Q - glClear, GLbitfield<256>
$ z5 |' F# c- [9 B; L - glShadeModel, GLenum<7424>
1 r; n: Z6 p! F: ?- H8 [ - glDisable, GLenum<2929>
4 M: d3 Z+ [3 e" V+ B& s - glDisable, GLenum<3008># K* w- l; \/ u& R3 j
- glDisable, GLenum<2896>
+ F+ c" I `) ` - glEnable, GLenum<3042>6 W" p# ~8 M# e; n8 T( G
- glDisable, GLenum<3553>9 F9 T. z" L. U* T4 \5 W
- glBindTexture, GLenum<3553>, GLuint<631>
# Q( B" p1 f& q1 T( k0 s - glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
0 a q4 n- S) |# C: T6 [ - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
0 q& \& G% y' b: Z0 l! K0 F. R" h/ D - glClear, GLbitfield<16384>) ~- o$ M0 H- H/ E
- glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>& ]* B" T8 t: q6 N/ ^
- glEnable, GLenum<3553>* ^3 l$ b' ?8 v1 C2 ~ b
- glBegin, GLenum<7>) V4 m$ a( w- Z, G5 `
- glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>9 L% G' K' [0 ^% p3 q0 m2 U
- glTexCoord2f, GLfloat<0>, GLfloat<0>2 o/ @. b0 j& P; S. Z
- glVertex2i, GLint<0>, GLint<768>
5 |4 J5 g8 p& m/ K - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
8 s7 q- K4 ~9 M2 r- d) F - glVertex2i, GLint<1024>, GLint<768>
' x3 n; e( ?: N3 v5 w1 t: }; p O - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
9 I" I, ^. M+ x - glVertex2i, GLint<1024>, GLint<-256>+ @& C' b0 H7 n* A' K- B/ G
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
% M2 A9 M7 q4 V' Y8 [ - glVertex2i, GLint<0>, GLint<-256>, R- g/ \. P+ _, u/ C& p# [
- glEnd
4 t% p" t7 [" @9 Z - glShadeModel, GLenum<7424>7 E* V( v4 x8 G# @
- glGetError* a% s! I0 b. w$ q
- glDisable, GLenum<2929>: h- F8 u. ^# f* Z+ N4 G
- glGetError
5 ]4 b4 S* a( k( X2 P0 Q" | - glBlendFunc, GLenum<770>, GLenum<771>2 @* k2 P4 U( L" U# k$ {8 Z. d
- glGetError9 ?$ a# a- L d7 q9 |: g5 v
- glEnable, GLenum<3042>
9 b( |6 N; E4 b* S+ S - glGetError
7 [" [7 U* H6 u3 m - glDisable, GLenum<3553>, z8 `% |& v% C u9 B% V5 X, w* E
- glGetError
; `. x8 N6 r6 q- ` - glBegin, GLenum<7>
! b- _: l, G3 r' I6 N. u- A2 l - glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844>
; k# ^# T! Q. a/ V. E - glTexCoord2f, GLfloat<0>, GLfloat<0>
B) o& f& N% X' t w - glVertex2i, GLint<0>, GLint<768>
& N/ R- \4 I( J8 C - glTexCoord2f, GLfloat<1065353216>, GLfloat<0>. l; i0 c! b7 U
- glVertex2i, GLint<1024>, GLint<768>
9 E2 t+ F8 x1 f1 |1 G - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>8 p& Y0 T0 R% P; c# c7 }6 N
- glVertex2i, GLint<1024>, GLint<0>1 d! q0 ~/ M( z
- glTexCoord2f, GLfloat<0>, GLfloat<1065353216>* t9 y$ w9 y& e# ]4 g" G( l
- glVertex2i, GLint<0>, GLint<0>
# e$ V5 f2 L, @8 I$ @' n- X, }# l4 w - glEnd9 l% g7 \( v9 U
- glGetError
9 q" z# P7 u+ m1 {9 T - glEnable, GLenum<3553>: Z# j1 ~; V1 ?# s
- glGetError% F7 [- P- Q5 E; ]3 c- B
- glFlush6 I+ L, t! I- Z1 e
- wglSwapBuffers
& Y; L2 e$ e6 b j, j - ---------------------------
) ?0 R2 x- S; E7 z - , HDC<-33484711>
5 {) |: |" k" o - wglGetPixelFormat, HDC<-33484711>
5 R3 |. p* N! v) i0 X - glMatrixMode, GLenum<5889>
+ C3 d* ]# O6 a: L - glLoadIdentity
7 H; K0 N: D" N- a; |: N& M4 H: I - glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120>4 ]: j/ ?& G# m- b
- glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768> q. d; B/ L. M$ _+ x- P
- glMatrixMode, GLenum<5888>" p% v, H( D) Q0 `, R
- glLoadIdentity# m9 ?- w( l+ \8 b3 i' D
- glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0>5 `) _$ X7 p8 b+ i; S; c: b) A
- glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
6 P1 M/ t @) F1 x- q; H - glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890># i2 I3 W7 d0 V2 l; K/ d8 C' ~4 ?
- glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>" ^8 T/ h" y$ A
- glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>) n: A; m* s3 q
- glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
4 N2 Z1 E& h& v) g - glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
. P9 f% k+ p+ k& B2 h& z - glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216> C7 k5 P) g$ b$ e2 j/ o0 ^
- glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>
: W2 p7 B# U0 f5 K5 G8 k - glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>+ M+ V3 ~# W+ l7 {' E* |
- glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>- y& ]$ N1 I3 v/ z! [, r
- glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
2 A! D8 L2 J. A - glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>
) b; K6 H% \4 p$ M8 j - glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
' L' J9 q2 I) E; |- B - glClear, GLbitfield<256>4 o$ W5 I& n0 k$ X
- glShadeModel, GLenum<7424>( P A+ k) r" ~
- glDisable, GLenum<2929>
* k f' F/ k9 v* c# K& x! ~5 z) H - glDisable, GLenum<3008>& l. o1 y# G7 u! a/ Q A
- glDisable, GLenum<2896>
6 t$ ]" e3 k0 g/ C8 h - glEnable, GLenum<3042>8 H$ r7 E* ]. L8 L0 v' e
- glDisable, GLenum<3553>
) I: z" |* W& P& W+ y - glBindTexture, GLenum<3553>, GLuint<631>
4 T" v$ j! v; Z" G( \8 E - glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
, I% C" ?. a" _* Q! y% s6 h5 R - glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
/ ~2 G' h- X3 |; j: T% ` - glClear, GLbitfield<16384>
% F( N* N- R F+ U4 E - glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608># l+ q+ H y& d- t9 S
- glEnable, GLenum<3553>
# {0 s2 k, o1 p - glBegin, GLenum<7>
0 f2 j2 @ c0 ^8 x2 D8 m" p V - glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>0 l( S6 b, ~( \% N E1 w0 r, d
- glTexCoord2f, GLfloat<0>, GLfloat<0>* y* o" f9 b3 A% O j2 C4 ]
- glVertex2i, GLint<0>, GLint<768># S+ i7 u P8 f- g7 r5 {
- glTexCoord2f, GLfloat<1065353216>, GLfloat<0>% L; d' U7 {; y2 L1 B
- glVertex2i, GLint<1024>, GLint<768>
* u% p& j, f6 K: o3 F# U: e - glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>* S/ ?3 A% j" z
- glVertex2i, GLint<1024>, GLint<-256>
, f0 Z: X; h: L# d2 u - glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
2 ?& T, v q! N - glVertex2i, GLint<0>, GLint<-256>
! V& ?( O5 M" S( \
复制代码 5 W& |+ h7 g e* g/ ?* q7 x
" O$ ~/ e3 H5 I, }" F' \
|