阅读:1584回复:14
VXD中如何COPY文件
就是将文件从一个目录拷贝到另外一个目录
我现在采用的打开两个文件、读取源文件再写入目标文件,但是在读取文件的时候总是返回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中的返回的读取函数地址 |
|
最新喜欢:aasa2 |
沙发#
发布于:2003-10-25 15:00
用R0_ReadFile、R0_WriteFile等试试
|
|
|
板凳#
发布于:2003-10-25 17:51
我试了,这样会造成IFS的重入,会造成系统挂起。
|
|
地板#
发布于:2003-10-25 23:13
终于弄好了,原来要设置R0_NOCACHE 标志,同时以1024为基数读取,呵呵
|
|
地下室#
发布于:2003-11-13 15:14
能解释一下ifs 的重入的问题吗?
现在我正在做用文件虚拟磁盘的项目,处理数据的读写采用r0_READFILE R0_WRITEFILE .现在我写了一个引导区, 还有了一个文件分配表。装上驱动后能发现盘符,并能打开, 打开的时候调用了R0_READFILE ,很正常。也能显示正确的属性。 可是但我格式化,新建文件,关机的时候系统就挂了。也没有兰屏。 而且用softice跟踪,发现没有进入我的代码。不知道这是不是ifs 重入引起的。 |
|
5楼#
发布于:2003-12-04 18:52
重入问题是用设置:R0_SWIPPING(大概是这个,就是交换文件的意思)标志解决。你的代码判断这个标志,跳过自己的代码就可以了。
|
|
6楼#
发布于:2003-12-04 23:24
重入问题是用设置:R0_SWIPPING(大概是这个,就是交换文件的意思)标志解决。你的代码判断这个标志,跳过自己的代码就可以了。 这个方法好 |
|
7楼#
发布于:2004-05-24 00:05
具体怎么设置啊,大哥。
我是新手,指点一下:) |
|
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上说的有。 |
|
9楼#
发布于:2004-05-24 12:57
还有。读写必须是页对齐的,就是以4k个字节为单位。
|
|
10楼#
发布于:2004-05-24 12:59
晕,这是什么时候的帖子啊? :P
|
|
11楼#
发布于:2004-05-30 21:30
RED_spring 大哥,在VXD里如何起线程啊?
|
|
12楼#
发布于:2004-05-31 19:18
我怎么没碰到所谓重入问题,我也是用R0_Write啊? :)
|
|
|
13楼#
发布于:2004-06-01 10:27
我怎么没碰到所谓重入问题,我也是用R0_Write啊? :) 按微软的文档上说,两次进入VFAT就会有重入的问题(IOP没返回)。可能win9x的VFAT是在dos下面移植过来的,对多线程支持不好。 我用softice跟过,的确死在VFAT里了。 如果一次是FAT,一次是CDFS,就没有这个问题。 :D |
|
14楼#
发布于:2004-08-09 13:10
RED_spring 发表于: 2004/5/24 - 04:40
用你的代码就没问题了吗?我也遇到了重入问题。郁闷啊。 大侠们指点指点 |
|