📄 driver.c
字号:
TRACEDRVINFO_ENTRY(RealizeBrush),
TRACEDRVINFO_ENTRY(DitherColor),
TRACEDRVINFO_ENTRY(StrokePath),
TRACEDRVINFO_ENTRY(FillPath),
TRACEDRVINFO_ENTRY(StrokeAndFillPath),
TRACEDRVINFO_ENTRY(Paint),
TRACEDRVINFO_ENTRY(BitBlt),
TRACEDRVINFO_ENTRY(TransparentBlt),
TRACEDRVINFO_ENTRY(CopyBits),
TRACEDRVINFO_ENTRY(StretchBlt),
TRACEDRVINFO_ENTRY(StretchBltROP),
TRACEDRVINFO_ENTRY(SetPalette),
TRACEDRVINFO_ENTRY(TextOut),
TRACEDRVINFO_ENTRY(Escape),
TRACEDRVINFO_ENTRY(DrawEscape),
TRACEDRVINFO_ENTRY(QueryFont),
TRACEDRVINFO_ENTRY(QueryFontTree),
TRACEDRVINFO_ENTRY(QueryFontData),
TRACEDRVINFO_ENTRY(SetPointerShape),
TRACEDRVINFO_ENTRY(MovePointer),
TRACEDRVINFO_ENTRY(LineTo),
TRACEDRVINFO_ENTRY(SendPage),
TRACEDRVINFO_ENTRY(StartPage),
TRACEDRVINFO_ENTRY(EndDoc),
TRACEDRVINFO_ENTRY(StartDoc),
TRACEDRVINFO_ENTRY(GetGlyphMode),
TRACEDRVINFO_ENTRY(Synchronize),
TRACEDRVINFO_ENTRY(SaveScreenBits),
TRACEDRVINFO_ENTRY(GetModes),
TRACEDRVINFO_ENTRY(Free),
TRACEDRVINFO_ENTRY(DestroyFont),
TRACEDRVINFO_ENTRY(QueryFontCaps),
TRACEDRVINFO_ENTRY(LoadFontFile),
TRACEDRVINFO_ENTRY(UnloadFontFile),
TRACEDRVINFO_ENTRY(FontManagement),
TRACEDRVINFO_ENTRY(QueryTrueTypeTable),
TRACEDRVINFO_ENTRY(QueryTrueTypeOutline),
TRACEDRVINFO_ENTRY(GetTrueTypeFile),
TRACEDRVINFO_ENTRY(QueryFontFile),
TRACEDRVINFO_ENTRY(QueryAdvanceWidths),
TRACEDRVINFO_ENTRY(SetPixelFormat),
TRACEDRVINFO_ENTRY(DescribePixelFormat),
TRACEDRVINFO_ENTRY(SwapBuffers),
TRACEDRVINFO_ENTRY(StartBanding),
TRACEDRVINFO_ENTRY(NextBand),
TRACEDRVINFO_ENTRY(GetDirectDrawInfo),
TRACEDRVINFO_ENTRY(EnableDirectDraw),
TRACEDRVINFO_ENTRY(DisableDirectDraw),
TRACEDRVINFO_ENTRY(QuerySpoolType),
TRACEDRVINFO_ENTRY(GradientFill),
TRACEDRVINFO_ENTRY(SynchronizeSurface),
TRACEDRVINFO_ENTRY(AlphaBlend)
};
PTRACEDRVINFO
FindTraceInfo(unsigned Index)
{
unsigned i;
for (i = 0; i < sizeof(TraceDrvInfo) / sizeof(TRACEDRVINFO); i++)
{
if (TraceDrvInfo[i].Index == Index)
{
return TraceDrvInfo + i;
}
}
return NULL;
}
#define DRIVER_FUNCTION(function) \
case INDEX_Drv##function: \
FindTraceInfo(INDEX_Drv##function)->DrvRoutine = DED->pdrvfn[i].pfn; \
*(PVOID*)&DF->function = &Trace##function; \
break
#else
#define DRIVER_FUNCTION(function) \
case INDEX_Drv##function: \
*(PVOID*)&DF->function = DED->pdrvfn[i].pfn; \
break
#endif
BOOL DRIVER_BuildDDIFunctions(PDRVENABLEDATA DED,
PDRIVER_FUNCTIONS DF)
{
BEGIN_FUNCTION_MAP();
DRIVER_FUNCTION(EnablePDEV);
DRIVER_FUNCTION(CompletePDEV);
DRIVER_FUNCTION(DisablePDEV);
DRIVER_FUNCTION(EnableSurface);
DRIVER_FUNCTION(DisableSurface);
DRIVER_FUNCTION(AssertMode);
DRIVER_FUNCTION(Offset);
DRIVER_FUNCTION(ResetPDEV);
DRIVER_FUNCTION(DisableDriver);
DRIVER_FUNCTION(CreateDeviceBitmap);
DRIVER_FUNCTION(DeleteDeviceBitmap);
DRIVER_FUNCTION(RealizeBrush);
DRIVER_FUNCTION(DitherColor);
DRIVER_FUNCTION(StrokePath);
DRIVER_FUNCTION(FillPath);
DRIVER_FUNCTION(StrokeAndFillPath);
DRIVER_FUNCTION(Paint);
DRIVER_FUNCTION(BitBlt);
DRIVER_FUNCTION(TransparentBlt);
DRIVER_FUNCTION(CopyBits);
DRIVER_FUNCTION(StretchBlt);
DRIVER_FUNCTION(StretchBltROP);
DRIVER_FUNCTION(SetPalette);
DRIVER_FUNCTION(TextOut);
DRIVER_FUNCTION(Escape);
DRIVER_FUNCTION(DrawEscape);
DRIVER_FUNCTION(QueryFont);
DRIVER_FUNCTION(QueryFontTree);
DRIVER_FUNCTION(QueryFontData);
DRIVER_FUNCTION(SetPointerShape);
DRIVER_FUNCTION(MovePointer);
DRIVER_FUNCTION(LineTo);
DRIVER_FUNCTION(SendPage);
DRIVER_FUNCTION(StartPage);
DRIVER_FUNCTION(EndDoc);
DRIVER_FUNCTION(StartDoc);
DRIVER_FUNCTION(GetGlyphMode);
DRIVER_FUNCTION(Synchronize);
DRIVER_FUNCTION(SaveScreenBits);
DRIVER_FUNCTION(GetModes);
DRIVER_FUNCTION(Free);
DRIVER_FUNCTION(DestroyFont);
DRIVER_FUNCTION(QueryFontCaps);
DRIVER_FUNCTION(LoadFontFile);
DRIVER_FUNCTION(UnloadFontFile);
DRIVER_FUNCTION(FontManagement);
DRIVER_FUNCTION(QueryTrueTypeTable);
DRIVER_FUNCTION(QueryTrueTypeOutline);
DRIVER_FUNCTION(GetTrueTypeFile);
DRIVER_FUNCTION(QueryFontFile);
DRIVER_FUNCTION(QueryAdvanceWidths);
DRIVER_FUNCTION(SetPixelFormat);
DRIVER_FUNCTION(DescribePixelFormat);
DRIVER_FUNCTION(SwapBuffers);
DRIVER_FUNCTION(StartBanding);
DRIVER_FUNCTION(NextBand);
DRIVER_FUNCTION(GetDirectDrawInfo);
DRIVER_FUNCTION(EnableDirectDraw);
DRIVER_FUNCTION(DisableDirectDraw);
DRIVER_FUNCTION(QuerySpoolType);
DRIVER_FUNCTION(GradientFill);
DRIVER_FUNCTION(SynchronizeSurface);
DRIVER_FUNCTION(AlphaBlend);
END_FUNCTION_MAP();
return TRUE;
}
typedef LONG VP_STATUS;
typedef VP_STATUS (STDCALL *PMP_DRIVERENTRY)(PVOID, PVOID);
PFILE_OBJECT DRIVER_FindMPDriver(ULONG DisplayNumber)
{
OBJECT_ATTRIBUTES ObjectAttributes;
WCHAR DeviceNameBuffer[20];
UNICODE_STRING DeviceName;
IO_STATUS_BLOCK Iosb;
HANDLE DisplayHandle;
NTSTATUS Status;
PFILE_OBJECT VideoFileObject;
swprintf(DeviceNameBuffer, L"\\??\\DISPLAY%d", DisplayNumber + 1);
RtlInitUnicodeString(&DeviceName, DeviceNameBuffer);
InitializeObjectAttributes(&ObjectAttributes,
&DeviceName,
0,
NULL,
NULL);
Status = ZwOpenFile(&DisplayHandle,
FILE_ALL_ACCESS,
&ObjectAttributes,
&Iosb,
0,
FILE_SYNCHRONOUS_IO_ALERT);
if (NT_SUCCESS(Status))
{
Status = ObReferenceObjectByHandle(DisplayHandle,
FILE_READ_DATA | FILE_WRITE_DATA,
IoFileObjectType,
KernelMode,
(PVOID *)&VideoFileObject,
NULL);
ZwClose(DisplayHandle);
}
if (!NT_SUCCESS(Status))
{
DPRINT1("Unable to connect to miniport (Status %lx)\n", Status);
DPRINT1("Perhaps the miniport wasn't loaded?\n");
return(NULL);
}
return VideoFileObject;
}
BOOL DRIVER_UnregisterDriver(LPCWSTR Name)
{
PGRAPHICS_DRIVER Driver = NULL;
if (Name)
{
if (DriverList != NULL)
{
if (!_wcsicmp(DriverList->Name, Name))
{
Driver = DriverList;
DriverList = DriverList->Next;
}
else
{
Driver = DriverList;
while (Driver->Next && _wcsicmp(Driver->Name, Name))
{
Driver = Driver->Next;
}
}
}
}
else
{
if (GenericDriver != NULL)
{
Driver = GenericDriver;
GenericDriver = NULL;
}
}
if (Driver != NULL)
{
ExFreePool(Driver->Name);
ExFreePool(Driver);
return TRUE;
}
else
{
return FALSE;
}
}
INT DRIVER_ReferenceDriver (LPCWSTR Name)
{
GRAPHICS_DRIVER *Driver = DriverList;
while (Driver && Name)
{
DPRINT( "Comparing %S to %S\n", Driver->Name, Name );
if (!_wcsicmp( Driver->Name, Name))
{
return ++Driver->ReferenceCount;
}
Driver = Driver->Next;
}
DPRINT( "Driver %S not found to reference, generic count: %d\n", Name, GenericDriver->ReferenceCount );
assert( GenericDriver != 0 );
return ++GenericDriver->ReferenceCount;
}
INT DRIVER_UnreferenceDriver (LPCWSTR Name)
{
GRAPHICS_DRIVER *Driver = DriverList;
while (Driver && Name)
{
DPRINT( "Comparing %S to %S\n", Driver->Name, Name );
if (!_wcsicmp( Driver->Name, Name))
{
return --Driver->ReferenceCount;
}
Driver = Driver->Next;
}
DPRINT( "Driver '%S' not found to dereference, generic count: %d\n", Name, GenericDriver->ReferenceCount );
assert( GenericDriver != 0 );
return --GenericDriver->ReferenceCount;
}
/* EOF */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -