ReactOS 0.4.15-dev-7924-g5949c20
pnp.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYRIGHT.TXT
3 * PROJECT: Ext2 File System Driver for WinNT/2K/XP
4 * FILE: pnp.c
5 * PROGRAMMER: Matt Wu <mattwu@163.com>
6 * HOMEPAGE: http://www.ext2fsd.com
7 * UPDATE HISTORY:
8 */
9
10#if (_WIN32_WINNT >= 0x0500)
11
12/* INCLUDES *****************************************************************/
13
14#include "ext2fs.h"
15
16/* GLOBALS ***************************************************************/
17
19
20/* DEFINITIONS *************************************************************/
21
22#ifdef __REACTOS__
24#else
26#endif
27Ext2PnpCompletionRoutine (
29 IN PIRP Irp,
30 IN PVOID Contxt );
31
32
33#ifdef ALLOC_PRAGMA
34#pragma alloc_text(PAGE, Ext2Pnp)
35#pragma alloc_text(PAGE, Ext2PnpQueryRemove)
36#pragma alloc_text(PAGE, Ext2PnpRemove)
37#pragma alloc_text(PAGE, Ext2PnpCancelRemove)
38#pragma alloc_text(PAGE, Ext2PnpSurpriseRemove)
39#endif
40
41
42/* FUNCTIONS *************************************************************/
43
44
45#ifdef __REACTOS__
47#else
49#endif
50Ext2PnpCompletionRoutine (
52 IN PIRP Irp,
53 IN PVOID Contxt
54)
55{
56 PKEVENT Event = (PKEVENT) Contxt;
57
58 KeSetEvent( Event, 0, FALSE );
59
61
63 UNREFERENCED_PARAMETER( Contxt );
64}
65
66
68Ext2Pnp (IN PEXT2_IRP_CONTEXT IrpContext)
69{
71
72 PIRP Irp;
76
77 _SEH2_TRY {
78
79 ASSERT(IrpContext);
80
81 ASSERT((IrpContext->Identifier.Type == EXT2ICX) &&
82 (IrpContext->Identifier.Size == sizeof(EXT2_IRP_CONTEXT)));
83
84 DeviceObject = IrpContext->DeviceObject;
85
86 Vcb = (PEXT2_VCB) DeviceObject->DeviceExtension;
87
88 ASSERT(Vcb != NULL);
89
90 if ( !((Vcb->Identifier.Type == EXT2VCB) &&
91 (Vcb->Identifier.Size == sizeof(EXT2_VCB)))) {
92 _SEH2_LEAVE; // Status = STATUS_INVALID_PARAMETER
93 }
94
95 Irp = IrpContext->Irp;
97
98 SetFlag(IrpContext->Flags, IRP_CONTEXT_FLAG_WAIT);
99
100 switch ( IrpSp->MinorFunction ) {
101
103
104 DEBUG(DL_PNP, ("Ext2Pnp: Ext2PnpQueryRemove...\n"));
105 Status = Ext2PnpQueryRemove(IrpContext, Vcb);
106
107 break;
108
110
111 DEBUG(DL_PNP, ("Ext2Pnp: Ext2PnpRemove...\n"));
112 Status = Ext2PnpRemove(IrpContext, Vcb);
113 break;
114
116
117 DEBUG(DL_PNP, ("Ext2Pnp: Ext2PnpCancelRemove...\n"));
118 Status = Ext2PnpCancelRemove(IrpContext, Vcb);
119 break;
120
122
123 DEBUG(DL_PNP, ("Ext2Pnp: Ext2PnpSupriseRemove...\n"));
124 Status = Ext2PnpSurpriseRemove(IrpContext, Vcb);
125 break;
126
127 default:
128 break;
129 }
130
131 } _SEH2_FINALLY {
132
133 if (!IrpContext->ExceptionInProgress) {
134 Irp = IrpContext->Irp;
135
136 if (Irp) {
137
138 //
139 // Here we need pass the IRP to the disk driver.
140 //
141
143
144 Status = IoCallDriver(Vcb->TargetDeviceObject, Irp);
145
146 IrpContext->Irp = NULL;
147 }
148
149 Ext2CompleteIrpContext(IrpContext, Status);
150 }
151 } _SEH2_END;
152
153 return Status;
154}
155
156
159 PEXT2_IRP_CONTEXT IrpContext,
161)
162{
165 BOOLEAN bDeleted = FALSE;
166 BOOLEAN VcbAcquired = FALSE;
167
168 _SEH2_TRY {
169
171
172 VcbAcquired = ExAcquireResourceExclusiveLite(
173 &Vcb->MainResource, TRUE );
174
175 Ext2FlushFiles(IrpContext, Vcb, FALSE);
176 Ext2FlushVolume(IrpContext, Vcb, FALSE);
177
178 DEBUG(DL_PNP, ("Ext2PnpQueryRemove: Ext2LockVcb: Vcb=%xh FileObject=%xh ...\n",
179 Vcb, IrpContext->FileObject));
180 Status = Ext2LockVcb(Vcb, IrpContext->FileObject);
181
182 if (VcbAcquired) {
183 ExReleaseResourceLite(&Vcb->MainResource);
184 VcbAcquired = FALSE;
185 }
186
187 DEBUG(DL_PNP, ("Ext2PnpQueryRemove: Ext2PurgeVolume ...\n"));
189
190 if (!NT_SUCCESS(Status)) {
192 }
193
195
197 IoSetCompletionRoutine( IrpContext->Irp,
198 Ext2PnpCompletionRoutine,
199 &Event,
200 TRUE,
201 TRUE,
202 TRUE );
203
204 DEBUG(DL_PNP, ("Ext2PnpQueryRemove: Call lower level driver...\n"));
205 Status = IoCallDriver( Vcb->TargetDeviceObject,
206 IrpContext->Irp);
207
208 if (Status == STATUS_PENDING) {
210 Executive,
212 FALSE,
213 NULL );
214 Status = IrpContext->Irp->IoStatus.Status;
215 }
216
217 if (NT_SUCCESS(Status)) {
218 ASSERT(!VcbAcquired);
219 DEBUG(DL_PNP, ("Ext2PnpQueryRemove: Ext2CheckDismount ...\n"));
220 bDeleted = Ext2CheckDismount(IrpContext, Vcb, TRUE);
221 DEBUG(DL_PNP, ("Ext2PnpQueryRemove: Ext2FlushVolume bDelted=%xh ...\n", bDeleted));
222 }
223
224 } _SEH2_FINALLY {
225
226 if (VcbAcquired) {
227 ExReleaseResourceLite(&Vcb->MainResource);
228 }
229
230 IrpContext->Irp->IoStatus.Status = Status;
232 IrpContext->Irp, FALSE, (CCHAR)(NT_SUCCESS(Status)?
234
235 IrpContext->Irp = NULL;
236 } _SEH2_END;
237
238 return Status;
239}
240
243 PEXT2_IRP_CONTEXT IrpContext,
244 PEXT2_VCB Vcb )
245{
248 BOOLEAN bDeleted;
249
250 _SEH2_TRY {
251
252 DEBUG(DL_PNP, ("Ext2PnpRemove by Ext2Pnp ...\n"));
253
256 &Vcb->MainResource, TRUE );
257 Status = Ext2LockVcb(Vcb, IrpContext->FileObject);
258 ExReleaseResourceLite(&Vcb->MainResource);
259
260 //
261 // Setup the Irp. We'll send it to the lower disk driver.
262 //
263
265
267 IoSetCompletionRoutine( IrpContext->Irp,
268 Ext2PnpCompletionRoutine,
269 &Event,
270 TRUE,
271 TRUE,
272 TRUE );
273
274 Status = IoCallDriver( Vcb->TargetDeviceObject,
275 IrpContext->Irp);
276
277 if (Status == STATUS_PENDING) {
278
280 Executive,
282 FALSE,
283 NULL );
284
285 Status = IrpContext->Irp->IoStatus.Status;
286 }
287
288 /* purge volume cache */
290
291 /* dismount volume */
292 bDeleted = Ext2CheckDismount(IrpContext, Vcb, TRUE);
294
295 } _SEH2_FINALLY {
296
297 IrpContext->Irp->IoStatus.Status = Status;
299 IrpContext->Irp, FALSE, (CCHAR)(NT_SUCCESS(Status)?
301
302 IrpContext->Irp = NULL;
303 } _SEH2_END;
304
305 return Status;
306}
307
308
311 PEXT2_IRP_CONTEXT IrpContext,
312 PEXT2_VCB Vcb )
313{
316 BOOLEAN bDeleted;
317
318 _SEH2_TRY {
319
320 DEBUG(DL_PNP, ("Ext2PnpSupriseRemove by Ext2Pnp ...\n"));
321
324 &Vcb->MainResource, TRUE );
325
326 Status = Ext2LockVcb(Vcb, IrpContext->FileObject);
327
328 ExReleaseResourceLite(&Vcb->MainResource);
329
330 //
331 // Setup the Irp. We'll send it to the lower disk driver.
332 //
333
335
337 IoSetCompletionRoutine( IrpContext->Irp,
338 Ext2PnpCompletionRoutine,
339 &Event,
340 TRUE,
341 TRUE,
342 TRUE );
343
344 Status = IoCallDriver( Vcb->TargetDeviceObject,
345 IrpContext->Irp);
346
347 if (Status == STATUS_PENDING) {
348
350 Executive,
352 FALSE,
353 NULL );
354
355 Status = IrpContext->Irp->IoStatus.Status;
356 }
357
358 /* purge volume cache */
360
361 /* dismount volume */
362 bDeleted = Ext2CheckDismount(IrpContext, Vcb, TRUE);
364
365 } _SEH2_FINALLY {
366
367 IrpContext->Irp->IoStatus.Status = Status;
369 IrpContext->Irp, FALSE, (CCHAR)(NT_SUCCESS(Status)?
371
372 IrpContext->Irp = NULL;
373 } _SEH2_END;
374
375 return Status;
376}
377
378
381 PEXT2_IRP_CONTEXT IrpContext,
383)
384{
386
387 DEBUG(DL_PNP, ("Ext2PnpCancelRemove by Ext2Pnp ...\n"));
388
390 &Vcb->MainResource, TRUE );
391
392 Status = Ext2UnlockVcb(Vcb, IrpContext->FileObject);
393
394 ExReleaseResourceLite(&Vcb->MainResource);
395
397
398 Status = IoCallDriver(Vcb->TargetDeviceObject, IrpContext->Irp);
399
400 IrpContext->Irp = NULL;
401
402 return Status;
403}
404
405#endif //(_WIN32_WINNT >= 0x0500)
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
unsigned char BOOLEAN
LONG NTSTATUS
Definition: precomp.h:26
#define DEBUG(args)
Definition: rdesktop.h:129
#define IRP_CONTEXT_FLAG_WAIT
Definition: cdstruc.h:1215
_In_ PIRP Irp
Definition: csq.h:116
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
_In_ PIO_STACK_LOCATION IrpSp
Definition: create.c:4137
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#define PKEVENT
Definition: env_spec_w32.h:70
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
#define ExAcquireResourceExclusiveLite(res, wait)
Definition: env_spec_w32.h:615
NTSTATUS Ext2PnpQueryRemove(PEXT2_IRP_CONTEXT IrpContext, PEXT2_VCB Vcb)
NTSTATUS Ext2Pnp(IN PEXT2_IRP_CONTEXT IrpContext)
#define SetFlag(_F, _SF)
Definition: ext2fs.h:187
NTSTATUS Ext2UnlockVcb(IN PEXT2_VCB Vcb, IN PFILE_OBJECT FileObject)
Definition: fsctl.c:206
@ EXT2ICX
Definition: ext2fs.h:465
@ EXT2VCB
Definition: ext2fs.h:462
NTSTATUS Ext2PurgeVolume(IN PEXT2_VCB Vcb, IN BOOLEAN FlushBeforePurge)
Definition: fsctl.c:2704
#define DL_PNP
Definition: ext2fs.h:1449
PEXT2_GLOBAL Ext2Global
Definition: init.c:16
#define SetLongFlag(_F, _SF)
Definition: ext2fs.h:258
BOOLEAN Ext2CheckDismount(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN BOOLEAN bForce)
Definition: fsctl.c:2592
NTSTATUS Ext2LockVcb(IN PEXT2_VCB Vcb, IN PFILE_OBJECT FileObject)
Definition: fsctl.c:94
#define Ext2CompleteRequest(Irp, bPrint, PriorityBoost)
Definition: ext2fs.h:1475
#define VCB_DEVICE_REMOVED
Definition: ext2fs.h:800
struct _EXT2_VCB * PEXT2_VCB
NTSTATUS Ext2PnpCancelRemove(PEXT2_IRP_CONTEXT IrpContext, PEXT2_VCB Vcb)
NTSTATUS Ext2PnpSurpriseRemove(PEXT2_IRP_CONTEXT IrpContext, PEXT2_VCB Vcb)
NTSTATUS Ext2PnpRemove(PEXT2_IRP_CONTEXT IrpContext, PEXT2_VCB Vcb)
NTSTATUS Ext2CompleteIrpContext(IN PEXT2_IRP_CONTEXT IrpContext, IN NTSTATUS Status)
Definition: read.c:32
NTSTATUS Ext2FlushFiles(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN BOOLEAN bShutDown)
Definition: flush.c:112
NTSTATUS Ext2FlushVolume(IN PEXT2_IRP_CONTEXT IrpContext, IN PEXT2_VCB Vcb, IN BOOLEAN bShutDown)
Definition: flush.c:43
#define _SEH2_FINALLY
Definition: filesup.c:21
#define _SEH2_END
Definition: filesup.c:22
#define _SEH2_TRY
Definition: filesup.c:19
#define _SEH2_LEAVE
Definition: filesup.c:20
Status
Definition: gdiplustypes.h:25
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
Definition: irp.cpp:490
NTSTATUS NTAPI CcWaitForCurrentLazyWriterActivity(VOID)
Definition: lazyrite.c:30
#define ASSERT(a)
Definition: mode.c:44
#define KernelMode
Definition: asm.h:34
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
@ NotificationEvent
#define IRP_MN_SURPRISE_REMOVAL
Definition: ntifs_ex.h:408
#define IoSkipCurrentIrpStackLocation(Irp)
Definition: ntifs_ex.h:421
#define IoCopyCurrentIrpStackLocationToNext(Irp)
Definition: ntifs_ex.h:413
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
Definition: resource.c:1822
#define IoCallDriver
Definition: irp.c:1225
#define STATUS_PENDING
Definition: ntstatus.h:82
#define Vcb
Definition: cdprocs.h:1415
#define STATUS_MORE_PROCESSING_REQUIRED
Definition: shellext.h:68
#define STATUS_SUCCESS
Definition: shellext.h:65
IO_STATUS_BLOCK IoStatus
PIRP Irp
Definition: ext2fs.h:1050
PFILE_OBJECT FileObject
Definition: ext2fs.h:1066
#define NTAPI
Definition: typedefs.h:36
#define IN
Definition: typedefs.h:39
char CCHAR
Definition: typedefs.h:51
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define IRP_MN_REMOVE_DEVICE
#define IO_DISK_INCREMENT
Definition: iotypes.h:600
#define IRP_MN_CANCEL_REMOVE_DEVICE
#define IRP_MN_QUERY_REMOVE_DEVICE
@ Executive
Definition: ketypes.h:415