阅读:2768回复: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-09 13:30
楼上的大哥:
我现在已经把我要写入的数据以512字节长度写入,进行FAT(我定义的<1G的容量)格式化时没问题,加密解密都没问题,可是格式化为FAT32(我定义的>2G的容量)时提示不能完全格式化,但我到win2k自带的dos下进行chkdsk检测时,提示了格式化的信息,也就是已经格式化了的,在dos下对该盘进行操作时,并不提示该盘未格式化,而提示的是“更改此用户密码时需要交叉加密密码”。还有如果我到win2k自带的dos下进行进行FAT32格式化也能成功,但格式化成功后想对该盘进行操作时,dos会提示“更改此用户密码时需要交叉加密密码”,不知到是什么原因?能帮我回答吗? |
|
板凳#
发布于:2003-07-07 16:44
用户被禁言,该主题自动屏蔽! |
|
地板#
发布于:2003-07-07 16:37
兄弟:目前绝大部分的harddisk的section(扇区)大小是512字节。驱动器的机械特性使得每次向磁盘读或者写的最小单元是512字节,你明白吗?也许你有疑问,因为你肯定看到过小于512字节的文件啊,为什么呢?这就是因为wolfwoo22所说的FILE_FLAG_NO_BUFFERING开关了。当我们打开文件而没有特别指定这个开关的时候,操作系统自动为这个文件建立一个8k左右的内部缓冲区(你可以编程改变),如果你对文件的操作mod(512)!=0,多出来的字节会在你关闭文件的时候系统自动把它补齐一次写入磁盘(flush).文件系统会通报准确的文件大小,同时告诉你文件占用空间的大小(这个肯定是512对齐的)。你用鼠标右键随便看一个文件的属性你就会看到这个事实了。而当你打开文件特别指定FILE_FLAG_NO_BUFFERING开关的时候,系统就没有建立缓冲区了,所以如果你的操作的文件偏移量不是512对齐,则文件系统无法定位磁盘位置,而如果你的操作的数据量不是512对齐,同样是因为无法定位磁盘位置而失败。
|
|
|
地下室#
发布于:2003-07-07 13:50
用户被禁言,该主题自动屏蔽! |
|
5楼#
发布于:2003-07-07 13:39
用户被禁言,该主题自动屏蔽! |
|
6楼#
发布于: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分没给你,帮我解决了我就立即给分 |
|
7楼#
发布于:2003-07-03 19:33
用户被禁言,该主题自动屏蔽! |
|
8楼#
发布于: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; 我想先用这种方法试一试,可是不行,帮我看看好吗?谢谢! |
|
9楼#
发布于:2003-07-03 15:55
用户被禁言,该主题自动屏蔽! |
|
10楼#
发布于:2003-07-03 15:37
wowocock 大哥,写到文件的最后,如果往该盘里放文件会不会覆盖掉呢?还有这个文件的最后怎么定位,也就是说起始位置怎么定义。
能不能把代码贴出来看看。谢谢! |
|
11楼#
发布于:2003-07-03 15:28
建议你把你的东西写到文件的最后,我试了,不会有问题的,而且无论格式化多少次,写入的东西都存在.
|
|
|
12楼#
发布于: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代码对吗?你能跟我说说格式化的流程吗?谢谢! |
|
13楼#
发布于:2003-07-03 14:51
用户被禁言,该主题自动屏蔽! |
|
14楼#
发布于: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分。拜托那。 |
|
15楼#
发布于:2003-07-03 13:36
用户被禁言,该主题自动屏蔽! |
|
16楼#
发布于:2003-07-03 12:30
先给30分,我先试一试,有什么问题我在问你。
我其实是刚接触驱动这玩意,很菜的,希望你能讲详细点,谢谢。 在read中去掉我在write中写入的数据,是不是在读取数据的时候将其位置移动到我写入的字符串长度的距离处读取数据就可以那,还是将读出的数据的前面我写入的数据去掉后后重新写入内存中。 写入后指针要不要加上32? |
|
17楼#
发布于:2003-07-03 12:09
用户被禁言,该主题自动屏蔽! |
|
18楼#
发布于:2003-07-03 11:24
wolfwoo22 大哥,FILE_NO_INTERMEDIATE_BUFFERING参数在FileDiskOpenFile函数里的ZwCreateFile中我没修改,你的意思是不是我将我的字符串和格式化信息写入后,就将指针移到512处,以便供后面的读写,同时不让后面的写入将其覆盖掉,是吗?那在ReadFile中怎么处理,是不是只移动偏移量,能给我代码吗,谢谢!帮我解决我一定给分,谢谢!
|
|
19楼#
发布于:2003-07-03 10:31
用户被禁言,该主题自动屏蔽! |
|
上一页
下一页