/* Dummy PnP IRP handler. */ static NTSTATUS STDCALL WvDummyPnp( IN WV_SP_DEV_T dev, IN PIRP irp, IN UCHAR code ) { switch (code) { case IRP_MN_QUERY_ID: /* The WV_S_DEV_T extension points to the dummy IDs. */ return WvDummyIds(irp, dev->ext); case IRP_MN_QUERY_REMOVE_DEVICE: return WvlIrpComplete(irp, 0, STATUS_SUCCESS); case IRP_MN_REMOVE_DEVICE: /* Any error status for the removal slips away, here. */ WvBusRemoveDev(dev); return WvlIrpComplete(irp, 0, STATUS_SUCCESS); default: /* Return whatever upper drivers in the stack yielded. */ return WvlIrpComplete( irp, irp->IoStatus.Information, irp->IoStatus.Status ); } }
/* Attach a file as a disk, based on an IRP. */ NTSTATUS STDCALL WvFilediskAttach(IN PIRP irp) { PCHAR buf = irp->AssociatedIrp.SystemBuffer; WV_SP_MOUNT_DISK params = (WV_SP_MOUNT_DISK) buf; WVL_E_DISK_MEDIA_TYPE media_type; UINT32 sector_size; WV_SP_FILEDISK_T filedisk; NTSTATUS status; ANSI_STRING ansi_path; switch (params->type) { case 'f': media_type = WvlDiskMediaTypeFloppy; sector_size = 512; break; case 'c': media_type = WvlDiskMediaTypeOptical; sector_size = 2048; break; default: media_type = WvlDiskMediaTypeHard; sector_size = 512; break; } DBG("Media type: %d\n", media_type); /* Create the filedisk PDO. */ filedisk = WvFilediskCreatePdo(media_type); if (filedisk == NULL) { DBG("Could not create file-backed disk!\n"); status = STATUS_INSUFFICIENT_RESOURCES; goto err_pdo; } /* Set filedisk parameters. */ filedisk->disk->Media = media_type; filedisk->disk->SectorSize = sector_size; filedisk->disk->Cylinders = params->cylinders; filedisk->disk->Heads = params->heads; filedisk->disk->Sectors = params->sectors; /* Populate the file path into a counted ANSI string. */ RtlInitAnsiString(&ansi_path, buf + sizeof *params); /* Attempt to open the file from within the filedisk's thread. */ status = WvFilediskOpen_(filedisk, &ansi_path); if (!NT_SUCCESS(status)) goto err_file_open; /* Add the filedisk to the bus. */ filedisk->disk->ParentBus = WvBus.Fdo; if (!WvBusAddDev(filedisk->Dev)) { status = STATUS_UNSUCCESSFUL; goto err_add_child; } return STATUS_SUCCESS; WvBusRemoveDev(filedisk->Dev); err_add_child: /* Any open file handle will be closed upon thread exit. */ err_file_open: WvFilediskFree_(filedisk->Dev); err_pdo: return status; }
/** * Remove a dummy PDO node on the WinVBlock bus. * * @v Pdo The PDO to remove. * @ret NTSTATUS The status of the operation. * * It might actually be better to handle a PnP remove IOCTL. */ WVL_M_LIB NTSTATUS STDCALL WvDummyRemove(IN PDEVICE_OBJECT Pdo) { /* Sanity check. */ if (Pdo->DriverObject == WvDriverObj) return WvBusRemoveDev(WvDevFromDevObj(Pdo)); return STATUS_INVALID_PARAMETER; }