;;    dwrap'  dxmci
;; hacks for implanting DWRAP into DXMCI

! 4

; hook call to dwrap.dll
& ODWA  x301003 x003B8  x302003 x003B8  ;   dwrap.dll!DirectDrawCreate  ddraw.dll!DirectDrawCreate
;   nodwrap.c
; used in nowrap.c

; ddhack.cpp:
& ODP8  x301002 x14050  x302002 x14070  ; pal8  InitInstance(); bitmapInfo  getgdibitmap()
& ODP6  x301002 x14054  x302002 x14074  ; pals6  InitInstance()
& ODB8  x301002 x14058  x302002 x14078  ; bits8  InitInstance(); wc4bits8  getgdibitmap()
& ODB6  x301002 x1405C  x302002 x1407C  ; bits16  InitInstance()
& ODWT  x301002 x0B724  x302002 x0B744  ;   bThreadRunning  myTextSleep()
& ODWS  x301002 x1AAD8  x302002 x1AAF8  ;   SVGA_on  newwinproc()

; ddhack.cpp::InitInstance()
& ODIM  x301002 x1AAD8  x302002 x1AAF8  ; mode
& ODIW  x301002 x0620C  x302002 x0620C  ; win

; replace to call to myTextSleep() (see "pre-mission text" in patchEXE()):

; 0044308C                   L0044308C:
; 0044308C  F60544C74B0001       test  byte ptr [L004BC744],01h
; 00443093  7413                 jz    L004430A8
; 00443095  8B359C444D00         mov   esi,[KERNEL32.dll!Sleep]
; 0044309B                   L0044309B:
; ----------------- 
; 0044309B  6A01                 push  00000001h
; 0044309D  FFD6                 call  esi
; 0044309F  F60544C74B0001       test  byte ptr [L004BC744],01h
; 004430A6  75F3                 jnz   L0044309B
; -----------------  
; 0044309B  E8xxxxxxxx           call   myTextSleep
; 004430A0  90                   nop
; 004430A1  90                   nop
; 004430A2  90                   nop
; 004430A3  90                   nop
; 004430A4  90                   nop
; 004430A5  90                   nop
; 004430A6  90                   nop
; 004430A7  90                   nop
; -----------------
; 004430A8                   L004430A8:
; 004430A8  8B15BCC64B00         mov   edx,[L004BC6BC]
; 004430AE  A1DCC64B00           mov   eax,[L004BC6DC]
; 004430B3  8B0D94504C00         mov   ecx,[L004C5094]

; !!     :
. PLUG  x900DF00D  ; "good food" - , plug
@ ADDR  &ODWT .PLUG  x301000 x420A1  x302000 x420A1  ; replace address (not contents!) of variable
                                                     ; bThreadRunning with the plug
{ REPL 13  ; replace several bytes of code (including previous plug) with call command:
  $ x6A x01 xFF xD6 xF6 x05
                            = .PLUG ; four bytes
                                          $ x01 x75 xF3
  $ xE8 x00 x00 x00 x00 x90 x90 x90 x90 x90 x90 x90 x90
  @ CORE  x301000 x4209B  x302000 x4209B  ; 0044309B
} REPL
; replace zeroes in call command with offset to myTextSleep():
& OMTS  x301000 x420A0  x302000 x420A0  ; 
; &NMTS    xlat.c
@ JUMP &OMTS &NMTS  x301000 x4209C  x302000 x4209C  ; -> myTextSleep()

