E-COM-NET
首页
在线工具
Layui镜像站
SUI文档
联系我们
推荐频道
Java
PHP
C++
C
C#
Python
Ruby
go语言
Scala
Servlet
Vue
MySQL
NoSQL
Redis
CSS
Oracle
SQL Server
DB2
HBase
Http
HTML5
Spring
Ajax
Jquery
JavaScript
Json
XML
NodeJs
mybatis
Hibernate
算法
设计模式
shell
数据结构
大数据
JS
消息中间件
正则表达式
Tomcat
SQL
Nginx
Shiro
Maven
Linux
《windows核心编程》
《
Windows核心编程
系列》十四谈谈默认堆和自定义堆
堆前面我们说过堆非常适合分配大量的小型数据。使用堆可以让程序员专心解决手头的问题,而不必理会分配粒度和页面边界之类的事情。因此堆是管理链表和数的最佳方式。但是堆进行内存分配和释放时的速度比其他方式都慢,而且无法对物理存储器的调拨和撤销调拨进行控制。什么是堆?在系统内部堆就是一块预定的地址空间区域。刚开始堆的大部分页面都没有调拨物理存储器。随着我们不断的从堆中分配内存,堆管理器会给堆调拨越来越多的物
iteye_21199
·
2020-07-04 19:03
2020年3月23日-3月29日(本周4小时,共60小时,剩9940小时)
废话不多说3月23日计划:0,工作半小时+1至7半小时轮番进行1,dx10一节2,GLSL视频一个3,
WINDOWS核心编程
一节4,操作系统视频教程(多线程视频教程)一个5,ue4视频教程一个,并与师兄交流学习心得
directx3d_beginner
·
2020-07-01 22:13
验证第二个1万小时定律
关于XP没有QueryFullProcessImageName的问题(in ProcessInfo)
2011-03-29记得以前看过一点儿
windows核心编程
,现在又拿起来重新看看,哎,基本上都忘了。简单看了看进程那部分,自己想写点关于进程的小程序,不过后来发现原来书配了源代码的。
RFC2008
·
2020-07-01 12:45
Windows核心编程
-笔记
1.每个进程都有自己专有的地址空间,当进程中的各线程运行时,他们只能访问属于该进程的内存,线程看不到且无法访问其他进程的内存。地址空间只是一个内存地址区间,需要把物理存储器分配或映射到相应的地址空间,才能够正常读写数据。2.进程地址空间的划分及使用空指针赋值区00000000-0000FFFF禁止访问,帮助程序员捕获空指针的赋值。用户模式分区00010000-7FFEFFFF进程大部分数据保存之处
LawGeorge
·
2020-07-01 11:20
杂类
【
Windows核心编程
笔记】第十一章 线程池的使用
线程池开销并不小,所以使用之前先想好你是否真的需要它以异步方式调用函数定义函数:VOIDNTAPISimpleCallback(…….)TrySubmitThreadpoolCallback让线程池中的线程执行该函数考虑到性能和内存使用,如果大量提交,建议创建工作项一次,分多次提交CreateThreadpoolWork创建一个工作项SubmitThreadpoolWork向线程池提交一个请求Wa
半雨微凉丶
·
2020-06-30 14:12
学习笔记
Windows编程
ANSI unicode utf-8 以及 WideCharToMultiByte和MultiByteToWideChar函数的用法
这两个系统函数在使用时需要指定代码页,在实际应用过程中遇到乱码问题,然后重新阅读《
Windows核心编程
》,总结出正确的用法。WideCharToMultiByte的代码页用来标记与新转换的字符串相
SnailWalking
·
2020-06-30 14:07
windows开发
Windows核心编程
笔记第十一篇(线程同步,旋转锁,高速缓存行)
为什么需要线程同步:为了避免在一线程对以数据操作过程中(一进行一部分操作但是尚未完成)CPU时间片耗尽当前线程挂起时,另一进城对修改不完全的数据进行操作。如下面这段书上的代码所示://Defineaglobalvariable.longg_x=0;DWORDWINAPIThreadFunc1(PVOIDpvParam){g_x++;return(0);}DWORDWINAPIThreadFunc2
zc1016
·
2020-06-30 12:35
读书笔记
计算机阅读列表
TheHiddenLanguageofComputerHardwareandSoftware(《编码的奥秘》)ComputerSystem:AProgrammer’sPerspective(《深入理解计算机系统》)/WindowsviaC/C++(《
Windows
孙传武和他的六便士
·
2020-06-30 01:46
windows核心编程
---异常处理程序与软件异常
CPU抛出的异常是硬件异常,操作系统和应用程序抛出的异常是软件异常。硬件或软件异常被抛出时,可用:__try{}__except(exceptionfilter//异常过滤程序){//异常处理程序}一个__try后,只需跟一个__except或__finally(终止处理程序)。-异常过滤程序,异常处理程序异常过滤程序,异常处理程序主要有系统实现。只在__try块中发生异常,才会转入__excep
raindayinrain
·
2020-06-29 23:14
System-Windows
Windows核心编程
(十一)I/O完成端口
1、串行模型:一个线程等待一个客户(通常是通过网络)发出请求,当请求到达时,线程会被唤醒并对客户请求进行处理。并发模型:一个线程等待一个客户请求,并创建一个新的线程来处理请求。2、完成端口背后的理论是并发运行的线程数量必须有一个上限。由于太多的线程将会导致系统花费很大的代价在各个线程cpu上下文进行切换。使用并发模型与创建进程相比开销要低很多,但是也需要为每个客户请求创建一个新的线程。这开销仍然很
笨蛋糕
·
2020-06-29 20:23
Windows核心编程
Windows核心编程
读书笔记——
Windows核心编程
(15)在应用程序中使用虚拟内存
微软的Windows提供了三种机制对内存进行操控1虚拟内存(最适合管理大型对象数组或大型结构数组)2内存映射文件(大型数据流/文件,共享数据)3堆(大量的小型对象)预订地址空间区域VirtualAllocPVOIDVirtualAlloc(PVOIDpvAddress,//内存地址,传NULL则由系统指定位置,必须始终位于进程的用户分区中,如果不是分配粒度的整数倍,则下去整到64K的整数倍。SIZ
王林森
·
2020-06-29 19:22
wls的笔记
核心编程
Windows核心编程
之核心总结(第四章 进程(二))(2018.6.17)
学习目标上一节我们了解了进程、入口函数和进程实例句柄等内容,在进入进程的命令行学习前,有一个全局变量初始化问题需要测试一波。本节的学习目标如下:1.测试C/C++运行库启动函数初始化哪些全局变量2.进程的命令行3.进程的环境变量4.进程的当前驱动器和目录5.判断系统版本测试启动函数初始化哪些全局变量我们知道C/C++运行库的启动函数会做一些事后再调用我们的入口函数,而入口函数的参数都是在调用前就初
weixin_34405332
·
2020-06-28 18:26
《
Windows核心编程
》之六 --线程的同步(2)
7.等待定时器内核对象等待定时器内核对象是在某个时间或某个规定的时间间隔内发出自己的信号通知内核对象。它们通常是用在:在某人时间执行某个操作。创建定时器内核对象:HANDLECreateWaitableTimer( PSECURITY_ATTRIBUTESpsa, BOOLfManualReset,PCTSTRpszName);关于参数以前都介绍过了,在此不述。创建定时器后,定时器是在未通知状
weixin_33724046
·
2020-06-28 04:22
Windows核心编程
笔记(十九) SEH结构化异常处理_未处理异常及向量化异常
UnhandledExceptionFilter函数详解BaseProcessStart伪代码(Kernel32内部)voidBaseProcessStart(PVOIDlpfnEntryPoint)//参数为线程函数的入口地址{DWORDretValue;DWORDcurrentESP;DWORDexceptionCode;currentESP=ESP;//lpfnEntryPoint被try/
wangpengk7788
·
2020-06-27 13:52
Windows核心编程
笔记
Windows核心编程
笔记(二十一) 硬件输入模型和局部输入状态
28.1原始输入线程(RIT)(1)图解硬件输入模型①当操作系统初始化时会创建一个原始输入线程(RIT)和系统硬件消息队列(SHIQ),这两者是系统硬件输入模型的核心。当SHIQ队列有硬件(如鼠标或键盘)消息时,RIT被唤醒,并将事件添加到用户线程的VIQ队列。②任何时刻,只能有一个用户线程与RIT连接,该线程被称为前景线程。相对于其他线程创建的窗口,前景线程创建的窗口主要当前正在与用户交互的窗口
wangpengk7788
·
2020-06-27 13:52
Windows核心编程
笔记
Windows核心编程
笔记(十三)Windwos内存体系结构
Windows内存管理机制,底层最核心的东西是分页机制。分页机制使每个进程有自己的4G虚拟空间,使我们可以用虚拟线性地址来跑程序。每个进程有自己的工作集,工作集中的数据可以指明虚拟线性地址对应到怎样的物理地址。进程切换的过程也就是工作集切换的过程,如MattPietrek所说如果只给出虚拟地址而不给出工作集,那这个地址是无意义的。(见图一)在分页机制所形成的线性地址空间里,我们对内存进行进一步划分
wangpengk7788
·
2020-06-27 13:20
Windows核心编程
笔记
Windows核心编程
笔记(七) 线程调度 优先级 关联性
首先线程与系统时钟间隔参见http://blog.csdn.net/wangpengk7788/article/details/54287947在抢占式多任务操作系统中,线程的运行是有限制的,系统会调度一个线程在一个时间块内占用CPU,在时间到了之后将线程的上下文(CONTEXT结构,保存线程切换前的CPU个寄存器的值)保存到线程内核对象中,从另一个可调度线程的CONTEXT中获取属于它的CPU各
wangpengk7788
·
2020-06-27 13:20
Windows核心编程
笔记
Windows核心编程
笔记(一) 错误处理
在Windows编程中我们调用各种WindowsAPI函数来使用系统提供的各种基础支持,这些API函数并不是总是都能够预期完成所规定的工作的,有些时候会因为各种原因导致函数调用失败,比如传给函数的参数不正确,调用函数的权限不够,请求的资源系统暂时分配不了等等。大多时候根据函数的返回值,可以判断函数是否失败Windows除了使用返回值标识函数执行情况,外还引入了错误代码机制。返回值指出函数已发生一个
wangpengk7788
·
2020-06-27 13:20
Windows核心编程
笔记
Windows核心编程
之线程
线程组成两部分:1.一个线程的内核对象,操作系统用它管理线程。2.一个线程栈,用于维护线程执行时所需的所有函数参数和局部变量。何时创建线程?举例:操作系统的WindowsIndexingServices,磁盘碎片整理程序等,都是使用多线程进行性能优化的例子。线程内幕:线程的上下文context对象,用于线程的调度,如下这张图详细的介绍,线程内核对象以及线程的地址空间,从而知道线程执行原理。线程内核
w1012747007
·
2020-06-27 11:52
Windows
Windows核心编程
读书笔记3——线程(3) 正确编写C/C++运行库下的线程
如何在C/C++运行库下正确的启用新线程由于C/C++的历史早于线程的出现,因此C/C++的函数并不都是线程安全的。如全局变量errno等。这就需要一种解决方案。一种方法是利用属于每个线程的数据块,该数据块不会被线程共享,而只能够用于线程自己,这样类似errno的情况便迎刃而解。此外,C/C++运行库针对特定函数做了改写,使其能够进行线程同步。如malloc函数,由于不能够多线程同时执行内存堆分配
slunlun
·
2020-06-27 06:49
Windows程序开发
Windows核心编程
史上最全的C++/游戏开发面试问题总结(三)—— 操作系统下篇
参考书籍:《OperatingSystems:InternalsandDesignPrinciples》《操作系统的设计与实现》《现代操作系统》《深入理解计算机系统》《
Windows核心编程
》《深入理解
Jerish_C
·
2020-06-27 05:08
Windows核心编程
--Windows内存体系结构
Windows内存体系结构1、进程的虚拟地址空间每个进程都有自己的虚拟地址空间。虚拟地址空间为用户编程时用的地址,用户程序地址的集合为逻辑地址空间。它的编制是从0开始的。32位进程的地址空间是4GB,因为32位指针可以表示从Ox00000000到OxFFFFFFFF之间的任一值。指针在这个范围内副高可进程的4GB地址空间。每个进程都有自己的地址空间,当线程运行的时候,只能访问自己进程的内存。如何将
小瑾
·
2020-06-26 17:48
windows核心编程
虚拟内存
【Windows】线程漫谈——线程栈(二)
预定和调拨内存的时机:《
windows核心编程
》对预定和调拨内存的时机并没有讲的很清楚,查阅了很多资料,觉得下面这个解释是合理的:int*p=newint();会内部调用malloc分配内存。
suhuaiqiang_janlay
·
2020-06-26 15:30
Wondows
try catch throw用法
要防止因为异常产生的内存泄漏,可以使用智能指针,也可以用__try{}__finally{}《
Windows核心编程
》一书第23~25章是很好的参考资料。
Gary-Kung
·
2020-06-26 12:29
win32
SDK
fun
编译器
byte
优化
exception
access
Windows核心编程
:内存体系结构
作者:shenzi链接:http://blog.csdn.net/shenzi
Windows核心编程
:内存体系结构1.进程的虚拟地址空间每个进程都有自己的虚拟地址空间。
shenzi
·
2020-06-26 09:45
windows编程
Windows核心编程
:线程调度
作者:shenzi链接:http://blog.csdn.net/shenzi
Windows核心编程
:线程调度1.线程的挂起和恢复在线程的内核对象中有一个值表示线程的挂起计数。
shenzi
·
2020-06-26 09:13
windows编程
《
Windows核心编程
》读书笔记七 线程调度,优先级和关联性
第七章线程调度,优先级和关联性本章内容7.1线程的挂起和恢复7.2进程的挂起和恢复7.3睡眠7.4切换到另一个线程7.5在超线程CPU上切换到另一个线程7.6线程的执行时间7.7在实际上下文中谈CONTEXT结构7.8线程优先级7.9从抽象角度看优先级7.10优先级编程7.11关联性CONTEXT反应了线程上一次执行时CPU寄存器的状态。大约每间隔20ms(GetSystemTimeAdjustm
sesiria
·
2020-06-26 08:45
Windows
《
Windows核心编程
》读书笔记一 错误处理
第一章错误处理所有范例代码可以从http://www.wintellect.com/books.aspx下载(改网址已经不可用)网盘:https://pan.baidu.com/s/1nv1HxxB本章内容定义自己的错误代码ErrorShow实例程序常见的Windows函数返回值的数据类型VOID这个函数不可能失败。只有极少数windows函数的返回类型为VOIDBOOL如果函数失败,返回0.否则
sesiria
·
2020-06-26 08:45
Windows
《
Windows核心编程
》读书笔记十一 Windows线程池
第11章Windows线程池本章内容11.1情形1:以异步方式调用函数11.2情形2:每隔一段时间调用一个函数11.3情形3:在内核对象触发时调用一个函数11.4情形4:在异步I/O请求完成时调用一个函数11.5回调函数的终止操作Windows系统的线程池函数允许我们做这些事情:1)以异步方式来调用一个函数2)每隔一段时间调用一个函数3)当内核对象触发的时候调用一个函数4)当异步I/O请求完成时调
sesiria
·
2020-06-26 08:45
Windows
【
WIndows核心编程
学习笔记】线程栈
系统在用户进程的地址空间中预订区域的情况有:分配进程环境块、分配线程环境块以及分配线程栈。下面主要讲解线程栈的分配。当系统创建线程的时候,会为线程栈预订一块地址空间区域(每个线程都有自己的栈),并给区域调拨一些物理存储器。在默认情况下:预订1MB的地址空间,调拨2个页面。在构建应用程序时开发人员可以通过两种方法来改变该默认值:(1)使用MicrosoftC++编译器的/F选项。(2)使用Micro
rongwenbin
·
2020-06-26 06:45
C/C++
操作系统
基于事件的重叠IO模型
关于异步IO机制可以参考:《
Windows核心编程
系列》十谈谈同步设备IO与异步设备IO之异步设备I
Barry__
·
2020-06-26 05:55
windows网络编程
windows核心编程
-杨波-专题视频课程
windows核心编程
—422人已学习课程介绍SDK软件开发工具包(SoftwareDevelopmentKit,SDK)一般是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、作业系统等创建应用软件的开发工具的集合
妞妞niuniu
·
2020-06-25 11:18
视频教程
windows核心编程
-如何获取进程命令行信息
如何获取其他进程命令行信息每一个进程都有一个PEB数据块(PEB:ProcessEnvironmentBlock),这个进程环境块信息(如下结构体),每个PEB中有_RTL_USER_PROCESS_PARAMETERS结构体,是一个指针,指向一个结构体,这个结构体里面有一个CommandLine命令行参数。所以要获得其他进程的命令行参数CommandLine,首先要获得其他进程的PEB结构体,通
poppy飞翔
·
2020-06-25 01:02
windows核心编程
windows核心编程
-C/C++标准库与多线程
1、由于历史原因,标准C/C++库在开始时并没有正对多线程做考虑(比如使用了一些全局变量),在VC++中对标准库做了多线程安全扩展2、要利用这些扩展就需要使用VC++扩展库提供的创建线程函数_beginthread,_beginthradEx等函数来替代Windows的原始API--CreateThread3、因为这些创建函数在内部考虑了多线程安全初始化C/C++标准库,使用这些替代函数创建的线程
poppy飞翔
·
2020-06-25 01:02
windows核心编程
WINDOWS核心编程
学习心得--线程调度
线程的主要有五种状态1.新建状态:新创建了一个线程对象。2.就绪状态:线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。3.运行状态:就绪状态的线程获取了CPU,执行程序代码。4.阻塞状态:阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。5.挂起状态:一般是指被挂起
QQ51931373
·
2020-06-24 23:12
杂项
《
Windows核心编程
系列》十三谈谈在应用程序中使用虚拟内存
《
Windows核心编程
系列》十三谈谈在应用程序中使用虚拟内存在应用程序中使用虚拟内存Windows提供了以下三种机制对内存进行操控:一:虚拟内存。最适合来管理大型对象数据或大型结构数组。
weekbo
·
2020-06-24 21:38
WINDOWS核心编程
——线程基础
线程是进程中可以被系统(作业系统)调度的最小单位。线程可以使用进程中的任何资源,他自身只包含有必要的独立的线程栈和寄存器。线程的设计是为了提高CPU的使用率:当系统同时拥有多个CPU时让每个CPU都执行一个指令流在同一时间进行两个工作。当进程只拥有一个CPU的执行时间时,若执行流中发生阻塞(等待)而阻塞时不需要CPU执行任何指令,这时候可以让CPU去执行其他指令称之为线程切换,在阻塞解除又具备了指
pokeyode
·
2020-06-24 20:19
Win笔记
WINDOWS核心编程
——DLL基础和实操
与将所有的指令通过链接器在生成exe的时候都链接在一起并安排好各个指令的位置不同,windows还提供了动态链接(DLL)技术。一般情况下我们会处于以下原因采用DLL技术:1.扩展了应用程序的特性。DLL可以被动态地载入到进程的地址空间中。2.简化了项目管理,可以让不同的开发团队管理不同的模块。3.有助于节省内存。一个dll可被多个程序共享。多个程序调用同一个dll内的同一个函数时,系统却只需将该
pokeyode
·
2020-06-24 20:19
Win笔记
WINDOWS核心编程
——线程同步
线程同步主要涉及两个问题:1.不同的线程使用同一个资源但要保证资源完整有效。2.不同的线程之间的互相协作完成一个工作。所有的线程同步无外乎就是高效的(不浪费CPU)的实现这两个目的。同样我们需要了解在多线程环境下为什么会出现这两个问题和这两个问题如何表现:1.刨除软件设计本身的原因,在多线程环境下CPU的高速缓存行在多线程环境下引入了之前未考虑到的复杂性,对于在不同CPU中执行的线程使用同一资源(
pokeyode
·
2020-06-24 20:19
Win笔记
windows核心编程
之进程&线程
在前一章总结内核对象时提到过进程内核对象和线程内核对象,但是对进程线程以及进程内核对象和线程内核对象在其中的意义还不是很清楚,下面就详细说说进程与线程,进程内核对象和线程内核对象,进程与进程内核对象,线程与线程内核对象之间的千丝万缕的联系。在开始之前,提出两个面试中经常遇到的简单问题:(1)进程与线程的联系和区别(2)在多线程编程中为什么要考虑同步互斥操作?两个问题的解答在本章最后给出。1、进程与
miraclewgf
·
2020-06-24 15:05
多线程编程
Windows核心编程
笔记(7)----内核模式下的线程同步
1、内核对象同步与用户模式下同步对比使用内核对象的唯一缺点就是性能,调用内核对象函数时,调用线程必须从用户模式切换到内核模式,这种切换是相当耗时的。内核对象(进程、线程、作业)要么处于触发态,要么处于未触发状态。进程内核对象在创建时总是处于未触发状态,当进程终止时,操作系统会自动使进程内核对象变成触发状态。当进程内核对象处于触发状态后,将永远保持这种状态,再也不能变回未触发状态。2、等待内核对象W
疯狂-的-蜗牛
·
2020-06-24 14:00
Windows核心编程
逆向学习路线(推荐书籍)
位汇编语言程序设计》.罗云彬.第三版;《windows高级编程》;《C++反汇编与逆向分析技术解密》;《windows编程循序渐进》《程序员密码学》建议看的书:《0Day安全:软件漏洞分析技术》《C语言深度剖析》《
windows
找个毛线
·
2020-06-24 04:53
Windows系统线程池+利用windows自带的线程池
这两天一直在看《
Windows核心编程
》,学到了不少东西,但是同别的英文经典一样,中文版经常让我感觉不知所云,我很不喜欢书中的例子都是用C++来写,并且都有图形界面,这阻碍了
csdn程序猿
·
2020-06-24 02:13
c++
Delphi下深入
Windows核心编程
目錄第1章DLL与数据共享1.1关于DLL1.1.1DLL的结构1.1.2DLL数据作用范围1.2内存映像1.2.1创建映像文件1.2.2打开映像文件1.2.3映射到本进程中1.2.4关闭内存映射1.2.5两个EXE文件共享内存数据块1.2.6两个DLL文件共享内存数据块1.316位和32位进程间传送消息1.3.1全局原子实现数据共享1.3.2WM_COPYDATA消息实现进程间数据共享第2章钩子
iteye_4537
·
2020-06-23 19:03
Windows核心编程
- API HOOK应用
#
Windows核心编程
-APIHOOK应用如需转载请标明出处:http://blog.csdn.net/itas109QQ技术交流群:129518033目录文章目录#
Windows核心编程
-APIHOOK
itas109
·
2020-06-23 18:00
Windows核心编程
宽字符与窄字符的处理
《
windows核心编程
》>Unicode是传递字符串的最佳手段。
hunterzone
·
2020-06-23 16:40
c/c++
《
Windows核心编程
》第二部分(线程调度,优先级和亲缘性)
(4)线程调度,优先级和亲缘性如上所诉,在每个线程内核对象中都有一个CONTEXT结构,其中保存了线程上一次运行寄存器的情况,在线程调度中,windows大约每隔20ms就会从线程内核对象中选出一个可调度的线程,将其CONTEXT还原到CPU寄存器中,如此循环。我们对操作系统内部的线程调度可以做出的影响很小,无法保证一个线程在某个时间段一直运行。一般可调度的进程比较少,大多线程都在等待某个其他事件
houxiangr
·
2020-06-23 14:17
C/C++
Windows
提升进程权限
文章一:在枚举/结束系统进程或操作系统服务时,会出现自己权限不足而失败的情况,这时就需要提升自己进程到系统权限,其实提升权限的代码很简单的,看到过的最经典的应该是《
WINDOWS核心编程
》第四章中操作进程给出的那个函数了
hetangbian
·
2020-06-23 14:04
window设备
#pragma 用法
#pragma用法今天刚开始调试
windows核心编程
中的例程就感觉十分难懂,原因是自己的c++基本功力实在太弱了首先在windows编程的过程中大量的使用宏的问题。
haobo920
·
2020-06-23 12:22
C语言
编译器
alignment
编程
网络协议
struct
windows
Windows核心编程
学习一:使用DialogBoxParam显示模式对话框
注:源码为学习《
Windows核心编程
》的一些尝试,非原创。若能有助于一二访客,幸甚。
孤舟钓客
·
2020-06-23 11:16
Windows核心编程
笔记
上一页
1
2
3
4
5
6
7
8
下一页
按字母分类:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
其他