📄 ioctrl.c
字号:
#include "driver.h"
typedef struct _PACKET_OID_DATA {
ULONG Oid;
ULONG Length;
UCHAR Data[1];
}PACKET_OID_DATA, *PPACKET_OID_DATA;
#define IOCTL_PROTOCOL_QUERY_OID 0
#define IOCTL_PROTOCOL_SET_OID 1
/////////////////////////////////////////////////////////////////////////////
NTSTATUS CompleteIrp( IN PIRP Irp, IN NTSTATUS status, IN ULONG info)
{
Irp->IoStatus.Status = status; //设置为一个NTSTATUS的状态码
Irp->IoStatus.Information = info; //通常存储传输的字节数
IoCompleteRequest(Irp,IO_NO_INCREMENT);
return status;
}
/////////////////////////////////////////////////////////////////////////////
// 处理 创建/打开 IRP_MJ_CREATE 请求
NTSTATUS ROpen( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
DbgPrint("ROpen:\n");
return CompleteIrp(Irp,STATUS_SUCCESS,0);
}
/////////////////////////////////////////////////////////////////////////////
// 处理关闭文件 IRP_MJ_CLOSE 请求 如果设备没有开始允许关闭结束
NTSTATUS RClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
DbgPrint("RClose:\n");
return CompleteIrp(Irp,STATUS_SUCCESS,0);
}
/////////////////////////////////////////////////////////////////////////////
// 处理 读 IRP_MJ_READ 请求
NTSTATUS RRead( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
DbgPrint(("RRead\n"));
return CompleteIrp(Irp,STATUS_SUCCESS,0);
}
/////////////////////////////////////////////////////////////////////////////
// 处理 写 IRP_MJ_WRITE 请求
NTSTATUS RWrite( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
DbgPrint(("RWrite\n"));
return CompleteIrp(Irp,STATUS_SUCCESS,0);
}
///////////////////////////////////////////////////////////////////
// 处理 DeviceIoControl IRP_MJ_DEVICE_CONTROL 请求
NTSTATUS RIoControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
NTSTATUS status = STATUS_SUCCESS;
PPACKET_OID_DATA OidData;
ULONG retByte, needByte;
PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp);
ULONG functionCode=irpSp->Parameters.DeviceIoControl.IoControlCode;
if(functionCode == IOCTL_PROTOCOL_SET_OID)
{
OidData = Irp->AssociatedIrp.SystemBuffer;
status = RSet(g_adapter,
OidData->Oid,
OidData->Data,
OidData->Length,
&retByte,
&needByte);
OidData->Length = retByte;
}else
if(functionCode == IOCTL_PROTOCOL_QUERY_OID)
{
OidData = Irp->AssociatedIrp.SystemBuffer;
status = RQuery(g_adapter,
OidData->Oid,
OidData->Data,
OidData->Length,
&retByte,
&needByte );
OidData->Length = retByte;
}else
return CompleteIrp(Irp,STATUS_SUCCESS,0);
return CompleteIrp(Irp,status,irpSp->Parameters.DeviceIoControl.InputBufferLength);
}
///////////////////////////////////////////////////////////////////
// 处理 IRP_MJ_CLEANUP 请求
NTSTATUS RCleanup( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
DbgPrint(("RCleanup\n"));
return CompleteIrp(Irp,STATUS_SUCCESS,0);
}
/////////////////////////////////////////////////////////////////////
// 卸载驱动程序例程
VOID RUnload( IN PDRIVER_OBJECT DriverObject)
{
NDIS_STATUS status;
DbgPrint(("Unload Enter\n"));
IoDeleteSymbolicLink(&win32SymbolicLinkName);
if(g_deviceObject)
IoDeleteDevice(g_deviceObject);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -