[PORTCLS]
[reactos.git] / reactos / drivers / storage / classpnp / clntirp.c
1 /*++
2
3 Copyright (C) Microsoft Corporation, 1991 - 1999
4
5 Module Name:
6
7 clntirp.c
8
9 Abstract:
10
11 Client IRP queuing routines for CLASSPNP
12
13 Environment:
14
15 kernel mode only
16
17 Notes:
18
19
20 Revision History:
21
22 --*/
23
24 #include "classp.h"
25 #include "debug.h"
26
27
28 /*
29 * EnqueueDeferredClientIrp
30 *
31 * Note: we currently do not support Cancel for storage irps.
32 */
33 VOID EnqueueDeferredClientIrp(PCLASS_PRIVATE_FDO_DATA FdoData, PIRP Irp)
34 {
35 KIRQL oldIrql;
36
37 KeAcquireSpinLock(&FdoData->SpinLock, &oldIrql);
38 InsertTailList(&FdoData->DeferredClientIrpList, &Irp->Tail.Overlay.ListEntry);
39 KeReleaseSpinLock(&FdoData->SpinLock, oldIrql);
40 }
41
42
43 /*
44 * DequeueDeferredClientIrp
45 *
46 */
47 PIRP DequeueDeferredClientIrp(PCLASS_PRIVATE_FDO_DATA FdoData)
48 {
49 KIRQL oldIrql;
50 PLIST_ENTRY listEntry;
51 PIRP irp;
52
53 KeAcquireSpinLock(&FdoData->SpinLock, &oldIrql);
54 if (IsListEmpty(&FdoData->DeferredClientIrpList)){
55 listEntry = NULL;
56 }
57 else {
58 listEntry = RemoveHeadList(&FdoData->DeferredClientIrpList);
59 }
60 KeReleaseSpinLock(&FdoData->SpinLock, oldIrql);
61
62 if (listEntry == NULL) {
63 irp = NULL;
64 } else {
65 irp = CONTAINING_RECORD(listEntry, IRP, Tail.Overlay.ListEntry);
66 ASSERT(irp->Type == IO_TYPE_IRP);
67 InitializeListHead(&irp->Tail.Overlay.ListEntry);
68 }
69
70 return irp;
71 }
72
73
74