document.write('
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. #include "ntddk.h"
  2. #define NT_DEVICE_NAME L"\\\\Device\\\\r0kedrv"
  3. #define WIN32_DEVICE_NAME L"\\\\DosDevices\\\\r0kedrv"
  4.  
  5. #define IOCTL_WRITE 0x800
  6.  
  7. NTSTATUS CtlCreate(IN PDEVICE_OBJECT, IN PIRP);
  8. NTSTATUS CtlClose(IN PDEVICE_OBJECT, IN PIRP);
  9. NTSTATUS CtlDispatch(IN PDEVICE_OBJECT,IN PIRP);
  10. VOID UnloadOperation(IN PDRIVER_OBJECT pDriverObject);
  11.  
  12. NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegistryPath)  
  13. {
  14.     PDEVICE_OBJECT pDeviceObject;
  15.     UNICODE_STRING uniNtName;
  16.     UNICODE_STRING uniWin32Name;
  17.     RtlInitUnicodeString(&uniNtName, NT_DEVICE_NAME);
  18.     RtlInitUnicodeString(&uniWin32Name, WIN32_DEVICE_NAME);  
  19.     IoCreateSymbolicLink(&uniWin32Name, &uniNtName);
  20.     IoCreateDevice(pDriverObject,0,&uniNtName,FILE_DEVICE_UNKNOWN,0,FALSE,&pDeviceObject);
  21.     pDriverObject->MajorFunction[IRP_MJ_CREATE]=CtlCreate;
  22.     pDriverObject->MajorFunction[IRP_MJ_CLOSE]=CtlClose;
  23.     pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=CtlDispatch;
  24.     pDriverObject->DriverUnload = UnloadOperation;
  25.  
  26.     return STATUS_SUCCESS;
  27. }
  28.  
  29. NTSTATUS CtlCreate(IN PDEVICE_OBJECT pDeviceObject,IN PIRP Irp)
  30. {
  31.     Irp->IoStatus.Status=STATUS_SUCCESS;
  32.     Irp->IoStatus.Information=0;
  33.     IoCompleteRequest(Irp,IO_NO_INCREMENT);
  34.     return STATUS_SUCCESS;
  35. }    
  36.  
  37. NTSTATUS CtlClose(IN PDEVICE_OBJECT pDeviceObject,IN PIRP Irp)
  38. {
  39.     Irp->IoStatus.Status=STATUS_SUCCESS;
  40.     Irp->IoStatus.Information=0;  
  41.     IoCompleteRequest(Irp,IO_NO_INCREMENT);
  42.     return STATUS_SUCCESS;  
  43. }
  44.  
  45. VOID UnloadOperation(IN PDRIVER_OBJECT pDriverObject)
  46. {
  47.     PDEVICE_OBJECT  deviceObject = pDriverObject->DeviceObject;
  48.     UNICODE_STRING  uniWin32NameString;
  49.     RtlInitUnicodeString( &uniWin32NameString, WIN32_DEVICE_NAME );
  50.     IoDeleteSymbolicLink( &uniWin32NameString );    
  51.     IoDeleteDevice( deviceObject );
  52.     return;
  53. }
  54.  
  55. NTSTATUS CtlDispatch(IN PDEVICE_OBJECT pDeviceObject,IN PIRP Irp)
  56. {
  57.     PIO_STACK_LOCATION pIrpStack;
  58.     PUCHAR pIOBuffer;
  59.     UCHAR Port;        
  60.     UCHAR i;
  61.     UCHAR count;
  62.     UCHAR code;
  63.     pIrpStack=IoGetCurrentIrpStackLocation(Irp);
  64.     pIOBuffer=Irp->AssociatedIrp.SystemBuffer;    
  65.    
  66.     switch (pIrpStack->Parameters.DeviceIoControl.IoControlCode)
  67.     {
  68.         case IOCTL_WRITE:
  69.             count=pIOBuffer[0];
  70.             DbgPrint("Coungt of bytes to send : %u\\n",count);
  71.             for(i=1;i<=count;i++)
  72.             {
  73.                 code=pIOBuffer[i];
  74.                 DbgPrint("Byte %u : %u\\n",i,code);
  75.                 Port=100;
  76.                 DbgPrint("Waiting while keyboard not ready\\n");
  77.                 while( READ_PORT_UCHAR((PUCHAR)Port)&1 );
  78.                 while( READ_PORT_UCHAR((PUCHAR)Port)&2 );
  79.                 DbgPrint("Sending command\\n");
  80.                 WRITE_PORT_UCHAR((PUCHAR)Port,(UCHAR)210);
  81.                 while( READ_PORT_UCHAR((PUCHAR)Port)&2 );
  82.                 DbgPrint("Sending code\\n");
  83.                 Port=96;
  84.                 WRITE_PORT_UCHAR((PUCHAR)Port,(UCHAR)code);
  85.             }
  86.             Irp->IoStatus.Information=2;
  87.             break;
  88.     }
  89.  
  90.     Irp->IoStatus.Status=STATUS_SUCCESS;
  91.     IoCompleteRequest (Irp,IO_NO_INCREMENT);
  92.     return STATUS_SUCCESS;
  93. }
');