173 lines
4.1 KiB
C
173 lines
4.1 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 2000 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
modeset.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This is the modeset code for the headless miniport driver.
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
kernel mode only
|
|||
|
|
|||
|
Notes:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "dderror.h"
|
|||
|
#include "devioctl.h"
|
|||
|
#include "miniport.h"
|
|||
|
|
|||
|
#include "ntddvdeo.h"
|
|||
|
#include "video.h"
|
|||
|
#include "headless.h"
|
|||
|
|
|||
|
#if defined(ALLOC_PRAGMA)
|
|||
|
#pragma alloc_text(PAGE,HeadlessQueryAvailableModes)
|
|||
|
#pragma alloc_text(PAGE,HeadlessQueryNumberOfAvailableModes)
|
|||
|
#endif
|
|||
|
|
|||
|
VP_STATUS
|
|||
|
HeadlessQueryAvailableModes(
|
|||
|
PVIDEO_MODE_INFORMATION ModeInformation,
|
|||
|
ULONG ModeInformationSize,
|
|||
|
PULONG OutputSize
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine returns the list of all available available modes on the
|
|||
|
card.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
ModeInformation - Pointer to the output buffer supplied by the user.
|
|||
|
This is where the list of all valid modes is stored.
|
|||
|
|
|||
|
ModeInformationSize - Length of the output buffer supplied by the user.
|
|||
|
|
|||
|
OutputSize - Pointer to a buffer in which to return the actual size of
|
|||
|
the data in the buffer. If the buffer was not large enough, this
|
|||
|
contains the minimum required buffer size.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
ERROR_INSUFFICIENT_BUFFER if the output buffer was not large enough
|
|||
|
for the data being returned.
|
|||
|
|
|||
|
NO_ERROR if the operation completed successfully.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
PVIDEO_MODE_INFORMATION videoModes = ModeInformation;
|
|||
|
ULONG i;
|
|||
|
|
|||
|
//
|
|||
|
// Find out the size of the data to be put in the buffer and return
|
|||
|
// that in the status information (whether or not the information is
|
|||
|
// there). If the buffer passed in is not large enough return an
|
|||
|
// appropriate error code.
|
|||
|
//
|
|||
|
|
|||
|
if (ModeInformationSize < (*OutputSize =
|
|||
|
NumVideoModes * sizeof(VIDEO_MODE_INFORMATION)) ) {
|
|||
|
|
|||
|
return ERROR_INSUFFICIENT_BUFFER;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// For each mode supported by the card, store the mode characteristics
|
|||
|
// in the output buffer.
|
|||
|
//
|
|||
|
|
|||
|
for (i = 0; i < NumVideoModes; i++, videoModes++) {
|
|||
|
|
|||
|
videoModes->Length = sizeof(VIDEO_MODE_INFORMATION);
|
|||
|
videoModes->ModeIndex = i;
|
|||
|
videoModes->VisScreenWidth = ModesHeadless[i].hres;
|
|||
|
videoModes->VisScreenHeight = ModesHeadless[i].vres;
|
|||
|
videoModes->NumberOfPlanes = 1;
|
|||
|
videoModes->BitsPerPlane = 4;
|
|||
|
videoModes->Frequency = 60;
|
|||
|
videoModes->XMillimeter = 320; // temporary hardcoded constant
|
|||
|
videoModes->YMillimeter = 240; // temporary hardcoded constant
|
|||
|
videoModes->NumberRedBits = 6;
|
|||
|
videoModes->NumberGreenBits = 6;
|
|||
|
videoModes->NumberBlueBits = 6;
|
|||
|
videoModes->RedMask = 0;
|
|||
|
videoModes->GreenMask = 0;
|
|||
|
videoModes->BlueMask = 0;
|
|||
|
videoModes->AttributeFlags = VIDEO_MODE_COLOR | VIDEO_MODE_GRAPHICS |
|
|||
|
VIDEO_MODE_PALETTE_DRIVEN | VIDEO_MODE_MANAGED_PALETTE;
|
|||
|
}
|
|||
|
|
|||
|
return NO_ERROR;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
VP_STATUS
|
|||
|
HeadlessQueryNumberOfAvailableModes(
|
|||
|
PVIDEO_NUM_MODES NumModes,
|
|||
|
ULONG NumModesSize,
|
|||
|
PULONG OutputSize
|
|||
|
)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
This routine returns the number of available modes for this particular
|
|||
|
video card.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
NumModes - Pointer to the output buffer supplied by the user. This is
|
|||
|
where the number of modes is stored.
|
|||
|
|
|||
|
NumModesSize - Length of the output buffer supplied by the user.
|
|||
|
|
|||
|
OutputSize - Pointer to a buffer in which to return the actual size of
|
|||
|
the data in the buffer.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
ERROR_INSUFFICIENT_BUFFER if the output buffer was not large enough
|
|||
|
for the data being returned.
|
|||
|
|
|||
|
NO_ERROR if the operation completed successfully.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
//
|
|||
|
// Find out the size of the data to be put in the the buffer and return
|
|||
|
// that in the status information (whether or not the information is
|
|||
|
// there). If the buffer passed in is not large enough return an
|
|||
|
// appropriate error code.
|
|||
|
//
|
|||
|
|
|||
|
if (NumModesSize < (*OutputSize = sizeof(VIDEO_NUM_MODES)) ) {
|
|||
|
|
|||
|
return ERROR_INSUFFICIENT_BUFFER;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Store the number of modes into the buffer.
|
|||
|
//
|
|||
|
|
|||
|
NumModes->NumModes = NumVideoModes;
|
|||
|
NumModes->ModeInformationLength = sizeof(VIDEO_MODE_INFORMATION);
|
|||
|
|
|||
|
return NO_ERROR;
|
|||
|
|
|||
|
}
|