0x0 简介 与某个运行中进程相关的用户账户和访问特权是由一个叫做令牌(token)的内核对象决定的。跟踪各种与进程相关的数据的内核数据结构中,包含一个指向进程令牌的指针。..._EX_FAST_REF 结构是依赖于假设内核数据结构被要求在内存中以16字节边界对齐的一种策略。...在操作系统中正在运行的所有进程的 _EPROCESS 结构体通过 ActiveProcessLinks 成员被连接在一个环形双向链表中。...我不确保是否将一直是这种情况,并且我相信在 x64 系统中它必须在内核内存中同时使用 LARGE PAGE,其使内存保护失效(内存只能够在虚拟内存页面大小的粒度被设置为非可执行)。...我接下来修改用户模式测试程序,使用如下的函数来从 priv 二进制文件中读取数据而不是传入硬编码字符串。
驱动开发过程中,主要使用的C语言,虽说C中定义了许多数据类型,但是一般来说在编码上还是习惯与使用WDK的规范,虽说这个不是必须的,比如有这样一句 unsigned long ul = 0; 这个数据的大小根据不同的机器不同的编译器环境略有不同...PWCHAR Buffer;//缓冲的地址 } UNICODE_STRING; 这个结构体在使用是需要注意的是上述两个大小单位是字节数而不是字符个数,另外在操作UNICODE_STRING...所以在使用时要特别注意不要试图改变静态常量区的内容,也要特别注意指向的内存是在栈中还是在堆中。...Flags:表名该设备的一些标志信息,主要有下面几个值: 标志 描述 DO_BUFFERED_IO 读写使用缓冲方式,内核层在使用用户缓冲区时会将用户分区中的数据拷贝到内核分区中 DO_EXCLUSIVE...DeviceExtension:指向一块扩展的内存,系统允许用户在创建设备对象时自定义一块区域用来保存结构体中没有但是用户自己感兴趣的内容。
在应用层下的文件操作只需要调用微软应用层下的API函数及C库标准函数即可,而如果在内核中读写文件则应用层的API显然是无法被使用的,内核层需要使用内核专有API,某些应用层下的API只需要增加Zw开头即可在内核中使用...[in, optional] PLARGE_INTEGER AllocationSize, // 指向LARGE_INTEGER的指针,其中包含创建或覆盖的文件的初始分配大小(以字节为单位...;本例中我们需要读入文件的所占字节数,那么FileInformation字段就需要传入FileStandardInformation来获取文件的基本信息,获取到的信息会被存储到FILE_STANDARD_INFORMATION...程序的大小字节数,如下图所示;图片内核文件读写: 内核读取文件可以使用ZwReadFile(),内核写入文件则可使用ZwWriteFile(),这两个函数的参数传递基本上一致,如下是读写两个函数的对比参数...[in, optional] PLARGE_INTEGER ByteOffset, // 指定将开始读取操作的文件中的起始字节偏移量。
在Windows内核模式编程中,获取当前系统时间是一个常见的需求。这可能用于日志记录、性能监控、计时操作等多种场景。...本文将详细介绍如何在Windows内核模式下获取当前系统时间,包括使用KeQuerySystemTime和KeQueryPerformanceCounter函数。1....);PerformanceFrequency:指向LARGE_INTEGER变量的指针,该变量接收性能计数器的频率(以刻度/秒为单位)。...然后,我们使用DbgPrint函数打印这些值。3. 将系统时间转换为本地时间在某些情况下,我们可能需要将获取的UTC时间转换为本地时间。...最后,我们使用RtlTimeToTimeFields函数将LARGE_INTEGER时间转换为TIME_FIELDS结构体,以便更容易地访问年、月、日、时、分、秒等字段。
例如,要用Win32 API 打开一个文件,应用程序会调用 CreateFile(),而要用 POSIX API,则应用程序调用 open() 函数。...ParamTableBase 包含每个系统服务参数字节数表的基地址。...System Service Parameter Table(SSPT):系统服务参数表,定义了对应函数的参数字节,每个函数对应一个字节。如在0x804AB3BF处的函数需0x18字节的参数。...这两个宏之所以能工作,是因为所有的Zw*函数都开始于opcode:MOV eax, ULONG,这里的ULONG就是系统调用函数在SSDT中的索引。...我们现在就想办法,先在系统中找到IDT,然后确定0x2E在IDT中的地址,最后用我们的函数地址去取代它,这样以来,用户的进程(可以特定设置)一调用系统服务,我们的hook函数即被激发。
在应用层下的文件操作只需要调用微软应用层下的API函数及C库标准函数即可,而如果在内核中读写文件则应用层的API显然是无法被使用的,内核层需要使用内核专有API,某些应用层下的API只需要增加Zw开头即可在内核中使用...[in, optional] PLARGE_INTEGER AllocationSize, // 指向LARGE_INTEGER的指针,其中包含创建或覆盖的文件的初始分配大小(以字节为单位...); 本例中我们需要读入文件的所占字节数,那么FileInformation字段就需要传入FileStandardInformation来获取文件的基本信息,获取到的信息会被存储到FILE_STANDARD_INFORMATION...程序的大小字节数,如下图所示; 内核文件读写: 内核读取文件可以使用ZwReadFile(),内核写入文件则可使用ZwWriteFile(),这两个函数的参数传递基本上一致,如下是读写两个函数的对比参数...[in, optional] PLARGE_INTEGER ByteOffset, // 指定将开始读取操作的文件中的起始字节偏移量。
利用宏IsListEmpty可以检查一个链表是否为空,它也是只简单的检查这两个指针是否指向其自身 在定义自己的数据结构的时候需要将这个结构体放到自定义结构体中,比如 typedef struct _..., IN TYPE Type, IN PCHAR Field ); 这个宏返回自定义结构体的首地址,传入的是第一个参数是结构体中某个成员的地址,第二个参数是结构体名,第三个参数是我们传入第一个指针的类型在结构体中对应的成员变量值...Lookaside:这个参数是一个NPAGED_LOOKASIDE_LIST的指针,在初始化前需要创建这样一个结构体的变量,但是不用填写其中的数据。...,需要用结构化异常进行处理,这里使用结构化异常的方式与在应用层的使用方式相同 其他数据结构 typedef union _LARGE_INTEGER { struct {..., *PLARGE_INTEGER; 这个结构用来表示64位二进制的整形数据,它是一个共用体,占内存大小是64位8个字节,从定义上来看可以看做一个LONGLONG型数据,也可以看做两个4字节的数据。
其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。...因此,能从栈获得的空间较小。 堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。...如果使用指针关联两个数据结构,前面实例中的对象 A 和 B 将被分别分配和释放。这会增加额外开销—我们要避免这种做法。 把带指针的子对象嵌入父对象。...全局锁保护堆数据结构,防止多线程式的使用。但不幸的是,在高通信量的情况下,堆仍受困于全局锁,导致高竞争和低性能。...堆数据结构对块的所有空闲项使用了大小在 8 到 1,024 字节(以 8-字节递增)的快速高速缓存。快速高速缓存最初保护在全局锁内。现在,使用 lookaside 列表来访问这些快速高速缓存空闲列表。
, // 输出数据缓冲区长度 LPDWORD lpBytesReturned, // 输出数据实际长度单元长度 LPOVERLAPPED lpOverlapped // 重叠操作结构指针 ); 设备句柄用来标识你所访问的设备...输入输出数据缓冲区是否需要,是何种结构,以及占多少字节空间,完全由不同设备的不同操作类型决定。在头文件winioctl.h中,已经为标准设备预定义了一些输入输出数据结构。...Q 我忽然产生了一个伟大的想法,用绝对地址读写的方式使用磁盘,包括U盘啦,MO啦,而不是用现成的文件系统,那不是可以将数据保密了吗? A 当然,只要你喜欢。...NT/2000/XP从安全性、可靠性、稳定性上考虑,应用程序和操作系统是分开的,操作系统代码运行在核心态,有权访问系统数据和硬件,能执行特权指令;应用程序运行在用户态,能够使用的接口和访问系统数据的权限都受到严格限制...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
为了加快数据查找,使用了一张 hash 表,从 hash 表中查找到 LRU 的对象指针,若要删除即可直接调用 LRURemove 从环状链表中删除 LRU 对象。...TableCache 使用 LRUCache 缓存表信息,以 file number 做 key,table 指针和 file 指针组成的结构体的指针为 value。...MemTable 内部数据结构是 skiplist,保存有序的 key,以 user key 加上序列号的方式保存,user key 相同时,序列号大的排在前面,因此数据库维持了一个全局序列号,只向上递增...不过由于多个 level 0 的文件由多个 MemTable 在不同时间生成,因此,这些 level 0 文件之间的 user key 可能会重叠。...Level 与 Level 之间的 user key 可能会有重叠(即在 level m 中存在的 key,在 level n 中也存在),因此 compact 的时候需要处理这些重叠数据,保证新生成
,操作系统在二者之间来回倒腾数据而已 文件映射本身是一个内核对象,操作系统在内核中维护了一个相关的数据结构,这个结构中记录了被映射到虚拟地址空间中的起始地址和被映射的数据的大小。...针对文件来说,文件映射本质上是磁盘到物理内存之间的页面交换,由操作系统的内存管理机制统一调度,效率比一般的文件读写要高,而且在使用完毕后,操作系统会自动的将内存中的数据写到磁盘中,不用手动的更新文件...,其实这个共用体都可以用来操作文件指针,如果用其中的结构体,那么需要分别给其中的高32位和低32位赋值,如果使用指针,这个时候指针变量不指向任何内存,这个指针变量仅仅是作为一个变量名罢了,使用时也是将其作为正常变量来使用...,虽然它是一个指针占4个字节,但是由于是一个共用体,它后面还有4个字节的剩余空间可以使用,所以使用它来存储文件指针的偏移没有任何问题。...线程先创建了一个包含OVERLAPPED结构的数据类型,然后再使用InterlockedCompareExchange64同步文件指针,这句话的意思是,向将高速缓存中的数据与内存中的数据进行比较,如果二者的值相同
关于系统中mmap的理论说明可以看百度百科和维基百科说明以及mmap函数介绍,这里的说明是针对在Python下mmap块的使用说明。...([offset, n]) 把 m 中从offset开始的n个字节刷到对应的文件中; m.move(dstoff, srcoff, n) 等于 m[dstoff:dstoff+n] = m[srcoff...:srcoff+n],把从 srcoff 开始的 n 个字节复制到从 dstoff 开始的n个字节,可能会覆盖重叠的部分。...m.read(n) 返回一个字符串,从 m 对应的文件中最多读取 n 个字节,将会把 m 对应文件的位置指针向后移动; m.read_byte() 返回一个1字节长的字符串,从 m 对应的文件中读...buf.write(f) # 写入文件 # 当前指针位置 buf.tell() # 移动指针到第11个字节 buf.seek(10) # 将内存中的信息写入文件 buf.flush(0, 100
以往都是在嵌入式设备中经常操作串口,或者使用QT的串口类。在Win32中处理串口也是有办法的,操作文件的打开和读写进行串口的操作。使用ReadFile、WriteFile函数。...基本步骤 使用Win32文件方式操作:打开串口(创建文件)->配置参数->发送(写文件)-->接收(读文件) 打开串口 打开串口的第一步是初始化或设置串口配置,目的是创建串口代理,整篇文章我们都将用文件句柄作为串口代理...实际上,一个进程可以分配的虚拟内存量少于这些限制。 物理内存是芯片焊接到您的主板,或安装在您的内存插槽。在任何给定时间使用的物理内存量都限制在计算机中的物理内存量。...所以内存泄漏会导致进程的虚拟内存使用不断增加,而由于申请后未被访问使用,所以并不会映射到物理内存占用电脑内存资源(这样系统可以防止某个恶心进程占着茅坑不拉屎…)。...当是如果程序运行的事件够长,每次泄漏不断累积,长期下去虚拟内存空间也会被全部用完,此时系统会使用系统的硬盘存储充当虚拟内存的扩展,如使用C盘空间(操作据编译器不同而不同),所以这样漏下去还是会导致电脑系统卡顿甚至蓝屏
本章将继续探索驱动开发中的基础部分,定时器在内核中同样很常用,在内核中定时器可以使用两种,即IO定时器,以及DPC定时器,一般来说IO定时器是DDK中提供的一种,该定时器可以为间隔为N秒做定时,但如果要实现毫秒级别间隔...首先来看IO定时器是如何使用的,IO定时器在使用上需要调用IoInitializeTimer函数对定时器进行初始化,但需要注意的是此函数每个设备对象只能调用一次,当初始化完成后用户可调用IoStartTimer...DPC定时器中我们所需要使用的函数声明部分如下所示;// 初始化定时器对象 PKTIMER 指向调用方为其提供存储的计时器对象的指针void KeInitializeTimer( [out] PKTIMER...在内核里通过KeQuerySystemTime获取的系统时间是标准时间(GMT+0),转换成本地时间还需使用RtlTimeToTimeFields函数将其转换为TIME_FIELDS结构体格式。...); Driver->DriverUnload = UnDriver; return STATUS_SUCCESS;}运行后即可在内核中得到当前系统的具体时间;
字符串处理 在驱动中一般使用的是ANSI字符串和宽字节字符串,在驱动中我们仍然可以使用C中提供的字符串操作函数,但是在DDK中不提倡这样做,由于C函数容易导致缓冲区溢出漏洞,针对字符串的操作它提供了一组函数分别用来处理...{ LARGE_INTEGER AllocationSize; //为文件分配簇所占空间的大小 LARGE_INTEGER EndOfFile;//距离文件结尾还有多少字节,当文件指针位于文件头时...Information成员记录实际写了多少字节 IN PVOID Buffer,//写入文件中缓冲区的指针 IN ULONG Length,//缓冲区中数据的长度 IN PLARGE_INTEGER...(这个类型的数据在驱动中使用ULONG来替代) REG_QWORD 键值用8字节存储(这个用LONGLONG) 用函数ZwSetValueKey可以添加和修改注册表的一项内容 NTSTATUS...返回注册表的部分信息 一般情况下使用KeyValuePartialInformation查询键值数据 利用这个函数来查询时一般也是采用两次调用的方式,第一次返回数据所需缓冲,然后分配缓冲并进行第二次调用
前言: 最近需要对Windows中的设备进行编程操作,其中涉及到非常重要的函数DeviceIoControl,在使用的时候也比较的复杂,国内这一块中文资料比较少,在学习之余顺便将其翻译出来,以供参考...如果dwIoControlCode指定不返回数据的操作,则此参数可以为NULL。 nOutBufferSize [in] 输出缓冲区以字节为单位的大小。单位为字节。...lpBytesReturned [out, optional] (可选)指向一个变量的指针,该变量接收存储在输出缓冲区中的数据的大小。...lpOverlapped [in, out, optional] (可选)指向OVERLAPPED结构的指针, 如果在未指定FILE_FLAG_OVERLAPPED的情况下打开hDevice...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
memset函数 包含头文件:string或者memory extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组, c:...这个函数在socket中多用于清空数组....; 包含头文件:string或者memory 功能:从源src所指的内存地址的起始位置开始,拷贝n个字节的数据到目标dest所指的内存地址的起始位置中。...说明: 1)src和dest所指内存区域不能重叠,函数返回指向dest的指针。如果src和dest以任何形式出现了重叠,它的结果是未定义的。...2)与strcpy相比,memcpy遇到’\0’不结束,而且一定会复制完n个字节。只要保证src开始有n字节的有效数据,dest开始有n字节内存空间就行。
id=1301 VC中基于 Windows 的精确定时 中国科学院光电技术研究所 游志宇 在工业生产控制系统中,有许多需要定时完成的操作,如定时显示当前时间,定时刷新屏幕上的进度条,上位 机定时向下位机发送命令和传送数据等...特别是在对控制性能要求较高的实时控制系统和数据采集系统中,就更需要精确定时操作。 众所周知,Windows 是基于消息机制的系统,任何事件的执行都是通过发送和接收消息来完成的。...只可以用来实现诸如位图的动态显示等对定时精度要求不高的情况。如示例工程中的Timer1。 方式二:VC中使用sleep()函数实现延时,它的单位是ms,如延时2秒,用sleep(2000)。...方式四:在精度要求较高的情况下,VC中可以利用GetTickCount()函数,该函数的返回值是 DWORD型,表示以ms为单位的计算机启动后经历的时间间隔。...既可以是一个8字节长的整型数,也可以是两个4字节长的整型数的联合结构, 其具体用法根据编译器是否支持64位而定。
首先,进程间通信至少可以通过传送打开文件来实现,不同的进程通过一个或多个文件来传递信息,事实上,在很多应用系统里,都使用了这种方法。...这个标识符是内核由IPC结构的关键字得到的,这个关键字,就是上面第一个函数的 key。数据类型key_t是在头文件sys/types.h中定义的,它是一个长整形的数据。...在系统调用msgctl中,最后一个参数是指向内核中使用的数据结构的指针。我们使用此数据结构来取得有关消息队列的一些信息,以及设置或者改变队列的存取权限和使用者。...参数cmd中可以使用的命令如下: ·IPC_STAT读取一个信号量集的数据结构semid_ds,并将其存储在semun中的buf参数中。...buf在IPC_STAT/IPC_SET命令中使用。代表了内核中使用的信号量的数据结构。array在使用GETALL/SETALL命令时使用的指针。 下面的程序返回信号量的值。
本章将继续探索驱动开发中的基础部分,定时器在内核中同样很常用,在内核中定时器可以使用两种,即IO定时器,以及DPC定时器,一般来说IO定时器是DDK中提供的一种,该定时器可以为间隔为N秒做定时,但如果要实现毫秒级别间隔...首先来看IO定时器是如何使用的,IO定时器在使用上需要调用IoInitializeTimer函数对定时器进行初始化,但需要注意的是此函数每个设备对象只能调用一次,当初始化完成后用户可调用IoStartTimer...DPC定时器中我们所需要使用的函数声明部分如下所示;// 初始化定时器对象 PKTIMER 指向调用方为其提供存储的计时器对象的指针void KeInitializeTimer( [out] PKTIMER...在内核里通过KeQuerySystemTime获取的系统时间是标准时间(GMT+0),转换成本地时间还需使用RtlTimeToTimeFields函数将其转换为TIME_FIELDS结构体格式。...);Driver->DriverUnload = UnDriver;return STATUS_SUCCESS;}运行后即可在内核中得到当前系统的具体时间;图片
领取专属 10元无门槛券
手把手带您无忧上云