WINDOWS TDI驱动,寒江独钓中的问题

梦是多么的重要 2014-04-30 07:06:10

//VOID BuildQueryAddressIrp(PIRP irp,PIO_STACK_LOCATION stack,PDEVICE_OBJECT Tarodl)
//{
// FILE_FULL_EA_INFORMATION * filebuf = (FILE_FULL_EA_INFORMATION *)irp->AssociatedIrp.SystemBuffer;
// if (filebuf!=NULL)
// {
// if (filebuf->EaNameLength==TDI_TRANSPORT_ADDRESS_LENGTH && memcmp(filebuf->EaName,TdiTransportAddress,TDI_TRANSPORT_ADDRESS_LENGTH)==0)
// {
// QueryRequest=TdiBuildInternalDeviceControlIrp(TDI_QUERY_INFORMATION,Tarodl,stack->FileObject,NULL,NULL);
// }
// }
//
//}


寒江独钓 一书中,TDI过滤中有这么一个函数;本菜鸟 简化代码,实现一个简单功能,就获取 生成的地址,好,有一段生成一个IRP,成功编译后,发现启动失败。找原因。一个一个函数的注释,现在发现只要这个函数给注释掉了,就成功了。

另外:还有一个 代码 导致了 TDI过滤启动失败,代码段如下:


NTSTATUS DeviceControlDispath(PDEVICE_OBJECT Device ,PIRP irp)
{
NTSTATUS status;
PIO_STACK_LOCATION stack;
PDEVICE_OBJECT DeviceClass;
ULONG CurrentId;
int UserState;



HANDLE handl;
OBJECT_ATTRIBUTES objectatt;
CLIENT_ID currentid;
PEPROCESS EProcess;
InitializeObjectAttributes(&objectatt,0,0,0,0);



stack=IoGetCurrentIrpStackLocation(irp);
DeviceClass=GetDeviceClass(Device);

if (DeviceClass==NULL)
{
return STATUS_INVALID_PARAMETER;
}
switch(stack->MajorFunction)
{
case IRP_MJ_CREATE:

CurrentId=(ULONG)PsGetCurrentProcessId();
/* if (DeviceClass!=NULL)
{
BuildQueryAddressIrp(irp,stack,DeviceClass);
}*/

if(buf!=NULL)
{
CurrentId=(ULONG)PsGetCurrentProcessId();
;currentid.UniqueProcess=(HANDLE)CurrentId;
currentid.UniqueThread=0;

status=ZwOpenProcess(&handl,PROCESS_ALL_ACCESS,&objectatt,¤tid);
if (!NT_SUCCESS(status))
{
KdPrint(("打开进程出错"));
return status;
}
status=ObReferenceObjectByHandle(handl,FILE_READ_DATA,0,KernelMode,&EProcess,0);
if (NT_SUCCESS(status))
{
/*UCHAR *name=PsGetProcessImageFileName(EProcess);*/
UCHAR *name=(UCHAR *)EProcess+0x174;
if (memcmp(name,buf,sizeof(name))==0)
{
status=STATUS_INVALID_PARAMETER;
IoCompleteRequest(irp,IO_NO_INCREMENT);
return status;
}
}
IoSkipCurrentIrpStackLocation(irp);
status=IoCallDriver(DeviceClass,IO_NO_INCREMENT);
return status;
}

SetCompleteDispath(irp,DeviceClass);
break;


/*UCHAR *name=PsGetProcessImageFileName(EProcess);*/ 注释掉的 这个函数,通过EPROCESS 获得进程名,但是这是一个未公开的函数,声明也可以用。在XP系统中也是存在的。 好,有这个 启动也失败,那我不用这个函数
我用: UCHAR *name=(UCHAR *)EProcess+0x174; // 在XP系统中 这个结构的 0x174位置一般是 进程的名字.那么也失败了.这是为什么呢?
什么原因导致的呢?
在线坐等检查。
...全文
210 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
问题解决,建议以后 编译驱动不要用 VS了,尽量用WDK吧。太坑爹了
  • 打赏
  • 举报
回复
引用 5 楼 kxltsuperr 的回复:
[quote=引用 2 楼 luoxuechengbing 的回复:] [quote=引用 1 楼 kxltsuperr 的回复:] 我还没看到这里。只看到了键盘过滤。
我裤子都脱了,你就告诉我这个。。。。[/quote]哈哈,实话实说。不过我一直用VC6.0编译,只要设置正确,都很正常。[/quote] VC6.0 或许可以,但是VS2010 很蛋疼;
  • 打赏
  • 举报
回复
引用 5 楼 kxltsuperr 的回复:
[quote=引用 2 楼 luoxuechengbing 的回复:] [quote=引用 1 楼 kxltsuperr 的回复:] 我还没看到这里。只看到了键盘过滤。
我裤子都脱了,你就告诉我这个。。。。[/quote]哈哈,实话实说。不过我一直用VC6.0编译,只要设置正确,都很正常。[/quote] 你继续看书,等到你某个时候,用到某些函数,你就知道了。。
小小爬虾 2014-05-01
  • 打赏
  • 举报
回复
引用 2 楼 luoxuechengbing 的回复:
[quote=引用 1 楼 kxltsuperr 的回复:] 我还没看到这里。只看到了键盘过滤。
我裤子都脱了,你就告诉我这个。。。。[/quote]哈哈,实话实说。不过我一直用VC6.0编译,只要设置正确,都很正常。
fly 100% 2014-05-01
  • 打赏
  • 举报
回复
居然是这样的结果
  • 打赏
  • 举报
回复
引用 1 楼 kxltsuperr 的回复:
我还没看到这里。只看到了键盘过滤。
我裤子都脱了,你就告诉我这个。。。。
小小爬虾 2014-04-30
  • 打赏
  • 举报
回复
我还没看到这里。只看到了键盘过滤。

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧