Porting pice. Added keyboard hook and some file functions.

svn path=/trunk/; revision=2420
This commit is contained in:
Eugene Ingerman 2001-12-06 09:20:57 +00:00
parent 8c3f4003e7
commit ef93b48310
12 changed files with 902 additions and 741 deletions

View file

@ -444,7 +444,7 @@ BOOLEAN ConsoleInitHercules(void)
attr.u.Asuchar = 0x07; attr.u.Asuchar = 0x07;
pScreenBufferHercules=ioremap(0xb0000,FRAMEBUFFER_SIZE); pScreenBufferHercules=MmMapIoSpace(0xb0000,FRAMEBUFFER_SIZE,MmWriteCombined);
DPRINT((0,"VGA memory phys. 0xb0000 mapped to virt. 0x%x\n",pScreenBufferHercules)); DPRINT((0,"VGA memory phys. 0xb0000 mapped to virt. 0x%x\n",pScreenBufferHercules));
@ -483,7 +483,7 @@ void ConsoleShutdownHercules(void)
outb_p(0,0x3bf); outb_p(0,0x3bf);
if(pScreenBufferHercules) if(pScreenBufferHercules)
iounmap(pScreenBufferHercules); MmUnmapIoSpace(pScreenBufferHercules,FRAMEBUFFER_SIZE);
LEAVE_FUNC(); LEAVE_FUNC();
} }

View file

@ -36,7 +36,6 @@ Copyright notice:
#include "precomp.h" #include "precomp.h"
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/vmalloc.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/delay.h> #include <asm/delay.h>
@ -187,13 +186,12 @@ BOOLEAN InitPICE(void)
} }
DPRINT((0,"InitPICE(): trace step 12\n")); DPRINT((0,"InitPICE(): trace step 12\n"));
// need these two to hook the keyboard
ScanExports("handle_scancode",&ulHandleScancode);
ScanExports("handle_kbd_event",&ulHandleKbdEvent);
DPRINT((0,"InitPICE(): trace step 13\n")); DPRINT((0,"InitPICE(): trace step 13\n"));
// patch the keyboard driver // patch the keyboard driver
if(!(ulHandleScancode && ulHandleKbdEvent && PatchKeyboardDriver(ulHandleKbdEvent,ulHandleScancode)) )
if(PatchKeyboardDriver())
{ {
Print(OUTPUT_WINDOW,"pICE: ABORT (couldn't patch keyboard driver)\n"); Print(OUTPUT_WINDOW,"pICE: ABORT (couldn't patch keyboard driver)\n");
Print(OUTPUT_WINDOW,"pICE: press any key to continue...\n"); Print(OUTPUT_WINDOW,"pICE: press any key to continue...\n");

View file

@ -164,4 +164,4 @@ COMMAND_PROTOTYPE(ShowPCI);
COMMAND_PROTOTYPE(SetKeyboardLayout); COMMAND_PROTOTYPE(SetKeyboardLayout);
COMMAND_PROTOTYPE(ShowSysCallTable); COMMAND_PROTOTYPE(ShowSysCallTable);
COMMAND_PROTOTYPE(SetAltKey); COMMAND_PROTOTYPE(SetAltKey);
COMMAND_PROTOTYPE(ShowContext); COMMAND_PROTOTYPE(ShowContext);

View file

@ -17,11 +17,13 @@ Environment:
Author: Author:
Klaus P. Gerlicher Klaus P. Gerlicher
Reactos Port: Eugene Ingerman
Revision History: Revision History:
10-Jul-1999: created 10-Jul-1999: created
15-Nov-2000: general cleanup of source files 15-Nov-2000: general cleanup of source files
12/1/2001 reactos port
Copyright notice: Copyright notice:
@ -37,6 +39,9 @@ Copyright notice:
#include <asm/system.h> #include <asm/system.h>
#include <ddk/ntddkbd.h>
#include <ddk/ntdd8042.h>
//////////////////////////////////////////////////// ////////////////////////////////////////////////////
// GLOBALS // GLOBALS
//// ////
@ -44,7 +49,7 @@ Copyright notice:
static PUCHAR pPatchAddress; static PUCHAR pPatchAddress;
static ULONG ulOldOffset = 0; static ULONG ulOldOffset = 0;
static ULONG ulKeyPatchFlags; static ULONG ulKeyPatchFlags;
BOOLEAN bPatched = FALSE;
void (*old_handle_scancode)(UCHAR,int); void (*old_handle_scancode)(UCHAR,int);
char tempPatch[256]; char tempPatch[256];
UCHAR ucBreakKey = 'D'; // key that will break into debugger in combination with CTRL UCHAR ucBreakKey = 'D'; // key that will break into debugger in combination with CTRL
@ -53,29 +58,44 @@ UCHAR ucBreakKey = 'D'; // key that will break into debugger in combination with
// FUNCTIONS // FUNCTIONS
//// ////
// the keyboard hook //***********************************************************************************
void pice_handle_scancode(UCHAR scancode,int bKeyPressed) // PiceKbdIsr - keyboard isr hook routine.
// IsrContext - context that we passed to keyboard driver in internal iocontrol
// pCurrentInput, pCurrentOutput - not implemented yet
// StatusByte - keyboard status register
// pByte - pointer to the byte read from keyboard data port. can be changed.
// pContinueProcessing - should keyboard driver continue processing this byte.
//***********************************************************************************
BOOLEAN PiceKbdIsr (
PVOID IsrContext,
PKEYBOARD_INPUT_DATA pCurrentInput,
POUTPUT_PACKET pCurrentOutput,
UCHAR StatusByte,
PUCHAR pByte,
PBOOLEAN pContinueProcessing,
PKEYBOARD_SCAN_STATE pScanState
)
{ {
UCHAR ucKey = scancode & 0x7f;
static BOOLEAN bControl = FALSE; static BOOLEAN bControl = FALSE;
BOOLEAN bForward=TRUE; BOOLEAN bForward=TRUE; // should we let keyboard driver process this keystroke
BOOLEAN isDown=!(*pByte & 0x80);
UCHAR ucKey = *pByte & 0x7f;
ENTER_FUNC(); ENTER_FUNC();
// BUG!! should protect with spinlock since bControl is static.
DPRINT((0,"pice_handle_scancode(%x,%u)\n",scancode,bKeyPressed)); DPRINT((0,"PiceKbdIsr(%x,%u)\n",pByte,isDown));
DPRINT((0,"pice_handle_scancode(1): bControl = %u bForward = %u bEnterNow = %u\n",bControl,bForward,bEnterNow)); DPRINT((0,"PiceKbdIsr(1): bControl = %u bForward = %u bEnterNow = %u\n",bControl,bForward,bEnterNow));
if(bKeyPressed)
if(isDown)
{ {
// CTRL pressed // CTRL pressed
if(ucKey==0x1d) if(ucKey==0x1d)
{ {
bControl=TRUE; bControl=TRUE;
} }
else if(bControl==TRUE && ucKey==AsciiToScan(ucBreakKey)) // CTRL-F else if(bControl==TRUE && ucKey==AsciiToScan(ucBreakKey)) // CTRL-D
{ {
// fake a CTRL-F release call // fake a CTRL-D release call
old_handle_scancode(0x1d|0x80,FALSE);
old_handle_scancode(AsciiToScan(ucBreakKey)|0x80,FALSE);
bForward=FALSE; bForward=FALSE;
bEnterNow=TRUE; bEnterNow=TRUE;
bControl=FALSE; bControl=FALSE;
@ -98,80 +118,102 @@ void pice_handle_scancode(UCHAR scancode,int bKeyPressed)
bForward=FALSE; bForward=FALSE;
} }
} }
*ContinueProcessing = bForward;
LEAVE_FUNC();
return TRUE;
}
if(bForward) //***********************************************************************************
{ // PiceSendIoctl - send internal_io_control to the driver
DPRINT((0,"pice_handle_scancode(): forwarding key stroke\n")); // Target - Device Object that receives control request
old_handle_scancode(scancode,bKeyPressed); // Ioctl - request
// InputBuffer - Type3Buffer will be pointing here
// InputBufferLength - length of inputbuffer
//***********************************************************************************
NTSTATUS PiceSendIoctl(PDEVICE_OBJECT Target, ULONG Ioctl,
PVOID InputBuffer, ULONG InputBufferLength)
{
KEVENT event;
NTSTATUS status = STATUS_SUCCESS;
IO_STATUS_BLOCK iosb;
PIRP irp;
KeInitializeEvent(&event,
NotificationEvent,
FALSE
);
if (NULL == (irp = IoBuildDeviceIoControlRequest(Ioctl,
Target,
InputBuffer,
InputBufferLength,
0,
0,
TRUE,
&event,
&iosb))) {
return STATUS_INSUFFICIENT_RESOURCES;
} }
LEAVE_FUNC(); status = IoCallDriver(Target, irp);
if (STATUS_PENDING == status) {
status = KeWaitForSingleObject(&event,
Executive,
KernelMode,
FALSE,
NULL);
assert(STATUS_SUCCESS == status);
status = iosb.Status;
}
return status;
} }
BOOLEAN PatchKeyboardDriver(ULONG AddrOfKbdEvent,ULONG AddrOfScancode) //**************************************************
// PatchKeyboardDriver - set keyboard driver hook.
// We use interface supported by standard keyboard drivers.
//**************************************************
BOOLEAN PatchKeyboardDriver(void)
{ {
UCHAR ucPattern[5] = {0xE8,0x0,0x0,0x0,0x0}; PINTERNAL_I8042_HOOK_KEYBOARD phkData;
PULONG pOffset = (PULONG)&ucPattern[1]; UNICODE_STRING DevName;
ULONG ulOffset,countBytes = 0; PDEVICE_OBJECT kbdDevice = NULL;
PFILE_OBJECT FO = NULL;
NTSTATUS status;
ENTER_FUNC(); ENTER_FUNC();
//When we have i8042 driver this should be changed!!!!!!!
RtlInitUnicodeString(&DevName, L"\\Device\\Keyboard");
(void*)old_handle_scancode = AddrOfScancode; //Get pointer to keyboard device
DPRINT((0,"handle_scancode = %X\n",AddrOfScancode)); if( !NT_SUCCESS( IoGetDeviceObjectPointer( &DevName, FILE_READ_ACCESS, &FO, &kbdDevice ) ) )
return FALSE;
pPatchAddress = (PUCHAR)AddrOfKbdEvent; // handle_kbd_event
DPRINT((0,"initial patch address = %X\n",AddrOfKbdEvent)); phkData = ExAllocatePool( PagedPool, sizeof( INTERNAL_I8042_HOOK_KEYBOARD ) );
ulOffset = (ULONG)old_handle_scancode - ((ULONG)pPatchAddress+sizeof(ULONG)+1); RtlZeroMemory( phkData, sizeof( INTERNAL_I8042_HOOK_KEYBOARD ) );
DPRINT((0,"initial offset = %X\n",ulOffset));
*pOffset = ulOffset;
while((RtlCompareMemory(pPatchAddress,ucPattern,sizeof(ucPattern))!=0) &&
(countBytes<0x1000))
{
/* DPRINT((0,"offset = %X\n",ulOffset));
DPRINT((0,"patch address = %X\n",pPatchAddress));
DPRINT((0,"pattern1 = %.2X %.2X %.2X %.2X %.2X\n",ucPattern[0],ucPattern[1],ucPattern[2],ucPattern[3],ucPattern[4]));
DPRINT((0,"pattern2 = %.2X %.2X %.2X %.2X %.2X\n",pPatchAddress[0],pPatchAddress[1],pPatchAddress[2],pPatchAddress[3],pPatchAddress[4]));*/
countBytes++;
pPatchAddress++;
ulOffset = (ULONG)old_handle_scancode - ((ULONG)pPatchAddress+sizeof(ULONG)+1);
*pOffset = ulOffset;
}
if(RtlCompareMemory(pPatchAddress,ucPattern,sizeof(ucPattern))==0) phkData->IsrRoutine = (PI8042_KEYBOARD_ISR) PiceKbdIsr;
{ phkData->Context = (PVOID) NULL; //DeviceObject;
DPRINT((0,"pattern found @ %x\n",pPatchAddress));
//call keyboard device internal io control to hook keyboard input stream
status = PiceSendIoctl( kbdDevice, IOCTL_INTERNAL_I8042_HOOK_KEYBOARD,
phkData, sizeof( INTERNAL_I8042_HOOK_KEYBOARD ) );
ulOffset = (ULONG)&pice_handle_scancode - ((ULONG)pPatchAddress+sizeof(ULONG)+1); ObDereferenceObject(FO);
ulOldOffset = *(PULONG)(pPatchAddress + 1); ExFreePool(phkData);
DPRINT((0,"old offset = %x new offset = %x\n",ulOldOffset,ulOffset));
LEAVE_FUNC();
save_flags(ulKeyPatchFlags); return NT_SUCCESS(status);
cli();
*(PULONG)(pPatchAddress + 1) = ulOffset;
bPatched = TRUE;
restore_flags(ulKeyPatchFlags);
DPRINT((0,"PatchKeyboardDriver(): SUCCESS!\n"));
}
LEAVE_FUNC();
return bPatched;
} }
void RestoreKeyboardDriver(void) void RestoreKeyboardDriver(void)
{ {
ENTER_FUNC(); ENTER_FUNC();
if(bPatched) DbgPrint("RestoreKeyboardDriver: Not Implemented yet!!!\n");
{ LEAVE_FUNC();
save_flags(ulKeyPatchFlags);
cli();
*(PULONG)(pPatchAddress + 1) = ulOldOffset;
restore_flags(ulKeyPatchFlags);
}
LEAVE_FUNC();
} }

View file

@ -39,7 +39,6 @@ Copyright notice:
#include <asm/page.h> #include <asm/page.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/vmalloc.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/delay.h> #include <asm/delay.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
@ -386,4 +385,4 @@ void DeInstallIntEHook(void)
UnmaskIrqs(); UnmaskIrqs();
LEAVE_FUNC(); LEAVE_FUNC();
} }

View file

@ -92,11 +92,12 @@ NTSTATUS STDCALL pice_close(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{ {
DPRINT((0,"pice_close\n")); DPRINT((0,"pice_close\n"));
CleanUpPICE(); // used to be in cleanup_module CleanUpPICE(); // used to be in cleanup_module
/* We're now ready for our next caller */ /* We're now ready for our next caller */
bDeviceAlreadyOpen = FALSE; bDeviceAlreadyOpen = FALSE;
IoCompleteRequest (Irp, IO_NO_INCREMENT); IoCompleteRequest (Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -179,7 +180,7 @@ NTSTATUS STDCALL DriverEntry(PDRIVER_OBJECT DriverObject,
if(InitPICE()){ if(InitPICE()){
DriverObject->MajorFunction[IRP_MJ_CREATE] = pice_open; DriverObject->MajorFunction[IRP_MJ_CREATE] = pice_open;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = pice_close; //ei unimplemented DriverObject->MajorFunction[IRP_MJ_CLOSE] = pice_close;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = pice_ioctl; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = pice_ioctl;
RtlInitUnicodeString(&DeviceName, L"\\Device\\Pice"); RtlInitUnicodeString(&DeviceName, L"\\Device\\Pice");

View file

@ -609,7 +609,7 @@ BOOLEAN ConsoleInitSerial(void)
GLOBAL_SCREEN_WIDTH = 80; GLOBAL_SCREEN_WIDTH = 80;
GLOBAL_SCREEN_HEIGHT = 60; GLOBAL_SCREEN_HEIGHT = 60;
pScreenBufferSerial = vmalloc(FRAMEBUFFER_SIZE); pScreenBufferSerial = PICE_malloc(FRAMEBUFFER_SIZE, NONPAGEDPOOL);
if(pScreenBufferSerial) if(pScreenBufferSerial)
{ {
@ -648,7 +648,7 @@ void ConsoleShutdownSerial(void)
FlushSerialBuffer(); FlushSerialBuffer();
if(pScreenBufferSerial) if(pScreenBufferSerial)
vfree(pScreenBufferSerial); PICE_free(pScreenBufferSerial);
LEAVE_FUNC(); LEAVE_FUNC();
} }

View file

@ -28,8 +28,8 @@ Copyright notice:
This file may be distributed under the terms of the GNU Public License. This file may be distributed under the terms of the GNU Public License.
--*/ --*/
void InstallKeyboardHook(void); //void InstallKeyboardHook(void);
void DeInstallKeyboardHook(void); //void DeInstallKeyboardHook(void);
void InstallGlobalKeyboardHook(void); void InstallGlobalKeyboardHook(void);
void DeInstallGlobalKeyboardHook(void); void DeInstallGlobalKeyboardHook(void);

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -242,6 +242,10 @@ UCHAR inportb(USHORT port);
void outb_p(UCHAR data, USHORT port); void outb_p(UCHAR data, USHORT port);
UCHAR inb_p(USHORT port); UCHAR inb_p(USHORT port);
VOID outl(ULONG l, PULONG port);
ULONG inl(PULONG port);
#define save_flags(x) __asm__ __volatile__("pushfl ; popl %0":"=g" (x): /* no input */) #define save_flags(x) __asm__ __volatile__("pushfl ; popl %0":"=g" (x): /* no input */)
#define restore_flags(x) __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory", "cc") #define restore_flags(x) __asm__ __volatile__("pushl %0 ; popfl": /* no output */ :"g" (x):"memory", "cc")
#define cli() __asm__ __volatile__("cli": : :"memory") #define cli() __asm__ __volatile__("cli": : :"memory")
@ -253,3 +257,14 @@ extern unsigned long sys_call_table[];
struct mm_struct *GetInitMm(void); struct mm_struct *GetInitMm(void);
void EnablePassThrough(void); void EnablePassThrough(void);
#define PAGEDPOOL (1)
#define NONPAGEDPOOL (0)
void * PICE_malloc( size_t numBytes, BOOLEAN fromPaged );
void PICE_free( void* p );
HANDLE PICE_open (LPCWSTR lpPathName, int iReadWrite);
long PICE_read(HANDLE hFile, LPVOID lpBuffer, long lBytes);
int PICE_close (HANDLE hFile);
size_t PICE_len( HANDLE hFile );

View file

@ -393,11 +393,11 @@ BOOLEAN ConsoleInitVga(void)
#ifdef LOCAL_CONSOLE #ifdef LOCAL_CONSOLE
// the real framebuffer // the real framebuffer
pScreenBufferHardwareVga = ioremap(0xB8000,FRAMEBUFFER_SIZE); pScreenBufferHardwareVga = MmMapIoSpace(0xB8000,FRAMEBUFFER_SIZE,MmWriteCombined);
// the console // the console
pScreenBufferVga = vmalloc(FRAMEBUFFER_SIZE); pScreenBufferVga = PICE_malloc(FRAMEBUFFER_SIZE,NONPAGEDPOOL);
// the save area // the save area
pScreenBufferTempVga = vmalloc(FRAMEBUFFER_SIZE); pScreenBufferTempVga = PICE_malloc(FRAMEBUFFER_SIZE,NONPAGEDPOOL);
#else #else
outb_p(0,0x3b8); outb_p(0,0x3b8);
outb_p(0,0x3bf); outb_p(0,0x3bf);
@ -410,7 +410,7 @@ BOOLEAN ConsoleInitVga(void)
} }
outb_p(0x08,0x3b8); outb_p(0x08,0x3b8);
pScreenBufferVga=ioremap(0xB0000,FRAMEBUFFER_SIZE); pScreenBufferVga=MmMapIoSpace(0xB0000,FRAMEBUFFER_SIZE,MmWriteCombined);
#endif #endif
if(pScreenBufferVga) if(pScreenBufferVga)
{ {
@ -446,9 +446,9 @@ void ConsoleShutdownVga(void)
#ifdef LOCAL_CONSOLE #ifdef LOCAL_CONSOLE
if(pScreenBufferVga) if(pScreenBufferVga)
{ {
vfree(pScreenBufferVga); PICE_free(pScreenBufferVga);
vfree(pScreenBufferTempVga); PICE_free(pScreenBufferTempVga);
iounmap(pScreenBufferHardwareVga); MmUnmapIoSpace(pScreenBufferHardwareVga,FRAMEBUFFER_SIZE);
} }
#else #else
// HERC video off // HERC video off
@ -456,7 +456,7 @@ void ConsoleShutdownVga(void)
outb_p(0,0x3bf); outb_p(0,0x3bf);
if(pScreenBufferVga) if(pScreenBufferVga)
iounmap(pScreenBufferVga); MmUnmapIoSpace(pScreenBufferVga,FRAMEBUFFER_SIZE);
#endif #endif
LEAVE_FUNC(); LEAVE_FUNC();