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

ObReferenceObjectByName 使用

  1. #include "ntddk.h"

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


  4. NTKERNELAPI
  5. NTSTATUS
  6. ObReferenceObjectByName(
  7.         IN PUNICODE_STRING ObjectName,
  8.         IN ULONG Attributes,
  9.         IN PACCESS_STATE PassedAccessState OPTIONAL,
  10.         IN ACCESS_MASK DesiredAccess OPTIONAL,
  11.         IN POBJECT_TYPE ObjectType,
  12.         IN KPROCESSOR_MODE AccessMode,
  13.         IN OUT PVOID ParseContext OPTIONAL,
  14.         OUT PVOID *Object
  15.         );

  16. extern POBJECT_TYPE *IoDriverObjectType;

  17. PDRIVER_OBJECT g_DriverObject;
  18. PDRIVER_DISPATCH gfn_OrigReadCompleteRoutine;

  19. #pragma PAGECODE
  20. NTSTATUS FilterReadCompleteRoutine(PDEVICE_OBJECT pDeviceObj, PIRP pIrp)
  21. {
  22.         KdPrint(("IRP_MJ_DEVICE_CONTROL comming!"));
  23.         return gfn_OrigReadCompleteRoutine(pDeviceObj, pIrp);
  24. }


  25. #pragma PAGECODE
  26. void UnFilterDriverQuery()
  27. {
  28.         if (MmIsAddressValid(g_DriverObject))
  29.         {
  30.                 g_DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = gfn_OrigReadCompleteRoutine;
  31.         }
  32. }


  33. #pragma PAGECODE
  34. NTSTATUS FilterDriverQuery()
  35. {
  36.         UNICODE_STRING ObjectName;
  37.         NTSTATUS Status;

  38.         RtlInitUnicodeString(&ObjectName, L"\\Driver\\XueTr-火眼合作版本");

  39.         Status = ObReferenceObjectByName(&ObjectName, OBJ_CASE_INSENSITIVE, NULL, 0,
  40.                 *IoDriverObjectType, KernelMode, NULL, (PVOID *)&g_DriverObject);

  41.         if (!NT_SUCCESS(Status))
  42.         {
  43.                 return Status;
  44.         }

  45.         gfn_OrigReadCompleteRoutine = g_DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL];
  46.         g_DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = FilterReadCompleteRoutine;

  47.         ObDereferenceObject(g_DriverObject);

  48.         return STATUS_SUCCESS;
  49. }


  50. #pragma PAGECODE
  51. void MyDriverUnload(PDRIVER_OBJECT pDriverObject)
  52. {
  53.         UNICODE_STRING symName;

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

  55.         UnFilterDriverQuery();

  56.         if (pDriverObject->DeviceObject != NULL)
  57.         {
  58.                 IoDeleteSymbolicLink(&symName);
  59.                 IoDeleteDevice(pDriverObject->DeviceObject);
  60.                 KdPrint(("Delete device success!"));
  61.         }

  62. }

  63. #pragma INITCODE
  64. NTSTATUS CreateMyDevice(PDRIVER_OBJECT pDriverObject)
  65. {
  66.         NTSTATUS Status;
  67.         PDEVICE_OBJECT pDevObj;
  68.         UNICODE_STRING DevName;
  69.         UNICODE_STRING symName;

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

  71.         Status = IoCreateDevice(pDriverObject, 0, &DevName, FILE_DEVICE_UNKNOWN,
  72.                 0, TRUE, &pDevObj);

  73.         if (!NT_SUCCESS(Status))
  74.         {
  75.                 return Status;
  76.         }
  77.        
  78.         pDevObj->Flags |= DO_BUFFERED_IO;

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

  81.         if (!NT_SUCCESS(Status))
  82.         {
  83.                 IoDeleteDevice(pDevObj);
  84.                 return Status;
  85.         }
  86.         return STATUS_SUCCESS;
  87. }

  88. #pragma PAGECODE
  89. NTSTATUS CreateCompleteRoutine(PDEVICE_OBJECT pDeviceObj, PIRP pIrp)
  90. {
  91.         NTSTATUS Status;
  92.         Status = STATUS_SUCCESS;

  93.         KdPrint(("Create"));

  94.         pIrp->IoStatus.Status = Status;
  95.         pIrp->IoStatus.Information = 0;
  96.         IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  97.         return Status;
  98. }

  99. #pragma PAGECODE
  100. NTSTATUS CloseCompleteRoutine(PDEVICE_OBJECT pDeviceObj, PIRP pIrp)
  101. {
  102.         NTSTATUS Status;
  103.         Status = STATUS_SUCCESS;

  104.         KdPrint(("Close"));

  105.         pIrp->IoStatus.Status = Status;
  106.         pIrp->IoStatus.Information = 0;
  107.         IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  108.         return Status;
  109. }

  110. #pragma PAGECODE
  111. NTSTATUS ReadCompleteRoutine(PDEVICE_OBJECT pDeviceObj, PIRP pIrp)
  112. {
  113.         NTSTATUS Status;
  114.         Status = STATUS_SUCCESS;

  115.         KdPrint(("Read"));

  116.         pIrp->IoStatus.Status = Status;
  117.         pIrp->IoStatus.Information = 0;
  118.         IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  119.         return Status;
  120. }

  121. #pragma PAGECODE
  122. NTSTATUS WriteCompleteRoutine(PDEVICE_OBJECT pDeviceObj, PIRP pIrp)
  123. {
  124.         NTSTATUS Status;
  125.         Status = STATUS_SUCCESS;

  126.         KdPrint(("Write"));

  127.         pIrp->IoStatus.Status = Status;
  128.         pIrp->IoStatus.Information = 0;
  129.         IoCompleteRequest(pIrp, IO_NO_INCREMENT);
  130.         return Status;
  131. }

  132. #pragma INITCODE
  133. NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath)
  134. {
  135.         NTSTATUS Status;
  136.         Status = CreateMyDevice(pDriverObject);

  137.         if (!NT_SUCCESS(Status))
  138.         {
  139.                 KdPrint(("Create device failed!"));
  140.         }
  141.         else
  142.         {
  143.                 KdPrint(("Create device success!"));
  144.                 KdPrint(("%wZ", pRegistryPath));
  145.         }

  146.         pDriverObject->MajorFunction[IRP_MJ_CREATE] = CreateCompleteRoutine;
  147.         pDriverObject->MajorFunction[IRP_MJ_CLOSE] = CloseCompleteRoutine;
  148.         pDriverObject->MajorFunction[IRP_MJ_READ] = ReadCompleteRoutine;
  149.         pDriverObject->MajorFunction[IRP_MJ_WRITE] = WriteCompleteRoutine;

  150.         pDriverObject->DriverUnload = MyDriverUnload;

  151.         FilterDriverQuery();

  152.         return STATUS_SUCCESS;
  153. }
复制代码

返回列表