提示:

1.应用层的符号链接不要使用L,宽字符!!!

2.任何宏定义后面都不能有分号!!!

  1. #include <stdio.h>
  2. #include <windows.h>
  3. //应用层的符号链接不要使用L,宽字符!!!
  4. #define SYMBOLIC_NAME "\\\\.\\sym_name"
  5. //任何宏定义后面都不能有分号!!!
  6. #define CTL_CODE_BASE 0x8000
  7. #define CTL_ALLCODE(i) CTL_CODE(FILE_DEVICE_UNKNOWN,CTL_CODE_BASE+i,METHOD_BUFFERED,FILE_ANY_ACCESS)
  8. #define CTL_TALK CTL_ALLCODE(1)
  9. int main()
  10. {
  11. HANDLE hDevice = NULL;
  12. char buff[] = "demo" ;
  13. char codebuff[5] = "less";
  14. DWORD retlen = NULL;
  15. hDevice = CreateFile(SYMBOLIC_NAME, GENERIC_ALL, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  16. printf("错误码:%d\n", GetLastError());
  17. if (hDevice < 0)
  18. {
  19. printf("打开文件失败");
  20. }
  21. printf("handle:%d\n", hDevice);
  22. BOOL flag = WriteFile(hDevice, buff, 1024, &retlen, NULL);
  23. if (!flag)
  24. {
  25. printf("写入失败");
  26. }
  27. do
  28. {
  29. printf("请输入你要传入内核的字符串:");
  30. scanf_s("%s", &codebuff);
  31. flag = DeviceIoControl(hDevice, CTL_TALK, codebuff, strlen(codebuff), NULL, 0, &retlen, NULL);
  32. if (!flag)
  33. {
  34. printf("控制码通信失败");
  35. }
  36. } while (1);
  37. system("pause");
  38. }
  1. #include <ntddk.h>
  2. #define DEVICE_NAME L"\\device\\mydevice"
  3. #define SYMBOLIC_NAME L"\\dosdevices\\sym_name"
  4. #define CTL_CODE_BASE 0x8000
  5. #define CTL_CMD(i) CTL_CODE(FILE_DEVICE_UNKNOWN,CTL_CODE_BASE+i,METHOD_BUFFERED,FILE_ANY_ACCESS)
  6. #define CTL_TALK CTL_CMD(1)
  7. NTSTATUS DispatchControl(PDEVICE_OBJECT pDevice, PIRP pIrp)
  8. {
  9. PVOID pBuff = pIrp->AssociatedIrp.SystemBuffer;
  10. PIO_STACK_LOCATION pStack = IoGetCurrentIrpStackLocation(pIrp);
  11. ULONG CtlCode = pStack->Parameters.DeviceIoControl.IoControlCode;
  12. ULONG uLen = { 0 };
  13. uLen = strlen(pBuff);
  14. switch (CtlCode)
  15. {
  16. case CTL_TALK:
  17. {
  18. DbgPrint("长度:%d", uLen);
  19. DbgPrint("接收到的数据为:%s",pBuff);
  20. }
  21. default:
  22. break;
  23. }
  24. pIrp->IoStatus.Information = 0;
  25. pIrp->IoStatus.Status = STATUS_SUCCESS;
  26. IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  27. return STATUS_SUCCESS;
  28. }
  29. NTSTATUS DispatchCreate(PDEVICE_OBJECT pDeviceObject, PIRP pIrp)
  30. {
  31. DbgPrint("Create!");
  32. //设置IRP处理已经成功了
  33. pIrp->IoStatus.Status = STATUS_SUCCESS;
  34. //返回多少字节的数据
  35. pIrp->IoStatus.Information = 0;
  36. //结束IRP处理流程
  37. IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  38. //函数调用成功
  39. return STATUS_SUCCESS;
  40. }
  41. NTSTATUS DispatchRead(PDEVICE_OBJECT pDevice, PIRP pIrp)
  42. {
  43. ULONG retlen = 0;
  44. PVOID pMes = pIrp->AssociatedIrp.SystemBuffer;
  45. DbgPrint("%c", (char *)pMes);
  46. pIrp->IoStatus.Information = retlen;
  47. pIrp->IoStatus.Status = STATUS_SUCCESS;
  48. //表示调用者已经完成了给定I/O请求的所有处理,并将给定的IRP返回给I/O管理器
  49. IoCompleteRequest(pIrp,IO_NO_INCREMENT);
  50. return STATUS_SUCCESS;
  51. }
  52. VOID UnloadDriver(PDRIVER_OBJECT pDriver)
  53. {
  54. UNICODE_STRING uSyb_Name = RTL_CONSTANT_STRING(SYMBOLIC_NAME);
  55. IoDeleteDevice(pDriver->DeviceObject);
  56. IoDeleteSymbolicLink(&uSyb_Name);
  57. DbgPrint("卸载成功");
  58. }
  59. NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pRegpath)
  60. {
  61. PDEVICE_OBJECT pDevice = NULL;
  62. UNICODE_STRING uDeciceName = RTL_CONSTANT_STRING(DEVICE_NAME);
  63. UNICODE_STRING uSyb_Name = RTL_CONSTANT_STRING(SYMBOLIC_NAME);
  64. NTSTATUS status = STATUS_SUCCESS;
  65. status = IoCreateDevice(pDriver, 0, &uDeciceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDevice);
  66. if (!NT_SUCCESS(status))
  67. {
  68. DbgPrint("创建设备失败\n");
  69. }
  70. status = IoCreateSymbolicLink(&uSyb_Name, &uDeciceName);
  71. if (!NT_SUCCESS(status))
  72. {
  73. DbgPrint("创建符号链接失败\n");
  74. }
  75. pDevice->Flags |= DO_BUFFERED_IO;
  76. pDriver->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
  77. pDriver->MajorFunction[IRP_MJ_WRITE] = DispatchRead;
  78. pDriver->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchControl;
  79. DbgPrint("驱动加载成功");
  80. pDriver->DriverUnload = UnloadDriver;
  81. return STATUS_SUCCESS;
  82. }