Cómo deshabilitar el botón de suspensión de teclado con un controlador de filtro

Seleccione idioma Seleccione idioma
Id. de artículo: 302092 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

Resumen

La clave de acceso rápida Suspender que existe en teclados más recientes permite suspender el equipo a un estado de alimentación inferior. Para algunos sistemas el estado de alimentación inferior puede no ser beneficioso. En este artículo explica cómo deshabilitar la característica de clave Suspender activa utilizando un controlador de filtro en la pila del dispositivo de destino.

Más información

Para deshabilitar la clave de acceso rápida suspensión , debe filtrar el dispositivo IOCTL_GET_SYS_BUTTON_CAPS solicitud de control de E/s IRP enviada por el Administrador de energía para los dispositivos que registrar una de las siguientes clases de interfaz de dispositivo:
GUID_CLASS_INPUT o GUID_DEVINTERFACE_HID
GUID_DEVICE_SYS_BUTTON
La solicitud IOCTL_GET_SYS_BUTTON_CAPS se envía por el Administrador de energía para obtener el sistema botón capacidades de dispositivos de los dispositivos de entrada humana (HID). Los controladores para los dispositivos HID devuelven las funciones como una máscara de bits en el IRP-> AssociatedIrp.SystemBuffer campo. Los valores de bits se definen como:
#define SYS_BUTTON_POWER        0x00000001 // Power toggle key
#define SYS_BUTTON_SLEEP        0x00000002 // Sleep key
#define SYS_BUTTON_LID          0x00000004 
#define SYS_BUTTON_WAKE         0x80000000 // Wake key could be any key
					
El siguiente fragmento de código muestra cómo modificar la suspensión activa clave información de la rutina de finalización de IOCTL_GET_SYS_BUTTON_CAPS mediante el código de ejemplo Filter.sys presente en la carpeta NTDDK\Src\General\Toaster\Filter del DDK de Microsoft Windows 2000:
... 
...
#include <poclass.h>
NTSTATUS 
FilterPass (IN PDEVICE_OBJECT DeviceObject, 
            IN PIRP Irp)
{
    PDEVICE_EXTENSION           deviceExtension; 
    PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);

    deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

    // 
    // Check to see if this is the IOCTL we are interested in.
    // 
    if((IRP_MJ_DEVICE_CONTROL == irpStack->MajorFunction) && 
    (IOCTL_GET_SYS_BUTTON_CAPS  ==     irpStack->Parameters.DeviceIoControl.IoControlCode)) { 

        // 
        // If so set a completion routine.
        // 
        IoCopyCurrentIrpStackLocationToNext(Irp);
        IoSetCompletionRoutine(Irp, SleepButtonComplete, NULL, TRUE, TRUE, TRUE );
        return IoCallDriver (deviceExtension->NextLowerDriver, Irp);
    }
    
    IoSkipCurrentIrpStackLocation (Irp);
    return IoCallDriver (deviceExtension->NextLowerDriver, Irp);
}
         
NTSTATUS 
SleepButtonComplete(IN PDEVICE_OBJECT DeviceObject,
                    IN PIRP Irp, PVOID context)
{
    NTSTATUS status;
    ULONG caps;

    caps = 0x0;

    if(Irp->PendingReturned)
        IoMarkIrpPending(Irp);

    // 
    // Get the current value.
    // 
    caps = *(PULONG) Irp->AssociatedIrp.SystemBuffer;
    // 
    // Clear all the bits related to power.
    // 
    caps &= ~(SYS_BUTTON_SLEEP | SYS_BUTTON_POWER | SYS_BUTTON_WAKE);

    // 
    // Set the new value.
    // 
    *(PULONG) Irp->AssociatedIrp.SystemBuffer = caps;
    
    status = Irp->IoStatus.Status;
    
    return status;
}
				
teclado para un PS/2, debe instalar el controlador de filtro como un controlador de filtro superior de dispositivo para el controlador de puerto PS/2 (i8042prt.sys). El archivo INF Kbdfilter.inf presente en la carpeta NTDDK\Src\Input\Kbdfiltr muestra cómo instalar un filtro de dispositivo para dispositivos PS/2.

Para el teclado HID, el controlador de filtro debe ser un controlador de filtro de dispositivo superior para el dispositivo de control del sistema. Las claves de energía en dispositivos HID son informó no como parte de la colección de nivel superior del teclado , pero como parte de la colección de Control de sistema y enumeradas como un dispositivo sin formato independiente. Por lo tanto, para instalar el filtro, debe enumerar dispositivos HID para buscar HID_DEVICE_SYSTEM_CONTROL en la lista HardwareID y coloque el filtro como un filtro de dispositivo superior. Como resultado directamente se adjunte a físico dispositivo objeto (PDO) del dispositivo de control del sistema y filtrar el IOCTL_GET_SYS_BUTTON_CAPS como se muestra anteriormente.

Propiedades

Id. de artículo: 302092 - Última revisión: lunes, 01 de agosto de 2005 - Versión: 3.0
La información de este artículo se refiere a:
  • Microsoft Windows 2000 Professional Edition
  • Microsoft Windows XP Home Edition
  • Microsoft Windows XP Professional
  • Microsoft Windows Server 2003 Driver Development Kit (DDK)
  • Microsoft Win32 Device Driver Kit for Windows 2000
  • Microsoft Windows XP Driver Development Kit
Palabras clave: 
kbmt kbhid kbhowto kbinput kbkmode KB302092 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 302092

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com