cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
阅读:4286回复:18

如何从符号连接名称得到设备名称呢?

楼主#
更多 发布于:2005-05-11 18:41
如题!
谢谢!
走走看看开源好 Solaris vs Linux
qiangguo64
驱动牛犊
驱动牛犊
  • 注册日期2005-01-12
  • 最后登录2009-08-28
  • 粉丝0
  • 关注0
  • 积分144分
  • 威望15点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-05-12 15:19
ObReferenceObjectByName
zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-05-12 15:47
如题!
谢谢!

你用ZwCreateFile()打开,然后ObReferenceObjectByHandle()就可以了,ObReferenceObjectByHandle函数里面的参数就是ZwCreateFile的返回值。注意的是:ZwCreateFile的传入参数是符号连接。
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-05-12 15:59
ZwOpenSymbolicLinkObject
然后
ZwQuerySymbolicLinkObject
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
地下室#
发布于:2005-05-12 16:15
各位高手,我得目的是:如果我知道以设备的符号连接名称,如何得到他的设备名称呢?是名称啊?谢谢各位了。

不知道几位给的答案是否能够实现那,能具体说说吗?
走走看看开源好 Solaris vs Linux
qiangguo64
驱动牛犊
驱动牛犊
  • 注册日期2005-01-12
  • 最后登录2009-08-28
  • 粉丝0
  • 关注0
  • 积分144分
  • 威望15点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-05-12 16:30
ObReferenceObjectByName获得device_object的对象指针,该指针值减0x18是OBJECT_HEADER的指针,OBJECT_HEADER对象中的NameOffset是OBJECT_NAME偏移,用objectheader的指针减去这个偏移,就是OBJECT_NAME的指针,里面就是对象名字

typedef struct _OBJECT_HEADER
        {
/*000*/ ULONG        PointerCount;       // number of references
/*004*/ ULONG        HandleCount;        // number of open handles
/*008*/ POBJECT_TYPE ObjectType;
/*00C*/ BYTE         NameOffset;         // -> OBJECT_NAME
/*00D*/ BYTE         HandleDBOffset;     // -> OBJECT_HANDLE_DB
/*00E*/ BYTE         QuotaChargesOffset; // -> OBJECT_QUOTA_CHARGES
/*00F*/ BYTE         ObjectFlags;        // OB_FLAG_*
/*010*/ union
            { // OB_FLAG_CREATE_INFO ? ObjectCreateInfo : QuotaBlock
/*010*/     PQUOTA_BLOCK        QuotaBlock;
/*010*/     POBJECT_CREATE_INFO ObjectCreateInfo;
/*014*/     };
/*014*/ PSECURITY_DESCRIPTOR SecurityDescriptor;
/*018*/ }OBJECT_HEADER,*POBJECT_HEADER,**PPOBJECT_HEADER;

typedef struct _OBJECT_NAME
{
POBJECT_DIRECTORY Directory; /*000*/
UNICODE_STRING    Name; /*004*/
ULONG             Reserved; /*00C*/
}OBJECT_NAME,*POBJECT_NAME,**PPOBJECT_NAME;

bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-05-12 16:43
ObReferenceObjectByName获得device_object的对象指针,该指针值减0x18是OBJECT_HEADER的指针,OBJECT_HEADER对象中的NameOffset是OBJECT_NAME偏移,用objectheader的指针减去这个偏移,就是OBJECT_NAME的指针,里面就是对象名字

typedef struct _OBJECT_HEADER
        {
/*000*/ ULONG        PointerCount;       // number of references
/*004*/ ULONG        HandleCount;        // number of open handles
/*008*/ POBJECT_TYPE ObjectType;
/*00C*/ BYTE         NameOffset;         // -> OBJECT_NAME
/*00D*/ BYTE         HandleDBOffset;     // -> OBJECT_HANDLE_DB
/*00E*/ BYTE         QuotaChargesOffset; // -> OBJECT_QUOTA_CHARGES
/*00F*/ BYTE         ObjectFlags;        // OB_FLAG_*
/*010*/ union
            { // OB_FLAG_CREATE_INFO ? ObjectCreateInfo : QuotaBlock
/*010*/     PQUOTA_BLOCK        QuotaBlock;
/*010*/     POBJECT_CREATE_INFO ObjectCreateInfo;
/*014*/     };
/*014*/ PSECURITY_DESCRIPTOR SecurityDescriptor;
/*018*/ }OBJECT_HEADER,*POBJECT_HEADER,**PPOBJECT_HEADER;

typedef struct _OBJECT_NAME
{
POBJECT_DIRECTORY Directory; /*000*/
UNICODE_STRING    Name; /*004*/
ULONG             Reserved; /*00C*/
}OBJECT_NAME,*POBJECT_NAME,**PPOBJECT_NAME;

 

这个有OS版本依赖,耐心下来,看看大家说的函数对应的DDK文档
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
7楼#
发布于:2005-05-12 19:01
NTSTATUS
ObReferenceObjectByName (
IN PUNICODE_STRING ObjectName,
IN ULONG Attributes,
IN PACCESS_STATE AccessState OPTIONAL,
IN ACCESS_MASK DesiredAccess OPTIONAL,
IN POBJECT_TYPE ObjectType,
IN KPROCESSOR_MODE AccessMode,
IN OUT PVOID ParseContext OPTIONAL,
OUT PVOID *Object
)
ObjectName是符号连接名称吗?

[编辑 -  5/12/05 by  cyliu]
走走看看开源好 Solaris vs Linux
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-05-13 08:59
NTSTATUS
ObReferenceObjectByName (
IN PUNICODE_STRING ObjectName,
IN ULONG Attributes,
IN PACCESS_STATE AccessState OPTIONAL,
IN ACCESS_MASK DesiredAccess OPTIONAL,
IN POBJECT_TYPE ObjectType,
IN KPROCESSOR_MODE AccessMode,
IN OUT PVOID ParseContext OPTIONAL,
OUT PVOID *Object
)
ObjectName是符号连接名称吗?

[编辑 -  5/12/05 by  cyliu]

符号连接也是对象呀
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
9楼#
发布于:2005-05-13 09:30
也许我没有说明白我的目的.

我目的是:知道了符号连接名称如何知道他的设备名称.

ObReferenceObjectByName中传入符号连接名得到符号连接对象,还是无发得到他的设备名称啊?
走走看看开源好 Solaris vs Linux
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-05-13 09:40
也许我没有说明白我的目的.

我目的是:知道了符号连接名称如何知道他的设备名称.

ObReferenceObjectByName中传入符号连接名得到符号连接对象,还是无发得到他的设备名称啊?

那你试试我说的呀 :D
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
11楼#
发布于:2005-05-17 15:11
NTSTATUS status = STATUS_SUCCESS;

UNICODE_STRING LinkName;
RtlInitUnicodeString(&LinkName, L\"\\\\\");
ObpRootDirectoryObject = 0;

if(ObReferenceObjectByName(&LinkName,OBJ_CASE_INSENSITIVE,NULL,0,NULL,KernelMode,NULL,(PVOID*)&ObpRootDirectoryObject)==STATUS_SUCCESS)
{
DumpObject((PVOID)ObpRootDirectoryObject);
}

return status;

走到黑体部分就蓝屏,why,难道我使用的不对吗?  

[编辑 -  5/17/05 by  cyliu]
走走看看开源好 Solaris vs Linux
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
12楼#
发布于:2005-05-17 16:52
上面问题解决了.

bmyyyud:
  我通过ObReferenceObjectByName得到对象,然后分析对象头得到的是名字是ObReferenceObjectByName中传入的名字.而不是设备对象名字啊.

如:
#define DEVICE_NAME L\"\\\\Device\\\\ObjName\"
#define DOS_DEVICE_NAME L\"\\\\DosDevices\\\\cyliu\"


ObReferenceObjectByName中传入DOS_DEVICE_NAME名字,得到的是cyliu名字.而我想通过DOS_DEVICE_NAME得到\"ObjName\"这个字符串啊,应该怎么办?
走走看看开源好 Solaris vs Linux
qiangguo64
驱动牛犊
驱动牛犊
  • 注册日期2005-01-12
  • 最后登录2009-08-28
  • 粉丝0
  • 关注0
  • 积分144分
  • 威望15点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-05-17 17:24
上面问题解决了.

bmyyyud:
  我通过ObReferenceObjectByName得到对象,然后分析对象头得到的是名字是ObReferenceObjectByName中传入的名字.而不是设备对象名字啊.

如:
#define DEVICE_NAME L\"\\\\Device\\\\ObjName\"
#define DOS_DEVICE_NAME L\"\\\\DosDevices\\\\cyliu\"


ObReferenceObjectByName中传入DOS_DEVICE_NAME名字,得到的是cyliu名字.而我想通过DOS_DEVICE_NAME得到\"ObjName\"这个字符串啊,应该怎么办?
 


如果要根据DOS_DEVICE_NAME  L\"\\\\DosDevices\\\\cyliu\"
得到 DEVICE_NAME L\"\\\\Device\\\\ObjName\"
我觉得可以这样,现在USER层用CreateFile打开L\"\\\\DosDevices\\\\cyliu\",然后把HANDLE传到KERNEL层,然后用
ObReferenceObjectByHandle得到对象,这个对象应该就是L\"\\\\DosDevices\\\\cyliu\"对象,然后解析对象头,就能得到对象的名字

这个对象头的结构根据我使用的情况,在2K,XP和2003 server下都没有问题(大部分的偏移,有一些没有用到
qiangguo64
驱动牛犊
驱动牛犊
  • 注册日期2005-01-12
  • 最后登录2009-08-28
  • 粉丝0
  • 关注0
  • 积分144分
  • 威望15点
  • 贡献值1点
  • 好评度14点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-05-17 17:27
补上贴

这个函数应该能替换上贴中的第一步 NTSTATUS
  ObQueryNameString(
    IN PVOID  Object,
    OUT POBJECT_NAME_INFORMATION  ObjectNameInfo,
    IN ULONG  Length,
    OUT PULONG  ReturnLength
    );


传入DOS_DEVICE_NAME 获得的对象指针,然后解析对象名字
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
15楼#
发布于:2005-05-17 18:12
可惜得到的仍然是DOS_DEVICE_NAME名字
走走看看开源好 Solaris vs Linux
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
16楼#
发布于:2005-05-17 18:26
如何在驱动层通过符号连接得到物理设备名称呢?

如:通过\"\\\\?\\\\c:\"得到\"\\Device\\HarddiskVolume1\"名字或者其他物理设备名称?
走走看看开源好 Solaris vs Linux
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
17楼#
发布于:2005-05-17 22:40
你试试bmyyyud说的
ZwOpenSymbolicLinkObject
然后
ZwQuerySymbolicLinkObject
我很早以前用过,记的是可以的
ZwOpenSymbolicLinkObject传symbolic name
ZwQuerySymbolicLinkObject返回的是TargetName,就是DeviceObject 的Name.这个方法应该是最简单的
li375268037
驱动牛犊
驱动牛犊
  • 注册日期2010-06-03
  • 最后登录2011-09-04
  • 粉丝0
  • 关注0
  • 积分24分
  • 威望231点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2010-10-15 21:32
请问版主是怎么在驱动层通过符号链接名得到真实设备名的~~~~~
游客

返回顶部