DC(device context)是一个图形对象、图形属性和影响图形输出的集合结构体。CreateDC函数用给定名称为指定的设备创建设备环境。CreateDC一般用于创建打印机的设备环境,也可以用来得到屏幕(硬件屏幕,而不是窗口的客户区)的设备环境。请小心使用这个函数,因为它允许应用程序在屏幕上任何位置绘图,而不仅仅是在窗口的边界内。请用GetDC或BeginPaint来获取屏幕窗口的设备环境。
#001 HDC
#002 WINAPI
#003 CreateDCW (
#004 LPCWSTR lpwszDriver,
#005 LPCWSTR lpwszDevice,
#006 LPCWSTR lpwszOutput,
#007 CONST
DEVMODEW *lpInitData
#008 )
#009 {
#010
#011 return
IntCreateDICW ( lpwszDriver,
#012 lpwszDevice,
#013 lpwszOutput,
#014 (PDEVMODEW) lpInitData,
#015 0 );
#016 }
lpwszDriver是指向空值结尾的字符串的指针,字符串说明设备驱动程序的文件名。比如“DISPLAY”指的是显示器驱动程序,而“WINSPOOL”就是指打印驱动程序。
lpwszDevice是批向空值结尾的字符串的指针,字符串指定了正在使用的专用输出设备的名称,比如打印管理程序名称。
lpwszOutput是没有使用参数,一般设置为NULL。
lpInitData是指向结构包含了设备驱动程序的设备专用初始化数据。设置为NULL时,就使用系统默认的初始化参数。
下面接着来分析函数IntCreateDICW的代码:
#001 HDC
#002 FASTCALL
#003 IntCreateDICW ( LPCWSTR lpwszDriver,
#004 LPCWSTR lpwszDevice,
#005 LPCWSTR lpwszOutput,
#006 PDEVMODEW lpInitData,
#007 ULONG iType )
#008 {
#009 UNICODE_STRING Device, Output;
#010 HDC hDC = NULL;
#011 BOOL Display = FALSE, Default = TRUE;
#012 ULONG UMdhpdev = 0;
#013
#014 HANDLE hspool = NULL;
#015
加载打印驱动程序。
#016 if ( !ghSpooler &&
!LoadTheSpoolerDrv())
#017 {
#018 DPRINT1("WinSpooler.Drv Did not
load!\n");
#019 }
#020 else
#021 {
#022 DPRINT("WinSpooler.Drv Loaded! hMod
-> 0x%x\n", ghSpooler);
#023 }
#024
根据设备名称判断获取什么样的设备。
#025 if ((!lpwszDevice) && (!lpwszDriver))
#026 {
设置缺省设备名称。
#027 Default = FALSE; // Ask Win32k to set Default device.
#028 Display = TRUE; // Most likely to be DISPLAY.
#029 }
#030 else
#031 {
#032 if ((lpwszDevice) &&
(wcslen(lpwszDevice) != 0)) // First
#033 {
判断是否获取显示设备。
#034 if (!_wcsnicmp(lpwszDevice,
L"\\\\.\\DISPLAY",11)) Display = TRUE;
#035 RtlInitUnicodeString(&Device,
lpwszDevice);
#036 }
#037 else
#038 {
#039 if (lpwszDriver) // Second
#040 {
#041 if ((!_wcsnicmp(lpwszDriver,
L"DISPLAY",7)) ||
#042 (!_wcsnicmp(lpwszDriver,
L"\\\\.\\DISPLAY",11))) Display = TRUE;
#043 RtlInitUnicodeString(&Device,
lpwszDriver);
#044 }
#045 }
#046 }
#047
#048 if (lpwszOutput)
RtlInitUnicodeString(&Output, lpwszOutput);
#049
#050 if (!Display)
#051 {
#052 //Handle Print device or something else.
#053 DPRINT1("Not a DISPLAY device!
%wZ\n", &Device);
#054 }
#055
调用WIN32K内核NtGdiOpenDCW函数打开设备。
#056
hDC = NtGdiOpenDCW( (Default ?
&Device : NULL),
#057 (PDEVMODEW) lpInitData,
#058 (lpwszOutput ?
&Output : NULL),
#059 iType, // DCW 0 and ICW 1.
#060 Display,
#061 hspool,
#062 (PVOID) NULL, // NULL for now.
#063 (PVOID) &UMdhpdev );
#064 #if 0
#065 // Handle something other than a normal dc
object.
#066 if (GDI_HANDLE_GET_TYPE(hDC) !=
GDI_OBJECT_TYPE_DC)
#067 {
#068 PDC_ATTR Dc_Attr;
#069 PLDC pLDC;
#070
#071 GdiGetHandleUserData((HGDIOBJ) hDC,
GDI_OBJECT_TYPE_DC, (PVOID) &Dc_Attr);
#072
#073 pLDC = LocalAlloc(LMEM_ZEROINIT,
sizeof(LDC));
#074
#075 Dc_Attr->pvLDC = pLDC;
#076 pLDC->hDC = hDC;
#077 pLDC->iType = LDC_LDC; // 1 (init)
local DC, 2 EMF LDC
#078 DbgPrint("DC_ATTR Allocated ->
0x%x\n",Dc_Attr);
#079 }
#080 #endif
返回DC给应用程序。
#081 return hDC;
#082 }
分享到:
相关推荐
ReactOS-0.3.3源码是一款开源操作系统项目,旨在构建一个与Microsoft Windows系统高度兼容的免费替代品。这个项目对于那些希望了解操作系统工作原理,尤其是Windows内核机制的开发者和研究者来说,是一个宝贵的资源...
ReactOS是一款开源、免费的操作系统,致力于实现与微软Windows NT系列操作系统高度兼容。这款系统采用微内核架构,由全球的志愿者开发者共同维护和开发。"reactos可调试光盘映像"指的是专为开发和调试目的设计的...
ReactOS源代码是开源项目ReactOS的核心组成部分,它旨在实现一个与Microsoft Windows操作系统高度兼容的免费和开放源代码操作系统。这个项目始于1996年,由一群对Windows内核工作原理感兴趣的开发者发起,目标是提供...
ReactOS-0.3.14源代码是一个重要的开源项目,旨在实现与Windows NT系列操作系统高度兼容的自由软件。这个项目的核心目标是提供一个与Windows系统底层行为相似的开源环境,使得用户和开发者可以在不依赖Microsoft ...
这个版本的VMware虚拟机文件(ReactOS-0.3.13-VMware)包含了所有必要的组件,包括ReactOS操作系统映像以及VMware Workstation Player或Player Pro的配置设置,以便用户可以直接启动并运行ReactOS。文件名中的...
ReactOS是一个开源、免费的操作系统项目,旨在实现与Microsoft Windows高度兼容。它的源代码是学习Windows操作系统底层工作原理以及软件开发的重要资源。ReactOS的开发始于1996年,目标是提供一个与Windows NT系列...
ReactOS是一个开源、免费的操作系统项目,其目标是创建一个与Windows NT家族(包括NT4.0、2000、XP和2003)高度兼容的替代品。这个项目始于1996年,旨在提供一个与微软Windows类似的用户体验,同时保持底层操作系统...
ReactOS是一个开源项目,旨在实现一个与Microsoft Windows操作系统兼容的自由软件。它的目标是提供一个与Windows NT内核类似的环境,允许Windows应用程序和驱动程序在ReactOS上无缝运行。 在开发和维护ReactOS的...
ReactOS键盘切换程序,简称KBSwitch,是ReactOS操作系统中的一个重要组件,它负责管理和实现系统小托盘区域的键盘布局切换功能。ReactOS是一个开源、免费的操作系统,旨在实现与微软Windows系统的高度兼容性。...
ReactOS是一个开源操作系统项目,旨在实现与微软Windows操作系统兼容的免费和开放源代码替代品。ReactOS-0317-CLT2015-Source这个压缩包包含了ReactOS在2015年3月17日版本的源代码。这个版本的源代码对于开发者和...
ReactOS项目致力于为大家开发一个免费而且完全兼容 Microsoft Windows XP 的操作系统。ReactOS 旨在通过使用类似构架和提供完整公共接口实现与 NT 以及 XP 操作系统二进制下的应用程序和驱动设备的完全兼容。 ...
ReactOS是一个开源、免费的操作系统项目,旨在实现与微软Windows操作系统高度兼容。它的目标是创建一个与Windows NT内核相似的系统,使得软件开发者和用户可以在ReactOS上运行原本为Windows设计的应用程序,无需进行...
ReactOS是一个开源、免费的操作系统项目,旨在实现与Microsoft Windows操作系统兼容。它的源码提供了深入理解Windows内核工作原理的机会,对于操作系统开发者、驱动程序编写者以及对底层系统有兴趣的人员来说,是一...
ReactOS是一个开源操作系统,旨在与Microsoft Windows兼容。在ReactOS中,`Rundll`是实现Windows兼容性的重要组成部分,它允许程序加载和执行DLL(动态链接库)中的函数。`Rundll32.exe`是Windows系统中的一个实用...
ReactOS是一个旨在创建自由及开源的操作系统的项目,其主要目标是实现对Microsoft Windows的高度兼容性。这意味着除了用户界面的相似之外,ReactOS还必须能够运行大量为Windows设计的软件和硬件驱动。为了达到这一...
本书《Windows内核情景分析-采用开源代码ReactOS(下册)》是一本深入探讨Windows操作系统内核的专著,作者采用了开源操作系统ReactOS的源代码作为分析材料,对Windows内核的结构、功能、算法和实现进行了详细的解剖...
ReactOS-0.4.11-src.zip是一个包含ReactOS 0.4.11源代码的压缩包,该项目是一个开放源代码的操作系统,旨在实现与Microsoft Windows的高度兼容性。这个压缩包对于开发者、学生以及对操作系统底层工作原理感兴趣的人...
ReactOS 是一个开源的、免费的操作系统项目,旨在实现与微软Windows NT内核系列操作系统(如Windows 2000, XP, Vista, 7等)的高度兼容。ReactOS-0.3.13-REL-src(1).zip 文件是一个包含ReactOS 0.3.13版本源代码的...
ReactOS是一个开源、免费的操作系统项目,旨在实现与Microsoft Windows的源代码级兼容性。它的设计目标是提供一个与Windows NT内核家族相媲美的、符合用户和开发者期望的环境,但并不依赖于任何专有技术。ReactOS的...
ReactOS是一个开源、免费的操作系统,致力于实现与微软Windows NT系列操作系统高度兼容。ReactOS-0.4.7-PressKit是ReactOS项目为0.4.7版本发布准备的媒体资料包,主要包含了用于宣传和报道ReactOS 0.4.7版本更新的...