用户部分代码:

int main()
{
HANDLE hDevice = CreateFile(L"\\\\.\\MyTest", GENERIC_READ | GENERIC_WRITE, , NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDevice==INVALID_HANDLE_VALUE)
{
printf("Failed to obtain device handle...");
getchar();
return ;
} UCHAR buffer[];
ULONG size;
LPDWORD ll;
BOOL result = ReadFile(hDevice, buffer, , &size, NULL);
if (result)
{
printf("READ %d BYTES...", size);
for (size_t i = ; i < (size_t)size; i++)
{
printf("%02x\n", buffer[i]);
}
}
CloseHandle(hDevice);
getchar();
return ;
}

驱动部分代码:

#include <ntddk.h>

#define DEVICE_NAME L"\\Device\\MyTestDevice"
#define SYMBOL_LINK_NAME L"\\??\\MyTest" PDEVICE_OBJECT pDevice;
UNICODE_STRING DeviceName;
UNICODE_STRING SymbolLinkName; NTSTATUS DeviceCreate(PDEVICE_OBJECT pDeviceObject,PIRP pIrp);
NTSTATUS DeviceClose(PDEVICE_OBJECT pDeviceObject, PIRP pIrp);
NTSTATUS DeviceRead(PDEVICE_OBJECT pDeviceObject, PIRP pIrp); NTSTATUS unload(PDRIVER_OBJECT driver)
{
DbgPrint("driver :%ws unload", driver->DriverName);
DbgPrint("driver unload success...");
IoDeleteSymbolicLink(&SymbolLinkName);
IoDeleteDevice(pDevice);
return STATUS_SUCCESS;
} NTSTATUS DriverEntry(PDRIVER_OBJECT driver,PUNICODE_STRING reg_path)
{
NTSTATUS ntstatus = STATUS_SUCCESS;
driver->DriverUnload = unload;
driver->MajorFunction[IRP_MJ_CREATE] = DeviceCreate;//创建
driver->MajorFunction[IRP_MJ_READ] = DeviceRead;//通信
driver->MajorFunction[IRP_MJ_CLOSE] = DeviceClose;//关闭 RtlInitUnicodeString(&DeviceName, DEVICE_NAME);
RtlInitUnicodeString(&SymbolLinkName, SYMBOL_LINK_NAME); ntstatus = IoCreateDevice(driver, , &DeviceName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &pDevice);
if (!NT_SUCCESS(ntstatus))
{
DbgPrint("IoCreateDevice Failed");
return ntstatus;
} ntstatus = IoCreateSymbolicLink(&SymbolLinkName, &DeviceName);
if (!NT_SUCCESS(ntstatus))
{
DbgPrint("IoCreateSymbolicLink Failed");
IoDeleteDevice(pDevice);
return ntstatus;
} pDevice->Flags |= DO_BUFFERED_IO;
DbgPrint("%ws", reg_path->Buffer);
DbgPrint("driver load success...");
return STATUS_SUCCESS;
} NTSTATUS DeviceCreate(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
{
//业务代码区 //设置返回状态
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = ;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
DbgPrint("create device success...%d",pDeviceObject->ActiveThreadCount);//这里蛋疼得狠,vs2019里,pDeviceObject不用一下,编译就报错,所有派遣函数一样
return STATUS_SUCCESS;
} NTSTATUS DeviceClose(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
{
//业务代码区 //设置返回状态
pIrp->IoStatus.Status = STATUS_SUCCESS;//getLastError()得到的值
pIrp->IoStatus.Information = ; //返回给3环多少数据,没有填0
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
DbgPrint("create device success...%d", pDeviceObject->ActiveThreadCount);
return STATUS_SUCCESS;
} NTSTATUS DeviceRead(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
{
PIO_STACK_LOCATION iostack;
iostack = IoGetCurrentIrpStackLocation(pIrp);
ULONG length = iostack->Parameters.Read.Length;
PVOID pBuffer = pIrp->AssociatedIrp.SystemBuffer; pIrp->IoStatus.Status = STATUS_SUCCESS;//getLastError()得到的值
pIrp->IoStatus.Information = length; //返回给3环多少数据,没有填0
RtlFillMemory(pBuffer,length,0xAA);
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
DbgPrint("read device success...%d", pDeviceObject->ActiveThreadCount);
return STATUS_SUCCESS;
}

最新文章

  1. 设置UITableView的separatorInset值为UIEdgeInsetsZero,分隔线不最左端显示的问题
  2. python实验一:画图
  3. DevExpress 13.1.8全面支持VS2013
  4. 二模 (16) day1&amp;day2
  5. linux命令细究
  6. bootstrap multiselect两大组件
  7. 【LINUX】Linux学习小结
  8. DB2 重新设定表自增字段的当前值
  9. 关于KOBE 退役
  10. MM32/STM32中断和事件梳理
  11. 一定要学会OutputDebugString,方便源码级调试
  12. Invalid content was found starting with element &#39;taglib&#39;”
  13. Why AIXTHREAD_SCOPE Should Be Set To &#39;S&#39; On AIX
  14. projecteuler之58题Spiral primes
  15. jQuery 瀑布流插件: Wookmark
  16. 使用shell快速建立上万个文件夹
  17. WinForm动态查询
  18. CentOS和RedHat Linux的区别
  19. Hadoop -- ES -- CURD
  20. CentOS上开启MySQL远程访问权限

热门文章

  1. 树莓派4B踩坑指南 - (9)安装Git和Docker
  2. php海量架构
  3. 概念 - 抖脚(Fidgeting)
  4. 关于定时执行任务:Crontab的20个例子
  5. hbase入门-相关概念
  6. Maven打包项目失败;报错:Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.1.1:war (default-war) on project Hello: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/we
  7. 十 Spring的AOP的底层实现:JDK动态代理和Cglib动态代理
  8. 腾讯玄武实验室向(CNVD)提交了一个重大漏洞“BucketShock”
  9. bat批处理下如何像shell一样将命令执行的效果赋值给变量
  10. 【PAT甲级】1032 Sharing (25 分)