ReactOS  0.4.15-dev-5109-g2469ce2
vbemp.c File Reference
#include "vbemp.h"
#include <devioctl.h>
Include dependency graph for vbemp.c:

Go to the source code of this file.

Macros

#define LOWORD(l)   ((USHORT)((ULONG_PTR)(l)))
 
#define HIWORD(l)   ((USHORT)(((ULONG_PTR)(l)>>16)&0xFFFF))
 

Functions

ULONG NTAPI DriverEntry (IN PVOID Context1, IN PVOID Context2)
 
VP_STATUS NTAPI VBEFindAdapter (IN PVOID HwDeviceExtension, IN PVOID HwContext, IN PWSTR ArgumentString, IN OUT PVIDEO_PORT_CONFIG_INFO ConfigInfo, OUT PUCHAR Again)
 
static int VBESortModesCallback (PVBE_MODEINFO VbeModeInfoA, PVBE_MODEINFO VbeModeInfoB)
 
VOID FASTCALL VBESortModes (PVBE_DEVICE_EXTENSION DeviceExtension)
 
BOOLEAN NTAPI VBEInitialize (PVOID HwDeviceExtension)
 
BOOLEAN NTAPI VBEStartIO (PVOID HwDeviceExtension, PVIDEO_REQUEST_PACKET RequestPacket)
 
BOOLEAN NTAPI VBEResetHw (PVOID DeviceExtension, ULONG Columns, ULONG Rows)
 
VP_STATUS NTAPI VBEGetPowerState (PVOID HwDeviceExtension, ULONG HwId, PVIDEO_POWER_MANAGEMENT VideoPowerControl)
 
VP_STATUS NTAPI VBESetPowerState (PVOID HwDeviceExtension, ULONG HwId, PVIDEO_POWER_MANAGEMENT VideoPowerControl)
 
BOOLEAN FASTCALL VBESetCurrentMode (PVBE_DEVICE_EXTENSION DeviceExtension, PVIDEO_MODE RequestedMode, PSTATUS_BLOCK StatusBlock)
 
BOOLEAN FASTCALL VBEResetDevice (PVBE_DEVICE_EXTENSION DeviceExtension, PSTATUS_BLOCK StatusBlock)
 
BOOLEAN FASTCALL VBEMapVideoMemory (PVBE_DEVICE_EXTENSION DeviceExtension, PVIDEO_MEMORY RequestedAddress, PVIDEO_MEMORY_INFORMATION MapInformation, PSTATUS_BLOCK StatusBlock)
 
BOOLEAN FASTCALL VBEUnmapVideoMemory (PVBE_DEVICE_EXTENSION DeviceExtension, PVIDEO_MEMORY VideoMemory, PSTATUS_BLOCK StatusBlock)
 
BOOLEAN FASTCALL VBEQueryNumAvailModes (PVBE_DEVICE_EXTENSION DeviceExtension, PVIDEO_NUM_MODES Modes, PSTATUS_BLOCK StatusBlock)
 
VOID FASTCALL VBEQueryMode (PVBE_DEVICE_EXTENSION DeviceExtension, PVIDEO_MODE_INFORMATION VideoMode, ULONG VideoModeId)
 
BOOLEAN FASTCALL VBEQueryAvailModes (PVBE_DEVICE_EXTENSION DeviceExtension, PVIDEO_MODE_INFORMATION ReturnedModes, PSTATUS_BLOCK StatusBlock)
 
BOOLEAN FASTCALL VBEQueryCurrentMode (PVBE_DEVICE_EXTENSION DeviceExtension, PVIDEO_MODE_INFORMATION VideoModeInfo, PSTATUS_BLOCK StatusBlock)
 
BOOLEAN FASTCALL VBESetColorRegisters (PVBE_DEVICE_EXTENSION DeviceExtension, PVIDEO_CLUT ColorLookUpTable, PSTATUS_BLOCK StatusBlock)
 

Variables

VIDEO_ACCESS_RANGE VBEAccessRange []
 

Macro Definition Documentation

◆ HIWORD

#define HIWORD (   l)    ((USHORT)(((ULONG_PTR)(l)>>16)&0xFFFF))

Definition at line 37 of file vbemp.c.

◆ LOWORD

#define LOWORD (   l)    ((USHORT)((ULONG_PTR)(l)))

Definition at line 36 of file vbemp.c.

Function Documentation

◆ DriverEntry()

ULONG NTAPI DriverEntry ( IN PVOID  Context1,
IN PVOID  Context2 
)

Definition at line 49 of file vbemp.c.

50 {
52 
53  VideoPortZeroMemory(&InitData, sizeof(InitData));
55  InitData.HwFindAdapter = VBEFindAdapter;
56  InitData.HwInitialize = VBEInitialize;
57  InitData.HwStartIO = VBEStartIO;
58  InitData.HwResetHw = VBEResetHw;
65 
66  return VideoPortInitialize(Context1, Context2, &InitData, NULL);
67 }
VP_STATUS NTAPI VBEGetVideoChildDescriptor(IN PVOID HwDeviceExtension, IN PVIDEO_CHILD_ENUM_INFO ChildEnumInfo, OUT PVIDEO_CHILD_TYPE VideoChildType, OUT PUCHAR pChildDescriptor, OUT PULONG UId, OUT PULONG pUnused)
Definition: edid.c:230
BOOLEAN NTAPI VBEStartIO(PVOID HwDeviceExtension, PVIDEO_REQUEST_PACKET RequestPacket)
Definition: vbemp.c:442
PVIDEO_HW_POWER_SET HwSetPowerState
Definition: video.h:675
PVIDEO_HW_GET_CHILD_DESCRIPTOR HwGetVideoChildDescriptor
Definition: video.h:677
VP_STATUS NTAPI VBEGetPowerState(PVOID HwDeviceExtension, ULONG HwId, PVIDEO_POWER_MANAGEMENT VideoPowerControl)
Definition: vbemp.c:582
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
VP_STATUS NTAPI VBEFindAdapter(IN PVOID HwDeviceExtension, IN PVOID HwContext, IN PWSTR ArgumentString, IN OUT PVIDEO_PORT_CONFIG_INFO ConfigInfo, OUT PUCHAR Again)
Definition: vbemp.c:78
VPAPI ULONG NTAPI VideoPortInitialize(IN PVOID Argument1, IN PVOID Argument2, IN PVIDEO_HW_INITIALIZATION_DATA HwInitializationData, IN PVOID HwContext)
Definition: videoprt.c:662
PVIDEO_HW_POWER_GET HwGetPowerState
Definition: video.h:676
VPAPI VOID NTAPI VideoPortZeroMemory(IN PVOID Destination, IN ULONG Length)
PVIDEO_HW_START_IO HwStartIO
Definition: video.h:669
VP_STATUS NTAPI VBESetPowerState(PVOID HwDeviceExtension, ULONG HwId, PVIDEO_POWER_MANAGEMENT VideoPowerControl)
Definition: vbemp.c:652
struct _VIDEO_HW_INITIALIZATION_DATA VIDEO_HW_INITIALIZATION_DATA
BOOLEAN NTAPI VBEInitialize(PVOID HwDeviceExtension)
Definition: vbemp.c:182
PVIDEO_HW_INITIALIZE HwInitialize
Definition: video.h:667
PVIDEO_HW_FIND_ADAPTER HwFindAdapter
Definition: video.h:666
PVIDEO_HW_RESET_HW HwResetHw
Definition: video.h:672
_In_ PNET_PNP_EVENT _In_ PTDI_PNP_CONTEXT _In_ PTDI_PNP_CONTEXT Context2
Definition: tdikrnl.h:1094
BOOLEAN NTAPI VBEResetHw(PVOID DeviceExtension, ULONG Columns, ULONG Rows)
Definition: vbemp.c:566
_In_ PNET_PNP_EVENT _In_ PTDI_PNP_CONTEXT Context1
Definition: tdikrnl.h:1094
VIDEO_ACCESS_RANGE VBEAccessRange[]
Definition: vbemp.c:39
#define NULL
Definition: types.h:112
PVIDEO_ACCESS_RANGE HwLegacyResourceList
Definition: video.h:680

◆ VBEFindAdapter()

VP_STATUS NTAPI VBEFindAdapter ( IN PVOID  HwDeviceExtension,
IN PVOID  HwContext,
IN PWSTR  ArgumentString,
IN OUT PVIDEO_PORT_CONFIG_INFO  ConfigInfo,
OUT PUCHAR  Again 
)

Definition at line 78 of file vbemp.c.

84 {
85  if (VideoPortIsNoVesa())
86  return ERROR_DEV_NOT_EXIST;
87 
88  if (ConfigInfo->Length < sizeof(VIDEO_PORT_CONFIG_INFO))
90 
91  ConfigInfo->VdmPhysicalVideoMemoryAddress = VBEAccessRange[2].RangeStart;
92  ConfigInfo->VdmPhysicalVideoMemoryLength = VBEAccessRange[2].RangeLength;
93  return NO_ERROR;
94 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define NO_ERROR
Definition: dderror.h:5
VPAPI BOOLEAN NTAPI VideoPortIsNoVesa(VOID)
Definition: videoprt.c:1660
VIDEO_ACCESS_RANGE VBEAccessRange[]
Definition: vbemp.c:39
#define ERROR_DEV_NOT_EXIST
Definition: dderror.h:8
ULONG RangeLength
Definition: video.h:216
PHYSICAL_ADDRESS RangeStart
Definition: video.h:215

Referenced by DriverEntry().

◆ VBEGetPowerState()

VP_STATUS NTAPI VBEGetPowerState ( PVOID  HwDeviceExtension,
ULONG  HwId,
PVIDEO_POWER_MANAGEMENT  VideoPowerControl 
)

Definition at line 582 of file vbemp.c.

586 {
587  INT10_BIOS_ARGUMENTS BiosRegisters;
588  PVBE_DEVICE_EXTENSION VBEDeviceExtension =
589  (PVBE_DEVICE_EXTENSION)HwDeviceExtension;
590 
591  if (HwId != DISPLAY_ADAPTER_HW_ID ||
592  VideoPowerControl->Length < sizeof(VIDEO_POWER_MANAGEMENT))
593  return ERROR_INVALID_FUNCTION;
594 
595  /*
596  * Get general power support information.
597  */
598 
599  VideoPortZeroMemory(&BiosRegisters, sizeof(BiosRegisters));
600  BiosRegisters.Eax = VBE_POWER_MANAGEMENT_EXTENSIONS;
601  BiosRegisters.Ebx = 0;
602  BiosRegisters.Edi = 0;
603  BiosRegisters.SegEs = 0;
604  VBEDeviceExtension->Int10Interface.Int10CallBios(
605  VBEDeviceExtension->Int10Interface.Context,
606  &BiosRegisters);
607 
608  if ( VBE_GETRETURNCODE(BiosRegisters.Eax) == VBE_NOT_SUPPORTED)
609  return ERROR_DEV_NOT_EXIST;
610  if (VBE_GETRETURNCODE(BiosRegisters.Eax) != VBE_SUCCESS)
611  return ERROR_INVALID_FUNCTION;
612 
613  /*
614  * Get current power state.
615  */
616 
617  VideoPortZeroMemory(&BiosRegisters, sizeof(BiosRegisters));
618  BiosRegisters.Eax = VBE_POWER_MANAGEMENT_EXTENSIONS;
619  BiosRegisters.Ebx = 0x2;
620  BiosRegisters.Edi = 0;
621  BiosRegisters.SegEs = 0;
622  VBEDeviceExtension->Int10Interface.Int10CallBios(
623  VBEDeviceExtension->Int10Interface.Context,
624  &BiosRegisters);
625 
626  if (VBE_GETRETURNCODE(BiosRegisters.Eax) == VBE_SUCCESS)
627  {
628  VideoPowerControl->DPMSVersion = BiosRegisters.Ebx & 0xFF;
629  switch (BiosRegisters.Ebx >> 8)
630  {
631  case 0: VideoPowerControl->PowerState = VideoPowerOn; break;
632  case 1: VideoPowerControl->PowerState = VideoPowerStandBy; break;
633  case 2: VideoPowerControl->PowerState = VideoPowerSuspend; break;
634  case 4: VideoPowerControl->PowerState = VideoPowerOff; break;
635  case 5: VideoPowerControl->PowerState = VideoPowerOn; break;
636  default: VideoPowerControl->PowerState = VideoPowerUnspecified;
637  }
638 
639  return NO_ERROR;
640  }
641 
642  return ERROR_DEV_NOT_EXIST;
643 }
#define DISPLAY_ADAPTER_HW_ID
Definition: video.h:115
#define ERROR_INVALID_FUNCTION
Definition: dderror.h:6
#define VBE_GETRETURNCODE(x)
Definition: vbemp.h:100
#define NO_ERROR
Definition: dderror.h:5
VPAPI VOID NTAPI VideoPortZeroMemory(IN PVOID Destination, IN ULONG Length)
#define VBE_SUCCESS
Definition: vbemp.h:95
#define VBE_NOT_SUPPORTED
Definition: vbemp.h:97
VIDEO_PORT_INT10_INTERFACE Int10Interface
Definition: vbemp.h:194
#define VBE_POWER_MANAGEMENT_EXTENSIONS
Definition: vbemp.h:62
struct VBE_DEVICE_EXTENSION * PVBE_DEVICE_EXTENSION
OUT PINT10_CALL_BIOS Int10CallBios
Definition: video.h:782
#define ERROR_DEV_NOT_EXIST
Definition: dderror.h:8

Referenced by DriverEntry().

◆ VBEInitialize()

BOOLEAN NTAPI VBEInitialize ( PVOID  HwDeviceExtension)

Definition at line 182 of file vbemp.c.

183 {
184  INT10_BIOS_ARGUMENTS BiosRegisters;
186  PVBE_DEVICE_EXTENSION VBEDeviceExtension =
187  (PVBE_DEVICE_EXTENSION)HwDeviceExtension;
188  ULONG Length;
189  ULONG ModeCount;
190  ULONG SuitableModeCount;
191  USHORT ModeTemp;
192  ULONG CurrentMode;
193  PVBE_MODEINFO VbeModeInfo;
194 
195  if (VideoPortIsNoVesa())
196  {
197  VBEDeviceExtension->Int10Interface.Version = 0;
198  VBEDeviceExtension->Int10Interface.Size = 0;
199  return FALSE;
200  }
201 
202  /*
203  * Get the Int 10 interface that we will use for allocating real
204  * mode memory and calling the video BIOS.
205  */
206 
208  VBEDeviceExtension->Int10Interface.Size = sizeof(VIDEO_PORT_INT10_INTERFACE);
210  HwDeviceExtension,
212  (PINTERFACE)&VBEDeviceExtension->Int10Interface);
213 
214  if (Status != NO_ERROR)
215  {
216  VideoPortDebugPrint(Error, "Failed to get Int 10 service functions (Status %x)\n", Status);
217  return FALSE;
218  }
219 
220  /*
221  * Allocate a bit of memory that will be later used for VBE transport
222  * buffer. This memory must be accessible from V86 mode so it must fit
223  * in the first megabyte of physical memory.
224  */
225 
226  Length = 0x400;
227  Status = VBEDeviceExtension->Int10Interface.Int10AllocateBuffer(
228  VBEDeviceExtension->Int10Interface.Context,
229  &VBEDeviceExtension->TrampolineMemorySegment,
230  &VBEDeviceExtension->TrampolineMemoryOffset,
231  &Length);
232 
233  if (Status != NO_ERROR)
234  {
235  VideoPortDebugPrint(Error, "Failed to allocate virtual memory (Status %x)\n", Status);
236  return FALSE;
237  }
238 
239  /*
240  * Get the VBE general information.
241  */
242 
243  VBEDeviceExtension->Int10Interface.Int10WriteMemory(
244  VBEDeviceExtension->Int10Interface.Context,
245  VBEDeviceExtension->TrampolineMemorySegment,
246  VBEDeviceExtension->TrampolineMemoryOffset,
247  "VBE2",
248  4);
249 
250  VideoPortZeroMemory(&BiosRegisters, sizeof(BiosRegisters));
251  BiosRegisters.Eax = VBE_GET_CONTROLLER_INFORMATION;
252  BiosRegisters.Edi = VBEDeviceExtension->TrampolineMemoryOffset;
253  BiosRegisters.SegEs = VBEDeviceExtension->TrampolineMemorySegment;
254  VBEDeviceExtension->Int10Interface.Int10CallBios(
255  VBEDeviceExtension->Int10Interface.Context,
256  &BiosRegisters);
257 
258  if (VBE_GETRETURNCODE(BiosRegisters.Eax) == VBE_SUCCESS)
259  {
260  VBEDeviceExtension->Int10Interface.Int10ReadMemory(
261  VBEDeviceExtension->Int10Interface.Context,
262  VBEDeviceExtension->TrampolineMemorySegment,
263  VBEDeviceExtension->TrampolineMemoryOffset,
264  &VBEDeviceExtension->VbeInfo,
265  sizeof(VBEDeviceExtension->VbeInfo));
266 
267  /* Verify the VBE signature. */
268  if (VideoPortCompareMemory(VBEDeviceExtension->VbeInfo.Signature, "VESA", 4) != 4)
269  {
270  VideoPortDebugPrint(Error, "No VBE BIOS present\n");
271  return FALSE;
272  }
273 
274  VideoPortDebugPrint(Trace, "VBE BIOS Present (%d.%d, %8ld Kb)\n",
275  VBEDeviceExtension->VbeInfo.Version / 0x100,
276  VBEDeviceExtension->VbeInfo.Version & 0xFF,
277  VBEDeviceExtension->VbeInfo.TotalMemory * 64);
278 
279 #ifdef VBE12_SUPPORT
280  if (VBEDeviceExtension->VbeInfo.Version < 0x102)
281 #else
282  if (VBEDeviceExtension->VbeInfo.Version < 0x200)
283 #endif
284  {
285  VideoPortDebugPrint(Error, "VBE BIOS present, but incompatible version %d.%d\n",
286  VBEDeviceExtension->VbeInfo.Version / 0x100,
287  VBEDeviceExtension->VbeInfo.Version & 0xFF);
288  return FALSE;
289  }
290  }
291  else
292  {
293  VideoPortDebugPrint(Error, "No VBE BIOS found.\n");
294  return FALSE;
295  }
296 
297  /*
298  * Build a mode list here that can be later used by
299  * IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES and IOCTL_VIDEO_QUERY_AVAIL_MODES
300  * calls.
301  */
302 
303  /*
304  * Get the number of supported video modes.
305  *
306  * No need to be map the memory. It's either in the video BIOS memory or
307  * in our trampoline memory. In either case the memory is already mapped.
308  */
309 
310  for (ModeCount = 0; ; ModeCount++)
311  {
312  /* Read the VBE mode number. */
313  VBEDeviceExtension->Int10Interface.Int10ReadMemory(
314  VBEDeviceExtension->Int10Interface.Context,
315  HIWORD(VBEDeviceExtension->VbeInfo.VideoModePtr),
316  LOWORD(VBEDeviceExtension->VbeInfo.VideoModePtr) + (ModeCount << 1),
317  &ModeTemp,
318  sizeof(ModeTemp));
319 
320  /* End of list? */
321  if (ModeTemp == 0xFFFF || ModeTemp == 0)
322  break;
323  }
324 
325  /*
326  * Allocate space for video modes information.
327  */
328 
329  VBEDeviceExtension->ModeInfo =
330  VideoPortAllocatePool(HwDeviceExtension, VpPagedPool, ModeCount * sizeof(VBE_MODEINFO), TAG_VBE);
331  VBEDeviceExtension->ModeNumbers =
332  VideoPortAllocatePool(HwDeviceExtension, VpPagedPool, ModeCount * sizeof(USHORT), TAG_VBE);
333 
334  /*
335  * Get the actual mode infos.
336  */
337 
338  for (CurrentMode = 0, SuitableModeCount = 0;
339  CurrentMode < ModeCount;
340  CurrentMode++)
341  {
342  /* Read the VBE mode number. */
343  VBEDeviceExtension->Int10Interface.Int10ReadMemory(
344  VBEDeviceExtension->Int10Interface.Context,
345  HIWORD(VBEDeviceExtension->VbeInfo.VideoModePtr),
346  LOWORD(VBEDeviceExtension->VbeInfo.VideoModePtr) + (CurrentMode << 1),
347  &ModeTemp,
348  sizeof(ModeTemp));
349 
350  /* Call VBE BIOS to read the mode info. */
351  VideoPortZeroMemory(&BiosRegisters, sizeof(BiosRegisters));
352  BiosRegisters.Eax = VBE_GET_MODE_INFORMATION;
353  BiosRegisters.Ecx = ModeTemp;
354  BiosRegisters.Edi = VBEDeviceExtension->TrampolineMemoryOffset + 0x200;
355  BiosRegisters.SegEs = VBEDeviceExtension->TrampolineMemorySegment;
356  VBEDeviceExtension->Int10Interface.Int10CallBios(
357  VBEDeviceExtension->Int10Interface.Context,
358  &BiosRegisters);
359 
360  /* Read the VBE mode info. */
361  VBEDeviceExtension->Int10Interface.Int10ReadMemory(
362  VBEDeviceExtension->Int10Interface.Context,
363  VBEDeviceExtension->TrampolineMemorySegment,
364  VBEDeviceExtension->TrampolineMemoryOffset + 0x200,
365  VBEDeviceExtension->ModeInfo + SuitableModeCount,
366  sizeof(VBE_MODEINFO));
367 
368  VbeModeInfo = VBEDeviceExtension->ModeInfo + SuitableModeCount;
369 
370  /* Is this mode acceptable? */
371  if (VBE_GETRETURNCODE(BiosRegisters.Eax) == VBE_SUCCESS &&
372  VbeModeInfo->XResolution >= 640 &&
373  VbeModeInfo->YResolution >= 480 &&
374  (VbeModeInfo->MemoryModel == VBE_MEMORYMODEL_PACKEDPIXEL ||
375  VbeModeInfo->MemoryModel == VBE_MEMORYMODEL_DIRECTCOLOR) &&
376  VbeModeInfo->PhysBasePtr != 0)
377  {
378  if (VbeModeInfo->ModeAttributes & VBE_MODEATTR_LINEAR)
379  {
380  /* Bit 15 14 13 12 | 11 10 9 8 | 7 6 5 4 | 3 2 1 0 */
381  // if (ModeTemp & 0x4000)
382  //{
383  VBEDeviceExtension->ModeNumbers[SuitableModeCount] = ModeTemp | 0x4000;
384  SuitableModeCount++;
385  //}
386  }
387 #ifdef VBE12_SUPPORT
388  else
389  {
390  VBEDeviceExtension->ModeNumbers[SuitableModeCount] = ModeTemp;
391  SuitableModeCount++;
392  }
393 #endif
394  }
395  }
396 
397 
398  if (SuitableModeCount == 0)
399  {
400 
401  VideoPortDebugPrint(Warn, "VBEMP: No video modes supported\n");
402  return FALSE;
403  }
404 
405  VBEDeviceExtension->ModeCount = SuitableModeCount;
406 
407  /*
408  * Sort the video mode list according to resolution and bits per pixel.
409  */
410 
411  VBESortModes(VBEDeviceExtension);
412 
413  /*
414  * Print the supported video modes.
415  */
416 
417  for (CurrentMode = 0;
418  CurrentMode < SuitableModeCount;
419  CurrentMode++)
420  {
421  VideoPortDebugPrint(Trace, "%dx%dx%d\n",
422  VBEDeviceExtension->ModeInfo[CurrentMode].XResolution,
423  VBEDeviceExtension->ModeInfo[CurrentMode].YResolution,
424  VBEDeviceExtension->ModeInfo[CurrentMode].BitsPerPixel);
425  }
426 
427  /*
428  * Enumerate our children.
429  */
430  VideoPortEnumerateChildren(HwDeviceExtension, NULL);
431 
432  return TRUE;
433 }
#define VIDEO_PORT_INT10_INTERFACE_VERSION_1
Definition: video.h:127
VPAPI VP_STATUS NTAPI VideoPortQueryServices(IN PVOID HwDeviceExtension, IN VIDEO_PORT_SERVICES ServicesType, IN OUT PINTERFACE Interface)
Definition: services.c:40
USHORT Version
Definition: vbemp.h:110
UCHAR BitsPerPixel
Definition: vbemp.h:147
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
#define TRUE
Definition: types.h:120
UCHAR MemoryModel
Definition: vbemp.h:149
#define VBE_GETRETURNCODE(x)
Definition: vbemp.h:100
USHORT XResolution
Definition: vbemp.h:142
#define NO_ERROR
Definition: dderror.h:5
VPAPI VOID NTAPI VideoPortZeroMemory(IN PVOID Destination, IN ULONG Length)
#define VBE_GET_MODE_INFORMATION
Definition: vbemp.h:47
#define VBE_SUCCESS
Definition: vbemp.h:95
#define FALSE
Definition: types.h:117
OUT PINT10_READ_MEMORY Int10ReadMemory
Definition: video.h:780
VPAPI PVOID NTAPI VideoPortAllocatePool(IN PVOID HwDeviceExtension, IN VP_POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN ULONG Tag)
Definition: resource.c:920
ULONG PhysBasePtr
Definition: vbemp.h:166
#define HIWORD(l)
Definition: vbemp.c:37
#define VBE_MEMORYMODEL_DIRECTCOLOR
Definition: vbemp.h:89
USHORT TrampolineMemorySegment
Definition: vbemp.h:197
VBE_INFO VbeInfo
Definition: vbemp.h:201
#define VBE_GET_CONTROLLER_INFORMATION
Definition: vbemp.h:46
Status
Definition: gdiplustypes.h:24
PVBE_MODEINFO ModeInfo
Definition: vbemp.h:206
Definition: video.h:581
OUT PINT10_ALLOCATE_BUFFER Int10AllocateBuffer
Definition: video.h:778
BOOL Error
Definition: chkdsk.c:66
VPAPI ULONG NTAPI VideoPortCompareMemory(IN PVOID Source1, IN PVOID Source2, IN SIZE_T Length)
USHORT ModeAttributes
Definition: vbemp.h:131
struct _VIDEO_PORT_INT10_INTERFACE VIDEO_PORT_INT10_INTERFACE
#define Trace(x)
Definition: inflate.c:42
VOID FASTCALL VBESortModes(PVBE_DEVICE_EXTENSION DeviceExtension)
Definition: vbemp.c:126
VIDEO_PORT_INT10_INTERFACE Int10Interface
Definition: vbemp.h:194
#define VBE_MODEATTR_LINEAR
Definition: vbemp.h:86
VPAPI BOOLEAN NTAPI VideoPortIsNoVesa(VOID)
Definition: videoprt.c:1660
#define VBE_MEMORYMODEL_PACKEDPIXEL
Definition: vbemp.h:88
unsigned short USHORT
Definition: pedump.c:61
USHORT TrampolineMemoryOffset
Definition: vbemp.h:198
#define LOWORD(l)
Definition: vbemp.c:36
USHORT YResolution
Definition: vbemp.h:143
ULONG VideoModePtr
Definition: vbemp.h:113
#define NULL
Definition: types.h:112
struct VBE_DEVICE_EXTENSION * PVBE_DEVICE_EXTENSION
USHORT * ModeNumbers
Definition: vbemp.h:205
USHORT TotalMemory
Definition: vbemp.h:114
OUT PINT10_WRITE_MEMORY Int10WriteMemory
Definition: video.h:781
unsigned int ULONG
Definition: retypes.h:1
OUT PINT10_CALL_BIOS Int10CallBios
Definition: video.h:782
LONG VP_STATUS
Definition: video.h:153
#define TAG_VBE
Definition: vbemp.h:31
VPAPI VOID __cdecl VideoPortDebugPrint(IN VIDEO_DEBUG_LEVEL DebugPrintLevel, IN PSTR DebugMessage, IN ...)
VPAPI VP_STATUS NTAPI VideoPortEnumerateChildren(IN PVOID HwDeviceExtension, IN PVOID Reserved)
Definition: videoprt.c:1366
CHAR Signature[4]
Definition: vbemp.h:109

Referenced by DriverEntry().

◆ VBEMapVideoMemory()

BOOLEAN FASTCALL VBEMapVideoMemory ( PVBE_DEVICE_EXTENSION  DeviceExtension,
PVIDEO_MEMORY  RequestedAddress,
PVIDEO_MEMORY_INFORMATION  MapInformation,
PSTATUS_BLOCK  StatusBlock 
)

Definition at line 769 of file vbemp.c.

774 {
776  ULONG inIoSpace = VIDEO_MEMORY_SPACE_MEMORY;
777 
778  StatusBlock->Information = sizeof(VIDEO_MEMORY_INFORMATION);
779 
780  if (DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].ModeAttributes &
782  {
783  FrameBuffer.QuadPart =
784  DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].PhysBasePtr;
785  MapInformation->VideoRamBase = RequestedAddress->RequestedVirtualAddress;
786  if (DeviceExtension->VbeInfo.Version < 0x300)
787  {
788  MapInformation->VideoRamLength =
789  DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].BytesPerScanLine *
790  DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].YResolution;
791  }
792  else
793  {
794  MapInformation->VideoRamLength =
795  DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].LinBytesPerScanLine *
796  DeviceExtension->ModeInfo[DeviceExtension->CurrentMode].YResolution;
797  }
798  }
799 #ifdef VBE12_SUPPORT
800  else
801  {
802  FrameBuffer.QuadPart = 0xA0000;
803  MapInformation->VideoRamBase = RequestedAddress->RequestedVirtualAddress;
804  MapInformation->VideoRamLength = 0x10000;
805  }
806 #endif
807 
808  VideoPortMapMemory(DeviceExtension, FrameBuffer,
809  &MapInformation->VideoRamLength, &inIoSpace,
810  &MapInformation->VideoRamBase);
811 
812  MapInformation->FrameBufferBase = MapInformation->VideoRamBase;
813  MapInformation->FrameBufferLength = MapInformation->VideoRamLength;
814 
815  return TRUE;
816 }
USHORT BytesPerScanLine
Definition: vbemp.h:139
USHORT LinBytesPerScanLine
Definition: vbemp.h:171
USHORT Version
Definition: vbemp.h:110
#define TRUE
Definition: types.h:120
PVOID RequestedVirtualAddress
Definition: ntddvdeo.h:275
ULONG PhysBasePtr
Definition: vbemp.h:166
VBE_INFO VbeInfo
Definition: vbemp.h:201
PVBE_MODEINFO ModeInfo
Definition: vbemp.h:206
VPAPI VP_STATUS NTAPI VideoPortMapMemory(IN PVOID HwDeviceExtension, IN PHYSICAL_ADDRESS PhysicalAddress, IN OUT PULONG Length, IN PULONG InIoSpace, IN OUT PVOID *VirtualAddress)
struct _VIDEO_MEMORY_INFORMATION VIDEO_MEMORY_INFORMATION
PVOID FrameBuffer
Definition: xboxvideo.c:28
USHORT ModeAttributes
Definition: vbemp.h:131
#define VBE_MODEATTR_LINEAR
Definition: vbemp.h:86
USHORT YResolution
Definition: vbemp.h:143
unsigned int ULONG
Definition: retypes.h:1
#define VIDEO_MEMORY_SPACE_MEMORY
Definition: video.h:132
ULONG_PTR Information
Definition: video.h:326
USHORT CurrentMode
Definition: vbemp.h:207

Referenced by VBEStartIO().

◆ VBEQueryAvailModes()

BOOLEAN FASTCALL VBEQueryAvailModes ( PVBE_DEVICE_EXTENSION  DeviceExtension,
PVIDEO_MODE_INFORMATION  ReturnedModes,
PSTATUS_BLOCK  StatusBlock 
)

Definition at line 942 of file vbemp.c.

946 {
947  ULONG CurrentModeId;
948  PVIDEO_MODE_INFORMATION CurrentMode;
949  PVBE_MODEINFO CurrentVBEMode;
950 
951  for (CurrentModeId = 0, CurrentMode = ReturnedModes,
952  CurrentVBEMode = DeviceExtension->ModeInfo;
953  CurrentModeId < DeviceExtension->ModeCount;
954  CurrentModeId++, CurrentMode++, CurrentVBEMode++)
955  {
956  VBEQueryMode(DeviceExtension, CurrentMode, CurrentModeId);
957  }
958 
959  StatusBlock->Information =
960  sizeof(VIDEO_MODE_INFORMATION) * DeviceExtension->ModeCount;
961 
962  return TRUE;
963 }
#define TRUE
Definition: types.h:120
PVBE_MODEINFO ModeInfo
Definition: vbemp.h:206
unsigned int ULONG
Definition: retypes.h:1
VOID FASTCALL VBEQueryMode(PVBE_DEVICE_EXTENSION DeviceExtension, PVIDEO_MODE_INFORMATION VideoMode, ULONG VideoModeId)
Definition: vbemp.c:863
struct _VIDEO_MODE_INFORMATION VIDEO_MODE_INFORMATION
ULONG_PTR Information
Definition: video.h:326

Referenced by VBEStartIO().

◆ VBEQueryCurrentMode()

BOOLEAN FASTCALL VBEQueryCurrentMode ( PVBE_DEVICE_EXTENSION  DeviceExtension,
PVIDEO_MODE_INFORMATION  VideoModeInfo,
PSTATUS_BLOCK  StatusBlock 
)

Definition at line 972 of file vbemp.c.

976 {
977  StatusBlock->Information = sizeof(VIDEO_MODE_INFORMATION);
978 
979  VBEQueryMode(
980  DeviceExtension,
981  VideoModeInfo,
982  DeviceExtension->CurrentMode);
983 
984  return TRUE;
985 }
#define TRUE
Definition: types.h:120
VOID FASTCALL VBEQueryMode(PVBE_DEVICE_EXTENSION DeviceExtension, PVIDEO_MODE_INFORMATION VideoMode, ULONG VideoModeId)
Definition: vbemp.c:863
struct _VIDEO_MODE_INFORMATION VIDEO_MODE_INFORMATION
ULONG_PTR Information
Definition: video.h:326
USHORT CurrentMode
Definition: vbemp.h:207

Referenced by VBEStartIO().

◆ VBEQueryMode()

VOID FASTCALL VBEQueryMode ( PVBE_DEVICE_EXTENSION  DeviceExtension,
PVIDEO_MODE_INFORMATION  VideoMode,
ULONG  VideoModeId 
)

Definition at line 863 of file vbemp.c.

867 {
868  PVBE_MODEINFO VBEMode = &DeviceExtension->ModeInfo[VideoModeId];
869  ULONG dpi;
870 
871  VideoMode->Length = sizeof(VIDEO_MODE_INFORMATION);
872  VideoMode->ModeIndex = VideoModeId;
873  VideoMode->VisScreenWidth = VBEMode->XResolution;
874  VideoMode->VisScreenHeight = VBEMode->YResolution;
875  if (DeviceExtension->VbeInfo.Version < 0x300)
876  VideoMode->ScreenStride = VBEMode->BytesPerScanLine;
877  else
878  VideoMode->ScreenStride = VBEMode->LinBytesPerScanLine;
879  VideoMode->NumberOfPlanes = VBEMode->NumberOfPlanes;
880  VideoMode->BitsPerPlane = VBEMode->BitsPerPixel / VBEMode->NumberOfPlanes;
881  VideoMode->Frequency = 1;
882 
883  /* Assume 96DPI and 25.4 millimeters per inch, round to nearest */
884  dpi = 96;
885  VideoMode->XMillimeter = ((ULONGLONG)VBEMode->XResolution * 254 + (dpi * 5)) / (dpi * 10);
886  VideoMode->YMillimeter = ((ULONGLONG)VBEMode->YResolution * 254 + (dpi * 5)) / (dpi * 10);
887 
888  if (VBEMode->BitsPerPixel > 8)
889  {
890  /*
891  * Always report 16bpp modes and not 15bpp mode...
892  */
893  if (VBEMode->BitsPerPixel == 15 && VBEMode->NumberOfPlanes == 1)
894  {
895  VideoMode->BitsPerPlane = 16;
896  }
897 
898  if (DeviceExtension->VbeInfo.Version < 0x300)
899  {
900  VideoMode->NumberRedBits = VBEMode->RedMaskSize;
901  VideoMode->NumberGreenBits = VBEMode->GreenMaskSize;
902  VideoMode->NumberBlueBits = VBEMode->BlueMaskSize;
903  VideoMode->RedMask = ((1 << VBEMode->RedMaskSize) - 1) << VBEMode->RedFieldPosition;
904  VideoMode->GreenMask = ((1 << VBEMode->GreenMaskSize) - 1) << VBEMode->GreenFieldPosition;
905  VideoMode->BlueMask = ((1 << VBEMode->BlueMaskSize) - 1) << VBEMode->BlueFieldPosition;
906  }
907  else
908  {
909  VideoMode->NumberRedBits = VBEMode->LinRedMaskSize;
910  VideoMode->NumberGreenBits = VBEMode->LinGreenMaskSize;
911  VideoMode->NumberBlueBits = VBEMode->LinBlueMaskSize;
912  VideoMode->RedMask = ((1 << VBEMode->LinRedMaskSize) - 1) << VBEMode->LinRedFieldPosition;
913  VideoMode->GreenMask = ((1 << VBEMode->LinGreenMaskSize) - 1) << VBEMode->LinGreenFieldPosition;
914  VideoMode->BlueMask = ((1 << VBEMode->LinBlueMaskSize) - 1) << VBEMode->LinBlueFieldPosition;
915  }
916  }
917  else
918  {
919  VideoMode->NumberRedBits =
920  VideoMode->NumberGreenBits =
921  VideoMode->NumberBlueBits = 6;
922  VideoMode->RedMask =
923  VideoMode->GreenMask =
924  VideoMode->BlueMask = 0;
925  }
926  VideoMode->VideoMemoryBitmapWidth = VBEMode->XResolution;
927  VideoMode->VideoMemoryBitmapHeight = VBEMode->YResolution;
928  VideoMode->AttributeFlags = VIDEO_MODE_GRAPHICS | VIDEO_MODE_COLOR |
930  if (VideoMode->BitsPerPlane <= 8)
931  VideoMode->AttributeFlags |= VIDEO_MODE_PALETTE_DRIVEN;
932  VideoMode->DriverSpecificAttributeFlags = 0;
933 }
USHORT BytesPerScanLine
Definition: vbemp.h:139
USHORT LinBytesPerScanLine
Definition: vbemp.h:171
USHORT Version
Definition: vbemp.h:110
UCHAR BitsPerPixel
Definition: vbemp.h:147
UCHAR RedFieldPosition
Definition: vbemp.h:156
USHORT XResolution
Definition: vbemp.h:142
#define VIDEO_MODE_NO_OFF_SCREEN
Definition: ntddvdeo.h:299
UCHAR LinGreenMaskSize
Definition: vbemp.h:176
UCHAR RedMaskSize
Definition: vbemp.h:155
UCHAR LinBlueFieldPosition
Definition: vbemp.h:179
UCHAR BlueMaskSize
Definition: vbemp.h:159
VBE_INFO VbeInfo
Definition: vbemp.h:201
PVBE_MODEINFO ModeInfo
Definition: vbemp.h:206
#define dpi
Definition: sysparams.c:22
UCHAR LinBlueMaskSize
Definition: vbemp.h:178
uint64_t ULONGLONG
Definition: typedefs.h:67
#define VIDEO_MODE_PALETTE_DRIVEN
Definition: ntddvdeo.h:296
UCHAR LinRedFieldPosition
Definition: vbemp.h:175
UCHAR GreenFieldPosition
Definition: vbemp.h:158
UCHAR BlueFieldPosition
Definition: vbemp.h:160
#define VIDEO_MODE_COLOR
Definition: ntddvdeo.h:294
USHORT YResolution
Definition: vbemp.h:143
UCHAR LinRedMaskSize
Definition: vbemp.h:174
UCHAR GreenMaskSize
Definition: vbemp.h:157
unsigned int ULONG
Definition: retypes.h:1
UCHAR NumberOfPlanes
Definition: vbemp.h:146
UCHAR LinGreenFieldPosition
Definition: vbemp.h:177
struct _VIDEO_MODE_INFORMATION VIDEO_MODE_INFORMATION
#define VIDEO_MODE_GRAPHICS
Definition: ntddvdeo.h:295

Referenced by VBEQueryAvailModes(), and VBEQueryCurrentMode().

◆ VBEQueryNumAvailModes()

BOOLEAN FASTCALL VBEQueryNumAvailModes ( PVBE_DEVICE_EXTENSION  DeviceExtension,
PVIDEO_NUM_MODES  Modes,
PSTATUS_BLOCK  StatusBlock 
)

Definition at line 845 of file vbemp.c.

849 {
850  Modes->NumModes = DeviceExtension->ModeCount;
851  Modes->ModeInformationLength = sizeof(VIDEO_MODE_INFORMATION);
852  StatusBlock->Information = sizeof(VIDEO_NUM_MODES);
853  return TRUE;
854 }
struct _VIDEO_NUM_MODES VIDEO_NUM_MODES
#define TRUE
Definition: types.h:120
static const VBE_MODE Modes[VBE_MODE_COUNT]
Definition: vbe.c:189
struct _VIDEO_MODE_INFORMATION VIDEO_MODE_INFORMATION
ULONG_PTR Information
Definition: video.h:326

Referenced by VBEStartIO().

◆ VBEResetDevice()

BOOLEAN FASTCALL VBEResetDevice ( PVBE_DEVICE_EXTENSION  DeviceExtension,
PSTATUS_BLOCK  StatusBlock 
)

Definition at line 745 of file vbemp.c.

748 {
749  INT10_BIOS_ARGUMENTS BiosRegisters;
750 
751  VideoPortZeroMemory(&BiosRegisters, sizeof(BiosRegisters));
752  BiosRegisters.Eax = VBE_SET_VBE_MODE;
753  BiosRegisters.Ebx = 0x3;
754  DeviceExtension->Int10Interface.Int10CallBios(
755  DeviceExtension->Int10Interface.Context,
756  &BiosRegisters);
757 
758  return VBE_GETRETURNCODE(BiosRegisters.Eax) == VBE_SUCCESS;
759 }
#define VBE_GETRETURNCODE(x)
Definition: vbemp.h:100
VPAPI VOID NTAPI VideoPortZeroMemory(IN PVOID Destination, IN ULONG Length)
#define VBE_SUCCESS
Definition: vbemp.h:95
#define VBE_SET_VBE_MODE
Definition: vbemp.h:48
VIDEO_PORT_INT10_INTERFACE Int10Interface
Definition: vbemp.h:194
OUT PINT10_CALL_BIOS Int10CallBios
Definition: video.h:782

Referenced by VBEStartIO().

◆ VBEResetHw()

BOOLEAN NTAPI VBEResetHw ( PVOID  DeviceExtension,
ULONG  Columns,
ULONG  Rows 
)

Definition at line 566 of file vbemp.c.

570 {
571  /* Return FALSE to let HAL reset the display with INT10 */
572  return FALSE;
573 }
#define FALSE
Definition: types.h:117

Referenced by DriverEntry().

◆ VBESetColorRegisters()

BOOLEAN FASTCALL VBESetColorRegisters ( PVBE_DEVICE_EXTENSION  DeviceExtension,
PVIDEO_CLUT  ColorLookUpTable,
PSTATUS_BLOCK  StatusBlock 
)

Definition at line 997 of file vbemp.c.

1001 {
1002  INT10_BIOS_ARGUMENTS BiosRegisters;
1003  ULONG Entry;
1004  PULONG OutputEntry;
1005  ULONG OutputBuffer[256];
1006 
1007  if (ColorLookUpTable->NumEntries + ColorLookUpTable->FirstEntry > 256)
1008  return FALSE;
1009 
1010  /*
1011  * For VGA compatible adapters program the color registers directly.
1012  */
1013 
1014  if (!(DeviceExtension->VbeInfo.Capabilities & 2))
1015  {
1016  for (Entry = ColorLookUpTable->FirstEntry;
1017  Entry < ColorLookUpTable->NumEntries + ColorLookUpTable->FirstEntry;
1018  Entry++)
1019  {
1021  VideoPortWritePortUchar((PUCHAR)0x03c9, ColorLookUpTable->LookupTable[Entry].RgbArray.Red);
1022  VideoPortWritePortUchar((PUCHAR)0x03c9, ColorLookUpTable->LookupTable[Entry].RgbArray.Green);
1023  VideoPortWritePortUchar((PUCHAR)0x03c9, ColorLookUpTable->LookupTable[Entry].RgbArray.Blue);
1024  }
1025 
1026  return TRUE;
1027  }
1028  else
1029  {
1030  /*
1031  * We can't just copy the values, because we need to swap the Red
1032  * and Blue values.
1033  */
1034 
1035  for (Entry = ColorLookUpTable->FirstEntry,
1036  OutputEntry = OutputBuffer;
1037  Entry < ColorLookUpTable->NumEntries + ColorLookUpTable->FirstEntry;
1038  Entry++, OutputEntry++)
1039  {
1040  *OutputEntry =
1041  (ColorLookUpTable->LookupTable[Entry].RgbArray.Red << 16) |
1042  (ColorLookUpTable->LookupTable[Entry].RgbArray.Green << 8) |
1043  (ColorLookUpTable->LookupTable[Entry].RgbArray.Blue);
1044  }
1045 
1046  DeviceExtension->Int10Interface.Int10WriteMemory(
1047  DeviceExtension->Int10Interface.Context,
1048  DeviceExtension->TrampolineMemorySegment,
1049  DeviceExtension->TrampolineMemoryOffset,
1050  OutputBuffer,
1051  (OutputEntry - OutputBuffer) * sizeof(ULONG));
1052 
1053  VideoPortZeroMemory(&BiosRegisters, sizeof(BiosRegisters));
1054  BiosRegisters.Eax = VBE_SET_GET_PALETTE_DATA;
1055  BiosRegisters.Ebx = 0;
1056  BiosRegisters.Ecx = ColorLookUpTable->NumEntries;
1057  BiosRegisters.Edx = ColorLookUpTable->FirstEntry;
1058  BiosRegisters.Edi = DeviceExtension->TrampolineMemoryOffset;
1059  BiosRegisters.SegEs = DeviceExtension->TrampolineMemorySegment;
1060  DeviceExtension->Int10Interface.Int10CallBios(
1061  DeviceExtension->Int10Interface.Context,
1062  &BiosRegisters);
1063 
1064  return VBE_GETRETURNCODE(BiosRegisters.Eax) == VBE_SUCCESS;
1065  }
1066 }
struct _Entry Entry
Definition: kefuncs.h:629
union VIDEO_CLUT::@3125 LookupTable[1]
#define TRUE
Definition: types.h:120
unsigned char * PUCHAR
Definition: retypes.h:3
USHORT FirstEntry
Definition: ntddvdeo.h:521
#define VBE_GETRETURNCODE(x)
Definition: vbemp.h:100
VIDEO_CLUTDATA RgbArray
Definition: ntddvdeo.h:523
LONG Capabilities
Definition: vbemp.h:112
VPAPI VOID NTAPI VideoPortZeroMemory(IN PVOID Destination, IN ULONG Length)
#define VBE_SUCCESS
Definition: vbemp.h:95
#define FALSE
Definition: types.h:117
USHORT TrampolineMemorySegment
Definition: vbemp.h:197
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
Definition: wdfiotarget.h:859
VBE_INFO VbeInfo
Definition: vbemp.h:201
USHORT NumEntries
Definition: ntddvdeo.h:520
#define VBE_SET_GET_PALETTE_DATA
Definition: vbemp.h:55
VIDEO_PORT_INT10_INTERFACE Int10Interface
Definition: vbemp.h:194
USHORT TrampolineMemoryOffset
Definition: vbemp.h:198
unsigned int * PULONG
Definition: retypes.h:1
OUT PINT10_WRITE_MEMORY Int10WriteMemory
Definition: video.h:781
unsigned int ULONG
Definition: retypes.h:1
OUT PINT10_CALL_BIOS Int10CallBios
Definition: video.h:782
VPAPI VOID NTAPI VideoPortWritePortUchar(IN PUCHAR Port, IN UCHAR Value)
base of all file and directory entries
Definition: entries.h:82

Referenced by VBEStartIO().

◆ VBESetCurrentMode()

BOOLEAN FASTCALL VBESetCurrentMode ( PVBE_DEVICE_EXTENSION  DeviceExtension,
PVIDEO_MODE  RequestedMode,
PSTATUS_BLOCK  StatusBlock 
)

Definition at line 705 of file vbemp.c.

709 {
710  INT10_BIOS_ARGUMENTS BiosRegisters;
711 
712  if (RequestedMode->RequestedMode >= DeviceExtension->ModeCount)
713  {
715  }
716 
717  VideoPortZeroMemory(&BiosRegisters, sizeof(BiosRegisters));
718  BiosRegisters.Eax = VBE_SET_VBE_MODE;
719  BiosRegisters.Ebx = DeviceExtension->ModeNumbers[RequestedMode->RequestedMode];
720  DeviceExtension->Int10Interface.Int10CallBios(
721  DeviceExtension->Int10Interface.Context,
722  &BiosRegisters);
723 
724  if (VBE_GETRETURNCODE(BiosRegisters.Eax) == VBE_SUCCESS)
725  {
726  DeviceExtension->CurrentMode = RequestedMode->RequestedMode;
727  }
728  else
729  {
730  VideoPortDebugPrint(Error, "VBEMP: VBESetCurrentMode failed (%x)\n", BiosRegisters.Eax);
731  DeviceExtension->CurrentMode = -1;
732  }
733 
734  return VBE_GETRETURNCODE(BiosRegisters.Eax) == VBE_SUCCESS;
735 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define VBE_GETRETURNCODE(x)
Definition: vbemp.h:100
VPAPI VOID NTAPI VideoPortZeroMemory(IN PVOID Destination, IN ULONG Length)
ULONG RequestedMode
Definition: ntddvdeo.h:290
#define VBE_SUCCESS
Definition: vbemp.h:95
BOOL Error
Definition: chkdsk.c:66
#define VBE_SET_VBE_MODE
Definition: vbemp.h:48
VIDEO_PORT_INT10_INTERFACE Int10Interface
Definition: vbemp.h:194
USHORT * ModeNumbers
Definition: vbemp.h:205
OUT PINT10_CALL_BIOS Int10CallBios
Definition: video.h:782
VPAPI VOID __cdecl VideoPortDebugPrint(IN VIDEO_DEBUG_LEVEL DebugPrintLevel, IN PSTR DebugMessage, IN ...)
USHORT CurrentMode
Definition: vbemp.h:207

Referenced by VBEStartIO().

◆ VBESetPowerState()

VP_STATUS NTAPI VBESetPowerState ( PVOID  HwDeviceExtension,
ULONG  HwId,
PVIDEO_POWER_MANAGEMENT  VideoPowerControl 
)

Definition at line 652 of file vbemp.c.

656 {
657  INT10_BIOS_ARGUMENTS BiosRegisters;
658  PVBE_DEVICE_EXTENSION VBEDeviceExtension =
659  (PVBE_DEVICE_EXTENSION)HwDeviceExtension;
660 
661  if (HwId != DISPLAY_ADAPTER_HW_ID ||
662  VideoPowerControl->Length < sizeof(VIDEO_POWER_MANAGEMENT) ||
663  VideoPowerControl->PowerState < VideoPowerOn ||
664  VideoPowerControl->PowerState > VideoPowerHibernate)
665  return ERROR_INVALID_FUNCTION;
666 
667  if (VideoPowerControl->PowerState == VideoPowerHibernate)
668  return NO_ERROR;
669 
670  /*
671  * Set current power state.
672  */
673 
674  VideoPortZeroMemory(&BiosRegisters, sizeof(BiosRegisters));
675  BiosRegisters.Eax = VBE_POWER_MANAGEMENT_EXTENSIONS;
676  BiosRegisters.Ebx = 1;
677  BiosRegisters.Edi = 0;
678  BiosRegisters.SegEs = 0;
679  switch (VideoPowerControl->PowerState)
680  {
681  case VideoPowerStandBy: BiosRegisters.Ebx |= 0x100; break;
682  case VideoPowerSuspend: BiosRegisters.Ebx |= 0x200; break;
683  case VideoPowerOff: BiosRegisters.Ebx |= 0x400; break;
684  }
685 
686  VBEDeviceExtension->Int10Interface.Int10CallBios(
687  VBEDeviceExtension->Int10Interface.Context,
688  &BiosRegisters);
689 
690  if (VBE_GETRETURNCODE(BiosRegisters.Eax) == VBE_NOT_SUPPORTED)
691  return ERROR_DEV_NOT_EXIST;
692  if (VBE_GETRETURNCODE(BiosRegisters.Eax) != VBE_SUCCESS)
693  return ERROR_INVALID_FUNCTION;
694 
695  return VBE_SUCCESS;
696 }
#define DISPLAY_ADAPTER_HW_ID
Definition: video.h:115
#define ERROR_INVALID_FUNCTION
Definition: dderror.h:6
#define VBE_GETRETURNCODE(x)
Definition: vbemp.h:100
#define NO_ERROR
Definition: dderror.h:5
VPAPI VOID NTAPI VideoPortZeroMemory(IN PVOID Destination, IN ULONG Length)
#define VBE_SUCCESS
Definition: vbemp.h:95
#define VBE_NOT_SUPPORTED
Definition: vbemp.h:97
VIDEO_PORT_INT10_INTERFACE Int10Interface
Definition: vbemp.h:194
#define VBE_POWER_MANAGEMENT_EXTENSIONS
Definition: vbemp.h:62
struct VBE_DEVICE_EXTENSION * PVBE_DEVICE_EXTENSION
OUT PINT10_CALL_BIOS Int10CallBios
Definition: video.h:782
#define ERROR_DEV_NOT_EXIST
Definition: dderror.h:8

Referenced by DriverEntry().

◆ VBESortModes()

VOID FASTCALL VBESortModes ( PVBE_DEVICE_EXTENSION  DeviceExtension)

Definition at line 126 of file vbemp.c.

127 {
128  BOOLEAN Finished = FALSE;
129  ULONG Pos;
130  int Result;
131  VBE_MODEINFO TempModeInfo;
132  USHORT TempModeNumber;
133 
134  while (!Finished)
135  {
136  Finished = TRUE;
137  for (Pos = 0; Pos < DeviceExtension->ModeCount - 1; Pos++)
138  {
140  DeviceExtension->ModeInfo + Pos,
141  DeviceExtension->ModeInfo + Pos + 1);
142  if (Result > 0)
143  {
144  Finished = FALSE;
145 
147  &TempModeInfo,
148  DeviceExtension->ModeInfo + Pos,
149  sizeof(VBE_MODEINFO));
150  TempModeNumber = DeviceExtension->ModeNumbers[Pos];
151 
153  DeviceExtension->ModeInfo + Pos,
154  DeviceExtension->ModeInfo + Pos + 1,
155  sizeof(VBE_MODEINFO));
156  DeviceExtension->ModeNumbers[Pos] =
157  DeviceExtension->ModeNumbers[Pos + 1];
158 
160  DeviceExtension->ModeInfo + Pos + 1,
161  &TempModeInfo,
162  sizeof(VBE_MODEINFO));
163  DeviceExtension->ModeNumbers[Pos + 1] = TempModeNumber;
164  }
165  }
166  }
167 }
#define TRUE
Definition: types.h:120
ush Pos
Definition: deflate.h:92
#define FALSE
Definition: types.h:117
unsigned char BOOLEAN
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
PVBE_MODEINFO ModeInfo
Definition: vbemp.h:206
static int VBESortModesCallback(PVBE_MODEINFO VbeModeInfoA, PVBE_MODEINFO VbeModeInfoB)
Definition: vbemp.c:103
VPAPI VOID NTAPI VideoPortMoveMemory(IN PVOID Destination, IN PVOID Source, IN ULONG Length)
unsigned short USHORT
Definition: pedump.c:61
USHORT * ModeNumbers
Definition: vbemp.h:205
unsigned int ULONG
Definition: retypes.h:1

Referenced by VBEInitialize().

◆ VBESortModesCallback()

static int VBESortModesCallback ( PVBE_MODEINFO  VbeModeInfoA,
PVBE_MODEINFO  VbeModeInfoB 
)
static

Definition at line 103 of file vbemp.c.

104 {
105  /*
106  * FIXME: Until some reasonable method for changing video modes will
107  * be available we favor more bits per pixel. It should be changed
108  * later.
109  */
110  if (VbeModeInfoA->BitsPerPixel < VbeModeInfoB->BitsPerPixel) return -1;
111  if (VbeModeInfoA->BitsPerPixel > VbeModeInfoB->BitsPerPixel) return 1;
112  if (VbeModeInfoA->XResolution < VbeModeInfoB->XResolution) return -1;
113  if (VbeModeInfoA->XResolution > VbeModeInfoB->XResolution) return 1;
114  if (VbeModeInfoA->YResolution < VbeModeInfoB->YResolution) return -1;
115  if (VbeModeInfoA->YResolution > VbeModeInfoB->YResolution) return 1;
116  return 0;
117 }
UCHAR BitsPerPixel
Definition: vbemp.h:147
USHORT XResolution
Definition: vbemp.h:142
USHORT YResolution
Definition: vbemp.h:143

Referenced by VBESortModes().

◆ VBEStartIO()

BOOLEAN NTAPI VBEStartIO ( PVOID  HwDeviceExtension,
PVIDEO_REQUEST_PACKET  RequestPacket 
)

Definition at line 442 of file vbemp.c.

445 {
446  BOOLEAN Result;
447 
448  RequestPacket->StatusBlock->Status = ERROR_INVALID_FUNCTION;
449 
450  switch (RequestPacket->IoControlCode)
451  {
453  if (RequestPacket->InputBufferLength < sizeof(VIDEO_MODE))
454  {
455  RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER;
456  return TRUE;
457  }
459  (PVBE_DEVICE_EXTENSION)HwDeviceExtension,
460  (PVIDEO_MODE)RequestPacket->InputBuffer,
461  RequestPacket->StatusBlock);
462  break;
463 
466  (PVBE_DEVICE_EXTENSION)HwDeviceExtension,
467  RequestPacket->StatusBlock);
468  break;
469 
471  if (RequestPacket->OutputBufferLength < sizeof(VIDEO_MEMORY_INFORMATION) ||
472  RequestPacket->InputBufferLength < sizeof(VIDEO_MEMORY))
473  {
474  RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER;
475  return TRUE;
476  }
478  (PVBE_DEVICE_EXTENSION)HwDeviceExtension,
479  (PVIDEO_MEMORY)RequestPacket->InputBuffer,
480  (PVIDEO_MEMORY_INFORMATION)RequestPacket->OutputBuffer,
481  RequestPacket->StatusBlock);
482  break;
483 
485  if (RequestPacket->InputBufferLength < sizeof(VIDEO_MEMORY))
486  {
487  RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER;
488  return TRUE;
489  }
491  (PVBE_DEVICE_EXTENSION)HwDeviceExtension,
492  (PVIDEO_MEMORY)RequestPacket->InputBuffer,
493  RequestPacket->StatusBlock);
494  break;
495 
497  if (RequestPacket->OutputBufferLength < sizeof(VIDEO_NUM_MODES))
498  {
499  RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER;
500  return TRUE;
501  }
503  (PVBE_DEVICE_EXTENSION)HwDeviceExtension,
504  (PVIDEO_NUM_MODES)RequestPacket->OutputBuffer,
505  RequestPacket->StatusBlock);
506  break;
507 
509  if (RequestPacket->OutputBufferLength <
510  ((PVBE_DEVICE_EXTENSION)HwDeviceExtension)->ModeCount * sizeof(VIDEO_MODE_INFORMATION))
511  {
512  RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER;
513  return TRUE;
514  }
516  (PVBE_DEVICE_EXTENSION)HwDeviceExtension,
517  (PVIDEO_MODE_INFORMATION)RequestPacket->OutputBuffer,
518  RequestPacket->StatusBlock);
519  break;
520 
522  if (RequestPacket->InputBufferLength < sizeof(VIDEO_CLUT) ||
523  RequestPacket->InputBufferLength <
524  (((PVIDEO_CLUT)RequestPacket->InputBuffer)->NumEntries * sizeof(ULONG)) +
525  FIELD_OFFSET(VIDEO_CLUT, LookupTable))
526  {
527  RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER;
528  return TRUE;
529  }
531  (PVBE_DEVICE_EXTENSION)HwDeviceExtension,
532  (PVIDEO_CLUT)RequestPacket->InputBuffer,
533  RequestPacket->StatusBlock);
534  break;
535 
537  if (RequestPacket->OutputBufferLength < sizeof(VIDEO_MODE_INFORMATION))
538  {
539  RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER;
540  return TRUE;
541  }
543  (PVBE_DEVICE_EXTENSION)HwDeviceExtension,
544  (PVIDEO_MODE_INFORMATION)RequestPacket->OutputBuffer,
545  RequestPacket->StatusBlock);
546  break;
547 
548  default:
549  RequestPacket->StatusBlock->Status = ERROR_INVALID_FUNCTION;
550  return FALSE;
551  }
552 
553  if (Result)
554  RequestPacket->StatusBlock->Status = NO_ERROR;
555 
556  return TRUE;
557 }
#define ERROR_INVALID_FUNCTION
Definition: dderror.h:6
#define TRUE
Definition: types.h:120
#define IOCTL_VIDEO_RESET_DEVICE
Definition: ntddvdeo.h:137
#define IOCTL_VIDEO_MAP_VIDEO_MEMORY
Definition: ntddvdeo.h:104
ULONG InputBufferLength
Definition: video.h:333
#define NO_ERROR
Definition: dderror.h:5
#define IOCTL_VIDEO_QUERY_CURRENT_MODE
Definition: ntddvdeo.h:113
#define IOCTL_VIDEO_SET_CURRENT_MODE
Definition: ntddvdeo.h:152
#define FALSE
Definition: types.h:117
BOOLEAN FASTCALL VBEQueryAvailModes(PVBE_DEVICE_EXTENSION DeviceExtension, PVIDEO_MODE_INFORMATION ReturnedModes, PSTATUS_BLOCK StatusBlock)
Definition: vbemp.c:942
unsigned char BOOLEAN
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
ULONG OutputBufferLength
Definition: video.h:335
#define IOCTL_VIDEO_UNMAP_VIDEO_MEMORY
Definition: ntddvdeo.h:179
BOOLEAN FASTCALL VBEResetDevice(PVBE_DEVICE_EXTENSION DeviceExtension, PSTATUS_BLOCK StatusBlock)
Definition: vbemp.c:745
BOOLEAN FASTCALL VBESetColorRegisters(PVBE_DEVICE_EXTENSION DeviceExtension, PVIDEO_CLUT ColorLookUpTable, PSTATUS_BLOCK StatusBlock)
Definition: vbemp.c:997
BOOLEAN FASTCALL VBEUnmapVideoMemory(PVBE_DEVICE_EXTENSION DeviceExtension, PVIDEO_MEMORY VideoMemory, PSTATUS_BLOCK StatusBlock)
Definition: vbemp.c:826
VP_STATUS Status
Definition: video.h:323
#define IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES
Definition: ntddvdeo.h:122
#define IOCTL_VIDEO_QUERY_AVAIL_MODES
Definition: ntddvdeo.h:107
BOOLEAN FASTCALL VBEQueryCurrentMode(PVBE_DEVICE_EXTENSION DeviceExtension, PVIDEO_MODE_INFORMATION VideoModeInfo, PSTATUS_BLOCK StatusBlock)
Definition: vbemp.c:972
BOOLEAN FASTCALL VBEMapVideoMemory(PVBE_DEVICE_EXTENSION DeviceExtension, PVIDEO_MEMORY RequestedAddress, PVIDEO_MEMORY_INFORMATION MapInformation, PSTATUS_BLOCK StatusBlock)
Definition: vbemp.c:769
BOOLEAN FASTCALL VBESetCurrentMode(PVBE_DEVICE_EXTENSION DeviceExtension, PVIDEO_MODE RequestedMode, PSTATUS_BLOCK StatusBlock)
Definition: vbemp.c:705
BOOLEAN FASTCALL VBEQueryNumAvailModes(PVBE_DEVICE_EXTENSION DeviceExtension, PVIDEO_NUM_MODES Modes, PSTATUS_BLOCK StatusBlock)
Definition: vbemp.c:845
PSTATUS_BLOCK StatusBlock
Definition: video.h:331
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
unsigned int ULONG
Definition: retypes.h:1
#define IOCTL_VIDEO_SET_COLOR_REGISTERS
Definition: ntddvdeo.h:149
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10

Referenced by DriverEntry().

◆ VBEUnmapVideoMemory()

BOOLEAN FASTCALL VBEUnmapVideoMemory ( PVBE_DEVICE_EXTENSION  DeviceExtension,
PVIDEO_MEMORY  VideoMemory,
PSTATUS_BLOCK  StatusBlock 
)

Definition at line 826 of file vbemp.c.

830 {
831  VideoPortUnmapMemory(DeviceExtension, VideoMemory->RequestedVirtualAddress,
832  NULL);
833  return TRUE;
834 }
#define TRUE
Definition: types.h:120
PVOID RequestedVirtualAddress
Definition: ntddvdeo.h:275
VPAPI VP_STATUS NTAPI VideoPortUnmapMemory(IN PVOID HwDeviceExtension, IN OUT PVOID VirtualAddress, IN HANDLE ProcessHandle)
#define NULL
Definition: types.h:112

Referenced by VBEStartIO().

Variable Documentation

◆ VBEAccessRange

VIDEO_ACCESS_RANGE VBEAccessRange[]
Initial value:
=
{
{ {{0x3b0}}, 0x3bb - 0x3b0 + 1, 1, 1, 0 },
{ {{0x3c0}}, 0x3df - 0x3c0 + 1, 1, 1, 0 },
{ {{0xa0000}}, 0x20000, 0, 1, 0 },
}

Definition at line 39 of file vbemp.c.

Referenced by DriverEntry(), and VBEFindAdapter().