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

📄 mavioctl.c

📁 基于EP7312的MP3播放器源代码,包括MCU和PC端代码.
💻 C
📖 第 1 页 / 共 5 页
字号:
//
//****************************************************************************
NTSTATUS
MavUsb_VendorFreeSpace(IN PDEVICE_OBJECT DeviceObject, IN PURB urb,
                       PUCHAR buffer, MavUsb_FreeSpaceParams *pIn,
                       MavUsb_FreeSpaceResult *pOut, PULONG result)
{
    NTSTATUS ntStatus;

    //
    // Send the "free_space" vendor request.
    //
    ntStatus = MavUsb_SendVendorCommand(DeviceObject, urb, pIn->ulDriveNum,
                                        USB_Vendor_FreeSpace, 0, 0, buffer, 8);

    //
    // If the vendor packet was sent successfully, then return the result.
    //
    if(NT_SUCCESS(ntStatus))
    {
        //
        // Make sure that the correct amount of data was returned.
        //
        if(urb->UrbControlVendorClassRequest.TransferBufferLength != 8)
        {
            //
            // The wrong amount of data was returned, so return a device error.
            //
            ntStatus = STATUS_DEVICE_DATA_ERROR;
        }
        else
        {
            //
            // Get the return code.
            //
            *result = ((ULONG *)buffer)[0];

            //
            // Get the free space.
            //
            pOut->ulBytes = ((ULONG *)buffer)[1];
        }
    }

    //
    // Return the result.
    //
    return(ntStatus);
}

//****************************************************************************
//
// Handles the "format" request IOCTL.
//
//****************************************************************************
NTSTATUS
MavUsb_VendorFormat(IN PDEVICE_OBJECT DeviceObject, IN PURB urb, PUCHAR buffer,
                    MavUsb_FormatParams *pIn, PULONG result)
{
    NTSTATUS ntStatus;

    //
    // Send the "format" vendor request.
    //
    ntStatus = MavUsb_SendVendorCommand(DeviceObject, urb, pIn->ulDriveNum,
                                        USB_Vendor_Format, 0, 0, buffer, 4);

    //
    // If the vendor packet was sent successfully, then return the result.
    //
    if(NT_SUCCESS(ntStatus))
    {
        //
        // Make sure that the correct amount of data was returned.
        //
        if(urb->UrbControlVendorClassRequest.TransferBufferLength != 4)
        {
            //
            // The wrong amount of data was returned, so return a device error.
            //
            ntStatus = STATUS_DEVICE_DATA_ERROR;
        }
        else
        {
            //
            // Get the return code.
            //
            *result = ((ULONG *)buffer)[0];
        }
    }

    //
    // Return the result.
    //
    return(ntStatus);
}

//****************************************************************************
//
// Handles the "start update" request IOCTL.
//
//****************************************************************************
NTSTATUS
MavUsb_VendorStartUpdate(IN PDEVICE_OBJECT DeviceObject, IN PURB urb,
                         PUCHAR buffer, PULONG result)
{
    NTSTATUS ntStatus;

    //
    // Send the "start_update" vendor request.
    //
    ntStatus = MavUsb_SendVendorCommand(DeviceObject, urb, 0,
                                        USB_Vendor_StartUpdate, 0, 0, buffer,
                                        4);

    //
    // If the vendor packet was sent successfully, then return the result.
    //
    if(NT_SUCCESS(ntStatus))
    {
        //
        // Make sure that the correct amount of data was returned.
        //
        if(urb->UrbControlVendorClassRequest.TransferBufferLength != 4)
        {
            //
            // The wrong amount of data was returned, so return a device error.
            //
            ntStatus = STATUS_DEVICE_DATA_ERROR;
        }
        else
        {
            //
            // Get the return code.
            //
            *result = ((ULONG *)buffer)[0];
        }
    }

    //
    // Return the result.
    //
    return(ntStatus);
}

//****************************************************************************
//
// Processes vendor command IOCTLs from user mode code.
//
// Arguments:
//
//     DeviceObject - pointer to the FDO for this instance of the device.
//
//     Irp - pointer to the IRP
//
//     irpStack - pointer to the current IRP stack location
//
// Return Value:
//
//     NT status code
//
//****************************************************************************
NTSTATUS
MavUsb_VendorCommand(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp,
                     PIO_STACK_LOCATION irpStack)
{
    NTSTATUS ntStatus;
    PUCHAR buffer;
    ULONG length, siz;
    PURB urb;
    MavUsb_IoctlParams *pParams;
    MavUsb_IoctlResults *pResults;

    //
    // Make sure that the user supplied parameters and results buffers are
    // large enough.
    //
    if((irpStack->Parameters.DeviceIoControl.InputBufferLength <
        sizeof(MavUsb_IoctlParams)) ||
       (irpStack->Parameters.DeviceIoControl.OutputBufferLength <
        sizeof(MavUsb_IoctlResults)))
    {
        return(STATUS_INVALID_PARAMETER);
    }

    //
    // Get a pointer to the user supplied parameters and results.
    //
    pParams = (MavUsb_IoctlParams *)Irp->AssociatedIrp.SystemBuffer;
    pResults = (MavUsb_IoctlResults *)Irp->AssociatedIrp.SystemBuffer;

    //
    // Allocate memory from the non-paged pool for the URB and the result read
    // back from the device.
    //
    siz = sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST);
    buffer = ExAllocatePool(NonPagedPool, siz + 8);
    if(!buffer)
    {
        return(STATUS_INSUFFICIENT_RESOURCES);
    }

    //
    // Build a pointer to the URB.
    //
    urb = (PURB)(buffer + 8);

    //
    // Determine what to do based on the specified request.
    //
    switch(pParams->ulRequestCode)
    {
        //
        // Get the value of a descriptor.
        //
        case REQUEST_GET_DESCRIPTOR:
        {
            //
            // Handle the get descriptor request.
            //
            ntStatus =
                MavUsb_VendorGetDescriptor(DeviceObject, urb, buffer,
                                           &pParams->uParams.sGetDescriptor,
                                           &pResults->uResults.sGetDescriptor,
                                           &pResults->ulReturnCode);

            //
            // We're done with this request.
            //
            break;
        }

        //
        // Set the value of a descriptor.
        //
        case REQUEST_SET_DESCRIPTOR:
        {
            //
            // Handle the get descriptor request.
            //
            ntStatus =
                MavUsb_VendorSetDescriptor(DeviceObject, urb, buffer,
                                           &pParams->uParams.sSetDescriptor,
                                           &pResults->ulReturnCode);

            //
            // We're done with this request.
            //
            break;
        }

        //
        // Get the number of drives on the device.
        //
        case REQUEST_NUM_DRIVES:
        {
            //
            // Handle the num drives request.
            //
            ntStatus = MavUsb_VendorNumDrives(DeviceObject, urb, buffer,
                                              &pResults->uResults.sNumDrives,
                                              &pResults->ulReturnCode);

            //
            // We're done with this request.
            //
            break;
        }

        //
        // Open the specified file.
        //
        case REQUEST_OPEN:
        {
            //
            // Handle the open request.
            //
            ntStatus = MavUsb_VendorOpen(DeviceObject, urb, buffer,
                                         &pParams->uParams.sOpen,
                                         &pResults->ulReturnCode);

            //
            // We're done with this request.
            //
            break;
        }

        //
        // Create the specified file.
        //
        case REQUEST_CREATE:
        {
            //
            // Handle the create request.
            //
            ntStatus = MavUsb_VendorCreate(DeviceObject, urb, buffer,
                                           &pParams->uParams.sCreate,
                                           &pResults->ulReturnCode);

            //
            // We're done with this request.
            //
            break;
        }

        //
        // Move the file read/write pointer to the specified position.
        //
        case REQUEST_SEEK:
        {
            //
            // Handle the seek request.
            //
            ntStatus = MavUsb_VendorSeek(DeviceObject, urb, buffer,
                                         &pParams->uParams.sSeek,
                                         &pResults->ulReturnCode);

            //
            // We're done with this request.
            //
            break;
        }

        //
        // Get the current file read/write pointer.
        //
        case REQUEST_TELL:
        {
            //
            // Handle the tell request.
            //
            ntStatus = MavUsb_VendorTell(DeviceObject, urb, buffer,
                                         &pResults->uResults.sTell,
                                         &pResults->ulReturnCode);

            //
            // We're done with this request.
            //
            break;
        }

        //
        // Get the length of the file.
        //
        case REQUEST_LENGTH:
        {
            //
            // Handle the length request.
            //
            ntStatus = MavUsb_VendorLength(DeviceObject, urb, buffer,
                                           &pResults->uResults.sLength,
                                           &pResults->ulReturnCode);

            //
            // We're done with this request.
            //
            break;
        }

        //
        // Get the modification date/time of the file.
        //
        case REQUEST_GETDATE:
        {
            //
            // Handle the get date request.
            //
            ntStatus = MavUsb_VendorGetDate(DeviceObject, urb, buffer,
                                            &pResults->uResults.sGetDate,
                                            &pResults->ulReturnCode);

            //
            // We're done with this request.
            //
            break;
        }

        //
        // Close the currently opened file.
        //
        case REQUEST_CLOSE:
        {
            //
            // Handle the close request.
            //
            ntStatus = MavUsb_VendorClose(DeviceObject, urb, buffer,
                                          &pResults->ulReturnCode);

            //
            // We're done with this request.
            //
            break;
        }

        //
        // Delete the specified file.
        //
        case REQUEST_DELETE:
        {
            //
            // Handle the delete request.
            //
            ntStatus = MavUsb_VendorDelete(DeviceObject, urb, buffer,
                                           &pParams->uParams.sDelete,
                                           &pResults->ulReturnCode);

            //
            // We're done with this request.
            //
            break;
        }

        //
        // Open the specified directory.
        //
        case REQUEST_OPENDIR:
        {
            //
            // Handle the opendir request.
            //
            ntStatus = MavUsb_VendorOpenDir(DeviceObject, urb, buffer,
                                            &pParams->uParams.sOpenDir,
                                            &pResults->ulReturnCode);

            //
            // We're done with this request.
            //
            break;
        }

        //
        // Read the next directory entry.
        //
        case REQUEST_READDIR:
        {
            //
            // Handle the readdir request.
            //
            ntStatus = MavUsb_VendorReadDir(DeviceObject, urb, buffer,
                                            &pParams->uParams.sReadDir,
                                            &pResults->uResults.sReadDir,
                                            &pResults->ulReturnCode);

            //
            // We're done with this request.
            //
            break;
        }

        //
        // Close the currently opened directory.
        //
        case REQUEST_CLOSEDIR:
        {
            //
            // Handle the closedir request.
            //
            ntStatus = MavUsb_VendorCloseDir(DeviceObject, urb, buffer,
                                             &pResults->ulReturnCode);

            //
            // We're done with this request.
            //
            break;
        }

        //
 

⌨️ 快捷键说明

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