📄 mavioctl.c
字号:
//
//****************************************************************************
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 + -