vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
阅读:1444回复:8

遇到问题,过来人能指点一下。

楼主#
更多 发布于:2003-02-11 13:28
这个问题是我在开发中未注意到的,问题如下:

如下:

对于一个数据文件,用以下代码来保护文件打开是没有问题,但对于一个.exe,好像是不行,why?

我试了多种情形,好像都不行,能过来人指点一下。


//先将该操作传递给文件系统处理
status = CallFileSystemDriver(pDevObj, Irp);
if(!NT_SUCCESS(status))
return status;

//审查该操作是否合法?
nLegal = IsUserOperateLegal(pDevObj, Irp, &FileName, USER_ACTION_CREATE_OPEN_FILE);
if(nLegal == ACTION_DENIED)
{
KdPrint((\"Kfilter Debug: IRP_MJ_CREATE File Name=%ws, Operator is ACTION_DENIED.\\n\", FileName.Buffer));
KdPrint((\"Kfilter Debug: IsUserOperateLegal return %d.\\n\", nLegal));

//对该文件操作不被授权,操作非法
Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
Irp->IoStatus.Information = 0;
}

// KdPrint((\"----------------------------Kfilter:IRP_MJ_CREATE ------------end---------------\\n\"));
//返回上层调用
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;

 

最新喜欢:

PolomWUSPolomW...
沙发#
发布于:2003-02-12 09:32
呵呵!如果你的写处理过滤也是这样的话,那么肯定会有问题的!
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-02-11 17:00
找到了,好高兴呀!!!!


原因:一般的file打开,第一个与第二次都一样,所以我的代码正常,可.exe,不知道资源管理器是如何处理,前三次都一样,后两次跟前三次不一样,且有些属性不见了,tmd.


谢谢coolice的提醒,太感谢你了。
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-02-11 16:15
我在跟踪看一下。
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-02-11 16:14
我已放在前面了,如果是以数据文件打开,且没有问题,但通过资源管理器打开,在DriverMoniter显示打开拒绝,但exe还是给打开了,为什么???

新代码如下:
//审查该文件是否需要替换文件名(转移)?
int nLegal = IsUserOperateLegal(pDevObj, Irp, &FileName, USER_ACTION_REDIRECT_FILE);
if( nLegal == ACTION_PASS)
return KfPassThrough(pDevObj, Irp);

//审查该操作是否合法?
nLegal = IsUserOperateLegal(pDevObj, Irp, &FileName, USER_ACTION_CREATE_OPEN_FILE);

//先将该操作传递给文件系统处理
status = CallFileSystemDriver(pDevObj, Irp);
if(!NT_SUCCESS(status))
return status;

if(nLegal == ACTION_DENIED)
{
KdPrint((\"Kfilter Debug: IRP_MJ_CREATE File Name=%ws, Operator is ACTION_DENIED.\\n\", FileName.Buffer));

//对该文件操作不被授权,操作非法
Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;//STATUS_ACCESS_DENIED;//STATUS_SUCCESS;
}

//返回上层调用
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
Coolice
驱动小牛
驱动小牛
  • 注册日期2002-11-13
  • 最后登录2003-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-02-11 15:22
Tom_lyd说得没错,IsUserOperateLegal必须放在最前面,另外有些exe运行时会用短文件名打开,确认一下有没有漏掉Create
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-02-11 14:43
coolice,sjjun,lu0,指点俺一下呀!!!!



挺急的。
vcmfc
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-01-28
  • 粉丝0
  • 关注0
  • 积分528分
  • 威望53点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-02-11 14:11
不行, 我试过了,对于exe,好像不起作用,真TMD的怪,我记得我以前行呀!!!!


我在看看。
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-02-11 14:04
先进行合法性检查再传给低层驱动程序不行吗?
Tom_lyd
游客

返回顶部