阅读:4628回复:18
如何从符号连接名称得到设备名称呢?
如题!
谢谢! |
|
|
沙发#
发布于:2005-05-12 15:19
ObReferenceObjectByName
|
|
板凳#
发布于:2005-05-12 15:47
如题! 你用ZwCreateFile()打开,然后ObReferenceObjectByHandle()就可以了,ObReferenceObjectByHandle函数里面的参数就是ZwCreateFile的返回值。注意的是:ZwCreateFile的传入参数是符号连接。 |
|
地板#
发布于:2005-05-12 15:59
ZwOpenSymbolicLinkObject
然后 ZwQuerySymbolicLinkObject |
|
|
地下室#
发布于:2005-05-12 16:15
各位高手,我得目的是:如果我知道以设备的符号连接名称,如何得到他的设备名称呢?是名称啊?谢谢各位了。
不知道几位给的答案是否能够实现那,能具体说说吗? |
|
|
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; |
|
6楼#
发布于:2005-05-12 16:43
ObReferenceObjectByName获得device_object的对象指针,该指针值减0x18是OBJECT_HEADER的指针,OBJECT_HEADER对象中的NameOffset是OBJECT_NAME偏移,用objectheader的指针减去这个偏移,就是OBJECT_NAME的指针,里面就是对象名字 这个有OS版本依赖,耐心下来,看看大家说的函数对应的DDK文档 |
|
|
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] |
|
|
8楼#
发布于:2005-05-13 08:59
NTSTATUS 符号连接也是对象呀 |
|
|
9楼#
发布于:2005-05-13 09:30
也许我没有说明白我的目的.
我目的是:知道了符号连接名称如何知道他的设备名称. ObReferenceObjectByName中传入符号连接名得到符号连接对象,还是无发得到他的设备名称啊? |
|
|
10楼#
发布于:2005-05-13 09:40
也许我没有说明白我的目的. 那你试试我说的呀 :D |
|
|
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] |
|
|
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\"这个字符串啊,应该怎么办? |
|
|
13楼#
发布于:2005-05-17 17:24
上面问题解决了. 如果要根据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下都没有问题(大部分的偏移,有一些没有用到 |
|
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 获得的对象指针,然后解析对象名字 |
|
15楼#
发布于:2005-05-17 18:12
可惜得到的仍然是DOS_DEVICE_NAME名字
|
|
|
16楼#
发布于:2005-05-17 18:26
如何在驱动层通过符号连接得到物理设备名称呢?
如:通过\"\\\\?\\\\c:\"得到\"\\Device\\HarddiskVolume1\"名字或者其他物理设备名称? |
|
|
17楼#
发布于:2005-05-17 22:40
你试试bmyyyud说的
ZwOpenSymbolicLinkObject 然后 ZwQuerySymbolicLinkObject 我很早以前用过,记的是可以的 ZwOpenSymbolicLinkObject传symbolic name ZwQuerySymbolicLinkObject返回的是TargetName,就是DeviceObject 的Name.这个方法应该是最简单的 |
|
18楼#
发布于:2010-10-15 21:32
请问版主是怎么在驱动层通过符号链接名得到真实设备名的~~~~~
|
|