#include "ntddk.h"
#define NT_DEVICE_NAME L"\\\\Device\\\\r0kedrv"
#define WIN32_DEVICE_NAME L"\\\\DosDevices\\\\r0kedrv"
#define IOCTL_WRITE 0x800
NTSTATUS CtlCreate(IN PDEVICE_OBJECT, IN PIRP);
NTSTATUS CtlClose(IN PDEVICE_OBJECT, IN PIRP);
NTSTATUS CtlDispatch(IN PDEVICE_OBJECT,IN PIRP);
VOID UnloadOperation(IN PDRIVER_OBJECT pDriverObject);
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING RegistryPath)
{
PDEVICE_OBJECT pDeviceObject;
UNICODE_STRING uniNtName;
UNICODE_STRING uniWin32Name;
RtlInitUnicodeString(&uniNtName, NT_DEVICE_NAME);
RtlInitUnicodeString(&uniWin32Name, WIN32_DEVICE_NAME);
IoCreateSymbolicLink(&uniWin32Name, &uniNtName);
IoCreateDevice(pDriverObject,0,&uniNtName,FILE_DEVICE_UNKNOWN,0,FALSE,&pDeviceObject);
pDriverObject->MajorFunction[IRP_MJ_CREATE]=CtlCreate;
pDriverObject->MajorFunction[IRP_MJ_CLOSE]=CtlClose;
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=CtlDispatch;
pDriverObject->DriverUnload = UnloadOperation;
return STATUS_SUCCESS;
}
NTSTATUS CtlCreate(IN PDEVICE_OBJECT pDeviceObject,IN PIRP Irp)
{
Irp->IoStatus.Status=STATUS_SUCCESS;
Irp->IoStatus.Information=0;
IoCompleteRequest(Irp,IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
NTSTATUS CtlClose(IN PDEVICE_OBJECT pDeviceObject,IN PIRP Irp)
{
Irp->IoStatus.Status=STATUS_SUCCESS;
Irp->IoStatus.Information=0;
IoCompleteRequest(Irp,IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
VOID UnloadOperation(IN PDRIVER_OBJECT pDriverObject)
{
PDEVICE_OBJECT deviceObject = pDriverObject->DeviceObject;
UNICODE_STRING uniWin32NameString;
RtlInitUnicodeString( &uniWin32NameString, WIN32_DEVICE_NAME );
IoDeleteSymbolicLink( &uniWin32NameString );
IoDeleteDevice( deviceObject );
return;
}
NTSTATUS CtlDispatch(IN PDEVICE_OBJECT pDeviceObject,IN PIRP Irp)
{
PIO_STACK_LOCATION pIrpStack;
PUCHAR pIOBuffer;
UCHAR Port;
UCHAR i;
UCHAR count;
UCHAR code;
pIrpStack=IoGetCurrentIrpStackLocation(Irp);
pIOBuffer=Irp->AssociatedIrp.SystemBuffer;
switch (pIrpStack->Parameters.DeviceIoControl.IoControlCode)
{
case IOCTL_WRITE:
count=pIOBuffer[0];
DbgPrint("Coungt of bytes to send : %u\\n",count);
for(i=1;i<=count;i++)
{
code=pIOBuffer[i];
DbgPrint("Byte %u : %u\\n",i,code);
Port=100;
DbgPrint("Waiting while keyboard not ready\\n");
while( READ_PORT_UCHAR((PUCHAR)Port)&1 );
while( READ_PORT_UCHAR((PUCHAR)Port)&2 );
DbgPrint("Sending command\\n");
WRITE_PORT_UCHAR((PUCHAR)Port,(UCHAR)210);
while( READ_PORT_UCHAR((PUCHAR)Port)&2 );
DbgPrint("Sending code\\n");
Port=96;
WRITE_PORT_UCHAR((PUCHAR)Port,(UCHAR)code);
}
Irp->IoStatus.Information=2;
break;
}
Irp->IoStatus.Status=STATUS_SUCCESS;
IoCompleteRequest (Irp,IO_NO_INCREMENT);
return STATUS_SUCCESS;
}