首页
社区
课程
招聘
[求助]一个在驱动中递归创建目录的函数
发表于: 2008-12-29 15:59 6342

[求助]一个在驱动中递归创建目录的函数

2008-12-29 15:59
6342
小弟要在驱动中递归的创建目录,下面是我写的一个函数。可在调试过程中,总是少创建一级。比如我要创建"\\??\\C:\\Virtual\\E\\avm\\bin"的一个目录,最后只能创建到avm这一级。最后的bin这个目录不知道到哪里去了。小弟才疏学浅,刚接触驱动开发,希望哪位好心人给指点指点,下面是程序的源代码。谢谢各位了
=============================================
#include <ntddk.h>

NTSTATUS
CreateDir(
                  UNICODE_STRING ANewPath
                  )
{
        HANDLE DirHandle;
        NTSTATUS Status=STATUS_SUCCESS;
        OBJECT_ATTRIBUTES DirOA;
        IO_STATUS_BLOCK IoSB;
        UNICODE_STRING BNewPath;
        PWSTR plast;
        USHORT i;
        USHORT j;
        USHORT k;

        InitializeObjectAttributes(
                &DirOA,
                &ANewPath,
                OBJ_CASE_INSENSITIVE,
                NULL,
                NULL
                );
        Status=ZwCreateFile(
                &DirHandle,
                SYNCHRONIZE|FILE_ALL_ACCESS,
                &DirOA,
                &IoSB,
                NULL,
                FILE_ATTRIBUTE_NORMAL,
                FILE_SHARE_VALID_FLAGS|FILE_SHARE_READ|FILE_SHARE_WRITE,
                FILE_OPEN_IF,
                FILE_DIRECTORY_FILE,
                NULL,
                0);
        KdPrint( ("[-]CreateDir create dir:%ws\n", ANewPath.Buffer));
        if (NT_SUCCESS(Status)){
                KdPrint(("[-]create dir ok.%ws\n", ANewPath.Buffer));
                ZwClose(DirHandle);
                return STATUS_SUCCESS;
        }else{
                if (Status==STATUS_OBJECT_NAME_EXISTS)
                {
                        KdPrint(("[+]STATUS_OBJECT_NAME_EXISTS\n"));
                        return STATUS_SUCCESS;
                }else
                {
                        //Get Parent Path
                        k=(ANewPath.Length/2);

                        for (i=0;i<k;i++)
                        {
                                if (ANewPath.Buffer[i]==L'\\')
                                {
                                        plast=&ANewPath.Buffer[i];
                                }
                        }

                        *plast= '\0';

                        RtlInitUnicodeString(&BNewPath,ANewPath.Buffer);       

                        KdPrint(("[+]CreateDir the BNewPath  is :%ws\n",BNewPath.Buffer));

                        Status=CreateDir(BNewPath);
                        if (!NT_SUCCESS(Status))
                        {
                                KdPrint(("Call CreateDir failed with status:%08x\n",Status));
                                return Status;
                        }else
                        {
                                KdPrint(("[-] create father dir ok. %ws \n", BNewPath.Buffer));
                                Status=ZwCreateFile(
                                        &DirHandle,
                                        SYNCHRONIZE|FILE_ALL_ACCESS,
                                        &DirOA,
                                        &IoSB,
                                        NULL,
                                        FILE_ATTRIBUTE_NORMAL,
                                        FILE_SHARE_VALID_FLAGS|FILE_SHARE_READ|FILE_SHARE_WRITE,
                                        FILE_OPEN_IF,
                                        FILE_DIRECTORY_FILE,
                                        NULL,
                                        0);
                                if (!NT_SUCCESS(Status))
                                {
                                        KdPrint((" call ZwCreateFile :status is %08x\n",Status));
                                        return Status;
                                }else
                                        ZwClose(DirHandle);
                                return STATUS_SUCCESS;
                        }

                }

                KdPrint(("@CreateDir:create directory failed with status %08X\n",Status));
        }
        return Status;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 364
活跃值: (152)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
2
你递归的逻辑不对吧
2008-12-29 16:02
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我在用户态的函数,也是这个逻辑啊
2008-12-29 16:03
0
雪    币: 228
活跃值: (119)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
驱动中就别玩啥递归了。。。。,

如果是递归性质在驱动中第一个就要用迭代把它消去。
2008-12-29 18:42
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
5
严重同意...否则等着栈溢出吧
2008-12-29 19:15
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
问题已经解决
不存在溢出问题,呵呵
2009-1-6 11:13
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
7
递归的话只是说明存在溢出的风险...不一定说就一定会溢出...
2009-1-6 12:54
0
游客
登录 | 注册 方可回帖
返回
//