Annotation of ntddk/src/perf/vgacode/enable.c, revision 1.1

1.1     ! root        1: /******************************Module*Header*******************************\
        !             2: * Module Name: enable.c
        !             3: *
        !             4: * Functions to enable and disable the driver
        !             5: *
        !             6: * Copyright (c) 1992 Microsoft Corporation
        !             7: \**************************************************************************/
        !             8: 
        !             9: 
        !            10: #include "driver.h"
        !            11: #include "winperf.h"        // for Performance API strucuture definitions  (PERFCTR)
        !            12: 
        !            13: PPERF_COUNTER_BLOCK     pCounterBlock;  // data structure for counter values (PERFCTR)
        !            14: 
        !            15: FLONG   gflDrv = 0;
        !            16: #ifdef  FIREWALLS
        !            17: LONG    cPDEV = 0;                  // PDEV counter for checking Engine
        !            18: #endif
        !            19: 
        !            20: extern GDIINFO gaulCap;             // in gdiinfo.c
        !            21: extern LOGPALETTE logPalVGA;        // in gdiinfo.c
        !            22: extern BYTE gaajPat[19][32];        // in gdiinfo.c
        !            23: extern DEVINFO devinfoVGA;          // in gdiinfo.c
        !            24: extern LPBYTE pPtrSave;
        !            25: 
        !            26: BOOL SetUpBanking(PDEVSURF, PPDEV);
        !            27: BOOL bInitPointer(PPDEV);
        !            28: 
        !            29: extern ajConvertBuffer[1];            // Arbitrary sized array!
        !            30: 
        !            31: static  DRVFN   gadrvfn[] = {
        !            32:     {   INDEX_DrvEnablePDEV,            (PFN) DrvEnablePDEV             },
        !            33:     {   INDEX_DrvCompletePDEV,          (PFN) DrvCompletePDEV           },
        !            34:     {   INDEX_DrvDisablePDEV,           (PFN) DrvDisablePDEV            },
        !            35:     {   INDEX_DrvEnableSurface,         (PFN) DrvEnableSurface          },
        !            36:     {   INDEX_DrvDisableSurface,        (PFN) DrvDisableSurface         },
        !            37:     {   INDEX_DrvRealizeBrush,          (PFN) DrvRealizeBrush           },
        !            38:     {   INDEX_DrvBitBlt,                (PFN) DrvBitBlt                 },
        !            39:     {   INDEX_DrvTextOut,               (PFN) DrvTextOut                },
        !            40:     {   INDEX_DrvSetPointerShape,       (PFN) DrvSetPointerShape        },
        !            41:     {   INDEX_DrvMovePointer,           (PFN) DrvMovePointer            },
        !            42:     {   INDEX_DrvStrokePath,            (PFN) DrvStrokePath             },
        !            43:     {   INDEX_DrvCopyBits,              (PFN) DrvCopyBits               },
        !            44:     {   INDEX_DrvDitherColor,           (PFN) DrvDitherColor            },
        !            45:     {   INDEX_DrvAssertMode,            (PFN) DrvAssertMode             },
        !            46:     {   INDEX_DrvSaveScreenBits,        (PFN) DrvSaveScreenBits         },
        !            47:     {   INDEX_DrvGetModes,              (PFN) DrvGetModes               },
        !            48:     {   INDEX_DrvFillPath,              (PFN) DrvFillPath               },
        !            49:     {   INDEX_DrvPaint,                 (PFN) DrvPaint                  }
        !            50: };
        !            51: 
        !            52: /******************************Public*Routine******************************\
        !            53: * BOOL bInitProc(HMODULE hmod)
        !            54: *
        !            55: * DLL initialization procedure.  Save the module handle and exit.
        !            56: *
        !            57: *   This routine creates a named mapped memory section that is used
        !            58: *   to communicate the driver's performance data to the extensible counter
        !            59: *   DLL. This method will only work with "user" mode driver DLL's. 
        !            60: *   Kernel or privileged drivers need to provide an IOCTL interface that
        !            61: *   will communicate the performance data to the extensible counter DLL.
        !            62: *
        !            63: \**************************************************************************/
        !            64: 
        !            65: BOOL bInitProc(HMODULE hmod, ULONG Reason, LPVOID Reserved)
        !            66: {
        !            67:     HANDLE hMappedObject;
        !            68:     TCHAR  szMappedObjectName[] = TEXT("VGA_COUNTER_BLOCK");
        !            69: 
        !            70:     if (Reason == DLL_PROCESS_ATTACH)
        !            71:     {
        !            72:         //
        !            73:         //  create named section for the performance data
        !            74:         //
        !            75:         hMappedObject = CreateFileMapping((HANDLE)0xFFFFFFFF,
        !            76:                      NULL,
        !            77:                      PAGE_READWRITE,
        !            78:                      0,
        !            79:                      4096,
        !            80:                      szMappedObjectName);
        !            81:         if (hMappedObject == NULL)
        !            82:         {
        !            83:             // Should put out an EventLog error message here
        !            84:             DISPDBG((0, "VGA: Could not Create Mapped Object for Counters %x",
        !            85:                          GetLastError()));
        !            86:                 pCounterBlock = NULL;
        !            87:             }
        !            88:         else
        !            89:         {
        !            90:                 // Mapped object created okay
        !            91:             // 
        !            92:             // map the section and assign the counter block pointer
        !            93:             // to this section of memory
        !            94:             //
        !            95:             pCounterBlock = (PPERF_COUNTER_BLOCK)
        !            96:                      MapViewOfFile(hMappedObject,
        !            97:                      FILE_MAP_ALL_ACCESS,
        !            98:                      0,
        !            99:                      0,
        !           100:                      0);
        !           101:             if (pCounterBlock == NULL)
        !           102:             {
        !           103:                 // Failed to Map View of file
        !           104:                 DISPDBG((0, "VGA: Failed to Map View of File %x",
        !           105:                         GetLastError()));
        !           106:             }
        !           107:         }
        !           108:     }
        !           109: 
        !           110:     return(TRUE);
        !           111: 
        !           112:     Reserved=Reserved;
        !           113: }
        !           114: 
        !           115: 
        !           116: 
        !           117: /******************************Public*Routine******************************\
        !           118: * BOOL bEnableDriver(iEngineVersion, cb, pded)
        !           119: *
        !           120: * Enables the driver by filling the function table.  This call is made by
        !           121: * the Engine to fill its driver function table in the LDEV (Logical DEVice).
        !           122: * This call should only be made once per driver but we can handle being
        !           123: * called multiple times.
        !           124: *
        !           125: \**************************************************************************/
        !           126: 
        !           127: BOOL DrvEnableDriver
        !           128: (
        !           129:     ULONG           iEngineVersion,
        !           130:     ULONG           cb,
        !           131:     PDRVENABLEDATA  pded
        !           132: )
        !           133: {
        !           134:     DISPDBG((2, "VGA: enabling Driver\n"));
        !           135: 
        !           136:     cb /= sizeof(ULONG);
        !           137: 
        !           138:     switch(cb)
        !           139:     {
        !           140:     case 3:
        !           141:         pded->pdrvfn = gadrvfn;
        !           142:     case 2:
        !           143:         pded->c = sizeof(gadrvfn) / sizeof(DRVFN);
        !           144:     case 1:
        !           145:         pded->iDriverVersion = DDI_DRIVER_VERSION;
        !           146:     }
        !           147: 
        !           148:     return(TRUE);
        !           149: }
        !           150: 
        !           151: /******************************Public*Routine******************************\
        !           152: * VOID vDisableDriver
        !           153: *
        !           154: * Unload the driver and any data in may have created.
        !           155: *
        !           156: \**************************************************************************/
        !           157: 
        !           158: VOID DrvDisableDriver()
        !           159: {
        !           160:     DISPDBG((2, "VGA: disabling Driver\n"));
        !           161: }
        !           162: 
        !           163: /******************************Public*Routine******************************\
        !           164: * BOOL bLoadResources()
        !           165: *
        !           166: * Load the resources used by the PDEV
        !           167: *
        !           168: \**************************************************************************/
        !           169: 
        !           170: BOOL bLoadResources(PPDEV ppdev)
        !           171: {
        !           172: // Load the font resources
        !           173: 
        !           174:     return(TRUE);
        !           175: 
        !           176:     UNREFERENCED_PARAMETER(ppdev);
        !           177: }
        !           178: 
        !           179: /******************************Public*Routine******************************\
        !           180: * bInitDefaultPatterns
        !           181: *
        !           182: * Creates the default monochrome patterns to be used on it's surface.
        !           183: *
        !           184: \**************************************************************************/
        !           185: 
        !           186: BOOL bInitDefaultPatterns(PPDEV ppdev)
        !           187: {
        !           188:     SIZEL           sizl;
        !           189:     INT             iLoop;
        !           190:     PULONG          pulInit;
        !           191: 
        !           192:     sizl.cx = 8;
        !           193:     sizl.cy = 8;
        !           194: 
        !           195:     DISPDBG((2, "VGA: initializing defailt patterns\n"));
        !           196: 
        !           197:     for (iLoop = 0; iLoop < HS_DDI_MAX; iLoop++)
        !           198:     {
        !           199:         pulInit = (PULONG) (&gaajPat[iLoop][0]);
        !           200:         ppdev->ahbmPat[iLoop] = EngCreateBitmap(sizl, sizl.cx / 8, BMF_1BPP,
        !           201:                                                 BMF_TOPDOWN, pulInit);
        !           202: 
        !           203:         if (ppdev->ahbmPat[iLoop] == (HBITMAP)0)
        !           204:         {
        !           205:         // Release any bitmaps we have created.
        !           206: 
        !           207:             while(iLoop--)
        !           208:                 EngDeleteSurface((HSURF) ppdev->ahbmPat[iLoop]);
        !           209: 
        !           210:             return(FALSE);
        !           211:         }
        !           212:     }
        !           213: 
        !           214:     return(TRUE);
        !           215: }
        !           216: 
        !           217: /******************************Public*Routine******************************\
        !           218: * DHPDEV DrvEnablePDEV
        !           219: *
        !           220: * Enable the Physical DEVice
        !           221: *
        !           222: * Warnings:
        !           223: *   The PDEV isn't complete until bCompletePDEV is called.
        !           224: *
        !           225: \**************************************************************************/
        !           226: 
        !           227: DHPDEV DrvEnablePDEV
        !           228: (
        !           229:     DEVMODEW *pdrivw,
        !           230:     PWSTR     pwszLogAddress,
        !           231:     ULONG     cPatterns,
        !           232:     PHSURF    ahsurfPatterns,
        !           233:     ULONG     cjGdiInfo,
        !           234:     ULONG    *pdevcaps,
        !           235:     ULONG     cb,
        !           236:     PDEVINFO  pdevinfo,
        !           237:     PWSTR     pwszDataFile,
        !           238:     PWSTR     pwszDeviceName,
        !           239:     HANDLE    hDriver          // Handle to base driver
        !           240: )
        !           241: {
        !           242:     FLONG   fl = 0;
        !           243:     DHPDEV  dhpdev = (DHPDEV) 0;
        !           244:     PPDEV   ppdev;
        !           245:     SYSTEM_INFO SystemInfo;
        !           246: 
        !           247:     DISPDBG((2, "VGA: enabling PDEV\n"));
        !           248: 
        !           249: // Define flag to keep track of allocation
        !           250: 
        !           251: #define PDEV_ALLOCED    0x01
        !           252: 
        !           253: #ifdef DRV_ONE_PDEV
        !           254:     if (gflDrv & DRV_ENABLED_PDEV)
        !           255:     {
        !           256:         // SAVE_ERROR_CODE(DDI_PDEV_ALREADY_ENABLED);
        !           257:         goto error;
        !           258:     }
        !           259: #endif
        !           260: 
        !           261:     dhpdev = (DHPDEV) LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, sizeof(PDEV));
        !           262:     if (dhpdev == (DHPDEV) 0)
        !           263:         goto error;
        !           264: 
        !           265:     fl |= PDEV_ALLOCED;
        !           266: 
        !           267:     ppdev = (PPDEV) dhpdev;
        !           268: 
        !           269:     // Identifier, for debugging purposes
        !           270:     ppdev->ident = PDEV_IDENT;
        !           271: 
        !           272:     // Determine whether this is a 386 or a better processor
        !           273:     GetSystemInfo(&SystemInfo);
        !           274:     if (SystemInfo.dwProcessorType == PROCESSOR_INTEL_386) {
        !           275:         ppdev->ulIs386 = 1;
        !           276:     } else {
        !           277:         ppdev->ulIs386 = 0;
        !           278:     }
        !           279: 
        !           280:     // Cache the device driver handle away for later use.
        !           281: 
        !           282:     ppdev->hDriver = hDriver;
        !           283: 
        !           284:     // Initialize the cursor stuff.  We can violate the atomic rule here
        !           285:     // since nobody can talk to the driver yet.
        !           286: 
        !           287:     ppdev->xyCursor.x = 320;            // Non-atomic
        !           288:     ppdev->xyCursor.y = 240;            // Non-atomic
        !           289: 
        !           290:     ppdev->ptlExtent.x = 0;
        !           291:     ppdev->ptlExtent.y = 0;
        !           292:     ppdev->cExtent = 0;
        !           293: 
        !           294:     ppdev->flCursor = CURSOR_DOWN;
        !           295: 
        !           296:     //
        !           297:     // Get the current screen mode information.  Set up device caps and devinfo.
        !           298:     //
        !           299: 
        !           300:     if (!bInitPDEV(ppdev, pdrivw, &gaulCap, &devinfoVGA))
        !           301:     {
        !           302:         DISPDBG((1, "DISP VGA DrvEnablePDEV failed bInitPDEV\n"));
        !           303:         goto error;
        !           304:     }
        !           305: 
        !           306:     if (!bLoadResources(ppdev))
        !           307:         goto error;
        !           308: 
        !           309:     if (!bInitDefaultPatterns(ppdev))
        !           310:         goto error;
        !           311: 
        !           312: #ifdef DRV_ONE_PDEV
        !           313:     gflDrv |= DRV_ENABLED_PDEV;             // So we're not called twice
        !           314: #endif
        !           315: 
        !           316:     cPatterns=min(cPatterns, HS_DDI_MAX);
        !           317: 
        !           318:     memcpy((PVOID)ahsurfPatterns, ppdev->ahbmPat, cPatterns*sizeof(HBITMAP));
        !           319: 
        !           320:     cjGdiInfo=min(cjGdiInfo, sizeof(GDIINFO));
        !           321: 
        !           322:     memcpy(pdevcaps, &gaulCap, cjGdiInfo);
        !           323: 
        !           324:      // Now let's pass back the devinfo
        !           325: 
        !           326:     devinfoVGA.hpalDefault = EngCreatePalette(PAL_INDEXED, 16,
        !           327:                                               (PULONG) (logPalVGA.palPalEntry),
        !           328:                                               0, 0, 0);
        !           329: 
        !           330:     // *pdevinfo  = devinfoVGA;
        !           331:     memcpy((PVOID) pdevinfo, (PVOID) &devinfoVGA, (ULONG) sizeof(DEVINFO));
        !           332: 
        !           333:     // Try to preallocate a saved screen bits buffer. If we fail, set the flag
        !           334:     // to indicate the buffer is in use, so that we'll never attempt to use it.
        !           335:     // If we succeed, mark the buffer as free.
        !           336: 
        !           337:     if ((ppdev->pjPreallocSSBBuffer = (PUCHAR)
        !           338:               LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, PREALLOC_SSB_SIZE))
        !           339:               != NULL) {
        !           340:         ppdev->flPreallocSSBBufferInUse = FALSE;
        !           341:         ppdev->ulPreallocSSBSize = PREALLOC_SSB_SIZE;
        !           342:     } else {
        !           343:         ppdev->flPreallocSSBBufferInUse = TRUE;
        !           344:     }
        !           345: 
        !           346:     // Fill in the DIB4->VGA conversion tables. Allow 256 extra bytes so that
        !           347:     // we can always safely align the tables to a 256-byte boundary, for
        !           348:     // look-up reasons. There are four tables, each 256 bytes long
        !           349: 
        !           350:     ppdev->pucDIB4ToVGAConvBuffer =
        !           351:             (UCHAR *) LocalAlloc((LMEM_FIXED | LMEM_ZEROINIT),
        !           352:             ((256*4+256)*sizeof(UCHAR)));
        !           353: 
        !           354:     if (ppdev->pucDIB4ToVGAConvBuffer == NULL) {
        !           355:         goto error;
        !           356:     }
        !           357: 
        !           358:     // Round the table start up to the nearest 256 byte boundary, because the
        !           359:     // tables must start on 256-byte boundaries for look-up reasons
        !           360: 
        !           361:     ppdev->pucDIB4ToVGAConvTables =
        !           362:             (UCHAR *) ((ULONG) (ppdev->pucDIB4ToVGAConvBuffer + 0xFF) & ~0xFF);
        !           363: 
        !           364:     vSetDIB4ToVGATables(ppdev->pucDIB4ToVGAConvTables);
        !           365: 
        !           366:     return(dhpdev);
        !           367: 
        !           368: error:
        !           369:     if (fl & PDEV_ALLOCED)
        !           370:         LocalFree(dhpdev);
        !           371: 
        !           372:     return((DHPDEV) 0);
        !           373: 
        !           374:     UNREFERENCED_PARAMETER(cb);
        !           375:     UNREFERENCED_PARAMETER(pwszLogAddress);
        !           376:     UNREFERENCED_PARAMETER(pwszDataFile);
        !           377:     UNREFERENCED_PARAMETER(pwszDeviceName);
        !           378: }
        !           379: 
        !           380: /******************************Public*Routine******************************\
        !           381: * BOOL bCompletePDEV(dhpdev, hpdev)
        !           382: *
        !           383: * Complete the initialization of the PDEV
        !           384: *
        !           385: \**************************************************************************/
        !           386: 
        !           387: VOID DrvCompletePDEV(
        !           388:     DHPDEV dhpdev,
        !           389:     HDEV  hdev)
        !           390: {
        !           391:     PPDEV   ppdev;
        !           392: 
        !           393:     ppdev = (PPDEV) dhpdev;
        !           394: 
        !           395:     ppdev->hdevEng = hdev;
        !           396: }
        !           397: 
        !           398: /******************************Public*Routine******************************\
        !           399: * VOID vFreeResources(ppdev)
        !           400: *
        !           401: * Free the resources used by the PDEV
        !           402: *
        !           403: * Effects:
        !           404: *
        !           405: * Warnings:
        !           406: *
        !           407: \**************************************************************************/
        !           408: 
        !           409: VOID vFreeResources(PPDEV ppdev)
        !           410: {
        !           411: 
        !           412:     UNREFERENCED_PARAMETER(ppdev);
        !           413: }
        !           414: 
        !           415: /******************************Public*Routine******************************\
        !           416: * VOID vKillPatterns(ppdev)
        !           417: *
        !           418: * Clear the standard patterns
        !           419: *
        !           420: \**************************************************************************/
        !           421: 
        !           422: VOID vKillPatterns(PPDEV ppdev)
        !           423: {
        !           424:     INT     ii;
        !           425: 
        !           426:     for (ii = 0; ii < HS_DDI_MAX; ii++)
        !           427:         EngDeleteSurface((HSURF) ppdev->ahbmPat[ii]);
        !           428: }
        !           429: 
        !           430: /******************************Public*Routine******************************\
        !           431: * VOID DrvDisablePDEV(dhpdev)
        !           432: *
        !           433: * Shutdown this physical device.
        !           434: *
        !           435: * Warnings:
        !           436: *   If a surface is still active for this PDEV it will be freed.
        !           437: *
        !           438: 
        !           439: \**************************************************************************/
        !           440: 
        !           441: VOID DrvDisablePDEV(DHPDEV dhpdev)
        !           442: {
        !           443:     PPDEV   ppdev;
        !           444: 
        !           445:     ppdev = (PPDEV) dhpdev;
        !           446: 
        !           447:     DISPDBG((2, "VGA:disabling PDEV\n"));
        !           448: 
        !           449: //    ASSERT(ppdev != (PPDEV) NULL, "PDEV error");
        !           450: 
        !           451: // Is there a deliquent surface still in the PDEV?
        !           452: 
        !           453:     if (ppdev->hsurfEng != (HSURF) 0)
        !           454:         DrvDisableSurface(dhpdev);
        !           455: 
        !           456: // Check if the Engine has called us to many times.
        !           457: 
        !           458: //    ASSERT(--cPDEV >= 0, "PDEV - too many disables");
        !           459: 
        !           460: // Free the resources and bitmaps associated with this PDEV
        !           461: 
        !           462:     vFreeResources(ppdev);
        !           463:     vKillPatterns(ppdev);
        !           464: 
        !           465: // Free the preallocated saved screen bits buffer, if there is one.
        !           466: 
        !           467:     if (ppdev->pjPreallocSSBBuffer != NULL) {
        !           468:         LocalFree(ppdev->pjPreallocSSBBuffer);
        !           469:     }
        !           470: 
        !           471: // Free the conversion table buffer
        !           472: 
        !           473:     if (ppdev->pucDIB4ToVGAConvBuffer != NULL) {
        !           474:         LocalFree(ppdev->pucDIB4ToVGAConvBuffer);
        !           475:     }
        !           476: 
        !           477: // Delete the PDEV
        !           478: 
        !           479:     LocalFree(dhpdev);
        !           480: 
        !           481:     DISPDBG((2, "VGA: disabled PDEV\n"));
        !           482: 
        !           483: #ifdef  DRV_ONE_PDEV
        !           484:     gflDrv &= ~DRV_ENABLED_PDEV;
        !           485: #endif
        !           486: }
        !           487: 
        !           488: /******************************Public*Routine******************************\
        !           489: * HSURF DrvEnableSurface(dhpdev)
        !           490: *
        !           491: * Enable the surface for the device.  This will actually intialize the
        !           492: * screen on the VGA.
        !           493: *
        !           494: * Warnings:
        !           495: *   This routine should only be called ONCE per PDEV.
        !           496: *
        !           497: \**************************************************************************/
        !           498: 
        !           499: HSURF DrvEnableSurface(DHPDEV dhpdev)
        !           500: {
        !           501:     PPDEV    ppdev;
        !           502:     PDEVSURF pdsurf;
        !           503:     DHSURF   dhsurf;
        !           504:     HSURF    hsurf;
        !           505: 
        !           506:     DISPDBG((2, "VGA:enabling Surface\n"));
        !           507: 
        !           508:     ppdev = (PPDEV) dhpdev;
        !           509: 
        !           510:     //
        !           511:     // Initialize the VGA device into the selected mode which will also map
        !           512:     // the video frame buffer
        !           513:     //
        !           514: 
        !           515:     if (!bInitVGA(ppdev, TRUE))
        !           516:     {
        !           517:         goto error_done;
        !           518:     }
        !           519: 
        !           520:     dhsurf = (DHSURF) LocalAlloc(LMEM_FIXED, (SIZE_T) sizeof(DEVSURF));
        !           521: 
        !           522:     if (dhsurf == (DHSURF) 0)
        !           523:         goto error_done;
        !           524: 
        !           525:     pdsurf = (PDEVSURF) dhsurf;
        !           526: 
        !           527:     pdsurf->ident           = DEVSURF_IDENT;
        !           528:     pdsurf->flSurf          = 0;
        !           529:     pdsurf->iFormat         = BMF_PHYSDEVICE;
        !           530:     pdsurf->jReserved1      = 0;
        !           531:     pdsurf->jReserved2      = 0;
        !           532:     pdsurf->ppdev           = ppdev;
        !           533:     pdsurf->sizlSurf.cx     = ppdev->sizlSurf.cx;
        !           534:     pdsurf->sizlSurf.cy     = ppdev->sizlSurf.cy;
        !           535:     pdsurf->lNextPlane      = 0;
        !           536:     pdsurf->pvScan0         = ppdev->pjScreen;
        !           537:     pdsurf->pvBitmapStart   = ppdev->pjScreen;
        !           538:     pdsurf->pvStart         = ppdev->pjScreen;
        !           539:     pdsurf->pvConv          = &ajConvertBuffer[0];
        !           540: 
        !           541:     if (!bInitPointer(ppdev)) {
        !           542:         DISPDBG((0, "VGA DrvEnablePDEV failed bInitPointer\n"));
        !           543:         goto error_clean;
        !           544:     }
        !           545: 
        !           546:     if (!SetUpBanking(pdsurf, ppdev)) {
        !           547:         DISPDBG((0, "VGA DrvEnablePDEV failed SetUpBanking\n"));
        !           548:         goto error_clean;
        !           549:     }
        !           550: 
        !           551:     // Initialize pointer information.
        !           552: 
        !           553:     if ((hsurf = EngCreateSurface(dhsurf, ppdev->sizlSurf)) == (HSURF) 0)
        !           554:     {
        !           555:         DISPDBG((0, "VGA DrvEnablePDEV failed EngCreateSurface\n"));
        !           556:         goto error_clean;
        !           557:     }
        !           558: 
        !           559:     if (EngAssociateSurface(hsurf, ppdev->hdevEng,
        !           560:                         HOOK_BITBLT | HOOK_TEXTOUT | HOOK_STROKEPATH |
        !           561:                         HOOK_COPYBITS | HOOK_PAINT | HOOK_FILLPATH))
        !           562:     {
        !           563:         ppdev->hsurfEng = hsurf;
        !           564:         ppdev->pdsurf = pdsurf;
        !           565: 
        !           566:         // Set up an empty saved screen block list
        !           567:         pdsurf->ssbList = NULL;
        !           568:         // Initialize the offscreen adapter memory heap to currently all
        !           569:         // available
        !           570:         // Beginning of heap starts right after the displayed bitmap ends
        !           571:         pdsurf->pjAdapterHeapStart = ((PBYTE)pdsurf->pvBitmapStart) +
        !           572:              (pdsurf->lNextScan * pdsurf->sizlSurf.cy);
        !           573: 
        !           574:         // End of heap is the start of either the pointer work area or the
        !           575:         // hardware pointer reserved memory area, whichever comes first
        !           576:         pdsurf->pjAdapterHeapEnd = pPtrSave;
        !           577:         if (ppdev->pPointerAttributes != NULL)
        !           578:         {
        !           579:             // There's a hardware pointer, so check what display memory it
        !           580:             //  uses, if any
        !           581:             if (ppdev->PointerCapabilities.HWPtrBitmapStart != -1)
        !           582:             {
        !           583:                 // The hardware pointer does use display memory
        !           584:                 if (( ((PBYTE)pdsurf->pvBitmapStart) +
        !           585:                         ppdev->PointerCapabilities.HWPtrBitmapStart) <
        !           586:                         pdsurf->pjAdapterHeapEnd)
        !           587:                 {
        !           588:                     // The hardware pointer marks the end of the heap
        !           589:                     pdsurf->pjAdapterHeapEnd = ((PBYTE)pdsurf->pvBitmapStart) +
        !           590:                         ppdev->PointerCapabilities.HWPtrBitmapStart;
        !           591:                 }
        !           592:             }
        !           593:         }
        !           594: 
        !           595:         // The current top of the heap is the end of the heap, because the heap
        !           596:         // is empty
        !           597:         pdsurf->pjAdapterHeapTop = pdsurf->pjAdapterHeapEnd;
        !           598: 
        !           599:         DISPDBG((2, "VGA: enabled surface\n"));
        !           600: 
        !           601:         return(hsurf);
        !           602: 
        !           603:     }
        !           604: 
        !           605:     DISPDBG((0, "VGA DrvEnablePDEV failed EngDeleteSurface\n"));
        !           606:     EngDeleteSurface(hsurf);
        !           607: 
        !           608: error_clean:
        !           609:     // We created the surface, so delete it
        !           610:     LocalFree(dhsurf);
        !           611: 
        !           612: error_done:
        !           613:     return((HSURF) 0);
        !           614: }
        !           615: 
        !           616: 
        !           617: /******************************Public*Routine******************************\
        !           618: * DrvDisableSurface
        !           619: *
        !           620: * Free resources associated with this surface.
        !           621: *
        !           622: \**************************************************************************/
        !           623: 
        !           624: VOID DrvDisableSurface(DHPDEV dhpdev)
        !           625: {
        !           626:     PPDEV   ppdev = (PPDEV) dhpdev;
        !           627:     PDEVSURF pdsurf = ppdev->pdsurf;
        !           628:     PSAVED_SCREEN_BITS pSSB, pSSBNext;
        !           629: 
        !           630:     DISPDBG((2, "VGA:disabling surface\n"));
        !           631: 
        !           632:     // Free up banking-related stuff.
        !           633:     LocalFree(pdsurf->pBankSelectInfo);
        !           634: 
        !           635:     if (pdsurf->pbiBankInfo != NULL) {
        !           636:         LocalFree(pdsurf->pbiBankInfo);
        !           637:     }
        !           638: 
        !           639:     if (pdsurf->pbiBankInfo2RW != NULL) {
        !           640:         LocalFree(pdsurf->pbiBankInfo2RW);
        !           641:     }
        !           642: 
        !           643:     if (pdsurf->pvBankBufferPlane0 != NULL) {
        !           644:         LocalFree(pdsurf->pvBankBufferPlane0);
        !           645:     }
        !           646: 
        !           647:     if (ppdev->pPointerAttributes != NULL) {
        !           648:         LocalFree(ppdev->pPointerAttributes);
        !           649:     }
        !           650: 
        !           651:     // Free any pending saved screen bit blocks.
        !           652:     pSSB = pdsurf->ssbList;
        !           653:     while (pSSB != (PSAVED_SCREEN_BITS) NULL) {
        !           654:         // Point to the next saved screen bits block
        !           655:         pSSBNext = (PSAVED_SCREEN_BITS) pSSB->pvNextSSB;
        !           656:         // Free the current block
        !           657:         LocalFree(pSSB);
        !           658:         pSSB = pSSBNext;
        !           659:     }
        !           660: 
        !           661:     EngDeleteSurface((HSURF) ppdev->hsurfEng);
        !           662: 
        !           663:     LocalFree(pdsurf);  // free the surface
        !           664: 
        !           665:     DISPDBG((2, "VGA:disabled surface\n"));
        !           666: 
        !           667: }
        !           668: 
        !           669: /******************************Public*Routine******************************\
        !           670: * DrvAssertMode
        !           671: *
        !           672: * Ping the device back into its last known mode
        !           673: *
        !           674: \**************************************************************************/
        !           675: 
        !           676: VOID DrvAssertMode(DHPDEV dhpdev, BOOL Enable)
        !           677: {
        !           678:     PPDEV   ppdev = (PPDEV) dhpdev;
        !           679:     ULONG   returnedDataLength;
        !           680: 
        !           681:     DISPDBG((2, "VGA: DrvAssertMode\n"));
        !           682: 
        !           683:     if (Enable) {
        !           684: 
        !           685:         //
        !           686:         // The screen must be reenabled since we had gone to full screen.
        !           687:         // Re-initialize the device.
        !           688:         // !!! BUGBUG what happens if this fails ??
        !           689:         //
        !           690: 
        !           691:         bInitVGA(ppdev, FALSE);
        !           692: 
        !           693:         vForceBank0(ppdev);
        !           694: 
        !           695:     } else {
        !           696: 
        !           697:         //
        !           698:         // We must give up the display.
        !           699:         // Call the kernel driver to reset the device to a known state.
        !           700:         //
        !           701: 
        !           702:         if (!DeviceIoControl(ppdev->hDriver,
        !           703:                              IOCTL_VIDEO_RESET_DEVICE,
        !           704:                              NULL,
        !           705:                              0,
        !           706:                              NULL,
        !           707:                              0,
        !           708:                              &returnedDataLength,
        !           709:                              NULL)) {
        !           710: 
        !           711:             RIP("VGA.DLL: Reset Device Failed");
        !           712: 
        !           713:         }
        !           714:     }
        !           715: 
        !           716:     return;
        !           717: }
        !           718: 
        !           719: /******************************Public*Routine******************************\
        !           720: * DrvGetModes
        !           721: *
        !           722: * Returns the list of available modes for the device.
        !           723: *
        !           724: \**************************************************************************/
        !           725: 
        !           726: ULONG DrvGetModes(
        !           727: HANDLE hDriver,
        !           728: ULONG cjSize,
        !           729: DEVMODEW *pdm)
        !           730: 
        !           731: {
        !           732: 
        !           733:     DWORD cModes;
        !           734:     DWORD cbOutputSize;
        !           735:     PVIDEO_MODE_INFORMATION pVideoModeInformation, pVideoTemp;
        !           736:     DWORD cOutputModes = cjSize / (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
        !           737:     DWORD cbModeSize;
        !           738: 
        !           739:     DISPDBG((2, "Vga.dll:DrvGetModes\n"));
        !           740: 
        !           741:     cModes = getAvailableModes(hDriver,
        !           742:                                (PVIDEO_MODE_INFORMATION *) &pVideoModeInformation,
        !           743:                                &cbModeSize);
        !           744: 
        !           745:     if (cModes == 0)
        !           746:     {
        !           747:         DISPDBG((0, "VGA DISP DrvGetModes failed to get mode information"));
        !           748:         return 0;
        !           749:     }
        !           750: 
        !           751:     if (pdm == NULL)
        !           752:     {
        !           753:         cbOutputSize = cModes * (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
        !           754:     }
        !           755:     else
        !           756:     {
        !           757:         //
        !           758:         // Now copy the information for the supported modes back into the output
        !           759:         // buffer
        !           760:         //
        !           761: 
        !           762:         cbOutputSize = 0;
        !           763: 
        !           764:         pVideoTemp = pVideoModeInformation;
        !           765: 
        !           766:         do
        !           767:         {
        !           768:             if (pVideoTemp->Length != 0)
        !           769:             {
        !           770:                 if (cOutputModes == 0)
        !           771:                 {
        !           772:                     break;
        !           773:                 }
        !           774: 
        !           775:                 //
        !           776:                 // Zero the entire structure to start off with.
        !           777:                 //
        !           778: 
        !           779:                 memset(pdm, 0, sizeof(DEVMODEW));
        !           780: 
        !           781:                 //
        !           782:                 // Set the name of the device to the name of the DLL.
        !           783:                 //
        !           784: 
        !           785:                 memcpy(&(pdm->dmDeviceName), L"vga", sizeof(L"vga"));
        !           786: 
        !           787:                 pdm->dmSpecVersion = DM_SPECVERSION;
        !           788:                 pdm->dmDriverVersion = DM_SPECVERSION;
        !           789: 
        !           790:                 //
        !           791:                 // We currently do not support Extra information in the driver
        !           792:                 //
        !           793: 
        !           794:                 pdm->dmDriverExtra = DRIVER_EXTRA_SIZE;
        !           795: 
        !           796:                 pdm->dmSize = sizeof(DEVMODEW);
        !           797:                 pdm->dmBitsPerPel = pVideoTemp->NumberOfPlanes *
        !           798:                                     pVideoTemp->BitsPerPlane;
        !           799:                 pdm->dmPelsWidth = pVideoTemp->VisScreenWidth;
        !           800:                 pdm->dmPelsHeight = pVideoTemp->VisScreenHeight;
        !           801:                 pdm->dmDisplayFrequency = pVideoTemp->Frequency;
        !           802: 
        !           803:                 if (pVideoTemp->AttributeFlags & VIDEO_MODE_INTERLACED)
        !           804:                 {
        !           805:                     pdm->dmDisplayFlags |= DM_INTERLACED;
        !           806:                 }
        !           807: 
        !           808:                 //
        !           809:                 // Go to the next DEVMODE entry in the buffer.
        !           810:                 //
        !           811: 
        !           812:                 cOutputModes--;
        !           813: 
        !           814:                 pdm = (LPDEVMODEW) ( ((ULONG)pdm) + sizeof(DEVMODEW) +
        !           815:                                                    DRIVER_EXTRA_SIZE);
        !           816: 
        !           817:                 cbOutputSize += (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
        !           818: 
        !           819:             }
        !           820: 
        !           821:             pVideoTemp = (PVIDEO_MODE_INFORMATION)
        !           822:                 (((PUCHAR)pVideoTemp) + cbModeSize);
        !           823: 
        !           824:         } while (--cModes);
        !           825:     }
        !           826: 
        !           827:     LocalFree(pVideoModeInformation);
        !           828: 
        !           829:     return cbOutputSize;
        !           830: 
        !           831: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.