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

Function Ext2PnpRemove

Ext4Fsd/pnp.c:233–298  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

231}
232
233NTSTATUS
234Ext2PnpRemove (
235 PEXT2_IRP_CONTEXT IrpContext,
236 PEXT2_VCB Vcb )
237{
238 NTSTATUS Status = STATUS_SUCCESS;
239 KEVENT Event;
240 BOOLEAN bDeleted;
241
242 __try {
243
244 DEBUG(DL_PNP, ("Ext2PnpRemove by Ext2Pnp ...\n"));
245
246 CcWaitForCurrentLazyWriterActivity();
247 ExAcquireResourceExclusiveLite(
248 &Vcb->MainResource, TRUE );
249 Status = Ext2LockVcb(Vcb, IrpContext->FileObject);
250 ExReleaseResourceLite(&Vcb->MainResource);
251
252 //
253 // Setup the Irp. We'll send it to the lower disk driver.
254 //
255
256 IoCopyCurrentIrpStackLocationToNext(IrpContext->Irp);
257
258 KeInitializeEvent( &Event, NotificationEvent, FALSE );
259 IoSetCompletionRoutine( IrpContext->Irp,
260 Ext2PnpCompletionRoutine,
261 &Event,
262 TRUE,
263 TRUE,
264 TRUE );
265
266 Status = IoCallDriver( Vcb->TargetDeviceObject,
267 IrpContext->Irp);
268
269 if (Status == STATUS_PENDING) {
270
271 KeWaitForSingleObject( &Event,
272 Executive,
273 KernelMode,
274 FALSE,
275 NULL );
276
277 Status = IrpContext->Irp->IoStatus.Status;
278 }
279
280 /* purge volume cache */
281 Ext2PurgeVolume(Vcb, FALSE);
282
283 /* dismount volume */
284 bDeleted = Ext2CheckDismount(IrpContext, Vcb, TRUE);
285 SetLongFlag(Vcb->Flags, VCB_DEVICE_REMOVED);
286
287 } __finally {
288
289 IrpContext->Irp->IoStatus.Status = Status;
290 Ext2CompleteRequest(

Callers 1

Ext2PnpFunction · 0.85

Calls 3

Ext2LockVcbFunction · 0.85
Ext2PurgeVolumeFunction · 0.85
Ext2CheckDismountFunction · 0.85

Tested by

no test coverage detected