⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbfx2lk_usb.cpp

📁 USBFX2LK WDM drive for OSR s USB FX2 Learning Kit
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                          sizeof(BAR_GRAPH_STATE),
                          NULL);

    status = SubmitIrpAndUrbAsync(DevExt, Irp, setBarGraphUrb);

    OsrTracePrint(TRACE_LEVEL_VERBOSE,OSRDBG_USB,("SetBarGraphState: Exit\n"));

    //
    // Return whatever status SubmitIrpAndUrbAsync returned
    //
    return status;

}


///////////////////////////////////////////////////////////////////////////////
//
// SubmitGetSevenSegmentState
//
//  This routine gets or sets the state of the 7 segment display  on the board
//
//
//  INPUTS:
//
//      DevExt  -  One of our device extensions
//
//      Irp     -  Pointer to an IOCTL_OSRUSBFX2_GET_7_SEGMENT_DISPLAY
//                  IRP. User's buffer has already been validated
//
//  OUTPUTS:
//
//      None.
//
//  RETURNS:
//
//      An appropriate NTSTATUS value
//
//  IRQL:
//
//      IRQL == PASSIVE_LEVEL
//
//  CONTEXT:
//
//      User context
//
//  NOTES:
//
//      Routine assumes that the output data buffer in the IRP is
//      valid for this request. Must be checked by caller.
//
//      Called relinquishes ownership of the IRP when calling this
//      routine, IRP must NOT be touched by caller after this routine
//      returns
//
/////////////////////////////////////////////////////////////////////////////
NTSTATUS SubmitGetSevenSegmentState(PUSBFX2LK_EXT DevExt, PIRP Irp)
{
    NTSTATUS status;
    PURB getSevenSegmentUrb;

    OsrTracePrint(TRACE_LEVEL_VERBOSE,OSRDBG_USB,("GetSevenSegmentState: Enter\n"));

    //
    // Allocate our get seven segment URB
    //
    getSevenSegmentUrb = 
        (PURB)ExAllocatePoolWithTag(NonPagedPool,
                                    sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
                                    'SGxF');

    if (!getSevenSegmentUrb) {

        OsrTracePrint(TRACE_LEVEL_ERROR,OSRDBG_USB,
                ("GetSevenSegmentState: Failed to allocate memory, Exiting.\n"));

        //
        // We need to complete the IRP ourselves
        //
        Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
        Irp->IoStatus.Information = 0;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        return STATUS_INSUFFICIENT_RESOURCES;

    }

    RtlZeroMemory(getSevenSegmentUrb,
                  sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST));


    //
    // Build the vendor request with the appropriate 
    //  flags and command
    //
    //  We're getting data from the device,
    //  to we need to set the USBD_TRANSFER_DIRECTION_IN flag
    // 
    UsbBuildVendorRequest(getSevenSegmentUrb,
                          URB_FUNCTION_VENDOR_DEVICE,
                          sizeof(struct  _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
                          USBD_SHORT_TRANSFER_OK | USBD_TRANSFER_DIRECTION_IN,
                          0,
                          USBFX2LK_READ_7SEGMENT_DISPLAY,
                          0,
                          0,
                          Irp->AssociatedIrp.SystemBuffer,
                          NULL,
                          sizeof(UCHAR),
                          NULL);

    status = SubmitIrpAndUrbAsync(DevExt, Irp, getSevenSegmentUrb);

    OsrTracePrint(TRACE_LEVEL_VERBOSE,OSRDBG_USB,("GetSevenSegmentState: Exit\n"));

    //
    // Return whatever status SubmitIrpAndUrbAsync returned
    //
    return status;

}


///////////////////////////////////////////////////////////////////////////////
//
// SubmitSetSevenSegmentState
//
//  This routine sets the state of the 7 segment display  on the board
//
//  INPUTS:
//
//      DevExt  -  One of our device extensions
//
//      Irp     -  Pointer to an IOCTL_OSRUSBFX2_SET_7_SEGMENT_DISPLAY
//                  IRP. User's buffer has already been validated
//
//  OUTPUTS:
//
//      None.
//
//  RETURNS:
//
//      An appropriate NTSTATUS value
//
//  IRQL:
//
//      IRQL == PASSIVE_LEVEL
//
//  CONTEXT:
//
//      User context
//
//  NOTES:
//
//      Routine assumes that the output data buffer in the IRP is
//      valid for this request. Must be checked by caller.
//
//      Called relinquishes ownership of the IRP when calling this
//      routine, IRP must NOT be touched by caller after this routine
//      returns
//
///////////////////////////////////////////////////////////////////////////////
NTSTATUS SubmitSetSevenSegmentState(PUSBFX2LK_EXT DevExt, PIRP Irp)
{
    NTSTATUS status;
    PURB setSevenSegmentUrb;

    OsrTracePrint(TRACE_LEVEL_VERBOSE,OSRDBG_USB,("SetSevenSegmentState: Enter\n"));

    //
    // Allocate our set seven segment URB
    //
    setSevenSegmentUrb = 
        (PURB)ExAllocatePoolWithTag(NonPagedPool,
                                    sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
                                    'SSxF');

    if (!setSevenSegmentUrb) {

        OsrTracePrint(TRACE_LEVEL_ERROR,OSRDBG_USB,
                ("SetSevenSegmentState: Failed to allocate memory, Exiting.\n"));

        //
        // We need to complete the IRP ourselves
        //
        Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
        Irp->IoStatus.Information = 0;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        return STATUS_INSUFFICIENT_RESOURCES;

    }

    RtlZeroMemory(setSevenSegmentUrb,
                  sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST));


    //
    // Build the vendor request with the appropriate 
    //  flags and command
    //
    //  We're getting data from the device,
    //  to we need to set the USBD_TRANSFER_DIRECTION_IN flag
    // 
    UsbBuildVendorRequest(setSevenSegmentUrb,
                          URB_FUNCTION_VENDOR_DEVICE,
                          sizeof(struct  _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
                          USBD_SHORT_TRANSFER_OK,
                          0,
                          USBFX2LK_SET_7SEGMENT_DISPLAY,
                          0,
                          0,
                          Irp->AssociatedIrp.SystemBuffer,
                          NULL,
                          sizeof(UCHAR),
                          NULL);

    status = SubmitIrpAndUrbAsync(DevExt, Irp, setSevenSegmentUrb);

    OsrTracePrint(TRACE_LEVEL_VERBOSE,OSRDBG_USB,("SetSevenSegmentState: Exit\n"));

    //
    // Return whatever status SubmitIrpAndUrbAsync returned
    //
    return status;

}


///////////////////////////////////////////////////////////////////////////////
//
// SubmitGetSwitchState
//
//  This routine gets the state of the switches on the board
//
//  INPUTS:
//
//      DevExt  -  One of our device extensions
//
//      Irp     -  Pointer to an IOCTL_OSRUSBFX2_READ_SWITCHES
//                  IRP. User's buffer has already been validated
//
//  OUTPUTS:
//
//      None.
//
//  RETURNS:
//
//      An appropriate NTSTATUS value
//
//  IRQL:
//
//      IRQL == PASSIVE_LEVEL
//
//  CONTEXT:
//
//      User context
//
//  NOTES:
//
//      Routine assumes that the output data buffer in the IRP is
//      valid for this request. Must be checked by caller.
//
//      Called relinquishes ownership of the IRP when calling this
//      routine, IRP must NOT be touched by caller after this routine
//      returns
//
///////////////////////////////////////////////////////////////////////////////
NTSTATUS SubmitGetSwitchState(PUSBFX2LK_EXT DevExt, PIRP Irp)
{

    NTSTATUS status;
    PURB getSwitchUrb;

    OsrTracePrint(TRACE_LEVEL_VERBOSE,OSRDBG_USB,("GetSwitchState: Enter\n"));

    //
    // Allocate our get seven segment URB
    //
    getSwitchUrb = 
        (PURB)ExAllocatePoolWithTag(NonPagedPool,
                                    sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
                                    'WGxF');

    if (!getSwitchUrb) {

        OsrTracePrint(TRACE_LEVEL_ERROR,OSRDBG_USB,
                ("GetSwitchState: Failed to allocate memory, Exiting.\n"));

        //
        // We need to complete the IRP ourselves
        //
        Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
        Irp->IoStatus.Information = 0;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        return STATUS_INSUFFICIENT_RESOURCES;

    }

    RtlZeroMemory(getSwitchUrb,
                  sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST));


    //
    // Build the vendor request with the appropriate 
    //  flags and command
    //
    //  We're getting data from the device,
    //  to we need to set the USBD_TRANSFER_DIRECTION_IN flag
    // 
    UsbBuildVendorRequest(getSwitchUrb,
                          URB_FUNCTION_VENDOR_DEVICE,
                          sizeof(struct  _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
                          USBD_SHORT_TRANSFER_OK | USBD_TRANSFER_DIRECTION_IN,
                          0,
                          USBFX2LK_READ_SWITCHES,
                          0,
                          0,
                          Irp->AssociatedIrp.SystemBuffer,
                          NULL,
                          sizeof(SWITCH_STATE),
                          NULL);

    status = SubmitIrpAndUrbAsync(DevExt, Irp, getSwitchUrb);

    OsrTracePrint(TRACE_LEVEL_VERBOSE,OSRDBG_USB,("GetSwitchState: Exit\n"));

    //
    // Return whatever status SubmitIrpAndUrbAsync returned
    //
    return status;
}


///////////////////////////////////////////////////////////////////////////////
//
// GetDeviceDescriptor
//
//      Returns the USB device descriptor for the device
//
//  INPUTS:
//
//      DevExt  -  One of our device extensions
//
//  OUTPUTS:
//
//      DeviceDescriptor - If successful, contains the USB device descriptor
//                         for the device
//
//      BytesTransferred - The actual amount of data transferred by this 
//                         operation
//
//  RETURNS:
//
//      An appropriate NTSTATUS value
//
//  IRQL:
//
//      IRQL == PASSIVE_LEVEL
//
//  CONTEXT:
//
//      User context
//
//  NOTES:
//
///////////////////////////////////////////////////////////////////////////////
NTSTATUS GetDeviceDescriptor(PUSBFX2LK_EXT DevExt, PUSB_DEVICE_DESCRIPTOR DeviceDescriptor,
                             PULONG BytesTransferred)
{
    OsrTracePrint(TRACE_LEVEL_VERBOSE,OSRDBG_USB,("GetDeviceDescriptor: Enter\n"));

    //
    // We've already saved the device descriptor away 
    //  so we just need to copy it out of the device 
    //  extension
    //
    RtlCopyMemory(DeviceDescriptor, DevExt->UsbDeviceDescriptor, sizeof(USB_DEVICE_DESCRIPTOR));

    //
    // Indicate the amount of data that was actually 
    //  transferred
    //
    *BytesTransferred = sizeof(USB_DEVICE_DESCRIPTOR);

    OsrTracePrint(TRACE_LEVEL_VERBOSE,OSRDBG_USB,("GetDeviceDescriptor: Exit\n"));

    return STATUS_SUCCESS;

}

///////////////////////////////////////////////////////////////////////////////
//
// GetConfigurationDescriptor
//
//      Returns the USB configuration descriptor for the device
//
//  INPUTS:
//
//      DevExt  -  One of our device extensions
//
//  OUTPUTS:
//
//      ConfigDescriptor - If successful, contains the USB configuration descriptor
//                         for the device
//
//      BytesTransferred - The actual amount of data transferred by this 
//                         operation
//
//  RETURNS:
//
//      An appropriate NTSTATUS value
//
//  IRQL:
//
//      IRQL == PASSIVE_LEVEL
//
//  CONTEXT:
//
//      User context
//
//  NOTES:
//
//////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -