从头开始了解和使用Hypervisor(第1部分)

来源:岁月联盟 编辑:猪蛋儿 时间:2020-01-29
配置IRP主要函数
除了我们的内核模式驱动程序(“MyHypervisorDriver”)之外,我创建了一个用户模式应用程序称为“MyHypervisorApp”,首先,你应该在用户模式而不是内核模式中编写代码(源代码见此),这是因为你可能未处理异常,因此会导致BSOD,或者,另一方面,在内核模式下运行较少的代码,以减少出现漏洞的可能性。
如上所述,我们已经创建了一些Windows Driver Kit代码,现在我们要接着开发更多IRP函数。
IRP主要函数位于为每个设备创建的常规Windows表中,一旦在Windows中注册了设备,就必须引入这些函数来处理这些IRP主要函数。这就像每个设备都有其主要函数表,并且每次用户模式应用程序调用其中的任何函数时,Windows都会根据用户请求的设备查找相应的函数(如果设备驱动程序支持该MJ函数),然后调用它将IRP指针传递给内核驱动程序。它的职责是检查设备函数的权限,以下的代码创建设备:
 NTSTATUS NtStatus = STATUS_SUCCESS;
 UINT64 uiIndex = 0;
 PDEVICE_OBJECT pDeviceObject = NULL;
 UNICODE_STRING usDriverName, usDosDeviceName;
 DbgPrint("[*] DriverEntry Called."); 
 RtlInitUnicodeString(&usDriverName, L"//Device//MyHypervisorDevice");
 
 RtlInitUnicodeString(&usDosDeviceName, L"//DosDevices//MyHypervisorDevice");
 NtStatus = IoCreateDevice(pDriverObject, 0, &usDriverName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &pDeviceObject);
 NTSTATUS NtStatusSymLinkResult = IoCreateSymbolicLink(&usDosDeviceName, &usDriverName);
请注意,我们的设备名称为“/ device /MyHypervisorDevice”。之后,我们需要介绍设备的主要函数。
 if (NtStatus == STATUS_SUCCESS && NtStatusSymLinkResult == STATUS_SUCCESS)
 {
  for (uiIndex = 0; uiIndex MajorFunction[uiIndex] = DrvUnsupported;
  DbgPrint("[*] Setting Devices major functions.");
  pDriverObject->MajorFunction[IRP_MJ_CLOSE] = DrvClose;
  pDriverObject->MajorFunction[IRP_MJ_CREATE] = DrvCreate;
  pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DrvIOCTLDispatcher;
  pDriverObject->MajorFunction[IRP_MJ_READ] = DrvRead;
  pDriverObject->MajorFunction[IRP_MJ_WRITE] = DrvWrite;
  pDriverObject->DriverUnload = DrvUnload;
 }
 else {
  DbgPrint("[*] There was some errors in creating device.");
 }
你会看到我对所有函数都添加了“DrvUnsupported”,这是一个用于处理所有MJ函数的函数,并告诉用户不支持该函数。该函数的主体如下所示:
NTSTATUS DrvUnsupported(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
 DbgPrint("[*] This function is not supported 🙁 !");
 Irp->IoStatus.Status = STATUS_SUCCESS;
 Irp->IoStatus.Information = 0;
 IoCompleteRequest(Irp, IO_NO_INCREMENT);
 return STATUS_SUCCESS;
}
我们还介绍了其他一些对我们的设备来说必不可少的主要函数,我们将在未来完成这些实现,现在先不要管这些函数,知道就行。
NTSTATUS DrvCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
 DbgPrint("[*] Not implemented yet 🙁 !");
 Irp->IoStatus.Status = STATUS_SUCCESS;
 Irp->IoStatus.Information = 0;
 IoCompleteRequest(Irp, IO_NO_INCREMENT);
 return STATUS_SUCCESS;
}
NTSTATUS DrvRead(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
 DbgPrint("[*] Not implemented yet 🙁 !");
 Irp->IoStatus.Status = STATUS_SUCCESS;
 Irp->IoStatus.Information = 0;
 IoCompleteRequest(Irp, IO_NO_INCREMENT);
 return STATUS_SUCCESS;
}
NTSTATUS DrvWrite(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
 DbgPrint("[*] Not implemented yet 🙁 !");
 Irp->IoStatus.Status = STATUS_SUCCESS;
 Irp->IoStatus.Information = 0;
 IoCompleteRequest(Irp, IO_NO_INCREMENT);
 return STATUS_SUCCESS;
}
NTSTATUS DrvClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
 DbgPrint("[*] Not implemented yet 🙁 !");
 Irp->IoStatus.Status = STATUS_SUCCESS;
 Irp->IoStatus.Information = 0;
 IoCompleteRequest(Irp, IO_NO_INCREMENT);
 return STATUS_SUCCESS;
}
现在,我们来看看IRP MJ 函数列表和其他类型的Windows Driver Kit处理程序例程。

IRP主要函数列表
这是IRP主要函数的列表,我们可以使用这些函数来执行不同的操作。
#define IRP_MJ_CREATE                   0x00
#define IRP_MJ_CREATE_NAMED_PIPE        0x01
#define IRP_MJ_CLOSE                    0x02

上一页  [1] [2] [3] [4] [5] [6]  下一页