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

📄 ioctrl.c

📁 RTL8139驱动源码
💻 C
字号:
#define	NDIS_WDM 1

#define NDIS_MINIPORT_DRIVER
#define NDIS50_MINIPORT   1 

#include "ndis.h"  // AFTER preceding directives
#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


extern PADAPTER			g_adapter;
extern PDEVICE_OBJECT   g_deviceObject;


NTSTATUS
RIoControl(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
{
	NTSTATUS            status = STATUS_SUCCESS;

    PIO_STACK_LOCATION  irpSp;
    ULONG               functionCode;

	PPACKET_OID_DATA	OidData;
	ULONG				retByte, needByte;


    irpSp = IoGetCurrentIrpStackLocation(Irp);
    functionCode=irpSp->Parameters.DeviceIoControl.IoControlCode;
//    DbgPrint("RIoControl:functionCode=0x%08x \n", functionCode);
 
	//   IoMarkIrpPending(Irp);

    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;
//		DbgPrint("RIoControl::OidData=%x,OidData->Oid=%x, OidData->Length=%x, OidData->Data=%x\n", OidData, OidData->Oid, OidData->Length,*((PULONG)OidData->Data));
	}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;
//		DbgPrint("RIoControl::OidData=%x,OidData->Oid=%x, OidData->Length=%x, OidData->Data=%x\n", OidData, OidData->Oid, OidData->Length,*((PULONG)OidData->Data));
	}else{
//		DbgPrint("RIoControl:unsuport oid request. \n");

        Irp->IoStatus.Status = STATUS_SUCCESS;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
  
		return STATUS_SUCCESS;
	}


	Irp->IoStatus.Information = irpSp->Parameters.DeviceIoControl.InputBufferLength;

//	status = STATUS_SUCCESS;
	Irp->IoStatus.Status = status;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    
	return status;
}



NTSTATUS
ROpen(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
{
    NTSTATUS            status = STATUS_SUCCESS;

 //   DbgPrint("ROpen:\n");

	Irp->IoStatus.Status = status;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    
    return status;
}



NTSTATUS
RClose(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
{
    NTSTATUS   status = STATUS_SUCCESS;

//    DbgPrint("RClose:\n");

	Irp->IoStatus.Status = status;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    
    return status;
}

NTSTATUS
RIoComplete(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    )
{

	return STATUS_SUCCESS;
}

NTSTATUS
RCleanup(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
{
    NTSTATUS            status = STATUS_SUCCESS;

 //   DbgPrint(("RCleanup\n"));

//    Irp->IoStatus.Information = 0;    
    Irp->IoStatus.Status = status;
    IoCompleteRequest (Irp, IO_NO_INCREMENT);

    return status;
}
NTSTATUS
RWrite(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
{
    NTSTATUS            status = STATUS_SUCCESS;

//    DbgPrint(("RCleanup\n"));

//    Irp->IoStatus.Information = 0;    
    Irp->IoStatus.Status = status;
    IoCompleteRequest (Irp, IO_NO_INCREMENT);

    return status;
}
NTSTATUS
RRead(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
{
    NTSTATUS            status = STATUS_SUCCESS;

//    DbgPrint(("RCleanup\n"));

//    Irp->IoStatus.Information = 0;    
    Irp->IoStatus.Status = status;
    IoCompleteRequest (Irp, IO_NO_INCREMENT);

    return status;
}

VOID
RUnload(
    IN PDRIVER_OBJECT DriverObject
    )
{
    NDIS_STATUS        status;
    UNICODE_STRING     win32DeviceName;

  //  DbgPrint(("Unload Enter\n"));

    RtlInitUnicodeString(&win32DeviceName, L"\\DosDevices\\miniport-rtl");
    IoDeleteSymbolicLink(&win32DeviceName);           
    if(g_deviceObject)
        IoDeleteDevice(g_deviceObject);
}


⌨️ 快捷键说明

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