home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 8 Other / 08-Other.zip / ddrawrep.zip / DDRAW.ASM next >
Assembly Source File  |  1999-09-24  |  17KB  |  777 lines

  1. ; DDRAW.DLL replacement to use software emulation but make programs
  2. ;  think we have hardware support.
  3. ; The real DDRAW.DLL must be renamed to ORGDDRAW.DLL
  4. ;
  5. ; Works by intercepting DLL functions and patching vtables with
  6. ;  pointers to our methods.
  7. ;
  8. ; Created by Paul Chitescu - 15 August 1999
  9.  
  10.         .386p
  11.  
  12. ; How we handle IDirect3D23::FindDevice : patch GUID or ignore it ?
  13. FIND_GUID_REPL    equ    1    ; change to 0 to ignore GUID instead
  14.  
  15.  
  16. ; Various standard identifiers for which I don't have the include
  17. ;  files (and also don't like to use them even if I had them)
  18. DLL_PROC_ATTACH    equ    1
  19.  
  20. MB_OK        equ    0
  21. MB_ICONHAND    equ    10h
  22. MB_ICONQUESTION    equ    20h
  23. MB_ICONEXCLAMATION    equ    30h
  24. MB_ICONASTERISK    equ    40h
  25.  
  26. DDCREATE_HARDWAREONLY    equ    1
  27. DDCREATE_EMULATIONONLY    equ    2
  28.  
  29. DDCAPS_3D    equ    1
  30.  
  31. D3DFDS_GUID    equ    2
  32. D3DFDS_HARDWARE    equ    4
  33.  
  34. LENGTH_GUID1    equ    16
  35. LENGTH_GUID2    equ    8
  36. LENGTH_GUID4    equ    4
  37.  
  38. LENGTH_D3DDEVICEDESC    equ    100h        ; 0fch for version 6
  39.  
  40. .idata        segment dword public use32 'DATA'
  41.  
  42. ; Pointers to the real methods (taken from the vtable)
  43. ICLSF_CI    dd    0
  44. IDDraw_QI    dd    0
  45. IDDraw_GC    dd    0
  46. ID3D23_QI    dd    0
  47. ID3D23_ED    dd    0
  48. ID3D23_FD    dd    0
  49. ID3D23_CD    dd    0
  50. ID3D3_EZ    dd    0
  51. ID3DD23_GC    dd    0
  52.  
  53. ; Pointer to the GUID of the 3D device to be used
  54. pTrueDevice    dd    -1
  55. ; Number of the 3D device to be used (0=none 1=RGB 2=REF)
  56. iEmulType    dd    -1
  57.  
  58. ; Device description of the HEL of the 3D device to be used
  59. D3D_HEL_DevDesc    db    LENGTH_D3DDEVICEDESC dup (0)
  60.  
  61. .idata        ends
  62.  
  63. DGROUP        group    .idata
  64.  
  65.  
  66. DEFINE_GUID    macro    lbl,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8
  67. lbl:
  68.         dd    l
  69.         dw    w1,w2
  70.         db    b1,b2,b3,b4,b5,b6,b7,b8
  71.         endm
  72.  
  73.  
  74. MKFWD        macro    n
  75.         public    My&n
  76.         extrn    _&n:NEAR
  77. My&n:        jmp    _&n
  78.         endm
  79.  
  80.  
  81. MKENT        macro    n
  82.         public    My&n
  83.         extrn    _&n:NEAR
  84. My&n:
  85.         endm
  86.  
  87.  
  88. .text        segment byte public use32 'CODE'
  89.         assume    cs:.text,ds:DGROUP,es:DGROUP
  90.  
  91. DEFINE_GUID    IID_IClassFactory,000000001h,00000h,00000h,0C0h,000h,000h,000h,000h,000h,000h,046h
  92. DEFINE_GUID    CLSID_DirectDraw, 0D7B70EE0h,04340h,011CFh,0B0h,063h,000h,020h,0AFh,0C2h,0CDh,035h
  93. DEFINE_GUID    IID_IDirectDraw,  06C14DB80h,0A733h,011CEh,0A5h,021h,000h,020h,0AFh,00Bh,0E5h,060h
  94. DEFINE_GUID    IID_IDirectDraw2, 0B3A6F3E0h,02B43h,011CFh,0A2h,0DEh,000h,0AAh,000h,0B9h,033h,056h
  95. DEFINE_GUID    IID_IDirectDraw4, 09c59509ah,039bdh,011d1h,08ch,04ah,000h,0c0h,04fh,0d9h,030h,0c5h
  96. DEFINE_GUID    IID_IDirect3D,    03BBA0080h,02421h,011CFh,0A3h,01Ah,000h,0AAh,000h,0B9h,033h,056h
  97. DEFINE_GUID    IID_IDirect3D2,   06aae1ec1h,0662ah,011d0h,088h,09dh,000h,0aah,000h,0bbh,0b7h,06ah
  98. DEFINE_GUID    IID_IDirect3D3,   0bb223240h,0e72bh,011d0h,0a9h,0b4h,000h,0aah,000h,0c0h,099h,03eh
  99. DEFINE_GUID    IID_IDirect3DRampDevice, 0F2086B20h,0259Fh,011CFh,0A3h,01Ah,000h,0AAh,000h,0B9h,033h,056h
  100. DEFINE_GUID    IID_IDirect3DRGBDevice,  0A4665C60h,02673h,011CFh,0A3h,01Ah,000h,0AAh,000h,0B9h,033h,056h
  101. DEFINE_GUID    IID_IDirect3DHALDevice,  084E63dE0h,046AAh,011CFh,081h,06Fh,000h,000h,0C0h,020h,015h,06Eh
  102. DEFINE_GUID    IID_IDirect3DMMXDevice,  0881949a1h,0d6f3h,011d0h,089h,0abh,000h,0a0h,0c9h,005h,041h,029h
  103. DEFINE_GUID    IID_IDirect3DRefDevice,  050936643h,013e9h,011d1h,089h,0aah,000h,0a0h,0c9h,005h,041h,029h
  104. DEFINE_GUID    IID_IDirect3DNullDevice, 08767df22h,0bacch,011d1h,089h,069h,000h,0a0h,0c9h,006h,029h,0a8h
  105. DEFINE_GUID    IID_IDirect3DDevice,     064108800h,0957dh,011d0h,089h,0abh,000h,0a0h,0c9h,005h,041h,029h
  106. DEFINE_GUID    IID_IDirect3DDevice2,    093281501h,08cf8h,011d0h,089h,0abh,000h,0a0h,0c9h,005h,041h,029h
  107. DEFINE_GUID    IID_IDirect3DDevice3,    0b0ab3b60h,033d7h,011d1h,0a9h,081h,000h,0c0h,04fh,0d7h,0b1h,074h
  108.  
  109. HAL_Dev_Name    db    'Pseudo Hardware',0
  110. HAL_Dev_Desc    db    'Software Emulation',0
  111. INI_Section    db    'Direct3D',0
  112. INI_Key        db    'Emulation',0
  113.  
  114. ;        extrn    _MessageBeep@4:NEAR
  115.         extrn    _GetProfileIntA@12:NEAR
  116.  
  117.  
  118.         public    _PrivateEmulatorSetup@4
  119. _PrivateEmulatorSetup@4    PROC    NEAR
  120.         mov    ecx,[esp+4]
  121.         mov    eax,iEmulType
  122.         cmp    ecx,-1
  123.         je    pes_ret
  124.         mov    eax,ecx
  125.         mov    ecx,OFFSET IID_IDirect3DRGBDevice
  126.         cmp    eax,1
  127.         je    pes_set
  128.         mov    ecx,OFFSET IID_IDirect3DRefDevice
  129.         cmp    eax,2
  130.         je    pes_set
  131.         xor    eax,eax
  132.         xor    ecx,ecx
  133. pes_set:
  134.         mov    iEmulType,eax
  135.         mov    pTrueDevice,ecx
  136.         mov    dword ptr D3D_HEL_DevDesc,0
  137. pes_ret:
  138.         ret    4
  139. _PrivateEmulatorSetup@4    ENDP
  140.  
  141.  
  142.         public    _DllEntry@12
  143. _DllEntry@12    PROC    NEAR
  144.         push    ebp
  145.         mov    ebp,esp
  146.         mov    eax,[ebp+12]        ; fdwReason
  147.         cmp    eax,DLL_PROC_ATTACH
  148.         jne    @@ent_ret
  149.  
  150.         cmp    pTrueDevice,-1
  151.         jne    @@ent_ret        ; Already init
  152.         push    0
  153.         push    OFFSET INI_Key
  154.         push    OFFSET INI_Section
  155.         call    _GetProfileIntA@12
  156.         push    eax
  157.         call    _PrivateEmulatorSetup@4
  158.  
  159. @@ent_ret:    xor    eax,eax
  160.         inc    eax
  161.         leave
  162.         ret    12
  163. _DllEntry@12    ENDP
  164.  
  165.  
  166. MayPatchClassF    PROC    NEAR
  167.         ; ebx = vtable of ICLSF
  168.         ; destroy ecx,flags
  169.         mov    ecx,[ebx+3*4]        ; CreateInstance
  170.         cmp    ecx,OFFSET CLSF_CI
  171.         je    clsf_no_ci        ; already patched
  172.         mov    ICLSF_CI,ecx
  173.         mov    dword ptr [ebx+3*4],OFFSET CLSF_CI ; patch
  174. clsf_no_ci:
  175.         ret
  176. MayPatchClassF    ENDP
  177.  
  178.  
  179. MayPatchDDraw    PROC    NEAR
  180.         ; ebx = vtable of IDD, IDD2 or IDD4
  181.         ; destroy ecx,flags
  182.         mov    ecx,[ebx+0]        ; QueryInterface
  183.         cmp    ecx,OFFSET DDraw_QI
  184.         je    mpdd_no_qi        ; already patched
  185.         mov    IDDraw_QI,ecx
  186.         mov    dword ptr [ebx+0],OFFSET DDraw_QI ; patch
  187. mpdd_no_qi:
  188.         mov    ecx,[ebx+11*4]        ; GetCaps
  189.         cmp    ecx,OFFSET DDraw_GC
  190.         je    mpdd_no_gc        ; already patched
  191.         mov    IDDraw_GC,ecx
  192.         mov    dword ptr [ebx+11*4],OFFSET DDraw_GC ; patch
  193. mpdd_no_gc:
  194.         ret
  195. MayPatchDDraw    ENDP
  196.  
  197.  
  198. MayPatchD3D23    PROC    NEAR
  199.         ; ebx = vtable of ID3D2 or ID3D3
  200.         ; destroy ecx,flags
  201.         mov    ecx,[ebx+0]        ; QueryInterface
  202.         cmp    ecx,OFFSET D3D23_QI
  203.         je    mpd3d23_no_qi        ; already patched
  204.         mov    ID3D23_QI,ecx
  205.         mov    dword ptr [ebx+0],OFFSET D3D23_QI ; patch
  206. mpd3d23_no_qi:
  207.         mov    ecx,[ebx+3*4]        ; EnumDevices
  208.         cmp    ecx,OFFSET D3D23_ED
  209.         je    mpd3d23_no_ed        ; already patched
  210.         mov    ID3D23_ED,ecx
  211.         mov    dword ptr [ebx+3*4],OFFSET D3D23_ED ; patch
  212. mpd3d23_no_ed:
  213.         mov    ecx,[ebx+7*4]        ; FindDevice
  214.         cmp    ecx,OFFSET D3D23_FD
  215.         je    mpd3d23_no_fd        ; already patched
  216.         mov    ID3D23_FD,ecx
  217.         mov    dword ptr [ebx+7*4],OFFSET D3D23_FD ; patch
  218. mpd3d23_no_fd:
  219.         mov    ecx,[ebx+8*4]        ; CreateDevice
  220.         cmp    ecx,OFFSET D3D23_CD
  221.         je    mpd3d23_no_cd        ; already patched
  222.         mov    ID3D23_CD,ecx
  223.         mov    dword ptr [ebx+8*4],OFFSET D3D23_CD ; patch
  224. mpd3d23_no_cd:
  225.         ret
  226. MayPatchD3D23    ENDP
  227.  
  228.  
  229. MayPatchD3D3    PROC    NEAR
  230.         ; ebx = vtable of ID3D3
  231.         ; destroy ecx,flags
  232.         mov    ecx,[ebx+10*4]        ; EnumZBufferFormats
  233.         cmp    ecx,OFFSET D3D3_EZ
  234.         je    mpd3d3_no_ez        ; already patched
  235.         mov    ID3D3_EZ,ecx
  236.         mov    dword ptr [ebx+10*4],OFFSET D3D3_EZ ; patch
  237. mpd3d3_no_ez:
  238.         ret
  239. MayPatchD3D3    ENDP
  240.  
  241.  
  242. MayPatchD3DD23    PROC    NEAR
  243.         ; ebx = vtable of ID3DD23
  244.         ; destroy ecx,flags
  245.         mov    ecx,[ebx+3*4]        ; GetCaps
  246.         cmp    ecx,OFFSET D3DD23_GC
  247.         je    mpd3dd23_no_gc        ; already patched
  248.         mov    ID3DD23_GC,ecx
  249.         mov    dword ptr [ebx+3*4],OFFSET D3DD23_GC ; patch
  250. mpd3dd23_no_gc:
  251.         ret
  252. MayPatchD3DD23    ENDP
  253.  
  254.  
  255. ; Callback for the original EnumDevices to fill D3D_HEL_DevDesc
  256. D3DEnumDevCB    PROC    NEAR
  257.         push    ebp
  258.         mov    ebp,esp
  259.         push    esi
  260.         push    edi
  261.  
  262.         mov    eax,1            ; continue enumeration
  263.         mov    esi,[ebp+08]        ; lpGuid
  264.         test    esi,esi
  265.         jz    d3d_enum_ret
  266.         mov    edi,pTrueDevice        ; what we look for
  267.         test    edi,edi
  268.         jz    d3d_enum_stop
  269.         mov    ecx,LENGTH_GUID4
  270.         cld
  271.         repe    cmpsd
  272.         jne    d3d_enum_ret
  273.  
  274.         mov    esi,[ebp+24]        ; lpD3DHELDeviceDesc
  275.         test    esi,esi
  276.         jz    d3d_enum_stop
  277.         mov    edi,OFFSET D3D_HEL_DevDesc
  278.         mov    ecx,LENGTH_D3DDEVICEDESC
  279.         cmp    ecx,[esi]
  280.         jbe    d3d_enum_cpy
  281.         mov    ecx,[esi]        ; limit the size
  282. d3d_enum_cpy:
  283.         jecxz    d3d_enum_stop
  284.         mov    eax,ecx
  285.         cld
  286.         rep    movsb
  287.         mov    dword ptr D3D_HEL_DevDesc,eax
  288. d3d_enum_stop:
  289.         xor    eax,eax            ; stop enumeration
  290. d3d_enum_ret:
  291.         pop    edi
  292.         pop    esi
  293.         pop    ebp
  294.         ret    6*4
  295. D3DEnumDevCB    ENDP
  296.  
  297.  
  298.         MKFWD    AcquireDDThreadLock
  299.         MKFWD    D3DParseUnknownCommand
  300.         MKFWD    DDHAL32_VidMemAlloc
  301.         MKFWD    DDHAL32_VidMemFree
  302.         MKFWD    DDInternalLock
  303.         MKFWD    DDInternalUnlock
  304.         MKFWD    DSoundHelp
  305. ; trapped    MKFWD    DirectDrawCreate
  306.         MKFWD    DirectDrawCreateClipper
  307.         MKFWD    DirectDrawEnumerateA
  308.         MKFWD    DirectDrawEnumerateExA
  309.         MKFWD    DirectDrawEnumerateExW
  310.         MKFWD    DirectDrawEnumerateW
  311.         MKFWD    DllCanUnloadNow
  312. ; trapped    MKFWD    DllGetClassObject
  313.         MKFWD    GetAliasedVidMem
  314.         MKFWD    GetNextMipMap
  315.         MKFWD    GetOLEThunkData
  316.         MKFWD    GetSurfaceFromDC
  317.         MKFWD    HeapVidMemAllocAligned
  318.         MKFWD    InternalLock
  319.         MKFWD    InternalUnlock
  320.         MKFWD    LateAllocateSurfaceMem
  321.         MKFWD    RegisterSpecialCase
  322.         MKFWD    ReleaseDDThreadLock
  323.         MKFWD    VidMemAlloc
  324.         MKFWD    VidMemAmountFree
  325.         MKFWD    VidMemFini
  326.         MKFWD    VidMemFree
  327.         MKFWD    VidMemInit
  328.         MKFWD    VidMemLargestFree
  329.         MKFWD    thk1632_ThunkData32
  330.         MKFWD    thk3216_ThunkData32
  331.  
  332. ; *** DirectDrawCreate ***
  333.         MKENT    DirectDrawCreate
  334.         push    ebp
  335.         mov    ebp,esp
  336.         push    ebx
  337.         push    dword ptr [ebp+16]    ; pUnkOuter
  338.         push    dword ptr [ebp+12]    ; lplpDD
  339.         push    dword ptr [ebp+08]    ; lpGUID
  340.         call    _DirectDrawCreate
  341.         test    eax,80000000h
  342.         jnz    ddc_ret            ; error
  343.         mov    ebx,[ebp+12]        ; lplpDD
  344.         test    ebx,ebx
  345.         jz    ddc_ret
  346.         mov    ebx,[ebx]        ; lpDD
  347.         test    ebx,ebx
  348.         jz    ddc_ret
  349.         mov    ebx,[ebx]        ; vtable
  350.         test    ebx,ebx
  351.         jz    ddc_ret
  352.         call    MayPatchDDraw
  353. ddc_ret:
  354.         pop    ebx
  355.         pop    ebp
  356.         ret    3*4
  357.  
  358.  
  359. ; *** DllGetClassObject ***
  360.         MKENT    DllGetClassObject
  361.         push    ebp
  362.         mov    ebp,esp
  363.         push    ebx
  364.         push    esi
  365.         push    edi
  366.  
  367.         push    dword ptr [ebp+16]    ; ppvObject
  368.         push    dword ptr [ebp+12]    ; rIID
  369.         push    dword ptr [ebp+08]    ; rCLSID
  370.         call    _DllGetClassObject
  371.         test    eax,eax
  372.         jnz    gco_ret            ; error
  373.  
  374.         mov    ebx,[ebp+16]        ; ppvObject
  375.         test    ebx,ebx
  376.         jz    gco_ret
  377.         mov    ebx,[ebx]        ; pvObject
  378.         test    ebx,ebx
  379.         jz    gco_ret
  380.         mov    ebx,[ebx]        ; vtable
  381.         test    ebx,ebx
  382.         jz    gco_ret
  383.  
  384.         cld
  385.         mov    esi,[ebp+12]        ; rIID
  386.         mov    edi,OFFSET IID_IClassFactory
  387.         mov    ecx,LENGTH_GUID4
  388.         repe    cmpsd
  389.         jne    gco_test_dd
  390.         call    MayPatchClassF
  391.         jmp    gco_ret
  392.  
  393. gco_test_dd:
  394.         mov    esi,[ebp+08]        ; rCLSID
  395.         mov    edi,OFFSET CLSID_DirectDraw
  396.         mov    ecx,LENGTH_GUID4
  397.         repe    cmpsd
  398.         jne    gco_ret
  399.         mov    esi,[ebp+12]        ; rIID
  400.         mov    edi,OFFSET IID_IDirectDraw
  401.         mov    ecx,LENGTH_GUID4
  402.         repe    cmpsd
  403.         je    gco_dd_patch
  404.         mov    esi,[ebp+12]        ; rIID
  405.         mov    edi,OFFSET IID_IDirectDraw2
  406.         mov    ecx,LENGTH_GUID4
  407.         repe    cmpsd
  408.         je    gco_dd_patch
  409.         mov    esi,[ebp+12]        ; rIID
  410.         mov    edi,OFFSET IID_IDirectDraw4
  411.         mov    ecx,LENGTH_GUID4
  412.         repe    cmpsd
  413.         jne    gco_ret
  414. gco_dd_patch:
  415.         call    MayPatchDDraw
  416. gco_ret:
  417.         pop    edi
  418.         pop    esi
  419.         pop    ebx
  420.         pop    ebp
  421.         ret    3*4
  422.  
  423. ; *** IClassFactory::CreateInstance ***
  424. CLSF_CI:
  425.         push    ebp
  426.         mov    ebp,esp
  427.         push    ebx
  428.         push    esi
  429.         push    edi
  430.  
  431.         push    dword ptr [ebp+20]    ; ppvObject
  432.         push    dword ptr [ebp+16]    ; rIID
  433.         push    dword ptr [ebp+12]    ; pUnkOuter
  434.         push    dword ptr [ebp+08]    ; this
  435.         call    ICLSF_CI
  436.         test    eax,80000000h
  437.         jnz    cf_ci_ret        ; error
  438.  
  439.         mov    ebx,[ebp+20]        ; ppvObject
  440.         test    ebx,ebx
  441.         jz    cf_ci_ret
  442.         mov    ebx,[ebx]        ; pvObject
  443.         test    ebx,ebx
  444.         jz    cf_ci_ret
  445.         mov    ebx,[ebx]        ; vtable
  446.         test    ebx,ebx
  447.         jz    cf_ci_ret
  448.  
  449.         cld
  450.         mov    esi,[ebp+16]        ; rIID
  451.         mov    edi,OFFSET IID_IDirectDraw
  452.         mov    ecx,LENGTH_GUID4
  453.         repe    cmpsd
  454.         je    cf_ci_dd_patch
  455.         mov    esi,[ebp+16]        ; rIID
  456.         mov    edi,OFFSET IID_IDirectDraw2
  457.         mov    ecx,LENGTH_GUID4
  458.         repe    cmpsd
  459.         je    cf_ci_dd_patch
  460.         mov    esi,[ebp+16]        ; rIID
  461.         mov    edi,OFFSET IID_IDirectDraw4
  462.         mov    ecx,LENGTH_GUID4
  463.         repe    cmpsd
  464.         jne    cf_ci_nodd
  465. cf_ci_dd_patch:
  466.         call    MayPatchDDraw
  467.         jmp    cf_ci_ret
  468. cf_ci_nodd:
  469.         mov    esi,[ebp+16]        ; rIID
  470.         mov    edi,OFFSET IID_IDirect3D2
  471.         mov    ecx,LENGTH_GUID4
  472.         repe    cmpsd
  473.         je    cf_ci_d3d_patch
  474.         mov    esi,[ebp+16]        ; rIID
  475.         mov    edi,OFFSET IID_IDirect3D3
  476.         mov    ecx,LENGTH_GUID4
  477.         repe    cmpsd
  478.         jne    cf_ci_nod3d
  479.         call    MayPatchD3D3
  480. cf_ci_d3d_patch:
  481.         call    MayPatchD3D23
  482.         jmp    cf_ci_ret
  483. cf_ci_nod3d:
  484.  
  485. cf_ci_ret:
  486.         pop    edi
  487.         pop    esi
  488.         pop    ebx
  489.         pop    ebp
  490.         ret    4*4
  491.  
  492.  
  493. ; *** IDirect3D::QueryInterface ***
  494. D3D23_QI:
  495.         push    ebp
  496.         mov    ebp,esp
  497.         push    ebx
  498.         push    esi
  499.         push    edi
  500.  
  501.         push    dword ptr [ebp+16]    ; ppvObject
  502.         push    dword ptr [ebp+12]    ; rIID
  503.         push    dword ptr [ebp+08]    ; this
  504.         call    ID3D23_QI
  505.         jmp    qi_common
  506.  
  507.  
  508. ; *** IDirectDraw::QueryInterface ***
  509. DDraw_QI:
  510.         push    ebp
  511.         mov    ebp,esp
  512.         push    ebx
  513.         push    esi
  514.         push    edi
  515.  
  516.         push    dword ptr [ebp+16]    ; ppvObject
  517.         push    dword ptr [ebp+12]    ; rIID
  518.         push    dword ptr [ebp+08]    ; this
  519.         call    IDDraw_QI
  520. qi_common:
  521.         test    eax,80000000h
  522.         jnz    dd_qi_ret        ; error
  523.  
  524.         mov    ebx,[ebp+16]        ; ppvObject
  525.         test    ebx,ebx
  526.         jz    dd_qi_ret
  527.         mov    ebx,[ebx]        ; pvObject
  528.         test    ebx,ebx
  529.         jz    dd_qi_ret
  530.         mov    ebx,[ebx]        ; vtable
  531.         test    ebx,ebx
  532.         jz    dd_qi_ret
  533.  
  534.         cld
  535.         mov    esi,[ebp+12]        ; rIID
  536.         mov    edi,OFFSET IID_IDirectDraw
  537.         mov    ecx,LENGTH_GUID4
  538.         repe    cmpsd
  539.         je    dd_qi_dd_patch
  540.         mov    esi,[ebp+12]        ; rIID
  541.         mov    edi,OFFSET IID_IDirectDraw2
  542.         mov    ecx,LENGTH_GUID4
  543.         repe    cmpsd
  544.         je    dd_qi_dd_patch
  545.         mov    esi,[ebp+12]        ; rIID
  546.         mov    edi,OFFSET IID_IDirectDraw4
  547.         mov    ecx,LENGTH_GUID4
  548.         repe    cmpsd
  549.         jne    dd_qi_nodd
  550. dd_qi_dd_patch:
  551.         call    MayPatchDDraw
  552.         jmp    dd_qi_ret
  553. dd_qi_nodd:
  554.         mov    esi,[ebp+12]        ; rIID
  555.         mov    edi,OFFSET IID_IDirect3D2
  556.         mov    ecx,LENGTH_GUID4
  557.         repe    cmpsd
  558.         je    dd_qi_d3d_patch
  559.         mov    esi,[ebp+12]        ; rIID
  560.         mov    edi,OFFSET IID_IDirect3D3
  561.         mov    ecx,LENGTH_GUID4
  562.         repe    cmpsd
  563.         jne    dd_qi_nod3d
  564.         call    MayPatchD3D3
  565. dd_qi_d3d_patch:
  566.         call    MayPatchD3D23
  567.         jmp    dd_qi_ret
  568. dd_qi_nod3d:
  569.  
  570. dd_qi_ret:
  571.         pop    edi
  572.         pop    esi
  573.         pop    ebx
  574.         pop    ebp
  575.         ret    3*4
  576.  
  577.  
  578. ; *** IDirectDraw::GetCaps ***
  579. DDraw_GC:
  580.         push    ebp
  581.         mov    ebp,esp
  582.         push    ebx
  583.  
  584.         push    dword ptr [ebp+16]    ; lpDDHELCaps
  585.         push    dword ptr [ebp+12]    ; lpDDDriverCaps
  586.         push    dword ptr [ebp+08]    ; this
  587.         call    IDDraw_GC
  588.         test    eax,80000000h
  589.         jnz    dd_gc_ret        ; error
  590.  
  591.         mov    ebx,[ebp+12]        ; lpDDDriverCaps
  592.         test    ebx,ebx
  593.         jz    dd_gc_ret
  594.         or    dword ptr [ebx+4],DDCAPS_3D
  595. dd_gc_ret:
  596.         pop    ebx
  597.         pop    ebp
  598.         ret    3*4
  599.  
  600.  
  601. ; *** IDirect3D23::CreateDevice ***
  602. D3D23_CD:
  603.         push    ebp
  604.         mov    ebp,esp
  605.         push    ebx
  606.         push    esi
  607.         push    edi
  608.  
  609.         cld
  610.         mov    esi,[ebp+12]        ; rCLSID
  611.         test    esi,esi
  612.         jz    d3d23_cd_go
  613.         mov    edi,OFFSET IID_IDirect3DHALDevice
  614.         mov    ecx,LENGTH_GUID4
  615.         repe    cmpsd
  616.         jne    d3d23_cd_go
  617.         mov    ecx,pTrueDevice
  618.         jecxz    d3d23_cd_go
  619.         mov    dword ptr [ebp+12],ecx
  620. d3d23_cd_go:
  621.         pop    edi
  622.         pop    esi
  623.         pop    ebx
  624.         pop    ebp
  625.         jmp    ID3D23_CD
  626.  
  627.  
  628. ; *** IDirect3D23::EnumDevices ***
  629. D3D23_ED:
  630.         push    ebp
  631.         mov    ebp,esp
  632.         push    ebx
  633.  
  634.         mov    ebx,[ebp+12]        ; lpEnumDevicesCallback
  635.         test    ebx,ebx
  636.         jz    d3d23_ed_go
  637.  
  638. ; Check the length field of D3D_HEL_DevDesc to see if it was filled
  639.         test    dword ptr D3D_HEL_DevDesc,0ffffffffh
  640.         jnz    d3d23_ed_filled
  641. ; Call the original EnumDevices to fill D3D_HEL_DevDesc
  642.         push    ebx            ; just to be sure ..
  643.         push    0
  644.         push    OFFSET D3DEnumDevCB
  645.         push    dword ptr [ebp+08]    ; this
  646.         call    ID3D23_ED
  647.         pop    ebx
  648.         test    eax,80000000h
  649.         jnz    d3d23_ed_go        ; error
  650.         test    dword ptr D3D_HEL_DevDesc,0ffffffffh
  651.         jz    d3d23_ed_go        ; no match ???
  652. d3d23_ed_filled:
  653.         push    dword ptr [ebp+16]    ; lpUserArg
  654.         push    OFFSET D3D_HEL_DevDesc
  655.         push    OFFSET D3D_HEL_DevDesc
  656.         push    OFFSET HAL_Dev_Name
  657.         push    OFFSET HAL_Dev_Desc
  658.         push    OFFSET IID_IDirect3DHALDevice
  659.         call    ebx
  660.         test    eax,eax
  661.         jnz    d3d23_ed_go        ; continue
  662.         pop    ebx
  663.         pop    ebp
  664.         ret    3*4
  665.  
  666. d3d23_ed_go:
  667.         pop    ebx
  668.         pop    ebp
  669.         jmp    ID3D23_ED
  670.  
  671.  
  672. ; *** IDirect3D23::FindDevice ***
  673. D3D23_FD:
  674.         push    ebp
  675.         mov    ebp,esp
  676.         push    ebx
  677.         push    esi
  678.         push    edi
  679.  
  680.         mov    ebx,[ebp+12]        ; lpD3DFDS
  681.         test    ebx,ebx
  682.         jz    d3d23_fd_nuls
  683.         and    dword ptr [ebx+4],NOT D3DFDS_HARDWARE
  684.         test    dword ptr [ebx+4],D3DFDS_GUID
  685.         jz    d3d23_fd_nuls
  686.         cld
  687.         lea    esi,[ebx+16]        ; guid
  688.         mov    edi,OFFSET IID_IDirect3DHALDevice
  689.         mov    ecx,LENGTH_GUID4
  690.         repe    cmpsd
  691.         jne    d3d23_fd_nuls
  692.     IF    FIND_GUID_REPL
  693.         mov    esi,pTrueDevice
  694.         test    esi,esi
  695.         jz    d3d23_fd_nuls
  696.         lea    edi,[ebx+16]        ; guid
  697.         mov    ecx,LENGTH_GUID4
  698.         rep    movsd
  699.     ELSE
  700.         and    dword ptr [ebx+4],NOT D3DFDS_GUID
  701.     ENDIF
  702. d3d23_fd_nuls:
  703.         push    dword ptr [ebp+16]    ; lpD3DFDR
  704.         push    dword ptr [ebp+12]    ; lpD3DFDS
  705.         push    dword ptr [ebp+08]    ; this
  706.         call    ID3D23_FD
  707.         test    eax,80000000h
  708.         jnz    d3d23_fd_ret        ; error
  709.  
  710.         mov    ebx,[ebp+16]        ; lpD3DFDR
  711.         test    ebx,ebx
  712.         jz    d3d23_fd_ret
  713. ;;
  714.  
  715. d3d23_fd_ret:
  716.         pop    edi
  717.         pop    esi
  718.         pop    ebx
  719.         pop    ebp
  720.         ret    3*4
  721.  
  722.  
  723. ; *** IDirect3D3::EnumZBufferFormats ***
  724. D3D3_EZ:
  725.         push    ebp
  726.         mov    ebp,esp
  727.         push    ebx
  728.         push    esi
  729.         push    edi
  730.  
  731.         cld
  732.         mov    esi,[ebp+12]        ; riidDevice
  733.         test    esi,esi
  734.         jz    d3d3_ez_go
  735.         mov    edi,OFFSET IID_IDirect3DHALDevice
  736.         mov    ecx,LENGTH_GUID4
  737.         repe    cmpsd
  738.         jne    d3d3_ez_go
  739.         mov    ecx,pTrueDevice
  740.         jecxz    d3d3_ez_go
  741.         mov    dword ptr [ebp+12],ecx
  742. d3d3_ez_go:
  743.         pop    edi
  744.         pop    esi
  745.         pop    ebx
  746.         pop    ebp
  747.         jmp    ID3D3_EZ
  748.  
  749.  
  750. ; *** IDirect3DDevice23::GetCaps ***
  751. D3DD23_GC:
  752.         push    ebp
  753.         mov    ebp,esp
  754.         push    ebx
  755.  
  756.         push    dword ptr [ebp+16]    ; lpD3DHELDevDesc
  757.         push    dword ptr [ebp+12]    ; lpD3DHWDevDesc
  758.         push    dword ptr [ebp+08]    ; this
  759.         call    ID3DD23_GC
  760.         test    eax,80000000h
  761.         jnz    d3dd23_gc_ret        ; error
  762.  
  763. d3dd23_gc_ret:
  764.         pop    ebx
  765.         pop    ebp
  766.         ret    3*4
  767.  
  768.  
  769. ; To do :
  770. ; IDirect3DDevice::Initialize
  771. ; IDirect3DDevice::CreateExecuteBuffer
  772. ; IDirect3DExecuteBuffer::Lock
  773.  
  774. .text        ends
  775.  
  776.         end
  777.