首页
社区
课程
招聘
[求助]ZwWriteFile问题
发表于: 2008-4-8 22:35 11122

[求助]ZwWriteFile问题

2008-4-8 22:35
11122
我想从内核创建一个文件,并对它进行写入操作,写了份代码,可以创建文件,不过就是不能把内容写入到文件里,不知道哪里出错了,各位大侠帮忙看一下,先谢了。

以下是代码:

#include <ntddk.h>
#include <ntdef.h>
#include "ntifs.h"

#define FileName   L"\\??\\C:\\Windows\\ForTestFile.txt"

VOID DriverUnload( IN PDRIVER_OBJECT pDriObj)
{
        DbgPrint( "DriverUnload Called\n" );
}

NTSTATUS WorkSysThread()
{
        NTSTATUS                        status;
        CHAR                        *Content;
        PHANDLE                        hFile;
        UNICODE_STRING                ObjectName;
        UNICODE_STRING                WriteContent;
        IO_STATUS_BLOCK                  IoStatusBlock;
        OBJECT_ATTRIBUTES        FileObjAttr;

        hFile                        = NULL;
        Content                        = "ForTestContent";

        RtlInitUnicodeString( &ObjectName,
                         FileName );

        InitializeObjectAttributes( &FileObjAttr,
                                 &ObjectName,
                                 OBJ_OPENIF,
                                 NULL,
                                 NULL );
       
        status = ZwCreateFile( hFile,
                                                   GENERIC_WRITE | SYNCHRONIZE | GENERIC_READ,
                                                   &FileObjAttr,
                                                   &IoStatusBlock,
                                                   0,
                                                   FILE_ATTRIBUTE_NORMAL,
                                                   FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
                                                   FILE_OPEN_IF,
                                                   FILE_SYNCHRONOUS_IO_NONALERT,
                                                   NULL,
                                                   0 );

        if( status == STATUS_SUCCESS )
        {
                DbgPrint( "Create File Successfully\n" );

                status  = ZwWriteFile(        hFile,
                                                                NULL,
                                                                NULL,
                                                                NULL,
                                                                &IoStatusBlock,
                                                                Content,
                                                                strlen(Content),
                                                                NULL,
                                                                NULL );
                if( !NT_SUCCESS( status ) )
                {
                        DbgPrint( "Write File Failed!\n" );
                        return status;
                }
                ZwClose( hFile );
                ZwDeleteFile( &FileObjAttr );
        }
        return status;
}

DriverEntry( IN PDRIVER_OBJECT  pDriObj,
                         IN PUNICODE_STRING pRegistryPath )
{
        NTSTATUS status;
        HANDLE   hThread;
        pDriObj->DriverUnload = DriverUnload;
        status = PsCreateSystemThread( &hThread,
                                                                   0,
                                                                   NULL,
                                                                   NtCurrentProcess(),
                                                                   NULL,
                                                                   (PKSTART_ROUTINE)WorkSysThread,
                                                                   NULL );
        return status;
}

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
2
InitializeObjectAttributes( &FileObjAttr,
&ObjectName,
OBJ_OPENIF | OBJ_KERNEL_HANDLE,
NULL,
NULL );

If the caller is not running in a system thread context, it must set the OBJ_KERNEL_HANDLE attribute when it calls InitializeObjectAttributes.

btw,
ZwDeleteFile( &FileObjAttr );
is not necessary and it is wrong here.
InitializeObjectAttributes() does nothing with the actual file object, it only initializes the OBJECT_ATTRIBUTES structure.

#define InitializeObjectAttributes(p, n, a, r, s) {
     (p)->Length = sizeof( OBJECT_ATTRIBUTES );
     (p)->RootDirectory = r;
     (p)->Attributes = a;
     (p)->ObjectName = n;
     (p)->SecurityDescriptor = s;
     (p)->SecurityQualityOfService = NULL;
}
2008-4-9 05:41
0
雪    币: 280
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢2楼的回答。

我按你说的把| OBJ_KERNEL_HANDLE加上了,并去掉了ZwDeleteFile( &FileObjAttr );,不过还是不行,只能创建文件,不能把内容写入,有可能是调用PsCreateSystemThread的时候出错吗?还是我写的WorkSysThread()函数有问题?
2008-4-9 07:39
0
雪    币: 709
活跃值: (2575)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
4
参考KLOG
2008-4-9 09:20
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
RtlInitUnicodeString( &ObjectName, FileName );

    InitializeObjectAttributes( &FileObjAttr,
               &ObjectName,
               OBJ_CASE_INSENSITIVE,
               NULL,
               NULL );
  
    status = ZwCreateFile( hFile,
               GENERIC_WRITE | GENERIC_READ,
               &FileObjAttr,
               &IoStatusBlock,
               0,
               FILE_ATTRIBUTE_NORMAL,
               FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
               FILE_OPEN_IF,
               FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,
               NULL,
               0 );

    if( status == STATUS_SUCCESS )
    {
        DbgPrint( "Create File Successfully\n" );

        status  = ZwWriteFile(
                hFile,
                NULL,
                NULL,
                NULL,
                &IoStatusBlock,
                Content,
                strlen(Content),
                NULL,
                NULL );
        if( !NT_SUCCESS( status ) )
        {
            DbgPrint( "Write File Failed!\n" );
            return status;
        }
        ZwClose( hFile );
        ZwDeleteFile( &FileObjAttr );
    }
2008-4-11 01:07
0
游客
登录 | 注册 方可回帖
返回