- 博客(24)
- 资源 (44)
- 收藏
- 关注
原创 reactos操作系统实现(99)
下面来分析键盘的中断处理函数的实现,如下:#001 BOOLEAN NTAPI#002 i8042KbdInterruptService(#003 IN PKINTERRUPT Interrupt,#004 PVOID Context)#005 {#006 PI8042_KEYBOARD_EXTENSION DeviceExtension;
2009-09-29 23:31:00 1433
原创 reactos操作系统实现(98)
通过上面的分析,发现设置一个中断处理是非常复杂的,下面就来通过图来分析一个中断发生时,中断处理的过程如下图: 其实所有上面代码,就是设置这些流程里工作的函数关键代码,以便整个中断连接起来。其中一些函数是在汇编代码里面,这些都需要仔细分析才能理解。 主要调用下面这两个汇编代码,如下:#001 .func KiInterruptTemplate#002 _KiI
2009-09-28 22:12:00 1495
原创 reactos操作系统实现(97)
在这个函数里,又继续地调用内核的两个函数KiConnectVectorToInterrupt和HalEnableSystemInterrupt来处理。#001 VOID#002 NTAPI#003 KiConnectVectorToInterrupt(IN PKINTERRUPT Interrupt,#004 IN
2009-09-27 20:03:00 1523
原创 reactos操作系统实现(96)
调用函数IoConnectInterrupt来设置键中断处理函数。#028 Status = IoConnectInterrupt(#029 &PortDeviceExtension->KeyboardInterrupt.Object,#030 i8042KbdInterruptService,#031 DeviceExt
2009-09-25 21:16:00 1687
原创 reactos操作系统实现(95)
在PNP管理器里,最重要的处理,就是即插即用消息。下面来分析键盘的即插即用消息处理函数,实现的代码如下:#001 NTSTATUS NTAPI#002 i8042Pnp(#003 IN PDEVICE_OBJECT DeviceObject,#004 IN PIRP Irp)#005 {#006 PIO_STACK_LOCATION Sta
2009-09-24 22:10:00 1682
原创 reactos操作系统实现(94)
现在就来依次分析函数i8042Create、i8042Cleanup、i8042Close、i8042DeviceControl、i8042InternalDeviceControl和i8042Pnp。首先分析函数i8042Create,它的实现代码如下:#001 NTSTATUS NTAPI#002 i8042Create(#003 IN PDEVICE_OBJECT
2009-09-23 22:57:00 1728
原创 reactos操作系统实现(93)
现在来分析一下键盘驱动程序里主要使用的IRP主功能代码,由于每一个IRP都在首部包括有一个主功能代码码,并且还可能有次功能代码。大体有下面几种主功能代码:IRP_MJ_CREATE 创建或打开设备文件。IRP_MJ_CREATE_NAMED_PIPE 名管道驱动主功能。IRP_MJ_CLOSE
2009-09-22 23:45:00 1684
原创 reactos操作系统实现(92)
在DirverEntry函数,可以看到下面这句:#054 DriverObject->DriverExtension->AddDevice = i8042AddDevice;这里是设置了驱动程序的AddDevice函数指针,它是指向函数i8042AddDevice。PnP管理器将为每个硬件调用一次AddDevice函数,如下:下面开始调用即插即用的函数AddDevice来添
2009-09-21 21:47:00 1876
原创 reactos操作系统实现(91)
驱动程序很多配置参数是保存在注册表里,比如IO资源参数,中断号等内容。因此只有了解注册表的读取,以及相关内容才可以清楚知道键盘驱动程序,主要操作那些相关的端口,还有配置参数。下面来分析函数ReadRegistryEntries的实现,如下:#001 NTSTATUS#002 ReadRegistryEntries(#003 IN PUNICODE_STRING Regi
2009-09-20 10:01:00 1929
原创 reactos操作系统实现(90)
下面来分析函数IoAllocateDriverObjectExtension的实现,这个函数主要实现创建驱动程序扩展内存。#001 NTSTATUS#002 NTAPI#003 IoAllocateDriverObjectExtension(IN PDRIVER_OBJECT DriverObject,#004
2009-09-19 23:39:00 1472
原创 reactos操作系统实现(88)
IRP是 I/O request packet 的缩写,即 I/O 请求包。驱动与驱动之间通过 IRP 进行通信。而使用驱动的应用层调用的 CreatFile,ReadFile,WriteFile,DeviceIoControl 等函数,说到底也是使用 IRP 和驱动进行通信。一个 IRP 由两部分组成。首先是头部或者叫包的固定部分,是一个 IRP 结构。紧跟在这个头部之后的是I/
2009-09-17 21:52:00 1652
原创 reactos操作系统实现(87)
应用程序对设备I/O进行Win32调用,这个调用由I/O系统服务接收,然后I/O管理器从这个请求构造一个合适的I/O请求包(IRP)。那么I/O管理器是怎么样创建这个I/O请求包(IRP)的呢?又是怎么样传送给驱动程序的呢?我们带着这两个问题来分析下面实现文件读取的代码,如下:#001 NTSTATUS#002 NTAPI#003 NtReadFile(IN HANDLE F
2009-09-13 19:00:00 1806 1
原创 reactos操作系统实现(86)
创建完成端口需要调用Windows API CreateIoCompletionPort:HANDLE CreateIoCompletionPort( HANDLE FileHandle, HANDLE ExistingCompletionPort, DWORD CompletionKey, DWORD NumberOfConcurrentThrea
2009-09-12 23:34:00 2043
原创 reactos操作系统实现(85)
内核里也需要访问用户应用程序内存,那么有什么方法呢?在ReactOS主要有两种方法:一种是使用缓冲I/O的方法,在驱动程序运行前,I/O管理器把写数据复制到这个缓冲区,并在请求完成时把读数据复制回到用户空间;另一种是使用直接I/O,这是优先的技术,因为它减少数据复制。这是通过I/O管理器传递一个内存描述符列表(MDL-- Memory descriptor list)来实现的,这个描述符列表是
2009-09-11 22:33:00 1700
原创 reactos操作系统实现(84)
在系统里User32.dll,kernel32.dll,shell32.dll,gdi32.dll,rpcrt4.dll,comctl32.dll,advapi32.dll,version.dll等dll代表了Win32 API的基本提供者。Win32 API中的所有调用最终都转向了ntdll.dll,再由它转发至ntoskrnl.exe。ntdll.dll是本机 API用户模式的终端。真正的
2009-09-10 22:05:00 1575
原创 reactos操作系统实现(83)
前面已经分析了函数IopInitializeSystemDrivers的过程,在这个函数里加载注册表里指定的驱动程序。遍历了所有驱动程序,并通过调用函数IopLoadDriver来实现加载。也许你会问,驱动程序一般什么时候加载呢?其实在ReactOS里有三种情况,一种是在Freeloader引导时,加载内核时一起加载的驱动程序。一种是函数IopInitializeSystemDrivers里根
2009-09-09 22:06:00 2483
原创 reactos操作系统实现(82)
在I/O管理最后阶段,就是加载系统所有动态连接库,比如加载NTDLL动态连接库,具体实现代码如下:#001 NTSTATUS#002 NTAPI#003 PsLocateSystemDll(VOID)#004 {#005 OBJECT_ATTRIBUTES ObjectAttributes;#006 IO_STATUS_BLOCK IoSta
2009-09-08 23:07:00 1492
原创 reactos操作系统实现(81)
由于操作系统会使用一些缺省的驱动程序,需要在启动时加载指定的驱动程序。下面这个函数,主要实现系统启动时指定加载的驱动程序。代码如下:#001 VOID#002 FASTCALL#003 IopInitializeSystemDrivers(VOID)#004 {#005 PSERVICE_GROUPCurrentGroup;#006
2009-09-07 22:14:00 1310
原创 reactos操作系统实现(80)
下面的函数主要初始化PnP发现的设备,并为它安装服务,代码如下:#001 NTSTATUS#002 IopInitializePnpServices(IN PDEVICE_NODEDeviceNode)#003 {#004 DEVICETREE_TRAVERSE_CONTEXT Context;#005 #006 DPRINT("IopIn
2009-09-06 21:02:00 1506
原创 reactos操作系统实现(79)
下面这个函数实现标记引导分区,代码如下:#001 BOOLEAN#002 INIT_FUNCTION#003 NTAPI#004 IopMarkBootPartition(INPLOADER_PARAMETER_BLOCK LoaderBlock)#005 {#006 OBJECT_ATTRIBUTES ObjectAttributes;#0
2009-09-06 01:40:00 1179
原创 reactos操作系统实现(78)
ARC命名是Windows NT系统用来定位其引导分区所在的路径,也就是利用它指明引导分区在哪一个磁盘控制器,哪一个硬盘,哪一个分区内。ARC命名可分为两大类,以scsi为首或以multi为首,现分别说明如下:scsi(x)disk(y)rdisk(0)partition(z): 以scsi为首,表明该磁盘控制器为SCSI卡,并且该卡上的BIOS被设置为禁用(disable) scsi(x
2009-09-04 20:43:00 1451
原创 reactos操作系统实现(77)
因为PC里一条总线上可以连接很多设备,就像一棵树一样,需要遍历所有总线上所有子设备,并且为每一个子设备安装相应的驱动程序,下面这个函数,实现枚举所有子设备,实现代码如下:#001 NTSTATUS#002 IopEnumerateDevice(#003 INPDEVICE_OBJECT DeviceObject)#004 { 获取设备的节点。#0
2009-09-03 22:55:00 1614
原创 reactos操作系统实现(76)
当键盘类驱动程序或鼠标类驱动程序枚举时,会找到很多设备,这些设备需要使用回调的方式来进行初始化。下面的函数,就是实现回调初始化驱动程序,如下:#001 VOID#002 NTAPI#003 IopReinitializeBootDrivers(VOID)#004 {#005 PDRIVER_REINIT_ITEM ReinitItem;#006
2009-09-02 23:09:00 1598 1
原创 reactos操作系统实现(75)
在引导系统后,会有一些驱动程序是由引导参数指定的,下面这个函数,就是处理引导时加载到内存里的驱动程序,实现的代码如下:#001 VOID#002 FASTCALL#003 IopInitializeBootDrivers(VOID)#004 {#005 PLIST_ENTRY ListHead, NextEntry;#006 PLDR_DAT
2009-09-01 22:22:00 1783
python抓取天气并分析 实例源码
2017-08-28
书《深度学习》
2017-03-13
国产8051模拟器
2016-09-10
tinyxml2配套源码
2016-06-27
selenium的浏览器驱动
2016-06-14
开源鸿蒙4.0不能进入桌面的补丁
2024-03-17
开源鸿蒙 4.0 RK3566开发板配置
2024-03-17
svm_hog_data.rar
2020-03-02
实现numpy的C++库扩展
2019-11-24
python web py入门配套源代码
2018-02-23
webpy演示例子1
2018-02-21
胶囊模型的代码
2018-02-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人