阅读:9554回复:32
在驱动里面如何对更改文件名?ZwSetInformationFile?
在驱动开发网上找到下面这个代码,试了试好像不行
NTSTATUS Rename(PCHAR szFileName1,PCHAR szFileName2) { NTSTATUS status; CHAR szFileNameL[MAXPATHLEN]; OBJECT_ATTRIBUTES oa; IO_STATUS_BLOCK iostatus; HANDLE hfile =NULL; UNICODE_STRING pathnameW; ANSI_STRING pathnameA; PFILE_RENAME_INFORMATION fri; strcpy(szFileNameL,\"\\\\??\\\\\"); strcat(szFileNameL,szFileName1); RtlInitAnsiString (&pathnameA,szFileNameL ); RtlAnsiStringToUnicodeString(&pathnameW,&pathnameA,TRUE); InitializeObjectAttributes(&oa, &pathnameW, OBJ_CASE_INSENSITIVE, NULL, NULL); status = ZwCreateFile(&hfile, DELETE, &oa, &iostatus, NULL, 0, FILE_SHARE_READ, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL,0); RtlFreeUnicodeString(&pathnameW); if(!NT_SUCCESS(status)) { if(hfile) ZwClose(hfile); return status; } // RtlZeroMemory(szFileName,MAXPATHLEN]; strcpy(szFileNameL,\"\\\\??\\\\\"); strcat(szFileNameL,szFileName2); RtlInitAnsiString (&pathnameA,szFileNameL ); RtlAnsiStringToUnicodeString(&pathnameW,&pathnameA,TRUE); fri=ExAllocatePool(NonPagedPool,sizeof(FILE_RENAME_INFORMATION)+pathnameW.Length+1); fri->FileNameLength=pathnameW.Length; memcpy(fri->FileName,pathnameW.Buffer,pathnameW.Length); fri->ReplaceIfExists=0; fri->RootDirectory=0; status = ZwSetInformationFile(hfile, &iostatus, &fri, sizeof(fri), FileDispositionInformation); RtlFreeUnicodeString(&pathnameW); if(hfile) ZwClose(hfile); return status; } ZwSetInformationFile好像只能set以下几个information FileBasicInformation FileDispositionInformation FilePositionInformation FileEndOfFileInformation 郁闷中! |
|
|
沙发#
发布于:2009-01-10 18:44
pjf 向来低调.呵呵
|
|
板凳#
发布于:2008-04-12 15:56
引用第23楼killvxk于2008-01-24 23:38发表的 : 来来来,大家一起鞭尸~~~霍霍 |
|
|
地板#
发布于:2008-04-11 14:45
留念~
![]() |
|
地下室#
发布于:2008-04-04 16:29
看了这篇帖子以后 我的心情久久不能平静 楼主的一个问题问的好 就是你是怎么知道的 看书和资料当然能知道很多东西 但要想知道更多的东西就得靠自己了 就像pjf一样 其实牛人就是这么容易做只要你肯努力 我也要当牛人
|
|
5楼#
发布于:2008-02-03 21:23
我把他挖出来是纪念pjf多年不来发帖~
|
|
|
6楼#
发布于:2008-02-03 21:18
哦,只看我楼上的回复时间了,是很久远了!呵呵
|
|
7楼#
发布于:2008-01-30 19:54
楼上的好玩,也不看看这贴是哪年的
是不是有点装* |
|
8楼#
发布于:2008-01-30 18:43
为什么就没有人看看nt4,win2k,reactos中的MoveFile这个函数是怎么实现的呢!昏!做开发想速成,想什么都别人帮你搞定是不行地!你学会的只是复制,粘帖,F7。如何解决问题还是没有搞清楚!除非必要我几乎不看反汇编代码,因为源代码里有。
|
|
9楼#
发布于:2008-01-26 12:41
高手都在关注相同的东西
|
|
10楼#
发布于:2008-01-24 23:38
pjf的帖子要拍照,鞭尸,挖坟~~
|
|
|
11楼#
发布于:2008-01-24 20:33
老兄,能贴一下调试通过的Rename代码吗
3ks |
|
|
12楼#
发布于:2003-04-01 13:55
谢谢老大,行了。
是一个参数传递错误,Thank you. |
|
13楼#
发布于:2003-03-31 22:50
to pjf: 放心,未经测试的代码我从来不贴。用Zw***和直接发IRP包我都通过测试的。(这个程序在2k sp2上测试) 你原封不动吗?开始以为copy出了纰漏,但原封不动的copy下来,还是行。 F:上是noname.txt,建一个名为c的目录,运行后noname.txt被移到c中改名为rename.txt。还有问题的话,讨论一下你的系统环境。 |
|
14楼#
发布于:2003-03-31 21:14
to pjf:
你的代码有测试过吗???? 原封不对用了你的代码,发现不行,提示:错误: ((NTSTATUS)0xC0000034L) // // MessageId: STATUS_OBJECT_NAME_NOT_FOUND // // MessageText: // // Object Name not found. // #define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS)0xC0000034L) 用了以下改良的代码,如下错误: 0x0000000D,不知是何错误,在ntstatus.h没有这个错误码。 平台:2k,没有打sp 老大有MAIL吗? 我给你发MAIL。 |
|
15楼#
发布于:2003-03-30 23:06
crack :cool: |
|
16楼#
发布于:2003-03-30 23:05
谢谢!!! 很对,用IoCreateFile。 提示就到这里吧,调用的参数与平常可是不同的,呵呵。 good luck. |
|
17楼#
发布于:2003-03-29 18:51
再问一个老大,你这些信息一般是从哪儿得到? :D :D :D |
|
18楼#
发布于:2003-03-29 18:50
谢谢!!!
我试试。 不过有点不解,那就是,如果我使用构造IRP来进行move,那个Parameters.SetFile.FileObject我该如何构造?,也用IoCreateFile??? 谢谢老大的回答。以学到东东。 |
|
19楼#
发布于:2003-03-29 11:17
另外ZwSetInformationFile也可以用,只是你们都没有使用正确的ACCESS_MASK。有一个未公开标志,加上即可。???? 给你写一小段,将f:\\noname.txt MOVE到F:\\c\\rename.txt,注意到ACCESS_MASK: char file[255]; HANDLE handle; IO_STATUS_BLOCK ios; OBJECT_ATTRIBUTES oa; UNICODE_STRING pathnameW; wchar_t *str=L\"\\\\??\\\\f:\\\\c\\\\rename.txt\"; PFILE_RENAME_INFORMATION ii=(PFILE_RENAME_INFORMATION)file; RtlInitUnicodeString(&pathnameW,L\"\\\\??\\\\f:\\\\noname.txt\"); InitializeObjectAttributes(&oa, &pathnameW, OBJ_CASE_INSENSITIVE, NULL, NULL); ii->ReplaceIfExists=TRUE; ii->RootDirectory=0; wcscpy(ii->FileName,str); ii->FileNameLength=wcslen(ii->FileName)*2; ntStatus = ZwCreateFile(&handle, 0x110080, &oa, &ios, NULL, 0, FILE_SHARE_READ, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT, NULL,0); if (NT_SUCCESS(ntStatus)) ZwSetInformationFile(handle,&ios,ii,1000,10); ZwClose(handle); 若不在同一卷,不能成功(0xc00000d4)。 实际上系统的MoveFile在检查到0xc00000d4后自动用CreateFile/DeleteFile代替。 至于那个SetFile.FileObject,系统是用IoCreateFile打开的,即改过路径、名称后的文件对象。 [编辑 - 3/29/03 by pjf] |
|
上一页
下一页