ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
20楼#
发布于:2002-11-21 09:14
好象不太好。
例子的关键思想是:一旦我们发现某个服务函数执行失败,我们仅仅执行一个return status语句。return status语句触发了终止处理程序的执行,这个处理程序消除了所有累积的副作用。
生命驱动,活力无限!
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
21楼#
发布于:2002-11-21 09:24
好象不太好。
例子的关键思想是:一旦我们发现某个服务函数执行失败,我们仅仅执行一个return status语句。return status语句触发了终止处理程序的执行,这个处理程序消除了所有累积的副作用。


但是在我的程序里面函数并没有修改或返回status值呀!对此应怎样处理?
知之为知之,不知为不知 有错则改之
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
22楼#
发布于:2002-11-21 09:25
[quote]这个例子的处理比较好:
NTSTATUS AddDevice(...)
{
  NTSTATUS status = STATUS_UNSUCCESSFUL;
  PDEVICE_OBJECT fdo;
  PDEVICE_EXTENSION pdx;
  status = IoCreateDevice(..., &fdo);
  if (!NT_SUCCESS(status))
    return status;
  __try
  {
    pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
    ...
    pdx->DeviceDescriptor = (PUSB_DEVICE_DESCRIPTOR)
      ExAllocatePool(NonPagedPool, sizeof(USB_DEVICE_DESCRIPTOR));
    if (!pdx->DeviceDescriptor)
      return STATUS_INSUFFICIENT_RESOURCES;
    IoInitializeRemoveLock(&pdx->RemoveLock, ...);
    status = IoRegisterDeviceInterface(..., &pdx->ifname);
    if (!NT_SUCCESS(status))
      return status;
    ...
  }
  __finally
  {
    if (!NT_SUCCESS(status))
    {
      ...
      if (pdx->ifname.Buffer)
        RtlFreeUnicodeString(&pdx->ifname);
      if (pdx->DeviceDescriptor)
        ExFreePool((PVOID) pdx->DeviceDescriptor);
      IoDeleteDevice(fdo);
    }
  }
  return status;
}
 

 


sorry!还要再请教,不知我这样改行不行?

.....
NTSTATUS status=STATUS_UNSUCCESSFUL;
  
.....
    
__try
{
 my_Data=(PCHAR)ExAllocatePool  (NonPagedPool,iTotal);
 if(!my_Data)
   return STATUS_INSUFFICIENT_RESOURCES;
   copyPacketData(pPacket, my_Data, iTotal);
   pEthHdr=( PEthHead )my_Data;
   pIpHdr= ( PIpHead )( my_Data + sizeof( EthHead ) );
}
__finally
{
if(my_Data)
ExFreePool((PVOID)my_Data);
}
return pIpHdr->destIPAddress;
 [/quote]

这样不好,__finally子句的作用是不管上面的程序(__try子句)执行是否导致异常,它都会被执行。一般用来执行一些清理的工作,如释放内存等。而__excpet子句是异常处理的Handler,有了它,你才能接管异常,例如,你可以在__except子句中向调试器输出一些字符串以帮助你判断程序出了什么错误(dbgprint)。所以,__except语句是用来帮助调试、捕捉程序错误的,没有它,有了__finally的意义也不大,除非你可以肯定上面的__try子句不会导致任何异常。
Tom_lyd
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
23楼#
发布于:2002-11-21 09:36
如果你不放在ADDDEVICE,对你的结构,确实可用
__try
{
}
__except //(EXCEPTION_EXECUTE_HANDLER)
{
//  KdPrint((\"Exception was caught\\n\"));
}

生命驱动,活力无限!
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
24楼#
发布于:2002-11-21 09:47
如果你不放在ADDDEVICE,对你的结构,确实可用
__try
{
}
__except //(EXCEPTION_EXECUTE_HANDLER)
{
//  KdPrint((\"Exception was caught\\n\"));
}

 


sorry!刚才出现死机。
好的,我已大概明白其中的道现,我再将程序加上__except,你看这样行吗?
我是刚刚接触NDIS,还请你不要见笑为好。
///////////////////////////////////////
.....
NTSTATUS status=STATUS_UNSUCCESSFUL;

.....

__try
{
my_Data=(PCHAR)ExAllocatePool (NonPagedPool,iTotal);
if(!my_Data)
return STATUS_INSUFFICIENT_RESOURCES;
copyPacketData(pPacket, my_Data, iTotal);
pEthHdr=( PEthHead )my_Data;
pIpHdr= ( PIpHead )( my_Data + sizeof( EthHead ) );
}

__except
{
  DbgPrint(\"出现错误!!\");
}
__finally
{
if(my_Data)
ExFreePool((PVOID)my_Data);
}
return pIpHdr->destIPAddress;



[编辑 -  11/21/02 by  freeshar]
知之为知之,不知为不知 有错则改之
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
25楼#
发布于:2002-11-21 10:10
[quote]如果你不放在ADDDEVICE,对你的结构,确实可用
__try
{
}
__except //(EXCEPTION_EXECUTE_HANDLER)
{
//  KdPrint((\"Exception was caught\\n\"));
}

 


sorry!刚才出现死机。
好的,我已大概明白其中的道现,我再将程序加上__except,你看这样行吗?
我是刚刚接触NDIS,还请你不要见笑为好。
///////////////////////////////////////
.....
NTSTATUS status=STATUS_UNSUCCESSFUL;

.....

__try
{
my_Data=(PCHAR)ExAllocatePool (NonPagedPool,iTotal);
if(!my_Data)
return STATUS_INSUFFICIENT_RESOURCES;
copyPacketData(pPacket, my_Data, iTotal);
pEthHdr=( PEthHead )my_Data;
pIpHdr= ( PIpHead )( my_Data + sizeof( EthHead ) );
}

__except
{
  DbgPrint(\"出现错误!!\");
}
__finally
{
if(my_Data)
ExFreePool((PVOID)my_Data);
}
return pIpHdr->destIPAddress;



[编辑 -  11/21/02 by  freeshar] [/quote]
加了这一句,怎么编译不通过?
__except
{
DbgPrint(\"出现错误!!\");
}
知之为知之,不知为不知 有错则改之
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
26楼#
发布于:2002-11-21 10:21
[///////////////////////////////////////
.....
NTSTATUS status=STATUS_UNSUCCESSFUL;

.....

__try
{
my_Data=(PCHAR)ExAllocatePool (NonPagedPool,iTotal);
if(!my_Data)
return STATUS_INSUFFICIENT_RESOURCES;
copyPacketData(pPacket, my_Data, iTotal);
pEthHdr=( PEthHead )my_Data;
pIpHdr= ( PIpHead )( my_Data + sizeof( EthHead ) );
}

__except
{
  if(my_Data)
  ExFreePool((PVOID)my_Data);
 DbgPrint(\"出现错误!!\");

}

return pIpHdr->destIPAddress;



生命驱动,活力无限!
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
27楼#
发布于:2002-11-21 10:31
可以,最好加上错误的处理语句,例如返回,否则,程序会执行后面的语句。
关于__try,__except,__finally的用法,你还可以参阅MSDN中的相关主题。
Tom_lyd
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
28楼#
发布于:2002-11-21 10:47
可以,最好加上错误的处理语句,例如返回,否则,程序会执行后面的语句。
关于__try,__except,__finally的用法,你还可以参阅MSDN中的相关主题。

还是编译不通过?

__except{
if(my_Data)
ExFreePool((PVOID)my_Data);
DbgPrint(\"出现错误!!\");
return 0;
}
也一样...
why??
知之为知之,不知为不知 有错则改之
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
29楼#
发布于:2002-11-21 10:53
提示啥错误!
生命驱动,活力无限!
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
30楼#
发布于:2002-11-21 10:54
如果是这样就可以编译通过:
__except (ExFreePool((PVOID)my_Data),1)
{
if(my_Data)
ExFreePool((PVOID)my_Data);
DbgPrint(\"出现错误!!\");
return 0;

}



[编辑 -  11/21/02 by  freeshar]
知之为知之,不知为不知 有错则改之
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
31楼#
发布于:2002-11-21 10:58
你犯了个错误
一般是这样调用,参数的具体意义去看书。
__except (EXCEPTION_EXECUTE_HANDLER)

应该放分了!
生命驱动,活力无限!
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
32楼#
发布于:2002-11-21 11:01
提示啥错误!

提示共有三行错误,如下:

packet.c(41):error c2059:syntax error:\'{\'
对应程序的__except{

packet.c(57):error c2059:syntax error:\'return\'
对应 return pIpHdr->destIPAddress;

packet.c(60):error c2059:syntax error:\'}\'
则对就于: }
知之为知之,不知为不知 有错则改之
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
33楼#
发布于:2002-11-21 11:05
你犯了个错误
一般是这样调用,参数的具体意义去看书。
__except (EXCEPTION_EXECUTE_HANDLER)

应该放分了!
 

对呀,
有三个参数
EXCEPTION_CONTINUE_EXECUTION (
知之为知之,不知为不知 有错则改之
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
34楼#
发布于:2002-11-21 11:06
你犯了个错误
一般是这样调用,参数的具体意义去看书。
__except (EXCEPTION_EXECUTE_HANDLER)

应该放分了!
 

对呀,
有三个参数
EXCEPTION_CONTINUE_EXECUTION (
知之为知之,不知为不知 有错则改之
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
35楼#
发布于:2002-11-21 11:17
__except //在这儿用上面的三个参数之一代替(ExFreePool((PVOID)
my_Data),1)

////////
__except(EXCEPTION_EXECUTE_HANDLER)
{
if(my_Data)
ExFreePool((PVOID)my_Data);
DbgPrint(\"出现错误!!\");
return 0;

}



生命驱动,活力无限!
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
36楼#
发布于:2002-11-21 16:21
__except //在这儿用上面的三个参数之一代替(ExFreePool((PVOID)
my_Data),1)

////////
__except(EXCEPTION_EXECUTE_HANDLER)
{
if(my_Data)
ExFreePool((PVOID)my_Data);
DbgPrint(\"出现错误!!\");
return 0;

}




为什么??????????????????????????????????
__except(EXCEPTION_EXECUTE_HANDLER)
{
if(my_Data)
ExFreePool((PVOID)my_Data);
DbgPrint(\"出现错误!!\");
return 0;
}
不能和
__finally
{
if(my_Data)
  ExFreePool((PVOID)my_Data);
}
一起用,也就是说如果用了__except{}就不能用__finally{}
去掉其中一个编译才能通过!!怪了,怪了!
如果不能用__finally{}那可不是不能释放资料了吗?


[编辑 -  11/21/02 by  freeshar]
知之为知之,不知为不知 有错则改之
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
37楼#
发布于:2002-11-21 16:33
咋不能呢
你在TRY{]里面都可以。
或者你觉得该释放的任何地方。
但EXCEPT{}里一定要释放刚分配的。
生命驱动,活力无限!
paoyipao
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2003-06-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
38楼#
发布于:2002-11-21 16:46
咋不能呢
你在TRY{]里面都可以。
或者你觉得该释放的任何地方。
但EXCEPT{}里一定要释放刚分配的。


确实编译出错,提示为:
packet(51):error c2143:syntax error:missing \';\' before \'__finally\'
另外还有两行。
知之为知之,不知为不知 有错则改之
ydyuse
驱动老牛
驱动老牛
  • 注册日期2002-07-25
  • 最后登录2005-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
39楼#
发布于:2002-11-21 17:27
[quote]咋不能呢
你在TRY{]里面都可以。
或者你觉得该释放的任何地方。
但EXCEPT{}里一定要释放刚分配的。


确实编译出错,提示为:
packet(51):error c2143:syntax error:missing \';\' before \'__finally\'
另外还有两行。 [/quote]

我没说清楚。是不能用__finally。我以为你自己回答了。
上面是对你第二个问题的回答。
生命驱动,活力无限!
游客

返回顶部