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

获得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中。

你可能感兴趣的:(标记下常用的函数 2010-05-20)