阅读:2770回复:22
高分相送,急!急!急!急!fledisk中的格式化
我现在在用filedisk做文件保险箱,我想在我虚拟的文件的头部写入一串字符,以便应用层能进行文件格式判断,也就是在格式化的时候,将其字符串写入,可是我的字符串写入了,但格式化的时候提示不能完全格式化,那位大哥能告诉我是什么原因吗,我把代码贴出来,大家帮我看看。
case IRP_MJ_WRITE: if ((io_stack->Parameters.Write.ByteOffset.QuadPart + io_stack->Parameters.Write.Length) > device_extension->file_size.QuadPart) { irp->IoStatus.Status = STATUS_INVALID_PARAMETER; irp->IoStatus.Information = 0; } if(io_stack->Parameters.Write.ByteOffset.QuadPart==0) { PCHAR tmp1=\"hello word \"; PVOID Mdldata=MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority); ULONG lent=io_stack->Parameters.Write.Length; strcat(tmp1,(PCHAR)Mdldata); ZwWriteFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, (PVOID)tmp1, lent+32, &io_stack->Parameters.Write.ByteOffset, NULL ); } else ZwWriteFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority), io_stack->Parameters.Write.Length, &io_stack->Parameters.Write.ByteOffset, NULL ); break; 不知到是否要在 case IRP_MJ_READ: 加什么代码?或者我的思路不对,请高手指定,谢谢!放心,绝对给分。 [编辑 - 7/2/03 by li_jie] |
|
最新喜欢:![]() |
沙发#
发布于:2003-07-02 20:33
系统在格式化的时候需要在文件的头部写入(NTFS,FAT32)的文件格式标志,如果你写的和系统冲突,自然就不行拉
|
|
|
板凳#
发布于:2003-07-02 22:13
可以把这个数据和用来虚拟的数据分开啊,写到引导扇区里多别扭啊
|
|
地板#
发布于:2003-07-03 09:34
wowocock 大哥,你说的我不太明白,格式化标志已经在缓存区,我根本没修改它阿,只是将写入的位置改了一下,我只是将格式化时将要写入文件头部的数据不从起始位置写,而是从空出32个字节的位置写入,我这样做是为了应用层好识别是我建立的文件。你说的是不是格式化标志必须从0位置写入,但我看过别人作过的程序可以在文件的起始位置写入字符串。我上面的代码能写入,但在格式化的时候总有1k的容量不能格式化,即不能完全格式化。请两位大哥能否说明白一点,帮帮我那,我一定会给分的。谢谢!如果能有代码那是更好的那,谢谢!
|
|
地下室#
发布于:2003-07-03 10:31
用户被禁言,该主题自动屏蔽! |
|
5楼#
发布于:2003-07-03 11:24
wolfwoo22 大哥,FILE_NO_INTERMEDIATE_BUFFERING参数在FileDiskOpenFile函数里的ZwCreateFile中我没修改,你的意思是不是我将我的字符串和格式化信息写入后,就将指针移到512处,以便供后面的读写,同时不让后面的写入将其覆盖掉,是吗?那在ReadFile中怎么处理,是不是只移动偏移量,能给我代码吗,谢谢!帮我解决我一定给分,谢谢!
|
|
6楼#
发布于:2003-07-03 12:09
用户被禁言,该主题自动屏蔽! |
|
7楼#
发布于:2003-07-03 12:30
先给30分,我先试一试,有什么问题我在问你。
我其实是刚接触驱动这玩意,很菜的,希望你能讲详细点,谢谢。 在read中去掉我在write中写入的数据,是不是在读取数据的时候将其位置移动到我写入的字符串长度的距离处读取数据就可以那,还是将读出的数据的前面我写入的数据去掉后后重新写入内存中。 写入后指针要不要加上32? |
|
8楼#
发布于:2003-07-03 13:36
用户被禁言,该主题自动屏蔽! |
|
9楼#
发布于:2003-07-03 14:35
我把代码贴出来你帮我改改
case IRP_MJ_READ: { PVOID dat; PCHAR test; PVOID adds; ULONG lleng; adds = MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority); lleng=io_stack->Parameters.Read.Length; dat=ExAllocatePool(NonPagedPool,lleng); if(dat==NULL) { irp->IoStatus.Status = STATUS_INVALID_PARAMETER; irp->IoStatus.Information = 0; break; } RtlZeroMemory(dat,lleng); ZwReadFile(device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, dat, io_stack->Parameters.Read.Length, &io_stack->Parameters.Read.ByteOffset, NULL); test=(PCHAR)dat; if((test[0]==\'w\')&&(test[1]==\'w\')&&(test[2]==\'w\')) //我写入的32个字符的前三个字符为3个www { RtlCopyMemory(adds,test+32,io_stack->Parameters.Read.Length-32); ExFreePool(dat); } else { RtlCopyMemory(adds,test,io_stack->Parameters.Read.Length); ExFreePool(dat); } break; } case IRP_MJ_WRITE: if ((io_stack->Parameters.Write.ByteOffset.QuadPart +io_stack->Parameters.Write.Length) > device_extension->file_size.QuadPart) { irp->IoStatus.Status = STATUS_INVALID_PARAMETER; irp->IoStatus.Information = 0; } if(io_stack->Parameters.Write.ByteOffset.QuadPart==0) { PCHAR tmp1=\"www.sina.com \"; ZwWriteFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, tmp1, 32, &io_stack->Parameters.Write.ByteOffset, NULL ); } ZwWriteFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority), io_stack->Parameters.Write.Length, &io_stack->Parameters.Write.ByteOffset, NULL ); break; 我这样写,tmp1写不进去,但能格式化,你帮我看看该怎么改,谢谢!搞定后一定给你剩下的70分。拜托那。 |
|
10楼#
发布于:2003-07-03 14:51
用户被禁言,该主题自动屏蔽! |
|
11楼#
发布于:2003-07-03 15:13
wolfwoo22 大哥,我都被弄糊涂那,这样该改行吗?
if(io_stack->Parameters.Write.ByteOffset.QuadPart==0) { CHAR tmp1[512]=\"www.sina.com \"; ZwWriteFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, tmp1, 512, &io_stack->Parameters.Write.ByteOffset, NULL ); 每当ZwWriteFile在写自己定义的串时io_stack->Parameters.Write.ByteOffset.QuadPart是否自动偏移? 还有我的read代码对吗?你能跟我说说格式化的流程吗?谢谢! |
|
12楼#
发布于:2003-07-03 15:28
建议你把你的东西写到文件的最后,我试了,不会有问题的,而且无论格式化多少次,写入的东西都存在.
|
|
|
13楼#
发布于:2003-07-03 15:37
wowocock 大哥,写到文件的最后,如果往该盘里放文件会不会覆盖掉呢?还有这个文件的最后怎么定位,也就是说起始位置怎么定义。
能不能把代码贴出来看看。谢谢! |
|
14楼#
发布于:2003-07-03 15:55
用户被禁言,该主题自动屏蔽! |
|
15楼#
发布于:2003-07-03 19:11
to:wolfwoo22 你说的要对齐512,那我在文件的头部写入512字节,这样就对其那512,还是不行,因为我要加入的字符串没有限制,所以我就写入512字节,代码应该要简单点,可是还是不能格式化:
case IRP_MJ_READ: PVOID dat; PCHAR test; PVOID adds; ULONG lleng; adds = MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority); lleng=io_stack->Parameters.Read.Length; dat=ExAllocatePool(NonPagedPool,lleng); if(dat==NULL) { irp->IoStatus.Status = STATUS_INVALID_PARAMETER; irp->IoStatus.Information = 0; break; } RtlZeroMemory(dat,lleng); ZwReadFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, dat, io_stack->Parameters.Read.Length, &io_stack->Parameters.Read.ByteOffset, NULL ); test=(PCHAR)dat; if((test[0]==\'w\')||(test[1]==\'w\')||(test[2]==\'w\')) { ZwReadFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority), io_stack->Parameters.Read.Length, &io_stack->Parameters.Read.ByteOffset, NULL ); } else { RtlCopyMemory(adds,dat,io_stack->Parameters.Read.Length); ExFreePool(dat); } break; case IRP_MJ_WRITE: if ((io_stack->Parameters.Write.ByteOffset.QuadPart + io_stack->Parameters.Write.Length) > device_extension->file_size.QuadPart) { irp->IoStatus.Status = STATUS_INVALID_PARAMETER; irp->IoStatus.Information = 0; } if((io_stack->Parameters.Write.ByteOffset.QuadPart==0)) { CHAR tmp1[512]=\"www.sina.com.cn\"; ZwWriteFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, (PVOID)tmp1, 512, &io_stack->Parameters.Write.ByteOffset, NULL ); } else { ZwWriteFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority), io_stack->Parameters.Write.Length, &io_stack->Parameters.Write.ByteOffset, NULL ); } break; 我想先用这种方法试一试,可是不行,帮我看看好吗?谢谢! |
|
16楼#
发布于:2003-07-03 19:33
用户被禁言,该主题自动屏蔽! |
|
17楼#
发布于:2003-07-07 13:00
to:wolfwoo22
老大我照着你的意思作了还是不能格式化,我吧我的代码贴出来,你帮我看看: case IRP_MJ_READ: PVOID dat; PCHAR test; PVOID adds; ULONG lleng; adds = MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority); lleng=io_stack->Parameters.Read.Length; dat=ExAllocatePool(NonPagedPool,lleng); if(dat==NULL) { irp->IoStatus.Status = STATUS_INVALID_PARAMETER; irp->IoStatus.Information = 0; break; } RtlZeroMemory(dat,lleng); ZwReadFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, dat, io_stack->Parameters.Read.Length, &io_stack->Parameters.Read.ByteOffset, NULL ); test=(PCHAR)dat; if((test[0]==\'w\')&&(test[1]==\'w\')&&(test[2]==\'w\')) { io_stack->Parameters.Write.ByteOffset.QuadPart=32; ZwReadFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority), io_stack->Parameters.Read.Length, &io_stack->Parameters.Read.ByteOffset, NULL ); else { RtlCopyMemory(adds,test,io_stack->Parameters.Read.Length); ExFreePool(dat); } break; case IRP_MJ_WRITE: { PVOID nextdal; PVOID nextbuf; PCHAR string=NULL; ULONG length,nextlen; PCHAR libuf,bufdate; if ((io_stack->Parameters.Write.ByteOffset.QuadPart + io_stack->Parameters.Write.Length) > device_extension->file_size.QuadPart) { irp->IoStatus.Status = STATUS_INVALID_PARAMETER; irp->IoStatus.Information = 0; } if(io_stack->Parameters.Write.ByteOffset.QuadPart==0) { PCHAR tmp1=\"www.sina.com.cn\"; PVOID Mdldata,dal; PVOID bufdat,buf; PCHAR temp,ttstr; ULONG lsize; ZwWriteFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, (PVOID)tmp1, 32, &io_stack->Parameters.Write.ByteOffset, NULL ); irp->IoStatus.Information = 32; io_stack->Parameters.Write.ByteOffset.QuadPart=32; Mdldata=MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority); length=io_stack->Parameters.Write.Length; bufdat=ExAllocatePool(NonPagedPool,length); if(bufdat==NULL) { irp->IoStatus.Status = STATUS_INVALID_PARAMETER; irp->IoStatus.Information = 0; break; } RtlZeroMemory(bufdat,length); RtlCopyMemory(bufdat,Mdldata,length); temp=(PCHAR)bufdat; bufdate=temp+(length-32); ZwWriteFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, (PVOID)bufdat, io_stack->Parameters.Write.Length-32, &io_stack->Parameters.Write.ByteOffset, NULL ); irp->IoStatus.Information =io_stack->Parameters.Write.Length-32; //io_stack->Parameters.Write.ByteOffset.QuadPart=io_stack->Parameters.Write.Length; //memcpy(ttstr,temp+(length-32),32); dal=MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority); lsize=io_stack->Parameters.Write.Length;; buf=ExAllocatePool(NonPagedPool,lsize); if(buf==NULL) { irp->IoStatus.Status = STATUS_INVALID_PARAMETER; irp->IoStatus.Information = 0; break; } RtlZeroMemory(buf,lsize); RtlCopyMemory(buf,dal,lsize); //memcpy(ttstr,temp+(length-32),32); ttstr=temp+(length-32); ZwWriteFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, (PVOID)bufdate, 32, &io_stack->Parameters.Write.ByteOffset, NULL ); irp->IoStatus.Information =32; //io_stack->Parameters.Write.ByteOffset.QuadPart=io_stack->Parameters.Write.Length+32; dal=MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority); RtlCopyMemory(dal,buf,io_stack->Parameters.Write.Length); ExFreePool(bufdat); ExFreePool(buf); break; } nextdal=MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority); nextlen=io_stack->Parameters.Write.Length;; nextbuf=ExAllocatePool(NonPagedPool,nextlen); if(nextbuf==NULL) { irp->IoStatus.Status = STATUS_INVALID_PARAMETER; irp->IoStatus.Information = 0; break; } RtlZeroMemory(nextbuf,nextlen); RtlCopyMemory(nextbuf,nextdal,nextlen); libuf=(PCHAR)nextbuf; memcpy(bufdate,libuf,nextlen-32); ZwWriteFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, nextbuf, io_stack->Parameters.Write.Length-32, &io_stack->Parameters.Write.ByteOffset, NULL ); irp->IoStatus.Information =io_stack->Parameters.Write.Length-32; //io_stack->Parameters.Write.ByteOffset.QuadPart=io_stack->Parameters.Write.Length; { PVOID lowdal,ndal; PVOID lowbuf; PCHAR lowtemp; ULONG lowlen; lowdal=MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority); lowlen=io_stack->Parameters.Write.Length;; lowbuf=ExAllocatePool(NonPagedPool,lowlen); if(lowbuf==NULL) { irp->IoStatus.Status = STATUS_INVALID_PARAMETER; irp->IoStatus.Information = 0; break; } RtlZeroMemory(lowbuf,lowlen); RtlCopyMemory(lowbuf,lowdal,lowlen); lowtemp=libuf+(nextlen-32); //memcpy(lowtemp,libuf+(nextlen-32),32); ZwWriteFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, (PVOID)lowtemp, 32, &io_stack->Parameters.Write.ByteOffset, NULL ); irp->IoStatus.Information =32; //io_stack->Parameters.Write.ByteOffset.QuadPart=io_stack->Parameters.Write.Length+32; ndal=MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority); RtlCopyMemory(ndal,lowbuf,io_stack->Parameters.Write.Length); ExFreePool(lowbuf); } ExFreePool(nextbuf); break; } } 请指点,我还有70分没给你,帮我解决了我就立即给分 |
|
18楼#
发布于:2003-07-07 13:39
用户被禁言,该主题自动屏蔽! |
|
19楼#
发布于:2003-07-07 13:50
用户被禁言,该主题自动屏蔽! |
|
上一页
下一页