首页
社区
课程
招聘
[原创]在Windows驱动中使用PCRE正则表达式
发表于: 2014-6-27 15:49 9657

[原创]在Windows驱动中使用PCRE正则表达式

2014-6-27 15:49
9657
业余时间测试了一下pcre 在Windows驱动中使用实例

sample.c
#define PCRE_STATIC

#include <ntddk.h>
#include "pcre_regex.h"

char* pattern = "(((file|gopher|news|nntp|telnet|http|ftp|https|ftps|sftp)://)|(www\.))+(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9\&%_\./-~-]*)?";

void OnUnload(IN PDRIVER_OBJECT DriverObject)
{
	DbgPrint("OnUnload Called! \n");
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegisterPath)
{
	ANSI_STRING aDbgString,aDbgString1,aDbgString2,aDbgString3;

	char* src_address = "http://www.mydoop.com";
	char* src_address1 = "http://192.168.2000";
	char* src_address2 = "www.qq.com";
	char* src_address3 = "ffqq.fff";

	DbgPrint("DriverEntry loaded! \n");
	theDriverObject->DriverUnload = OnUnload;
	
	if(_ismatch(src_address,pattern) != -1)
	{
		RtlInitAnsiString(&aDbgString,src_address);
		DbgPrint("%Z =>URL is Matched!!\n",&aDbgString);
	}else{
		RtlInitAnsiString(&aDbgString,src_address);
		DbgPrint("%Z =>URL Not Match!!\n",&aDbgString);
	}

	if(_ismatch(src_address1,pattern) != -1)
	{
		RtlInitAnsiString(&aDbgString1,src_address1);
		DbgPrint("%Z =>URL is Matched!!\n",&aDbgString1);
	}else{
		RtlInitAnsiString(&aDbgString1,src_address1);
		DbgPrint("%Z =>URL Not Match!!\n",&aDbgString1);
	}

	if(_ismatch(src_address2,pattern) != -1)
	{
		RtlInitAnsiString(&aDbgString2,src_address2);
		DbgPrint("%Z =>URL is Matched!!\n",&aDbgString2);
	}else{
		RtlInitAnsiString(&aDbgString2,src_address2);
		DbgPrint("%Z =>URL Not Match!!\n",&aDbgString2);
	}

	if(_ismatch(src_address3,pattern) != -1)
	{
		RtlInitAnsiString(&aDbgString3,src_address3);
		DbgPrint("%Z =>URL is Matched!!\n",&aDbgString3);
	}else{
		RtlInitAnsiString(&aDbgString3,src_address3);
		DbgPrint("%Z =>URL Not Match!!\n",&aDbgString3);
	}

	return STATUS_SUCCESS;
}


pcre_regex.h
#define PCRE_STATIC // 静态库编译选项

#include "pcre.h"


#define OVECCOUNT	30 /* should be a multiple of 3 */
#define OVECCOUNTJIT 64 /*for jit*/
#define EBUFLEN		128
#define BUFLEN		1024
#define PCRE_BUG	0x80000000

#define MUA     (PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF)
#define MUAP    (PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF | PCRE_UCP)
#define CMUA    (PCRE_CASELESS | PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF)
#define CMUAP   (PCRE_CASELESS | PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_ANYCRLF | PCRE_UCP)
#define MA      (PCRE_MULTILINE | PCRE_NEWLINE_ANYCRLF)
#define MAP     (PCRE_MULTILINE | PCRE_NEWLINE_ANYCRLF | PCRE_UCP)
#define CMA     (PCRE_CASELESS | PCRE_MULTILINE | PCRE_NEWLINE_ANYCRLF)

/** 
* @_ismatch  实现字符串并返回是否匹配 
* @param   src 源字符串
* @param   pattern  正则表达式 
* @return  如果返回非 -1 就是已匹配到 
*/ 

int _ismatch( char* src, char* pattern)
{   
	pcre  *re;
	const char *error;
	int  erroffset;
	int  ovector[OVECCOUNT];
	int  result;

	re = pcre_compile(pattern,// pattern, 输入参数,将要被编译的字符串形式的正则表达式
		0,            // options, 输入参数,用来指定编译时的一些选项
		&error,       // errptr, 输出参数,用来输出错误信息
		&erroffset,   // erroffset, 输出参数,pattern中出错位置的偏移量
		NULL);        // tableptr, 输入参数,用来指定字符表,一般情况用NULL


	if (re == NULL) {  //如果编译失败,返回错误信息
		return -1;
	}
	result = pcre_exec(re, // code, 输入参数,用pcre_compile编译好的正则表达结构的指针
		NULL,          // extra, 输入参数,用来向pcre_exec传一些额外的数据信息的结构的指针
		src,           // subject, 输入参数,要被用来匹配的字符串
		strlen(src),   // length, 输入参数, 要被用来匹配的字符串的指针
		0,             // startoffset, 输入参数,用来指定subject从什么位置开始被匹配的偏移量
		0,             // options, 输入参数, 用来指定匹配过程中的一些选项
		ovector,       // ovector, 输出参数,用来返回匹配位置偏移量的数组
		OVECCOUNT);    // ovecsize, 输入参数, 用来返回匹配位置偏移量的数组的最大大小

	if (result < 0) {
		pcre_free(re);
		return -1;
	}

	pcre_free(re);

	return result;
}  


加载示例


代码下载
pcre_driver_831.zip

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
2
没在驱动里用过正则...感谢分享...
2014-6-27 15:53
0
雪    币: 66
活跃值: (960)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
~~~
2014-6-27 16:40
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
顶一个,总感觉会影响性能
2014-6-27 19:09
0
雪    币: 16
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
目测第6行转义不科学?
char* pattern = "(((file|gopher|news|nntp|telnet|http|ftp|https|ftps|sftp)://)|(www\.))+(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9\&%_\./-~-]*)?";
2014-6-27 21:49
0
雪    币: 66
活跃值: (960)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=Qokelate;1296357]目测第6行转义不科学?

char* pattern = "(((file|gopher|news|nntp|telnet|http|ftp|https|ftps|sftp)://)|(www\.))+(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[...[/QUOTE]
具体哪个地方不科学还请指教~
2014-6-28 03:00
0
雪    币: 478
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
用的上,收藏
2014-6-28 13:56
0
雪    币: 989
活跃值: (106)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
收藏,谢谢分享
2014-8-20 21:58
0
雪    币: 31
活跃值: (87)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
MARK,谢谢分享
2017-3-16 02:01
0
雪    币: 284
活跃值: (250)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
10
好使好使。感谢分享
2017-3-16 20:01
0
雪    币: 3738
活跃值: (3872)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
感谢分享!
2020-7-8 11:32
0
游客
登录 | 注册 方可回帖
返回
//