Windows驱动开发技术详解 第六章的(Windows内核函数)自我理解
- 格式:pdf
- 大小:115.11 KB
- 文档页数:9
深入研究计算机操作系统内核Windows内核原理解析计算机操作系统是指支持计算机软硬件运行的基本软件系统,其中内核是操作系统的核心部分。
作为广泛应用的操作系统之一,Windows 内核在计算机领域中具有重要地位。
本文将深入研究Windows内核的原理解析,以帮助读者更好地理解计算机操作系统内核的工作原理。
一、Windows操作系统的发展历程Windows操作系统的发展经历了多个版本和起伏。
自20世纪80年代中期开始推出的Windows 1.0版本以图形用户界面为特点,为个人计算机用户带来了更加友好的操作界面。
随着版本的不断升级,Windows 操作系统逐渐成熟,并在个人计算机市场上占据主导地位。
二、Windows内核的概述Windows内核是Windows操作系统的核心组成部分,负责管理计算机硬件资源和提供系统服务。
Windows内核采用了微内核的设计思想,将核心的功能模块化,以实现更高的灵活性和可扩展性。
Windows内核包括以下几个主要组件:1. 进程管理:负责管理计算机上的进程,调度和分配资源,实现进程的并发执行。
2. 内存管理:负责管理计算机内存的分配和回收,以及虚拟内存的管理,提供内存保护机制。
3. 文件系统:负责管理磁盘上的文件和目录,提供文件读写和文件共享的功能。
4. 设备驱动程序:提供与硬件设备的通信接口,实现对硬件设备的操作和控制。
5. 网络通信:提供网络通信功能,实现计算机之间的数据传输和通信。
三、Windows内核的工作原理分析1. 进程管理Windows内核通过进程管理来实现系统的多任务处理。
每个进程都有自己的地址空间和调度优先级。
内核根据调度算法来选择需要执行的进程,并为其分配CPU时间片。
当一个进程处于等待状态时,内核将其挂起,切换到其他可执行的进程,保证系统的整体性能。
2. 内存管理Windows内核通过内存管理来管理计算机的物理内存和虚拟内存。
物理内存管理负责将物理内存划分成多个页框,提供页面分配和回收的功能。
《Windows驱动开发技术详解》之Windows内核函数内核模式下字符串操作ANSI_STRING和UNICODE_STRING分别定义如下:以UnicodeString类型对象进⾏初始化为例,代码如下:输出:进⾏复制字符串操作,代码如下:输出:但是如果这⾥改为:加载驱动运⾏就会蓝屏。
Why?其实,RltFreeUnicodeString是⽤来释放利⽤申请的堆空间初始化的UnicodeString类型对象的,⽽RtlInitUnicodeString对UniStr1进⾏初始化时,只是让Buffer指向了⼀个常量区。
进⾏ANSI_STRING字符串与UNICODE_STRING字符串相互转换操作,代码如下:注意这⾥要利⽤RtlFreeUnicodeString释放通过RtlAnsiStringToUnicodeString得到的UniStr2。
为什么这个需要释放?我们利⽤Windbg跟踪下代码。
⾸先,跟踪时要逐⼀,这⾥的勾如果不去掉,就是在源码下单步跟踪,⽽不是在汇编指令⾥单步跟踪:在RtlUnicodeStringToAnsiString函数中,有这么⼀个系统API此时的参数是正好是传⼊的字节数的⼤⼩。
⽽这个API最终调⽤了:所以,我们要利⽤RtlFreeUnicodeString进⾏释放。
内核模式下的⽂件操作:创建⽂件:代码⼊下:1 VOID FILEOPERATION(){2 OBJECT_ATTRIBUTES ObjAttributes;3 IO_STATUS_BLOCK iostatus;4 HANDLE hfile;5 UNICODE_STRING logFileUnicodeString;67 RtlInitUnicodeString(&logFileUnicodeString, L"\\??\\C:\\1.log");8 InitializeObjectAttributes(&ObjAttributes,9 &logFileUnicodeString,10 OBJ_CASE_INSENSITIVE,11 NULL,12 NULL);13//创建⽂件14 NTSTATUS status = ZwCreateFile(&hfile, GENERIC_WRITE,15 &ObjAttributes,16 &iostatus,17 NULL,18 FILE_ATTRIBUTE_NORMAL,19 FILE_SHARE_READ,20 FILE_OPEN_IF,//这⾥是FILE_OPEN_IF则不论⽂件是否存在都可以Create成功,⽽如果改为FILE_OPEN,则只当⽂件存在时create成功。
《Windows驱动开发技术详解》之读写操作缓冲区⽅式读写操作设置缓冲区读写⽅式:读写操作⼀般是由ReadFile和WriteFile函数引起的,这⾥先以WriteFile函数为例进⾏介绍。
WriteFile要求⽤户提供⼀段缓冲区,并且说明缓冲区的⼤⼩,然后WriteFile将这段内存的数据传⼊到驱动程序中。
这种⽅法,操作系统将应⽤程序提供缓冲区数据直接复制到内核模式的地址中。
这样做,⽐较简单的解决了将⽤户地址传⼊驱动的问题,⽽缺点是需要在⽤户模式和内核模式之间复制数据,影响了效率。
在少量内存操作时,可以采⽤这种⽅法。
拷贝到内核模式下的地址由WriteFile创建的IRP的AssociatedIrp.SystemBuffer⼦域记录。
下⾯的代码演⽰了如何利⽤缓冲区⽅式读取设备,这个例⼦中,驱动程序负责向缓冲区中填⼊了数据:应⽤层调⽤ReadFile,想驱动传送⼀个读IRP请求:1int main(){2 HANDLE hDevice =3 CreateFile("\\\\.\\HelloDDK",4 GENERIC_READ | GENERIC_WRITE,50, NULL,6 OPEN_EXISTING,7 FILE_ATTRIBUTE_NORMAL,8 NULL);9if (hDevice == INVALID_HANDLE_VALUE){10 printf("Open device failed!\n");11 }12else{13 printf("Open device succeed!\n");14 }15 UCHAR buffer[10];16 ULONG ulRead;17 BOOL bRet = ReadFile(hDevice, buffer, 10, &ulRead, NULL);18if (bRet){19 printf("Read %d bytes!", ulRead);20for (int i = 0; i < (int)ulRead; i++){21 printf("%02X", buffer[i]);22 }23 printf("\n");24 }25 CloseHandle(hDevice);26 system("pause");27return0;28 }运⾏之后的结果如下:创建⼀个虚拟设备模拟⽂件读写:读、写派遣函数如下:1 NTSTATUS HelloDDKDispatchRead(PDEVICE_OBJECT pDevObj, PIRP pIrp){2 UNREFERENCED_PARAMETER(pDevObj);3 DbgPrint("Enter dispach read!\n");4 PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;5 NTSTATUS status = STATUS_SUCCESS;6 PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);7//得到要读取的数据的长度8 ULONG ulReadLength = stack->Parameters.Read.Length;9 ULONG ulReadOffset = (ULONG)stack->Parameters.Read.ByteOffset.QuadPart;10if (ulReadOffset + ulReadLength > MAX_FILE_LENGTH){11 status = STATUS_FILE_INVALID;12 ulReadLength = 0;13 }14else{15 memcpy(pIrp->AssociatedIrp.SystemBuffer, pDevExt->buffer + ulReadOffset, ulReadLength);16 status = STATUS_SUCCESS;17 }18 pIrp->IoStatus.Status = status;19 pIrp->rmation = ulReadLength;20//memset(pIrp->AssociatedIrp.SystemBuffer, 0x68, ulReadLength);21 IoCompleteRequest(pIrp, IO_NO_INCREMENT);22return status;23 }2425 NTSTATUS HelloDDKDispatchWrite(PDEVICE_OBJECT pDevObj, PIRP pIrp){26 UNREFERENCED_PARAMETER(pDevObj);27 NTSTATUS status = STATUS_SUCCESS;28 PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;29 PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);30 ULONG ulWriteLength = stack->Parameters.Write.Length;31 ULONG ulWriteOffset = (ULONG)stack->Parameters.Write.ByteOffset.QuadPart;32if (ulWriteOffset + ulWriteLength > MAX_FILE_LENGTH){33 status = STATUS_FILE_INVALID;34 ulWriteLength = 0;35 }36else{37 memcpy(pDevExt->buffer + ulWriteOffset, pIrp->AssociatedIrp.SystemBuffer, ulWriteLength);38 status = STATUS_SUCCESS;39if (ulWriteLength + ulWriteOffset > pDevExt->file_length){40 pDevExt->file_length = ulWriteLength + ulWriteOffset;41 }42 }43 pIrp->IoStatus.Status = status;44 pIrp->rmation = ulWriteLength;45 IoCompleteRequest(pIrp, IO_NO_INCREMENT);4647return status;48 }再在R3添加⼊代码:1 UCHAR buffer[10];2 memset(buffer, 0x66, 10);3 ULONG ulRead;4 ULONG ulWrite;5 BOOL bRet = WriteFile(hDevice, buffer, 10, &ulWrite, NULL);6if (bRet){7 printf("Write %d bytes!\n", ulWrite);8 }910 bRet = ReadFile(hDevice, buffer, 10, &ulRead, NULL);11if (bRet){12 printf("Read %d bytes!", ulRead);13for (int i = 0; i < (int)ulRead; i++){14 printf("%02X", buffer[i]);15 }16 }17 printf("\n");运⾏,得到结果:如果我们要查询⽂件信息,没有注册IRP_MY_QUERY_INFORMATION的派遣函数时,GetFileSize会正常返回读到的⽂件的⼤⼩:但是,因为GetFileSize读取的是⽂件的⼤⼩,⽽这⾥传递的是设备对象的句柄,本来是读不到⼤⼩的,但是如果利⽤驱动对IRP进⾏修改,再返回给R3层,就可以得到了:其派遣函数代码如下:R3层添加代码:1 bRet = GetFileSizeEx(hDevice, &dwFileSize);2 printf("File size is %u\n", dwFileSize);直接⽅式读写操作与缓冲区⽅式读写设备不同,直接⽅式读写设备,操作系统会将⽤户模式下的缓冲区锁住。
目录一、驱动开发环境的搭建 (1)1.1 关于DDK (1)1.2 关于驱动程序的编译 (1)1.3关于驱动程序的运行 (2)二、驱动程序的结构 (3)2.1 驱动程序的头文件 (3)2.2 驱动程序的入口点 (3)2.3 创建设备例程 (4)2.4 卸载驱动例程 (5)2.5 派遣例程 (6)三、编写驱动程序的基础知识 (6)3.1 内核模式下的字符串操作 (6)3.2 内核模式下各种开头函数的区别 (8)3.3 一个示例程序 (10)3.4 补充说明 (10)四、在驱动中使用链表 (10)4.1 内存的分配与释放 (10)4.2 使用LIST_ENTRY (12)4.3 使用自旋锁 (12)五、在驱动中读写文件 (15)5.1 使用OBJECT_ATTRIBUTES (15)5.2 创建、打开文件 (16)5.3 读写文件操作 (16)5.4 文件的其它相关操作 (18)六、在驱动中操作注册表 (18)6.1 创建、打开注册表 (19)6.2 读写注册表 (20)6.3 枚举注册表 (21)七、在驱动中获取系统时间 (21)7.1 获取启动毫秒数 (21)7.2 获取系统时间 (22)八、在驱动中创建内核线程 (23)8.1 创建内核线程 (23)8.2 关于线程同步 (24)九、初探IRP (25)9.1 IRP的概念 (25)9.2 IRP的处理 (26)9.3 IRP派遣例程示例 (27)十、驱动程序与应用层的通信 (29)10.1 使用WriteFile通信 (29)10.2 使用DeviceIoControl进行通信 (32)十二、驱动程序开发实例 (33)12.1 NT驱动程序 (33)12.2 WDM驱动程序 (35)十三、参考资料 (41)一、驱动开发环境的搭建1.1 关于DDK开发驱动程序必备的一个东西就是DDK(Device Development Kit,设备驱动开发包),它跟我们在ring3常听到的SDK差不多,只不过它们分别支持开发不同的程序而已。
Windows内核及操作系统原理培训心得体会3月2日——11日,本人有幸参加了《Windows内核及操作系统原理》和.Net编程培训班,通过这次学习,本人感觉收获颇大,对Windows系统有了更加深入的了解,尤其是从系统原理、核心架构等方面有了更深层次的认识。
主要收获如下:1、通过对Windows进程的学习,使我认识到,Windows的进程是一个容器,其中包含了当执行一个程序的特定实例时用到的各种资源。
Windows的进程包含以下元素:一个私有的虚拟地址空间一个可执行的程序一个已打开句柄的列表一个被称为访问令牌的安全环境一个进程ID至少一个执行线程进程由一个执行体进程(EPROCESS)块来表示。
Windows线程是进程内部某段代码执行的实体。
线程由一个执行体线程(ETHREAD)块来表示。
2、通过对Windows执行体组件的学习,使我知道了主要有哪些执行体,以及这些执行体的作用。
配置管理器:注册表的实现和管理。
进程和线程管理器:创建或终止进程和线程。
I/O管理器:实现了与设备无关的I/O操作,负责将这些操作分派到恰当的设备驱动程序以供进一步处理。
即插即用管理器:针对特定设备确定必需的驱动程序,并加载它们。
内存管理器:实现虚拟内存。
对象管理器:创建、管理和删除Windows执行体对象和抽象数据类型。
电源管理器:负责协调电源事件,并向设备驱动程序产生电源管理I/O通知。
3、通过学习还使我了解了应用程序代码中调用Windows API CreateProcess的过程。
在CreateProcess的内部调用Ntdll.dll中的NtCreateProcess,此函数首先检查参数的正确性,再将处理器模式从用户模式切换到内核模式,调用相关的执行体服务,创建执行体进程对象和初始线程,接下来通知Windows子系统的进程csrss,在它的协助下创建出用户进程。
通过参加这次培训班的学习,必将对我今后的工作产生较大作用,我将用更加努力的工作回报单位。
接触windows驱动开发有一个月了,感觉Windows驱动编程并不像传说中的那么神秘。
为了更好地为以后的学习打下基础,记录下来这些学习心得,也为像跟我一样致力于驱动开发却苦于没有门路的菜鸟朋友们抛个砖,引个玉。
我的开发环境:Windows xp 主机+ VMW ARE虚拟机(windows 2003 server系统)。
编译环境:WinDDK6001.18002。
代码编辑工具:SourceInsight。
IDE:VS2005/VC6.0。
调试工具:WinDBG,DbgView.exe, SRVINSTW.EXE上面所有工具均来自互联网。
对于初学者,DbgView.exe和SRVINSTW.EXE是非常简单有用的两个工具,一定要装上。
前者用于查看日志信息,后者用于加载驱动。
下面从最简单的helloworld说起吧。
Follow me。
驱动程序的入口函数叫做DriverEntry(PDRIVER_OBJECT pDriverObj,PUNICODE_STRING pRegisgryString)。
两个参数,一个是驱动对象,代表该驱动程序;另一个跟注册表相关,是驱动程序在注册表中的服务名,暂时不用管它。
DriverEntry 类似于C语言中的main函数。
它跟main的差别就是,main完全按照顺序调用的方法执行,所有东西都按照程序员预先设定的顺序依次发生;而DriverEntry则有它自己的规则,程序员只需要填写各个子例程,至于何时调用,谁先调,由操作系统决定。
我想这主要是因为驱动偏底层,而底层与硬件打交道,硬件很多都是通过中断来与操作系统通信,中断的话就比较随机了。
但到了上层应用程序,我们是看不到中断的影子的。
说到中断,驱动程序中可以人为添加软中断,__asm int 3或者Int_3();前者是32位操作系统用的,后者是64位用的。
64位驱动不允许内嵌汇编。
下面是我的一个helloworld的源码:注意第16行的宏。
windows编程原理Windows编程是指在Windows操作系统上进行软件开发的过程。
Windows操作系统是面向图形用户界面的操作系统,因此Windows编程主要涉及图形用户界面的设计和交互逻辑的实现。
Windows编程的原理包括以下几个核心概念:1. 窗口:Windows编程的核心是窗口的管理。
窗口是用户界面的基本单元,可以包含控件和其他组件。
窗口有不同的类型,如主窗口、对话框、工具栏等,每个窗口都有唯一的标识符。
2. 消息:在Windows编程中,窗口之间通过消息进行通信。
消息是Windows系统传递给应用程序的事件,如键盘输入、鼠标点击等。
每个窗口都有一个消息处理函数,用于处理接收到的消息。
3. 控件:控件是窗口中的可视化元素,用于实现用户界面的各种功能。
常见的控件包括按钮、文本框、列表框等。
控件可以通过事件处理函数来响应用户操作。
4. 资源:Windows编程中使用资源文件来存储应用程序的资源,如图像、音频、字符串等。
资源文件可以在程序运行时被加载和使用。
5. API函数:Windows编程使用Windows API函数来实现与操作系统的交互。
API函数提供了大量的功能,如创建窗口、处理消息、绘制图形等。
可以使用编程语言(如C++、C#等)来调用这些API函数。
在Windows编程中,开发者可以选择使用不同的编程语言和框架来进行开发。
最常用的编程语言包括C++、C#、 等,常用的框架包括MFC、WinForms、WPF等。
开发者可以根据自己的需求和熟悉程度选择合适的编程语言和框架。
总之,Windows编程是一种基于Windows操作系统的软件开发过程,涉及窗口管理、消息传递、控件操作等核心概念。
开发者需要熟悉Windows API函数和相应的编程语言来进行开发工作。
windows内核驱动开发的英文书籍Windows内核驱动开发是一个相对专业和复杂的主题,涉及底层系统设计和编程。
英文书籍通常具有更全面的知识和更快的更新速度,所以我会推荐一些英文书籍。
以下是一些与Windows内核驱动开发相关的英文书籍:
1. "Windows Kernel Programming" by Alex Ionescu
- 这本书是Windows内核驱动开发领域非常经典的书籍,涵盖了从基础知识到高级技术的全面内容。
2. "The Windows Internals Book" by Mark Russinovich and David A. Solomon
- 这本书深入探讨了Windows操作系统的内部工作原理,适合对底层系统有深入了解的读者。
3. "Microsoft Windows Driver Kit (WDK)"
- 这是一个由微软官方提供的开发套件,其中包含大量的文档、示例和工具,用于帮助开发者编写Windows内核驱动。
4. "Driver Development Kit (DDK)"
- 这是另一个由微软提供的开发套件,用于编写Windows内核驱动和设备驱动。
请注意,这些书籍可能需要一些高级的编程和系统知识才能完全理解。
如果你对这些主题还不熟悉,可能需要先从更基础的书籍或在线教程开始学习。
同时,由于操作系统和开发技术不断发展和更新,这些书籍的内容也可能已经有所变化或更新,所以建议查看最新的版本。
Windows开发工程师岗位面试题及答案1.请介绍一下您在Windows开发方面的经验。
答:我在Windows开发领域有X年的经验。
我曾参与开发过基于Windows的桌面应用程序,涉及UI设计、后端逻辑和与操作系统交互的模块。
2.请详细描述您在Windows应用程序界面设计方面的经验。
答:在应用程序界面设计方面,我使用过WPF和WinForms等工具,设计用户友好的界面。
举例来说,我曾开发一个音乐播放器,通过WPF实现了现代化的界面,包括动画效果和自定义控件。
3.您在多线程编程方面有何经验?答:我熟悉在Windows环境下使用多线程进行并发编程。
在一个视频编辑软件项目中,我实现了多线程视频渲染,提升了性能和用户体验。
4.请解释一下Windows消息循环机制。
答:Windows消息循环是应用程序与操作系统交互的基础。
应用程序通过循环不断地接收、分发和处理消息,包括用户输入和系统事件。
例如,WM_PAINT消息触发界面的重绘。
5.如何处理Windows应用程序中的异常?答:异常处理对于稳定的应用程序至关重要。
我会使用trycatch 块捕获可能的异常,并在适当的地方记录日志。
在一个文件管理器项目中,我实现了针对文件操作的异常处理,确保应用程序不会因为意外情况崩溃。
6.请谈谈您在Windows注册表操作方面的经验。
答:注册表是Windows配置和设置的关键部分。
我曾经开发过一个系统优化工具,使用C编写了操作注册表的模块,允许用户自定义系统设置以提升性能。
7.如何优化Windows应用程序的启动时间?答:优化启动时间需要减少不必要的资源加载和初始化。
我会延迟加载非必要模块,使用异步加载,以及优化资源的预加载。
在一个文本编辑器项目中,我成功减少了启动时间,提升了用户体验。
8.请谈谈您对COM(ComponentObjectModel)的理解。
答:COM是一种Windows平台上的组件技术,用于实现不同组件之间的通信和交互。
windows驱动开发教程Windows驱动开发是指在Windows操作系统下编写、调试和部署驱动程序的过程。
驱动程序是操作系统的核心组成部分,它负责与硬件设备通信,使得操作系统能够正确地识别、管理和控制硬件设备。
在本教程中,我们将介绍Windows驱动开发的基本概念、工具和流程。
首先,为了进行Windows驱动开发,我们需要准备好相应的开发工具。
其中最重要的工具是Windows Driver Kit(WDK),它包含了用于驱动开发的各种工具和库文件。
我们可以从微软官方网站上下载并安装最新版本的WDK。
接下来,我们需要熟悉驱动程序的基本概念。
在Windows中,驱动程序可以分为内核驱动和用户模式驱动。
内核驱动运行在操作系统的内核空间,具有更高的权限和更广泛的硬件访问能力;而用户模式驱动则运行在用户空间,通过系统调用与内核驱动进行通信。
我们需要了解如何编写和编译这两种类型的驱动程序,并了解它们的工作原理和特点。
在编写驱动程序之前,我们还需要了解一些基本的Windows内核编程概念,例如驱动对象模型(Driver Object Model)、设备对象模型(Device Object Model)和驱动程序接口(Driver Interface)。
这些概念是驱动程序的基础,对于理解和设计驱动程序非常重要。
接下来,我们将介绍如何使用WDK的工具和库文件来编写驱动程序。
我们可以使用Visual Studio编写驱动程序的源代码,并使用WDK的编译工具将源代码编译成驱动程序二进制文件。
在编译过程中,我们需要配置驱动程序的环境和依赖项,并确保编译成功。
在编写和编译驱动程序之后,我们需要进行驱动程序的调试和部署。
对于驱动程序的调试,我们可以使用WDK提供的调试工具和技术,例如Kernel-Mode Debugging和WinDbg。
对于驱动程序的部署,我们需要将驱动程序二进制文件和相关的配置文件复制到操作系统的指定目录,并注册驱动程序的信息到操作系统的驱动程序数据库。
第一部分程序员必读Szq整理使用第1章对程序错误的处理(1)常见的Windows函数的返回类型:VOID:无返回值型,该函数的运行不可能失败。
Windows函数很少此类型BOOL:函数运行失败则返回0,否则返回非0HANDLE:失败则返回NULL,否则返回一个可操作的对象的Handle。
注:有些函数会返回一个句柄值INVALID_HANDLE_VALUE,?它被定义为-1。
函数的Platform? SDK 文档将会清楚地说明该函数运行失败时返回的是NULL还是INVALID_HANDLE_VALIDPVOID :函数运行失败,则返回值是NULL,否则返回PVOID,以标识数据块的内存地址LONG/DWORD:这是个难以处理的值。
返回数量的函数通常返LONGDWORD。
如果由于某种原因,函数无法对想要进行计数的对象进行计数,那么该函数通常返回0或-1(根据函数而定)。
如果调用的函数返回了LONG/DWORD,那么请认真阅读 Platform SDK文档以确保能正确?检查潜在的错误。
(2)当某Windows函数运行错误时,可以通过调用 DWORD GetLast Error()函数获取调用该函数的关联线程的32位错误代码。
其具体的错误文本以列表形式存放于WinError.h头文件中,在VC中调试时,也可以通过在Watch 窗口键入“@err,hr”来获取所调用函数的运行错误代码和具体的错误文本。
(3)Windows还提供了一个函数,可以将错误代码转换成它的文本描述。
该函数称为FormatMessage,该函数的格式如下:DWORD FormatMessage(DWORD dwFlags,LPCVOID pSource,DWORD dwMessageID,DWORD dwLanguageID,PTSTR pszBuffer,DWORD nSize,va_list *Argument);2004年11月8号Trackback: /TrackBack.aspx?PostId=174570第一章程序员必读1.1定义自己的错误代码若你编写了一个希望其他人调用的函数,你的函数可能因为这样或那样的原因而运行失败,你必须向函数的调用者说明它已经运行失败。
C++第三⼗三篇--研究⼀下Windows驱动开发(⼀)内部构造介绍因为⼯作原因,需要做⼀些与⽹卡有关的测试,其中涉及到了驱动这⼀块的知识,虽然程序可以运⾏,但是不搞清楚,⼼⾥总是不安,觉得没理解清楚。
因此想看⼀下驱动开发。
查了很多资料,看到有⼈推荐Windows驱动开发技术详解这本书,因此本篇⽂章也是基于这本书进⾏学习的。
有些图⽚也是按照书上⾃⼰画的。
Windows操作系统⽰意图⾸先,需要下载相应的⼯具,将环境搭建起来,VS和WDK,由于我已经安装了VS2017,所以需要找对应版本的WDK()。
如果想要查OS的版本,可以WIN+R输⼊winver就可以看到OS的版本了,⽼版本对应链接:安装好了后就需要写⼀下程序了,参考链接:Windows架构简图Win32⼦系统将API函数转化为Native API函数。
在Native API接⼝中,已经没有了⼦系统的概念,它将这种调⽤转化为系统服务函数的调⽤。
其中,Native API穿过了⽤户模式和内核模式的界⾯,达到了内核模式。
系统服务函数通过I/O管理器将消息传递给驱动程序。
在内核模式下,执⾏体组件提供了⼤量的内核函数供驱动程序调⽤。
内核主要负责进程、线程的调度情况。
驱动程序通过硬件抽象层与具体硬件进⾏操作。
Windows API分为三类,分别是USER函数、GDI函数和KERNEL函数。
》USER函数:这类函数管理窗⼝、菜单、对话框和控件。
》GDI函数:这类函数在物理设备商执⾏绘图操作。
》KERNEL函数:这类函数管理⾮GUI资源,例如:进程、线程、⽂件和同步服务等。
可以发现Windows系统⽬录中有对应的三个系统⽂件,分别是USER32.dll、GDI32.dll和KERNEL32.dll。
这三个⽂件提供了以上三类API的接⼝。
当应⽤程序加载的时候,操作系统出了将应⽤程序加载到内存中,同时将以上三个DLL⽂件加载到内存中。
1、Native API⼤部分Win32⼦系统的API,都通过Native API实现的。
Windows系统编程课程设计一、前言Windows系统编程是一门非常重要的计算机科学课程,它能够让我们深入了解操作系统的内部机制,掌握Windows系统编程的核心概念和技术,从而为我们今后的职业发展打下良好的基础。
为了帮助学习者更好地掌握这门课程,本文将介绍一些有关Windows系统编程课程设计的内容,以及如何通过编程实践来深入理解此课程的核心知识。
二、课程设计内容Windows系统编程是一门包罗万象的课程,它涉及的内容非常之广,从系统调用、Windows驱动程序到编写基于Windows API的GUI应用程序,每个方面都需要我们认真学习和实践。
在本文中,我们将为大家介绍一些基本的课设内容,以帮助大家更好地学习和理解Windows系统编程。
1. 系统调用系统调用是操作系统最基本的服务之一,它可以让用户程序向内核发出请求,让内核完成一些底层操作。
在Windows系统编程中,我们需要了解如何使用Windows API中的系统调用函数,例如CreateFile、ReadFile、WriteFile等,这些函数在Windows编程中非常常用。
我们可以根据需要编写一些小程序来练习使用系统调用函数。
2. Windows驱动程序开发Windows驱动程序是一种系统级别的软件,它能够让外设与操作系统之间进行通信,是Windows系统编程中非常重要的一部分。
我们需要了解Windows驱动程序的结构和原理,掌握Windows驱动程序的编写方法,以及如何将驱动程序与外设进行交互。
我们可以在Windows系统中安装一些外设驱动程序,分析其结构和原理,然后根据需要编写自己的驱动程序。
3. Windows应用程序开发Windows应用程序开发是Windows系统编程中最常见的一部分,它可以让我们开发各种各样的GUI应用程序,包括图形界面、控制台应用程序等。
在Windows应用程序开发中,我们需要了解Windows API中的一些重要函数和控件,例如CreateWindow、MessageBox、Button等,掌握如何使用它们来开发Windows应用程序。
操作系统的内核模块与驱动开发操作系统是计算机系统中最关键的软件之一,它负责管理计算机的硬件资源,提供访问硬件的接口,为用户和应用程序提供服务。
操作系统的内核模块与驱动开发是操作系统开发中的重要部分,本文将介绍内核模块与驱动开发的基本概念、流程以及一些常见的开发技术。
一、内核模块的概念与作用内核模块是操作系统内核的一个可装载的扩展,它可以在运行时加载和卸载,以增加操作系统的功能或支持新的硬件设备。
内核模块通常是以动态链接库的形式存在,它可以被内核加载到内存中,并与内核中的其他模块进行交互。
内核模块的作用包括但不限于以下几个方面:1. 提供新的系统调用:通过加载内核模块,可以为操作系统添加新的系统调用,以支持新的功能或服务;2. 支持新硬件设备:当新的硬件设备出现时,可以通过开发相应的内核模块,使操作系统能够识别和管理新设备;3. 增强系统性能:通过优化内核模块的实现,可以提高操作系统的性能和响应速度。
二、内核模块的开发流程内核模块的开发流程包括以下几个关键步骤:1. 确定需求:在开发内核模块之前,需要明确开发的目的和需求,例如添加新的系统调用、支持新的硬件设备等;2. 编写代码:根据需求,编写相应的代码实现功能;3. 编译模块:编译内核模块的源代码,生成可加载的二进制文件;4. 加载模块:使用操作系统提供的加载命令,将编译好的内核模块加载到内存中;5. 测试验证:对加载的内核模块进行功能测试和性能测试,确保其正常工作和满足需求;6. 部署发布:将经过测试和验证的内核模块部署到实际的操作系统中,使其能够为用户和应用程序提供服务。
三、驱动开发的概念与分类驱动是用于操作和控制硬件设备的软件模块,它可以充当操作系统与硬件设备之间的桥梁,使操作系统能够正确地识别和管理硬件设备。
根据硬件设备的不同,驱动可以分为以下几类:1. 字符设备驱动:用于操作字符设备,例如串口、并口等;2. 块设备驱动:用于操作块设备,例如磁盘、光驱等;3. 网络设备驱动:用于操作网络设备,例如网卡等;4. 显示设备驱动:用于操作显示设备,例如图形卡、显示器等。
Nt内核函数大全NtLoadDriver 服务控制管理器加载设备驱动.NtUnloadDriver 服务控制管理器支持卸载指定的驱动程序. NtRegisterNewDevice 加载新驱动文件.NtQueryIntervalProfile 返回数据.NtSetIntervalProfile 指定采样间隔.NtStartProfile 开始取样.NtStopProfile 停止采样.NtSystemDebugControl 实施了一系列的调试器支持的命令. NtRegisterThreadTerminatePort 一个调试登记通知线程终止. NtCreateDebugObject 创建一个调试对象.NtDebugActiveProcess 使调试器附加到一个积极的过程和调试它. NtDebugContinue 允许一个进程,以线程产生了调试事件. NtQueryDebugFilterState 查询调试过滤国家一级的具体组成部分. NtRemoveProcessDebug 停止调试指定的进程.NtSetDebugFilterState 设置调试输出滤波器一级指定的组成部分. NtSetInformationDebugObject 设置属性的调试对象. NtWaitForDebugEvent 等待调试事件的进程正在调试. NtFlushInstructionCache 清空指定进程的指令缓冲区. NtInitiatePowerAction 启动电源事件.NtPowerInformation 获得该系统的电源状态. NtSetThreadExecutionState 设置一个线程的系统电源状态的要求. NtRequestWakeupLatency 设置一个进程唤醒延迟.NtClose 关闭处理任何对象类型.NtDuplicateObject 复制句柄的对象.NtCreateDirectoryObject 创建一个目录中的对象管理器命名空间. NtCreateSymbolicLinkObject 创建一个符号链接的对象管理器命名空间. NtOpenDirectoryObject 打开对象管理器名字空间目录. NtQueryDirectoryObject 用列举的对象位于一个目录对象. NtOpenSymbolicLinkObject 打开一个符号链接对象. NtQuerySymbolicLinkObject 归来的名称,对象,符号链接点.NtQueryObject 查询对象的属性,如它的名字.NtSetInformationObject 树立了一个对象的属性.NtTranslateFilePath 转换的文件路径的格式.NtCreateKey 创建或打开一个注册表项.NtOpenKey 打开一个现有的注册表项.NtDeleteKey 删除注册表项.NtDeleteValueKey 删除价值.NtEnumerateKey 枚举子项中的一个关键.NtEnumerateValueKey 列举了价值的一个关键.NtFlushKey 刷新变化回到注册表在磁盘上.NtInitializeRegistry 获取注册滚动.单参数对这一规定是否安装启动或正常开机. NtNotifyChangeKey 允许一个程序的通知改变某一关键或其子项. NtQueryKey 查询信息的一个关键.NtQueryMultiplValueKey 检索信息多个指定值.NtQueryValueKey 资讯检索指定的值.NtReplaceKey 变化的支持文件的一个关键和其子项,用于备份/恢复. NtSaveKey 保存的内容中的一个关键和子项文件.NtRestoreKey 装载的内容主要从一个指定的文件. NtSetInformationKey 集属性中的一个关键.NtSetValueKey 集相关的数据的价值.NtCreatePort 创建一个港口对象.NtAcceptConnectPort 接受一个端口连接.NtCompleteConnectPort 完成了连接.NtConnectPort 连接一个端口到另一个端口,接受连接. NtImpersonateClientOfPort 线程模拟确定的进程的另一端的一个港口. NtListenPort 侦听端口的连接请求.NtQueryInformationPort 获取信息的一个港口.NtReadRequestData 阅读相关资料港口信息.NtReplyPort 发送一个回复邮件.NtReplyWaitReceivePort 发送一个回复邮件,然后等待传入请求消息. NtReplyWaitReplyPort 发送一个回复邮件,然后等待传入的回复邮件. NtRequestPort 发送请求信息.NtRequestWaitReplyPort 发送请求信息,并等待传入的回复邮件. NtWriteRequestData 填写数据的请求消息.NtSecureConnectPort 创建一个安全的连接端口. NtQueryPortInformationProcess 用于确定某个进程有相关的例外或调试端口. NtAccessCheck 检查当前线程是否已进入一个对象根据其安全描述符. NtAccessCheckAndAuditAlarm 生成相关的审计信息存取检查. NtAdjustGroupsToken 加注或删除群体与象征. NtAdjustPrivilegesToken 启用或禁用特权与象征. NtCloseObjectAuditAlarm 生成审计讯息,指出一个对象被关闭了. NtCreateToken 创建令牌对象.NtDeleteObjectAuditAlarm 产生了审计事件表明,一个对象已删除. NtDuplicateToken 重复象征对象.NtImpersonateThread 允许一个线程假冒身份的其他用户. NtOpenObjectAuditAlarm 产生了审计事件表明,一个物体开幕. NtOpenProcessToken 获得句柄令牌在指定的进程. NtOpenThreadToken 打开的句柄令牌在指定线程.NtPrivilegeCheck 检查,以查看是否有人员令牌已指定特权启用. NtPrivilegeObjectAuditAlarm 生成审核事件记录与特权检查. NtPrivilegedServiceAuditAlarm 生成审计信息表明尝试使用指定的特权. NtQueryInformationToken 获取信息的象征.NtQuerySecurityObject 检索信息的对象的安全设置. NtSetInformationToken 树立了一个象征性的属性.NtSetSecurityObject 设置安全信息的一个对象. NtAccessCheckByType 新的物件具体的安全支持. NtAccessCheckByTypeAndAuditAlarm 新的物件具体的安全支持.NtAccessCheckByTypeResultList 新的物件具体的安全支持. NtFilterToken 新的物件具体的安全支持. NtCompareToken 比较了两个令牌. NtOpenProcessTokenEx 打开一个进程令牌. NtOpenThreadTokenEx 打开一个线程令牌. NtAlertResumeThread 恢复线程.NtAlertThread 发出警报,以一个线程.NtTestAlert 检验是否有线程在等待警报. NtCreateProcess 创建一个新的进程.NtCreateThread 创建一个新线程.NtCurrentTeb 返回一个指针,一个线程环境块. NtDelayExecution 睡眠,暂停一个线程在指定的时间. NtGetContextThread 检索硬件方面的线程. NtSetContextThread 集硬件方面的线程. NtOpenProcess 打开的句柄指定的进程.NtOpenThread 打开的句柄指定的线程. NtQueryInformationProcess 获取一个线程的属性. NtQueueApcThread 程序呼叫到一个线程. NtResumeThread 唤醒暂停线程. NtSetInformationProcess 设置一个进程的属性. NtSetInformationThread 设置一个线程的属性. NtSuspendThread 暂停一个线程的执行. NtTerminateProcess 删除进程.NtTerminateThread 删除线程.NtYieldExecution 原因线程放弃CPU. NtCreateProcessEx 创建一个新的进程. NtResumeProcess 恢复被暂停的进程. NtSuspendProcess 暂停一个进程.NtCancelTimer 取消计时器.NtCreateTimer 创建一个计时器.NtOpenTimer 打开一个计时器对象.NtQueryTimer 查询计时器的属性. NtQueryTimerResolution 查询系统的计时器决议. NtSetTimer 设置一个定时器到期活动. NtSetTimerResolution 设定系统计时器决议. NtQueryPerformanceCounter 查询系统的性能计数器. NtQuerySystemTime 取得当前时间.NtSetSystemTime 设置系统时间.NtGetTickCount 获取系统开机以来时间. NtCreateEvent 创建一个事件对象.NtOpenEvent 打开事件对象.NtClearEvent 清除标志着国家的事件.NtPulseEvent 信号的事件,然后重置它.NtQueryEvent 查询状况的一个事件.NtResetEvent 重置事件向非标志着国家.NtSetEvent 树立了一个活动,标志着国家.NtCreateEventPair 创建一个事件一双.NtOpenEventPair 打开一个事件对.NtSetHighEventPair 集高一半的活动,以表明对国家.NtSetHighWaitLowEventPair 集高一半的活动,以表明对国家和等待低一半,成为示意. NtSetLowEventPair 集低一半的事件对.NtSetLowWaitHighEventPair 集低一半的事件,并等待对高一半将成为标志. NtWaitHighEventPair 等待高一半事件对成为暗示.NtWaitLowEventPair 等待低一半事件对成为暗示.NtCreateMutant 创建一个突变的对象,称为互斥在用户模式.NtOpenMutant 打开一个突变对象,称为互斥用户模式.NtCreateSemaphore 创建一个信号灯对象.NtOpenSemaphore 打开一个信号灯对象.NtQuerySemaphore 查询状态的信号.NtReleaseSemaphore 标志着信号灯.NtSignalAndWaitForSingleObject 等待它标志着一次.NtWaitForMultipleObjects 等待多个对象,成为暗示.NtWaitForSingleObject 等待一个单一的对象,成为暗示.NtCreateKeyedEvent 创建一个输入事件对象.NtOpenKeyedEvent 打开一个名为键控事件对象.NtReleaseKeyedEvent 标志着键控事件对象.NtWaitForKeyedEvent 等待事件成为键控信号.NtAllocateVirtualMemory 分配虚拟内存.NtFreeVirtualMemory 释放虚拟内存.NtQueryVirtualMemory 查询范围的虚拟内存的属性.NtProtectVirtualMemory 集保护的一系列虚拟内存.NtLockVirtualMemory 锁一系列的虚拟内存.NtUnlockVirtualMemory 解锁一系列的虚拟内存.NtReadVirtualMemory 读取范围内的虚拟内存从进程.NtWriteVirtualMemory 写了一系列的虚拟内存从进程.NtFlushVirtualMemory 刷新记忆体映射的记忆体范围的文件在磁盘上.NtCreateSection 创建了一系列的内存支持文件.NtOpenSection 打开一个名为内存映射节对象.NtExtendSection 延长现有的各种虚拟内存支持文件.NtMapViewOfSection 地图一个文件中的虚拟内存.NtUnmapViewOfSection 一部分虚拟内存的支持文件.NtAreMappedFilesTheSame 装载机使用这一有效看看是否一个给定的文件已经被映射到内存中. NtCancelIoFile 取消I/O请求.NtCreateFile 创建或打开一个文件,目录或设备对象.NtCreateIoCompletion 告诉I/O管理器,一个线程希望时得到通知的I/O完成. NtOpenIoCompletion 打开一个名为I/O完成对象.NtSetIoCompletion 树立了一个I/O完成对象的属性.NtQueryIoCompletion 具体信息检索的I/O完成对象.NtRemoveIoCompletion 消除了一个I/O完成回调.NtDeleteFile 删除一个文件对象.NtDeviceIoControlFile 发送IOCTL装置的设备驱动,这是一个打开的文件对象. NtFlushBuffersFile 清除内存中的文件数据到磁盘.NtFsControlFile 发送一个I/O控制IOCTL为代表的公开设备对象.通常用于文件系统有关的特别命令. NtLockFile 锁了一系列文件的同步访问.NtUnlockFile 解锁了一系列文件的同步访问.NtNotifyChangeDirectoryFile 寄存器一个线程希望得到通知时,一个目录的内容发生变化. NtOpenFile 打开一个现有的文件.NtQueryAttributesFile 取得一个文件的属性.NtQueryDirectoryFile 检索目录的内容.NtQueryEaFile 检索文件的扩展属性.NtSetEaFile 集的扩展属性文件.NtQueryFullAttributesFile 获得文件的全部属性.NtQueryInformationFile 检索方面的具体资料的档案.NtSetInformationFile 确定具体的资料档案.NtQueryVolumeInformationFile 检索有关特定磁盘卷.NtSetVolumeInformationFile 集资讯量.NtReadFile 读取数据文件.NtWriteFile 写入数据文件.NtQueryQuotaInformationFile 查询NTFS磁盘配额信息.NtSetQuotaInformationFile 设置NTFS磁盘配额信息.NtQuerySystemInformation 性能计数器注册表中的出口的大量信息可通过这一呼吁. NtSetSystemInformation 各种行政程序使用此功能.NtShutdownSystem 关闭与选择重新启动.NtCreateJobObject 创建一个作业对象.NtOpenJobObject 打开一个作业对象.NtQueryInformationJobObject 撷取资讯作业对象.NtAssignProcessToJobObject 指定一个进程作业对象.NtSetInformationJobObject 树立了一个作业对象的属性.NtTerminateJobObject 终止作业对象,终止其所有相关的进程.NtCreateJobSet 创建了一个集多种就业工作的对象.NTSYSAPINTSTATUSNTAPINtAcceptConnectPort(OUT PHANDLE PortHandle,IN PVOID PortIdentifier,IN PPORT_MESSAGE Message,IN BOOLEAN Accept,IN OUT PPORT_VIEW ServerView OPTIONAL,OUT PREMOTE_PORT_VIEW ClientView OPTIONAL);NTSYSAPINTSTATUSNTAPINtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN HANDLE TokenHandle,IN ACCESS_MASK DesiredAccess,IN PGENERIC_MAPPING GenericMapping,OUT PPRIVILEGE_SET PrivilegeSet,IN PULONG PrivilegeSetLength,OUT PACCESS_MASK GrantedAccess,OUT PBOOLEAN AccessStatus);NTSYSAPINTSTATUSNTAPINtAccessCheckAndAuditAlarm(IN PUNICODE_STRING SubsystemName,IN PVOID HandleId,IN PUNICODE_STRING ObjectTypeName,IN PUNICODE_STRING ObjectName,IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN ACCESS_MASK DesiredAccess,IN PGENERIC_MAPPING GenericMapping,IN BOOLEAN ObjectCreation,OUT PACCESS_MASK GrantedAccess,OUT PBOOLEAN AccessStatus,OUT PBOOLEAN GenerateOnClose);NTSYSAPINTSTATUSNTAPINtAccessCheckByType(IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN PSID PrincipalSelfSid,IN HANDLE TokenHandle,IN ULONG DesiredAccess,IN POBJECT_TYPE_LIST ObjectTypeList,IN ULONG ObjectTypeListLength,IN PGENERIC_MAPPING GenericMapping,IN PPRIVILEGE_SET PrivilegeSet,IN PULONG PrivilegeSetLength,OUT PACCESS_MASK GrantedAccess,OUT PULONG AccessStatus);NTSYSAPINTSTATUSNTAPI NtAccessCheckByTypeAndAuditAlarm(IN PUNICODE_STRING SubsystemName,IN PVOID HandleId,IN PUNICODE_STRING ObjectTypeName,IN PUNICODE_STRING ObjectName,IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN PSID PrincipalSelfSid,IN ACCESS_MASK DesiredAccess,IN AUDIT_EVENT_TYPE AuditType,IN ULONG Flags,IN POBJECT_TYPE_LIST ObjectTypeList,IN ULONG ObjectTypeListLength,IN PGENERIC_MAPPING GenericMapping,IN BOOLEAN ObjectCreation,OUT PACCESS_MASK GrantedAccess,OUT PULONG AccessStatus,OUT PBOOLEAN GenerateOnClose);NTSYSAPINTSTATUSNTAPINtAccessCheckByTypeResultList(IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN PSID PrincipalSelfSid,IN HANDLE TokenHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_TYPE_LIST ObjectTypeList,IN ULONG ObjectTypeListLength,IN PGENERIC_MAPPING GenericMapping,IN PPRIVILEGE_SET PrivilegeSet,IN PULONG PrivilegeSetLength,OUT PACCESS_MASK GrantedAccessList,OUT PULONG AccessStatusList);NTSYSAPINTSTATUSNTAPI NtAccessCheckByTypeResultListAndAuditAlarm( IN PUNICODE_STRING SubsystemName,IN PVOID HandleId,IN PUNICODE_STRING ObjectTypeName,IN PUNICODE_STRING ObjectName,IN PSECURITY_DESCRIPTOR SecurityDescriptor,IN PSID PrincipalSelfSid,IN ACCESS_MASK DesiredAccess,IN AUDIT_EVENT_TYPE AuditType,IN ULONG Flags,IN POBJECT_TYPE_LIST ObjectTypeList,IN ULONG ObjectTypeListLength,IN PGENERIC_MAPPING GenericMapping,IN BOOLEAN ObjectCreation,OUT PACCESS_MASK GrantedAccessList,OUT PULONG AccessStatusList,OUT PULONG GenerateOnClose);NTSYSAPINTSTATUSNTAPI NtAccessCheckByTypeResultListAndAuditAlarmByHandle( IN PUNICODE_STRING SubsystemName,IN PVOID HandleId,IN HANDLE TokenHandle,IN PUNICODE_STRING ObjectTypeName,IN PUNICODE_STRING ObjectName,IN PSECURITY_DESCRIPTOR SecurityDescriptor,IN PSID PrincipalSelfSid,IN ACCESS_MASK DesiredAccess,IN AUDIT_EVENT_TYPE AuditType,IN ULONG Flags,IN POBJECT_TYPE_LIST ObjectTypeList,IN ULONG ObjectTypeListLength,IN PGENERIC_MAPPING GenericMapping,IN BOOLEAN ObjectCreation,OUT PACCESS_MASK GrantedAccessList,OUT PULONG AccessStatusList,OUT PULONG GenerateOnClose);NTSYSAPINTSTATUSNTAPINtAddAtom(IN PWSTR String,IN ULONG StringLength,OUT PUSHORT Atom);NTSYSAPINTSTATUSNTAPINtAddBootEntry(IN PUNICODE_STRING EntryName,IN PUNICODE_STRING EntryValue);NTSYSAPINTSTATUSNTAPINtAddDriverEntry(IN PUNICODE_STRING DriverName,IN PUNICODE_STRING DriverPath);NTSYSAPINTSTATUSNTAPINtAdjustGroupsToken(IN HANDLE TokenHandle,IN BOOLEAN ResetToDefault,IN PTOKEN_GROUPS NewState,IN ULONG BufferLength,OUT PTOKEN_GROUPS PreviousState OPTIONAL,OUT PULONG ReturnLength);NTSYSAPINTSTATUSNTAPINtAdjustPrivilegesToken(IN HANDLE TokenHandle,IN BOOLEAN DisableAllPrivileges,IN PTOKEN_PRIVILEGES NewState,IN ULONG BufferLength,OUT PTOKEN_PRIVILEGES PreviousState OPTIONAL, OUT PULONG ReturnLength OPTIONAL);NTSYSAPINTSTATUSNTAPINtAlertResumeThread(IN HANDLE ThreadHandle,OUT PULONG PreviousSuspendCount OPTIONAL );NTSYSAPINTSTATUSNTAPINtAllocateLocallyUniqueId(OUT PLUID Luid);NTSYSAPINTSTATUSNTAPINtAllocateUserPhysicalPages(IN HANDLE ProcessHandle,IN PULONG NumberOfPages,OUT PULONG PageFrameNumbers);NTSYSAPINTSTATUSNTAPINtAllocateUuids(OUT PLARGE_INTEGER UuidLastTimeAllocated,OUT PULONG UuidDeltaTime,OUT PULONG UuidSequenceNumber,OUT PUCHAR UuidSeed);NTSYSAPINTSTATUSNTAPINtAllocateVirtualMemory(IN HANDLE ProcessHandle,IN OUT PVOID *BaseAddress,IN ULONG ZeroBits,IN OUT PULONG AllocationSize,IN ULONG AllocationType,IN ULONG Protect);NTSYSAPINTSTATUSNTAPINtApphelpCacheControl(IN APPHELPCACHECONTROL ApphelpCacheControl, IN PUNICODE_STRING ApphelpCacheObject);NTSYSAPINTSTATUSNTAPINtAreMappedFilesTheSame(IN PVOID Address1,IN PVOID Address2);NTSYSAPINTSTATUSNTAPI NtAssignProcessToJobObject(IN HANDLE JobHandle,IN HANDLE ProcessHandle);NTSYSAPINTSTATUSNTAPINtCallbackReturn(IN PVOID Result OPTIONAL,IN ULONG ResultLength,IN NTSTATUS Status);NTSYSAPINTSTATUSNTAPI NtCancelDeviceWakeupRequest(IN HANDLE DeviceHandle);NTSYSAPINTSTATUSNTAPINtCancelIoFile(IN HANDLE FileHandle,OUT PIO_STATUS_BLOCK IoStatusBlock );NTSYSAPINTSTATUSNTAPINtCancelTimer(IN HANDLE TimerHandle,OUT PBOOLEAN PreviousState OPTIONAL );NTSYSAPINTSTATUSNTAPINtClearEvent(IN HANDLE EventHandle);NTSYSAPINTSTATUSNTAPINtClose(IN HANDLE Handle);NTSYSAPINTSTATUSNTAPINtCloseObjectAuditAlarm(IN PUNICODE_STRING SubsystemName, IN PVOID HandleId,IN BOOLEAN GenerateOnClose);NTSYSAPINTSTATUSNTAPINtCompactKeys(IN ULONG Length,IN HANDLE Key);NTSYSAPINTSTATUSNTAPINtCompareTokens(IN HANDLE FirstTokenHandle,IN HANDLE SecondTokenHandle,OUT PBOOLEAN IdenticalTokens );NTSYSAPINTSTATUSNTAPINtCompleteConnectPort(IN HANDLE PortHandle);NTSYSAPINTSTATUSNTAPINtCompressKey(IN HANDLE Key);NTSYSAPINTSTATUSNTAPINtConnectPort(OUT PHANDLE PortHandle,IN PUNICODE_STRING PortName,IN PSECURITY_QUALITY_OF_SERVICE SecurityQos, IN OUT PPORT_VIEW ClientView OPTIONAL,OUT PREMOTE_PORT_VIEW ServerView OPTIONAL, OUT PULONG MaxMessageLength OPTIONAL,IN OUT PVOID ConnectInformation OPTIONAL,IN OUT PULONG ConnectInformationLength OPTIONAL );NTSYSAPINTSTATUSNTAPINtContinue(IN PCONTEXT Context,IN BOOLEAN TestAlert);NTSYSAPINTSTATUSNTAPINtCreateDebugObject(OUT PHANDLE DebugObject,IN ULONG AccessRequired,IN POBJECT_ATTRIBUTES ObjectAttributes,IN BOOLEAN KillProcessOnExit);NTSYSAPINTSTATUSNTAPINtCreateDirectoryObject(OUT PHANDLE DirectoryHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes);NTSYSAPINTSTATUSNTAPINtCreateEvent(OUT PHANDLE EventHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN EVENT_TYPE EventType,IN BOOLEAN InitialState);NTSYSAPINTSTATUSNTAPINtCreateEventPair(OUT PHANDLE EventPairHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes );NTSYSAPINTSTATUSNTAPINtCreateFile(OUT PHANDLE FileHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,OUT PIO_STATUS_BLOCK IoStatusBlock,IN PLARGE_INTEGER AllocationSize OPTIONAL, IN ULONG FileAttributes,IN ULONG ShareAccess,IN ULONG CreateDisposition,IN ULONG CreateOptions,IN PVOID EaBuffer OPTIONAL,IN ULONG EaLength);NTSYSAPINTSTATUSNTAPINtCreateIoCompletion(OUT PHANDLE IoCompletionHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN ULONG NumberOfConcurrentThreads);NTSYSAPINTSTATUSNTAPINtCreateJobObject(OUT PHANDLE JobHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes );NTSYSAPINTSTATUSNTAPINtCreateJobSet(IN ULONG Jobs,IN PJOB_SET_ARRAY JobSet,IN ULONG Reserved);NTSYSAPINTSTATUSNTAPINtCreateKey(OUT PHANDLE KeyHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN ULONG TitleIndex,IN PUNICODE_STRING Class OPTIONAL,IN ULONG CreateOptions,OUT PULONG Disposition OPTIONAL);NTSYSAPINTSTATUSNTAPINtCreateKeyedEvent(OUT PHANDLE KeyedEventHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN ULONG Reserved);NTSYSAPINTSTATUSNTAPINtCreateMailslotFile(OUT PHANDLE FileHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,OUT PIO_STATUS_BLOCK IoStatusBlock,IN ULONG CreateOptions,IN ULONG InBufferSize,IN ULONG MaxMessageSize,IN PLARGE_INTEGER ReadTimeout OPTIONAL );NTSYSAPINTSTATUSNTAPINtCreateMutant(OUT PHANDLE MutantHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN BOOLEAN InitialOwner);NTSYSAPINTSTATUSNTAPINtCreateNamedPipeFile(OUT PHANDLE FileHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,OUT PIO_STATUS_BLOCK IoStatusBlock,IN ULONG ShareAccess,IN ULONG CreateDisposition,IN ULONG CreateOptions,IN BOOLEAN TypeMessage,IN BOOLEAN ReadmodeMessage,IN BOOLEAN Nonblocking,IN ULONG MaxInstances,IN ULONG InBufferSize,IN ULONG OutBufferSize,IN PLARGE_INTEGER DefaultTimeout OPTIONAL );NTSYSAPINTSTATUSNTAPINtCreatePagingFile(IN PUNICODE_STRING FileName,IN PULARGE_INTEGER InitialSize,IN PULARGE_INTEGER MaximumSize,IN ULONG Priority OPTIONAL);NTSYSAPINTSTATUSNTAPINtCreatePort(OUT PHANDLE PortHandle,IN POBJECT_ATTRIBUTES ObjectAttributes,IN ULONG MaxConnectionInfoLength,IN ULONG MaxMessageLength,IN ULONG MaxPoolUsage);NTSYSAPINTSTATUSNTAPINtCreateProcess(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE InheritFromProcessHandle,IN BOOLEAN InheritHandles,IN HANDLE SectionHandle OPTIONAL,IN HANDLE DebugPort OPTIONAL,IN HANDLE ExceptionPort OPTIONAL );NTSYSAPINTSTATUSNTAPINtCreateProcessEx(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE InheritFromProcessHandle,IN ULONG CreateFlags,IN HANDLE SectionHandle OPTIONAL,IN HANDLE DebugObject OPTIONAL,IN HANDLE ExceptionPort OPTIONAL,IN ULONG JobMemberLevel);NTSYSAPINTSTATUSNTAPINtCreateProfile(OUT PHANDLE ProfileHandle,IN HANDLE ProcessHandle,IN PVOID Base,IN ULONG Size,IN ULONG BucketShift,IN PULONG Buffer,IN ULONG BufferLength,IN KPROFILE_SOURCE Source,IN ULONG ProcessorMask);NTSYSAPINTSTATUSNTAPINtCreateSection(IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes, IN PLARGE_INTEGER SectionSize OPTIONAL, IN ULONG Protect,IN ULONG Attributes,IN HANDLE FileHandle);NTSYSAPINTSTATUSNTAPINtCreateSemaphore(OUT PHANDLE SemaphoreHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes, IN LONG InitialCount,IN LONG MaximumCount);NTSYSAPINTSTATUSNTAPINtCreateSymbolicLinkObject(OUT PHANDLE SymbolicLinkHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes, IN PUNICODE_STRING TargetName);NTSYSAPINTSTATUSNTAPINtCreateThread(OUT PHANDLE ThreadHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE ProcessHandle,OUT PCLIENT_ID ClientId,IN PCONTEXT ThreadContext,IN PUSER_STACK UserStack,IN BOOLEAN CreateSuspended);NTSYSAPINTSTATUSNTAPINtCreateTimer(IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes, IN TIMER_TYPE TimerType);NTSYSAPINTSTATUSNTAPINtCreateToken(OUT PHANDLE TokenHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes, IN TOKEN_TYPE Type,IN PLUID AuthenticationId,IN PLARGE_INTEGER ExpirationTime,IN PTOKEN_USER User,IN PTOKEN_GROUPS Groups,IN PTOKEN_PRIVILEGES Privileges,IN PTOKEN_OWNER Owner,IN PTOKEN_PRIMARY_GROUP PrimaryGroup, IN PTOKEN_DEFAULT_DACL DefaultDacl,IN PTOKEN_SOURCE Source);NTSYSAPINTSTATUSNTAPINtCreateWaitablePort(OUT PHANDLE PortHandle,IN POBJECT_ATTRIBUTES ObjectAttributes, IN ULONG MaxConnectionInfoLength,IN ULONG MaxMessageLength,IN ULONG MaxPoolUsage);NTSYSAPINTSTATUSNTAPINtDebugActiveProcess(IN HANDLE Process,IN HANDLE DebugObject);NTSYSAPINTSTATUSNTAPINtDebugContinue(IN HANDLE DebugObject,IN PCLIENT_ID AppClientId,IN NTSTATUS ContinueStatus);NTSYSAPINTSTATUSNTAPINtDelayExecution(IN BOOLEAN Alertable,IN PLARGE_INTEGER Interval);NTSYSAPINTSTATUSNTAPINtDeleteAtom(IN USHORT Atom);NTSYSAPINTSTATUSNTAPINtDeleteBootEntry(IN PUNICODE_STRING EntryName,IN PUNICODE_STRING EntryValue);NTSYSAPINTSTATUSNTAPINtDeleteDriverEntry(IN PUNICODE_STRING DriverName,IN PUNICODE_STRING DriverPath);NTSYSAPINTSTATUSNTAPINtDeleteFile(IN POBJECT_ATTRIBUTES ObjectAttributes );NTSYSAPINTSTATUSNTAPINtDeleteKey(IN HANDLE KeyHandle);NTSYSAPINTSTATUSNTAPINtDeleteObjectAuditAlarm(IN PUNICODE_STRING SubsystemName,IN PVOID HandleId,IN BOOLEAN GenerateOnClose);NTSYSAPINTSTATUSNTAPINtDeleteValueKey(IN HANDLE KeyHandle,IN PUNICODE_STRING ValueName);NTSYSAPINTSTATUSNTAPINtDeviceIoControlFile(IN HANDLE FileHandle,IN HANDLE Event OPTIONAL,IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, IN PVOID ApcContext OPTIONAL,OUT PIO_STATUS_BLOCK IoStatusBlock,IN ULONG IoControlCode,IN PVOID InputBuffer OPTIONAL,IN ULONG InputBufferLength,OUT PVOID OutputBuffer OPTIONAL,IN ULONG OutputBufferLength);NTSYSAPINTSTATUSNTAPINtDisplayString(IN PUNICODE_STRING String);NTSYSAPINTSTATUSNTAPINtDuplicateObject(IN HANDLE SourceProcessHandle,IN HANDLE SourceHandle,IN HANDLE TargetProcessHandle,OUT PHANDLE TargetHandle OPTIONAL,IN ACCESS_MASK DesiredAccess,IN ULONG Attributes,IN ULONG Options);NTSYSAPINTSTATUSNTAPINtDuplicateToken(IN HANDLE ExistingTokenHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN BOOLEAN EffectiveOnly,IN TOKEN_TYPE TokenType,OUT PHANDLE NewTokenHandle);NTSYSAPINTSTATUSNTAPINtEnumerateBootEntries(IN ULONG Unknown1,IN ULONG Unknown2);NTSYSAPINTSTATUSNTAPINtEnumerateKey(IN HANDLE KeyHandle,IN ULONG Index,IN KEY_INFORMATION_CLASS KeyInformationClass, OUT PVOID KeyInformation,IN ULONG KeyInformationLength,OUT PULONG ResultLength);NTSYSAPINTSTATUSNTAPI NtEnumerateSystemEnvironmentValuesEx(IN ULONG Unknown1,IN ULONG Unknown2,IN ULONG Unknown3);NTSYSAPINTSTATUSNTAPINtEnumerateValueKey(IN ULONG Index,IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, OUT PVOID KeyValueInformation,IN ULONG KeyValueInformationLength,OUT PULONG ResultLength);NTSYSAPINTSTATUSNTAPINtExtendSection(IN HANDLE SectionHandle,IN PLARGE_INTEGER SectionSize);NTSYSAPINTSTATUSNTAPINtFilterToken(IN HANDLE ExistingTokenHandle,IN ULONG Flags,IN PTOKEN_GROUPS SidsToDisable,IN PTOKEN_PRIVILEGES PrivilegesToDelete,IN PTOKEN_GROUPS SidsToRestricted,OUT PHANDLE NewTokenHandle);NTSYSAPINTSTATUSNTAPINtFindAtom(IN PWSTR String,IN ULONG StringLength,OUT PUSHORT Atom);NTSYSAPINTSTATUSNTAPINtFlushBuffersFile(IN HANDLE FileHandle,OUT PIO_STATUS_BLOCK IoStatusBlock);NTSYSAPINTSTATUSNTAPINtFlushInstructionCache(IN PVOID BaseAddress OPTIONAL,IN ULONG FlushSize);NTSYSAPINTSTATUSNTAPINtFlushKey(IN HANDLE KeyHandle);NTSYSAPINTSTATUSNTAPINtFlushVirtualMemory(IN HANDLE ProcessHandle,IN OUT PVOID *BaseAddress,IN OUT PULONG FlushSize,OUT PIO_STATUS_BLOCK IoStatusBlock );NTSYSAPINTSTATUSNTAPINtFlushWriteBuffer(VOID);NTSYSAPINTSTATUSNTAPINtYieldExecution(VOID);NTSYSAPINTSTATUSNTAPINtWriteVirtualMemory(IN HANDLE ProcessHandle,IN PVOID BaseAddress,IN PVOID Buffer,IN ULONG BufferLength,OUT PULONG ReturnLength OPTIONAL );NTSYSAPINTSTATUSNTAPINtWriteRequestData(IN HANDLE PortHandle,IN PPORT_MESSAGE Message,IN ULONG Index,IN PVOID Buffer,IN ULONG BufferLength,OUT PULONG ReturnLength OPTIONAL );NTSYSAPINTSTATUSNTAPINtWriteFileGather(IN HANDLE FileHandle,IN HANDLE Event OPTIONAL,IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, IN PVOID ApcContext OPTIONAL,OUT PIO_STATUS_BLOCK IoStatusBlock,IN PFILE_SEGMENT_ELEMENT Buffer,IN ULONG Length,IN PLARGE_INTEGER ByteOffset OPTIONAL, IN PULONG Key OPTIONAL);NTSYSAPINTSTATUSNTAPINtWriteFile(IN HANDLE FileHandle,IN HANDLE Event OPTIONAL,IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, IN PVOID ApcContext OPTIONAL,OUT PIO_STATUS_BLOCK IoStatusBlock,IN PVOID Buffer,IN ULONG Length,IN PLARGE_INTEGER ByteOffset OPTIONAL, IN PULONG Key OPTIONAL);NTSYSAPINTSTATUSNTAPINtWaitLowEventPair(IN HANDLE EventPairHandle);NTSYSAPINTSTATUSNTAPINtWaitHighEventPair(IN HANDLE EventPairHandle);NTSYSAPINTSTATUSNTAPINtWaitForSingleObject(IN HANDLE Handle,IN BOOLEAN Alertable,IN PLARGE_INTEGER Timeout OPTIONAL );NTSYSAPINTSTATUSNTAPINtWaitForMultipleObjects32(IN ULONG HandleCount,IN PHANDLE Handles,IN WAIT_TYPE WaitType,IN BOOLEAN Alertable,IN PLARGE_INTEGER Timeout OPTIONAL );NTSYSAPINTSTATUSNTAPINtWaitForMultipleObjects(IN ULONG HandleCount,IN PHANDLE Handles,IN WAIT_TYPE WaitType,IN BOOLEAN Alertable,IN PLARGE_INTEGER Timeout OPTIONAL );NTSYSAPINTSTATUSNTAPINtWaitForKeyedEvent(IN HANDLE KeyedEventHandle,IN PVOID Key,IN BOOLEAN Alertable,IN PLARGE_INTEGER Timeout OPTIONAL );NTSYSAPINTSTATUSNTAPINtWaitForDebugEvent(IN HANDLE DebugObject,IN BOOLEAN Alertable,IN PLARGE_INTEGER Timeout OPTIONAL,OUT PDBGUI_WAIT_STATE_CHANGE StateChange );NTSYSAPINTSTATUSNTAPINtVdmControl(IN VDMSERVICECLASS Service,IN OUT PVOID ServiceData);NTSYSAPINTSTATUSNTAPINtUnmapViewOfSection(IN HANDLE ProcessHandle,IN PVOID BaseAddress);NTSYSAPINTSTATUSNTAPINtUnlockVirtualMemory(IN HANDLE ProcessHandle,IN OUT PVOID *BaseAddress,IN OUT PULONG LockSize,IN ULONG LockType);NTSYSAPINTSTATUSNTAPINtUnlockFile(IN HANDLE FileHandle,OUT PIO_STATUS_BLOCK IoStatusBlock,IN PULARGE_INTEGER LockOffset,IN PULARGE_INTEGER LockLength,IN ULONG Key);NTSYSAPINTSTATUSNTAPINtUnloadKeyEx(IN POBJECT_ATTRIBUTES KeyObjectAttributes,IN HANDLE EventHandle OPTIONAL);NTSYSAPINTSTATUSNTAPINtUnloadKey2(IN POBJECT_ATTRIBUTES KeyObjectAttributes, IN BOOLEAN ForceUnload);NTSYSAPINTSTATUSNTAPINtUnloadKey(IN POBJECT_ATTRIBUTES KeyObjectAttributes );NTSYSAPINTSTATUSNTAPINtUnloadDriver(IN PUNICODE_STRING DriverServiceName );NTSYSAPINTSTATUSNTAPINtTranslateFilePath(PFILE_PATH InputFilePath,ULONG OutputType,PFILE_PATH OutputFilePath,ULONG OutputFilePathLength);NTSYSAPINTSTATUSNTAPINtTraceEvent(IN ULONG TraceHandle,IN ULONG Flags,IN ULONG TraceHeaderLength,IN PEVENT_TRACE_HEADER TraceHeader);NTSYSAPINTSTATUSNTAPINtTerminateThread(IN HANDLE ThreadHandle OPTIONAL,。
Windows内核原理与实现Windows内核是Windows操作系统的核心组件,它负责管理系统资源、提供系统调度和安全保护等功能。
了解Windows内核的原理与实现对于理解Windows操作系统的工作机制和优化系统性能都非常重要。
首先,我们来看一下Windows内核的基本结构。
Windows内核主要由微内核和外围服务组成。
微内核包括进程管理、内存管理、设备驱动程序和安全机制等核心功能,而外围服务则包括文件系统、网络协议栈、图形用户界面等辅助功能。
微内核和外围服务之间通过系统调用和驱动程序接口进行通信和交互,从而实现整个操作系统的功能。
在Windows内核的实现中,进程管理是其中非常重要的一部分。
Windows内核通过进程管理来管理系统中运行的进程,包括进程的创建、调度、终止和资源分配等。
每个进程都有自己的地址空间和运行环境,通过进程管理可以确保不同进程之间的隔离和安全性。
另外,内存管理也是Windows内核的重要组成部分。
内存管理负责管理系统的物理内存和虚拟内存,包括内存的分配、回收、页面置换和内存保护等功能。
通过内存管理,Windows内核可以有效地管理系统的内存资源,提高系统的运行效率和稳定性。
除了进程管理和内存管理,设备驱动程序也是Windows内核的重要组成部分。
设备驱动程序负责管理系统中的各种硬件设备,包括磁盘驱动器、网络适配器、显卡和打印机等。
通过设备驱动程序,Windows内核可以与硬件设备进行通信和交互,从而实现对硬件设备的控制和管理。
此外,安全机制也是Windows内核的重要功能之一。
Windows内核通过安全机制来确保系统的安全性和稳定性,包括访问控制、安全标识和安全策略等。
通过安全机制,Windows内核可以对系统资源进行保护和管理,防止恶意程序和攻击对系统造成损害。
总的来说,Windows内核是Windows操作系统的核心组件,它负责管理系统资源、提供系统调度和安全保护等功能。
Windows驱动开发技术详解第六章的(Windows内核函数)自我理解学习各种高级外挂制作技术,马上去百度搜索(魔鬼作坊),点击第一个站进入,快速成为做挂达人。
其实这章主要就是讲函数DDK有自己的函数跟SDK一样编写DDK使用DDK提供的函数就OK了///////////////////////////////////////////////////////////////////////////////ASCII字符串和宽字符串ASCII字符构造char*str1="abc";打印ASCII字符串char*string="hello";KdPrint("%s\n",string);\\注意是小写%s/////UNICODE字符构造wchar_t*str2=L"abc";打印宽字符串WCHAR*string=L"hello";KdPrint("%S\n",string);\\注意是大写%S///////////////////////////////////////////////////////////////////////////////ANSI_STRING字符串和UNICODE_STRING字符串ASCII字符串进行了封装typedef struct_STRING{USHORT Length;//字符的长度。
USHORT MaximumLength;//整个字符串缓冲区的最大长度。
PCHAR Buffer;//缓冲区的指针。
}STRING;输出字符串ANSI_STRING ansiString;KdPrint("%Z\n",&ansiString);//注意是%ZUNICODE_STRING宽字符串封装typedef struct_UNICODE_STRING{USHORT Length;//字符的长度,单位是字节。
如果是N个字符,那么Length等于N的2倍。
USHORT MaximumLength;//整个字符串缓冲区的最大长度,单位也是字节。
PWSTR Buffer;//缓冲区的指针。
}UNICODE_STRING*PUNICODE_STRING;输出字符串UNICODE_STRING ansiString;KdPrint("%wZ\n",&ansiString);//注意是%wZ///////////////////////////////////////////////////////////////////////////////字符初始化与销毁初始化ANSI_STRING字符串VOIDRtlInitAnsiString(IN OUT PANSI_STRING DestinationString,//要初始化的ANSI_STRING字符串IN PCSZ SourceString//字符串的内容);初始化UNICODE_STRING字符串VOIDRtlInitUnicodeString(IN OUT PUNICODE_STRING DestinationString,//要初始化的UNICODE_STRING字符串IN PCWSTR SourceString//字符串的内容);///////////////////////////////////////////////////////////////////////////////字符串复制ANSI_STRING字符串复制VOIDRtlCopyString(IN OUT PSTRING DestinationString,//目的字符串。
IN PSTRING SourceString OPTIONAL//源字符串。
);UNICODE_STRING字符串复制VOIDRtlCopyUnicodeString(IN OUT PUNICODE_STRING DestinationString,//目的字符串。
IN PUNICODE_STRING SourceString//源字符串。
);///////////////////////////////////////////////////////////////////////////////字符串比较ANSI_STRING字符串LONGRtlCompareString(IN PSTRING String1,//要比较的第一个字符串。
IN PSTRING String2,//要比较的第二个字符串。
BOOLEAN CaseInSensitive//是否对大小写敏感。
);UNICODE_STRING字符串LONGRtlCompareUnicodeString(IN PUNICODE_STRING String1,//要比较的第一个字符串。
IN PUNICODE_STRING String2,//要比较的第二个字符串。
IN BOOLEAN CaseInSensitive//是否对大小写敏感。
);///////////////////////////////////////////////////////////////////////////////字符串转化成大写ANSI_STRING字符串转化成大写VOIDRtlUpperString(IN OUT PSTRING DestinationString,//目的字符串。
IN PSTRING SourceString//源字符串。
);UNICODE_STRING字符串转化成大写NTSTA TUSRtlUpcaseUnicodeString(IN OUT PUNICODE_STRING DestinationString OPTIONAL,//目的字符串。
IN PCUNICODE_STRING SourceString,//源字符串。
IN BOOLEAN AllocateDestinationString//是否为目的字符串分配内存。
);///////////////////////////////////////////////////////////////////////////////字符串与整型数字相互转换UNICODE_STRING字符串转化成整数NTSTA TUSRtlUnicodeStringToInteger(IN PUNICODE_STRING String,//需要转换的字符串。
IN ULONG Base OPTIONAL,//转换的数的进制(如2,8,10,16)。
OUT PULONG Value//需要转换的数字。
);将整数转化成UNICODE_STRING字符串NTSTA TUSRtlIntegerToUnicodeString(IN ULONG Value,//需要转换的数字。
IN ULONG Base OPTIONAL,//转换的数的进制(如2,8,10,16)。
IN OUT PUNICODE_STRING String//需要转换的字符串。
);///////////////////////////////////////////////////////////////////////////////内核模式下的文件操作文件创建NTSTA TUSZwCreateFile(OUT PHANDLE FileHandle,//返回打开文件的句柄IN ACCESS_MASK DesiredAccess,//对打开文件操作的描述,读,写或者其他。
一般指定GENERIC_READ或者GENERIC_WRITE。
IN POBJECT_ATTRIBUTES ObjectAttributes,//是OBJECT_ATTRIBUTES结构地址,该结构包含要打开的文件名。
OUT PIO_STA TUS_BLOCK IoStatusBlock,//指向一个IO_STA TUS_BLOCK结构,该结构接收ZwCreateFile操作的结果状态。
IN PLARGE_INTEGER AllocationSize OPTIONAL,//是一个指针,指向一个64位整数,该数指定文件初始分配时的大小。
该参数仅关系到创建或重写文件操作,如果忽略它(如笔者在这里所做的),那么文件长度将从0开始,并随着写入而增长。
IN ULONG FileAttributes,//0或FILE_ATTRIBUTE_NORML,指定新创建文件的属性。
IN ULONG ShareAccess,//FILE_SHARE_READ或0,指定文件的共享方式。
如果仅为读数据而打开文件,则可以与其他线程同时读取该文件。
如果为写数据而打开文件,可能不希望其他线程访问该文件。
IN ULONG CreateDisposition,//FILE_OPEN或FILE_OVERWRITE_IF,表明当指定文件存在或不存在时应如何处理。
IN ULONG CreateOptions,//FILE_SYNCHRONOUS_IO_NONALERT,指定控制打开操作和句柄使用的附加标志位。
IN PVOID EaBuffer OPTIONAL,//一个指针,指向可选的扩展属性区。
IN ULONG EaLength//扩展属性区的长度。
);DDK提供了对OBJECT_ATTRIBUTES结构初始化的宏InitializeObjectAttributesVOIDInitializeObjectAttributes(OUT POBJECT_ATTRIBUTES InitializedAttributes,//返回的OBJECT_ATTRIBUTES结构IN PUNICODE_STRING ObjectName,//对象名称,用UNICODE_STRING描述,这里设置的是文件名。
IN ULONG Attributes,//一般设为OBJ_CASE_INSENSITIVE,对大小敏感。
IN HANDLE RootDirectory,//一般为NULL空IN PSECURITY_DESCRIPTOR SecurityDescriptor//一般为NULL空);打开文件NTSTA TUSZwOpenFile(OUT PHANDLE FileHandle,//返回打开的文件句柄。
IN ACCESS_MASK DesiredAccess,//打开的权限,一般设为GENERIC_ALL。
IN POBJECT_ATTRIBUTES ObjectAttributes,//ObjectAttributes结构指针。