iniwf

风是温柔的,雨是伤心的,云是快乐的,月是多情的,爱是迷失的,恋是醉人的,情是难忘的,天是长久的,地是永恒的

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

转自http://hi.baidu.com/combojiang/blog/item/a4f27301c829c0031d9583f7.html

DrvEnablePDEV

一旦选定了一种显示模式,这个api就会被调用,它会允许驱动使能”物理设备”。这个API的用途是允许显示驱动创建自己私有的上下文,这个上下文将会被传递给其他的显示入口点。创建私有上下文的原因是一个显示驱动可以管理多个显示设备,使用它可以区分开各个显示设备。这个api的返回值是一个上下文指针或者是显示设备的实例。

选中的显示设置通过DEVMODE参数传递给这个API,然而例子驱动中没有使用这个方法,而是硬编码设置为800 
* 600 * 32的显示模式。

这个API除创建一个实例结构外,还必须初始化GDIINFO和DEVINFO这两个数据结构。这些参数是重要的,如果你填写支持某一特征,但实际上并不支持。其副作用就是图形扭曲,甚至是蓝屏。其余两个参数我会在后面提及,他们是hDev和hDriver,参数hDriver实际上是显示驱动的DEVICE_OBJECT,可以用于API,例如:EngDeviceIoControl用它来和迷你小端口驱动通讯。

hDev是GDI的句柄,然而由于hDev是在被创建进程中,实际上这个参数没有用。在保存和使用这个句柄之前,建议等待,直到调用了DrvCompletePDEV。下面的代码来自例子驱动的DrvEnablePDEV。

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

* GdiExample_DrvEnablePDEV

*

*   This function will provide a description of the Physical Device.

*   The data returned is a user defined data context to be used as a

*   handle for this display device.

*

*   The hDriver is a handle to the miniport driver associated with

*   this display device. This handle can be used to communicate to

*   the miniport through APIs to send things like IOCTLs.

*

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


DHPDEV GdiExample_DrvEnablePDEV(DEVMODEW 
*pdm, PWSTR pwszLogAddr,

       ULONG cPat, HSURF 
*phsurfPatterns, ULONG cjCaps,

       GDIINFO 
*pGdiInfo, ULONG cjDevInfo, DEVINFO *pDevInfo,

       HDEV hdev, PWSTR pwszDeviceName, HANDLE hDriver)

{

    PDEVICE_DATA pDeviceData 
= NULL;

   

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

    pDeviceData 
= (PDEVICE_DATA) EngAllocMem(0,

                               
sizeof(DEVICE_DATA), FAKE_GFX_TAG);

    
if(pDeviceData)

    
{

        memset(pDeviceData, 
0sizeof(DEVICE_DATA));

        memset(pGdiInfo, 
0, cjCaps);

        memset(pDevInfo, 
0, cjDevInfo);

        
{

            pGdiInfo
->ulVersion    = 0x5000;

            pGdiInfo
->ulTechnology = DT_RASDISPLAY;

            pGdiInfo
->ulHorzSize   = 0;

            pGdiInfo
->ulVertSize   = 0;

            pGdiInfo
->ulHorzRes        = RESOLUTION_X;

            pGdiInfo
->ulVertRes        = RESOLUTION_Y;

            pGdiInfo
->ulPanningHorzRes = 0;

            pGdiInfo
->ulPanningVertRes = 0;

            pGdiInfo
->cBitsPixel       = 8;

            pGdiInfo
->cPlanes          = 4;

            pGdiInfo
->ulNumColors      = 20;

            pGdiInfo
->ulVRefresh       = 1;      

            pGdiInfo
->ulBltAlignment   = 1;    

            pGdiInfo
->ulLogPixelsX = 96;

            pGdiInfo
->ulLogPixelsY = 96;

            pGdiInfo
->flTextCaps   = TC_RA_ABLE;

            pGdiInfo
->flRaster     = 0;

            pGdiInfo
->ulDACRed     = 8;

            pGdiInfo
->ulDACGreen   = 8;

            pGdiInfo
->ulDACBlue    = 8;

            pGdiInfo
->ulAspectX    = 0x24;

            pGdiInfo
->ulNumPalReg = 256;

            pGdiInfo
->ulAspectY    = 0x24;

            pGdiInfo
->ulAspectXY   = 0x33;

            pGdiInfo
->xStyleStep   = 1;      

            pGdiInfo
->yStyleStep   = 1;

            pGdiInfo
->denStyleStep = 3;

            pGdiInfo
->ptlPhysOffset.x = 0;

            pGdiInfo
->ptlPhysOffset.y = 0;

            pGdiInfo
->szlPhysSize.cx = 0;

            pGdiInfo
->szlPhysSize.cy = 0;

            pGdiInfo
->ciDevice.Red.x = 6700;

            pGdiInfo
->ciDevice.Red.y = 3300;

            pGdiInfo
->ciDevice.Red.Y = 0;

            pGdiInfo
->ciDevice.Green.x = 2100;

            pGdiInfo
->ciDevice.Green.y = 7100;

            pGdiInfo
->ciDevice.Green.Y = 0;

            pGdiInfo
->ciDevice.Blue.x = 1400;

            pGdiInfo
->ciDevice.Blue.y = 800;

            pGdiInfo
->ciDevice.Blue.Y = 0;

            pGdiInfo
->ciDevice.AlignmentWhite.x = 3127;

            pGdiInfo
->ciDevice.AlignmentWhite.y = 3290;

            pGdiInfo
->ciDevice.AlignmentWhite.Y = 0;

            pGdiInfo
->ciDevice.RedGamma = 20000;

            pGdiInfo
->ciDevice.GreenGamma = 20000;

            pGdiInfo
->ciDevice.BlueGamma = 20000;

            pGdiInfo
->ciDevice.Cyan.x = 1750;

            pGdiInfo
->ciDevice.Cyan.y = 3950;

            pGdiInfo
->ciDevice.Cyan.Y = 0;

            pGdiInfo
->ciDevice.Magenta.x = 4050;

            pGdiInfo
->ciDevice.Magenta.y = 2050;

            pGdiInfo
->ciDevice.Magenta.Y = 0;

            pGdiInfo
->ciDevice.Yellow.x = 4400;

            pGdiInfo
->ciDevice.Yellow.y = 5200;

            pGdiInfo
->ciDevice.Yellow.Y = 0;

            pGdiInfo
->ciDevice.MagentaInCyanDye = 0;

            pGdiInfo
->ciDevice.YellowInCyanDye = 0;

            pGdiInfo
->ciDevice.CyanInMagentaDye = 0;

            pGdiInfo
->ciDevice.YellowInMagentaDye = 0;

            pGdiInfo
->ciDevice.CyanInYellowDye = 0;

            pGdiInfo
->ciDevice.MagentaInYellowDye = 0;

            pGdiInfo
->ulDevicePelsDPI = 0;

            pGdiInfo
->ulPrimaryOrder = PRIMARY_ORDER_CBA;

            pGdiInfo
->ulHTPatternSize = HT_PATSIZE_4x4_M;

            pGdiInfo
->flHTFlags = HT_FLAG_ADDITIVE_PRIMS;

            pGdiInfo
->ulHTOutputFormat = HT_FORMAT_32BPP;

           

            
*pDevInfo = gDevInfoFrameBuffer;

            pDevInfo
->iDitherFormat = BMF_32BPP;

        }


        pDeviceData
->pVideoMemory = EngMapFile(L"\\??\\c:\\video.dat",

              RESOLUTION_X
*RESOLUTION_Y*4&pDeviceData->pMappedFile);

        pDeviceData
->hDriver = hDriver;

        pDevInfo
->hpalDefault = EngCreatePalette(PAL_BITFIELDS,

               
0, NULL, 0xFF00000xFF000xFF);

    }


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

    
return (DHPDEV)pDeviceData;

}

posted on 2009-03-23 22:15 iniwf 阅读(637) 评论(0)  编辑 收藏 引用 所属分类: 驱动


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(2)

随笔分类

随笔档案

收藏夹

IT技术

积分与排名

最新评论

阅读排行榜

评论排行榜