www.pudn.com > pnpi8042.rar > hook.c


/*++ 
 
Copyright (c) 1997-1998 Microsoft Corporation, All Rights Reserved 
 
Module Name: 
 
    hook.c 
 
Abstract: 
 
    Implements hook functions used by upper filters to directly control a PS/2 
    device. 
 
Environment: 
 
    Kernel mode only. 
 
Notes: 
 
Revision History: 
 
--*/ 
 
#include "i8042prt.h" 
 
// 
// Mouse hook functions 
// 
VOID 
I8xMouseIsrWritePort( 
    IN PDEVICE_OBJECT   DeviceObject, 
    IN UCHAR            Value 
    ) 
/*++ 
 
Routine Description: 
 
    This routine runs at HIGH IRQL to write values to the mouse device 
 
Arguments: 
 
    DeviceObject - The i8042prt FDO representing the mouse 
     
    Value        - Value to write to the mouse 
     
Return Value: 
 
    None. 
 
--*/ 
{ 
    #if DBG 
    ASSERT(! ((PCOMMON_DATA) DeviceObject->DeviceExtension)->IsKeyboard); 
    #else 
    UNREFERENCED_PARAMETER(DeviceObject); 
    #endif 
 
    I8X_WRITE_CMD_TO_MOUSE(); 
    I8X_MOUSE_COMMAND( Value ); 
} 
 
// 
// Keyboard hook functions 
// 
NTSTATUS  
I8xKeyboardSynchReadPort ( 
    IN PDEVICE_OBJECT   DeviceObject, 
    IN PUCHAR           Value, 
    IN BOOLEAN          Dummy 
    ) 
/*++ 
 
Routine Description: 
 
    This routine runs at PASSIVE IRQL to synchronousely read a value from the 
    keyboard device during the initialization of the device 
 
Arguments: 
 
    DeviceObject - The i8042prt FDO representing the keyboard 
     
    Value        - Pointer in which to place the results of the read  
     
Return Value: 
 
    status of the operation, STATUS_SUCCESS if successful 
 
--*/ 
{ 
    #if DBG 
    ASSERT(((PCOMMON_DATA) DeviceObject->DeviceExtension)->IsKeyboard); 
    #else 
    UNREFERENCED_PARAMETER(DeviceObject); 
    #endif 
    UNREFERENCED_PARAMETER(Dummy); 
 
    return I8xGetBytePolled((CCHAR) KeyboardDeviceType, 
                            Value  
                            ); 
} 
 
NTSTATUS  
I8xKeyboardSynchWritePort ( 
    IN PDEVICE_OBJECT   DeviceObject,                            
    IN UCHAR            Value, 
    IN BOOLEAN          WaitForACK 
    ) 
/*++ 
 
Routine Description: 
 
    This routine runs at PASSIVE IRQL to synchronousely write values to the 
    keyboard device during the initialization of the device 
 
Arguments: 
 
    DeviceObject - The i8042prt FDO representing the keyboard 
     
    Value        - Value to write to the keyboard 
     
    WaitForACK   - Whether we should wait the device to ACK the Value written 
     
Return Value: 
 
    status of the operation, STATUS_SUCCESS if successful 
 
--*/ 
{ 
    #if DBG 
    ASSERT(((PCOMMON_DATA) DeviceObject->DeviceExtension)->IsKeyboard); 
    #else 
    UNREFERENCED_PARAMETER(DeviceObject); 
    #endif 
 
    return I8xPutBytePolled( 
               DataPort, 
               WaitForACK, 
               (CCHAR) KeyboardDeviceType, 
               Value 
               ); 
} 
 
VOID 
I8xKeyboardIsrWritePort( 
    IN PDEVICE_OBJECT   DeviceObject, 
    IN UCHAR            Value 
    ) 
/*++ 
 
Routine Description: 
 
    This routine runs at HIGH IRQL to write values to the keyboard device 
 
Arguments: 
 
    DeviceObject - The i8042prt FDO representing the keyboard 
     
    Value        - Value to write to the keyboard 
     
Return Value: 
 
    None. 
 
--*/ 
{ 
    #if DBG 
    ASSERT(((PCOMMON_DATA) DeviceObject->DeviceExtension)->IsKeyboard); 
    #else 
    UNREFERENCED_PARAMETER(DeviceObject); 
    #endif 
 
    I8xPutByteAsynchronous((CCHAR) DataPort, 
                           Value 
                           ); 
}