MCPcopy Create free account
hub / github.com/bobranten/Ext4Fsd / Ext2PnpSurpriseRemove

Function Ext2PnpSurpriseRemove

Ext4Fsd/pnp.c:301–368  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

299
300
301NTSTATUS
302Ext2PnpSurpriseRemove (
303 PEXT2_IRP_CONTEXT IrpContext,
304 PEXT2_VCB Vcb )
305{
306 NTSTATUS Status;
307 KEVENT Event;
308 BOOLEAN bDeleted;
309
310 __try {
311
312 DEBUG(DL_PNP, ("Ext2PnpSupriseRemove by Ext2Pnp ...\n"));
313
314 CcWaitForCurrentLazyWriterActivity();
315 ExAcquireResourceExclusiveLite(
316 &Vcb->MainResource, TRUE );
317
318 Status = Ext2LockVcb(Vcb, IrpContext->FileObject);
319
320 ExReleaseResourceLite(&Vcb->MainResource);
321
322 //
323 // Setup the Irp. We'll send it to the lower disk driver.
324 //
325
326 IoCopyCurrentIrpStackLocationToNext(IrpContext->Irp);
327
328 KeInitializeEvent( &Event, NotificationEvent, FALSE );
329 IoSetCompletionRoutine( IrpContext->Irp,
330 Ext2PnpCompletionRoutine,
331 &Event,
332 TRUE,
333 TRUE,
334 TRUE );
335
336 Status = IoCallDriver( Vcb->TargetDeviceObject,
337 IrpContext->Irp);
338
339 if (Status == STATUS_PENDING) {
340
341 KeWaitForSingleObject( &Event,
342 Executive,
343 KernelMode,
344 FALSE,
345 NULL );
346
347 Status = IrpContext->Irp->IoStatus.Status;
348 }
349
350 /* purge volume cache */
351 Ext2PurgeVolume(Vcb, FALSE);
352
353 /* dismount volume */
354 bDeleted = Ext2CheckDismount(IrpContext, Vcb, TRUE);
355 SetLongFlag(Vcb->Flags, VCB_DEVICE_REMOVED);
356
357 } __finally {
358

Callers 1

Ext2PnpFunction · 0.85

Calls 3

Ext2LockVcbFunction · 0.85
Ext2PurgeVolumeFunction · 0.85
Ext2CheckDismountFunction · 0.85

Tested by

no test coverage detected