|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.