提示:
1.应用层的符号链接不要使用L,宽字符!!!
2.任何宏定义后面都不能有分号!!!
#include <stdio.h>#include <windows.h>//应用层的符号链接不要使用L,宽字符!!!#define SYMBOLIC_NAME "\\\\.\\sym_name"//任何宏定义后面都不能有分号!!!#define CTL_CODE_BASE 0x8000#define CTL_ALLCODE(i) CTL_CODE(FILE_DEVICE_UNKNOWN,CTL_CODE_BASE+i,METHOD_BUFFERED,FILE_ANY_ACCESS)#define CTL_TALK CTL_ALLCODE(1)int main(){ HANDLE hDevice = NULL; char buff[] = "demo" ; char codebuff[5] = "less"; DWORD retlen = NULL; hDevice = CreateFile(SYMBOLIC_NAME, GENERIC_ALL, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); printf("错误码:%d\n", GetLastError()); if (hDevice < 0) { printf("打开文件失败"); } printf("handle:%d\n", hDevice); BOOL flag = WriteFile(hDevice, buff, 1024, &retlen, NULL); if (!flag) { printf("写入失败"); } do { printf("请输入你要传入内核的字符串:"); scanf_s("%s", &codebuff); flag = DeviceIoControl(hDevice, CTL_TALK, codebuff, strlen(codebuff), NULL, 0, &retlen, NULL); if (!flag) { printf("控制码通信失败"); } } while (1); system("pause");}
#include <ntddk.h>#define DEVICE_NAME L"\\device\\mydevice"#define SYMBOLIC_NAME L"\\dosdevices\\sym_name"#define CTL_CODE_BASE 0x8000#define CTL_CMD(i) CTL_CODE(FILE_DEVICE_UNKNOWN,CTL_CODE_BASE+i,METHOD_BUFFERED,FILE_ANY_ACCESS)#define CTL_TALK CTL_CMD(1)NTSTATUS DispatchControl(PDEVICE_OBJECT pDevice, PIRP pIrp){ PVOID pBuff = pIrp->AssociatedIrp.SystemBuffer; PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp); ULONG CtlCode = pStack->Parameters.DeviceIoControl.IoControlCode; ULONG uLen = { 0 }; uLen = strlen(pBuff); switch (CtlCode) { case CTL_TALK: { DbgPrint("长度:%d", uLen); DbgPrint("接收到的数据为:%s",pBuff); } default: break; } pIrp->IoStatus.Information = 0; pIrp->IoStatus.Status = STATUS_SUCCESS; IoCompleteRequest(pIrp, IO_NO_INCREMENT); return STATUS_SUCCESS;}NTSTATUS DispatchCreate(PDEVICE_OBJECT pDeviceObject, PIRP pIrp){ DbgPrint("Create!"); //设置IRP处理已经成功了 pIrp->IoStatus.Status = STATUS_SUCCESS; //返回多少字节的数据 pIrp->IoStatus.Information = 0; //结束IRP处理流程 IoCompleteRequest(pIrp, IO_NO_INCREMENT); //函数调用成功 return STATUS_SUCCESS;}NTSTATUS DispatchRead(PDEVICE_OBJECT pDevice, PIRP pIrp){ ULONG retlen = 0; PVOID pMes = pIrp->AssociatedIrp.SystemBuffer; DbgPrint("%c", (char *)pMes); pIrp->IoStatus.Information = retlen; pIrp->IoStatus.Status = STATUS_SUCCESS; //表示调用者已经完成了给定I/O请求的所有处理,并将给定的IRP返回给I/O管理器 IoCompleteRequest(pIrp,IO_NO_INCREMENT); return STATUS_SUCCESS;}VOID UnloadDriver(PDRIVER_OBJECT pDriver){ UNICODE_STRING uSyb_Name = RTL_CONSTANT_STRING(SYMBOLIC_NAME); IoDeleteDevice(pDriver->DeviceObject); IoDeleteSymbolicLink(&uSyb_Name); DbgPrint("卸载成功");}NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pRegpath){ PDEVICE_OBJECT pDevice = NULL; UNICODE_STRING uDeciceName = RTL_CONSTANT_STRING(DEVICE_NAME); UNICODE_STRING uSyb_Name = RTL_CONSTANT_STRING(SYMBOLIC_NAME); NTSTATUS status = STATUS_SUCCESS; status = IoCreateDevice(pDriver, 0, &uDeciceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDevice); if (!NT_SUCCESS(status)) { DbgPrint("创建设备失败\n"); } status = IoCreateSymbolicLink(&uSyb_Name, &uDeciceName); if (!NT_SUCCESS(status)) { DbgPrint("创建符号链接失败\n"); } pDevice->Flags |= DO_BUFFERED_IO; pDriver->MajorFunction[IRP_MJ_CREATE] = DispatchCreate; pDriver->MajorFunction[IRP_MJ_WRITE] = DispatchRead; pDriver->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchControl; DbgPrint("驱动加载成功"); pDriver->DriverUnload = UnloadDriver; return STATUS_SUCCESS;}