#include "stdafx.h"

void DriverUnload(IN PDRIVER_OBJECT DriverObject);
NTSTATUS DriverCreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS DefaultHandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS DriverRead(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp);

#ifdef __cplusplus
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath);
#endif

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath)
{
 UNICODE_STRING DeviceName,Win32Device;
 PDEVICE_OBJECT DeviceObject = NULL;
 NTSTATUS status;
 unsigned i;

 RtlInitUnicodeString(&DeviceName;,L"\\Device\\InfoDevice");
 RtlInitUnicodeString(&Win32Device;,L"\\DosDevices\\InfoDevice");

 for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
  DriverObject->MajorFunction[i] = DefaultHandler;

 DriverObject->MajorFunction[IRP_MJ_CREATE] = DriverCreateClose;
 DriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverCreateClose;
 DriverObject->MajorFunction[IRP_MJ_READ] = DriverRead;
 
 DriverObject->DriverUnload = DriverUnload;
 status = IoCreateDevice(DriverObject,
       0,
       &DeviceName;,
       FILE_DEVICE_UNKNOWN,
       0,
       FALSE,
       &DeviceObject;);
 if (!NT_SUCCESS(status))
  return status;
 if (!DeviceObject)
  return STATUS_UNEXPECTED_IO_ERROR;

 DeviceObject->Flags |= DO_BUFFERED_IO;
 DeviceObject->AlignmentRequirement = FILE_WORD_ALIGNMENT;
 status = IoCreateSymbolicLink(&Win32Device;, &DeviceName;);

 DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;

 return STATUS_SUCCESS;
}
typedef struct _FWORD 
{
 USHORT size;
 ULONG addr;
}FWORD;
NTSTATUS DriverRead(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
 FWORD regGDT;
 PVOID mapMem=NULL;
 PVOID output=Irp->AssociatedIrp.SystemBuffer;
 PHYSICAL_ADDRESS ppt;
 _asm
 {
  sgdt [regGDT]
  
 }
 ppt.LowPart=regGDT.addr;
 ppt.HighPart=0x0;
 mapMem=MmMapIoSpace(ppt,4096,MmNonCached);
 if(mapMem!=NULL)
 {
  RtlCopyBytes(Irp->AssociatedIrp.SystemBuffer,mapMem,4096);
  _asm
  {
   mov edx,output
   movzx eax,[regGDT.size]
   mov [edx+4088],eax
   mov eax,[regGDT.addr]
   mov [edx+4092],eax
  }
  Irp->IoStatus.Information=4096;
  MmUnmapIoSpace(mapMem,4096);
 }
 Irp->IoStatus.Status = STATUS_SUCCESS;
 IoCompleteRequest(Irp, IO_NO_INCREMENT);
 return STATUS_SUCCESS;
}

void DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
 UNICODE_STRING Win32Device;
 RtlInitUnicodeString(&Win32Device;,L"\\DosDevices\\InfoDevice");
 IoDeleteSymbolicLink(&Win32Device;);
 IoDeleteDevice(DriverObject->DeviceObject);
}

NTSTATUS DriverCreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
 Irp->IoStatus.Status = STATUS_SUCCESS;
 Irp->IoStatus.Information = 0;
 IoCompleteRequest(Irp, IO_NO_INCREMENT);
 return STATUS_SUCCESS;
}

NTSTATUS DefaultHandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
 Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
 Irp->IoStatus.Information = 0;
 IoCompleteRequest(Irp, IO_NO_INCREMENT);
 return Irp->IoStatus.Status;
}

Add a code snippet to your website: www.paste.org