YuBo97
驱动牛犊
驱动牛犊
  • 注册日期2003-04-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
阅读:1584回复:14

VXD中如何COPY文件

楼主#
更多 发布于:2003-10-25 12:44
就是将文件从一个目录拷贝到另外一个目录

我现在采用的打开两个文件、读取源文件再写入目标文件,但是在读取文件的时候总是返回Error Code 5,也就是ERROR_ACCESS_DENIED

写入文件没有问题,所以就拷贝不了

请问谁遇到过啊,怎么解决啊?

附,打开、读取文件的代码:
打开文件:
pir_os->ir_flags=ACCESS_READWRITE||SHARE_DENYNONE;
pir_os->ir_attr=FILE_FLAG_LONG_PATH;
pir_os->ir_options=ACTION_OPENEXISTING;
(*PrevIFSHookProc)(
g_Disk_OpenFunAdd[Drive-1],
IFSFN_OPEN,
Drive,
g_Disk_ResType[Drive-1],
g_Disk_CodePage[Drive-1],
pir_os
);
这一步返回0,正常,返回的Handle也可以用于写入,写入功能正常

读取文件代码:
pir_rs->ir_length=ToCopy;
pir_rs->ir_pos=Copyed;
(*PrevIFSHookProc)(
pReadFun,
IFSFN_READ,
Drive,
g_Disk_ResType[Drive-1],
g_Disk_CodePage[Drive-1],
pir_rs
);

其中pReadFun是使用Open后返回的hFunc中的返回的读取函数地址

最新喜欢:

aasa2aasa2
he_x_p
驱动小牛
驱动小牛
  • 注册日期2002-11-15
  • 最后登录2005-07-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-10-25 15:00
用R0_ReadFile、R0_WriteFile等试试
乘着梦的翅膀, 借助黎明时柔和的阳光, 化着一只自由自在的冲天鸟, 在有梦的地方潇洒地飞翔......
YuBo97
驱动牛犊
驱动牛犊
  • 注册日期2003-04-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-10-25 17:51
我试了,这样会造成IFS的重入,会造成系统挂起。
YuBo97
驱动牛犊
驱动牛犊
  • 注册日期2003-04-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-10-25 23:13
终于弄好了,原来要设置R0_NOCACHE 标志,同时以1024为基数读取,呵呵
haosheng
驱动牛犊
驱动牛犊
  • 注册日期2003-10-22
  • 最后登录2011-02-17
  • 粉丝1
  • 关注1
  • 积分5分
  • 威望21点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-11-13 15:14
能解释一下ifs 的重入的问题吗?
现在我正在做用文件虚拟磁盘的项目,处理数据的读写采用r0_READFILE R0_WRITEFILE .现在我写了一个引导区,
还有了一个文件分配表。装上驱动后能发现盘符,并能打开,
打开的时候调用了R0_READFILE ,很正常。也能显示正确的属性。
可是但我格式化,新建文件,关机的时候系统就挂了。也没有兰屏。
而且用softice跟踪,发现没有进入我的代码。不知道这是不是ifs 重入引起的。  
YuBo97
驱动牛犊
驱动牛犊
  • 注册日期2003-04-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-12-04 18:52
重入问题是用设置:R0_SWIPPING(大概是这个,就是交换文件的意思)标志解决。你的代码判断这个标志,跳过自己的代码就可以了。
else
驱动小牛
驱动小牛
  • 注册日期2002-10-21
  • 最后登录2004-06-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-12-04 23:24
重入问题是用设置:R0_SWIPPING(大概是这个,就是交换文件的意思)标志解决。你的代码判断这个标志,跳过自己的代码就可以了。


这个方法好
hongsing
驱动小牛
驱动小牛
  • 注册日期2004-05-22
  • 最后登录2012-04-29
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望8点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-05-24 00:05
具体怎么设置啊,大哥。
我是新手,指点一下:)
RED_spring
驱动中牛
驱动中牛
  • 注册日期2002-07-28
  • 最后登录2016-11-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望19点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2004-05-24 12:40
这是VFAT在作怪。

用下面的代码打开

USHORT
R0_MM_OpenCreateFile(
const char *path,
USHORT mode,
USHORT createAttribs,
BYTE flags,
HANDLE *pHandle,
BYTE *pAction)
{
USHORT result;
UINT opcode = R0_OPENCREATFILE;

BYTE action;
action = 0x11;

flags |= (R0_NO_CACHE >> 8);
mode |= OPEN_FLAGS_COMMIT;

_asm
{
mov eax, opcode
mov bx, mode
mov cx, createAttribs
mov dl, action
mov dh, flags
mov esi, path
}

VxDCall(IFSMgr_Ring0_FileIO)

_asm
{
jc error
mov ebx, pHandle
mov [ebx], eax
xor eax, eax

error:
mov result, ax
}

return result;
}
然后另外创建一个线程A

在线程A里,用下面的代码读写(当然了要用前面打开的句柄^_^)

WORD
R0_MM_ReadFile(
HANDLE handle,
PVOID buffer,
UINT count,
UINT fileOffset,
UINT *pBytesRead)
{
UINT opcode;
USHORT result;

opcode = R0_READFILE | (R0_MM_READ_WRITE << 16) ;

_asm
{
mov eax, opcode
mov ebx, handle
mov ecx, count
mov edx, fileOffset
mov esi, buffer
}

VxDCall(IFSMgr_Ring0_FileIO)

_asm
{
jc error
mov ebx, pBytesRead
mov [ebx], ecx
xor eax, eax
error:
mov result, ax
}
return result;
}

WORD  
R0_MM_WriteFile(
HANDLE handle,
PVOID buffer,
UINT count,
UINT fileOffset,
UINT *pBytesWritten)
{
UINT opcode;
USHORT result;

opcode = R0_WRITEFILE | (R0_MM_READ_WRITE << 16) ;

_asm
{
mov eax, opcode
mov ebx, handle
mov ecx, count
mov edx, fileOffset
mov esi, buffer
}

VxDCall(IFSMgr_Ring0_FileIO)

_asm
{
jc error
mov ebx, pBytesWritten
mov [ebx], ecx
xor eax, eax
error:
mov result, ax
}
return result;
}

具体原因MSDN上说的有。
RED_spring
驱动中牛
驱动中牛
  • 注册日期2002-07-28
  • 最后登录2016-11-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望19点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2004-05-24 12:57
还有。读写必须是页对齐的,就是以4k个字节为单位。
RED_spring
驱动中牛
驱动中牛
  • 注册日期2002-07-28
  • 最后登录2016-11-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望19点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2004-05-24 12:59
晕,这是什么时候的帖子啊? :P
farwalk
驱动牛犊
驱动牛犊
  • 注册日期2002-04-27
  • 最后登录2004-09-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-05-30 21:30
RED_spring 大哥,在VXD里如何起线程啊?
punk
驱动小牛
驱动小牛
  • 注册日期2001-04-07
  • 最后登录2018-06-01
  • 粉丝0
  • 关注0
  • 积分621分
  • 威望164点
  • 贡献值0点
  • 好评度60点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-05-31 19:18
我怎么没碰到所谓重入问题,我也是用R0_Write啊? :)
不停学习
RED_spring
驱动中牛
驱动中牛
  • 注册日期2002-07-28
  • 最后登录2016-11-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望19点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2004-06-01 10:27
我怎么没碰到所谓重入问题,我也是用R0_Write啊? :)


按微软的文档上说,两次进入VFAT就会有重入的问题(IOP没返回)。可能win9x的VFAT是在dos下面移植过来的,对多线程支持不好。 我用softice跟过,的确死在VFAT里了。

如果一次是FAT,一次是CDFS,就没有这个问题。  :D
smh_mouse
驱动牛犊
驱动牛犊
  • 注册日期2003-07-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望74点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-08-09 13:10
RED_spring 发表于: 2004/5/24 - 04:40

用你的代码就没问题了吗?我也遇到了重入问题。郁闷啊。
大侠们指点指点
游客

返回顶部