#define _CRT_SECURE_NO_WARNINGS #define INITGUID #include #include #include "dxwnd.h" #include "dxhook.h" #include "ddrawi.h" #include "dxwcore.hpp" #include "stdio.h" #include "hddraw.h" #include "dxhelper.h" #include "syslibs.h" #define VIRTUAL_CAPS_VIRTUALPC TRUE #if 0 typedef struct _DDCAPS_DX7 { /* 0*/ DWORD dwSize; // size of the DDDRIVERCAPS structure /* 4*/ DWORD dwCaps; // driver specific capabilities /* 8*/ DWORD dwCaps2; // more driver specific capabilites /* c*/ DWORD dwCKeyCaps; // color key capabilities of the surface /* 10*/ DWORD dwFXCaps; // driver specific stretching and effects capabilites /* 14*/ DWORD dwFXAlphaCaps; // alpha driver specific capabilities /* 18*/ DWORD dwPalCaps; // palette capabilities /* 1c*/ DWORD dwSVCaps; // stereo vision capabilities /* 20*/ DWORD dwAlphaBltConstBitDepths; // DDBD_2,4,8 /* 24*/ DWORD dwAlphaBltPixelBitDepths; // DDBD_1,2,4,8 /* 28*/ DWORD dwAlphaBltSurfaceBitDepths; // DDBD_1,2,4,8 /* 2c*/ DWORD dwAlphaOverlayConstBitDepths; // DDBD_2,4,8 /* 30*/ DWORD dwAlphaOverlayPixelBitDepths; // DDBD_1,2,4,8 /* 34*/ DWORD dwAlphaOverlaySurfaceBitDepths; // DDBD_1,2,4,8 /* 38*/ DWORD dwZBufferBitDepths; // DDBD_8,16,24,32 /* 3c*/ DWORD dwVidMemTotal; // total amount of video memory /* 40*/ DWORD dwVidMemFree; // amount of free video memory /* 44*/ DWORD dwMaxVisibleOverlays; // maximum number of visible overlays /* 48*/ DWORD dwCurrVisibleOverlays; // current number of visible overlays /* 4c*/ DWORD dwNumFourCCCodes; // number of four cc codes /* 50*/ DWORD dwAlignBoundarySrc; // source rectangle alignment /* 54*/ DWORD dwAlignSizeSrc; // source rectangle byte size /* 58*/ DWORD dwAlignBoundaryDest; // dest rectangle alignment /* 5c*/ DWORD dwAlignSizeDest; // dest rectangle byte size /* 60*/ DWORD dwAlignStrideAlign; // stride alignment /* 64*/ DWORD dwRops[DD_ROP_SPACE]; // ROPS supported /* 84*/ DDSCAPS ddsOldCaps; // Was DDSCAPS ddsCaps. ddsCaps is of type DDSCAPS2 for DX6 /* 88*/ DWORD dwMinOverlayStretch; // minimum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 /* 8c*/ DWORD dwMaxOverlayStretch; // maximum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 /* 90*/ DWORD dwMinLiveVideoStretch; // minimum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 /* 94*/ DWORD dwMaxLiveVideoStretch; // maximum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 /* 98*/ DWORD dwMinHwCodecStretch; // minimum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 /* 9c*/ DWORD dwMaxHwCodecStretch; // maximum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3 /* a0*/ DWORD dwReserved1; // reserved /* a4*/ DWORD dwReserved2; // reserved /* a8*/ DWORD dwReserved3; // reserved /* ac*/ DWORD dwSVBCaps; // driver specific capabilities for System->Vmem blts /* b0*/ DWORD dwSVBCKeyCaps; // driver color key capabilities for System->Vmem blts /* b4*/ DWORD dwSVBFXCaps; // driver FX capabilities for System->Vmem blts /* b8*/ DWORD dwSVBRops[DD_ROP_SPACE];// ROPS supported for System->Vmem blts /* d8*/ DWORD dwVSBCaps; // driver specific capabilities for Vmem->System blts /* dc*/ DWORD dwVSBCKeyCaps; // driver color key capabilities for Vmem->System blts /* e0*/ DWORD dwVSBFXCaps; // driver FX capabilities for Vmem->System blts /* e4*/ DWORD dwVSBRops[DD_ROP_SPACE];// ROPS supported for Vmem->System blts /*104*/ DWORD dwSSBCaps; // driver specific capabilities for System->System blts /*108*/ DWORD dwSSBCKeyCaps; // driver color key capabilities for System->System blts /*10c*/ DWORD dwSSBFXCaps; // driver FX capabilities for System->System blts /*110*/ DWORD dwSSBRops[DD_ROP_SPACE];// ROPS supported for System->System blts /*130*/ DWORD dwMaxVideoPorts; // maximum number of usable video ports /*134*/ DWORD dwCurrVideoPorts; // current number of video ports used /*138*/ DWORD dwSVBCaps2; // more driver specific capabilities for System->Vmem blts /*13c*/ DWORD dwNLVBCaps; // driver specific capabilities for non-local->local vidmem blts /*140*/ DWORD dwNLVBCaps2; // more driver specific capabilities non-local->local vidmem blts /*144*/ DWORD dwNLVBCKeyCaps; // driver color key capabilities for non-local->local vidmem blts /*148*/ DWORD dwNLVBFXCaps; // driver FX capabilities for non-local->local blts /*14c*/ DWORD dwNLVBRops[DD_ROP_SPACE]; // ROPS supported for non-local->local blts // Members added for DX6 release /*16c*/ DDSCAPS2 ddsCaps; // Surface Caps } DDCAPS_DX7; typedef DDCAPS_DX7 FAR* LPDDCAPS_DX7; #endif void SetMinimalCaps(int dxversion, LPDDCAPS c1, LPDDCAPS c2) { DWORD dwMaxSize; switch(dxversion){ case 1: case 2: case 3: dwMaxSize=sizeof(DDCAPS_DX3); break; case 4: case 5: dwMaxSize=sizeof(DDCAPS_DX5); break; case 6: dwMaxSize=sizeof(DDCAPS_DX6); break; case 7: dwMaxSize=sizeof(DDCAPS_DX7); break; } #ifdef VIRTUAL_CAPS_VMWARE if(c1){ int dwSize = c1->dwSize; //memset(&c1, 0, dwSize); c1->dwSize = dwSize; c1->dwCaps = (DDCAPS_3D|DDCAPS_BLT|DDCAPS_BLTQUEUE|DDCAPS_OVERLAY|DDCAPS_OVERLAYFOURCC|DDCAPS_OVERLAYSTRETCH|DDCAPS_COLORKEY|DDCAPS_BLTDEPTHFILL|DDCAPS_CANBLTSYSMEM); c1->dwCaps2 = (DDCAPS2_WIDESURFACES|DDCAPS2_CANRENDERWINDOWED|DDCAPS2_FLIPNOVSYNC); c1->dwCKeyCaps = (DDCKEYCAPS_DESTOVERLAY); c1->dwFXCaps = (DDFXCAPS_OVERLAYSHRINKX|DDFXCAPS_OVERLAYSHRINKY|DDFXCAPS_OVERLAYSTRETCHX|DDFXCAPS_OVERLAYSTRETCHY); c1->dwZBufferBitDepths = 0x600; c1->dwMaxVisibleOverlays = 0x20; for(int j=0; jdwRops[j]=0; c1->dwRops[6] = 0x100; if(dwSize >= (int)(0x16C)) { c1->ddsCaps.dwCaps = 0x42727A; c1->ddsCaps.dwCaps2 = 0x200200; } // c1->dwNumFourCCCodes - untouched (03 in VmWare) } if(c2){ int dwSize = c2->dwSize; //memset(&c2, 0, dwSize); c2->dwSize = dwSize; c2->dwCaps = (DDCAPS_3D|DDCAPS_BLT|DDCAPS_BLTSTRETCH|DDCAPS_PALETTE|DDCAPS_COLORKEY|DDCAPS_ALPHA|DDCAPS_BLTCOLORFILL|DDCAPS_BLTDEPTHFILL|DDCAPS_CANCLIP|DDCAPS_CANCLIPSTRETCHED|DDCAPS_CANBLTSYSMEM); c2->dwCaps2 = (DDCAPS2_CERTIFIED); c2->dwCKeyCaps =(DDCKEYCAPS_SRCBLT); c2->dwPalCaps = 0x347; // ??? c2->dwFXCaps = (DDFXCAPS_BLTARITHSTRETCHY|DDFXCAPS_BLTMIRRORLEFTRIGHT|DDFXCAPS_BLTMIRRORUPDOWN|DDFXCAPS_BLTSHRINKX|DDFXCAPS_BLTSHRINKXN|DDFXCAPS_BLTSHRINKY|DDFXCAPS_BLTSHRINKYN|DDFXCAPS_BLTSTRETCHX|DDFXCAPS_BLTSTRETCHXN|DDFXCAPS_BLTSTRETCHY|DDFXCAPS_BLTSTRETCHYN|DDFXCAPS_BLTALPHA|DDFXCAPS_BLTFILTER|DDFXCAPS_BLTARITHSTRETCHY); for(int j=0; jdwRops[j]=0; c2->dwRops[0] = 0x1; c2->dwRops[6] = 0x100; c2->dwRops[7] = 0x8000000; c2->ddsOldCaps.dwCaps = 0x421350; // VMWare specific? c2->dwSVBCaps = 0xF4C08241; c2->dwSVBCKeyCaps = 0x200; c2->dwSVBFXCaps = 0x3FCE3 ; for(int j=0; jdwSVBRops[j]=0; c2->dwSVBRops[0] = 0x1; c2->dwSVBRops[6] = 0x100; c2->dwSVBRops[7] = 0x8000000; c2->dwVSBCaps = 0xF4C08241; c2->dwVSBCKeyCaps = 0x200; c2->dwVSBFXCaps = 0x3FCE3; for(int j=0; jdwVSBRops[j]=0; c2->dwVSBRops[0] = 0x1; c2->dwVSBRops[6] = 0x100; c2->dwVSBRops[7] = 0x8000000; c2->dwSSBCaps = 0xF4C08241; c2->dwSSBFXCaps = 0x3FCE3; for(int j=0; jdwSSBRops[j]=0; c2->dwSSBRops[0] = 1; c2->dwSSBRops[6] = 0x100; c2->dwSSBRops[7] = 0x8000000; if(dwSize > (int)0x16C) { c2->ddsCaps.dwCaps = 0x421350; c2->ddsCaps.dwCaps2 = 0x200; } } #endif #ifdef VIRTUAL_CAPS_VIRTUALPC /* CapsDump(c1:HW)= ------- 00 -------- 04 -------- 08 -------- 0c -------- 0x0000: 7C,01,00,00,C1,68,40,90,00,10,48,00,10,00,00,00, 0x0010: 00,00,A8,02,00,00,00,00,00,00,00,00,00,00,00,00, 0x0020: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x0030: 00,00,00,00,00,00,00,00,00,06,00,00,C0,21,55,00, 0x0040: C0,21,55,00,20,00,00,00,00,00,00,00,00,00,00,00, 0x0050: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x0060: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x0070: 00,00,00,00,00,00,00,00,00,00,00,00,00,01,00,00, 0x0080: 00,00,00,00,50,02,00,00,00,00,00,00,00,00,00,00, 0x0090: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x00a0: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x00b0: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x00c0: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x00d0: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x00e0: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x00f0: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x0100: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x0110: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x0120: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x0130: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x0140: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x0150: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x0160: 00,00,00,00,00,00,00,00,00,00,00,00,7A,72,42,00, 0x0170: 00,02,20,00,00,00,00,00,00,00,00,00, CapsDump(c2:SW)= ------- 00 -------- 04 -------- 08 -------- 0c -------- 0x0000: 7C,01,00,00,41,82,C0,F4,01,00,00,00,00,02,00,00, 0x0010: E1,FC,03,00,00,00,00,00,47,03,00,00,00,00,00,00, 0x0020: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x0030: 00,00,00,00,00,00,00,00,00,04,00,00,00,00,00,00, 0x0040: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x0050: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x0060: 00,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00, 0x0070: 00,00,00,00,00,00,00,00,00,00,00,00,00,01,00,00, 0x0080: 00,00,00,08,50,13,42,00,00,00,00,00,00,00,00,00, 0x0090: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x00a0: 00,00,00,00,00,00,00,00,00,00,00,00,41,82,C0,F4, 0x00b0: 00,02,00,00,E3,FC,03,00,01,00,00,00,00,00,00,00, 0x00c0: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x00d0: 00,01,00,00,00,00,00,08,41,82,C0,F4,00,02,00,00, 0x00e0: E3,FC,03,00,01,00,00,00,00,00,00,00,00,00,00,00, 0x00f0: 00,00,00,00,00,00,00,00,00,00,00,00,00,01,00,00, 0x0100: 00,00,00,08,41,82,C0,F4,00,02,00,00,E3,FC,03,00, 0x0110: 01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x0120: 00,00,00,00,00,00,00,00,00,01,00,00,00,00,00,08, 0x0130: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x0140: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x0150: 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 0x0160: 00,00,00,00,00,00,00,00,00,00,00,00,50,13,42,00, 0x0170: 00,02,00,00,00,00,00,00,00,00,00,00, */ if(c1){ DWORD dwSize = c1->dwSize; if(dwSize > dwMaxSize) dwSize = dwMaxSize; DWORD dwVidMemTotal = c1->dwVidMemTotal; DWORD dwVidMemFree = c1->dwVidMemFree; memset((void *)c1, 0, dwSize); c1->dwSize = dwSize; c1->dwCaps = 0x904068c1; c1->dwCaps2 = 0x481000; c1->dwCKeyCaps = 0x1; c1->dwFXCaps = 0x2a80000; c1->dwZBufferBitDepths = 0x600; c1->dwVidMemTotal = dwVidMemTotal; c1->dwVidMemFree = dwVidMemFree; c1->dwMaxVisibleOverlays = 0x20; //for(int j=0; jdwRops[j]=0; c1->dwRops[6] = 0x100; c1->ddsOldCaps.dwCaps = 0x250; if(dwSize >= (int)(0x16C)) { c1->ddsCaps.dwCaps = 0x42727A; c1->ddsCaps.dwCaps2 = 0x200200; } } if(c2){ DWORD dwSize = c2->dwSize; if(dwSize > dwMaxSize) dwSize = dwMaxSize; DWORD dwVidMemTotal = c2->dwVidMemTotal; DWORD dwVidMemFree = c2->dwVidMemFree; memset((void *)c2, 0, dwSize); c2->dwSize = dwSize; c2->dwCaps = 0xf4c08241; c2->dwCaps2 = 0x1; c2->dwCKeyCaps = 0x200; c2->dwFXCaps = 0x3fce1; c2->dwPalCaps = 0x347; c2->dwVidMemTotal = dwVidMemTotal; c2->dwVidMemFree = dwVidMemFree; if(dwSize > (int)0xac){ //for(int j=0; jdwRops[j]=0; c2->dwRops[0] = 0x1; c1->dwRops[6] = 0x100; c2->dwRops[7] = 0x8000000; c2->ddsOldCaps.dwCaps = 0x421350; c2->dwSVBCaps = 0xF4C08241; c2->dwSVBCKeyCaps = 0x200; c2->dwSVBFXCaps = 0x3FCE3; //for(int j=0; jdwSVBRops[j]=0; c2->dwSVBRops[0] = 0x1; c2->dwSVBRops[6] = 0x100; c2->dwSVBRops[7] = 0x8000000; c2->dwVSBCaps = 0xF4C08241; c2->dwVSBCKeyCaps = 0x200; c2->dwVSBFXCaps = 0x3FCE3; //for(int j=0; jdwVSBRops[j]=0; c2->dwVSBRops[0] = 0x1; c2->dwVSBRops[6] = 0x100; c2->dwVSBRops[7] = 0x8000000; c2->dwSSBCaps = 0xF4C08241; c2->dwSSBCKeyCaps = 0x200; c2->dwSSBFXCaps = 0x3FCE3; } if(dwSize > (int)0x13c) { //for(int j=0; jdwSSBRops[j]=0; c2->dwSSBRops[0] = 1; c2->dwSSBRops[6] = 0x100; c2->dwSSBRops[7] = 0x8000000; } if(dwSize > (int)0x16C) { c2->ddsCaps.dwCaps = 0x421350; c2->ddsCaps.dwCaps2 = 0x200; } } #endif }