说明

没什么特别的,只是用来测试在WIN10上写驱动,包含最基本的通信代码。
又水了一篇博客,哈哈哈。
注意驱动路径发生改变时,不要忘了修改注册表的值。
https://blog.csdn.net/Kwansy/article/details/113182501

驱动

#include <ntddk.h>#define DEVICE_NAME L"\\device\\ntdrv"
#define LINK_NAME L"\\dosdevices\\ntdrv"#define IOCTRL_BASE 0x800#define MYIOCTRL_CODE(i) \CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTRL_BASE+i, METHOD_BUFFERED,FILE_ANY_ACCESS)#define CTL_PRINT MYIOCTRL_CODE(0)// 通用的分发函数
NTSTATUS DispatchCommon(PDEVICE_OBJECT pObject, PIRP pIrp)
{pIrp->IoStatus.Status = STATUS_SUCCESS; // 返回给应用层pIrp->IoStatus.Information = 0; // 读写字节数IoCompleteRequest(pIrp, IO_NO_INCREMENT);return STATUS_SUCCESS; // 返回给内核层IO管理器
}// 我们唯一关心的IRP分发函数
NTSTATUS DispatchIoctrl(PDEVICE_OBJECT pObject, PIRP pIrp)
{ULONG i;ULONG nIoctrlCode = 0;PVOID pInputBuff = NULL;PVOID pOutputBuff = NULL;ULONG nInputBufferLength = 0;ULONG nOutputBufferLength = 0;ULONG nOutput = 0;PIO_STACK_LOCATION pStack = NULL;pInputBuff = pOutputBuff = pIrp->AssociatedIrp.SystemBuffer;pStack = IoGetCurrentIrpStackLocation(pIrp);nInputBufferLength = pStack->Parameters.DeviceIoControl.InputBufferLength;nOutputBufferLength = pStack->Parameters.DeviceIoControl.OutputBufferLength;nIoctrlCode = pStack->Parameters.DeviceIoControl.IoControlCode;switch (nIoctrlCode){case CTL_PRINT:DbgPrint("%s\n", pInputBuff);for (i = 0; i < strlen(pInputBuff) && i < nInputBufferLength; i++){((PCHAR)pInputBuff)[i] = (UCHAR)toupper(((PCHAR)pInputBuff)[i]);}nOutput = nOutputBufferLength;break;default:DbgPrint("Unknown iocontrol\n");}pIrp->IoStatus.Status = STATUS_SUCCESS;pIrp->IoStatus.Information = nOutput;IoCompleteRequest(pIrp, IO_NO_INCREMENT);return STATUS_SUCCESS;}// 驱动卸载函数,做一些必要的清理
VOID DriverUnload(PDRIVER_OBJECT pDriverObject)
{UNICODE_STRING uLinkName = { 0 };RtlInitUnicodeString(&uLinkName, LINK_NAME);IoDeleteSymbolicLink(&uLinkName);IoDeleteDevice(pDriverObject->DeviceObject);DbgPrint("Driver unloaded\n");}// 驱动入口
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pRegPath)
{UNICODE_STRING uDeviceName = { 0 };UNICODE_STRING uLinkName = { 0 };NTSTATUS ntStatus = 0;PDEVICE_OBJECT pDeviceObject = NULL;ULONG i = 0;DbgPrint("Driver load begin\n");RtlInitUnicodeString(&uDeviceName, DEVICE_NAME);RtlInitUnicodeString(&uLinkName, LINK_NAME);ntStatus = IoCreateDevice(pDriverObject,0, &uDeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDeviceObject);if (!NT_SUCCESS(ntStatus)){DbgPrint("IoCreateDevice failed:%x", ntStatus);return ntStatus;}pDeviceObject->Flags |= DO_BUFFERED_IO;ntStatus = IoCreateSymbolicLink(&uLinkName, &uDeviceName);if (!NT_SUCCESS(ntStatus)){IoDeleteDevice(pDeviceObject);DbgPrint("IoCreateSymbolicLink failed:%x\n", ntStatus);return ntStatus;}for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++){pDriverObject->MajorFunction[i] = DispatchCommon;}pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctrl;pDriverObject->DriverUnload = DriverUnload;DbgPrint("Driver load ok!\n");return STATUS_SUCCESS;
}

加载器

#include <windows.h>
#include <winsvc.h>
#include <conio.h>
#include <stdio.h>
#include <winioctl.h>#define DRIVER_NAME L"ntdrv"
#define DRIVER_PATH L"MyDriver1.sys"
#define LINK_NAME "\\\\.\\ntdrv"#define IOCTRL_BASE 0x800#define MYIOCTRL_CODE(i) \CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTRL_BASE+i, METHOD_BUFFERED,FILE_ANY_ACCESS)#define CTL_PRINT MYIOCTRL_CODE(0)// 加载驱动
BOOL LoadDriver(PCWSTR lpszDriverName, PCWSTR lpszDriverPath)
{// 获取驱动完整路径WCHAR szDriverFullPath[MAX_PATH] = { 0 };GetFullPathNameW(lpszDriverPath, MAX_PATH, szDriverFullPath, NULL);//printf("%s\n", szDriverFullPath);// 打开服务控制管理器SC_HANDLE hServiceMgr = NULL; // SCM管理器句柄    hServiceMgr = OpenSCManagerW(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (NULL == hServiceMgr){printf("OpenSCManagerW 失败, %d\n", GetLastError());return FALSE;}//printf("打开服务控制管理器成功.\n");// 创建驱动服务SC_HANDLE hServiceDDK = NULL; // NT驱动程序服务句柄hServiceDDK = CreateServiceW(hServiceMgr,lpszDriverName,lpszDriverName,SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_IGNORE,szDriverFullPath,NULL,NULL,NULL,NULL,NULL);if (NULL == hServiceDDK){DWORD dwErr = GetLastError();if (dwErr != ERROR_IO_PENDING && dwErr != ERROR_SERVICE_EXISTS){printf("创建驱动服务失败, %d\n", dwErr);return FALSE;}}//printf("创建驱动服务成功.\n");// 驱动服务已经创建,打开服务hServiceDDK = OpenServiceW(hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS);if (!StartService(hServiceDDK, NULL, NULL)){DWORD dwErr = GetLastError();if (dwErr != ERROR_SERVICE_ALREADY_RUNNING){printf("运行驱动服务失败, %d\n", dwErr);return FALSE;}}//printf("运行驱动服务成功.\n");if (hServiceDDK){CloseServiceHandle(hServiceDDK);}if (hServiceMgr){CloseServiceHandle(hServiceMgr);}return TRUE;
}// 卸载驱动
void UnloadDriver(PCWSTR lpszDriverName)
{SC_HANDLE hServiceMgr = OpenSCManagerW(0, 0, SC_MANAGER_ALL_ACCESS);SC_HANDLE hServiceDDK = OpenServiceW(hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS);SERVICE_STATUS SvrStatus;ControlService(hServiceDDK, SERVICE_CONTROL_STOP, &SvrStatus);DeleteService(hServiceDDK);if (hServiceDDK){CloseServiceHandle(hServiceDDK);}if (hServiceMgr){CloseServiceHandle(hServiceMgr);}
}//测试驱动程序
void TestDriver()
{HANDLE hDevice = CreateFileA(LINK_NAME,GENERIC_WRITE | GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);if (hDevice == INVALID_HANDLE_VALUE){printf("Create Device Failed %d ! \n", GetLastError());return;}DWORD dwRead = 0;DWORD dwWrite = 0;char bufInput[1024] = { 0 };char bufOutput[1024] = { 0 };DWORD dwRet = 0;printf("Enter a string: ");scanf("%s", bufInput);DeviceIoControl(hDevice,CTL_PRINT,bufInput,1024,bufOutput,1024,&dwRet,NULL);printf("Driver return string: %s\n", bufOutput);printf("DeviceIoControl done!\n");CloseHandle(hDevice);
}int main(int argc, char *argv[])
{//加载驱动BOOL bRet = LoadDriver(DRIVER_NAME, DRIVER_PATH);if (!bRet){printf("LoadNTDriver error\n");return 0;}//加载成功printf("press any key to create device!\n");_getch();TestDriver();//这时候你可以通过注册表,或其他查看符号连接的软件验证。  printf("press any key to stop service!\n");_getch();//卸载驱动UnloadDriver(DRIVER_NAME);return 0;
}

Win10 KMD驱动模板,应用层向内核传一个字符串,内核把它转成大写相关推荐

  1. 编程模板中给出了一个字符串,其中包含了含有重复的人名,请直接输出出现最多的人名。

    s = '''双儿 洪七公 赵敏 赵敏 逍遥子 鳌拜 殷天正 金轮法王 乔峰 杨过 洪七公 郭靖 杨逍 鳌拜 殷天正 段誉 杨逍 慕容复 阿紫 慕容复 郭芙 乔峰 令狐冲 郭芙 金轮法王 小龙女 杨过 ...

  2. 【Java基础】前端传一个数组或者集合后台怎么接受(案例详解)

    [辰兮要努力]:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端.后台.数据 ...

  3. win7、win10关闭驱动签名,进入驱动测试模式,以及常见初级问题的解决

    win7关闭驱动签名,进入驱动测试模式 win7.win10关闭驱动签名.进入驱动测试模式 方式一: 方式二:批处理文件实现:管理员权限打开win7-win10驱动测试模式 方式三: DebugVie ...

  4. linux驱动 — 字符设备驱动模板

    背景 最近学习字符设备驱动,其大致的框架与流程都基本搞懂了,为了方便以后代码重用,写了一个较为完善的模板, 功能包括自动创建字符设备,/dev下自动创建设备文件,实现了open.read.write. ...

  5. linux内核创建节点,Linux内核驱动自动创建设备节点文件

    Linux下生成驱动设备节点文件的方法有3个:1.手动mknod:2.利用devfs:3.利用udev 在刚开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点,实际上L ...

  6. 【Linux开发】linux设备驱动归纳总结(七):2.内核定时器

    linux设备驱动归纳总结(七):2.内核定时器 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  7. Linux MTD子系统 _从模型分析到Flash驱动模板

    MTD(Memory Technology Device)即常说的Flash等使用存储芯片的存储设备,MTD子系统对应的是块设备驱动框架中的设备驱动层,可以说,MTD就是针对Flash设备设计的标准化 ...

  8. netlink实现驱动和应用层通信

    1.netlink及相关接口说明         说到驱动和应用层进行数据通信,很多人就会想到使用传统的ioctl,诚然,很多时候应用层调用驱动进行参数配置和参数获取使用的也正是ioctl的方式,但这 ...

  9. onethink后台使用上传驱动时,文件上传失败

    onethink后台最近使用阿里云的OSS上传驱动上传文件(thinkphp没有OSS驱动,自己百度找的一个驱动),碰到一个问题:后台建模的时候,选择了上传文件类型,但是实际上传失败,要么上传成功,插 ...

最新文章

  1. 如果给你500万,让你朝对象腿上开一枪,你愿意吗?
  2. php str cmp,php中整数的strcmp equivalent(intcmp)
  3. 如何判断国际会议是否被EI收录
  4. 又拍云 php,GitHub - NoDurex/php-sdk: 又拍云存储PHP SDK
  5. Linux系统内存管理实验报告,Linux 内存管理 综合实验报告.pdf
  6. Nodejs内存控制详解(上篇)
  7. css模拟select设置高度在ie67下有效(也可作为去除边框)
  8. udp聊天?使用udp+python实现多人聊天室
  9. larave 5 could not be opened: failed to open stream: Permission denied
  10. 【视频直播篇五】vue-cli3集成vue-aliplayer-v2
  11. 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323
  12. 慕课网上socket课程的学习
  13. SQL不同服务器数据库之间的数据操作整理(完整版)(转)
  14. mysql查字段的备注_mysql怎么查看字段的备注
  15. 28届计算机表演赛辽宁赛区,第十九届计算机表演赛辽宁赛区网络基础类竞赛结果.doc...
  16. python3计算长方形的周长和面积
  17. 停车场的道闸系统设计
  18. 修正aimp800可重複產生在製盤點標籤BUG
  19. 目前所有的视频格式都有哪些?
  20. 电大计算机期末试题,电大《计算机》期末考试试题及答案

热门文章

  1. 成功解决.ReadTimeoutError: HTTPSConnectionPool(host=‘pypi.tuna.tsinghua.edu.cn‘, port=443): Read timed o
  2. Python:numpy库中的一些函数简介、使用方法之详细攻略
  3. Py之chatterbot-corpus:python包之chatterbot-corpus包简介、安装、使用方法之详细攻略
  4. TensorFlow:深度学习框架TensorFlow TensorFlow_GPU的简介、安装、测试之详细攻略
  5. ML之SVM:SVM算法的简介、应用、经典案例之详细攻略
  6. Java回调机制解析
  7. jquery 加法 乘法运算 精确计算函数
  8. [BZOJ]1503: [NOI2004]郁闷的出纳员
  9. flot中文API(转载)
  10. 【译】在ASP.Net和IIS中删除不必要的HTTP响应头