⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 enable.c

📁 Using mirror driver as filter driver in capture desktop screen operation allow system run faster tha
💻 C
📖 第 1 页 / 共 3 页
字号:
POINTL*    pptlBrushOrg,
MIX        mixFill,
FLONG      flOptions)
{
#if SHARE_MEM
	DISPDBG((1,"Mirror Driver DrvStrokeAndFillPath: SHARE_MEM\n"));
	return EngStrokeAndFillPath(pso,ppo,pco,pxo,pboStroke,plineattrs,pboFill,pptlBrushOrg,mixFill,flOptions);
#else
    DISPDBG((1,"Mirror Driver DrvStrokeAndFillPath: \n"));
    return TRUE;
#endif
}

BOOL DrvTransparentBlt(
SURFOBJ*    psoDst,
SURFOBJ*    psoSrc,
CLIPOBJ*    pco,
XLATEOBJ*   pxlo,
RECTL*      prclDst,
RECTL*      prclSrc,
ULONG       iTransColor,
ULONG       ulReserved)
{
#if SHARE_MEM
	DISPDBG((1,"Mirror Driver DrvTransparentBlt: SHARE_MEM\n"));
	return EngTransparentBlt(psoDst, psoSrc, pco, pxlo, prclDst, prclSrc, iTransColor, ulReserved);
#else
    DISPDBG((1,"Mirror Driver DrvTransparentBlt: \n"));
    return TRUE;
#endif	
}


BOOL DrvAlphaBlend(
SURFOBJ*            psoDst,
SURFOBJ*            psoSrc,
CLIPOBJ*            pco,
XLATEOBJ*           pxlo,
RECTL*              prclDst,
RECTL*              prclSrc,
BLENDOBJ*           pBlendObj)
{
#if SHARE_MEM
	DISPDBG((1,"Mirror Driver DrvAlphaBlend: SHARE_MEM\n"));
	return EngAlphaBlend(psoDst, psoSrc, pco, pxlo, prclDst, prclSrc, pBlendObj);
#else
    DISPDBG((1,"Mirror Driver DrvAlphaBlend: \n"));
    return TRUE;
#endif
}

BOOL DrvGradientFill(
SURFOBJ*            pso,
CLIPOBJ*            pco,
XLATEOBJ*           pxlo,
TRIVERTEX*          pVertex,
ULONG               nVertex,
PVOID               pMesh,
ULONG               nMesh,
RECTL*              prclExtents,
POINTL*             pptlDitherOrg,
ULONG               ulMode)
{
#if SHARE_MEM
	DISPDBG((1,"Mirror Driver DrvGradientFill: SHARE_MEM\n"));
	return EngGradientFill(pso, pco, pxlo, pVertex, nVertex, pMesh, nMesh, prclExtents, pptlDitherOrg, ulMode);
#else
    DISPDBG((1,"Mirror Driver DrvGradientFill: \n"));
    return TRUE;
#endif
}

BOOL DrvStretchBlt(
SURFOBJ*            psoDst,
SURFOBJ*            psoSrc,
SURFOBJ*            psoMsk,
CLIPOBJ*            pco,
XLATEOBJ*           pxlo,
COLORADJUSTMENT*    pca,
POINTL*             pptlHTOrg,
RECTL*              prclDst,
RECTL*              prclSrc,
POINTL*             pptlMsk,
ULONG               iMode)
{
#if SHARE_MEM
	DISPDBG((1,"Mirror Driver DrvStretchBlt: SHARE_MEM\n"));
	return EngStretchBlt(psoDst, psoSrc, psoMsk, pco, pxlo, pca, pptlHTOrg, prclDst, prclSrc, pptlMsk, iMode);
#else
    DISPDBG((1,"Mirror Driver DrvStretchBlt: \n"));
    return TRUE;
#endif
}

BOOL DrvStretchBltROP(
SURFOBJ         *psoTrg,
SURFOBJ         *psoSrc,
SURFOBJ         *psoMask,
CLIPOBJ         *pco,
XLATEOBJ        *pxlo,
COLORADJUSTMENT *pca,
POINTL          *pptlBrushOrg,
RECTL           *prclTrg,
RECTL           *prclSrc,
POINTL          *pptlMask,
ULONG            iMode,
BRUSHOBJ        *pbo,
ROP4            rop4)
{
#if SHARE_MEM
	DISPDBG((1,"Mirror Driver DrvStretchBltROP: SHARE_MEM\n"));
	return EngStretchBltROP(psoTrg,psoSrc,psoMask,pco,pxlo,pca,pptlBrushOrg,prclTrg,prclSrc,pptlMask,iMode,pbo,rop4);
#else
    DISPDBG((1,"Mirror Driver DrvStretchBltROP: \n"));
    return TRUE; 
#endif
}

BOOL DrvPlgBlt(
SURFOBJ         *psoTrg,
SURFOBJ         *psoSrc,
SURFOBJ         *psoMsk,
CLIPOBJ         *pco,
XLATEOBJ        *pxlo,
COLORADJUSTMENT *pca,
POINTL          *pptlBrushOrg,
POINTFIX        *pptfx,
RECTL           *prcl,
POINTL          *pptl,
ULONG            iMode)
{
#if SHARE_MEM
	DISPDBG((1,"Mirror Driver DrvPlgBlt: SHARE_MEM\n"));
	return EngPlgBlt(psoTrg,psoSrc,psoMsk,pco,pxlo,pca,pptlBrushOrg,pptfx,prcl,pptl,iMode);
#else
    DISPDBG((1,"Mirror Driver DrvPlgBlt: \n"));
    return TRUE;
#endif
}

HBITMAP DrvCreateDeviceBitmap(
   IN DHPDEV dhpdev,
   IN SIZEL sizl,
   IN ULONG iFormat
   )
{
#if SHARE_MEM
	DISPDBG((1,"Mirror Driver DrvCreateDeviceBitmap: \n"));
	return NULL;
#else
   HBITMAP hbm;
   MIRRSURF *mirrsurf;
   ULONG mirrorsize;
   DHSURF dhsurf;
   ULONG stride;
   HSURF hsurf;

   PPDEV ppdev = (PPDEV) dhpdev;
   
   DISPDBG((1,"CreateDeviceBitmap:\n"));
   
   if (iFormat == BMF_1BPP || iFormat == BMF_4BPP)
   {
      return NULL;
   }

   // DWORD align each stride
   stride = (sizl.cx*(iFormat/8)+3);
   stride -= stride % 4;
   
   mirrorsize = (int)(sizeof(MIRRSURF) + stride * sizl.cy);

   mirrsurf = (MIRRSURF *) EngAllocMem(FL_ZERO_MEMORY,
                                       mirrorsize,
                                       0x4D495252);
   if (!mirrsurf) {
        RIP("DISP DrvCreateDeviceBitmap failed EngAllocMem\n");
        return(FALSE);
   }
                                       
   dhsurf = (DHSURF) mirrsurf;

   hsurf = (HSURF) EngCreateDeviceBitmap(dhsurf,
                                 sizl,
                                 iFormat);

   if (hsurf == (HSURF) 0)
   {
       RIP("DISP DrvCreateDeviceBitmap failed EngCreateBitmap\n");
       return(FALSE);
   }

   if (!EngAssociateSurface(hsurf, 
                            ppdev->hdevEng, 
                            flGlobalHooks))
   {
       RIP("DISP DrvCreateDeviceBitmap failed EngAssociateSurface\n");
       EngDeleteSurface(hsurf);
       return(FALSE);
   }
  
   mirrsurf->cx = sizl.cx;
   mirrsurf->cy = sizl.cy;
   mirrsurf->lDelta = stride;
   mirrsurf->ulBitCount = iFormat;
   mirrsurf->bIsScreen = FALSE;
  
   return((HBITMAP)hsurf);
  #endif
   
}

VOID DrvDeleteDeviceBitmap(
   IN DHSURF dhsurf
   )
{
#if SHARE_MEM
	DISPDBG((1, "DeleteDeviceBitmap: SHARE_MEM\n"));
#else
   MIRRSURF *mirrsurf;
   
   DISPDBG((1, "DeleteDeviceBitmap:\n"));

   mirrsurf = (MIRRSURF *) dhsurf;

   EngFreeMem((PVOID) mirrsurf);
#endif
}

#if (NTDDI_VERSION >= NTDDI_VISTA)
LONG
DrvRenderHint(DHPDEV dhpdev,
              ULONG  NotifyCode,
              SIZE_T Length,
              PVOID  Data)
{
    PPDEV ppdev = (PPDEV) dhpdev;
    PDRH_APIBITMAPDATA pData = (PDRH_APIBITMAPDATA)Data;

    if (NotifyCode == DRH_APIBITMAP)
    {
        DISPDBG((1, "DrvRenderHint(API Render: %08x, %lx)\n", pData->pso, pData->b));
    }

    return TRUE;
}
#endif

/******************************Public*Routine******************************\
* DrvAssertMode
*
* Enable/Disable the given device.
*
\**************************************************************************/

DrvAssertMode(DHPDEV  dhpdev,
              BOOL    bEnable)
{
    PPDEV ppdev = (PPDEV) dhpdev;

    DISPDBG((0, "DrvAssertMode(%lx, %lx)\n", dhpdev, bEnable));

    return TRUE;

}// DrvAssertMode()

/******************************Public*Routine******************************\
* DrvEscape
*
* We only handle WNDOBJ_SETUP escape. 
*
\**************************************************************************/

typedef struct _WndObjENUMRECTS
{
  ULONG c;
  RECTL arcl[100];
} WNDOBJENUMRECTS;

VOID
vDumpWndObjRgn(WNDOBJ *pwo)
{
    ULONG ulRet;

    ulRet = WNDOBJ_cEnumStart(pwo, CT_RECTANGLES, CD_RIGHTDOWN, 100);

    if (ulRet != 0xFFFFFFFF)
    {
        BOOL bMore;
        ULONG i;
        WNDOBJENUMRECTS enumRects;

        do
        {
          bMore = WNDOBJ_bEnum(pwo, sizeof(enumRects), &enumRects.c);

          for (i = 0; i < enumRects.c; i++)
          {
              DISPDBG((0,"\nWNDOBJ_rect:[%d,%d][%d,%d]",
                          enumRects.arcl[i].left,
                          enumRects.arcl[i].top,
                          enumRects.arcl[i].right,
                          enumRects.arcl[i].bottom));

          }
        } while (bMore);
    }
}

VOID
WndObjCallback(WNDOBJ *pwo,
               FLONG fl)
{
    if (fl & (WOC_RGN_CLIENT_DELTA |
              WOC_RGN_CLIENT |
              WOC_RGN_SURFACE_DELTA |
              WOC_RGN_SURFACE |
              WOC_CHANGED |
              WOC_DELETE |
              WOC_DRAWN |
              WOC_SPRITE_OVERLAP |
              WOC_SPRITE_NO_OVERLAP
#if (NTDDI_VERSION >= NTDDI_VISTA)
              | WOC_RGN_SPRITE
#endif 
              ))
    {
        DISPDBG((0,"WndObjCallback: "));

        if (fl & WOC_RGN_CLIENT_DELTA) 
            DISPDBG((0,"WOC_RGN_CLIENT_DELTA "));
        if (fl & WOC_RGN_CLIENT) 
            DISPDBG((0,"WOC_RGN_CLIENT "));
        if (fl & WOC_RGN_SURFACE_DELTA) 
            DISPDBG((1,"WOC_RGN_SURFACE_DELTA "));
        if (fl & WOC_RGN_SURFACE) 
            DISPDBG((1,"WOC_RGN_SURFACE "));
        if (fl & WOC_CHANGED) 
            DISPDBG((1,"WOC_CHANGED "));
        if (fl & WOC_DELETE) 
            DISPDBG((0,"WOC_DELETE "));
        if (fl & WOC_DRAWN) 
            DISPDBG((1,"WOC_DRAWN "));
        if (fl & WOC_SPRITE_OVERLAP) 
            DISPDBG((0,"WOC_SPRITE_OVERLAP "));
        if (fl & WOC_SPRITE_NO_OVERLAP)
            DISPDBG((0,"WOC_SPRITE_NO_OVERLAP "));
#if (NTDDI_VERSION >= NTDDI_VISTA)
        if (fl & WOC_RGN_SPRITE)
        {
            DISPDBG((0,"WOC_RGN_SPRITE "));
            vDumpWndObjRgn(pwo);
        }
#endif
        DISPDBG((0,"\n"));
    }
}

ULONG
DrvEscape(SURFOBJ *pso,
          ULONG iEsc,
          ULONG cjIn,
          PVOID pvIn,
          ULONG cjOut,
          PVOID pvOut)
{
#ifndef SHARE_MEM
	DISPDBG((0,"DrvEscape\n"));
	return 0;
#else
    ULONG ulRet = 0;

    if (pso->dhsurf)
    {

        if (iEsc == WNDOBJ_SETUP)
        {
            WNDOBJ *pwo = NULL;

            DISPDBG((0,"Attempt to create WndObj\n"));

            pwo = EngCreateWnd(pso,
                               *(HWND*)pvIn,
                               WndObjCallback,
                               WO_DRAW_NOTIFY |
                               WO_RGN_CLIENT |
                               WO_RGN_CLIENT_DELTA |
                               WO_RGN_WINDOW |
                               WO_SPRITE_NOTIFY
#if (NTDDI_VERSION >= NTDDI_VISTA)
                               | WO_RGN_SPRITE
#endif
                               ,
                               0);
            if (pwo != NULL)
            {
                DISPDBG((0,"WndObj creat success\n"));
                ulRet = 1;
            }
        }
    }

    return ulRet;
#endif
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -