#ifdef __cplusplus
extern "C"
{
#endif
#include <ntddk.h>
#ifdef __cplusplus
}
#endif
void helloxpUnload(IN PDRIVER_OBJECT DriverObject);
void Test(void);
#ifdef __cplusplus
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
#endif
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
DbgPrint("Hello from hello2003!\n");
DriverObject->DriverUnload = helloxpUnload;
PEPROCESS pEprocess=PsGetCurrentProcess();
PTSTR ProcessName=(PTSTR)((ULONG)pEprocess+0x174);
DbgPrint(TEXT("%s"),ProcessName);
int* P=NULL;
__try
{
//判断指针是否可读
ProbeForRead(P,100,4);
*P=1234;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
DbgPrint(TEXT("异常产生\n"));
}
Test();
return STATUS_SUCCESS;
}
void helloxpUnload(IN PDRIVER_OBJECT DriverObject)
{
DbgPrint("Goodbye from hello2003!\n");
}
void Test(void)
{
__try
{
//做一些事哈
DbgPrint(TEXT("我是你的大皇冠\n"));
return;
}
__finally
{
//程序退出前必须执行到这里,比如释放资源等等
DbgPrint(TEXT("打我PG我不乖\n"));
}
return;
}
EXCEPTION_EXECUTE_HANDLE
该数值为1,进入到__except进行错误处理,处理完后不再回到__try{}块中,转而继续执行。
EXCEPTION_CONTINUE_SEARCH
该数值为0,不使用__excep块中的异常处理,转而向上一层回卷。如果已经是最外层,则向操作系统请求异常处理函数。
EXCEPTION_CONTINUE_EXECUTION
该数值为-1,重复先前错误的指令
回卷:程序执行到某个地方出现异常错误时,系统会寻找出错误点是否处于一个try{}块中,并进入try块提供的异常出来代码。如果当前try块没有提供异常处理,则会向更外一层的try块,寻找异常处理代码。直到最外层try{}快也没有提供异常处理代码,则交由操作系统处理。
这种向外一层寻找异常处理的机制,被称为回卷。一般处理异常,是通过try-except块来处理的。
ExRaiseStatus 用指定状态代码出发异常
ExRaiseAccessViolation 触发STATUS_ACCESS_VIOLATION异常
ExRaiseDattypeMisaligment 触发STATUS_DATATYPE_MISALIGNMENT异常