| 237 | } |
| 238 | |
| 239 | NTSTATUS |
| 240 | Ext2ReadWriteBlocks( |
| 241 | IN PEXT2_IRP_CONTEXT IrpContext, |
| 242 | IN PEXT2_VCB Vcb, |
| 243 | IN PEXT2_EXTENT Chain, |
| 244 | IN ULONG Length |
| 245 | ) |
| 246 | { |
| 247 | PIRP Irp; |
| 248 | PIRP MasterIrp = IrpContext->Irp; |
| 249 | PIO_STACK_LOCATION IrpSp; |
| 250 | PMDL Mdl; |
| 251 | PEXT2_RW_CONTEXT pContext = NULL; |
| 252 | PEXT2_EXTENT Extent; |
| 253 | KEVENT Wait; |
| 254 | NTSTATUS Status = STATUS_SUCCESS; |
| 255 | BOOLEAN bMasterCompleted = FALSE; |
| 256 | BOOLEAN bBugCheck = FALSE; |
| 257 | |
| 258 | ASSERT(MasterIrp); |
| 259 | |
| 260 | __try { |
| 261 | |
| 262 | pContext = Ext2AllocatePool(NonPagedPool, sizeof(EXT2_RW_CONTEXT), EXT2_RWC_MAGIC); |
| 263 | |
| 264 | if (!pContext) { |
| 265 | DEBUG(DL_ERR, ( "Ex2ReadWriteBlocks: failed to allocate pContext.\n")); |
| 266 | Status = STATUS_INSUFFICIENT_RESOURCES; |
| 267 | __leave; |
| 268 | } |
| 269 | |
| 270 | INC_MEM_COUNT(PS_RW_CONTEXT, pContext, sizeof(EXT2_RW_CONTEXT)); |
| 271 | RtlZeroMemory(pContext, sizeof(EXT2_RW_CONTEXT)); |
| 272 | pContext->Wait = Ext2CanIWait(); |
| 273 | pContext->MasterIrp = MasterIrp; |
| 274 | pContext->Length = Length; |
| 275 | |
| 276 | if (IrpContext->MajorFunction == IRP_MJ_WRITE) { |
| 277 | SetFlag(pContext->Flags, EXT2_RW_CONTEXT_WRITE); |
| 278 | } |
| 279 | |
| 280 | if (pContext->Wait) { |
| 281 | |
| 282 | KeInitializeEvent(&(pContext->Event), NotificationEvent, FALSE); |
| 283 | |
| 284 | } else if (IrpContext->Fcb->Identifier.Type == EXT2FCB) { |
| 285 | |
| 286 | if (IsFlagOn(MasterIrp->Flags, IRP_PAGING_IO)) { |
| 287 | pContext->Resource = &IrpContext->Fcb->PagingIoResource; |
| 288 | } else { |
| 289 | pContext->Resource = &IrpContext->Fcb->MainResource; |
| 290 | } |
| 291 | |
| 292 | pContext->FileObject = IrpContext->FileObject; |
| 293 | pContext->ThreadId = ExGetCurrentResourceThread(); |
| 294 | } |
| 295 | |
| 296 |
no test coverage detected