예제 #1
0
파일: bus.c 프로젝트: ngaut/winvblock
static NTSTATUS STDCALL AoeBusDevCtlDetach_(IN PIRP irp) {
    PIO_STACK_LOCATION io_stack_loc = IoGetCurrentIrpStackLocation(irp);
    UINT32 unit_num;
    WVL_SP_BUS_NODE walker;
    AOE_SP_DISK aoe_disk = NULL;

    unit_num = *((PUINT32) irp->AssociatedIrp.SystemBuffer);
    DBG("Request to detach unit: %d\n", unit_num);

    walker = NULL;
    /* For each node on the bus... */
    WvlBusLock(&AoeBusMain);
    while (walker = WvlBusGetNextNode(&AoeBusMain, walker)) {
        aoe_disk = CONTAINING_RECORD(walker, AOE_S_DISK, BusNode[0]);
        /* If the unit number matches... */
        if (WvlBusGetNodeNum(walker) == unit_num) {
            /* If it's not a boot-time device... */
            if (aoe_disk->Boot) {
                DBG("Cannot detach a boot-time device.\n");
                /* Signal error. */
                aoe_disk = NULL;
                break;
            }
        }
    }
    WvlBusUnlock(&AoeBusMain);
    if (!aoe_disk) {
        DBG("Unit %d not found.\n", unit_num);
        return WvlIrpComplete(irp, 0, STATUS_INVALID_PARAMETER);
    }
    /* Detach the node. */
    WvlBusRemoveNode(aoe_disk->BusNode);
    DBG("Removed unit %d.\n", unit_num);
    return WvlIrpComplete(irp, 0, STATUS_SUCCESS);
}
예제 #2
0
/* Filedisk disk-unit query-response routine. */
static UCHAR STDCALL WvFilediskUnitNum_(IN WVL_SP_DISK_T disk) {
    WV_SP_FILEDISK_T filedisk = CONTAINING_RECORD(
        disk,
        WV_S_FILEDISK_T,
        disk[0]
      );

    /* Possible precision loss. */
    return (UCHAR) WvlBusGetNodeNum(&filedisk->Dev->BusNode);
  }