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

📄 rw.c

📁 用C语言写得PCI8052的WDM结构驱动程序
💻 C
字号:
// 
// 
//  IOCTL read /write interface for Win32 access. 
//
// 

//  Programmer:桂凯    西安电子科技大学
// 
//  email:wwwguikai@21cn.com
//  All right reserved 

#include <ntddk.h>
#include <ndis.h>
#include <pci9052hw.h>
#include <pci9052sw.h>

// 读出
NTSTATUS 
Read9052(
    IN PDEVICE_OBJECT DeviceObject, 
    PIRP Irp
    )
{   
    PDEVICE_EXTENSION deviceExt = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension; // 获得device-extention
    PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp); //关键是得到传送的数据字节数目,和Irp->AssociatedIrp.SystemBuffer
    PULONG dataptr = NULL;
    UCHAR data[4];
    PULONG port = (PULONG)deviceExt->PlxRegisterBaseAddr  + INTCSR; // interrupt control/status register. 
    ULONG value[1] ;
    if( irpSp->Parameters.Read.Length != 4)// 判断要读取的数据长度
    { 
    	  KdPrint(( "Read9052 \n"));
    	  Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
	  Irp->IoStatus.Information = 0;
    	 // IoCompleteRequest( Irp, IO_NO_INCREMENT);
          return(STATUS_UNSUCCESSFUL);
    }
    if( deviceExt->data_ready == FALSE ) // 判断数据现在有没有,没有的话自然就不能传送数据啦
    {
    	  Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
	  Irp->IoStatus.Information = 0;		  
    	 // IoCompleteRequest( Irp, IO_NO_INCREMENT);
          return(STATUS_UNSUCCESSFUL);    
     }
     value[0] = 0x0;
     memcpy( port, value, 4);
     
     KdPrint(( "Read9052 \n")); 
     
     dataptr = (PULONG)Irp->AssociatedIrp.SystemBuffer;
     if ( dataptr == NULL)
     {   KdPrint(( "Out Buffer is Empty \n"));
         return (STATUS_UNSUCCESSFUL);
     }     	
     else
     {
         memcpy(dataptr, (PULONG)deviceExt->data, 4);
         Irp->IoStatus.Information = 4;
         deviceExt->data_ready = FALSE;
         Irp->IoStatus.Status = STATUS_SUCCESS;
        // IoCompleteRequest( Irp, IO_NO_INCREMENT);
     
         value[0] = 0x0143;
         memcpy( port, value, 4); 
         return(STATUS_SUCCESS);
     }
     
}


NTSTATUS 
Write9052(
    IN PDEVICE_OBJECT DeviceObject, 
    PIRP Irp
    )
{   
    KdPrint(( "Write9052 \n"));
    return(STATUS_SUCCESS);
}

⌨️ 快捷键说明

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