阅读:1230回复:7
帮我看看这样一个问题
#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中向导自动生成的,取了其中一段。 他的代码中很多例程都用到了这两个函数,而且位置也差不多。我看其它的书,好象没象他这样用的。他这样用有什么目的?如果不这样做有什么后果吗? |
|
沙发#
发布于:2002-09-30 17:49
我说的是IoAcquireRemoveLock和IoReleaseRemoveLock两个函数
|
|
板凳#
发布于:2002-10-01 00:18
省略号在IoAcquireRemoveLock前面还是后面?? :mad: :mad: :mad:
|
|
|
地板#
发布于: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。 |
|
|
地下室#
发布于:2002-10-01 15:11
客户驱动程序提供了一个删除锁,它和GENERIC共同使用这个锁来防止提前删除设备对象。 在这里有谁会提前删除这个设备对象? |
|
5楼#
发布于:2002-10-01 17:25
呵呵!这个是为了保护一些资源啊!
如果资源是全局的,并且是随便由谁都可以修改的时候就需要进行保护啊!只有获得了这个锁才能访问不然就等着,等到获得这个自旋锁 |
|
6楼#
发布于:2002-10-01 22:16
[quote] 客户驱动程序提供了一个删除锁,它和GENERIC共同使用这个锁来防止提前删除设备对象。 在这里有谁会提前删除这个设备对象? [/quote] M$并不知道你不会删除这个设备,但是M$所要面对的情况是千差万别的。。。所以需要这个 :mad: :mad: :mad: |
|
|
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有什么影响呢? |
|