阅读:9250回复: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 郁闷中! |
|
|
沙发#
发布于:2003-03-20 21:28
能做到这步,何不构造个IRP向下值。
我也遇到,就准备使用IRP。 |
|
板凳#
发布于:2003-03-20 21:42
Use ZwSetInformationFile with FileRenameInformation as class information. maybe can resolve your problem...
|
|
|
地板#
发布于:2003-03-21 09:21
能做到这步,何不构造个IRP向下值。 看不懂,能不能说仔细点。。 :D :D :D |
|
|
地下室#
发布于:2003-03-21 09:23
Use ZwSetInformationFile with FileRenameInformation as class information. maybe can resolve your problem... Just as you say I have used the FileRenameInformation class, but I still can\'t resolve my problem! |
|
|
5楼#
发布于:2003-03-21 09:25
有哪位好心人帮忙看看我的代码?
感激不禁啊! |
|
|
6楼#
发布于:2003-03-21 12:53
我也看过DDK的帮助,ZwSetInformationFile是没有FileRenameInformation,除非MS文档说的不准,不过奇怪的是,IFS KIT的OSR DOC\\irpman.pdf 却是用这种方法(用ntxxx函数),不知道是不是ntxxx函数可以,但Zwxxxx就不知道,不过到这步,何不构造个IRP,然后向下传,我想这是可以的方法。
先建议你还是再用你的代码改一改,至于方法,你参考一下irpman.pdf的做法,我想也许可能行。实在不行,只好走最后一步,构造IRP向下传。 我也遇到这个问题,今天我试一下,到时交流。 |
|
7楼#
发布于:2003-03-21 20:00
ZwSetInformationFile是不行,
555~~~~~~~~~,看来要用构造IRP了,,,,该死的MS,为什么没有rename?????????? 我扁MS!!!!!!!!! |
|
8楼#
发布于:2003-03-21 20:14
ZwSetInformationFile是不行, 构造irp? 这个我不懂,能不能说说他的工作原理? 我的邮箱是swordbin@163.net,多多指教 |
|
|
9楼#
发布于:2003-03-22 12:00
参考一下... 别人说可以的...
http://groups.google.com/groups?hl=zh-CN&lr=&ie=UTF-8&oe=UTF-8&threadm=6i4b8h%24iil%241%40nnrp1.dejanews.com&rnum=1&prev=/groups%3Fq%3DFileRenameInformation%26hl%3Dzh-CN%26lr%3D%26ie%3DUTF-8%26oe%3DUTF-8%26selm%3D6i4b8h%2524iil%25241%2540nnrp1.dejanews.com%26rnum%3D1 |
|
|
10楼#
发布于:2003-03-22 12:28
楼上你搞错了,
NtSetInformationFile 是APP层的native API,在kernel不能用。 上面的代码就是使用构造IRP来做的呀!!! |
|
11楼#
发布于:2003-03-23 10:31
NtSetInformationFile 是APP层的native API,在kernel不能用。
---------------------------------------------------------- 都有,不是同一个。 在驱动开发网上找到下面这个代码,试了试好像不行 ---------------------------------------------------------- 另外ZwSetInformationFile也可以用,只是你们都没有使用正确的ACCESS_MASK。有一个未公开标志,加上即可。 很简单,自己crack一下吧,不多说了 |
|
12楼#
发布于:2003-03-23 16:10
NtSetInformationFile 是APP层的native API,在kernel不能用。 是不是说zwcreatefile里面的ACCESS_MASK? 应该是设成什么值? |
|
|
13楼#
发布于:2003-03-27 23:11
另外ZwSetInformationFile也可以用,只是你们都没有使用正确的ACCESS_MASK。有一个未公开标志,加上即可。????
在哪儿,pjf老在能提个示吗? 老大,我在调用ZwSetInformationFile中指定FileRenameInformation,程序返回无效的参数,按老大所说,那在ZwCreateFile哪儿加入Access_mask??,能不能提一下? (我已实现同一目录rename,不过我是构造IRP,但move就不可以,不是同目录,程序失败,我始始终不解其:IrpSp->Parameters.SetFile.FileObject的含义??),能讲解一下吗? 哪位兄弟帮一下呀!!!!!! (我也遇到这问题呀!!!!) |
|
14楼#
发布于: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] |
|
15楼#
发布于:2003-03-29 18:50
谢谢!!!
我试试。 不过有点不解,那就是,如果我使用构造IRP来进行move,那个Parameters.SetFile.FileObject我该如何构造?,也用IoCreateFile??? 谢谢老大的回答。以学到东东。 |
|
16楼#
发布于:2003-03-29 18:51
再问一个老大,你这些信息一般是从哪儿得到? :D :D :D |
|
17楼#
发布于:2003-03-30 23:05
谢谢!!! 很对,用IoCreateFile。 提示就到这里吧,调用的参数与平常可是不同的,呵呵。 good luck. |
|
18楼#
发布于:2003-03-30 23:06
crack :cool: |
|
19楼#
发布于: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。 |
|
上一页
下一页