📄 control.cpp
字号:
// Control.cpp -- IOCTL handlers for usbgps driver
// Copyright (C) 1999 by Walter Oney
// All rights reserved
#include "stddcls.h"
#include "driver.h"
#include "ioctls.h"
///////////////////////////////////////////////////////////////////////////////
#pragma PAGEDCODE
NTSTATUS DispatchControl(PDEVICE_OBJECT fdo, PIRP Irp)
{ // DispatchControl
PAGED_CODE();
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;
NTSTATUS status = IoAcquireRemoveLock(&pdx->RemoveLock, Irp);
if (!NT_SUCCESS(status))
return CompleteRequest(Irp, status, 0);
PVOID ioBuffer;
ULONG length;
PUCHAR pch;
PUSB_CONFIGURATION_DESCRIPTOR configurationDescriptor;
ULONG info = 0;
ioBuffer = Irp->AssociatedIrp.SystemBuffer;
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);
ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;
ULONG cbout = stack->Parameters.DeviceIoControl.OutputBufferLength;
ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;
switch (code)
{ // process request
case IOCTL_USBGPS_GET_CONFIG_DESCRIPTOR: // code == 0x800
{ // IOCTL_USBGPS_GET_CONFIG_DESCRIPTOR
if(!pdx->pcd)
{
status = STATUS_DEVICE_DATA_ERROR;
break;
}
// TODO insert code here to handle this IOCTL, which uses METHOD_BUFFERED
pch = (PUCHAR) ioBuffer;
configurationDescriptor = pdx->pcd;
length = configurationDescriptor->wTotalLength;
if(cbout >= length){
RtlCopyMemory(pch,
(PUCHAR) configurationDescriptor,
length);
info = length;
status = STATUS_SUCCESS;
}
else {
info = 0;
status = STATUS_INVALID_PARAMETER;
}
break;
} // IOCTL_USBGPS_GET_CONFIG_DESCRIPTOR
case IOCTL_USBGPS_RESET_DEVICE: // code == 0x801
{ // IOCTL_USBGPS_RESET_DEVICE
// TODO insert code here to handle this IOCTL, which uses METHOD_BUFFERED
break;
} // IOCTL_USBGPS_RESET_DEVICE
case IOCTL_USBGPS_RESET_PIPE: // code == 0x802
{ // IOCTL_USBGPS_RESET_PIPE
// TODO insert code here to handle this IOCTL, which uses METHOD_BUFFERED
break;
} // IOCTL_USBGPS_RESET_PIPE
case IOCTL_USBGPS_BULK_WRITE: // code == 0x803
{ // IOCTL_USBGPS_USBGPS_WRITE
if(ioBuffer && cbin >= 0 && cbout >= 0)
{
URB urb ;
pch = (PUCHAR) ioBuffer;
UsbBuildInterruptOrBulkTransferRequest(&urb,
sizeof( _URB_BULK_OR_INTERRUPT_TRANSFER),
pdx->Pipe1,
pch,
NULL,
cbin,
USBD_SHORT_TRANSFER_OK,
NULL);
status = SendAwaitUrb(fdo,&urb);
if(NT_SUCCESS(status))
info = cbin;
else
info = 0;
// TODO insert code here to handle this IOCTL, which uses METHOD_BUFFERED
}
break;
} // IOCTL_USBGPS_TEST_LED
case IOCTL_USBGPS_BULK_READ:
{
if(ioBuffer && cbin >= 0 && cbout >= 0)
{
URB urb ;
pch = (PUCHAR) ioBuffer;
UsbBuildInterruptOrBulkTransferRequest(&urb,
sizeof( _URB_BULK_OR_INTERRUPT_TRANSFER),
pdx->Pipe0,
pch,
NULL,
cbout,
USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK,
NULL);
status = SendAwaitUrb(fdo,&urb);
if(NT_SUCCESS(status))
info = cbout;
else
info = 0;
}
break;
}
case IOCTL_USBGPS_BULK1_WRITE: // Write to RXD3 of USBN9603
{
if(ioBuffer && cbin >= 0 && cbout >= 0)
{
URB urb ;
pch = (PUCHAR) ioBuffer;
UsbBuildInterruptOrBulkTransferRequest(&urb,
sizeof( _URB_BULK_OR_INTERRUPT_TRANSFER),
pdx->Pipe3,
pch,
NULL,
cbin,
USBD_SHORT_TRANSFER_OK,
NULL);
status = SendAwaitUrb(fdo,&urb);
if(NT_SUCCESS(status))
info = cbin;
else
info = 0;
// TODO insert code here to handle this IOCTL, which uses METHOD_BUFFERED
}
break;
}
case IOCTL_USBGPS_BULK1_READ: // Read from TXD3 of USBN9603
{
if(ioBuffer && cbin >= 0 && cbout >= 0)
{
URB urb ;
ULONG idx ;
pch = (PUCHAR) ioBuffer;
// for(idx = 0; idx<20; idx++)
{
UsbBuildInterruptOrBulkTransferRequest(&urb,
sizeof( _URB_BULK_OR_INTERRUPT_TRANSFER),
pdx->Pipe2,
pch, //(PUCHAR)(pch+idx*191),
NULL,
cbout, //191
USBD_SHORT_TRANSFER_OK,
NULL);
status = SendAwaitUrb(fdo,&urb);
}
if(NT_SUCCESS(status))
info = cbout;
else
info = 0;
}
break;
}
case IOCTL_USBGPS_BULK1_RD_WR: // write then read from TXD3 of USBN9603
{
if(ioBuffer && cbin >= 0 && cbout >= 0)
{
URB urb ; // first write the data to USBN9603
pch = (PUCHAR) ioBuffer;
UsbBuildInterruptOrBulkTransferRequest(&urb,
sizeof( _URB_BULK_OR_INTERRUPT_TRANSFER),
pdx->Pipe3,
pch,
NULL,
cbin,
USBD_SHORT_TRANSFER_OK,
NULL);
status = SendAwaitUrb(fdo,&urb);
// I should write some code the check status here.
pch = (PUCHAR) ioBuffer; // then read from USBN9603
UsbBuildInterruptOrBulkTransferRequest(&urb,
sizeof( _URB_BULK_OR_INTERRUPT_TRANSFER),
pdx->Pipe2,
pch,
NULL,
cbout, //376
USBD_SHORT_TRANSFER_OK,
NULL);
status = SendAwaitUrb(fdo,&urb);
if(NT_SUCCESS(status))
info = cbout;
else
info = 0;
}
break;
}
default:
status = STATUS_INVALID_DEVICE_REQUEST;
break;
} // process request
IoReleaseRemoveLock(&pdx->RemoveLock, Irp);
return CompleteRequest(Irp, status, info);
} // DispatchControl
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -