SSDT HOOK ZwSetInformationFile 有时出现蓝屏问题

Sunny_wwc 2010-01-01 03:33:40
关键段的代码 测试就是蓝在这个函数里
NTSTATUS NewZwSetInformationFile(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PVOID FileInformation,
IN ULONG Length,
IN FILE_INFORMATION_CLASS FileInformationClass
)
{
NTSTATUS nStatus = STATUS_SUCCESS;

NTSTATUS Status=NULL;
NTSTATUS statusp=STATUS_ACCESS_DENIED;


WCHAR buf[1024];
PFILE_OBJECT Object;
PWCHAR pBuffer;
IO_STATUS_BLOCK IoStatus;
PFILE_NAME_INFORMATION pstNameInfo;

UNICODE_STRING volumeDosName;
UNICODE_STRING midstr;
UNICODE_STRING lpuName;

RtlInitEmptyUnicodeString(&volumeDosName,buf,1024*sizeof(WCHAR));
RtlInitEmptyUnicodeString(&lpuName,NULL,0);


if(FileInformationClass == FileDispositionInformation )//删除
{
if(ObReferenceObjectByHandle(FileHandle,0 ,0,KernelMode,
&Object , NULL ) == STATUS_SUCCESS )
{
RtlInitEmptyUnicodeString(&midstr,NULL,0);
IoVolumeDeviceToDosName(Object->DeviceObject,&midstr);
RtlCopyUnicodeString(&volumeDosName,&midstr);
ObDereferenceObject(Object) ;
}
pBuffer = (PWCHAR)ExAllocatePoolWithTag( NonPagedPool, 1024,'MyTt' );
RtlZeroMemory( pBuffer, 1024 );
pstNameInfo = (PFILE_NAME_INFORMATION)pBuffer;

Status = ZwQueryInformationFile( FileHandle, &IoStatus, pstNameInfo, 512, FileNameInformation );
if ( NT_SUCCESS(Status) )
{
lpuName.Buffer=(PWSTR)pstNameInfo->FileName;
lpuName.Length=wcslen(pstNameInfo->FileName)*2;

}
ExFreePool(pBuffer);
RtlAppendUnicodeStringToString(&volumeDosName,&lpuName);
// DbgPrint("path is %ws",volumeDosName.Buffer);
// DbgPrint("Path is %ws",Upath);
// DbgPrint("Path is %d",len);
// if(0 == memcmp(volumeDosName.Buffer,Upath,wcslen(Upath)*2))
if(0 == memcmp(volumeDosName.Buffer,L"C:\\123",12))
return statusp;
else
{
nStatus = OldZwSetInformationFile( FileHandle , IoStatusBlock ,
FileInformation , Length , FileInformationClass ) ;
return nStatus ;
}

}



if(FileInformationClass ==0x0A)//移动
{

if(ObReferenceObjectByHandle(FileHandle,0 ,0,KernelMode,
&Object , NULL ) == STATUS_SUCCESS )
{

RtlInitEmptyUnicodeString(&midstr,NULL,0);
IoVolumeDeviceToDosName(Object->DeviceObject,&midstr);
RtlCopyUnicodeString(&volumeDosName,&midstr);

ObDereferenceObject(Object) ;
}
pBuffer = (PWCHAR)ExAllocatePoolWithTag( NonPagedPool, 1024,'MyTt' );
RtlZeroMemory( pBuffer, 1024 );
pstNameInfo = (PFILE_NAME_INFORMATION)pBuffer;

Status = ZwQueryInformationFile( FileHandle, &IoStatus, pstNameInfo, 512, FileNameInformation );
if ( NT_SUCCESS(Status) )
{
lpuName.Buffer=(PWSTR)pstNameInfo->FileName;
lpuName.Length=wcslen(pstNameInfo->FileName)*2;

}
ExFreePool(pBuffer);
RtlAppendUnicodeStringToString(&volumeDosName,&lpuName);
// DbgPrint("path is %ws",volumeDosName.Buffer);
// DbgPrint("Path is %ws",Upath);
// DbgPrint("Path is %d",len);
// if(0 == memcmp(volumeDosName.Buffer,Upath,wcslen(Upath)*2))
if(0 == memcmp(volumeDosName.Buffer,L"C:\\123",12))
return statusp;
else
{
nStatus = OldZwSetInformationFile( FileHandle , IoStatusBlock ,
FileInformation , Length , FileInformationClass ) ;
return nStatus ;
}


}


nStatus = OldZwSetInformationFile( FileHandle , IoStatusBlock ,
FileInformation , Length , FileInformationClass ) ;

return nStatus ;
}

我想做的是一个指定用户输入路径传到ring0里面进行指定的文件保护 Upath是用户的路径 但是运行后 只要操作指定路径的文件夹后(可以保护) 但不一会电脑就蓝了 然后我又直接换成字符串常量进行判断 还是会蓝 我驱动的基础不是很好 望大牛们多多指点 小弟先谢谢各位了
...全文
439 6 打赏 收藏 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
linmei19840721 2010-02-08
  • 打赏
  • 举报
回复
调试到那句蓝的????
cyndy_li 2010-02-07
  • 打赏
  • 举报
回复
最好用windbg + 虚拟机调试一下,设中断,可以源代码调试,执行到那一句蓝的,好找一下原因。
cyndy_li 2010-02-07
  • 打赏
  • 举报
回复
在你的代码里出现了OldZwSetInformationFile
又出现了ZwQueryInformationFile,query这个函数你有没有hook
还有old前面是不是要用指针函数类型转换一下,就是之前保存的真实函数指针,要((ZWSETINFORMATIONFILE)OldZwSetInformationFile)(参数。。。)
nevergone 2010-01-01
  • 打赏
  • 举报
回复
一点驱动开发常识都没有
beginnow 2010-01-01
  • 打赏
  • 举报
回复
你可以用softice加载这个驱动,当出现问题的时候softice会截获这个错误,
另外机器蓝屏之后会生成转储文件,可以分析一下这个文件
Sunny_wwc 2010-01-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 nevergone 的回复:]
一点驱动开发常识都没有

[/Quote]
麻烦高人指点为什么蓝屏
内容概要:本文系统介绍了智能体设计模式,旨在帮助开发者构建高效、可靠、具备目标导向能力的智能系统。文章从智能体的基本概念出发,阐述了其自主性、主动性、响应性和工具使用等核心特征,并强调了设计模式在解决智能体开发中常见挑战(如复杂任务分解、状态管理、多智能体协作)方面的关键作用。书中提炼了21种核心设计模式,涵盖基础执行(提示链、路由、并行化)、环境交互(工具使用、知识检索RAG)、自我提升(反思、异常处理)、协作通信(多智能体协作、A2A协议)及高级能力(规划、优先级排序、探索与发现)等多个层面。通过结合LangChain、Google ADK等主流框架的实战代码示例,详细展示了各模式的具体实现方法,最终阐明了如何将这些模式组合运用,以构建能处理复杂任务、具备自我纠错和持续优化能力的高级智能体系统。; 适合人群:具备一定人工智能和编程基础,从事AI应用开发、系统架构设计的研发人员,特别是希望深入理解并实践智能体系统构建的工程师和研究人员。; 使用场景及目标:①学习如何将大语言模型(LLM)从简单的文本生成器转变为能感知、决策、行动的智能体;②掌握构建多步骤、有状态、能调用工具、支持多智能体协作的复杂AI系统的方法;③解决智能体在真实环境中面临的可靠性、效率和安全性问题,如错误恢复、资源优化和人类监督。; 阅读建议:本书强调实践导向,建议读者在学习过程中结合代码示例进行动手实践,尝试在LangChain、LangGraph或Google ADK等框架中复现和调试各设计模式。同时,应着重理解不同模式之间的协同关系,思考如何将多种模式组合起来解决实际业务问题,而不仅仅是孤立地学习单个模式。

70,040

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧