首页
社区
课程
招聘
[求助]驱动中如何调用RtlDosPathNameToNtPathName_U等ntdll的未公开函数
发表于: 2012-2-10 13:52 28427

[求助]驱动中如何调用RtlDosPathNameToNtPathName_U等ntdll的未公开函数

2012-2-10 13:52
28427
驱动中如何调用RtlDosPathNameToNtPathName_U等ntdll的未公开函数?

typedef struct _PRELATIVE_NAME{
	UNICODE_STRING Name;
	HANDLE CurrentDir;
} PRELATIVE_NAME, *PPRELATIVE_NAME;

typedef  NTSTATUS (*DOSPATH_TO_NTPATH)(
			     IN PCWSTR DosPathName,
			     OUT PUNICODE_STRING NtPathName,
			     OUT PWSTR* FilePathInNtPathName OPTIONAL,
			     OUT PRELATIVE_NAME* RelativeName OPTIONAL
			     );
DOSPATH_TO_NTPATH RtlDosPathNameToNtPathName_U;

	UNICODE_STRING ustrNtName = {0};
	WCHAR szDosName[MAX_PATH] = L"C:\\test\\hello.exe";

	if (RtlDosPathNameToNtPathName_U(szDosName,&ustrNtName,NULL,NULL))
	{
		KdPrint(("%s: [%s] RtlDosPathNameToNtPathName_U Success \n",__MYNAME__,__FUNCTION__));
	}
	else
	{
		KdPrint(("%s: [%s] RtlDosPathNameToNtPathName_U Failed \n",__MYNAME__,__FUNCTION__));
	}


直接蓝了

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
能编译就可以直接调用
蓝屏是因为你UNICODE_STRING的buffer成员没初始化,要先ExAllocatePoolWithTag一下
2012-2-10 15:12
0
雪    币: 12
活跃值: (767)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
	UNICODE_STRING ustrNtName = {0};
	WCHAR szNtNameBuf[260] = {0};
	WCHAR szDosName[MAX_PATH] = L"C:\\test\\hello.exe";
	RtlInitEmptyUnicodeString(&ustrNtName,szNtNameBuf,260 * sizeof(WCHAR));
	//ustrNtName = (UNICODE_STRING)ExAllocatePoolWithTag(PagedPool,MAX_PATH,'DTON');

	if (RtlDosPathNameToNtPathName_U(szDosName,&ustrNtName,NULL,NULL))
	{
		KdPrint(("%s: [%s] RtlDosPathNameToNtPathName_U Success \n",__MYNAME__,__FUNCTION__));
	}
	else
	{
		KdPrint(("%s: [%s] RtlDosPathNameToNtPathName_U Failed \n",__MYNAME__,__FUNCTION__));
	}


照样蓝屏
2012-2-10 15:42
0
雪    币: 114
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这个函数是ring3下的函数,内核中无这个函数
你定义个函数类型,声明个函数指针,当然编译可以通过,但是这个函数是个空指针,一调用自然蓝屏了.

自己写个函数就可以了,就是在前面加\??\嘛
2012-2-10 16:20
0
雪    币: 12
活跃值: (767)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
其实我想加的是\\Device\\HarddiskVolumeXXX
2012-2-10 16:50
0
雪    币: 135
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
为什么一定想用这个函数
2012-2-10 17:44
0
雪    币: 114
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
其实可以用 KeUserModeCallback 调用R3下的函数,具体怎么用搜索下都有,很简单的.
2012-2-10 18:00
0
雪    币: 12
活跃值: (767)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
那用哪个?
2012-2-10 20:42
0
雪    币: 121
活跃值: (121)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
首先:RtlInitEmptyUnicodeString初始化的UNICODE_STRING, 成员length为0.
#define RtlInitEmptyUnicodeString(_ucStr,_buf,_bufSize) \
     ((_ucStr)->Buffer = (_buf), \
      (_ucStr)->Length = 0, \
      (_ucStr)->MaximumLength = (USHORT)(_bufSize))

用下面的方法可以将:\??\C:得到你想要的\Device\HarddiskVolumeXXX
ZwOpenSymbolicLinkObject
ZwQuerySymbolicLinkObject
ZwClose
2012-3-21 16:20
0
雪    币: 256
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
个人认为能不能调用,需要调试下看看,存放地址的变量的值对不对。
2012-3-22 09:53
0
雪    币: 107
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
这两个 原因和解决方案都出来了
2012-3-22 10:19
0
游客
登录 | 注册 方可回帖
返回
//