Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement