Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Display Mirror Driver:: Screen Updates in BYTEs

35 views
Skip to first unread message

manme...@gmail.com

unread,
Jun 24, 2008, 6:16:02 AM6/24/08
to
Hello,

I am developing a display mirror driver for a VNC type
application .The following is a description of the work so far I did
and some of the issues faced. Please let me know where i have gone
wrong.

I dont have device driver experience, so I depend on the DDK sample
and the group archive.

First of my objective was to get the screen updates in BYTEs from the
Mirror driver. I hope this is possible from mirror driver,, isnt it ?.
and in the next stage i will try to transfer this data to a user mode
componet to send to the viewing client.

Taking DrvCopyBits as an example, my concept was the sourc surface
(SURFOBJ*) in this API will have the sreeen data in BYTEs and the
CLIPOBJ will have the RECT where updates done. This yield me a buffer
"psoSrc->pvBits". But I found this buffer is not at all changing.

On reading the archives, I got a feeling that, punting back to GDI may
change the buffer, so that I could get the exact data that I am
looking for.

For punting, I did the following..(for clarity, i have removed return
type checking and some initializations in the below code)

HSURF DrvEnableSurface(DHPDEV dhpdev)
{
PPDEV ppdev;
HSURF hsurf = NULL, hsurf1 = NULL;
SIZEL sizl;
ULONG ulBitmapType;
FLONG flHooks;
ULONG mirrorsize;
MIRRSURF *mirrsurf;
DHSURF dhsurf;
PPDEV ppdev = (PPDEV) dhpdev;

// Create engine bitmap around frame buffer.
SURFOBJ* surf1; SURFOBJ* surf2;

ppdev->ulBitCount = 32;
ulBitmapType = BMF_32BPP;
flHooks = HOOKS_BMF32BPP;

mirrorsize = (ULONG)(sizeof(MIRRSURF) + ppdev->lDeltaScreen *
sizl.cy);

mirrsurf = (MIRRSURF *) EngAllocMem(FL_ZERO_MEMORY,mirrorsize,
0x4D495252);

//let GDI create an eng managed surface, and GDI
allocates the space
hsurf1 = (HSURF)EngCreateBitmap(sizl, ppdev->lDeltaScreen,
ulBitmapType, BMF_NOZEROINIT,NULL);

dhsurf = (DHSURF) mirrsurf;

//ask GDI create a device managed surface
hsurf = (HSURF)EngCreateDeviceBitmap(dhsurf, sizl, ulBitmapType);

surf1 = EngLockSurface(hsurf);
surf2 = EngLockSurface(hsurf1);

surf1->dhsurf = (DHSURF)surf2;

EngAssociateSurface(hsurf, ppdev->hdevEng, flHooks);

ppdev->hsurfEng = (HSURF) hsurf;
ppdev->pvTmpBuffer = (PVOID) dhsurf;

mirrsurf->cx = ppdev->cxScreen;
mirrsurf->cy = ppdev->cyScreen;
mirrsurf->lDelta = ppdev->lDeltaScreen;
mirrsurf->ulBitCount = ppdev->ulBitCount;
mirrsurf->bIsScreen = TRUE;
return(hsurf);
}

and i punt it like

BOOL DrvCopyBits(OUT SURFOBJ *psoDst,IN SURFOBJ *psoSrc,
IN CLIPOBJ *pco,IN XLATEOBJ *pxlo,IN RECTL *prclDst,
IN POINTL *pptlSrc)
{

SURFOBJ *surfObj ;
BOOL retVal = FALSE;

if (psoSrc && pco)
{
DISPDBG((0, "psoSrc->cjBits %d", psoSrc->cjBits));
if(psoSrc->pvBits != NULL)
{
DISPDBG((0, "psoSrc->pvBits is Valid"));
dbg_pkt((PBYTE) psoSrc->pvBits, 50);
}
}

if (psoDst)
{
if (psoDst->dhsurf)
{
surfObj = (SURFOBJ *)psoDst->dhsurf;
retVal = EngCopyBits(surfObj,psoSrc,pco,pxlo,prclDst,pptlSrc);
if(retVal)
{
// debug message
}
}
}
return FALSE;
}
I punt back only the "DrvCopyBits". Anyway, this code run without blue
screen as EngCopyBits return TRUE. Now I could see the "psoSrc-
>pvBits" is changing, but after some time, it starts showing the same
buffer of length 0xFFFF.

Please advice me, where I have gone wrong and what else I need to do
for getting the screen data from Mirror driver continuously. ?. Any
sort of info will be helpfull as I an new to windows driver
development.

Regards
Manmeeth Kaur

Tim Roberts

unread,
Jun 26, 2008, 1:11:43 AM6/26/08
to
manme...@gmail.com wrote:
>
>First of my objective was to get the screen updates in BYTEs from the
>Mirror driver. I hope this is possible from mirror driver,, isnt it ?.
>and in the next stage i will try to transfer this data to a user mode
>componet to send to the viewing client.
>
>Taking DrvCopyBits as an example, my concept was the sourc surface
>(SURFOBJ*) in this API will have the sreeen data in BYTEs and the
>CLIPOBJ will have the RECT where updates done. This yield me a buffer
>"psoSrc->pvBits". But I found this buffer is not at all changing.

Remember that a mirror driver is entirely separate from the main display
driver. You don't have access to the main frame buffer. The principle is
that every drawing request that goes to the main display driver ALSO goes
to your mirror driver. If you want a copy of the screen image, then your
mirror driver must MAKE the changes, just like it was the main driver.

Then, after you make the changes, you can send the changed bytes back.

Also, the CLIPOBJ is just the outer limits on what can be drawn. Usually,
the CLIPOBJ is the same as the window that is being drawn. The actual
drawing rectangle is different for each operation. For DrvCopyBits, the
changed rectangle will be the intersection of prclDst with the CLIPOBJ.

>On reading the archives, I got a feeling that, punting back to GDI may
>change the buffer, so that I could get the exact data that I am
>looking for.

Of course. To get the result of the CopyBits, you'll have to DO the
CopyBits first.
--
Tim Roberts, ti...@probo.com
Providenza & Boekelheide, Inc.

0 new messages