stoneyr
驱动牛犊
驱动牛犊
  • 注册日期2002-01-13
  • 最后登录2007-10-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1230回复:7

帮我看看这样一个问题

楼主#
更多 发布于:2002-09-30 17:48
#pragma PAGEDCODE

NTSTATUS DispatchPower(IN PDEVICE_OBJECT fdo, IN PIRP Irp)
{ // DispatchPower
PAGED_CODE();
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
。。。。。。
NTSTATUS status = IoAcquireRemoveLock(&pdx->RemoveLock, Irp);

IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
return status;
} // DispatchPower

以上的代码是从Walter Oney中向导自动生成的,取了其中一段。
他的代码中很多例程都用到了这两个函数,而且位置也差不多。我看其它的书,好象没象他这样用的。他这样用有什么目的?如果不这样做有什么后果吗?
stoneyr
驱动牛犊
驱动牛犊
  • 注册日期2002-01-13
  • 最后登录2007-10-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-09-30 17:49
我说的是IoAcquireRemoveLock和IoReleaseRemoveLock两个函数
wlrwx
驱动小牛
驱动小牛
  • 注册日期2002-04-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望11点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-10-01 00:18
省略号在IoAcquireRemoveLock前面还是后面?? :mad: :mad: :mad:
真正的浪子―――― 是掠过城市的微风,每个人都能感到他的清新,可没有人能留住...... 亦是划过天际的流星,所有人都能仰望他夺目的光芒,没有人能触及...... 风止于森林,流星损于黄土......非凡浪子归于他的最爱......
wlrwx
驱动小牛
驱动小牛
  • 注册日期2002-04-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望11点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-10-01 00:25
怎么我看到的是这个样子的???


 NTSTATUS status = IoAcquireRemoveLock(pdx->RemoveLock, Irp); <--1
  if (!NT_SUCCESS(status))
    return CompleteRequest(Irp, status);
  PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
  ULONG fcn = stack->MinorFunction;
  if (fcn == IRP_MN_SET_POWER || fcn == IRP_MN_QUERY_POWER)
  {
    PPOWCONTEXT ctx = (PPOWCONTEXT) ExAllocatePool(NonPagedPool, sizeof(POWCONTEXT)); <--2
    RtlZeroMemory(ctx, sizeof(POWCONTEXT));
    ctx->pdx = pdx;
    ctx->irp = Irp;
    status = HandlePowerEvent(ctx, NewIrp);
  }
  IoReleaseRemoveLock(pdx->RemoveLock, Irp);
  return status;
解释就是:


客户驱动程序提供了一个删除锁,它和GENERIC共同使用这个锁来防止提前删除设备对象。GENERIC中的实际代码要比我在这里给出的稍复杂一些,删除锁并不是必须的。所以实际代码在使用删除锁前先测试RemoveLock指针是否为NULL。此外还有一些不太重要的考虑,包括错误检测。
对于设置和查询操作,我们先为上下文结构分配一块非分页内存并初始化。state变量初始化为InitialState,其数值上等于0。
真正的浪子―――― 是掠过城市的微风,每个人都能感到他的清新,可没有人能留住...... 亦是划过天际的流星,所有人都能仰望他夺目的光芒,没有人能触及...... 风止于森林,流星损于黄土......非凡浪子归于他的最爱......
stoneyr
驱动牛犊
驱动牛犊
  • 注册日期2002-01-13
  • 最后登录2007-10-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-10-01 15:11
 
客户驱动程序提供了一个删除锁,它和GENERIC共同使用这个锁来防止提前删除设备对象。


在这里有谁会提前删除这个设备对象?
guardee
驱动巨牛
驱动巨牛
  • 注册日期2002-11-08
  • 最后登录2010-05-29
  • 粉丝2
  • 关注1
  • 积分2分
  • 威望34点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-10-01 17:25
呵呵!这个是为了保护一些资源啊!
如果资源是全局的,并且是随便由谁都可以修改的时候就需要进行保护啊!只有获得了这个锁才能访问不然就等着,等到获得这个自旋锁
wlrwx
驱动小牛
驱动小牛
  • 注册日期2002-04-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望11点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-10-01 22:16
[quote] 客户驱动程序提供了一个删除锁,它和GENERIC共同使用这个锁来防止提前删除设备对象。


在这里有谁会提前删除这个设备对象? [/quote]


M$并不知道你不会删除这个设备,但是M$所要面对的情况是千差万别的。。。所以需要这个 :mad: :mad: :mad:
真正的浪子―――― 是掠过城市的微风,每个人都能感到他的清新,可没有人能留住...... 亦是划过天际的流星,所有人都能仰望他夺目的光芒,没有人能触及...... 风止于森林,流星损于黄土......非凡浪子归于他的最爱......
stoneyr
驱动牛犊
驱动牛犊
  • 注册日期2002-01-13
  • 最后登录2007-10-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-10-02 21:20
IoAcquireRemoveLock increments the count for a remove lock, indicating that the associated device object should not be detached from the device stack nor deleted.

这是我从ddk document中找到对IoAcquireRemoveLock的解释,它防止的是这个device object从栈中退出或删除。而这个device object就是调用这个函数的驱动程序所对应的device object。它对这个Irp有什么影响呢?
  
游客

返回顶部