reactos操作系统实现(6)
reactos操作系统实现(17)
从上面分析可以看到,主要调用函数 KiInitializeKernel 来初始化内核,这个函数传送的参数与函数 KiSetupStackAndInitializeKernel 的参数是一样的,如下: #001 VOID #002 NTAPI #003 KiIniti
日期 2023-06-12 10:48:40reactos操作系统实现(19)
由于 CPU 是多种多样,具备能力也是不一样的,并且不同厂家都会创新不同的功能。下面就来了解 CPU 特征识别,如下: /* Get the processor features for the CPU */ FeatureBits = KiGetFeatureBi
日期 2023-06-12 10:48:40reactos操作系统实现(22)
从Boot.S文件里初始化系统基本组件后,就跳到空闲函数处理,就成为一个空闲处理的线程,其实也是一个管理系统的任务。下面就来分析KiIdleLoop函数的代码,如下: #001 .globl @KiIdleLoop@0 #002 .func @KiIdl
日期 2023-06-12 10:48:40reactos操作系统实现(23)
下面来仔细查看Windows系统结构图: 由于ReactOS是兼容Windows为目标的,那么它的体系结构跟Windows越像,就具有兼容性。这里先来了解Windows的体系结构。最低层是硬件抽象层HAL;接着是内核层,设备驱动程序和文件系统,I/O管理器
日期 2023-06-12 10:48:40reactos操作系统实现(24)
在很早的电脑里,就带有一个小喇叭,可以发出不同频率的声音。主要用来判断系统是否有问题使用,比如BIOS检查硬有问题时,就会发出不同的声音,提醒用户是那里出问题了。在操作系统里,也经常使用这个小喇叭来提醒用户是什么问题,比如输入非法的按键时,就响
日期 2023-06-12 10:48:40reactos操作系统实现(11)
中断机制发明以来,就一直成为 CPU 的主导地位通知机制,因为中断的高效方式,没有其它任何的方式可以取代它的。在 IA-32 的 CPU 架构里,采用了中断寄存器和中断描述符来判断中断的来源,如下图所示: 在ReactOS里使用
日期 2023-06-12 10:48:40reactos操作系统实现(42)
接着下来,就需要分析函数KiReadyThread的作用了。根据线程状态来判断是否可以放入延迟队列,还是设置它为转换状态,代码如下: #001 VOID #002 NTAPI #003 KiReadyThread(IN PKTHREAD Thread) #004 { 获取
日期 2023-06-12 10:48:40reactos操作系统实现(46)
在线程调度里可以看到,需要调用函数KiSwapContext来进行运行环境切换,由于每个CPU都是只能运行一个线程,而多个线程在运行过程中被中断了,那么就需要保存CPU所有寄存器,以便下一次恢复线程时可以接续运行。现在就来分析这个函数是怎么样实现这些工作的,代码如下&
日期 2023-06-12 10:48:40reactos操作系统实现(48)
每当安装到一个全新的电脑时,都需要使用安装程序来把系统安装到电脑的硬盘里面,这个过程其实是一个极其重要的过程,如果用户不容易安装系统的话,那么这个系统也是很难使用的系统,不利于系统广泛使用和推广。下面就来了解Reactos是怎么实现整个安装过程的。 当使用make bootcd的
日期 2023-06-12 10:48:40reactos操作系统实现(59)
当用户安装ReactOS系统时,需要选择合适的安装目录,因为同一个类型的操作系统,可以安装多次,可以选择不同的目录来安装,以便在同一台电脑,同一个磁盘分区里安装不同的系统。如下图: 选择系统目录的实现代码如下: #001 stat
日期 2023-06-12 10:48:40reactos操作系统实现(33)
当Reactos在系统初始化时,就会调用进程管理初始化函数PsInitSystem来进行初始化。只有把进程管理初始化后,才可以创建进程,这样才可运行各种各样的任务。下面就来分析进程管理器初始化函数: #001 BOOLEAN #002 NTAPI #003 PsInitSystem(IN
日期 2023-06-12 10:48:40reactos操作系统实现(84)
在系统里User32.dll,kernel32.dll,shell32.dll,gdi32.dll,rpcrt4.dll,comctl32.dll,advapi32.dll,version.dll等dll代表了Win32 API的基本提供者。Win32
日期 2023-06-12 10:48:40reactos操作系统实现(39)
到底一个线程是怎么样创建的呢?又是怎么样放到就绪队列呢? #001 NTSTATUS #002 NTAPI #003 PspCreateThread(OUT PHANDLE ThreadHandle, #004 IN ACCESS_MASK DesiredAccess, #
日期 2023-06-12 10:48:40reactos操作系统实现(88)
IRP 是 I/O request packet 的缩写,即 I/O 请求包。驱动与驱动之间通过 IRP 进行通信。而使用驱动的应用层调用的 CreatFile,ReadFile,WriteFile,DeviceIoControl 等函数,说到底也是使用 IRP 和驱动进行通信。 一个 IRP 由两部分组成。首先是头部或
日期 2023-06-12 10:48:40reactos操作系统实现(112)
IdeReadWrite函数主要实现了IDE设备的读和写命令发送。具体实现函数如下: #001 ULONG #002 NTAPI #003 IdeReadWrite( #004 IN PVOID HwDeviceExtension, #005 IN PSCSI_REQUEST_BLOCK Srb #
日期 2023-06-12 10:48:40reactos操作系统实现(115)
PciIdeXFdoPnpDispatch函数主要处理PCIIDE即插即用的消息处理。具体实现代码如下: #001 NTSTATUS NTAPI #002 PciIdeXFdoPnpDispatch( #003 IN PDEVICE_OBJECT DeviceObject, #004 IN PIRP Irp)
日期 2023-06-12 10:48:40reactos操作系统实现(122)
IoReadPartitionTable函数是读取磁盘分区表数据。它的实现代码如下: #001 NTSTATUS #002 FASTCALL #003 IoReadPartitionTable(IN PDEVICE_OBJECT DeviceObject, #004 IN ULONG
日期 2023-06-12 10:48:40reactos操作系统实现(130)
vfatMakeRootFCB函数是用来创建FAT文件系统的根目录,实现代码如下: #001 PVFATFCB #002 vfatMakeRootFCB(PDEVICE_EXTENSION pVCB) #003 { #004 PVFATFCB FCB; #005 ULONG FirstClu
日期 2023-06-12 10:48:40reactos操作系统实现(133)
VfatReadDiskPartial函数主要用来构造一个IRP给底层驱动程序去读取数据返回。具体实现代码如下: #001 NTSTATUS #002 VfatReadDiskPartial (IN PVFAT_IRP_CONTEXT IrpContext, #003 IN PLARGE_INTEGER
日期 2023-06-12 10:48:40reactos操作系统实现(183)
UserDrawCaptionText函数实现窗口上标题的显示。实现的代码如下: #001 BOOL #002 UserDrawCaptionText(HDC hDc, #003 const PUNICODE_STRING Text, #004 const LPRECT lpRc, #005 UIN
日期 2023-06-12 10:48:40reactos操作系统实现(185)
在ReactOS系统里,当安装完成后,如果网络已经可能使用,就可以立即打开应用程序管理器,直接从网络上下载相应的应用程序,这样是很方便安装和管理软件,这些都是跟Linux操作系统学习过来的。具体的界面如下: 这是ReactOS 0.3.11
日期 2023-06-12 10:48:40reactos操作系统实现(144)
当操作系统引导过程中,需要输出一些信息给用户来查看,那么就需要这个简单的VGA驱动程序,可以输出字符串显示,实现这个功能的函数就是VidDisplayString函数,具体实现的代码如下: #001 VOID #002 NTAPI #003 VidDispla
日期 2023-06-12 10:48:40reactos操作系统实现(143)
VgaIsPresent函数通过读取图形模式的索引寄存器和数据寄存器来检查VGA显示卡是否安装,实现代码如下: #001 BOOLEAN #002 NTAPI #003 VgaIsPresent(VOID) #004 { #005 UCHAR VgaReg, VgaReg2, VgaReg3; #
日期 2023-06-12 10:48:40reactos操作系统实现(151)
图形模块包括用户模式gdi32和内核模式的win32k,gdi32的代码在目录reactos/dll/win32/gdi32里,win32k的代码在目录reactos/subsystems/win32/win32k里。所有客户端的应用程序都是调用gdi32库里的API函数,编译时也是连接这个库里的函数。由于g
日期 2023-06-12 10:48:40reactos操作系统实现(193)
SelectObject函数是将对象选定到指定的设备场境中。具体实现代码如下: #001 HGDIOBJ #002 WINAPI #003 SelectObject(HDC hDC, #004 HGDIOBJ hGdiObj) #005 { #006 PDC_ATTR pDc_A
日期 2023-06-12 10:48:40reactos操作系统实现(197)
所有API都需要通过兼容性测试,才说明这个API没有问题,达到可以使用的程度。下面这段代码就是测试API的兼容性,当测试到GetPixel函数时,就发现有一个BUG,就是最后一行,当希望这个单色的图片返回0xFFFFFF值,但在ROS返回是0值。说明这个
日期 2023-06-12 10:48:40reactos操作系统实现(156)
在USER32.DLL里也不例外,它的入口函数也是DllMain,当每个应用程序启动时就会调用本函数进行实始化。具体实现代码如下: #001 INT WINAPI #002 DllMain( #003 IN PVOID hInstanceDll, #004 IN ULONG dwR
日期 2023-06-12 10:48:40reactos操作系统实现(158)
在ReactOS的应用程序里,每个有窗口的应用程序都需要注册一个窗口类,然后根据窗口类来创建窗口。注册窗口的调用函数就是RegisterClassW,这个函数是UNICODE的版本,其实还有多节字版本,但代码是差不多的。这里主要分析UNICODE版本的实现,其代码如下
日期 2023-06-12 10:48:40reactos操作系统实现(168)
当应用程序更新窗口后,就需要不断地接收系统发过来的消息,然后处理消息,最后发送消息出去,这样就构成了应用程序的消息循环处理。不断地获取系统消息的函数是GetMessage函数,下面就是它的实现代码: #001 BOOL WINAPI #002 GetMessa
日期 2023-06-12 10:48:40reactos操作系统实现(171)
TranslateMessage函数用来把虚拟键消息转换为字符消息,其实现的代码如下: #001 BOOL WINAPI #002 TranslateMessage(CONST MSG *lpMsg) #003 { 在这个函数里只是简单地调用函数TranslateMessageEx。 #004
日期 2023-06-12 10:48:40reactos操作系统实现(174)
DispatchMessage函数主要分发一个消息给窗口处理函数。具体实现代码如下: #001 LRESULT WINAPI #002 DispatchMessageW(CONST MSG *lpmsg) #003 { #004 LRESULT Ret = 0; #005 PWINDOW Wn
日期 2023-06-12 10:48:40