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

Function Ext2PrepareToUnload

Ext4Fsd/devctl.c:138–223  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

136#if EXT2_UNLOAD
137
138NTSTATUS
139Ext2PrepareToUnload (IN PEXT2_IRP_CONTEXT IrpContext)
140{
141 PDEVICE_OBJECT DeviceObject;
142 NTSTATUS Status = STATUS_UNSUCCESSFUL;
143 BOOLEAN GlobalDataResourceAcquired = FALSE;
144
145 __try {
146
147 ASSERT(IrpContext != NULL);
148
149 ASSERT((IrpContext->Identifier.Type == EXT2ICX) &&
150 (IrpContext->Identifier.Size == sizeof(EXT2_IRP_CONTEXT)));
151
152 DeviceObject = IrpContext->DeviceObject;
153
154 if (IsExt2FsDevice(DeviceObject)) {
155 Status = STATUS_INVALID_DEVICE_REQUEST;
156 __leave;
157 }
158
159 ExAcquireResourceExclusiveLite(
160 &Ext2Global->Resource,
161 TRUE );
162
163 GlobalDataResourceAcquired = TRUE;
164
165 if (FlagOn(Ext2Global->Flags, EXT2_UNLOAD_PENDING)) {
166 DEBUG(DL_ERR, ( "Ext2PrepareUnload: Already ready to unload.\n"));
167
168 Status = STATUS_ACCESS_DENIED;
169
170 __leave;
171 }
172
173 {
174 PEXT2_VCB Vcb;
175 PLIST_ENTRY ListEntry;
176
177 ListEntry = Ext2Global->VcbList.Flink;
178
179 while (ListEntry != &(Ext2Global->VcbList)) {
180
181 Vcb = CONTAINING_RECORD(ListEntry, EXT2_VCB, Next);
182 ListEntry = ListEntry->Flink;
183
184 if (Vcb && (!Vcb->ReferenceCount) &&
185 IsFlagOn(Vcb->Flags, VCB_DISMOUNT_PENDING)) {
186 Ext2RemoveVcb(Vcb);
187 Ext2ClearVpbFlag(Vcb->Vpb, VPB_MOUNTED);
188
189 Ext2DestroyVcb(Vcb);
190 }
191 }
192 }
193
194 if (!IsListEmpty(&(Ext2Global->VcbList))) {
195

Callers 1

Ext2DeviceControlFunction · 0.85

Calls 4

Ext2RemoveVcbFunction · 0.85
Ext2ClearVpbFlagFunction · 0.85
Ext2DestroyVcbFunction · 0.85
Ext2CompleteIrpContextFunction · 0.85

Tested by

no test coverage detected