首页
社区
课程
招聘
[求助]NT下 port 读写的问题
发表于: 2011-3-15 22:01 3744

[求助]NT下 port 读写的问题

2011-3-15 22:01
3744
新人一枚,刚接触驱动方面。很菜。。。。。还请各位前辈多多指点。

之前冒昧的提问,还请大家原谅。。。。。

Another possible alternative is to modify the I/O permission bitmap to allow a particular task, access to certain I/O ports.

这段话是摘自 PortTalk 的网站上的, 不知道他这里的更改I/O permission bitmap 指的是不是用

Ke386SetIoAccessMap 一类的API,是微软没有正式公布的?

这个是不是只能用在32位的操作系统下, 根据网上的描述,修改I/O permission bitmap 之后,可以在 USER Mode 下 进行 PORT 的读写貌似

网上现有的资源,如portTalk,winIO 的 源码里面都用了这个,可是这两个本身不是KMD吗?既然已经是Ring0 级驱动了,为什么还要修改I/O permission bitmap呢? 直接用_inp, _outp,然后把读取的数据传回User APP不就可以了吗?

我正在做的是64位系统下的驱动,参考了一些例子,已经可以读写一些port了,
其中的一段代码 用于Creatdrvice的

pDevObj->Flags |= DO_BUFFERED_IO;
	
	// Record driver Info in the expander Firmware

	pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
	pDevExt->pDevice = pDevObj;
	
	// Write the device name into expander Firmware
	pDevExt->ustrDeviceName.MaximumLength = BUFFER_SIZE;
	pDevExt->ustrDeviceName.Buffer = (PWSTR)ExAllocatePool(PagedPool, BUFFER_SIZE);
	RtlCopyUnicodeString(&pDevExt->ustrDeviceName, &uDevName);
	
	// Creat SymbolLink
	RtlInitUnicodeString(&uSymLinkName, SYMLINKNAME);
	IoCreateSymbolicLink(&uSymLinkName, &uDevName);
	if (!NT_SUCCESS(status))
	{
		// Delete Device
		IoDeleteDevice(pDevObj);
		return status;
	}

	// Write the symbol link into expander Firmware
	pDevExt->ustrSymLinkName.MaximumLength = BUFFER_SIZE;
	pDevExt->ustrSymLinkName.Buffer = (PWSTR)ExAllocatePool(PagedPool, BUFFER_SIZE);
	RtlCopyUnicodeString(&pDevExt->ustrSymLinkName, &uSymLinkName);
	return STATUS_SUCCESS;


这段还是不大清楚具体作用,  其中很多都是不需要的觉得

修改成后面这样也完全可以的。。

RtlInitUnicodeString(&uDevName, DEVNAME);
//
//	// Creat Device
//
//	status = IoCreateDevice(pDriverObjcet,0,&uDevName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDevObj);
//
//	if (!NT_SUCCESS(status))
//	{
//		return status;
//	}
//
//	// Initialize the Memory R/W
//	
//	pDevObj->Flags |= DO_BUFFERED_IO;
//
//	
//	// Creat SymbolLink
//	RtlInitUnicodeString(&uSymLinkName, SYMLINKNAME);
//	IoCreateSymbolicLink(&uSymLinkName, &uDevName);
//	if (!NT_SUCCESS(status))
//	{
//		// Delete Device
//		IoDeleteDevice(pDevObj);
//		return status;
//	}


像上面的写法 有什么原因吗?

纯粹新手一个,还望各位前辈多多指点

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

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 102
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己UP一下。。。。
2011-3-16 20:27
0
游客
登录 | 注册 方可回帖
返回
//