文档章节

标记下常用的函数 2010-05-20

xiao70
 xiao70
发布于 2015/09/08 19:55
字数 849
阅读 7
收藏 0

获得eprocess结构中的进程名偏移

void GetProcessNameOffset()
{
    
    PEPROCESS curproc;
    int i;
    curproc = PsGetCurrentProcess();
    for( i = 0; i < 3*PAGE_SIZE; i++ )
    {
        if( !strncmp( "System", (PCHAR) curproc + i, strlen("System") ))
        {
            FileNameoff = i;
        }
    }
}


//在一段内存缓冲中查找指定字符串的位置,从头开始查找,区分大小写。


char * memstr(const char * strDest, const char * strSrc ,int lenDest,int lenSrc)
{
    if ((NULL == strDest) || (NULL == strSrc) || (lenDest <= 0) || (lenSrc <= 0) ) 
        return NULL;

    long ls1 = lenDest;
long ls2 = lenSrc;
    char *cp = (char *) strDest;
    char *s1, *s2;

    if ( !*strSrc )
        return((char *)strDest);

    while (ls1 > 0)
    {
        s1 = cp;
        s2 = (char *) strSrc;

        while ( *s1 && *s2 && !(*s1-*s2) )
            s1++, s2++,ls2--;

        if (ls2 <= 0)
            return(cp);

        cp++;
        ls1--;
    }

    return NULL;
}

//在一段内存中删除字符串,把删除后的字符串返回给strDest

BOOL memdel( char * strDest, char * strSrc ,int lenDest,int lenSrc)
{

if ((NULL == strDest) || (NULL == strSrc) || (lenDest <= 0) || (lenSrc <= 0)) 
        return FALSE;

if ( !*strSrc ) //如果str2指向的是空,直接返回
        return FALSE;

long ls1 = lenDest;
long ls2 = lenSrc;
char *cp = (char *) strDest;
char *s1,*s2;

while(lenDest > 0)
{
   s1 = cp;
        s2 = (char *) strSrc;

        while ( *s1 && *s2 && !(*s1-*s2) )
            s1++, s2++,ls2--;

        if (ls2 <= 0) //找到了
   {

    char * tmp = (char *)malloc(lenDest);

    if(tmp != NULL)
    {
     //删除操作,很简单
     
     memset(tmp,0,lenDest);

     memcpy(tmp,strDest,cp-strDest);
    
     memcpy(tmp+(cp-strDest),cp+(lenSrc+1),(strDest+lenDest-1)-(cp+lenSrc));
    
     memset(strDest,0,lenDest);
    
     memcpy(strDest,tmp,lenDest-lenSrc-1);
    
     free(tmp);
     return TRUE;
    }
    else
    {
     return FALSE;
    }
   }
        cp++;
        ls1--; 
}

return FALSE;

}

驱动加载顺序
在系统初始化的时候,决定驱动程序在什么时候被载入的信息保存在注册表中。

最早的一批驱动是由ntldr载入内存的(仅仅是载入)

第二批是由IO管理器载入内存的

第三批是由 SCM(Service Control Manager) 载入的

一个驱动在第几批中被载入是由 HKLM\SYSTEM\CurrentControlSet \Services\驱动名\Start 的值来决定。该值为0,第一批被载入。该值为1,第二批被载入。该值为2,第三批被载入。对于同一批驱动中的驱动,按驱动所在组的先后载入。组的先后顺序由 HKLM\SYSTEM\CurrentControlSet\Control \ServiceGroupOrderList 决定。每个驱动的 HKLM\SYSTEM\CurrentControlSet\Services\驱动名\Group 决定了驱动所属的组,如果没有这个 Services驱动名Group ,那么就在所有组之后。对于同一个组中的驱动,按驱动的Tag 的先后载入。Tag的先后顺序由 HKLM\SYSTEM\CurrentControlSet\Control\GroupOrderList组名 决定。每个驱动的 HKLM\SYSTEMCurrent\ControlSet\Services\驱动名\Tag 决定了驱动在组中的Tag。 这个Tag值的大小由驱动安装的先后顺序决定,先安装的Tag值小,后安装的Tag值大。

二.驱动调试

下面我介绍下关于驱动的调试,这里以windbg为例:

1.配置windbg双机调试环境,(VMware Workstation)

(1) 创建windbg快捷方式在目标中加上-k com:port=\\.\pipe\com_1,baud=115200,pipe 例如:"E:\Program Files\Debugging Tools for Windows\windbg.exe" -k com:port=\\.\pipe\com_1,baud=115200,pipe
(2) 在虚拟机设置里添加一个串行端口(如图),点击下一步;

(3)点击输出到命名管道:

在高级选中,中轮询时主动放弃CPU占用.然后完成。

(4) 在虚拟机中系统的启动项中添加一个启动项:
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional - debug" /fastdetect /debug /debugport=com1 /baudrate=115200

(5)我们设置windbg的Symbol path:我的设置如下
C:\MyCodesSymbols;SRV*C:\MyLocalSymbols*http://msdl.microsoft.com/download/symbols;C:\MyLocalSymbols
这里我把自己的.pdb文件放到C:\MyCodesSymbols下,从微软的符号文件服务器上下载符号文件到C:\MyLocalSymbols中。

© 著作权归作者所有

xiao70
粉丝 6
博文 10
码字总数 5178
作品 0
济南
高级程序员
私信 提问
Oracle 中时间的计算

Oracle中表示时间有DATE和TIMESTAMP,DATE可以存储年,月,日,小时,分钟,秒. TIMESTAMP是DATE的扩展,可以存储年,月,日,小时,分钟,秒,同时还可以存储秒的小数部分.秒的小数部分可以为9位即纳秒,...

晨曦之光
2012/04/25
308
0
sql中时间日期操作(时间日期函数,时间日期格式,时间日期转换参数,时间日期比较,时间日期计算)

sql中对时间进行操作,需要掌握四个时间函数:dateadd,datediff,datepart,datename。 dateadd是在指定日期上相加或相减一个时间。 如:在指定日期添加3天select dateadd(day,3,'2010-05-06'),...

huyuner1
2018/06/26
0
0
用awk求5天内(如2010/05/10到2010/05/14)第二列的平均值

文件内容如下: 2010/05/10 9.520 9.650 9.320 9.590 5631911 2010/05/11 9.740 9.770 9.300 9.350 6899839 2010/05/12 9.300 9.470 9.220 9.400 6019748 2010/05/13 9.410 9.560 9.300 9.53......

luguojia
2011/07/11
671
5
Oracle中的日期类型及常用函数

oracle 数据类型详解---日期型(转载) oracle 数据类型详解---日期型 oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资...

猴亮屏
2014/06/03
193
0
sql server 分区表的一些操作

use fenqutest -------------------- -- 准备分区用的文件组、文件、分区函数、分区方案 --添加文件分组 ALTER DATABASE fenqutest ADD FILEGROUP [test2010] ALTER DATABASE fenqutest ADD......

anima.lee
2014/01/17
933
0

没有更多内容

加载失败,请刷新页面

加载更多

总结:TCP/IP协议

一、介绍 TCP协议属于OSI七层模型中的传输层协议,提供处于网络连接中的两台计算机之间的数据 传输。   在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议...

浮躁的码农
24分钟前
3
0
一言不合就删库跑路?万名贡献者和阿里巴巴开源的二三事

9 月 27 日云栖大会,阿里巴巴宣布贾扬清担任开源技术委员会负责人。 有人问:开源是为了什么? 从个人视角看,可以证明自己的专业能力,获得行业认可; 从企业视角看,可以建立技术影响力,...

大涛学弟
35分钟前
4
0
JAVA编程注意事项(性能篇)

1. 尽量在合适的场合使用单例 使用单例可以缩短加载的时间,提高加载的效率,单例主要适用于以下三个方面: 第一,控制资源的使用,通过线程同步来控制资源的并发访问; 第二,控制实例的产生...

你好夜故事
37分钟前
5
0
List 前端 AngularJS JS 对IP排序

数据格式 $scope.dataList=[ {"ip":"192.168.10.10", "port":"8080",...}, { "ip":"192.168.10.12", "port":"8080",... } ,.....] 调用 $scope.ipSortForward($scope.dataList,"ip") 核心代码......

最菜最菜之小菜鸟
37分钟前
4
0
浅析Cassandra LeveledCompactionStrategy

前言 Cassandra是基于LSM架构的分布式数据库。LSM中有一个很重要的过程,就是压缩(Compaction)。默认的压缩策略是SizeTieredCompactionStrategy,今天主要说一下另一种压缩策略LeveledComp...

阿里云官方博客
41分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部