驱动开发之六 --- 一个简单的显示驱动之五 【译文】

时间:2022-12-26 16:16:13

驱动开发之六 --- 一个简单的显示驱动之五 【译文】

DrvCompletePDEV

DrvCompletePDEV的调用,是用在DrvEnablePDEV调用之后,用来通知显示驱动,设备对象现在已经完成。仅有的参数是一个私有的在DrvEnablePDEV调用中创建的数据结构和一个指向GDI设备的完成句柄。除非你有更多的初始化要做,否则通常的做法是保存这个gdi句柄,然后继续。下面的代码来自于例子驱动。

/*********************************************************************

* GdiExample_DrvCompletePDEV

*

*   This is called to complete the process of enabling the device.

*  

*

*********************************************************************/

void GdiExample_DrvCompletePDEV(DHPDEV dhpdev, HDEV hdev)

{

    PDEVICE_DATA pDeviceData = (PDEVICE_DATA)dhpdev;

    ENGDEBUGPRINT(0, "GdiExample_DrvCompletePDEV Enter \r\n", NULL);

    pDeviceData->hdev = hdev;

    ENGDEBUGPRINT(0, "GdiExample_DrvCompletePDEV Exit \r\n", NULL);

}

DrvDisablePDEV

当这个PDEV不再需要的时候,调用这个api消灭。如果还有一个表面使能,这个API调用之前,需要调用DrvDisableSurface。这个api我们实现得很简单,仅仅是执行了一些清理工作,清理了在创建私有的PDEV结构期间创建的东西。

/*********************************************************************

* GdiExample_DrvDisablePDEV

*

*   This is called to disable the PDEV we created.

*  

*

*********************************************************************/

void GdiExample_DrvDisablePDEV(DHPDEV dhpdev)

{

    PDEVICE_DATA pDeviceData = (PDEVICE_DATA)dhpdev;

    UINT dwBytesReturned = 0;

    ENGDEBUGPRINT(0, "GdiExample_DrvDisablePDEV\r\n", NULL);

    if(pDeviceData->pMappedFile)

    {

       EngUnmapFile(pDeviceData->pMappedFile);

    }

    EngFreeMem(dhpdev);

}

DrvEnableSurface

这个api是用在PDEV完成以后,用来请求显示驱动创建一个表面。当创建一个表面的时候,注意你可以有两种选择。你可以创建一个由显示驱动管理的表面,也可以创建一个由GDI管理的表面。下面的代码选择一个选项来管理它自己的设备表面。

整个的用途就是定义有一个绘画表面,GDI也能在上面绘制。显示驱动有他们自己的设备表面,因此通常需要管理自己的表面。在做这个事情时,它需要以某种方式来描述这个表面,以使GDI能够理解,并能够在上面绘制。这意味着起始地址甚至是显示程度的定义,作为显示驱动对所有的显示模式一般都不能有线性缓冲。在我们这个例子中,我们使用我们创建的内存映像文件来作为我们的视频内存。

/*********************************************************************

* GdiExample_DrvEnableSurface

*

* This API is used to enable the physical device surface.

*

* You have two choices here.

*    

*     1. Driver Manages it's own surface

*          EngCreateDeviceSurface - Create the handle

*          EngModifySurface - Let GDI Know about the object.

*

*     2. GDI Manages the surface

*          EngCreateBitmap - Create a handle in a format that

*                            GDI Understands

*          EngAssociateSurface - Let GDI Know about the object.

*

*

*********************************************************************/

HSURF GdiExample_DrvEnableSurface(DHPDEV dhpdev)

{

    HSURF      hsurf;

    SIZEL       sizl;

    PDEVICE_DATA pDeviceData = (PDEVICE_DATA)dhpdev;

   

    ENGDEBUGPRINT(0, "GdiExample_DrvEnableSurface\r\n", NULL);

    pDeviceData->pDeviceSurface =

      (PDEVICE_SURFACE)EngAllocMem(FL_ZERO_MEMORY,

      sizeof(DEVICE_SURFACE), FAKE_GFX_TAG);

    sizl.cx = 800;

    sizl.cy = 600;

    hsurf = (HSURF)EngCreateDeviceSurface(

            (DHSURF)pDeviceData->pDeviceSurface, sizl, BMF_32BPP);

   

    EngModifySurface(hsurf, pDeviceData->hdev,

           HOOK_FILLPATH | HOOK_STROKEPATH | HOOK_LINETO |

           HOOK_TEXTOUT | HOOK_BITBLT | HOOK_COPYBITS,

           MS_NOTSYSTEMMEMORY, (DHSURF)pDeviceData->pDeviceSurface,

           pDeviceData->pVideoMemory, 800*4, NULL);

   

    return(hsurf);

}

DrvDisableSurface

调用这个api用来注销在DrvEnableSurface调用中创建的绘画表面。这个在注销PDEV之前调用。下面的代码来自于示例程序。

/*********************************************************************

* GdiExample_DrvDisableSurface

*

* This API is called to disable the GDI Surface.

*

*

*********************************************************************/

void GdiExample_DrvDisableSurface(DHPDEV dhpdev)

{

    PDEVICE_DATA pDeviceData = (PDEVICE_DATA)dhpdev;

    ENGDEBUGPRINT(0, "GdiExample_DrvDisableSurface\r\n", NULL);

    EngDeleteSurface(pDeviceData->hsurf);

    pDeviceData->hsurf = NULL;

    EngFreeMem(pDeviceData->pDeviceSurface);

    pDeviceData->pDeviceSurface = NULL;

}