reactos操作系统实现(189)

DCdevice context)是一个图形对象、图形属性和影响图形输出的集合结构体。CreateDC函数用给定名称为指定的设备创建设备环境。CreateDC一般用于创建打印机的设备环境,也可以用来得到屏幕(硬件屏幕,而不是窗口的客户区)的设备环境。请小心使用这个函数,因为它允许应用程序在屏幕上任何位置绘图,而不仅仅是在窗口的边界内。请用GetDCBeginPaint来获取屏幕窗口的设备环境。

#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  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
上册共分为10部分,这是第1部分 Windows内核情景分析(上册).part01.rar 基本信息 作者: 毛德操 出版社:电子工业出版社 ISBN:9787121081149 上架时间:2009-5-25 出版日期:2009 年5月 开本:16开 页码:1465 版次:1-1 所属分类:计算机 > 操作系统 > Windows 内容简介回到顶部↑ 本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构、功能、算法与具体实现。全书从“内存管理”、“进程”、“进程间通信”、“设备驱动”等多个方面进行分析介绍,所有的分析都有ReactOS的源代码(以及部分由微软公开的源代码)作为依据,使读者能深入理解Windows内核的方方面面,也可以使读者的软件开发能力和水平得到提高。. 本书可供大学有关专业的高年级学生和研究生用做教学参考,也可供广大的软件工程师,特别是从事系统软件研发的工程师用于工作参考或用做进修教材。... 目录回到顶部↑ 上 册. 第1章 概述 1 1.1 Windows操作系统发展简史 1 1.2 用户空间和系统空间 3 1.3 Windows内核 4 1.4 开源项目ReactOS及其代码 9 1.5 Windows内核函数的命名 10 第2章 系统调用 12 2.1 内核与系统调用 12 2.2 系统调用的内核入口KiSystemService() 22 2.3 系统调用的函数跳转 29 2.4 系统调用的返回 32 2.5 快速系统调用 35 2.6 从内核中发起系统调用 42 第3章 内存管理 44 3.1 内存区间的动态分配 47 3.1.1 内核对用户空间的管理 48 3.1.2 内核对于物理页面的管理 60 3.1.3 虚存页面的映射 67 3.1.4 Hyperspace的临时映射 78 .3.1.5 系统空间的映射 86 3.1.6 系统调用NtAllocateVirtualMemory() 90 3.2 页面异常 97 3.3 页面的换出 107 3.4 共享映射区(Section) 115 3.5 系统空间的缓冲区管理 133 第4章 对象管理 136 4.1 对象与对象目录 136 4.2 对象类型 148 4.3 句柄和句柄表 162 4.4 对象的创建 169 4.5 几个常用的内核函数 179 4.5.1 ObReferenceObjectByHandle() 179 4.5.2 ObReferenceObjectByPointer() 187 4.5.3 ObpLookupEntryDirectory() 188 4.5.4 ObpLookupObjectName() 192 4.5.5 ObOpenObjectByName() 209 4.5.6 ObReferenceObjectByName() 213 4.5.7 ObDereferenceObject() 214 4.6 对象的访问控制 218 4.7 句柄的遗传和继承 218 4.8 系统调用NtDuplicateObject() 223 4.9 系统调用NtClose() 233 第5章 进程与线程 241 5.1 概述 241 5.2 Windows进程的用户空间 253 5.3 系统调用NtCreateProcess() 273 5.4 系统调用NtCreateThread() 284 5.5 Windows的可执行程序映像 300 5.6 Windows的进程创建和映像装入 305 5.7 Windows DLL的装入和连接 329 5.8 Windows的APC机制 358 5.9 Windows线程的调度和切换 381 5.9.1 x86系统结构与线程切换 382 5.9.2 几个重要的数据结构 385 5.9.3 线程的切换 388 5.9.4 线程的调度 395 5.10 线程和进程的优先级 409 5.11 线程本地存储TLS 421 5.12 进程挂靠 434 5.13 Windows的跨进程操作 442 5.14 Windows线程间的相互作用 450 第6章 进程间通信 467 6.1 概述 467 6.2 共享内存区(Section).. 469 6.3 线程的等待/唤醒机制 470 6.4 信号量(Semaphore) 499 6.5 互斥门(Mutant) 505 6.6 事件(Event) 512 6.7 命名管道(Named Pipe)和信插(Mailslot) 516 6.8 本地过程调用(LPC) 521 6.9 视窗报文

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值