⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 driver.c

📁 这是一个开放源代码的与WINNT/WIN2K/WIN2003兼容的操作系统
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -