首页
社区
课程
招聘
已经解决 [求助]ObOpenObjectByName 调用失败
发表于: 2012-8-5 23:19 9294

已经解决 [求助]ObOpenObjectByName 调用失败

2012-8-5 23:19
9294
NTSTATUS __stdcall  MyNtCreateFile(
                                                                   OUT PHANDLE             FileHandle,
                                                                   IN ACCESS_MASK          DesiredAccess,
                                                                   IN POBJECT_ATTRIBUTES   ObjectAttributes,
                                                                   OUT PIO_STATUS_BLOCK    IoStatusBlock,
                                                                   IN PLARGE_INTEGER       AllocationSize OPTIONAL,
                                                                   IN ULONG                FileAttributes,
                                                                   IN ULONG                ShareAccess,
                                                                   IN ULONG                CreateDisposition,
                                                                   IN ULONG                CreateOptions,
                                                                   IN PVOID                EaBuffer OPTIONAL,
                                                                   IN ULONG                EaLength )
{

OPEN_PACKET openPacket;
HANDLE hHandle = NULL;
NTSTATUS SStatus;
DUMMY_FILE_OBJECT localFileObject;
KPROCESSOR_MODE requestorMode;

RtlZeroMemory(&openPacket, sizeof( OPEN_PACKET ) );

requestorMode = KeGetPreviousMode();

openPacket.Type = IO_TYPE_OPEN_PACKET;   
openPacket.Size = sizeof( OPEN_PACKET );   
openPacket.ParseCheck = 0L;   
openPacket.AllocationSize.LowPart = 0;openPacket.AllocationSize.LowPart = 0;   
openPacket.CreateOptions = FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE;   
openPacket.FileAttributes = (USHORT) 0;   
openPacket.ShareAccess = (USHORT) FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;   
openPacket.Disposition = FILE_OPEN;   
openPacket.Override = FALSE;   
openPacket.QueryOnly = FALSE;   
openPacket.DeleteOnly = FALSE;   
openPacket.Options = 0;   
openPacket.RelatedFileObject = (PFILE_OBJECT) NULL;   
openPacket.CreateFileType = CreateFileTypeNone;   
openPacket.ExtraCreateParameters = NULL;   
openPacket.TraversedMountPoint = FALSE;   
openPacket.InternalFlags = 0;   
openPacket.TopDeviceObjectHint = NULL;

/*
openPacket.Type = IO_TYPE_OPEN_PACKET;
    openPacket.Size = sizeof( OPEN_PACKET );
    openPacket.CreateOptions = FILE_DELETE_ON_CLOSE;
    openPacket.ShareAccess = (USHORT) FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
    openPacket.Disposition = FILE_OPEN;
    openPacket.DeleteOnly = TRUE;
    openPacket.TraversedMountPoint = FALSE;
    openPacket.LocalFileObject = &localFileObject;
       

*/
    status = ObOpenObjectByName( ObjectAttributes,
                                 (POBJECT_TYPE) NULL,
                                 requestorMode,
                                 NULL,
                                 DesiredAccess,
                                 &openPacket,
                                 &hHandle);

ObOpenObjectByName 执行返回 C0000103 错误

下面 注译掉的是 WRK 里面的  OPEN_PACKET 结构 填充 也是 错误

郁闷了  ObjectAttributes InitializeObjectAttributes 初始化一个新的 也是 错误

求 大侠 指点迷津 感激不尽

已经解决 放弃采用 ObOpenObjectByName

原来 还可以 使用 ZwQueryAttributesFile 来查询的

在此感谢 各位 热心帮助 回帖的 大虾 牛人 你们的 帮助 令我 受益匪浅  谢谢·!

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

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 239
活跃值: (133)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
OPEN_PACKET 这个结构应该有初始化函数吧
2012-8-5 23:49
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
3
WCHAR wstrVolume[] = L"\\Device\\HarddiskVolume1";
HANDLE hHandle = NULL;

RtlInitUnicodeString(&unFileName, wstrVolume);
InitializeObjectAttributes(&ObjectAttributes, &unFileName,   OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);
openPacket.Type = IO_TYPE_OPEN_PACKET;
openPacket.Size = sizeof( OPEN_PACKET );
openPacket.ParseCheck = 0L;
openPacket.AllocationSize.LowPart = 0;
openPacket.AllocationSize.LowPart = 0;
openPacket.CreateOptions = FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE;
openPacket.FileAttributes = (USHORT) 0;
openPacket.ShareAccess = (USHORT) FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE;
openPacket.Disposition = FILE_OPEN;
openPacket.Override = FALSE;
openPacket.QueryOnly = FALSE;
openPacket.DeleteOnly = FALSE;
openPacket.Options = 0;
openPacket.RelatedFileObject = (PFILE_OBJECT) NULL;
openPacket.CreateFileType = CreateFileTypeNone;
openPacket.ExtraCreateParameters = NULL;
openPacket.TraversedMountPoint = FALSE;
openPacket.InternalFlags = 0;
openPacket.TopDeviceObjectHint = NULL;

Status = ObOpenObjectByName(   &ObjectAttributes,   *IoFileObjectType,    KernelMode,   NULL,    WRITE_OWNER | SYNCHRONIZE,   &openPacket,   &hHandle   );
2012-8-6 00:01
0
雪    币: 279
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
感谢 2为大虾  热情 帮助

TO 2楼  有一个 初始化宏  我这里 无效

TO 3楼  你这个是 百度上面的代码 我早就试验过了  是没用的 依然错误的

再次感谢 2位
2012-8-6 00:09
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
5
OPEN_PACKET的定义,拿出来看看,操作系统相关的~每个版本都不一样的哦,亲~

比如win7 x86下是这样的~
          typedef struct _OPEN_PACKET                                    // 27 elements, 0x70 bytes (sizeof)
          {
/*0x000*/     INT16        Type;
/*0x002*/     INT16        Size;
/*0x004*/     struct _FILE_OBJECT* FileObject;
/*0x008*/     LONG32       FinalStatus;
/*0x00C*/     ULONG32      Information;
/*0x010*/     ULONG32      ParseCheck;
/*0x014*/     struct _FILE_OBJECT* RelatedFileObject;
/*0x018*/     struct _OBJECT_ATTRIBUTES* OriginalAttributes;
/*0x01C*/     UINT8        _PADDING0_[0x4];
/*0x020*/     union _LARGE_INTEGER AllocationSize;                       // 4 elements, 0x8 bytes (sizeof)
/*0x028*/     ULONG32      CreateOptions;
/*0x02C*/     UINT16       FileAttributes;
/*0x02E*/     UINT16       ShareAccess;
/*0x030*/     VOID*        EaBuffer;
/*0x034*/     ULONG32      EaLength;
/*0x038*/     ULONG32      Options;
/*0x03C*/     ULONG32      Disposition;
/*0x040*/     struct _FILE_BASIC_INFORMATION* BasicInformation;
/*0x044*/     struct _FILE_NETWORK_OPEN_INFORMATION* NetworkInformation;
/*0x048*/     enum _CREATE_FILE_TYPE CreateFileType;
/*0x04C*/     VOID*        MailslotOrPipeParameters;
/*0x050*/     UINT8        Override;
/*0x051*/     UINT8        QueryOnly;
/*0x052*/     UINT8        DeleteOnly;
/*0x053*/     UINT8        FullAttributes;
/*0x054*/     struct _DUMMY_FILE_OBJECT* LocalFileObject;
/*0x058*/     ULONG32      InternalFlags;
/*0x05C*/     struct _IO_DRIVER_CREATE_CONTEXT DriverCreateContext;      // 4 elements, 0x10 bytes (sizeof)
/*0x06C*/     UINT8        _PADDING1_[0x4];
          }OPEN_PACKET, *POPEN_PACKET;
2012-8-6 05:45
0
雪    币: 558
活跃值: (83)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
别折腾了,哪个结构未公开的,每个系统都不一样,还是老老实实的用ZwOpenFile获得的句柄,然后ObReferenceObjectByHandle获得内核对象,就好了

具体代码可以参考这个帖子:http://bbs.pediy.com/showthread.php?t=153786
2012-8-6 08:49
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
偶是来学习的,看一看
2012-8-6 09:34
0
雪    币: 279
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
太感谢 V大的 指点了 怎么说来 是无法通用了 伤心
2012-8-6 15:33
0
雪    币: 279
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
感谢 大大的 指点 可我不需要 获得 对象 其实 只需要获取 句柄 就可以了

具体 需求 看这里 http://bbs.pediy.com/showthread.php?t=154143

但是很可惜 没有 符合我要求的 答案

查询 WRK 获得 通过 ObOpenObjectByName 可以 根据 文件路径 获取 文件对象

来判断 是否已经存在 识别 打开 还是创建的 请求

当然 ZwOpenFile 直接就可以 获取 但是 调用 ZwOpenFile 需要预先 区分 文件夹 和文件

这又是 烦恼的 问题
2012-8-6 15:39
0
雪    币: 558
活跃值: (83)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我给你说,文件和文件夹,在成功打开之前是无法区分的,

另外,你不要被“查询 WRK 获得 通过 ObOpenObjectByName 可以 根据 文件路径 获取 文件对象”这句话中的“文件对象”给欺骗了,
其实它也可能是“文件夹对象”,总之想要准确的区分是文件还是文件夹,必须成功打开文件对象以后,根据返回值才可以确定。
2012-8-6 17:00
0
雪    币: 279
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
谢谢指点 是我没说明白

我不需要 区分 文件和 文件夹 ObOpenObjectByName  获取的是 对象 不管是文件 还是 文件夹 只

要存在 就能获取

一切存在的 都可以当作 NtCreateFile 当参数为   CreateDisposition==FILE_OPEN_IF || CreateDisposition==FILE_OVERWRITE_IF

就是 打开请求

至于 后面的 那是应为 当调用 ZwOpenFile 时 需要 提前  区分 文件和 文件夹 来使用不同的参数

这样说 看的明白了吧

最后 感谢 你的回复
2012-8-6 17:42
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
12
纵观全帖子,完全不知楼主在说啥~~
2012-8-6 17:52
0
游客
登录 | 注册 方可回帖
返回
//