异常的写法跟三环没有设么区别一样的使用__try __except
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING reg_path)
{
PULONG buffer = 0;
try
{
*buffer = 0;
}
//EXCEPTION_CONTINUE_SEARCH 这个值代表异常 我们已经处理了
except(EXCEPTION_EXECUTE_HANDLER)
{
KdPrint(("访问异常 异常码是:%x", GetExceptionCode()));
}
return STATUS_SUCCESS;
}
在对内存操作前可以使用ProbeForRead和ProbeForWrite来对内存进行是否可读可写的探测
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING reg_path)
{
PULONG buffer = 0;
try
{
//如果不可写就会产生异常
ProbeForWrite(buffer ,4,4);
*buffer = 0;
}
//EXCEPTION_CONTINUE_SEARCH 这个值代表异常 我们已经处理了
except(EXCEPTION_EXECUTE_HANDLER)
{
//对异常进行处理,不能处理就把该函数直接返回. 要不然会造成系统蓝屏.
KdPrint(("访问异常 异常码是:%x", GetExceptionCode()));
}
return STATUS_SUCCESS;
}
主动抛出异常
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING reg_path)
{
PULONG buffer = 0;
try
{
//主动抛出异常码
ExRaiseStatus(STATUS_XXX);
}
//
except(EXCEPTION_EXECUTE_HANDLER)
{
KdPrint(("访问异常 异常码是:%x", GetExceptionCode()));
}
return STATUS_SUCCESS;
}
__try __finally __leave的配合使用
__try{
if(true)
{
//离开本层try块 如果本层try块有finally 就会跳转过去运行
__leave;
}
}
__finally
{
//清理工作可以在这里面运行
KdPrint(("一定会运行的代码"));
}