![个人头像照片](https://ucc.alicdn.com/avatar/img_549ec0fb89fbd36f61d148fccaa340bb.jpg)
暂无个人介绍
3、文件读写 在ring3 我们可以使用CreateFile、ReadFile 、WriteFile 等API,在ring0 同样很相似,不过函数变成了ZwCreateFile、ZwReadFile、ZwWriteFile 等内核函数。
正则表达式 A regular expression is a pattern template you define that a Linux utility(sed,gawk等) uses to filter text. 正则表达式由正则表达式引擎来实现(regular expression engine)。
NT式 1、Driver.h头文件中包含了开发NT式驱动所需要的NTDDK.h,此外还定义了几个标志来指明函数和变量分配在分页内存还是非分页内存中。Windows驱动程序的入口函数是DriverEntry函数。
了解机器码 X86所有指令的机器码长度不定,且连续排列,因此读取机器码的唯一方法是从头开始逐条解析指令。 nop指令是单字节,可以用作填充替换长指令后的多余区域。 XDE32反汇编引擎。 关于进一步机器码的构成分析,可以看[6]。
Windows内核(一).sys放在Drivers目录下。运行在R0层。在WDK的相应环境中,进行相应代码目录,build.一个内核程序被看作一个PE格式的DLL,它是被Windows整个内核调用的一个DLL,一旦加裁,就成为内核的组成部分。
内核线程 在驱动中生成的线程一般是系统线程。系统线程所在的进程名为“System”。 NTSTATUS PsCreateSystemThread( OUT PHANDLE ThreadHandle, IN ULONG DesiredAccess, IN POBJECT_ATTRIBU...
Function Recursion function factorial { if [ $1 -eq 1 ] then echo 1 else local temp=$[ $1 - 1 ] local result=`factorial $temp` echo $[ $result * $1...
1、重定向很多数据,用echo就不方便了。我们用exec命令。 如exec 1>testout Shell 中最多可以有9个打开的文件描述符。 2、重定向 exec 3>&1 //脚本将文件描述符3重定向到文件 exec 3testfile //exec使命令将文件描述符3分配给文件testfile的输入输出操作 重定向到特殊符号&-来关闭文件描述符。
汇编部分1、call 的本质相当于push+jmp,ret的本质相当于pop+jmp。 2、Windows中,不管哪种调用方式都是返回值放在eax中,然后返回。外部从eax中得到值。 3、Ebp总是被我们用来保存这个函数执行之前的esp的值。
1、从变量读取列表 List = "apple tree book" List = $List" hello" 则此时,List 为"apple tree book hello"这是一种将文本添加到一个存在的,存储在一个变量中的文本字符串的常用方法。
1、(Microsoft Specific)__stdcall主要指明了恢复堆栈的规则:在主调用函数中负责压栈,在被调用函数中负责弹出堆栈中的参数,并且负责恢复堆栈。 The __stdcall calling convention is used to call Win32 API functions.
预处理宏 预处理器(Preprocessor)定义了读取源代码、对代码预先翻译以及编写供编译器读取的新代码的过程。预处理先于编译器对源代码进行处理。 C/C++ 语言没有内置工具在编译时间包含其他源文件、宏定义,或根据条件包含或排除一些代码行的编译时指令。
MFC中自定义消息 消息映射、循环机制是Windows程序运行的基本方式。VC++ MFC 中有许多现成的消息句柄,可当我们需要完成其它的任务,需要自定义消息,就遇到了一些困难。在MFC ClassWizard中不允许添加用户自定义消息,所以我们必须手动在程序中添加相应代码,以便可以象处理其它消息一样处理自定义消息。
#,## 1、在一个预处理器宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组。(原文:When you put a # before an argument in a preprocessor macro, the preprocessor turns that argument into a character array.
1、宏不可以出现在递归中。 预处理指示#define,#ifdefine,#endif #define FLAG //... #ifdef FLAG //... #endif //FLAG #define的反意是#undef #ifdef的反意是#ifndef 对于包含结构的每个头文件,应当首先首先检查这个头文件是否已经包含在特定的CPP文件中了。
位段以位为单位定义结构体(或共用体)中成员所占存储空间的长度。含有位段的结构体类型称为位段结构。 位段成员必须被声明为unsigned或int类型。 位段结构也是一种结构体类型,只不过其中含有以位为单位定义存储长度的整数类型位段成员。
1、登录shell /etc/profile,如果是交互式shell启动时,将处理HOME下的.bashrc文件,非/etc/profile;非交互式shell下,提供了BASH_ENV环境变量。 unset来移除数组中的某个值。
vi常见用法 Cursor movement · h - move left · j - move down · k - move up · l - move right · w - jump by start of words (punctuation consid...
SHELL控制语句 If 语句 if [ expression ]; then Statements elif [ expression ]; then statements else statements Fi 应该注意,if语句中else部分可以缺省。
前面的文章见163blog. 内部变量和环境变量类似,也是在SHELL 执行前已经定义的变量。可以在SHELL 程序中使用,而不能修改。 shell元字符 > prog >file 将标准输出重定向到文件>> prog >> file将标准输出附...
系统调用 在系统中真正被所有进程都使用的内核通信方式是系统调用。例如当进程请求内核服务时,就使用的是系统调用。一般情况下,进程是不能够存取系统内核的。它不 能存取内核使用的内存段,也不能调用内核函数,CPU的硬件结构保证了这一点。
当一个任务(进程)执行系统调用而执行内核代码时,称进程处于内核内核态,此时处理器处于特权级最高的(0级)内核代码中执行,当进程处于内核态时,执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈。
进程同步与互斥 首先,我们看一个例子:进程P1、P2公用一个变量COUNT,初始值为0 P1、P2两个进程的执行顺序是随机的,P1、P2可能顺序执行或交错执行。 由图可见,不同的执行顺序,COUNT值会不同,这是不允许的。
要留给Fedora安装的空间必须是没有被分配的,也就是说利用分区工具(如Acronis)将E盘删除,即该段空间不分配给任何盘符。 由于MBR块的容量有限,一个硬盘最多只能分成4个分区P+P+P+P或P+P+P+E,其中P为主分区,E为扩展分区(只能有1个扩展分区),而扩展分区可以分为多个逻辑分区供我们使用。
# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输。 邮槽是一种单向通信机制,创建邮槽的服务器进程读取数据,打开邮槽的客户机进程写入数据。 为保证邮槽在各种Windows平台下都能够正常工作,我们传输消息的时候,应将消息的长度限制在424字节以下。
命名管道是通过网络来完成进程间的通信,它屏蔽了底层的网络协议细节。我们在不了解网络协议的情况下,也可以利用命名管道来实现进程间的通信。 命名管道充分利用了Windows NT和Windows 2000内建的安全机制。
匿名管道 一个单向,未命名的管道,通常用来在一个父进程和一个子进程间传输数据。只能实现本地机器上两个进程间的通信,而不能实现跨网络的通信。 BOOL CreatePipe( PHANDLE hReadPipe, // read handle ...
进程间通信-剪贴板 位于同一个进程中的多个线程共享同一个地址空间,因此线程之间的通信很简单。 进程间通信的四种方式 剪贴板 匿名管道 命名管道 邮槽 1、剪贴板 Win32平台下,内存块在物理内存中从来不会被移动,但可以在缺省的堆中被移动。
How to add an access-allowed ACE to a file http://support.microsoft.com/kb/102102以程序的方式操纵NTFS的文件权限http://www.lihuasoft.net/article/list.php?frmid=52
while ((*from++ = * to++) == '\0') 这一句的执行顺序: *from = *to from++ to ++ 判断 *from == '\0' ? 优先级: http://www.
3、子网掩码的最大匹配前辍 #include "iostream" #include "stdlib.h" #include "winsock2.h" #include "stdio.h" #include "assert.
1、得到cpu占有率的API函数: GetSystemTimes2、得到内存使用情况的API函数: GlobalMemoryStatusEx Function Retrieves information about the system's current usage of both physical and virtual memory.
2、大数相加减 以前写过一篇日志,不过写的不是很全。 http://blog.163.com/zhoumhan_0351/blog/static/399542272010328112344940/ 今天重写一下,如下: // JSON.cpp : 定义控制台应用程序的入口点。
1 基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。 另外,extern也可用来进行链接指定。使用extern时候要严格对应声明时的格式。
求两个大整数的相乘问题 日常常见的就是两个大整数相乘了。前面日志中曾经做过大数阶乘问题。其实问题都类似。只是前面当时用的是重复相加而得结果,然而,如果阶乘很大的话,重复相加也不能解决问题的,必须用数组来进行存储,然后模拟小学时竖式相乘的思想,即在一个数组中每个元素都只能是0~9,如果超越了这个界限,则进位到高位。
加载套接字库AfxSocketInit 一、相关概念 线程同步的方法,除了上节介绍的互斥对象外,还有事件对象和关键代码段。 1、事件对象 时间对象也属于内核对象,包含:一个使用计数,一个用于指明该事件是一个自动重置的事件还是一个人工重置的事件的布尔值,另一个用于指明该事件处于已通知状态还是为通知状态的布尔值有两种不同类型的事件对象。
我们利用互斥对象来实现线程同步。 互斥对象(mutex)属于内核对象,它能够确保线程拥有对单个资源的互斥访问权。 互斥对象包含一个使用数量,一个线程ID和一个计数器。 ID用于标识系统中的哪个线程当前拥有互斥对象,计数器用于指明该线程拥有互斥对象的次数。
一、概念 1、进程:通常被定义为一个正在运行的程序的实例,是一个程序在其自身的地址空间中的一次执行活动。一个程序可以有多个进程实例。 2、进程由两个部分组成: 1)操作系统用来管理进程的内核对象。
一、一些概念 套接字是表示了通信的端点。 网络通信中,使用“连接”作为最基本的抽象,同时将TCP连接的端点称为套接字。套接字=(IP,端口) 二、连接过程 服务器端(接收端)程序:1、创建套接字(socket)。
在C语言中,程序可在任意花括号后定义变量,在C++中,允许在程 序中任何地方声明变量,它的优点是可在使用该变量附近定义他。当在一个块内定义了一个变量,这个变量的作用域是从定义点起到当前块的结束以及所有在当前块 中出现的子块。
在程序设计实践一书中,作者说如下程序会出问题: int main() { char buf[20]; gets(buf); if(...) } 这是因为gets不限制读入数据的长度,所以应当由fgets来代替。
我想接着讨论一下,如果是数组,那么他与其它变量在栈上是如何分配存储顺序的。 我们已经知道,栈是从高地址到低地址生长,而数组是从低地址到高地址生长,那么,这两种不同的生长方式如何相容呢?于是我们设计如下程序。
2)接下来,我们将讨论第二个问题,那就是函数返回值与参数在栈上存放顺序。 我们设计如下程序: #include "iostream" using namespace std; int test(int a, int b){ int c; printf("%p\n",&b); //最...
一直以来,在思考函数调用中,其参数,返回地址的关系。在以前的一篇文章中,也曾看到过这种关系: 函数在堆栈中的分布情况是,地址从高到低,依次是:函数参数列表,函数返回地址,函数执行代码段。
一、一些概念 1、Socket是连接应用程序与网络驱动程序的桥梁,Socket在应用程序中创建,通过绑定操作与驱动程序建立关系。 网络体系结构就是使用这些用不同媒介连接起来的不同设备和网络系统在不同的应用环境下实现互操作性,并满足各种业务需求的一种粘合剂。
一、相关文章 1、C++中static的含义及名字控制 http://blog.163.com/zhoumhan_0351/blog/static/39954227201031775648201/ C/C++中,static有两层含义:在固定的地址上进行存储分配,也就是说对象是在一个特殊的静态数据区上创建的,而不是每次函数调用时在堆栈上产生的。
今天看别人写的代码,其中涉及有va_arg, va_end, va_start部分。于是翻阅了一些资料,总结了一下。 由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦;于是人们想出了用指针参数来解决问题。