Ejemplo n.º 1
0
/* 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
            );
      }
  }
Ejemplo n.º 2
0
/* 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;
  }
Ejemplo n.º 3
0
/**
 * 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;
  }