免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 发帖

FirstDriver

驱动层:
  1. #include "ntddk.h"

  2. #define INITCODE        code_seg("INIT")
  3. #define PAGECODE        code_seg("PAGE")


  4. #pragma PAGECODE
  5. void MyDriverUnload(PDRIVER_OBJECT pDriverObject)
  6. {
  7.         UNICODE_STRING symName;

  8.         RtlInitUnicodeString(&symName, L"\\??\\FirstDeviceLinkName");

  9.         if (pDriverObject->DeviceObject != NULL)
  10.         {
  11.                 IoDeleteSymbolicLink(&symName);
  12.                 IoDeleteDevice(pDriverObject->DeviceObject);
  13.                 KdPrint(("Delete device success!"));
  14.         }

  15. }

  16. #pragma INITCODE
  17. NTSTATUS CreateMyDevice(PDRIVER_OBJECT pDriverObject)
  18. {
  19.         NTSTATUS Status;
  20.         PDEVICE_OBJECT pDevObj;
  21.         UNICODE_STRING DevName;
  22.         UNICODE_STRING symName;

  23.         RtlInitUnicodeString(&DevName, L"\\Device\\FirstDevice");

  24.         Status = IoCreateDevice(pDriverObject, 0, &DevName, FILE_DEVICE_UNKNOWN,
  25.                 0, TRUE, &pDevObj);

  26.         if (!NT_SUCCESS(Status))
  27.         {
  28.                 return Status;
  29.         }
  30.        
  31.         pDevObj->Flags |= DO_BUFFERED_IO;

  32.         RtlInitUnicodeString(&symName, L"\\??\\FirstDeviceLinkName");
  33.         Status = IoCreateSymbolicLink(&symName, &DevName);

  34.         if (!NT_SUCCESS(Status))
  35.         {
  36.                 IoDeleteDevice(pDevObj);
  37.                 return Status;
  38.         }
  39.         return STATUS_SUCCESS;
  40. }

  41. #pragma PAGECODE
  42. NTSTATUS CreateCompleteRoutine(PDEVICE_OBJECT pDeviceObj, PIRP pIrp)
  43. {
  44.         NTSTATUS Status;
  45.         Status = STATUS_SUCCESS;

  46.         KdPrint(("Create"));

  47.         pIrp->IoStatus.Status = Status;
  48.         pIrp->IoStatus.Information = 0;
  49.         IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  50.         return Status;
  51. }

  52. #pragma PAGECODE
  53. NTSTATUS CloseCompleteRoutine(PDEVICE_OBJECT pDeviceObj, PIRP pIrp)
  54. {
  55.         NTSTATUS Status;
  56.         Status = STATUS_SUCCESS;

  57.         KdPrint(("Close"));

  58.         pIrp->IoStatus.Status = Status;
  59.         pIrp->IoStatus.Information = 0;
  60.         IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  61.         return Status;
  62. }

  63. #pragma PAGECODE
  64. NTSTATUS ReadCompleteRoutine(PDEVICE_OBJECT pDeviceObj, PIRP pIrp)
  65. {
  66.         NTSTATUS Status;
  67.         Status = STATUS_SUCCESS;

  68.         KdPrint(("Read"));

  69.         pIrp->IoStatus.Status = Status;
  70.         pIrp->IoStatus.Information = 0;
  71.         IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  72.         return Status;
  73. }

  74. #pragma PAGECODE
  75. NTSTATUS WriteCompleteRoutine(PDEVICE_OBJECT pDeviceObj, PIRP pIrp)
  76. {
  77.         NTSTATUS Status;
  78.         Status = STATUS_SUCCESS;

  79.         KdPrint(("Write"));

  80.         pIrp->IoStatus.Status = Status;
  81.         pIrp->IoStatus.Information = 0;
  82.         IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  83.         return Status;
  84. }

  85. #pragma INITCODE
  86. NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath)
  87. {
  88.         NTSTATUS Status;
  89.         Status = CreateMyDevice(pDriverObject);

  90.         if (!NT_SUCCESS(Status))
  91.         {
  92.                 KdPrint(("Create device failed!"));
  93.         }
  94.         else
  95.         {
  96.                 KdPrint(("Create device success!"));
  97.                 KdPrint(("%wZ", pRegistryPath));
  98.         }

  99.         pDriverObject->MajorFunction[IRP_MJ_CREATE] = CreateCompleteRoutine;
  100.         pDriverObject->MajorFunction[IRP_MJ_CLOSE] = CloseCompleteRoutine;
  101.         pDriverObject->MajorFunction[IRP_MJ_READ] = ReadCompleteRoutine;
  102.         pDriverObject->MajorFunction[IRP_MJ_WRITE] = WriteCompleteRoutine;


  103.         pDriverObject->DriverUnload = MyDriverUnload;
  104.         return STATUS_SUCCESS;
  105. }
复制代码
应用层:
  1. void CCheckMyDriverDlg::OnButton1()
  2. {
  3.         // TODO: Add your control notification handler code here
  4.                                                        
  5.         HANDLE hDevice = CreateFile(TEXT("\\\\.\\FirstDeviceLinkName"), GENERIC_READ | GENERIC_WRITE, 0, NULL,
  6.                                                         OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  7.        
  8.         if (hDevice == INVALID_HANDLE_VALUE)
  9.         {
  10.                 CString str;
  11.                 str.Format("%d", GetLastError());
  12.                 AfxMessageBox("Open device failed! " + str);
  13.                 return;
  14.         }

  15.         CloseHandle(hDevice);
  16. }
复制代码

返回列表