#include <initguid.h>
#include "K1460Driver.h"
#include "comm.h"
#include "PCI.H"
#include "IOCTL.H"
#include "Interface.h"
#include "reg.h"
#pragma INITCODE
extern "C"
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{
KdPrint(("Enter DriverEntry\n"));
pDriverObj->DriverExtension->AddDevice = DispatchAddDevice;
pDriverObj->MajorFunction[IRP_MJ_PNP] = DispatchPnp;
pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoControl;
pDriverObj->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
pDriverObj->MajorFunction[IRP_MJ_READ] = DispatchRead;
pDriverObj->MajorFunction[IRP_MJ_WRITE] = DispatchWrite;
pDriverObj->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
pDriverObj->DriverUnload = DispatchDriverUnload;
KdPrint(("Leave DriverEntry\n"));
return STATUS_SUCCESS;
}
#pragma PAGEDCODE
NTSTATUS DispatchAddDevice(IN PDRIVER_OBJECT DriverObject,IN PDEVICE_OBJECT PhysicalDeviceObject)
{
PAGED_CODE();
KdPrint(("Enter DispatchAddDEvice\n"));
NTSTATUS status;
PDEVICE_OBJECT fdo;
// UNICODE_STRING devName;
// RtlInitUnicodeString(&devName,L"\\Device\\K1460");
status = IoCreateDevice(
DriverObject,
sizeof(DEVICE_EXTENSION),
NULL,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&fdo);
if(!NT_SUCCESS(status))
{
KdPrint(("Create fdo error\n"));
return status;
}
PDEVICE_EXTENSION pdx =(PDEVICE_EXTENSION)fdo->DeviceExtension;
RtlZeroMemory(pdx,sizeof(DEVICE_EXTENSION));
pdx->nTimeOut = 3000;//Time out default 3s
pdx->pdo = PhysicalDeviceObject;
pdx->fdo = fdo;
pdx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo,PhysicalDeviceObject);
//创建设备接口
status = IoRegisterDeviceInterface(PhysicalDeviceObject, &K1460_PCI_DEVICE, NULL, &pdx->interfaceName);
if( !NT_SUCCESS(status))
{
KdPrint(("IoRegisterDeviceInterface erro\n"));
IoDeleteDevice(fdo);
return status;
}
KdPrint(("%wZ\n",&pdx->interfaceName));
IoSetDeviceInterfaceState(&pdx->interfaceName, TRUE);
/* UNICODE_STRING symLinkName;
RtlInitUnicodeString(&symLinkName,L"\\DosDevices\\K1460");
pdx->SymLinkName = symLinkName;
pdx->DeviceName = devName;
status = IoCreateSymbolicLink(&(UNICODE_STRING)symLinkName,&(UNICODE_STRING)devName);
if(!NT_SUCCESS(status))
{
KdPrint(("Create SymLinkName error\n"));
IoDeleteSymbolicLink(&pdx->SymLinkName);
return status;
}*/
//init interrupt dpc
KeInitializeDpc(&pdx->dpc, DpcForIsr, (PVOID)pdx);
//init event;
pdx->pCmdEvent = NULL;
pdx->pCmdEvent = (KEVENT*)ExAllocatePool(NonPagedPool,sizeof(KEVENT));
if(pdx->pCmdEvent == NULL)
{
KdPrint(("分配pCmeEvent空间失败"));
IoDeleteDevice( fdo );
return STATUS_UNSUCCESSFUL;
}
KeInitializeEvent(pdx->pCmdEvent,SynchronizationEvent ,FALSE);
pdx->pDmaEvent = NULL;
pdx->pDmaEvent = (KEVENT*)ExAllocatePool(NonPagedPool,sizeof(KEVENT));
if(pdx->pDmaEvent == NULL)
{
KdPrint(("分配pDmaEvent空间失败"));
IoDeleteDevice( fdo );
return STATUS_UNSUCCESSFUL;
}
KeInitializeEvent(pdx->pDmaEvent,SynchronizationEvent ,FALSE);
pdx->InterruptStatus = 0;
//init
fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
fdo->Flags &= ~DO_DEVICE_INITIALIZING;
KdPrint(("Leave DispatchAddDEvice\n"));
return STATUS_SUCCESS;
}
#pragma PAGEDCODE
NTSTATUS DispatchPnp(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
{
PAGED_CODE();
KdPrint(("Enter DispatchPnp"));
NTSTATUS status = STATUS_SUCCESS;
static char* fcnname[] =
{
"IRP_MN_START_DEVICE",
"IRP_MN_QUERY_REMOVE_DEVICE",
"IRP_MN_REMOVE_DEVICE",
"IRP_MN_CANCEL_REMOVE_DEVICE",
"IRP_MN_STOP_DEVICE",
"IRP_MN_QUERY_STOP_DEVICE",
"IRP_MN_CANCEL_STOP_DEVICE",
"IRP_MN_QUERY_DEVICE_RELATIONS",
"IRP_MN_QUERY_INTERFACE",
"IRP_MN_QUERY_CAPABILITIES",
"IRP_MN_QUERY_RESOURCES",
"IRP_MN_QUERY_RESOURCE_REQUIREMENTS",
"IRP_MN_QUERY_DEVICE_TEXT",
"IRP_MN_FILTER_RESOURCE_REQUIREMENTS",
"",
"IRP_MN_READ_CONFIG",
"IRP_MN_WRITE_CONFIG",
"IRP_MN_EJECT",
"IRP_MN_SET_LOCK",
"IRP_MN_QUERY_ID",
"IRP_MN_QUERY_PNP_DEVICE_STATE",
"IRP_MN_QUERY_BUS_INFORMATION",
"IRP_MN_DEVICE_USAGE_NOTIFICATION",
"IRP_MN_SURPRISE_REMOVAL",
};
static NTSTATUS (*funtab[])(PDEVICE_EXTENSION pdx,PIRP Irp) =
{
HandleStartDevice, // IRP_MN_START_DEVICE 驱动加载启动
DefaultPnpHandler, // IRP_MN_QUERY_REMOVE_DEVICE
HandleRemoveDevice, // IRP_MN_REMOVE_DEVICE
DefaultPnpHandler, // IRP_MN_CANCEL_REMOVE_DEVICE
DefaultPnpHandler, // IRP_MN_STOP_DEVICE // stopDevice
DefaultPnpHandler, // IRP_MN_QUERY_STOP_DEVICE
DefaultPnpHandler, // IRP_MN_CANCEL_STOP_DEVICE
DefaultPnpHandler, // IRP_MN_QUERY_DEVICE_RELATIONS
DefaultPnpHandler, // IRP_MN_QUERY_INTERFACE
DefaultPnpHandler, // IRP_MN_QUERY_CAPABILITIES
DefaultPnpHandler, // IRP_MN_QUERY_RESOURCES
DefaultPnpHandler, // IRP_MN_QUERY_RESOURCE_REQUIREMENTS
DefaultPnpHandler, // IRP_MN_QUERY_DEVICE_TEXT
DefaultPnpHandler, // IRP_MN_FILTER_RESOURCE_REQUIREMENTS
DefaultPnpHandler, //
DefaultPnpHandler, // IRP_MN_READ_CONFIG
DefaultPnpHandler, // IRP_MN_WRITE_CONFIG
DefaultPnpHandler, // IRP_MN_EJECT
DefaultPnpHandler, // IRP_MN_SET_LOCK
DefaultPnpHandler, // IRP_MN_QUERY_ID
DefaultPnpHandler, // IRP_MN_QUERY_PNP_DEVICE_STATE
DefaultPnpHandler, // IRP_MN_QUERY_BUS_INFORMATION
DefaultPnpHandler, // IRP_MN_DEVICE_USAGE_NOTIFICATION
DefaultPnpHandler, // IRP_MN_SURPRISE_REMOVAL
};
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
PIO_STACK_LOCATION stackLocation = IoGetCurrentIrpStackLocation(Irp);
ULONG funirpid = stackLocation->MinorFunction;
if(funirpid >= arraysize(funtab))
{
status = DefaultPnpHandler(pdx,Irp);
return status;
}
else
{
KdPrint(("Enter Pnp Request:%s\n",fcnname[funirpid]));
status = (*funtab[funirpid])(pdx,Irp);
return status;
}
KdPrint(("Leave DispatchPnp"));
}
#pragma PAGEDCODE
NTSTATUS DispatchIoControl(IN PDEVICE_OBJECT fdo,IN PIRP pIrp)
{
PAGED_CODE();
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
PIO_STACK_LOCATION pStackLocation = IoGetCurrentIrpStackLocation(pIrp);
ULONG ulInputLength = pStackLocation->Parameters.DeviceIoControl.InputBufferLength;
ULONG IoControlCode = pStackLocation->Parameters.DeviceIoControl.IoControlCode;
NTSTATUS status = STATUS_SUCCESS;
//防止未定义的控制码
BOOLEAN IsCtrl = FALSE;
static STRUCT_FUN_POINTER fn[] =
{
{IOCTL_WRITE_REGISTER,PciWriteRegister},
{IOCTL_READ_REGISTER,PciReadRegister},
{IOCTL_SEND_CMD,PciSendCmd},
{IOCTL_SET_TIMEOUT,PciSetTimeOut},
{IOCTL_SET_PARAM,PciSetParam},
};
for(ULONG i=0;i<sizeof(fn)/sizeof(fn[0]);i++)
{
if(IoControlCode == fn[i].IoCtlCode )
{
status = (*fn[i].fn)(fdo,pIrp);
IsCtrl = TRUE;
break;
}
}
if(!IsCtrl)
{
KdPrint(("未定义的控制码!\n"));
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0;
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
return STATUS_SUCCESS;
}
return status;
}
#pragma PAGEDCODE
NTSTATUS DispatchCreate(IN PDEVICE_OBJECT fdo,IN PIRP pIrp)
{
PAGED_CODE();
KdPrint(("open device K1460 -- driver\n"));
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0;
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
return STATUS_SUCCESS;
}
#pragma PAGEDCODE
NTSTATUS DispatchClose(IN PDEVICE_OBJECT fdo,IN PIRP pIrp)
{
NTSTATUS status = STATUS_SUCCESS;
KdPrint(("Close Device \n"));
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0;
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
return status;
}
#pragma PAGEDCODE
VOID Dispatc
没有合适的资源?快使用搜索试试~ 我知道了~
基于PC的虚拟总线驱动开发
共32个文件
h:7个
sbr:3个
cpp:3个
需积分: 10 20 下载量 34 浏览量
2017-11-16
10:18:24
上传
评论
收藏 255KB ZIP 举报
温馨提示
基于PC的虚拟总线驱动开发 实现了 pxl9054硬件DMA驱动 wdm实现 虚拟总线程序
资源推荐
资源详情
资源评论
收起资源包目录
基于PC的虚拟总线驱动开发.zip (32个子文件)
K1460Driver
DriverDev.plg 1KB
SOURCES 98B
K1460Driver.cpp 15KB
K1460Driver.h 1KB
PLX9054.h 0B
K1460Driver.dsw 543B
PCI.h 715B
reg.h 661B
MyDriver_Check
Interface.obj 42KB
PCI.obj 46KB
K1460Driver.obj 56KB
K1460.sys 15KB
vc60.idb 41KB
PCI.sbr 0B
Interface.sbr 0B
K1460Driver.sbr 0B
K1460.pdb 161KB
K1460Driver.bsc 401KB
PCI.cpp 8KB
K1460Driver.dsp 4KB
Interface.cpp 6KB
makefile 252B
K1460Driver.plg 838B
Desktop.ini 76B
K1460Driver.opt 50KB
buildfre_wxp_x86.log 3KB
Ioctl.h 531B
K1460.inf 2KB
K1460Driver.ncb 49KB
comm.h 2KB
EzDriverInstaller.exe 56KB
Interface.h 479B
共 32 条
- 1
资源评论
站长漫谈
- 粉丝: 102
- 资源: 51
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于C++实现二叉树的创建,遍历,添加,查找与删除
- 基于C语言实现二叉树的基本操作
- 毕业设计基于STM32的测量温度与压力的数据处理设计C语言完整源码+论文.zip
- 基于MATLAB的PCA算法人脸识别项目源码+GUI界面+说明文档.zip
- 基于STM32的测量温度与压力的数据处理设计源码+论文(毕业设计).zip
- Vision Transformer 网络对不同氨气氧气浓度轨迹RAS 图像数据集的分类,包含训练权重和数据集、迁移学习
- 基于C51带字库LCD12864(ST7920)的keil工程源码,只支持8位并口通讯(不支持串口),可显示中文.zip
- 基于SI4463射频模块433MD-SMA无线模块软硬件技术资料及(SI4463)IC技术资料文档.zip
- (GPS+北斗+GSM)HLK-GS2503模块软硬件开发资料包硬件参考设计(原理图PCB)+技术文档资料.zip
- 基于BERT+Biaffine结构的关系抽取模型源码+文档说明.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功