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

原文链接: http://blog.sina.com.cn/s/blog_6ef955fa0100m4f4.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。
 

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, 0, sizeof(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, 0xFF0000, 0xFF00, 0xFF);

    }

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

    return (DHPDEV)pDeviceData;

}


 

猜你喜欢

转载自blog.csdn.net/zb774095236/article/details/101015906