首页
社区
课程
招聘
[注意]Ring3下调用ZwCreateFile,第二个参数配置真的很恶心
发表于: 2008-12-22 14:46 9439

[注意]Ring3下调用ZwCreateFile,第二个参数配置真的很恶心

2008-12-22 14:46
9439
在Ring0下,ZwCreateFile的第二个参数设置为GENERIC_ALL没有问题的,之前用CreateFile也是习惯设置为GENERIC_READ | GENERIC_WRITE,没想到还有一个SYNCHRONIZE。
修代码修了半天始终没有发现问题在哪里。搞得都想回家修地球了。

在论坛上搜索到的帖子讨论的不是太明确,在这里补充一下吧,算是一个纪念。

BOOL FileWrite()
{
        NTSTATUS status;
        HANDLE hFile = NULL;
        UNICODE_STRING ustrFileName;
        OBJECT_ATTRIBUTES oa;
        IO_STATUS_BLOCK isb;

        RtlInitUnicodeString(&ustrFileName,
                L"\\??\\d:\\NativeApiTest.txt");

        InitializeObjectAttributes(&oa,
                &ustrFileName,
                OBJ_CASE_INSENSITIVE,
                NULL,
                NULL);

        status = ZwCreateFile(&hFile,
                //0xc0100080,       
                GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE,//| FILE_READ_ATTRIBUTES,
//关键就是在这里,恶心死了
                &oa,
                &isb,
                NULL,
                FILE_ATTRIBUTE_NORMAL,
                0,
                FILE_OVERWRITE_IF,
                FILE_SYNCHRONOUS_IO_NONALERT,
                NULL,
                0);

        if( NT_SUCCESS(status) )
        {
                printf("Create file succeed!\n");
        }
        else
        {
                printf("Create file failed!\n");
                goto ClearAll;
        }

        //写文件
        status = ZwWriteFile(hFile,
                NULL,
                NULL,
                NULL,
                &isb,
                "DriverTest",
                strlen("DriverTest"),
                NULL,
                NULL);
        if( NT_SUCCESS(status) )
        {
                printf("Write file succeed!\n");
        }
        else
        {
                printf("Write file failed!\n");
                goto ClearAll;
        }
        //
ClearAll:
        if(hFile)
        {
                ZwClose(hFile);
        }

        return TRUE;
}

;;;;找到的原因在5楼

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

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
2
丫的写一个文件不知道用CreateFileA啊,ring3写个文件难不成还比ring0麻烦
不行就用C语言的fopen
2008-12-22 15:12
0
雪    币: 247
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
无语~~~


不和你计较
2008-12-22 15:23
0
雪    币: 331
活跃值: (57)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
GENERIC_READ:STANDARD_RIGHTS_READ, FILE_READ_DATA, FILE_READ_ATTRIBUTES, FILE_READ_EA, and SYNCHRONIZE.
GENERIC_WRITE:STANDARD_RIGHTS_WRITE, FILE_WRITE_DATA, FILE_WRITE_ATTRIBUTES, FILE_WRITE_EA, FILE_APPEND_DATA, and SYNCHRONIZE.
GENERIC_EXECUTE:STANDARD_RIGHTS_EXECUTE, FILE_EXECUTE, FILE_READ_ATTRIBUTES, and SYNCHRONIZE. This value is irrelevant for device and intermediate drivers.
GENERIC_ALL:FILE_ALL_ACCESS.

默认不是都有SYNCHRONIZE吗
2008-12-22 15:24
0
雪    币: 247
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
哦,终于明白了些,

在winnt.h中
#define GENERIC_READ (0x80000000L)
#define GENERIC_WRITE (0x40000000L)
#define GENERIC_EXECUTE (0x20000000L)
#define GENERIC_ALL (0x10000000L)


同时又定义了
#define FILE_GENERIC_READ (STANDARD_RIGHT_READ |\
FILE_READ_DATA |\
FILE_READ_EA |\
SYNCHRONIZE)
#define FILE_GENERIC_WRITE (STANDARD_RIGHTS_WRITE) |\
FILE_WRITE_DATA |\
FILE_WRITE_EA |\
FILE_APPEND_DATA |\
SYNCHRONIZE)
#define FILE_GENERIC_EXECUTE (STANDARD_RIGHTS_EXECUTE |\
FILE_READ_ATTRIBUTES |\
FILE_EXECUTE |\
SYNCHRONIZE)

我应该使用后面的一组宏。
可惜我的msdn的版本过低,没有对这个的描述,自己也没有去注意这个,
谢谢上面的better哥们儿
2008-12-22 15:44
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
6
哎,同步都不知道要做还是别写程序了
2008-12-22 15:53
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
7
而且就算你遇到这个问题,只要稍微调试一下,甚至是打个debug信息,就能知道为什么了。不调试,活该你修代码修得要死
2008-12-22 15:54
0
游客
登录 | 注册 方可回帖
返回
//